From: Vásáry Dániel Date: Tue, 24 Apr 2018 09:17:58 +0000 (+0000) Subject: git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube... X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=5d9babf713fc75c077624ac44a5ee886095c7905;p=mediacube.git git-tfs-id: [tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31055 --- diff --git a/client/Maestro/Configuration/-configuration-studio.json b/client/Maestro/Configuration/-configuration-studio.json index 7666e579..3c358144 100644 --- a/client/Maestro/Configuration/-configuration-studio.json +++ b/client/Maestro/Configuration/-configuration-studio.json @@ -28,7 +28,7 @@ { "$type": "TrafficMetadata", "server": { - "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;", + "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;", "userName": "MAM", "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ", "timeout": 1000 @@ -46,12 +46,15 @@ ], "targets": [ { - "label": "Adásellenőrzés", + "label": "Octopus", "processor": "FXPTargetProcessor", "outputFormat": "%ID%", "tag": "Adáskész", + "subFolderFormat": "%IDROOT%-%TEXT%", + "killDateDays": 15, + "saveArchiveMetadata": false, "remote": { - "address": "ftp://10.10.1.100:21/PLAYOUT_CHECK", + "address": "ftp://10.10.1.100:21/OCTOPUS", "userName": "mediacube", "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", "timeout": 1000 diff --git a/client/Maestro/Configuration/configuration-grafika.json b/client/Maestro/Configuration/configuration-grafika.json index b09b6dd4..59127046 100644 --- a/client/Maestro/Configuration/configuration-grafika.json +++ b/client/Maestro/Configuration/configuration-grafika.json @@ -24,12 +24,36 @@ "server": { "address": "http://10.10.1.27/services/rest/octopus/", "timeout": 1000 + }, + "projectSettings": { + "templateRoot": { + "address": "file://10.10.1.100/BRAAVOS/.MAESTRO", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + }, + "templateName": "ALAPTIMELINE.ezp", + "target": { + "label": "Projekt létrehozása", + "processor": "UNCTargetProcessor", + "outputFormat": "%ID%", + "subFolderFormat": "%IDROOT%-%TEXT%/PROJECT", + "disableFileVersioning": true, + "remote": { + "address": "file://10.10.1.100/BRAAVOS/OCTOPUS", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + "disableOpenProject": false, + "disableOpenSourceFolder": false } }, { "$type": "TrafficMetadata", "server": { - "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;", + "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;", "userName": "MAM", "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ", "timeout": 1000 diff --git a/client/Maestro/MaestroForm.Designer.cs b/client/Maestro/MaestroForm.Designer.cs index 9229c050..62e3f21b 100644 --- a/client/Maestro/MaestroForm.Designer.cs +++ b/client/Maestro/MaestroForm.Designer.cs @@ -1,5 +1,4 @@ -using Maestro.Properties; -using System.Windows.Forms; +using System.Windows.Forms; namespace Maestro { partial class MaestroForm { @@ -41,7 +40,7 @@ namespace Maestro { this.groupSource = new System.Windows.Forms.GroupBox(); this.dgSource = new System.Windows.Forms.DataGridView(); this.bindingSource = new System.Windows.Forms.BindingSource(this.components); - this.treeFolders = new System.Windows.Forms.TreeView(); + this.treeFolders = new MaestroShared.Controls.DoubleClickTreeView(); this.ilFolders = new System.Windows.Forms.ImageList(this.components); this.pSourceFilter = new System.Windows.Forms.TableLayoutPanel(); this.txtSourceFilter = new System.Windows.Forms.TextBox(); @@ -217,7 +216,7 @@ namespace Maestro { this.treeFolders.TabIndex = 18; this.treeFolders.Visible = false; this.treeFolders.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnBeforeExpandFolder); - this.treeFolders.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnAfterSelectFolder); + this.treeFolders.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnAfterFolderSelect); this.treeFolders.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnFolderMouseDown); // // ilFolders @@ -1025,7 +1024,7 @@ namespace Maestro { private System.Windows.Forms.ToolStripButton btnDefineSegments; private System.Windows.Forms.ToolStrip tsSource; private System.Windows.Forms.ToolStripButton btnShowFolders; - private System.Windows.Forms.TreeView treeFolders; + private MaestroShared.Controls.DoubleClickTreeView treeFolders; private System.Windows.Forms.ImageList ilFolders; private System.Windows.Forms.CheckBox chkAutoScroll; private DataGridViewTextBoxColumn columnLabel; diff --git a/client/Maestro/MaestroForm.Source.cs b/client/Maestro/MaestroForm.Source.cs index dfd46f4d..2be7542f 100644 --- a/client/Maestro/MaestroForm.Source.cs +++ b/client/Maestro/MaestroForm.Source.cs @@ -76,6 +76,8 @@ namespace Maestro { source.Startup(localAddress); bindingSource.DataSource = source; dgSource.Columns.AddRange(source.Columns); + + treeFolders.NodeDoubleClick += OnDoubleClickFolder; } private string GetLastSegment(string path) { @@ -146,16 +148,16 @@ namespace Maestro { AddFolders(address, e.Node); } - private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) { - if (e.Action != TreeViewAction.ByMouse) - return; + private void OnDoubleClickFolder(object sender, TreeNodeMouseClickEventArgs args) { + //if (e.Action != TreeViewAction.ByMouse) + // return; txtSourceFilter.Text = null; FileSystemSource source = bindingSource.DataSource as FileSystemSource; Uri address = null; - if (e.Node.Level == 0) + if (args.Node.Level == 0) address = Configuration.Source.Local.Address; else - address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)))); + address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(args.Node)))); if (!String.IsNullOrEmpty(address.LocalPath)) formTooltip.SetToolTip(groupSource, address.LocalPath); diff --git a/client/Maestro/MaestroForm.cs b/client/Maestro/MaestroForm.cs index 1f718fe5..a5742abb 100644 --- a/client/Maestro/MaestroForm.cs +++ b/client/Maestro/MaestroForm.cs @@ -284,5 +284,9 @@ namespace Maestro { treeFolders.SelectedNode = treeFolders.GetNodeAt(e.X, e.Y); } + private void OnAfterFolderSelect(object sender, TreeViewEventArgs e) { + if (e.Node != null) + e.Node.Expand(); + } } } diff --git a/client/Maestro/MaestroForm.resx b/client/Maestro/MaestroForm.resx index 851c96f8..6f3dee41 100644 --- a/client/Maestro/MaestroForm.resx +++ b/client/Maestro/MaestroForm.resx @@ -128,7 +128,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS - CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAATgBAQE4AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/client/Maestro/Properties/AssemblyInfo.cs b/client/Maestro/Properties/AssemblyInfo.cs index 4124d82a..88f47f37 100644 --- a/client/Maestro/Properties/AssemblyInfo.cs +++ b/client/Maestro/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.7.7")] -[assembly: AssemblyFileVersion("2.0.7.7")] +[assembly: AssemblyVersion("2.0.7.8")] +[assembly: AssemblyFileVersion("2.0.7.8")] diff --git a/client/MaestroShared/Controls/CheckableTreeView.cs b/client/MaestroShared/Controls/CheckableTreeView.cs index 8b1ac6e9..4e48c46c 100644 --- a/client/MaestroShared/Controls/CheckableTreeView.cs +++ b/client/MaestroShared/Controls/CheckableTreeView.cs @@ -3,10 +3,7 @@ using System.Drawing; using System.Windows.Forms; namespace MaestroShared.Controls { - class CheckableTreeView : TreeView { - public delegate void OnNodeDoubleClick(object sender, TreeNodeMouseClickEventArgs args); - - public OnNodeDoubleClick NodeDoubleClick; + class CheckableTreeView : DoubleClickTreeView { private readonly bool[] disableCheckBoxLevels; public CheckableTreeView(bool[] disableCheckBoxLevels) { @@ -35,18 +32,6 @@ namespace MaestroShared.Controls { TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, ForeColor, TextFormatFlags.Left | TextFormatFlags.Top); } - protected override void WndProc(ref Message m) { - // Suppress WM_LBUTTONDBLCLK - if (m.Msg == 0x203) { - var point = PointToClient(Cursor.Position); - TreeNode node = GetNodeAt(point); - TreeNodeMouseClickEventArgs args = new TreeNodeMouseClickEventArgs(node, MouseButtons.Left, 2, point.X, point.Y); - NodeDoubleClick?.Invoke(this, args); - m.Result = IntPtr.Zero; - } else - base.WndProc(ref m); - } - } } diff --git a/client/MaestroShared/Controls/DoubleClickTreeView.cs b/client/MaestroShared/Controls/DoubleClickTreeView.cs new file mode 100644 index 00000000..34475d1e --- /dev/null +++ b/client/MaestroShared/Controls/DoubleClickTreeView.cs @@ -0,0 +1,24 @@ +using System; +using System.Windows.Forms; + +namespace MaestroShared.Controls { + public class DoubleClickTreeView : TreeView { + public delegate void OnNodeDoubleClick(object sender, TreeNodeMouseClickEventArgs args); + + public OnNodeDoubleClick NodeDoubleClick; + + protected override void WndProc(ref Message m) { + // Suppress WM_LBUTTONDBLCLK + if (m.Msg == 0x203) { + var point = PointToClient(Cursor.Position); + TreeNode node = GetNodeAt(point); + TreeNodeMouseClickEventArgs args = new TreeNodeMouseClickEventArgs(node, MouseButtons.Left, 2, point.X, point.Y); + NodeDoubleClick?.Invoke(this, args); + m.Result = IntPtr.Zero; + } else + base.WndProc(ref m); + } + + } + +} diff --git a/client/MaestroShared/MaestroShared.csproj b/client/MaestroShared/MaestroShared.csproj index b0e8a9a0..e3f83c2b 100644 --- a/client/MaestroShared/MaestroShared.csproj +++ b/client/MaestroShared/MaestroShared.csproj @@ -91,6 +91,9 @@ + + Component + Component diff --git a/client/MaestroShared/Properties/AssemblyInfo.cs b/client/MaestroShared/Properties/AssemblyInfo.cs index 14af195f..876860ff 100644 --- a/client/MaestroShared/Properties/AssemblyInfo.cs +++ b/client/MaestroShared/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("2.0.7.8")] +[assembly: AssemblyFileVersion("2.0.7.8")] diff --git a/client/MaestroShared/Targets/TargetProcessor.cs b/client/MaestroShared/Targets/TargetProcessor.cs index 074b0fae..e32f3b38 100644 --- a/client/MaestroShared/Targets/TargetProcessor.cs +++ b/client/MaestroShared/Targets/TargetProcessor.cs @@ -14,6 +14,7 @@ namespace MaestroShared.Targets { public const string READY = "Kész"; public const string REVOKED = "Visszavonva"; public const string SKIPPED = "Kihagyva"; + protected const string FORMAT_IDROOT = "%IDROOT%"; private string status; private string message; private string id; @@ -29,7 +30,7 @@ namespace MaestroShared.Targets { private string killDatePath; protected Control parent; private List references; - + public event PropertyChangedEventHandler PropertyChanged; public static ITargetProcessor Create(string processorName) { diff --git a/client/MaestroShared/Targets/UNCTargetProcessor.cs b/client/MaestroShared/Targets/UNCTargetProcessor.cs index 11683c29..547f782c 100644 --- a/client/MaestroShared/Targets/UNCTargetProcessor.cs +++ b/client/MaestroShared/Targets/UNCTargetProcessor.cs @@ -283,7 +283,7 @@ namespace MaestroShared.Targets { protected virtual string SearchDirectory(string path, string pattern) { logger.Trace(Strings.ENTRY); string result = null; - string[] dirs = Directory.GetDirectories(path, pattern); + string[] dirs = Directory.GetDirectories(path, pattern + STAR); if (dirs.Length > 0) result = dirs[0]; return result; @@ -303,24 +303,16 @@ namespace MaestroShared.Targets { string[] formats = Parameters.TargetConfig.SubFolderFormat.Replace(BACKSLASH, SLASH).Split(SLASH[0]); for (int i = 0; i < segments.Length; i++) { string segment = segments[i]; - int p = segment.IndexOf(HYPHEN); - int o = segment.IndexOf(UNDERSCORE); - if (formats[i].Contains("%") && (p > -1 || o > -1)) { - string pattern = null; - if (p <= o && p > -1) - pattern = segment.Substring(0, p); - if (pattern == null && o < p && o > -1) - pattern = segment.Substring(0, o); - if (pattern == null && o < p && p > -1) - pattern = segment.Substring(0, p); - pattern += STAR; - string searchResult = SearchDirectory(result, pattern); - if (searchResult == null) - result = Slash(Path.Combine(result, segment)); - else - result = Slash(Path.Combine(result, searchResult)); - } else + if (!formats[i].StartsWith(FORMAT_IDROOT)) { result = Slash(Path.Combine(result, segment)); + continue; + } + string pattern = GetDynamicText(FORMAT_IDROOT); + string searchResult = SearchDirectory(result, pattern); + if (searchResult == null) + result = Slash(Path.Combine(result, segment)); + else + result = Slash(Path.Combine(result, searchResult)); } logger.Trace(Strings.EXIT); diff --git a/server/-configuration/run-mediacube-server-bsh.launch b/server/-configuration/run-mediacube-server-bsh.launch index 4ffdbc8f..ec4eca74 100644 --- a/server/-configuration/run-mediacube-server-bsh.launch +++ b/server/-configuration/run-mediacube-server-bsh.launch @@ -21,8 +21,8 @@ - - + + diff --git a/server/-configuration/scheduledjobs.json b/server/-configuration/scheduledjobs.json index b2954182..011df72e 100644 --- a/server/-configuration/scheduledjobs.json +++ b/server/-configuration/scheduledjobs.json @@ -1,13 +1,16 @@ {"joblist":[ { - "name" : "SYS: batch-retrieve-ondemand", - "template": "batch-retrieve-ondemand.xml", + "active": false, + "executeimmediate": false, + "name" : "SYS: recreate-lowres", + "template": "recreate-lowres.xml", "parameters": [ - {"name": "trafficOutputPath", "value": "/mnt/ISILON/PLAYOUT_NLE", "type": "java.lang.String"}, - {"name": "octopusOutputPath", "value": "/mnt/ISILON/OCTOPUS", "type": "java.lang.String"}, - {"name": "genericOutputPath", "value": "/mnt/ISILON/ARCHIVE_RESTORE", "type": "java.lang.String"}, - {"name": "killDateDays", "value": 7, "type": "java.lang.Integer"} + {"name": "filePath", "value": "c:/_downloads/Silicon.Valley.S04E08.HDTV.x264.HUN-SFY/Silicon.Valley.S04E08.HDTV.x264.HUN-SFY.mkv", "type": "java.lang.String" } ] + }, + { + "name" : "SYS: batch-retrieve-ondemand", + "template": "batch-retrieve-ondemand.xml" }, { "name" : "SYS: retrieve-ondemand", diff --git a/server/-dependencies/jobengine.target b/server/-dependencies/jobengine.target index 0340280a..61066195 100644 --- a/server/-dependencies/jobengine.target +++ b/server/-dependencies/jobengine.target @@ -1,5 +1,5 @@ - + @@ -15,13 +15,16 @@ - + + + + diff --git a/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar b/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar new file mode 100644 index 00000000..9baa3133 Binary files /dev/null and b/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar differ diff --git a/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar b/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar new file mode 100644 index 00000000..ccd42e5e Binary files /dev/null and b/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar differ diff --git a/server/-dependencies/libs/humble-video-noarch-0.2.1.jar b/server/-dependencies/libs/humble-video-noarch-0.2.1.jar new file mode 100644 index 00000000..c8fc9bb4 Binary files /dev/null and b/server/-dependencies/libs/humble-video-noarch-0.2.1.jar differ diff --git a/server/-dependencies/pom.xml b/server/-dependencies/pom.xml index f80efafd..6c4ff157 100644 --- a/server/-dependencies/pom.xml +++ b/server/-dependencies/pom.xml @@ -58,6 +58,48 @@ install-file + + libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar + humble.video + linux + 0.2.1 + jar + + + + install3 + package + + install-file + + + libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar + humble.video + windows + 0.2.1 + jar + + + + install4 + package + + install-file + + + libs/humble-video-noarch-0.2.1.jar + humble.video + noarch + 0.2.1 + jar + + + + install5 + package + + install-file + libs/sqljdbc42.jar com.microsoft.sqlserver @@ -77,6 +119,16 @@ default-cli + + humble.video:linux:0.2.1 + + + humble.video:windows:0.2.1 + + + humble.video:noarch:0.2.1 + + com.google.guava:guava:18.0 diff --git a/server/-product/mediacube.product b/server/-product/mediacube.product index a039e209..1494b6ac 100644 --- a/server/-product/mediacube.product +++ b/server/-product/mediacube.product @@ -111,6 +111,9 @@ + + + diff --git a/server/user.jobengine.executors/config/config.xml b/server/user.jobengine.executors/config/config.xml index 5e56e335..e2277770 100644 --- a/server/user.jobengine.executors/config/config.xml +++ b/server/user.jobengine.executors/config/config.xml @@ -24,4 +24,6 @@ + + \ No newline at end of file diff --git a/server/user.jobengine.executors/jobtemplates/recreate-lowres.xml b/server/user.jobengine.executors/jobtemplates/recreate-lowres.xml new file mode 100644 index 00000000..a7e33e0f --- /dev/null +++ b/server/user.jobengine.executors/jobtemplates/recreate-lowres.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java index 4bfe9011..6024566f 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java @@ -21,8 +21,7 @@ public class BatchRetrieveForkStep extends JobStep { private MediaCubeMarker marker; @StepEntry - public Object[] execute(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, List basket, String houseId, String recipient, - int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + public Object[] execute(List basket, String houseId, String recipient, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { marker = (MediaCubeMarker) jobRuntime.getMarker(); marker.setTo(recipient); @@ -31,7 +30,7 @@ public class BatchRetrieveForkStep extends JobStep { setProgress(10); if (jobRuntime.forkPrepare()) { for (Media mediaCubeMedia : basket) { - submit(trafficOutputPath, octopusOutputPath, genericOutputPath, mediaCubeMedia, recipient, houseId, killDateDays, jobEngine, jobRuntime); + submit(mediaCubeMedia, recipient, houseId, jobEngine, jobRuntime); } } setProgress(50); @@ -40,8 +39,7 @@ public class BatchRetrieveForkStep extends JobStep { return null; } - public void submit(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, Media mediaCubeMedia, String recipient, String houseId, - int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + public void submit(Media mediaCubeMedia, String recipient, String houseId, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { try { ScheduledJob scheduledJob = jobEngine.getScheduledJob(CHILD_TEMPLATE); Map parameters = scheduledJob.getJobParameters(); diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java index 35bba94f..5627362f 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java @@ -90,25 +90,30 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep { String fileName = String.format("%s-%s", origFileName, rundownArchive.getItemHouseId()); String videoFileName = fileName + MXFEXT; - transferFile(origFileName + MXFEXT, videoFileName); - BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive); + //A mar letezo mozikat nem archivaljuk le ujra, csak a metaadatot + long existingMediaId = manager.getExistingRundownMedia(origFileName); + if (existingMediaId == 0) + transferFile(origFileName + MXFEXT, videoFileName); + else + transferChunk(origFileName); + + BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive, existingMediaId); transferMetadata(videoFileName, metadata); createSourceKillDateFile(rundownArchive, origFileName); } - private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive) { + private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive, long existingMediaId) { BasicDBObject result = new BasicDBObject(); result.put("itemHouseId", rundownArchive.getItemHouseId()); result.put("itemTitle", rundownArchive.getItemTitle()); result.put("itemDescription", rundownArchive.getItemDesc()); result.put("userName", "mediacube"); - result.put("mediaHouseId", storyArchive.getMediaHouseId()); result.put("mediaTitle", storyArchive.getMediaTitle()); result.put("mediaDescription", storyArchive.getMediaDesc()); result.put("mediaType", MEDIATYPE); - result.put("duration", fileArchive.getDuration()); + result.put("existingMediaId", existingMediaId); return result; } @@ -360,6 +365,24 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep { } + private void transferChunk(String fileName) throws Exception { + logger.info("Transfer chunk {}", fileName); + OutputStream outStream = null; + try { + outStream = targetFtp.storeFileStream(fileName + MXFEXT); + if (outStream == null) { + throw new NullPointerException("Can not open: " + fileName + MXFEXT + " Reply:" + targetFtp.getReplyString()); + } + } catch (Exception e) { + logger.catching(e); + throw e; + } finally { + if (outStream != null) + outStream.close(); + targetUri.cleanUp(); + } + } + private void transferFile(String sourceFileName, String targetFileName) throws Exception { int reply = 0; logger.info("Transfer clip {}", sourceFileName); diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java new file mode 100644 index 00000000..f7c9bf6c --- /dev/null +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java @@ -0,0 +1,31 @@ +package user.jobengine.server.steps; + +import java.nio.file.Paths; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; + +import user.commons.mediatool.MediaInfo; +import user.jobengine.server.IJobEngine; +import user.jobengine.server.IJobRuntime; + +public class MediaToolStep extends JobStep { + private static final Logger logger = LogManager.getLogger(); + private Marker marker; + + @StepEntry + public Object[] execute(String filePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { + marker = jobRuntime.getMarker(); + MediaInfo mi = new MediaInfo(Paths.get(filePath)); + try { + mi.process(); + } catch (Exception e) { + logger.catching(e); + logger.error(marker, "A '{}' média analizálása sikertelen. A rendszer üzenete: {}", filePath, e.getMessage()); + throw e; + } + return null; + } + +} diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java index db95b6ae..927c6679 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java @@ -1,7 +1,13 @@ package user.jobengine.server.steps; import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; @@ -50,10 +56,10 @@ public class OutputPathAndNameSelectorStep extends JobStep { break; case OCTOPUSPLACEHOLDER: case OCTOPUSSTORY: - targetPath = Paths.get(octopusOutputPath, id).toString(); + targetPath = getPossiblePath(id, Paths.get(octopusOutputPath, id)).toString(); break; case TRAFFIC: - targetPath = Paths.get(trafficOutputPath, id).toString(); + targetPath = getPossiblePath(id, Paths.get(trafficOutputPath, id)).toString(); break; } String targetNamePattern = houseId + TARGETNAMEPATTERN; @@ -66,4 +72,21 @@ public class OutputPathAndNameSelectorStep extends JobStep { return new Object[] { targetPath, targetNamePattern }; } + private String getPossiblePath(String id, Path targetPath) throws IOException { + String[] result = { targetPath.toString() }; + FileVisitor matcherVisitor = new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + String dirName = dir.getFileName().toString(); + if (dirName.startsWith(id + "-") || dirName.equals(id)) { + result[0] = dir.toString(); + return FileVisitResult.TERMINATE; + } + return FileVisitResult.CONTINUE; + } + }; + Files.walkFileTree(targetPath.getParent(), matcherVisitor); + return result[0]; + } + } diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java index 0b540ed7..20592bec 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.sql.Timestamp; import java.util.Date; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,6 +40,7 @@ public class TSMBackupStep extends JobStep { @StepEntry public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception { marker = jobRuntime.getMarker(); + File sourceMediaFile = new File(archiveItem.getMediaFile()); String sourceFileName = sourceMediaFile.getName(); String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length()); @@ -48,25 +50,28 @@ public class TSMBackupStep extends JobStep { jobRuntime.setDescription(String.format("%s: %s", jobRuntime.getDescription(), details)); - StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString()); - - final IJobRuntime runtime = jobRuntime; - sourceUri.addProgressListener(new IProgressEventListener() { - @Override - public void progressChanged(ProgressEvent evt) { - runtime.incrementProgress(evt.getProgress()); - } - }); - sourceUri.addStatusListener(new IStatusEventListener() { - @Override - public void statusChanged(StatusEvent evt) { - evt.setCancel(!canContinue()); - } - }); - RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, sourceFileName); + if (archiveItem.getExistingMediaId() == 0) { + StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString()); - saveMetadata(mediaCubeMedia, sourceFileName); - logger.info(marker, "Az '{}' állomány archiválása sikeres.", sourceFileName); + final IJobRuntime runtime = jobRuntime; + sourceUri.addProgressListener(new IProgressEventListener() { + @Override + public void progressChanged(ProgressEvent evt) { + runtime.incrementProgress(evt.getProgress()); + } + }); + sourceUri.addStatusListener(new IStatusEventListener() { + @Override + public void statusChanged(StatusEvent evt) { + evt.setCancel(!canContinue()); + } + }); + RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, sourceFileName); + } else { + logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.", sourceFileName); + } + saveMetadata(mediaCubeMedia, sourceFileName, archiveItem); + logger.info(marker, "Az '{}' archiválása sikeres.", sourceFileName); if (killDateDays > 0) EscortFiles.createUNCKillDate(sourceMediaFile.getParent(), sourceFileName, killDateDays, marker); @@ -83,10 +88,23 @@ public class TSMBackupStep extends JobStep { return null; } - private void saveMetadata(Media mediaCubeMedia, String sourceFileName) { - MediaFile mediaFile = manager.createMediaFile(sourceFileName, fileType, tsmStore, mediaCubeMedia); - mediaFile.setHouseId(sourceFileName); - mediaFile.add(); + private void saveMetadata(Media mediaCubeMedia, String sourceFileName, ArchiveItem archiveItem) { + if (archiveItem.getExistingMediaId() == 0) { + MediaFile mediaFile = manager.createMediaFile(sourceFileName, fileType, tsmStore, mediaCubeMedia); + mediaFile.setHouseId(sourceFileName); + mediaFile.add(); + } else { + Media existingMedia = manager.getMedia(archiveItem.getExistingMediaId()); + List mediaFiles = existingMedia.getMediaFiles(); + if (mediaFiles != null) { + for (MediaFile mf : mediaFiles) { + mf.setId(0); + mf.setMedia(mediaCubeMedia); + mf.add(); + mediaCubeMedia.appendMediaFile(mf); + } + } + } mediaCubeMedia.setPersister(manager); mediaCubeMedia.setArchived(new Timestamp(new Date().getTime())); mediaCubeMedia.modify(); diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java index 5e90b8a9..51f6bacd 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java @@ -94,6 +94,10 @@ public class TranscodeSELENIOStep extends JobStep { marker = jobRuntime.getMarker(); String sourceFileName = null; + //Nincs mit transzkódolni + if (archiveItem.getExistingMediaId() != 0) + return null; + try { setAndCheck(globalSourcePath, transcoderTargetPath, webPath, jobEngine); diff --git a/server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF b/server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF index cd541195..025f6868 100644 --- a/server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF +++ b/server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF @@ -9,6 +9,7 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5", com.fasterxml.jackson.databind.util;version="2.4.5", com.fasterxml.jackson.datatype.joda;version="2.4.5", com.fasterxml.jackson.jaxrs.json;version="2.4.5", + io.humble.video, org.apache.logging.log4j;version="2.8.2", org.apache.logging.log4j.message;version="2.8.2", org.jboss.resteasy.client.jaxrs, @@ -21,6 +22,7 @@ Service-Component: OSGI-INF/nexioAPI.xml, OSGI-INF/octopusAPI.xml Export-Package: user.commons, user.commons.ftp, user.commons.logging, + user.commons.mediatool, user.commons.morpheus, user.commons.nexio, user.commons.nexio.api, diff --git a/server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java b/server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java new file mode 100644 index 00000000..ed7b3ab0 --- /dev/null +++ b/server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java @@ -0,0 +1,56 @@ +package user.commons.mediatool; + +import java.io.IOException; +import java.nio.file.Path; + +import io.humble.video.Decoder; +import io.humble.video.Demuxer; +import io.humble.video.DemuxerStream; +import io.humble.video.Global; +import io.humble.video.MediaDescriptor; + +public class MediaInfo { + + private long frames; + + private Path filePath; + + public MediaInfo(Path filePath) { + this.filePath = filePath; + } + + public long getFrames() { + return frames; + } + + public void process() throws InterruptedException, IOException { + final Demuxer demuxer = Demuxer.make(); + demuxer.open(filePath.toString(), null, false, true, null, null); + int bitRate = demuxer.getBitRate() / 1000; + double start = demuxer.getStartTime() == Global.NO_PTS ? 0 : demuxer.getStartTime() / 1000000.0; + + int numStreams = demuxer.getNumStreams(); + + frames = 0; + int videoStreamId = -1; + long streamStartTime = Global.NO_PTS; + Decoder videoDecoder = null; + for (int i = 0; i < numStreams; i++) { + final DemuxerStream stream = demuxer.getStream(i); + streamStartTime = stream.getStartTime(); + final Decoder decoder = stream.getDecoder(); + + if (decoder != null && decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) { + videoStreamId = i; + videoDecoder = decoder; + frames = stream.getDuration(); + break; + } + } + if (videoStreamId == -1) + throw new RuntimeException("could not find video stream in container: " + filePath); + + demuxer.close(); + } + +} diff --git a/server/user.jobengine.osgi.db/sql/ft-join.sql b/server/user.jobengine.osgi.db/sql/ft-join.sql new file mode 100644 index 00000000..a2196f2e --- /dev/null +++ b/server/user.jobengine.osgi.db/sql/ft-join.sql @@ -0,0 +1,35 @@ +select i.id itemid,i.created itemcreated,i.houseid itemhouseid,i.title itemtitle, +m.id mediaid,m.created mediacreated,m.archived,m.length,it.name mediatype,m.houseid mediahouseid,m.title mediatitle, +mf.id mediafileid,mf.houseid mediafilehouseid +from mediafile mf +left outer join media m on (m.id = mf.mediaid) +left outer join item i on (i.id = m.itemid) +left outer join itemtype it on (it.id = m.itemtypeid) +where mf.storeid = 1 and +(contains(i.title, 'trend*') >= 1 or contains(m.title, 'trend*') >= 1) +order by itemtitle desc, mediatype + +SELECT * FROM ( +( + SELECT DISTINCT m.id,m.title,i.title FROM ITEM i, MEDIA m + WHERE CONTAINS(i.title, 'trend*') >= 1 AND m.itemid = i.id +) UNION ( + SELECT DISTINCT m.id,m.title,i.title FROM ITEM i, MEDIA m + WHERE CONTAINS(m.title, 'trend*') >= 1 AND m.itemid = i.id +)) + + +SELECT * FROM ( +( + SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid + FROM ITEM i, MEDIA m, MEDIAFILE mf + WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 AND ((CONTAINS(i.title, 'trend*') >= 1) OR (CONTAINS(i.description, 'trend*') >= 1)) +) UNION ( + SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid + FROM ITEM i, MEDIA m, MEDIAFILE mf + WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 AND ((CONTAINS(m.title, 'trend*') >= 1) OR (CONTAINS(m.description, 'trend*') >= 1)) +) UNION ( + SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid + FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 + AND (CONTAINS(mf.houseId, 'trend*') >= 1) +)) ORDER BY itemtitle desc, mediaitemtypeid \ No newline at end of file diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java index f7ea9e79..3e5c9bdc 100644 --- a/server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java +++ b/server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java @@ -98,6 +98,8 @@ public interface IItemManager extends IEntityPersister { void disconnect(); + void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator); + /** * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül visszakapjuk az összes entitást. * @@ -144,6 +146,8 @@ public interface IItemManager extends IEntityPersister { */ List getDynamicItemTypes(); + long getExistingRundownMedia(String houseid); + /** * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző FileType-ot. * @@ -352,7 +356,7 @@ public interface IItemManager extends IEntityPersister { */ IEntityBase retrieveCached(Class baseClass, Object key); - SearchResult search(String criteria, List searchFilters, int fromResult, int toResult); + SearchResult search(String criteria, List searchFilters, String orderBy, boolean orderAscending, int fromResult, int toResult); /** * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér. diff --git a/server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IResultSetConsumer.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/IResultSetConsumer.java similarity index 50% rename from server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IResultSetConsumer.java rename to server/user.jobengine.osgi.db/src/user/jobengine/db/IResultSetConsumer.java index 821d76ed..3e3e716b 100644 --- a/server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IResultSetConsumer.java +++ b/server/user.jobengine.osgi.db/src/user/jobengine/db/IResultSetConsumer.java @@ -1,10 +1,10 @@ -package user.jobengine.server.IT; +package user.jobengine.db; import java.sql.ResultSet; import java.sql.SQLException; public interface IResultSetConsumer { - void process(ResultSet resultSet) throws SQLException; + boolean process(ResultSet resultSet) throws SQLException; } diff --git a/server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IStatementDecorator.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/IStatementDecorator.java similarity index 79% rename from server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IStatementDecorator.java rename to server/user.jobengine.osgi.db/src/user/jobengine/db/IStatementDecorator.java index 0ca95882..91fb7ef3 100644 --- a/server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IStatementDecorator.java +++ b/server/user.jobengine.osgi.db/src/user/jobengine/db/IStatementDecorator.java @@ -1,4 +1,4 @@ -package user.jobengine.server.IT; +package user.jobengine.db; import java.sql.PreparedStatement; import java.sql.SQLException; diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java index c94a4a82..bdbd2a9b 100644 --- a/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java +++ b/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java @@ -58,7 +58,45 @@ public class ItemDAOEx { return resultQuery.toString(); } - private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, List typeIDs) throws SQLException { + // sql.append("select"); + // sql.append(" "); + // sql.append("i.id itemid,"); + // sql.append("i.created itemcreated,"); + // sql.append("i.houseid itemhouseid,"); + // sql.append("i.title itemtitle,"); + // sql.append("m.id mediaid,"); + // sql.append("m.created mediacreated,"); + // sql.append("m.archived,"); + // sql.append("m.length,"); + // sql.append("it.name mediatype,"); + // sql.append("m.houseid mediahouseid,"); + // sql.append("m.title mediatitle,"); + // sql.append("mf.id mediafileid,"); + // sql.append("mf.houseid mediafilehouseid"); + // sql.append(" "); + // sql.append("from mediafile mf"); + // sql.append(" "); + // sql.append("left outer join media m on (m.id = mf.mediaid)"); + // sql.append(" "); + // sql.append("left outer join item i on (i.id = m.itemid)"); + // sql.append(" "); + // sql.append("left outer join itemtype it on (it.id = m.itemtypeid)"); + // sql.append(" "); + // sql.append("where mf.storeid = 1 and ("); + // sql.append("contains(i.title, ?) >= 1"); + // sql.append(" "); + // sql.append("or contains(i.description, ?) >= 1"); + // sql.append(" "); + // sql.append("or contains(m.title, ?) >= 1"); + // sql.append(" "); + // sql.append("or contains(m.description, ?) >= 1"); + // sql.append(" "); + // sql.append("or contains(mf.houseid, ?) >= 1"); + // sql.append(")"); + // if (typeIDs != null) + // sql.append(" and m.itemtypeid in ").append(typeCriteria.toString()); + private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, String orderBy, boolean orderAscending, + List typeIDs) throws SQLException { StringBuilder typeCriteria = new StringBuilder(); if (typeIDs != null) { typeCriteria.append("("); @@ -70,25 +108,37 @@ public class ItemDAOEx { typeCriteria.append(")"); } + String columNames = getColumnNames(); + StringBuilder innerSql = new StringBuilder(); + innerSql.append("SELECT DISTINCT "); + innerSql.append(columNames); + innerSql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1"); + if (typeIDs != null) { + innerSql.append(" AND m.itemtypeid IN "); + innerSql.append(typeCriteria.toString()); + } + StringBuilder sql = new StringBuilder(); sql.append("SELECT * FROM (("); - sql.append("SELECT DISTINCT m.id, m.title,m.itemtypeid,m.archived FROM ITEM i, MEDIA m, MEDIAFILE mf"); - sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id"); - if (typeIDs != null) - sql.append(" AND m.itemtypeid IN ").append(typeCriteria.toString()); - sql.append(")UNION("); - sql.append("SELECT DISTINCT m2.id,m2.title,m2.itemtypeid,m2.archived FROM ITEM i2, MEDIA m2, MEDIAFILE mf2"); - sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.mediaid = m2.id"); - if (typeIDs != null) - sql.append(" AND m2.itemtypeid IN ").append(typeCriteria.toString()); - sql.append(")UNION("); - sql.append("SELECT DISTINCT m3.id,m3.title,m3.itemtypeid,m3.archived FROM ITEM i3, MEDIA m3, MEDIAFILE mf3"); - sql.append(" WHERE (CONTAINS(mf3.houseId, ?) >= 1) AND m3.itemid = i3.id AND mf3.mediaid = m3.id"); - if (typeIDs != null) - sql.append(" AND m3.itemtypeid IN ").append(typeCriteria.toString()); - sql.append(")) ORDER BY itemtypeid,archived desc"); + sql.append(innerSql); + sql.append(" AND ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1))"); + sql.append(") UNION ("); + sql.append(innerSql); + sql.append(" AND ((CONTAINS(m.title, ?) >= 1) OR (CONTAINS(m.description, ?) >= 1))"); + sql.append(") UNION ("); + sql.append(innerSql); + sql.append(" AND (CONTAINS(mf.houseId, ?) >= 1)"); + sql.append(")) ORDER BY "); + + if (orderBy == null) { + sql.append("itemtitle desc, mediaitemtypeid"); + } else { + sql.append(orderBy); + sql.append(orderAscending ? " ASC" : " DESC"); + } String query = sql.toString(); + logger.info(query); PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); for (int s = 1; s <= 5; s++) { @@ -97,6 +147,20 @@ public class ItemDAOEx { return st; } + private String getColumnNames() { + StringBuilder columns = new StringBuilder(); + columns.append("i.houseid itemhouseid,"); + columns.append("i.title itemtitle,"); + columns.append("m.id mediaid,"); + columns.append("m.archived,"); + columns.append("m.length,"); + columns.append("m.itemtypeid mediaitemtypeid,"); + columns.append("m.houseid mediahouseid,"); + columns.append("m.title mediatitle,"); + columns.append("mf.houseid mediafilehouseid"); + return columns.toString(); + } + private List getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) { List results = new ArrayList(); String typeQuery; @@ -377,7 +441,8 @@ public class ItemDAOEx { return result; } - public SearchResult searchArchivedMedia(String criteria, List searchFilters, int fromResult, int toResult) { + public SearchResult searchArchivedMedia(String criteria, List searchFilters, String orderBy, boolean orderAscending, int fromResult, + int toResult) { SearchResult result = new SearchResult<>(); List typeIDs = getTypeIDs(searchFilters); @@ -388,7 +453,7 @@ public class ItemDAOEx { Connection connection = context.getConnection(); try { - st = createArchiveMediaSearchStatement(connection, criteria, typeIDs); + st = createArchiveMediaSearchStatement(connection, criteria, orderBy, orderAscending, typeIDs); rs = st.executeQuery(); rs.last(); result.setItemCount(rs.getRow()); @@ -419,7 +484,7 @@ public class ItemDAOEx { logger.info("Processing query result, maxRecords {}", maxRecords); while (rs.next() && maxRecords > 0) { ArchivedMedia am = new ArchivedMedia(); - Media media = manager.getMedia(rs.getLong("id")); + Media media = manager.getMedia(rs.getLong("mediaid")); am.setMedia(media); Item item = manager.getItem(media.getItemId()); am.setItem(item); diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java index 54e4d391..6729fe82 100644 --- a/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java +++ b/server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java @@ -409,6 +409,44 @@ public class ItemManager extends MemoryCache implements IItemManager { traceOut(); } + @Override + public void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) { + ResultSet rs = null; + PreparedStatement st = null; + DefaultContext context = getDbContext(); + Connection connection = context.getConnection(); + try { + st = connection.prepareStatement(query); + if (decorator != null) + decorator.decorate(st); + rs = st.executeQuery(); + while (rs.next()) { + if (!consumer.process(rs)) + break; + } + + connection.commit(); + } catch (Exception e) { + logger.catching(e); + try { + connection.rollback(); + } catch (Exception e1) { + } + } finally { + try { + if (rs != null) + rs.close(); + } catch (Exception e1) { + } + try { + if (st != null) + st.close(); + } catch (Exception e1) { + } + putDbContext(context); + } + } + @Override public IEntityBase get(Class classInfo, long id) { traceIn(); @@ -516,6 +554,26 @@ public class ItemManager extends MemoryCache implements IItemManager { return result; } + @Override + public long getExistingRundownMedia(String houseid) { + final long[] result = { 0 }; + StringBuilder query = new StringBuilder(); + query.append("select itemid, mediaid, replace(mediafilehouseid, concat('-', concat(itemhouseid,'.MXF')), '') filename"); + query.append(" "); + query.append("from vw_items where replace(mediafilehouseid, concat('-', itemhouseid), '') != mediafilehouseid"); + query.append(" "); + query.append("and replace(mediafilehouseid, concat('-', concat(itemhouseid,'.MXF')), '') = ?"); + IStatementDecorator decorator = st -> { + st.setString(1, houseid); + }; + IResultSetConsumer consumer = rs -> { + result[0] = rs.getLong("mediaid"); + return false; + }; + executeQuery(query.toString(), consumer, decorator); + return result[0]; + } + @Override public FileType getFileType(String name) { FileTypeDAO dao = (FileTypeDAO) getBaseDAO(FileType.class); @@ -949,11 +1007,12 @@ public class ItemManager extends MemoryCache implements IItemManager { } @Override - public SearchResult search(String criteria, List searchFilters, int fromResult, int toResult) { + public SearchResult search(String criteria, List searchFilters, String orderBy, boolean orderAscending, int fromResult, + int toResult) { traceIn(); SearchResult result = null; ItemDAOEx itemDb = new ItemDAOEx(this); - result = itemDb.searchArchivedMedia(criteria, searchFilters, fromResult, toResult); + result = itemDb.searchArchivedMedia(criteria, searchFilters, orderBy, orderAscending, fromResult, toResult); traceOut(); return result; } diff --git a/server/user.jobengine.osgi.server/OSGI-INF/component.xml b/server/user.jobengine.osgi.server/OSGI-INF/component.xml index d78073c9..6e03ccbe 100644 --- a/server/user.jobengine.osgi.server/OSGI-INF/component.xml +++ b/server/user.jobengine.osgi.server/OSGI-INF/component.xml @@ -1,5 +1,5 @@ - +