#116 Multiszegmens adatok mentési logikája
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 4 Jan 2019 13:12:35 +0000 (13:12 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 4 Jan 2019 13:12:35 +0000 (13:12 +0000)
git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31369

54 files changed:
client/DxPlay/Configuration/dxplay.en
client/DxPlay/Configuration/dxplay.json
client/DxPlay/DxPlayer.cs
client/DxPlay/Integration/Traffic.cs
client/DxPlay/Model/DxPlayModel.cs
client/DxPlay/PlayerForm.Designer.cs
client/DxPlay/PlayerForm.cs
client/DxPlay/PlayerForm.resx
client/DxPlay/PlayerFormSegments.cs
client/DxPlay/Properties/AssemblyInfo.cs
client/DxPlay/Properties/Resources.Designer.cs
client/DxPlay/Properties/Resources.resx
client/Maestro/Configuration/configuration - Copy.json
client/Maestro/Configuration/configuration.json
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.Target.cs
client/Maestro/Metadata/MetaDataInfo.cs
client/Maestro/Properties/AssemblyInfo.cs
client/MaestroShared/Configuration/ConfigurationInfo.cs
client/MaestroShared/Interfaces/ITrafficAPI.cs
client/MaestroShared/Metadata/MetadataType.cs
client/MaestroShared/Metadata/MovieSegment.cs
client/MaestroShared/Metadata/Traffic.cs
client/MaestroShared/Properties/AssemblyInfo.cs
client/MaestroShared/Targets/FXPTargetProcessor.cs
client/MaestroShared/Targets/TargetUpdateTrafficMessage.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
client/MediaCubeClient/Properties/AssemblyInfo.cs
client/MetadataSelector/Properties/AssemblyInfo.cs
client/PlanAIRClient/Model/PlanAirMaterialResult.cs
client/PlanAIRClient/Model/PlanAirMaterialSegmentResult.cs
client/PlanAIRClient/PlanAirDataReader.cs
client/PlanAIRClient/Properties/AssemblyInfo.cs
client/PlanAIRClient/TrafficAPI.cs
client/PlanAIRClient/TrafficIDSelector.cs
client/PlanAIRClient/TrafficIDSelectorColumns.cs
client/PlanAIRClient/Workers/ADWorker.cs
client/PlanAIRClient/Workers/MultiSegmentMaterialWorker.cs
client/PlanAIRClient/Workers/SingleSegmentMaterialWorker.cs
client/PlanAIRClient/Workers/TrafficWorker.cs
docs/mediacube-dxplay.md
server/-configuration/run-mediacube-server-bsh.launch
server/-dependencies/libs/solr-solrj-7.5.0.jar [new file with mode: 0644]
server/-dependencies/pom.xml
server/hu.user.mediacube.executors.tests/META-INF/MANIFEST.MF
server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/RescueNEXIOMaterials.java [new file with mode: 0644]
server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/Support.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep2.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/CleanupMountedLocationStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ItemManagerExtensions.java
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/Support.java

index 6e689af730d852890b3b33def47db2e14d955302..d73c2d895770ee15e86e0239dfe7fc0a9de024f9 100644 (file)
@@ -4,7 +4,7 @@
   "COMPLETED": "COMPLETED",\r
   "DEFINESEGMENT": "Define segment",\r
   "DELETESEGMENT": "Delete segment",\r
-  "ERRORTRAFFICCONNECT": "Could not connect to PlanAir system, using: {0}",\r
+  "ERRORTRAFFICCONNECT": "Error in PlanAir system communication. System message is: {0}",\r
   "EXITING": "EXITING",\r
   "LENGTH": "LENGTH",\r
   "METADATA": "Metadata",\r
   "PLAY": "Play (Space)",\r
   "PLAYING": "PLAYING",\r
   "STEPBACK": "Step back (<)",\r
-  "STEPFORWARD":  "Step forward (>)",\r
+  "STEPFORWARD": "Step forward (>)",\r
   "POSITIONASTCIN": "Current position as TC in",\r
   "POSITIONASTCOUT": "Current position as TC out",\r
   "SEGMENTS": "Segments",\r
+  "SEGMENT": "Segment",\r
   "SPLITSEGMENT": "Split segment",\r
   "START": "START",\r
   "STOP": "Stop",\r
   "SEGMENTCOUNT": "Segment count",\r
   "TRAFFICID": "Traffic ID",\r
   "IDNOTEXIST": "Specified ID not exists.",\r
-  "ERRORCREATESEGMENT": "No space for mode segments.",\r
+  "ERRORCREATESEGMENT": "No space for more segments.",\r
   "ERRORINVALIDTCIN": "TC IN must be before TC OUT.",\r
   "ERRORINVALIDTCOUT": "TC OUT must be after TC IN.",\r
   "ERRORSEGMENTCOLLISION": "Segment overlaps are not allowed.",\r
-  "ERRORTARGETEXISTS": "Target file already exists: {0}"\r
+  "ERRORTARGETEXISTS": "Target file already exists: {0}",\r
+  "REDEFINESEGMENTS": "Redefine segments",\r
+  "REDEFINE": "Redefine",\r
+  "WRONGFILEFORREDEFINE": "The file name must be the same.",\r
+  "MEDIAID": "Media ID"\r
 }\r
index c958879c5263e3a09718a8036d291cf71f03a7df..7718a79817048c2137a9fad35c0791e006ea72d1 100644 (file)
@@ -1,8 +1,8 @@
 {\r
-  "targetDirectory": "DONE",\r
+  "targetDirectory1": "c:/_video/DONE",\r
   "uiFileName": "dxplay.en",\r
   "isMaximized": false,\r
-  "isStandalone": false,\r
+  "isStandalone": true,\r
   "player": {\r
     "autoStart": false,\r
     "segmentEditor": true\r
@@ -15,6 +15,8 @@
       "userName": "MAM",\r
       "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
       "timeout": 10000\r
-    }\r
+    },\r
+    "version": 0,\r
+    "redefineSegments": true\r
   }\r
 }\r
index 294b412a49976f1bbc2ba3b222c63b6090022597..9e9bc46dee94ceb485ebeb64ba3817a83cee1d9f 100644 (file)
@@ -10,6 +10,7 @@ using System.ComponentModel;
 using System.Drawing;\r
 using System.Drawing.Drawing2D;\r
 using System.Drawing.Imaging;\r
+using System.Runtime.CompilerServices;\r
 using System.Runtime.InteropServices;\r
 using System.Threading;\r
 using System.Windows.Forms;\r
@@ -38,6 +39,12 @@ namespace DxPlay {
         public Dictionary<GraphState, string> stringValues = new Dictionary<GraphState, string>();\r
         public MediaDescription MediaDescription { get; internal set; }\r
         public Timecode CurrentTC { get; internal set; }\r
+\r
+        public void SetState(GraphState state, [CallerLineNumber] int i = 0) {\r
+            State = state;\r
+            logger.Debug("State {0} ({1})", State, i);\r
+        }\r
+\r
         public GraphState State { get; internal set; }\r
         private ManualResetEvent m_mre;\r
         private BackgroundWorker tcWorker;\r
@@ -79,7 +86,7 @@ namespace DxPlay {
             stringValues.Add(GraphState.Playing, settings.Resource("PLAYING", Resources.PLAYING));\r
             stringValues.Add(GraphState.Stopped, settings.Resource("STOPPED", Resources.STOPPED));\r
             stringValues.Add(GraphState.Completed, settings.Resource("COMPLETED", Resources.COMPLETED));\r
-            State = GraphState.Stopped;\r
+            SetState(GraphState.Stopped);\r
             try {\r
                 int hr;\r
                 MediaDescription = mediaDesc;\r
@@ -174,18 +181,18 @@ namespace DxPlay {
                 int hr = graph.MediaControl.Run();\r
                 DsError.ThrowExceptionForHR(hr);\r
 \r
-                State = GraphState.Playing;\r
+                SetState(GraphState.Playing);\r
             }\r
         }\r
 \r
         // Pause the capture graph.\r
         public void Pause() {\r
             // If we are playing\r
-            if (State == GraphState.Playing) {\r
+            if (State == GraphState.Playing || State == GraphState.Completed) {\r
                 int hr = graph.MediaControl.Pause();\r
                 DsError.ThrowExceptionForHR(hr);\r
 \r
-                State = GraphState.Paused;\r
+                SetState(GraphState.Paused);\r
                 Seek(CurrentTC.ZeroBasedFrames);\r
             }\r
         }\r
@@ -193,29 +200,29 @@ namespace DxPlay {
         // Pause the capture graph.\r
         public void Stop() {\r
             //// Can only Stop when playing or paused\r
-            Seek(0);\r
-            Pause();\r
-            if (State == GraphState.Playing || State == GraphState.Paused) {\r
+            if (State == GraphState.Playing || State == GraphState.Paused || State == GraphState.Completed) {\r
+                Seek(0);\r
+                Pause();\r
                 int hr = graph.MediaControl.StopWhenReady();\r
                 DsError.ThrowExceptionForHR(hr);\r
-                State = GraphState.Stopped;\r
+                SetState(GraphState.Stopped);\r
             }\r
         }\r
 \r
         public void Rewind(int step) {\r
             if (CurrentTC.ZeroBasedFrames > step - 1) {\r
-                Pause();\r
                 Seek(CurrentTC.ZeroBasedFrames - step);\r
             }\r
         }\r
 \r
         public void Forward(int step) {\r
             if (CurrentTC.ZeroBasedFrames + step <= MediaDescription.Duration.Frames) {\r
-                Pause();\r
                 Seek(CurrentTC.ZeroBasedFrames + step);\r
             }\r
         }\r
-        public void Seek(int value) {\r
+        public void Seek(int value, bool noPause = false) {\r
+            if (!noPause)\r
+                Pause();\r
             SeekTo = value;\r
         }\r
 \r
@@ -242,8 +249,9 @@ namespace DxPlay {
                 corrected = true;\r
             }\r
 \r
-            if (State == GraphState.Completed)\r
-                State = GraphState.Stopped;\r
+            //if (State == GraphState.Completed)\r
+            //    State = GraphState.Stopped;\r
+\r
             //ForceRepaintFrame();\r
             logger.Debug("Seeking requested frame {0} got frame {1}, media position {2}, frame length {3}, corrected {4}", value, reachedFrames, requestedPosition, avgTimePerFrame, corrected);\r
         }\r
@@ -417,12 +425,11 @@ namespace DxPlay {
                 if (isDisposed)\r
                     return;\r
                 logger.Debug("Dispose");\r
-                GC.SuppressFinalize(this);\r
                 if (tcWorker != null)\r
                     tcWorker.CancelAsync();\r
+                GC.SuppressFinalize(this);\r
                 if (State != GraphState.Exiting) {\r
-                    State = GraphState.Exiting;\r
-\r
+                    SetState(State = GraphState.Exiting);\r
                     // Release the thread (if the thread was started)\r
                     if (m_mre != null) {\r
                         m_mre.Set();\r
@@ -436,8 +443,8 @@ namespace DxPlay {
             }\r
             GC.Collect();\r
             isDisposed = true;\r
-            //if (m_eventThread != null)\r
-            //    m_eventThread.Join();\r
+            if (m_eventThread != null)\r
+                m_eventThread.Join();\r
         }\r
 \r
         public int SampleCB(double SampleTime, IMediaSample pSample) {\r
@@ -515,7 +522,7 @@ namespace DxPlay {
 \r
                             // If the clip is finished playing\r
                             if (ec == EventCode.Complete) {\r
-                                State = GraphState.Completed;\r
+                                SetState(GraphState.Completed);\r
                             }\r
 \r
                             // Release any resources the message allocated\r
index 372715f5fb39c5faff1cd5ac478726b739242d11..cb06396f38b0bed9717a71994f4be210ff94204e 100644 (file)
@@ -22,12 +22,21 @@ namespace DxPlay.Integration {
                 case MetadataType.TrafficMaterial:\r
                     selector.LookupByMaterialID(id);\r
                     break;\r
+                case MetadataType.TrafficMaterialSegment:\r
+                    if (selector.MultiSegment)\r
+                        selector.LookupByMaterialID(id);\r
+                    else\r
+                        selector.ClearLookup();\r
+                    break;\r
                 case MetadataType.TrafficPromo:\r
                     selector.LookupByPromoID(id);\r
                     break;\r
                 case MetadataType.TrafficAD:\r
                     selector.LookupByADID(id);\r
                     break;\r
+                default:\r
+                    selector.ClearLookup();\r
+                    break;\r
             }\r
         }\r
 \r
@@ -36,7 +45,7 @@ namespace DxPlay.Integration {
 \r
             switch (metadataType) {\r
                 case MetadataType.TrafficMaterial: {\r
-                        var trafficItem = selector.trafficAPI.GetMaterials(id, false).FirstOrDefault();\r
+                        var trafficItem = selector.trafficAPI.GetMaterials(id, false)?.FirstOrDefault();\r
                         if (trafficItem != null)\r
                             result = selector.trafficAPI.GetMaterialSegments(trafficItem.VariantID);\r
                         break;\r
@@ -53,16 +62,22 @@ namespace DxPlay.Integration {
             return result;\r
         }\r
 \r
-        public void SaveSegments(TargetUpdateTrafficMessage message) {\r
+        public string SaveSegments(TargetUpdateTrafficMessage message) {\r
             //logger.Info("Now update!!!!!!!!!");\r
             //TODO a listabol kijelolt szegmenseket is at kell adni\r
-            selector.trafficAPI.SaveSegments(message.VariantID, message.MetadataType, message.Segments, null);\r
+            return selector.trafficAPI.SaveSegments(message.VariantID, message.MetadataType, message.Segments, message.Selected);\r
             //message.Ready, \r
         }\r
 \r
         public void Approve(TargetUpdateTrafficMessage message) {\r
-            //TODO ifCompleted\r
-            selector.trafficAPI.Approve(message.VariantID, message.Ready, message.MetadataType);\r
+            TrafficItem trafficItem = null;\r
+            if (message.Segments?.Count == 0) {\r
+                logger.Info("Can't approve, no segments defined");\r
+                return;\r
+            }\r
+            if (message.Selected != null && message.Selected.Count > 0)\r
+                trafficItem = message.Selected[0];\r
+            selector.trafficAPI.Approve(message.VariantID, message.Ready, message.MetadataType, trafficItem, selector.MultiSegment);\r
         }\r
     }\r
 }\r
index 2a154a29fffc5e215e90c0d547903eb034f2f060..e976b95de362bcdb0d4fd11ddc400d17deb99e56 100644 (file)
@@ -22,6 +22,7 @@ namespace DxPlay.Model {
         private readonly DxPlaySettings settings;\r
 \r
         private Traffic traffic;\r
+        private bool multiSegment;\r
 \r
         public void InitializeTrafficIntegration(TrafficIDSelector selector) {\r
             traffic = new Traffic(selector, MessageBus);\r
@@ -36,14 +37,16 @@ namespace DxPlay.Model {
             IsSegmentEditorVisible = true.Equals(settings?.Player?.SegmentEditor);\r
             IsMenuVisible = true.Equals(settings?.IsStandalone);\r
             Segments = settings.Segments ?? new BindingList<MovieSegment>();\r
-            messageBus.Subscribe<TrafficAPIMessage>(OnMessage);\r
+            multiSegment = true.Equals(settings?.Metadata?.MultiSegmentEnabled);\r
+            MessageBus.Subscribe<TrafficAPIMessage>(OnMessage);\r
+\r
         }\r
 \r
 \r
         private void OnMessage(IMessage message) {\r
             if (message is TrafficAPIMessage) {\r
                 TrafficAPIMessage msg = message as TrafficAPIMessage;\r
-                string errorMessage = string.Format(settings.Resource("ERRORTRAFFICCONNECT", Resources.ERRORTRAFFICCONNECT), settings?.Metadata?.Server?.Address?.OriginalString);\r
+                string errorMessage = string.Format(settings.Resource("ERRORTRAFFICCONNECT", Resources.ERRORTRAFFICCONNECT), msg.Exception.Message);\r
                 logger.Error(errorMessage);\r
                 MsgBox.Error(errorMessage);\r
                 //throw new Exception(msg.Content);\r
@@ -55,9 +58,9 @@ namespace DxPlay.Model {
             logger.Info(propertyName);\r
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r
         }\r
+        public IMessageBus MessageBus { get; } = new MessageBus();\r
 \r
-        private IMessageBus messageBus = new MessageBus();\r
-        public IMessageBus MessageBus { get => messageBus; }\r
+        public string RedefineSegmentMediaID { get; set; }\r
 \r
         private bool isSegmentEditorVisible;\r
         public bool IsSegmentEditorVisible {\r
@@ -72,6 +75,9 @@ namespace DxPlay.Model {
             }\r
         }\r
 \r
+\r
+        public bool IsRedefineSegments { get; set; }\r
+\r
         private bool isMenuVisible;\r
         public bool IsMenuVisible {\r
             get {\r
@@ -87,7 +93,13 @@ namespace DxPlay.Model {
 \r
         public bool IsApproveEnabled {\r
             get {\r
-                return id != null && id.Length != 0 && CurrentFile != null && CurrentFile.Exists;\r
+                bool enabled = id != null && id.Length != 0 && CurrentFile != null && CurrentFile.Exists;\r
+\r
+                if (IsRedefineSegments && SelectedSegments != null && Segments != null) {\r
+                    enabled &= SelectedSegments.Count == Segments.Count;\r
+                    enabled &= Segments.Count(s => s.MediaID == RedefineSegmentMediaID) > 0;\r
+                }\r
+                return enabled;\r
             }\r
         }\r
 \r
@@ -95,17 +107,16 @@ namespace DxPlay.Model {
         public string ID {\r
             get { return id; }\r
             set {\r
-                if (value != id) {\r
-                    id = value;\r
-                    Notify();\r
-                    Notify("IsApproveEnabled");\r
-                    MetadataType = MetadataTypeUtil.Guess(id);\r
-                    InitializeSegments();\r
-                }\r
+                id = value;\r
+                Notify();\r
+                MetadataType = MetadataTypeUtil.Guess(id);\r
+                InitializeSegments();\r
+                Notify("IsApproveEnabled");\r
             }\r
         }\r
 \r
         public int VariantID { get; set; }\r
+        public List<TrafficItem> SelectedSegments { get; set; }\r
         public MetadataType MetadataType { get; set; }\r
 \r
         private FileInfo currentFile;\r
@@ -116,19 +127,32 @@ namespace DxPlay.Model {
                 if (currentFile != value) {\r
                     currentFile = value;\r
                     Notify();\r
-                    Notify("IsApproveEnabled");\r
                 }\r
             }\r
         }\r
 \r
         public BindingList<MovieSegment> Segments { get; private set; }\r
 \r
-        private void InitializeSegments() {\r
+        public void InitializeSegments() {\r
             Segments.Clear();\r
+            if (id == null)\r
+                return;\r
             try {\r
                 List<MovieSegment> segments = traffic.LoadSegments(id, MetadataType);\r
-                if (segments != null)\r
-                    segments.ForEach(s => Segments.Add(s));\r
+                if (segments != null) {\r
+                    segments.ForEach(s => {\r
+                        //ebben az esetben nem jon MediaID a szegmenssel\r
+                        if (!multiSegment)\r
+                            s.MediaID = ID;\r
+\r
+                        if (IsRedefineSegments) {\r
+                            s.ReadOnly = RedefineSegmentMediaID != s.MediaID;\r
+                        } else {\r
+                            s.ReadOnly = !string.IsNullOrWhiteSpace(s.MediaID);\r
+                        }\r
+                        Segments.Add(s);\r
+                    });\r
+                }\r
             } catch (Exception) {\r
                 throw;\r
             }\r
@@ -143,34 +167,40 @@ namespace DxPlay.Model {
                 return;\r
 \r
             string targetDirectory = settings.TargetDirectory;\r
-            string targetPath = Path.Combine(settings.TargetDirectory, ID + ".MXF");\r
-            bool deleteTarget = false;\r
+            bool moveFile = !string.IsNullOrWhiteSpace(targetDirectory) && !IsRedefineSegments && Segments?.Count > 0;\r
             try {\r
-                if (File.Exists(targetPath))\r
-                    throw new Exception(String.Format(settings.Resource("ERRORTARGETEXISTS", Resources.ERRORTARGETEXISTS), targetPath));\r
-                if (!Directory.Exists(targetDirectory))\r
-                    Directory.CreateDirectory(targetDirectory);\r
-\r
-                deleteTarget = true;\r
-                FileSystem.CopyFile(CurrentFile.FullName, targetPath, UIOption.AllDialogs, UICancelOption.ThrowException);\r
-\r
                 TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage {\r
                     VariantID = VariantID,\r
                     Ready = true,\r
                     MetadataType = MetadataType,\r
-                    Segments = Segments.ToList()\r
+                    Segments = Segments.ToList(),\r
+                    Selected = SelectedSegments\r
                 };\r
-                traffic.SaveSegments(message);\r
-                traffic.Approve(message);\r
 \r
-                SafeDelete(currentFile.FullName);\r
-                CurrentFile = null;\r
+                string fileName = null;\r
+                if (multiSegment) {\r
+                    fileName = traffic.SaveSegments(message);\r
+                } else {\r
+                    fileName = ID;\r
+                    traffic.SaveSegments(message);\r
+                }\r
 \r
+                if (moveFile) {\r
+                    string targetPath = Path.Combine(settings.TargetDirectory, fileName + ".MXF");\r
+                    if (File.Exists(targetPath))\r
+                        throw new Exception(string.Format(settings.Resource("ERRORTARGETEXISTS", Resources.ERRORTARGETEXISTS), targetPath));\r
+                    if (!Directory.Exists(targetDirectory))\r
+                        Directory.CreateDirectory(targetDirectory);\r
+                    FileSystem.CopyFile(CurrentFile.FullName, targetPath, UIOption.AllDialogs, UICancelOption.ThrowException);\r
+                }\r
+\r
+                traffic.Approve(message);\r
 \r
+                if (moveFile)\r
+                    SafeDelete(currentFile.FullName);\r
+                CurrentFile = null;\r
             } catch (Exception e) {\r
                 logger.Error(e);\r
-                if (deleteTarget)\r
-                    SafeDelete(targetPath);\r
                 throw e;\r
             }\r
         }\r
index fe8e5f2568af1c275b5146707ecf4f5d4ee2549b..dd35ccd72bd599ea241a2931e57df95dc3310594 100644 (file)
@@ -59,6 +59,8 @@ namespace DxPlay {
             this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.menuOpenFile = new DxPlay.Controls.BindableToolStripMenuItem();\r
             this.menuApprove = new DxPlay.Controls.BindableToolStripMenuItem();\r
+            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.menuRedefineSegments = new DxPlay.Controls.BindableToolStripMenuItem();\r
             this.playerControls = new DxPlay.Controls.PlayerControls();\r
             ((System.ComponentModel.ISupportInitialize)(this.mainSplit)).BeginInit();\r
             this.mainSplit.Panel1.SuspendLayout();\r
@@ -185,7 +187,7 @@ namespace DxPlay {
             this.tpSegments.Location = new System.Drawing.Point(4, 4);\r
             this.tpSegments.Name = "tpSegments";\r
             this.tpSegments.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tpSegments.Size = new System.Drawing.Size(192, 30);\r
+            this.tpSegments.Size = new System.Drawing.Size(263, 304);\r
             this.tpSegments.TabIndex = 1;\r
             this.tpSegments.Text = "Segments";\r
             this.tpSegments.UseVisualStyleBackColor = true;\r
@@ -204,7 +206,7 @@ namespace DxPlay {
             dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;\r
             dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
             dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Black;\r
-            dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.Gainsboro;\r
+            dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\r
             dataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.Black;\r
             dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False;\r
             this.dgSegments.DefaultCellStyle = dataGridViewCellStyle1;\r
@@ -215,12 +217,16 @@ namespace DxPlay {
             this.dgSegments.Name = "dgSegments";\r
             this.dgSegments.RowHeadersVisible = false;\r
             this.dgSegments.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\r
-            this.dgSegments.Size = new System.Drawing.Size(186, 0);\r
+            this.dgSegments.Size = new System.Drawing.Size(257, 273);\r
             this.dgSegments.TabIndex = 1;\r
-            this.dgSegments.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgSegments_CellContentClick);\r
-            this.dgSegments.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgSegments_CellMouseDoubleClick);\r
-            this.dgSegments.ColumnAdded += new System.Windows.Forms.DataGridViewColumnEventHandler(this.dgSegments_ColumnAdded);\r
-            this.dgSegments.MouseClick += new System.Windows.Forms.MouseEventHandler(this.OnSegmentEditorMouseClick);\r
+            this.dgSegments.CellBeginEdit += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.OnSegmentsCellBeginEdit);\r
+            this.dgSegments.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnSegmentsCellContentClick);\r
+            this.dgSegments.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.OnSegmentsCellMouseDoubleClick);\r
+            this.dgSegments.CellMouseEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnSegmentsCellMouseEnter);\r
+            this.dgSegments.CellMouseLeave += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnSegmentsCellMouseLeave);\r
+            this.dgSegments.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.OnSegmentsCellPainting);\r
+            this.dgSegments.ColumnAdded += new System.Windows.Forms.DataGridViewColumnEventHandler(this.OnSegmentsColumnAdded);\r
+            this.dgSegments.MouseClick += new System.Windows.Forms.MouseEventHandler(this.OnSegmentsMouseClick);\r
             // \r
             // segmentActions\r
             // \r
@@ -237,7 +243,7 @@ namespace DxPlay {
             this.segmentActions.Location = new System.Drawing.Point(3, 3);\r
             this.segmentActions.Name = "segmentActions";\r
             this.segmentActions.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;\r
-            this.segmentActions.Size = new System.Drawing.Size(186, 25);\r
+            this.segmentActions.Size = new System.Drawing.Size(257, 25);\r
             this.segmentActions.TabIndex = 0;\r
             this.segmentActions.Text = "toolStrip1";\r
             // \r
@@ -350,6 +356,7 @@ namespace DxPlay {
             // btnApprove\r
             // \r
             this.btnApprove.AutoSize = true;\r
+            this.btnApprove.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
             this.btnApprove.BackColor = System.Drawing.Color.White;\r
             this.btnApprove.FlatAppearance.BorderSize = 0;\r
             this.btnApprove.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\r
@@ -404,7 +411,9 @@ namespace DxPlay {
             // \r
             this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.menuOpenFile,\r
-            this.menuApprove});\r
+            this.menuApprove,\r
+            this.toolStripSeparator3,\r
+            this.menuRedefineSegments});\r
             this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";\r
             this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);\r
             this.fileToolStripMenuItem.Text = "File";\r
@@ -413,7 +422,7 @@ namespace DxPlay {
             // \r
             this.menuOpenFile.Name = "menuOpenFile";\r
             this.menuOpenFile.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));\r
-            this.menuOpenFile.Size = new System.Drawing.Size(165, 22);\r
+            this.menuOpenFile.Size = new System.Drawing.Size(215, 22);\r
             this.menuOpenFile.Text = "Open file";\r
             this.menuOpenFile.Click += new System.EventHandler(this.menuOpenFile_Click);\r
             // \r
@@ -421,10 +430,23 @@ namespace DxPlay {
             // \r
             this.menuApprove.Name = "menuApprove";\r
             this.menuApprove.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));\r
-            this.menuApprove.Size = new System.Drawing.Size(165, 22);\r
+            this.menuApprove.Size = new System.Drawing.Size(215, 22);\r
             this.menuApprove.Text = "Approve";\r
             this.menuApprove.Click += new System.EventHandler(this.OnApprove);\r
             // \r
+            // toolStripSeparator3\r
+            // \r
+            this.toolStripSeparator3.Name = "toolStripSeparator3";\r
+            this.toolStripSeparator3.Size = new System.Drawing.Size(212, 6);\r
+            // \r
+            // menuRedefineSegments\r
+            // \r
+            this.menuRedefineSegments.Name = "menuRedefineSegments";\r
+            this.menuRedefineSegments.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));\r
+            this.menuRedefineSegments.Size = new System.Drawing.Size(215, 22);\r
+            this.menuRedefineSegments.Text = "Redefine segments";\r
+            this.menuRedefineSegments.Click += new System.EventHandler(this.OnRedefineSegments);\r
+            // \r
             // playerControls\r
             // \r
             this.playerControls.AutoSize = true;\r
@@ -512,6 +534,8 @@ namespace DxPlay {
         private NoFocusCueButton btnApprove;\r
         private Label labelSelectedMetadata;\r
         private TextBox txtSelectedID;\r
+        private ToolStripSeparator toolStripSeparator3;\r
+        private DxPlay.Controls.BindableToolStripMenuItem menuRedefineSegments;\r
     }\r
 }\r
 \r
index 9d989e0b2aa609df86e1a3e0dff70d075268f1a6..5686b936a203dc85410b49fdfde9f3be8ddbbfd9 100644 (file)
@@ -13,13 +13,15 @@ using System.Windows.Forms;
 namespace DxPlay {\r
 \r
     public partial class PlayerForm : Form {\r
+        private const string TITLE = "MediaCube Player";\r
         private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
-\r
+        private const string DEFAULT_FILE_FILTER = "MXF files (*.MXF)|*.MXF";\r
         private DateTime lastClick = DateTime.Now;\r
         private volatile bool trackBarAtUser;\r
         private DxPlayer m_play = null;\r
         private MediaDescription m_mediaDescription = null;\r
-        private OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "All files (*.*)|*.*" };\r
+\r
+        private OpenFileDialog openFileDialog = new OpenFileDialog();\r
         private ToolTip tooltips;\r
 \r
         private DxPlaySettings settings;\r
@@ -61,6 +63,7 @@ namespace DxPlay {
             mainMenu.DataBindings.Add(new Binding("Visible", model, "IsMenuVisible", false, DataSourceUpdateMode.Never));\r
             menuOpenFile.DataBindings.Add(new Binding("Enabled", model, "IsMenuVisible", false, DataSourceUpdateMode.Never));\r
             menuApprove.DataBindings.Add(new Binding("Enabled", model, "IsApproveEnabled", false, DataSourceUpdateMode.Never));\r
+            //menuRedefineSegments.DataBindings.Add(new Binding("Enabled", model, "IsRedefineSegmentsEnabled", false, DataSourceUpdateMode.Never));\r
 \r
             if (model.IsMenuVisible) {\r
                 btnApprove.DataBindings.Add(new Binding("Enabled", model, "IsApproveEnabled", false, DataSourceUpdateMode.Never));\r
@@ -86,8 +89,9 @@ namespace DxPlay {
         private void OnSelectedIDChanged(string ID, int variantID, string text, List<TrafficItem> selected) {\r
             //logger.Info("Selected ID: " + ID);\r
             try {\r
-                model.ID = ID;\r
+                model.SelectedSegments = selected;\r
                 model.VariantID = variantID;\r
+                model.ID = ID;\r
             } catch (Exception e) {\r
                 MsgBox.Error(e.Message);\r
                 logger.Error(e);\r
@@ -170,11 +174,7 @@ namespace DxPlay {
         }\r
 \r
         public void OpenFile(FileInfo fileInfo) {\r
-            logger.Debug("Open");\r
-            if (model.IsMenuVisible) {\r
-                model.ID = null;\r
-                model.CurrentFile = null;\r
-            }\r
+            logger.Debug("Open {0}", fileInfo.FullName);\r
 \r
             if (m_play != null)\r
                 m_play.Dispose();\r
@@ -185,8 +185,9 @@ namespace DxPlay {
 \r
             if (model.IsMenuVisible) {\r
                 tabEditor.SelectedTab = tpMetadata;\r
-                trafficBrowser.ClearSelection();\r
+                trafficBrowser.ClearLookup();\r
                 openFileDialog.InitialDirectory = fileInfo.Directory.FullName;\r
+                openFileDialog.Filter = DEFAULT_FILE_FILTER;\r
                 string id = fileInfo.Name.Replace(fileInfo.Extension, "");\r
                 try {\r
                     model.Lookup(id);\r
@@ -195,6 +196,7 @@ namespace DxPlay {
                     logger.Error(e);\r
                 }\r
             }\r
+            model.IsRedefineSegments = false;\r
 \r
 \r
             //for (int i = 0; i < 100; i++) {\r
@@ -250,7 +252,7 @@ namespace DxPlay {
                 return;\r
             }\r
             if (m_play.State == GraphState.Completed) {\r
-                m_play.Seek(0);\r
+                m_play.Stop();\r
             }\r
             m_play.Play();\r
             UpdatePlayPauseButton();\r
@@ -416,7 +418,7 @@ namespace DxPlay {
         private bool HandleHotKey(Keys keyCode) {\r
             logger.Debug("Key pressed " + keyCode);\r
             if (!ApplicationIsActivated() || trafficBrowser.ContainsFocus || openFileDialogOpened || dgSegments.IsCurrentCellInEditMode || (m_play != null && !m_play.IsFullscreen() && !ContainsFocus))\r
-                return true;\r
+                return false;\r
             logger.Debug("Handling " + keyCode);\r
             bool result = false;\r
             switch (keyCode) {\r
@@ -531,9 +533,20 @@ namespace DxPlay {
 \r
             try {\r
 \r
+                m_play.Seek(0);\r
                 m_play.Dispose();\r
+                this.Text = TITLE;\r
+                playerControls.Status.Text = Settings.Resource("NOINPUT", Resources.NOINPUT);\r
+                playerControls.StartTC.Text = new Timecode().ToString();\r
+                playerControls.CurrentTC.Text = new Timecode().ToString();\r
+                playerControls.EndTC.Text = new Timecode().ToString();\r
+                playerControls.TrackBar.Value = 0;\r
+                tabEditor.SelectedIndex = 0;\r
                 model.Approve();\r
-                trafficBrowser.ClearSelection();\r
+                trafficBrowser.ClearLookup();\r
+                btnApprove.Text = Settings.Resource("APPROVE", Resources.APPROVE);\r
+                model.IsRedefineSegments = false;\r
+\r
             } catch (Exception ex) {\r
                 logger.Error(ex);\r
                 MsgBox.Error(ex.Message);\r
@@ -541,6 +554,17 @@ namespace DxPlay {
 \r
         }\r
 \r
+        private void OnRedefineSegments(object sender, EventArgs e) {\r
+            openFileDialogOpened = true;\r
+            if (openFileDialog.ShowDialog() == DialogResult.OK) {\r
+                model.RedefineSegmentMediaID = Path.GetFileNameWithoutExtension(openFileDialog.FileName);\r
+                model.IsRedefineSegments = true;\r
+                OpenFile(new FileInfo(openFileDialog.FileName));\r
+            }\r
+            openFileDialogOpened = false;\r
+            model.IsRedefineSegments = true;\r
+            btnApprove.Text = Settings.Resource("REDEFINE", Resources.REDEFINE);\r
+        }\r
 \r
     }\r
 }\r
index 21ddb0c48d9e200b9b33e00deefbb23c260f7057..7a8247efaadc4f56b362fc6950b618155b748677 100644 (file)
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo\r
-        CAAAAk1TRnQBSQFMAgEBAgEAAaABAQGgAQEBGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
+        CAAAAk1TRnQBSQFMAgEBAgEAASABAgEgAQIBGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
         AwABYAMAARgDAAEBAQABCAYAAQkYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\r
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\r
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\r
index cd43b03319624e41c38e081bdeda7b2271c62a24..ef96d18f3c3708bb6b9984444e1fc2561dc15ebd 100644 (file)
 using MaestroShared.Commons;\r
 using MaestroShared.Metadata;\r
 using System;\r
+using System.Collections.Generic;\r
+using System.Drawing;\r
 using System.Linq;\r
 using System.Windows.Forms;\r
 \r
 namespace DxPlay {\r
     public partial class PlayerForm : Form {\r
 \r
+        private int AddSegment(int framesIn, int framesOut) {\r
+            var result = new MovieSegment() {\r
+                TCIn = new Timecode(framesIn),\r
+                TCOut = new Timecode(framesOut)\r
+            };\r
+\r
+            if (model.IsRedefineSegments)\r
+                result.MediaID = model.RedefineSegmentMediaID;\r
+\r
+            model.Segments.Add(result);\r
+            return model.Segments.Count - 1;\r
+        }\r
+\r
+        private int MovieLastFrame {\r
+            get => new Timecode(m_mediaDescription.FirstFrame, m_mediaDescription.Duration).Frames;\r
+        }\r
+\r
+        private int MovieFirstFrame {\r
+            get => m_mediaDescription.FirstFrame.Frames;\r
+        }\r
+\r
+        private int MovieCurrentFrame {\r
+            get => m_play.CurrentTC.Frames;\r
+        }\r
+\r
+        private MovieSegment GetLastSegment() {\r
+            MovieSegment result = null;\r
+            if (model.IsRedefineSegments)\r
+                result = model.Segments.Where(s => s.MediaID == model.RedefineSegmentMediaID).LastOrDefault();\r
+            else\r
+                result = model.Segments.Where(s => s.MediaID == null).LastOrDefault();\r
+            return result;\r
+        }\r
+\r
+        private MovieSegment GetSegmentOverlaps(MovieSegment currentSegment, MovieSegment newSegment) {\r
+            IEnumerable<MovieSegment> x = null;\r
+            x = model.Segments.Where(s =>\r
+                s != currentSegment &&\r
+                s.MediaID == newSegment.MediaID &&\r
+                newSegment.Overlaps(s)\r
+            );\r
+            return x.FirstOrDefault();\r
+        }\r
+\r
+        private MovieSegment GetSegmentAt(int frames) {\r
+            IEnumerable<MovieSegment> x = null;\r
+            if (model.IsRedefineSegments)\r
+                x = model.Segments.Where(s =>\r
+                    s.MediaID == model.RedefineSegmentMediaID &&\r
+                    s.Contains(frames)\r
+                );\r
+            else\r
+                x = model.Segments.Where(s =>\r
+                    s.MediaID == null &&\r
+                    s.Contains(frames)\r
+               );\r
+            return x.FirstOrDefault();\r
+        }\r
+\r
+        //ha nincs szegmens teljes terjedelmu szegmens hozzaadasa\r
+        //ha van már szegmens, akkor az utolsó után\r
         private void OnDefineOneSegmentClick(object sender, EventArgs e) {\r
             if (m_play == null)\r
                 return;\r
-            MovieSegment segment = null;\r
-            if (model.Segments.Count == 0) {\r
-                segment = new MovieSegment() {\r
-                    TCIn = new Timecode(m_mediaDescription.FirstFrame.Frames),\r
-                    TCOut = new Timecode(m_mediaDescription.FirstFrame, m_mediaDescription.Duration)\r
-                };\r
-            } else {\r
-                MovieSegment lastSegment = model.Segments[model.Segments.Count - 1];\r
-                Timecode tcEnd = new Timecode(m_mediaDescription.FirstFrame, m_mediaDescription.Duration);\r
-                if (lastSegment.TCOut.Frames == tcEnd.Frames) {\r
+            MovieSegment lastSegment = GetLastSegment();\r
+            if (lastSegment == null)\r
+                bsSegments.Position = AddSegment(MovieFirstFrame, MovieLastFrame);\r
+            else {\r
+                if (lastSegment.TCOut.Frames == MovieLastFrame)\r
                     MsgBox.Error(Settings.Resource("ERRORCREATESEGMENT", Resources.ERRORCREATESEGMENT));\r
-                    return;\r
-                }\r
-                segment = new MovieSegment() {\r
-                    TCIn = new Timecode(lastSegment.TCOut.Frames),\r
-                    TCOut = tcEnd\r
-                };\r
+                else\r
+                    bsSegments.Position = AddSegment(lastSegment.TCOut.Frames + 1, MovieLastFrame);\r
             }\r
-            model.Segments.Add(segment);\r
         }\r
 \r
+        //torli a kijelolt szegmenst\r
         private void OnDeleteSegmentClick(object sender, EventArgs e) {\r
-            if (bsSegments.Current != null)\r
-                model.Segments.Remove(bsSegments.Current as MovieSegment);\r
+            if (!(bsSegments.Current is MovieSegment currentSegment))\r
+                return;\r
+            if (currentSegment.ReadOnly)\r
+                return;\r
+            model.Segments.Remove(currentSegment);\r
         }\r
 \r
+        //a kijelolt szegmensen beallitja az aktualis poziciot beleponek, ha nincs utkozes\r
         private void SetActualPositionAsIn() {\r
             if (m_play == null)\r
                 return;\r
-            MovieSegment currentSegment = bsSegments.Current as MovieSegment;\r
-            if (currentSegment == null || bsSegments.Count == 0) {\r
-                MovieSegment newSegment = new MovieSegment() {\r
-                    TCIn = new Timecode(m_play.CurrentTC.Frames),\r
-                    TCOut = new Timecode(m_play.MediaDescription.FirstFrame.Frames + m_play.MediaDescription.Duration.Frames)\r
-                };\r
-                bsSegments.Position = bsSegments.Add(newSegment);\r
-            } else {\r
-                if (currentSegment.TCOut.Frames < m_play.CurrentTC.Frames) {\r
-                    int pos = bsSegments.IndexOf(currentSegment);\r
-                    if (pos == bsSegments.Count - 1) {\r
-                        MovieSegment newSegment = new MovieSegment() {\r
-                            TCIn = new Timecode(m_play.CurrentTC.Frames),\r
-                            TCOut = new Timecode(m_play.MediaDescription.FirstFrame.Frames + m_play.MediaDescription.Duration.Frames)\r
-                        };\r
-                        bsSegments.Position = bsSegments.Add(newSegment);\r
-                        return;\r
-                    }\r
-                    MsgBox.Error(Settings.Resource("ERRORINVALIDTCIN", Resources.ERRORINVALIDTCIN));\r
-                    return;\r
-                }\r
-                //if (MessageBox.Show("Biztos felül akarja írni az belépőt?", "Belépő felülírása", MessageBoxButtons.YesNo) == DialogResult.No)\r
-                //    return;\r
-                MovieSegment collisionSegment = model.Segments.Where(s => s.TCIn.Frames < m_play.CurrentTC.Frames && m_play.CurrentTC.Frames <= s.TCOut.Frames).SingleOrDefault();\r
-\r
-                if (collisionSegment != null && !currentSegment.Equals(collisionSegment)) {\r
-                    MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
-                    return;\r
-                }\r
-\r
-                currentSegment.TCIn = new Timecode(m_play.CurrentTC.Frames);\r
+            if (!(bsSegments.Current is MovieSegment currentSegment))\r
+                return;\r
+            if (currentSegment.ReadOnly)\r
+                return;\r
+            if (MovieCurrentFrame >= currentSegment.TCOut.Frames) {\r
+                MsgBox.Error(Settings.Resource("ERRORINVALIDTCIN", Resources.ERRORINVALIDTCIN));\r
+                return;\r
             }\r
+            MovieSegment newSegment = new MovieSegment() {\r
+                TCIn = new Timecode(MovieCurrentFrame),\r
+                TCOut = currentSegment.TCOut\r
+            };\r
+            MovieSegment collisionSegment = GetSegmentOverlaps(currentSegment, newSegment);\r
+            if (collisionSegment != null) {\r
+                MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
+                return;\r
+            }\r
+            currentSegment.TCIn = new Timecode(MovieCurrentFrame);\r
         }\r
 \r
-\r
+        //a kijelolt szegmensen beallitja az aktualis poziciot beleponek, ha nincs utkozes\r
         private void SetActualPositionAsOut() {\r
             if (m_play == null)\r
                 return;\r
-            MovieSegment currentSegment = bsSegments.Current as MovieSegment;\r
-            if (currentSegment == null || bsSegments.Count == 0) {\r
-                MovieSegment newSegment = new MovieSegment() {\r
-                    TCIn = new Timecode(m_play.MediaDescription.FirstFrame.Frames),\r
-                    TCOut = new Timecode(m_play.CurrentTC.Frames),\r
-                };\r
-                bsSegments.Position = bsSegments.Add(newSegment);\r
-            } else {\r
-                if (currentSegment.TCIn.Frames >= m_play.CurrentTC.Frames)\r
-                    MsgBox.Error(Settings.Resource("ERRORINVALIDTCOUT", Resources.ERRORINVALIDTCOUT));\r
-\r
-                MovieSegment collisionSegment = model.Segments.Where(s => s.TCIn.Frames < m_play.CurrentTC.Frames && m_play.CurrentTC.Frames <= s.TCOut.Frames).SingleOrDefault();\r
-\r
-                if (collisionSegment != null && !currentSegment.Equals(collisionSegment)) {\r
-                    MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
-                    return;\r
-                }\r
-\r
-                //if (MessageBox.Show("Biztos felül akarja írni az kilépőt?", "Kilépő felülírása", MessageBoxButtons.YesNo) == DialogResult.No)\r
-                //    return;\r
-                currentSegment.TCOut = new Timecode(m_play.CurrentTC.Frames);\r
+            if (!(bsSegments.Current is MovieSegment currentSegment))\r
+                return;\r
+            if (currentSegment.ReadOnly)\r
+                return;\r
+            if (MovieCurrentFrame <= currentSegment.TCIn.Frames) {\r
+                MsgBox.Error(Settings.Resource("ERRORINVALIDTCOUT", Resources.ERRORINVALIDTCOUT));\r
+                return;\r
             }\r
-        }\r
-\r
-        private void OnActualPositionToTCInToolStripMenuItem1Click(object sender, EventArgs e) {\r
-            SetActualPositionAsIn();\r
-        }\r
 \r
-        private void OnActualPositionToTCOutToolStripMenuItem1Click(object sender, EventArgs e) {\r
-            SetActualPositionAsOut();\r
+            MovieSegment newSegment = new MovieSegment() {\r
+                TCIn = currentSegment.TCIn,\r
+                TCOut = new Timecode(MovieCurrentFrame)\r
+            };\r
+            MovieSegment collisionSegment = GetSegmentOverlaps(currentSegment, newSegment);\r
+            if (collisionSegment != null) {\r
+                MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
+                return;\r
+            }\r
+            currentSegment.TCOut = new Timecode(MovieCurrentFrame);\r
         }\r
 \r
+        //az aktualis pozicioban talalhato szegmenst kettevagja\r
         private void OnSplitSegmentAtCurrentPositionClick(object sender, EventArgs e) {\r
-            MovieSegment currentSegment = model.Segments.Where(s => s.TCIn.Frames <= m_play.CurrentTC.Frames && s.TCOut.Frames >= m_play.CurrentTC.Frames).SingleOrDefault();\r
-            if (currentSegment == null)\r
+            MovieSegment currentSegment = GetSegmentAt(MovieCurrentFrame);\r
+            if (currentSegment == null || currentSegment.ReadOnly)\r
+                return;\r
+            if (MovieCurrentFrame == currentSegment.TCOut.Frames)\r
+                return;\r
+            if (currentSegment.TCIn.Frames == MovieCurrentFrame - 1)\r
                 return;\r
             int position = model.Segments.IndexOf(currentSegment);\r
+\r
+\r
             MovieSegment newSegment = new MovieSegment() {\r
                 TCIn = new Timecode(currentSegment.TCIn.Frames),\r
-                TCOut = new Timecode(m_play.CurrentTC.Frames - 1)\r
+                TCOut = new Timecode(MovieCurrentFrame - 1),\r
             };\r
-            currentSegment.TCIn = new Timecode(m_play.CurrentTC.Frames);\r
+            if (model.IsRedefineSegments)\r
+                newSegment.MediaID = currentSegment.MediaID;\r
+\r
             model.Segments.Insert(position, newSegment);\r
+\r
+            currentSegment.TCIn = new Timecode(MovieCurrentFrame);\r
         }\r
 \r
-        private void dgSegments_ColumnAdded(object sender, DataGridViewColumnEventArgs e) {\r
-            int index = e.Column.Index;\r
-            switch (index) {\r
-                case 0:\r
+        private void OnSegmentsColumnAdded(object sender, DataGridViewColumnEventArgs e) {\r
+            string name = e.Column.DataPropertyName;\r
+            switch (name) {\r
+                case "TCIn":\r
                     e.Column.HeaderText = Settings.Resource("TCIN", Resources.TCIN);\r
                     e.Column.ReadOnly = true;\r
                     break;\r
-                case 1:\r
+                case "TCOut":\r
                     e.Column.HeaderText = Settings.Resource("TCOUT", Resources.TCOUT);\r
                     e.Column.ReadOnly = true;\r
                     break;\r
-                case 2:\r
+                case "Optional":\r
                     e.Column.HeaderText = Settings.Resource("OPTIONAL", Resources.OPTIONAL);\r
                     break;\r
-                case 3:\r
+                case "Comment":\r
                     e.Column.HeaderText = Settings.Resource("COMMENT", Resources.COMMENT);\r
                     break;\r
+                case "MediaID":\r
+                    e.Column.HeaderText = Settings.Resource("MEDIAID", Resources.MEDIAID);\r
+                    e.Column.ReadOnly = true;\r
+                    break;\r
+                default:\r
+                    dgSegments.Columns.Remove(e.Column);\r
+                    break;\r
             }\r
         }\r
 \r
 \r
-        private void dgSegments_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {\r
-            MovieSegment actualSegment = bsSegments.Current as MovieSegment;\r
-            if (actualSegment == null || m_play == null)\r
+\r
+        private void OnActualPositionToTCInToolStripMenuItem1Click(object sender, EventArgs e) {\r
+            SetActualPositionAsIn();\r
+        }\r
+\r
+        private void OnActualPositionToTCOutToolStripMenuItem1Click(object sender, EventArgs e) {\r
+            SetActualPositionAsOut();\r
+        }\r
+\r
+        private void OnSegmentsCellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {\r
+            if (!(bsSegments.Current is MovieSegment actualSegment) || actualSegment.ReadOnly || m_play == null)\r
                 return;\r
             if (e.ColumnIndex == 0) {\r
                 m_play.Pause();\r
@@ -171,12 +230,27 @@ namespace DxPlay {
 \r
         }\r
 \r
-        private void dgSegments_CellContentClick(object sender, DataGridViewCellEventArgs e) {\r
-            if (e.ColumnIndex == 2)\r
-                dgSegments.EndEdit();\r
+        private void OnSegmentsCellContentClick(object sender, DataGridViewCellEventArgs e) {\r
+            if (!(dgSegments.Rows[e.RowIndex].DataBoundItem is MovieSegment item))\r
+                return;\r
+            if (e.ColumnIndex == 2) {\r
+                if (item.ReadOnly)\r
+                    dgSegments.CancelEdit();\r
+                else\r
+                    dgSegments.EndEdit();\r
+            }\r
         }\r
 \r
-        private void OnSegmentEditorMouseClick(object sender, MouseEventArgs e) {\r
+        private void OnSegmentsCellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) {\r
+            if (!(dgSegments.Rows[e.RowIndex].DataBoundItem is MovieSegment item))\r
+                return;\r
+\r
+            if (e.ColumnIndex == 3 && item.ReadOnly) {\r
+                e.Cancel = true;\r
+            }\r
+        }\r
+\r
+        private void OnSegmentsMouseClick(object sender, MouseEventArgs e) {\r
             var ht = dgSegments.HitTest(e.X, e.Y);\r
 \r
             if (ht.Type == DataGridViewHitTestType.None) {\r
@@ -184,5 +258,34 @@ namespace DxPlay {
             }\r
         }\r
 \r
+        private void OnSegmentsCellPainting(object sender, DataGridViewCellPaintingEventArgs e) {\r
+            if (e.RowIndex < 0)\r
+                return;\r
+            if (!(dgSegments.Rows[e.RowIndex].DataBoundItem is MovieSegment item))\r
+                return;\r
+            DataGridViewRow row = dgSegments.Rows[e.RowIndex];\r
+            if (item.ReadOnly) {\r
+                row.DefaultCellStyle.SelectionForeColor = Color.DarkGray;\r
+                row.DefaultCellStyle.ForeColor = Color.DarkGray;\r
+            } else {\r
+                row.DefaultCellStyle = null;\r
+            }\r
+        }\r
+\r
+        private void OnSegmentsCellMouseEnter(object sender, DataGridViewCellEventArgs e) {\r
+            if (IsValidCellAddress(e.RowIndex, e.ColumnIndex))\r
+                dgSegments.Cursor = Cursors.Hand;\r
+        }\r
+\r
+        private void OnSegmentsCellMouseLeave(object sender, DataGridViewCellEventArgs e) {\r
+            if (IsValidCellAddress(e.RowIndex, e.ColumnIndex))\r
+                dgSegments.Cursor = Cursors.Default;\r
+        }\r
+\r
+        private bool IsValidCellAddress(int rowIndex, int columnIndex) {\r
+            return rowIndex >= 0 && rowIndex < dgSegments.RowCount &&\r
+                columnIndex >= 0 && columnIndex <= 2;\r
+        }\r
+\r
     }\r
 }\r
index 9e2e5171bbd6b41ee61be7ea8b713549587a17e2..3e914ce20ea667057f0b2ee1cc54070daeee5f75 100644 (file)
@@ -26,7 +26,7 @@ using System.Runtime.CompilerServices;
 // You can specify all the values or you can default the Revision and Build Numbers \r
 // by using the '*' as shown below:\r
 \r
-[assembly: AssemblyVersion("2.0.8.6")]\r
+[assembly: AssemblyVersion("2.0.8.7")]\r
 \r
 //\r
 // In order to sign your assembly you must specify a key to use. Refer to the \r
@@ -56,5 +56,5 @@ using System.Runtime.CompilerServices;
 [assembly: AssemblyDelaySign(false)]\r
 [assembly: AssemblyKeyFile("")]\r
 [assembly: AssemblyKeyName("")]\r
-[assembly: AssemblyFileVersion("2.0.8.6")]\r
+[assembly: AssemblyFileVersion("2.0.8.7")]\r
 \r
index 6ede38cf3faad4f9d34c7d734c4cf6c74f84d7d8..430901f0f64ca65d58309b671dbc89de93d7f550 100644 (file)
@@ -276,6 +276,15 @@ namespace DxPlay.Properties {
             }\r
         }\r
         \r
+        /// <summary>\r
+        ///   Looks up a localized string similar to Média ID.\r
+        /// </summary>\r
+        internal static string MEDIAID {\r
+            get {\r
+                return ResourceManager.GetString("MEDIAID", resourceCulture);\r
+            }\r
+        }\r
+        \r
         /// <summary>\r
         ///   Looks up a localized string similar to Metaadat.\r
         /// </summary>\r
@@ -384,6 +393,24 @@ namespace DxPlay.Properties {
             }\r
         }\r
         \r
+        /// <summary>\r
+        ///   Looks up a localized string similar to Újraszegmentálás.\r
+        /// </summary>\r
+        internal static string REDEFINE {\r
+            get {\r
+                return ResourceManager.GetString("REDEFINE", resourceCulture);\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized string similar to Újraszegmentálás.\r
+        /// </summary>\r
+        internal static string REDEFINESEGMENTS {\r
+            get {\r
+                return ResourceManager.GetString("REDEFINESEGMENTS", resourceCulture);\r
+            }\r
+        }\r
+        \r
         /// <summary>\r
         ///   Looks up a localized string similar to Hátra csévélés (Ctrl + &lt;).\r
         /// </summary>\r
@@ -473,5 +500,14 @@ namespace DxPlay.Properties {
                 return ResourceManager.GetString("TCOUT", resourceCulture);\r
             }\r
         }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized string similar to A fájl nevének egyeznie kell a korábban megadottal..\r
+        /// </summary>\r
+        internal static string WRONGFILEFORREDEFINE {\r
+            get {\r
+                return ResourceManager.GetString("WRONGFILEFORREDEFINE", resourceCulture);\r
+            }\r
+        }\r
     }\r
 }\r
index 258c9ba44c3fe52354c0cafc005fd97617509dee..30684219ce276d38543f59160fedffba93936c12 100644 (file)
   <data name="STEPFORWARD" xml:space="preserve">\r
     <value>Előre léptetés (&gt;)</value>\r
   </data>\r
+  <data name="REDEFINESEGMENTS" xml:space="preserve">\r
+    <value>Újraszegmentálás</value>\r
+  </data>\r
+  <data name="REDEFINE" xml:space="preserve">\r
+    <value>Újraszegmentálás</value>\r
+  </data>\r
+  <data name="WRONGFILEFORREDEFINE" xml:space="preserve">\r
+    <value>A fájl nevének egyeznie kell a korábban megadottal.</value>\r
+  </data>\r
+  <data name="MEDIAID" xml:space="preserve">\r
+    <value>Média ID</value>\r
+  </data>\r
 </root>
\ No newline at end of file
index 188c8a81e40bb236e3935e904f30cc0cc2f297ec..ad4c3fb1e86f7f410b75858e72b9748edf0ca0dc 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "Development",\r
-  "active": false,\r
+  "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "filter": "avi",\r
@@ -10,7 +10,7 @@
     "$type": "NEXIOSource",\r
     "hideEmpty":  true,\r
     "local": {\r
-      "address": "ws://10.10.1.27:88/services/nexio"\r
+      "address": "ws://10.10.1.27/services/nexio"\r
     },\r
     "remote": {\r
       "address": "ftp://10.10.1.55:2098",\r
@@ -38,7 +38,7 @@
     {\r
       "$type": "MediaCubeMetadata",\r
       "server": {\r
-        "address": "http://localhost:8888/services/rest/jobengine",\r
+        "address": "http://10.10.1.27/services/rest/jobengine",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
       "killDateDays": 7,\r
+      "sourceNexioAgency": "ARCHIVED1",\r
+      "sourceNexioKillDateDays": 1,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
-        "address": "ftp://10.10.1.100/TESZT",\r
+        "address": "ftp://10.10.1.105/TESZT",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
index 3932bcbde24b68d7b7ea9e956c895b10362a4c1e..cf268ea61d9ea23b725bdda800b75e713eea560a 100644 (file)
@@ -30,7 +30,7 @@
       "$type": "OctopusMetadata",\r
       "server": {\r
         "address": "http://10.10.1.27/services/rest/octopus",\r
-        "timeout": 3000\r
+        "timeout": 5000\r
       }\r
     },\r
     {\r
         "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
         "timeout": 1000\r
       },\r
-      "version": 1\r
+      "version": 0,\r
+      "redefineSegments": true\r
     },\r
     {\r
       "$type": "MediaCubeMetadata",\r
       "server": {\r
-        "address": "http://10.10.1.29:88/services/rest/jobengine",\r
+        "address": "http://10.10.1.27/services/rest/jobengine",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
         "timeout": 1000\r
       },\r
       "jobTemplate": "retrieve-material.xml",\r
-      "archiveFolder": "file://10.10.1.100/BRAAVOS/ARCHIVE",\r
-      "restoreFolder": "file://10.10.1.100/BRAAVOS/ARCHIVE_RESTORE",\r
+      "archiveFolder": "file://10.10.1.105/TESZT/TC/ARCHIVE",\r
+      "restoreFolder": "file://10.10.1.105/BRAAVOS/ARCHIVE_RESTORE",\r
       "restoreNamePattern": "%s_%GUID%",\r
       "serverRestoreFolder": "/mnt/ISILON/ARCHIVE_RESTORE",\r
       "killDateDays": 1\r
     }\r
   ],\r
   "targets": [\r
+    {\r
+      "label": "Stúdióba küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "TESZT",\r
+      "nexioServer": true,\r
+      "nexioFileExistsMessage": "A feltöltéshez új 'placeholder' generálása szükséges az Octopus rendszerben, az anyagon belül az ALT+1 billenytűkombináció segítségével.",\r
+      "killDateDays": 1,\r
+      "disableFileVersioning": true,\r
+      "agency": "ARCHIVED",\r
+      "remote": {\r
+        "address": "ftp://10.10.1.55:2098",\r
+        "userName": "administrator",\r
+        "password": "+QtkeQdCTiOvZOgK/kUND4pO4/D+//r7ZIyluwMMdiqMEgO8iJErAG10ooWhPfiljQeXrdeyMzo7gWEZtcWpNSomGeDIbdMyQwtpqmMo1VEM3A27ZfzigY09YD46ECRh",\r
+        "timeout": 1000\r
+      }\r
+    },\r
     {\r
       "label": "Adáskész",\r
       "processor": "FTPTargetProcessor",\r
index 13f3cec2dc7014b5974a575b1b0e02a1775c8a10..57c5b76f0a24972a7191d473687a02009f6651bd 100644 (file)
@@ -1,5 +1,6 @@
 using Interfaces;\r
 using Maestro.Metadata;\r
+using Maestro.Sources;\r
 using MaestroShared.Commons;\r
 using MaestroShared.Configuration;\r
 using MaestroShared.Metadata;\r
@@ -20,7 +21,16 @@ namespace Maestro {
         private const string MXFEXT = ".MXF";\r
 \r
         private MetadataInfo selectedMetadata;\r
-        private BindingList<MovieSegment> movieSegments;\r
+        BindingList<MovieSegment> movieSegments;\r
+        private BindingList<MovieSegment> MovieSegments {\r
+            get {\r
+                return movieSegments;\r
+            }\r
+            set {\r
+                movieSegments = value;\r
+                UpdateDefineSegmentsStatus();\r
+            }\r
+        }\r
         private MediaCubeApi mediaCubeApi;\r
         private ArchiveMetadata archiveMetadata;\r
         private static MetadataType[] validTypes = { MetadataType.TrafficAD, MetadataType.TrafficMaterial, MetadataType.TrafficPromo };\r
@@ -32,7 +42,7 @@ namespace Maestro {
             }\r
             set {\r
                 selectedMetadata = value;\r
-                movieSegments = null;\r
+                MovieSegments = null;\r
                 textSelectedMetadata.Text = value?.ID;\r
                 ttMetadata.SetToolTip(textSelectedMetadata, GetMetadataTypeTooltip(value?.Kind));\r
             }\r
@@ -43,6 +53,7 @@ namespace Maestro {
             set {\r
                 archiveMetadata = value;\r
                 btnEditMetadata.ToolTipText = archiveMetadata == null ? "Metaadat" : archiveMetadata.ToString();\r
+                UpdateEditArchiveMetadataStatus();\r
             }\r
         }\r
 \r
@@ -53,6 +64,7 @@ namespace Maestro {
             textSelectedMetadata.ReadOnly = !Configuration.EnableCustomMetadataId;\r
             UpdateDefineSegmentEnabled();\r
             UpdateEditArchiveMetadataEnabled();\r
+\r
         }\r
 \r
         private void InitializeTrafficSelector() {\r
@@ -115,7 +127,6 @@ namespace Maestro {
                 ArchiveMetadata = saved;\r
                 SelectedMetadata.MetadataText = ArchiveMetadata.itemTitle;\r
             }\r
-            UpdateEditArchiveMetadataStatus();\r
         }\r
 \r
         private void OnDefineSegments(object sender, EventArgs e) {\r
@@ -124,12 +135,31 @@ namespace Maestro {
             DefineSegments(SelectedSource.FileInfo, false);\r
         }\r
 \r
+        private void UpdateSegmentsAccessibility() {\r
+            if (MovieSegments == null)\r
+                return;\r
+            foreach (var s in MovieSegments) {\r
+                //eredetileg a szegmens adatokkal ez nem jon le singlesegment eseten, de kell a mukodeshez\r
+                if (!trafficIDSelector.MultiSegment && s.MediaID == null)\r
+                    s.MediaID = SelectedMetadata.ID;\r
+                //redefine\r
+                if (true.Equals(SelectedMetadata?.IsRedefine))\r
+                    s.ReadOnly = SelectedMetadata.ID != s.MediaID;\r
+                else\r
+                    s.ReadOnly = !string.IsNullOrWhiteSpace(s.MediaID);\r
+            }\r
+        }\r
+\r
         private void DefineSegments(FileInfo fileInfo, bool redefine) {\r
             Cursor = Cursors.WaitCursor;\r
-            if (!redefine && (movieSegments == null || movieSegments.Count == 0))\r
-                movieSegments = QuerySegments();\r
-            if (movieSegments == null)\r
-                movieSegments = new BindingList<MovieSegment>();\r
+            if (MovieSegments == null || MovieSegments.Count == 0)\r
+                MovieSegments = QuerySegments();\r
+\r
+            //redifine v nem\r
+            UpdateSegmentsAccessibility();\r
+\r
+            if (MovieSegments == null)\r
+                MovieSegments = new BindingList<MovieSegment>();\r
             bool readOnly = true;\r
             if (ArchiveMetadata == null) {\r
                 ArchiveMetadata = GetArchiveMetadata();\r
@@ -139,18 +169,16 @@ namespace Maestro {
                     readOnly = ArchiveMetadata.ok;\r
             } else\r
                 readOnly = ArchiveMetadata.ok;\r
-            if (readOnly && ArchiveMetadata != null)\r
+            if (readOnly && ArchiveMetadata != null && !SelectedMetadata.IsRedefine)\r
                 MsgBox.Warning("Az anyag már el van fogadva, a szegmens módosítás nem kerül mentésre. A szegmensek módosításához vissza kell vonni az anyag elfogadását az adástervező rendszerben.");\r
             OpenFile(fileInfo, true, readOnly);\r
-            UpdateDefineSegmentsStatus();\r
             Cursor.Current = Cursors.Default;\r
         }\r
 \r
         private BindingList<MovieSegment> QuerySegments() {\r
             BindingList<MovieSegment> result = null;\r
             List<MovieSegment> storedSegments = null;\r
-            TrafficMetadata metadata = MetadataProvider.Get<TrafficMetadata>(Configuration.Metadatas);\r
-            if (true.Equals(metadata?.MultiSegmentEnabled)) {\r
+            if (trafficIDSelector.MultiSegment) {\r
                 storedSegments = new List<MovieSegment>();\r
                 foreach (TrafficItem item in SelectedMetadata.Selected) {\r
                     if (item.MovieSegment != null)\r
@@ -159,13 +187,14 @@ namespace Maestro {
             } else\r
                 storedSegments = GetSegments();\r
 \r
-            if (storedSegments != null && storedSegments.Count > 0)\r
+            if (storedSegments != null && storedSegments.Count > 0) {\r
                 result = new BindingList<MovieSegment>(storedSegments);\r
+            }\r
             return result;\r
         }\r
 \r
         private void UpdateDefineSegmentsStatus() {\r
-            if (movieSegments == null || movieSegments.Count == 0)\r
+            if (MovieSegments == null || MovieSegments.Count == 0)\r
                 btnDefineSegments.Image = Properties.Resources.ic_playlist_add_check_black_24dp_1x;\r
             else\r
                 btnDefineSegments.Image = Properties.Resources.ic_playlist_add_check_black_24dp_1x_green;\r
@@ -178,7 +207,6 @@ namespace Maestro {
                 btnEditMetadata.Image = Properties.Resources.ic_receipt_black_24dp_1x_green;\r
         }\r
 \r
-\r
         private List<MovieSegment> GetSegments() {\r
             List<MovieSegment> result = null;\r
             switch (selectedMetadata.Kind) {\r
@@ -198,7 +226,6 @@ namespace Maestro {
             return result;\r
         }\r
 \r
-\r
         private ArchiveMetadata GetArchiveMetadata() {\r
             ArchiveMetadata result = null;\r
             Cursor.Current = Cursors.WaitCursor;\r
@@ -346,7 +373,7 @@ namespace Maestro {
                 }\r
             }\r
 \r
-            movieSegments = null;\r
+            MovieSegments = null;\r
             ArchiveMetadata = null;\r
 \r
             UpdateProcessorButtonsEnabled();\r
@@ -387,15 +414,24 @@ namespace Maestro {
                 VariantID = variantID,\r
                 Selected = selected\r
             };\r
-\r
-            CheckIfRedefineSegments();\r
+            TrafficMetadata metadata = MetadataProvider.Get<TrafficMetadata>(Configuration.Metadatas);\r
+            if (true.Equals(metadata?.RedefineSegments))\r
+                CheckIfRedefineSegments();\r
         }\r
 \r
         private void CheckIfRedefineSegments() {\r
             bool enableRedefine = false;\r
             string mediaHouseId = SelectedMetadata.ID + MXFEXT;\r
+\r
+            if (bindingSource.DataSource is FileSystemSource source) {\r
+                string location = Path.Combine(source.Path, mediaHouseId);\r
+                enableRedefine = File.Exists(location);\r
+                if (enableRedefine)\r
+                    SelectedMetadata.RedefineSegmentsFile = location;\r
+            }\r
+\r
             MediaCubeMetadata metadata = MetadataProvider.Get<MediaCubeMetadata>(Configuration.Metadatas);\r
-            if (metadata != null && metadata.ArchiveFolder != null) {\r
+            if (!enableRedefine && metadata != null && metadata.ArchiveFolder != null) {\r
                 string location = Path.Combine(metadata.ArchiveFolder.LocalPath, mediaHouseId);\r
                 enableRedefine = File.Exists(location);\r
                 if (enableRedefine)\r
@@ -418,13 +454,16 @@ namespace Maestro {
                 }\r
             }\r
 \r
-            if (enableRedefine)\r
+            if (enableRedefine && trafficIDSelector.trafficAPI != null)\r
                 btnRedefineSegments.Visible = true;\r
         }\r
 \r
         private void OnRedefineSegments(object sender, EventArgs e) {\r
             if (SelectedMetadata == null)\r
                 return;\r
+\r
+            SelectedMetadata.IsRedefine = true;\r
+\r
             MediaCubeMetadata mediaCubeMetadata = MetadataProvider.Get<MediaCubeMetadata>(Configuration.Metadatas);\r
             if (SelectedMetadata.RedefineWithRestore) {\r
                 RestoreMedia restoreForm = new RestoreMedia(SelectedMetadata, mediaCubeMetadata, errorMessageBus);\r
@@ -433,6 +472,12 @@ namespace Maestro {
             }\r
 \r
             DefineSegments(new FileInfo(SelectedMetadata.RedefineSegmentsFile), true);\r
+            SelectedMetadata.IsRedefine = false;\r
+\r
+            if (MsgBox.YesNoQuestion("Biztosan elmenti a változtatásokat?")) {\r
+                trafficIDSelector.trafficAPI.SaveSegments(SelectedMetadata.VariantID, SelectedMetadata.Kind, MovieSegments?.ToList());\r
+                trafficIDSelector.trafficAPI.Approve(SelectedMetadata.VariantID, MovieSegments?.Count > 0, SelectedMetadata.Kind);\r
+            }\r
         }\r
 \r
         private static string GetMetadataTypeTooltip(MetadataType? metadataType) {\r
@@ -511,7 +556,6 @@ namespace Maestro {
 \r
         private void UpdateEditArchiveMetadataEnabled() {\r
             btnEditMetadata.Enabled = SelectedSource != null;\r
-            UpdateEditArchiveMetadataStatus();\r
         }\r
 \r
         private void UpdateDefineSegmentEnabled() {\r
@@ -522,7 +566,6 @@ namespace Maestro {
                                         SelectedSource.FileInfo != null &&\r
                                         SelectedMetadata != null &&\r
                                         validTypes.ToList().Contains(SelectedMetadata.Kind);\r
-            UpdateDefineSegmentsStatus();\r
         }\r
 \r
         private void UpdateLookupByMetadataEnabled() {\r
index dcd5971dfffe9ec7516f4b9ddbbb78ce64b46308..f178c58f887485daef501537d3749f75356a7065 100644 (file)
@@ -34,7 +34,7 @@ namespace Maestro {
                     selectedSourceItems.Clear();\r
                 }\r
                 textSelectedSource.Text = selectedSource?.Name;\r
-                movieSegments = null;\r
+                MovieSegments = null;\r
                 UpdateProcessorButtonsEnabled();\r
                 UpdateDefineSegmentEnabled();\r
                 UpdateEditArchiveMetadataEnabled();\r
@@ -144,7 +144,7 @@ namespace Maestro {
                             AutoStart = Configuration.Player.AutoStart,\r
                             SegmentEditor = Configuration.Player.SegmentEditor && segmentEditor\r
                         },\r
-                        Segments = movieSegments\r
+                        Segments = MovieSegments\r
                     };\r
                     player.OpenFile(fileInfo);\r
                     if (!player.IsDisposed)\r
index 0a54f414cd707d6e32e4c74769c2149eb54e8b1e..7641a9eab575885cb7461bd73f92881dcd9c40a0 100644 (file)
@@ -123,26 +123,27 @@ namespace Maestro {
 \r
 \r
         private bool EnsureSegments(Target target) {\r
-            if ((target.SaveMorpheusMetadata || target.SaveSegments) && (movieSegments == null || movieSegments.Count == 0)) {\r
+            if ((target.SaveMorpheusMetadata || target.SaveSegments) && (MovieSegments == null || MovieSegments.Count == 0)) {\r
                 if (selectedMetadata?.VariantID != null && selectedMetadata?.VariantID != 0) {\r
                     List<MovieSegment> storedSegments = GetSegments();\r
-                    if (storedSegments != null && storedSegments.Count > 0)\r
-                        movieSegments = new BindingList<MovieSegment>(storedSegments);\r
+                    if (storedSegments != null && storedSegments.Count > 0) {\r
+                        MovieSegments = new BindingList<MovieSegment>(storedSegments);\r
+                    }\r
                 }\r
-                if (movieSegments == null) {\r
+                if (MovieSegments == null) {\r
                     MessageBox.Show(String.Format("A {0} folyamat nem futtatható szegmens adatok nélkül.", target.Label));\r
                     return false;\r
                 }\r
                 switch (selectedMetadata.Kind) {\r
                     case MetadataType.TrafficPromo: {\r
-                            if (movieSegments.Count != 1) {\r
+                            if (MovieSegments.Count != 1) {\r
                                 MessageBox.Show(String.Format("Promó anyagnak csak egy szegmens adata lehet."));\r
                                 return false;\r
                             }\r
                             break;\r
                         }\r
                     case MetadataType.TrafficAD: {\r
-                            if (movieSegments.Count != 1) {\r
+                            if (MovieSegments.Count != 1) {\r
                                 MessageBox.Show(String.Format("Reklám anyagnak csak egy szegmens adata lehet."));\r
                                 return false;\r
                             }\r
@@ -164,7 +165,6 @@ namespace Maestro {
                 ArchiveMetadata = GetArchiveMetadata();\r
                 if (SelectedMetadata != null && String.IsNullOrEmpty(SelectedMetadata.MetadataText))\r
                     SelectedMetadata.MetadataText = ArchiveMetadata.itemTitle;\r
-                UpdateEditArchiveMetadataStatus();\r
                 if (ArchiveMetadata == null) {\r
                     MessageBox.Show(String.Format("A {0} folyamat nem futtatható kísérő adatok nélkül.", target.Label));\r
                     return false;\r
@@ -186,7 +186,7 @@ namespace Maestro {
             result.ID = textSelectedMetadata.Text;\r
             result.MetadataText = SelectedMetadata?.MetadataText;\r
             result.InputFileName = sourceItem.Name;\r
-            result.MovieSegments = movieSegments?.ToList();\r
+            result.MovieSegments = MovieSegments?.ToList();\r
             result.ArchiveMetadata = ArchiveMetadata.DeepClone(ArchiveMetadata);\r
             result.VariantID = selectedMetadata == null ? 0 : selectedMetadata.VariantID;\r
             result.MetadataKind = selectedMetadata == null ? MetadataType.None : selectedMetadata.Kind;\r
index 4d1e4e85326148742ce659e1166ad978a5f7d407..dec051610460422cb02937390bd5389fd9e25efa 100644 (file)
@@ -11,6 +11,7 @@ namespace Maestro.Metadata {
         public string RedefineSegmentsFile { get; set; }\r
         public bool RedefineWithRestore { get; set; }\r
         public Media RedefineMedia { get; set; }\r
+        public bool IsRedefine { get; set; }\r
         public List<TrafficItem> Selected { get; set; }\r
     }\r
 }\r
index 882bf3bbddfcb7e4ce1e6a3723722995779a7ee5..5eae53d84b410c3b9cf14e6272e8f110cd7d9c2b 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.8.8")]\r
-[assembly: AssemblyFileVersion("2.0.8.8")]\r
+[assembly: AssemblyVersion("2.0.9.0")]\r
+[assembly: AssemblyFileVersion("2.0.9.0")]\r
index 5c8cc2a8ece2961aef0a9ea563f3f48331ec3779..320d33cb31a4ced461ffb522f060877b0a31567c 100644 (file)
@@ -122,6 +122,8 @@ namespace MaestroShared.Configuration {
         public string NexioFileExistsMessage { get; set; }\r
         public string Agency { get; set; }\r
         public string PopupMessage { get; set; }\r
+        public string SourceNexioAgency { get; set; }\r
+        public int SourceNexioKillDateDays { get; set; }\r
     }\r
 \r
     public class Connection {\r
@@ -191,6 +193,7 @@ namespace MaestroShared.Configuration {
         public ProjectSettings ProjectSettings { get; set; }\r
         public string FunctionName { get; set; }\r
         public int Version { get; set; }\r
+        public bool RedefineSegments { get; set; }\r
         public bool MultiSegmentEnabled {\r
             get => Version == 1;\r
         }\r
index 7b9fd28621613485950bd6a08b8ae6ef015c9c58..28bd8fd4562fa6ef73100666c2d142c61e161e73 100644 (file)
@@ -4,7 +4,7 @@ using System.Collections.Generic;
 \r
 namespace Interfaces {\r
     public interface ITrafficAPI {\r
-        void Approve(int itemID, bool ready, MetadataType kind, bool ifCompleted = false);\r
+        void Approve(int itemID, bool ready, MetadataType kind, TrafficItem trafficItem = null, bool ifCompleted = false);\r
         TrafficVersion CreateMaterialVersion(string episodeID, bool recut);\r
         List<TrafficItemMetadata> GetADArchiveMetadata(string strParam);\r
         List<TrafficItem> GetADs(string search, bool problematic, DateTime? from = null, DateTime? to = null);\r
@@ -15,6 +15,6 @@ namespace Interfaces {
         List<TrafficItemMetadata> GetPromoArchiveMetadata(string strParam);\r
         List<TrafficItem> GetPromos(string search, bool problematic, DateTime? from = null, DateTime? to = null);\r
         List<MovieSegment> GetPromoSegments(string strParam);\r
-        string SaveSegments(int itemID, MetadataType kind, List<MovieSegment> segments, List<TrafficItem> selectedSegments);\r
+        string SaveSegments(int itemID, MetadataType kind, List<MovieSegment> segments, List<TrafficItem> selectedSegments = null);\r
     }\r
 }
\ No newline at end of file
index 42627eb10f09c0d357538783ea2248492efa8f37..2f35ebcd82597c2b188272e7592922e6a12bd3d3 100644 (file)
@@ -1,13 +1,14 @@
-using System;\r
-using System.Text.RegularExpressions;\r
+using System.Text.RegularExpressions;\r
 \r
 namespace MaestroShared.Metadata {\r
     public enum MetadataType {\r
-        None, MediaCube, OctopusStory, OctopusPlaceHolder, TrafficMaterial, TrafficPromo, TrafficAD\r
+        None, MediaCube, OctopusStory, OctopusPlaceHolder, TrafficMaterial, TrafficMaterialSegment, TrafficPromo, TrafficAD\r
     }\r
 \r
     public class MetadataTypeUtil {\r
         private const string REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}$";\r
+        private const string REGEXP_TRAFFICMATERIALID_V1 = "^M{1}[0-9]{6}[A-Z]{1}[0-9]{1}$";\r
+        private const string REGEXP_TRAFFICMATERIALID_V2 = "^M{1}[0-9]{6}[A-Z]{1}[A-Z]{1}$";\r
         private const string REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}$";\r
         private const string REGEXP_TRAFFICALTERNATEADID = "^C{1}[0-9]{6}[A-Z]{1}$";\r
         private const string REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}$";\r
@@ -15,8 +16,9 @@ namespace MaestroShared.Metadata {
         private const string REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
         private const string REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
 \r
+\r
         public static MetadataType Guess(string id) {\r
-            if (String.IsNullOrEmpty(id))\r
+            if (string.IsNullOrEmpty(id))\r
                 return MetadataType.None;\r
             Match match = null;\r
 \r
@@ -24,6 +26,14 @@ namespace MaestroShared.Metadata {
             if (match.Success)\r
                 return MetadataType.TrafficMaterial;\r
 \r
+            match = Regex.Match(id, REGEXP_TRAFFICMATERIALID_V1);\r
+            if (match.Success)\r
+                return MetadataType.TrafficMaterialSegment;\r
+\r
+            match = Regex.Match(id, REGEXP_TRAFFICMATERIALID_V2);\r
+            if (match.Success)\r
+                return MetadataType.TrafficMaterialSegment;\r
+\r
             match = Regex.Match(id, REGEXP_TRAFFICPROMOID);\r
             if (match.Success)\r
                 return MetadataType.TrafficPromo;\r
index 0904fcb71bfabc814751a5ab194f6463f4e24280..0d36f60a393bcafce30609d950c0397c3d52b059 100644 (file)
@@ -8,10 +8,14 @@ namespace MaestroShared.Metadata {
         protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "") {\r
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r
         }\r
+        public int SegNr;\r
         private Timecode tcIn;\r
         private Timecode tcOut;\r
         private bool optional;\r
         private string comment;\r
+        private string mediaID;\r
+        public int SegID;\r
+        public bool ReadOnly;\r
 \r
         public Timecode TCIn {\r
             get => tcIn;\r
@@ -45,6 +49,20 @@ namespace MaestroShared.Metadata {
             }\r
         }\r
 \r
+        public string MediaID {\r
+            get => mediaID;\r
+            set {\r
+                mediaID = value;\r
+                NotifyPropertyChanged();\r
+            }\r
+        }\r
 \r
+        public bool Contains(int frame) {\r
+            return TCIn.Frames <= frame && TCOut.Frames >= frame;\r
+        }\r
+\r
+        public bool Overlaps(MovieSegment segment) {\r
+            return Contains(segment.TCIn.Frames) || Contains(segment.TCOut.Frames);\r
+        }\r
     }\r
 }\r
index 66b695148f417339eff59e072477911413478620..02df4a7c66b435e61616d269ae4514328cf0cd93 100644 (file)
@@ -19,7 +19,7 @@ namespace MaestroShared.Metadata {
         public string Segment {\r
             get {\r
                 if (SegmentCount != null && SegmentNr != null)\r
-                    return string.Format($"{SegmentCount} / {SegmentNr}");\r
+                    return string.Format($"{SegmentCount} / {SegmentNr} : {MovieSegment?.MediaID}");\r
                 else\r
                     return "";\r
             }\r
index e4191e46aa88fb7964a0dfdde9079669ecc243dd..c05a92a69d6e9d09acd3f11b4d5e1493f52f49f0 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.9.0")]\r
-[assembly: AssemblyFileVersion("2.0.9.0")]\r
+[assembly: AssemblyVersion("2.0.9.1")]\r
+[assembly: AssemblyFileVersion("2.0.9.1")]\r
index e8d68f51c48196370e79e4415463aaffd6307c17..c88dbb6bfa439eefbd7c2b820fbf7d405cf71c77 100644 (file)
@@ -1,10 +1,12 @@
 using FluentFTP;\r
+using MaestroShared.Commons;\r
 using MaestroShared.Configuration;\r
 using MaestroShared.Target;\r
 using NLog;\r
 using System;\r
 using System.IO;\r
 using System.Linq;\r
+using System.Text;\r
 using System.Text.RegularExpressions;\r
 using System.Threading;\r
 using System.Windows.Forms;\r
@@ -162,8 +164,45 @@ namespace MaestroShared.Targets {
             }\r
         }\r
 \r
+        private void UploadNexioSourceMetadata() {\r
+            logger.Trace(Strings.ENTRY);\r
+            string xml = null;\r
+            string name = Path.GetFileNameWithoutExtension(Input);\r
+            string description = Parameters.ArchiveMetadata?.mediaTitle;\r
+            if (Parameters.TargetConfig.KillDateDays > 0) {\r
+                DateTime date = GetKillDate(Parameters.TargetConfig.SourceNexioKillDateDays);\r
+                KillDate = date.ToString(DATE_FORMAT);\r
+                xml = NexioXML.ToXML(name, date, null, Parameters.TargetConfig.SourceNexioAgency);\r
+            } else\r
+                xml = NexioXML.ToXML(name, null, null, Parameters.TargetConfig.SourceNexioAgency);\r
+            byte[] content = Encoding.Unicode.GetBytes(xml);\r
+            UploadContentToSource(name + XML_EXT, content);\r
+            logger.Trace(Strings.EXIT);\r
+        }\r
+\r
+        protected void UploadContentToSource(string outputPath, byte[] content) {\r
+            using (Stream ostream = sourceFTP.OpenWrite(outputPath, FtpDataType.Binary, false)) {\r
+                try {\r
+                    ostream.Write(content, 0, content.Length);\r
+                } catch (Exception e) {\r
+                    logger.Error(e.Message);\r
+                    throw e;\r
+                } finally {\r
+                    ostream.Close();\r
+                }\r
+            }\r
+            FtpReply reply = sourceFTP.GetReply();\r
+            if (!reply.Success || !_226.Equals(reply.Code)) {\r
+                throw new Exception(UPLOAD_ERROR);\r
+            }\r
+        }\r
+\r
         protected override void AfterExecute() {\r
             base.AfterExecute();\r
+\r
+            if (isNexioSource && !string.IsNullOrWhiteSpace(Parameters.TargetConfig.SourceNexioAgency))\r
+                UploadNexioSourceMetadata();\r
+\r
             TerminateClient(monitorFTP);\r
             TerminateClient(sourceFTP);\r
         }\r
index e5fb23be09741f86f9ff99933dd4bf4858a7279e..a1df54068c16960d67a6ead98ef7089b2e230e4b 100644 (file)
@@ -8,5 +8,6 @@ namespace MaestroShared.Targets {
         public bool Ready { get; set; }\r
         public MetadataType MetadataType { get; set; }\r
         public List<MovieSegment> Segments { get; set; }\r
+        public List<TrafficItem> Selected { get; set; }\r
     }\r
 }\r
index 3b13eb768c85c8f5648baf0df02e8c6b90cd92dd..bf3d651061ebc46ab19e69b1d9efca1b243d3764 100644 (file)
@@ -23,11 +23,11 @@ namespace MaestroShared.Targets {
         private const string KILLDATE_FILE = "{0}.{1}.killdate";\r
         private const string METADATA_FILE = "{0}.json";\r
         private const string NORMALIZE_TEXT_PATTERN = "[^0-9A-Za-z-._/]";\r
-        private const string DATE_FORMAT = "yyyy.MM.dd";\r
+        protected const string DATE_FORMAT = "yyyy.MM.dd";\r
         private const string PROGRAMME = "PROGRAMME";\r
         private const string COMMERCIAL = "COMMERCIAL";\r
         private const string JUNCTION = "JUNCTION";\r
-        private const string XML_EXT = ".xml";\r
+        protected const string XML_EXT = ".xml";\r
         private const string DOT = ".";\r
         private const string HYPHENSTAR = "-*";\r
         private const string DATE_FORMAT_NODOTS = "yyyyMMdd";\r
@@ -74,7 +74,7 @@ namespace MaestroShared.Targets {
                 string fileName = Parameters?.TrafficApi?.SaveSegments(Parameters.VariantID, Parameters.MetadataKind, Parameters.MovieSegments, Parameters.SelectedSegments);\r
                 if (true.Equals(Parameters?.TrafficMetadata?.MultiSegmentEnabled)) {\r
                     //a Traffic adja a nevet\r
-                    OutputName = fileName;\r
+                    OutputName = fileName ?? throw new Exception("A fájlnév nem lehet üres.");\r
                 }\r
             }\r
         }\r
@@ -208,7 +208,10 @@ namespace MaestroShared.Targets {
 \r
             if (Parameters.TargetConfig.SaveSegments && Parameters.MovieSegments != null) {\r
                 bool ifCompleted = true.Equals(Parameters?.TrafficMetadata?.MultiSegmentEnabled);\r
-                Parameters?.TrafficApi?.Approve(Parameters.VariantID, true, Parameters.MetadataKind, ifCompleted);\r
+                TrafficItem trafficItem = null;\r
+                if (Parameters.SelectedSegments != null && Parameters.SelectedSegments.Count > 0)\r
+                    trafficItem = Parameters.SelectedSegments[0];\r
+                Parameters?.TrafficApi?.Approve(Parameters.VariantID, true, Parameters.MetadataKind, trafficItem, ifCompleted);\r
             }\r
             if (Parameters.TargetConfig.SendEmailOnSuccess && !String.IsNullOrEmpty(Parameters.TargetConfig.SuccessEmailRecipient) && !String.IsNullOrEmpty(Parameters.TargetConfig.SuccessEmailPattern))\r
                 SendEmail(Parameters.TargetConfig.SuccessEmailRecipient, Parameters.TargetConfig.SuccessEmailPattern);\r
@@ -221,7 +224,7 @@ namespace MaestroShared.Targets {
             string name = GetOutputName();\r
             string description = Parameters.ArchiveMetadata?.mediaTitle;\r
             if (Parameters.TargetConfig.KillDateDays > 0) {\r
-                DateTime date = GetKillDate();\r
+                DateTime date = GetKillDate(Parameters.TargetConfig.KillDateDays);\r
                 KillDate = date.ToString(DATE_FORMAT);\r
                 xml = NexioXML.ToXML(name, date, description, Parameters.TargetConfig.Agency);\r
             } else\r
@@ -295,7 +298,7 @@ namespace MaestroShared.Targets {
                 Parameters?.MediaCubeApi?.Create<WorkflowAction>(workFlowAction);\r
             } catch (Exception e) {\r
                 logger.Error(e);\r
-                MessageBox.Show(parent, e.Message);\r
+                //MsgBox.Error(e.Message);\r
             }\r
             logger.Trace(Strings.EXIT);\r
         }\r
@@ -339,10 +342,10 @@ namespace MaestroShared.Targets {
             return result;\r
         }\r
 \r
-        private DateTime GetKillDate() {\r
+        protected DateTime GetKillDate(int killDateDays) {\r
             logger.Trace(Strings.ENTRY);\r
             DateTime result = DateTime.Now;\r
-            result = result.AddDays(Parameters.TargetConfig.KillDateDays);\r
+            result = result.AddDays(killDateDays);\r
             logger.Trace(Strings.EXIT);\r
             return result;\r
         }\r
@@ -352,7 +355,7 @@ namespace MaestroShared.Targets {
             Uri address = Parameters.TargetConfig.Remote.Address;\r
             string statusWorkDir = Path.Combine(workingDir, STATUS_FOLDER);\r
             EnsureDirectoryExistence(statusWorkDir);\r
-            DateTime date = GetKillDate();\r
+            DateTime date = GetKillDate(Parameters.TargetConfig.KillDateDays);\r
             string fileName = String.Format(KILLDATE_FILE, OutputName, date.ToString(DATE_FORMAT_NODOTS));\r
             //logger.Debug("Creating KILLDATE status file {0}", fileName);\r
             KillDatePath = GetOutputFilePath(statusWorkDir, fileName);\r
index b08057c13dadb7af7138d244d8c157f2f4e4006e..9b072e3b3ba41d804744aa2fc5f9e691316c5693 100644 (file)
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
 //      Build Number\r
 //      Revision\r
 //\r
-[assembly: AssemblyVersion("1.0.0.0")]\r
-[assembly: AssemblyFileVersion("1.0.0.0")]\r
+[assembly: AssemblyVersion("1.0.0.1")]\r
+[assembly: AssemblyFileVersion("1.0.0.1")]\r
index 9a8e1bb6236d8d50448c3b36e056326f36ce5e55..359bd8a1f72255f2cdda1420aa2711e571ab5bd9 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("1.0.0.1")]\r
-[assembly: AssemblyFileVersion("1.0.0.1")]\r
+[assembly: AssemblyVersion("1.0.0.2")]\r
+[assembly: AssemblyFileVersion("1.0.0.2")]\r
index 11581b99c26519893633cbdf55467faf3dbc71b9..f6cf2565f3f3b107d53b3ce1089c4b7dc81feafd 100644 (file)
@@ -25,6 +25,7 @@
         public int? v_SegDuration;\r
         public string v_SegTitle;\r
         public string v_SegKeyWords;\r
+        public string v_SegMediaID;\r
         public bool? v_SegDropable;\r
     }\r
 }\r
index 99615b9e2c12a399fe52837ad76a7e1ea3755191..97fe41a8c103b4f02c62113a6ddfe50b13031ea1 100644 (file)
 namespace TrafficClient.Model {\r
     public partial class PlanAirMaterialSegmentResult {\r
 \r
-        private int _v_SegID;\r
-\r
-        private System.Nullable<int> _v_VariantID;\r
-\r
-        private string _v_ClipID;\r
-\r
-        private string _v_SegTitle;\r
-\r
-        private string _v_SegKeyWords;\r
-\r
-        private System.Nullable<int> _v_SegNumber;\r
-\r
-        private System.Nullable<int> _v_TcIn;\r
-\r
-        private System.Nullable<int> _v_TcOut;\r
-\r
-        private System.Nullable<int> _v_Duration;\r
-\r
-        private string _v_TcInTC;\r
-\r
-        private string _v_TcOutTC;\r
-\r
-        private string _v_DurationTC;\r
-\r
-        private bool? _v_Dropable;\r
-\r
-        public PlanAirMaterialSegmentResult() {\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_SegID", DbType = "Int NOT NULL")]\r
-        public int v_SegID {\r
-            get {\r
-                return this._v_SegID;\r
-            }\r
-            set {\r
-                if ((this._v_SegID != value)) {\r
-                    this._v_SegID = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_VariantID", DbType = "Int")]\r
-        public System.Nullable<int> v_VariantID {\r
-            get {\r
-                return this._v_VariantID;\r
-            }\r
-            set {\r
-                if ((this._v_VariantID != value)) {\r
-                    this._v_VariantID = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_SegTitle", DbType = "VarChar", CanBeNull = false)]\r
-        public string v_SegTitle {\r
-            get {\r
-                return this._v_SegTitle;\r
-            }\r
-            set {\r
-                if ((this._v_SegTitle != value)) {\r
-                    this._v_SegTitle = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_SegKeyWords", DbType = "Int")]\r
-        public string v_SegKeyWords {\r
-            get {\r
-                return this.v_SegKeyWords;\r
-            }\r
-            set {\r
-                if ((this._v_SegKeyWords != value)) {\r
-                    this._v_SegKeyWords = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_SegNumber", DbType = "Int")]\r
-        public System.Nullable<int> v_SegNumber {\r
-            get {\r
-                return this._v_SegNumber;\r
-            }\r
-            set {\r
-                if ((this._v_SegNumber != value)) {\r
-                    this._v_SegNumber = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_TcIn", DbType = "int")]\r
-        public System.Nullable<int> v_TcIn {\r
-            get {\r
-                return this._v_TcIn;\r
-            }\r
-            set {\r
-                if ((this._v_TcIn != value)) {\r
-                    this._v_TcIn = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_TcOut", DbType = "Int")]\r
-        public System.Nullable<int> v_TcOut {\r
-            get {\r
-                return this._v_TcOut;\r
-            }\r
-            set {\r
-                if ((this._v_TcOut != value)) {\r
-                    this._v_TcOut = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_Duration", DbType = "Int")]\r
-        public System.Nullable<int> v_Duration {\r
-            get {\r
-                return this._v_Duration;\r
-            }\r
-            set {\r
-                if ((this._v_Duration != value)) {\r
-                    this._v_Duration = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_TcInTC", DbType = "VarChar(40)")]\r
-        public string v_TcInTC {\r
-            get {\r
-                return this._v_TcInTC;\r
-            }\r
-            set {\r
-                if ((this._v_TcInTC != value)) {\r
-                    this._v_TcInTC = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_ClipID", DbType = "VarChar(8)")]\r
-        public string v_ClipID {\r
-            get {\r
-                return this._v_ClipID;\r
-            }\r
-            set {\r
-                if ((this._v_ClipID != value)) {\r
-                    this._v_ClipID = value;\r
-                }\r
-            }\r
-        }\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_TcOutTC", DbType = "VarChar(25)")]\r
-        public string v_TcOutTC {\r
-            get {\r
-                return this._v_TcOutTC;\r
-            }\r
-            set {\r
-                if ((this._v_TcOutTC != value)) {\r
-                    this._v_TcOutTC = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_DurationTC", DbType = "Varchar")]\r
-        public string v_DurationTC {\r
-            get {\r
-                return this._v_DurationTC;\r
-            }\r
-            set {\r
-                if ((this._v_DurationTC != value)) {\r
-                    this._v_DurationTC = value;\r
-                }\r
-            }\r
-        }\r
-\r
-        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "v_Dropable", DbType = "bit")]\r
-        public bool? v_Dropable {\r
-            get {\r
-                return this._v_Dropable;\r
-            }\r
-            set {\r
-                if ((this._v_Dropable != value)) {\r
-                    this._v_Dropable = value;\r
-                }\r
-            }\r
-        }\r
-\r
-\r
+        public int v_SegID;\r
+        public int? v_VariantID;\r
+        public string v_MediaID;\r
+        public string v_ClipID;\r
+        public string v_SegTitle;\r
+        public string v_SegKeyWords;\r
+        public int? v_SegNumber;\r
+        public int? v_TcIn;\r
+        public int? v_TcOut;\r
+        public int? v_Duration;\r
+        public string v_TcInTC;\r
+        public string v_TcOutTC;\r
+        public string v_DurationTC;\r
+        public bool? v_Dropable;\r
     }\r
 }\r
index 1fc68f17c4d2c77420dd9a9ac5575e1196cd5bdb..6b738c0693326c9ea227a2c3e8ff16dfd8fa741e 100644 (file)
@@ -43,8 +43,6 @@ namespace TrafficClient {
         }\r
 \r
         public PlanAirMaterialResult ToSingleMaterialResult(SqlDataReader reader) {\r
-            //for (int i = 0; i < reader.FieldCount; i++)\r
-            //    logger.Debug($"{i} : {reader.GetName(i)} {reader.GetDataTypeName(i)} {reader.GetFieldType(i)}");\r
             PlanAirMaterialResult item = new PlanAirMaterialResult();\r
             int f = 0;\r
             item.v_ProgrammeID = (int)ReadInt(reader, ref f);\r
@@ -68,27 +66,9 @@ namespace TrafficClient {
             item.v_ForTransm = ReadBool(reader, ref f);\r
             return item;\r
         }\r
-        /*\r
-USE [PA_Echo]\r
-GO\r
 \r
-DECLARE        @return_value int\r
-\r
-EXEC   @return_value = [dbo].[clIFsp_EC_MAM]\r
-               @Operation = 6002,\r
-               @@@Options = 0,\r
-               @@ItemID = NULL,\r
-               @@DateParam1 = N'2018-12-06',\r
-               @@DateParam2 = N'2018-12-06'\r
-\r
-SELECT 'Return Value' = @return_value\r
-\r
-GO\r
-         \r
-             */\r
         public PlanAirMaterialResult ToMultiMaterialResult(SqlDataReader reader) {\r
-            //for (int i = 0; i < reader.FieldCount; i++)\r
-            //    logger.Debug($"{i} : {reader.GetName(i)} {reader.GetDataTypeName(i)} {reader.GetFieldType(i)}");\r
+            //reader.DumpColumns();\r
             PlanAirMaterialResult item = new PlanAirMaterialResult();\r
             int f = 0;\r
             item.v_ProgrammeID = (int)ReadInt(reader, ref f);\r
@@ -114,6 +94,7 @@ GO
             item.v_SegDuration = ReadInt(reader, ref f);\r
             item.v_SegTitle = ReadString(reader, ref f);\r
             item.v_SegKeyWords = ReadString(reader, ref f);\r
+            item.v_SegMediaID = ReadString(reader, ref f);\r
             item.v_SegDropable = ReadBool(reader, ref f);\r
             item.v_FirstBroadcastDate = ReadDateTime(reader, ref f);\r
             item.v_NextBroadcastDate = ReadDateTime(reader, ref f);\r
@@ -167,8 +148,10 @@ GO
         public PlanAirMaterialSegmentResult ToMaterialSegmentResult(SqlDataReader reader) {\r
             PlanAirMaterialSegmentResult item = new PlanAirMaterialSegmentResult();\r
             int f = 0;\r
+            reader.DumpColumns();\r
             item.v_SegID = (int)ReadInt(reader, ref f);\r
             item.v_VariantID = ReadInt(reader, ref f);\r
+            item.v_MediaID = ReadString(reader, ref f);\r
             item.v_SegTitle = ReadString(reader, ref f);\r
             item.v_SegKeyWords = ReadString(reader, ref f);\r
             item.v_SegNumber = ReadInt(reader, ref f);\r
@@ -183,4 +166,14 @@ GO
         }\r
 \r
     }\r
+\r
+    public static class SqlDataReaderExtension {\r
+        private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
+\r
+        public static void DumpColumns(this SqlDataReader reader) {\r
+            for (int i = 0; i < reader.FieldCount; i++)\r
+                logger.Debug($"{i} : {reader.GetName(i)} {reader.GetDataTypeName(i)} {reader.GetFieldType(i)}");\r
+\r
+        }\r
+    }\r
 }\r
index f8176cc3c69984617ee40d263933441d05f2c01c..f379123979a97488a4f7806c8598e19177eada6e 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("1.0.0.1")]\r
-[assembly: AssemblyFileVersion("1.0.0.1")]\r
+[assembly: AssemblyVersion("1.0.0.2")]\r
+[assembly: AssemblyFileVersion("1.0.0.2")]\r
index d0d3b74b4ffcb0dc61f673996e3da742e90bcd8a..998c2ba30c78ffb8bfbb64c28792436959c5532f 100644 (file)
@@ -57,10 +57,10 @@ namespace TrafficClient {
             return materialWorker.GetMaterialArchiveMetadata(strParam);\r
         }\r
 \r
-        public void Approve(int itemID, bool ready, MetadataType kind, bool ifCompleted) {\r
+        public void Approve(int itemID, bool ready, MetadataType kind, TrafficItem trafficItem = null, bool ifCompleted = false) {\r
             switch (kind) {\r
                 case MetadataType.TrafficMaterial: {\r
-                        materialWorker.SetMaterialOK(itemID, ready, ifCompleted);\r
+                        materialWorker.SetMaterialOK(itemID, ready, trafficItem, ifCompleted);\r
                         break;\r
                     }\r
                 case MetadataType.TrafficAD: {\r
@@ -72,27 +72,19 @@ namespace TrafficClient {
                         break;\r
                     }\r
             }\r
+\r
+            Parameters?.MessageBus.Send(new TrafficAPIRefreshMessage());\r
         }\r
 \r
-        public string SaveSegments(int itemID, MetadataType kind, List<MovieSegment> segments, List<TrafficItem> selectedSegments) {\r
+        public string SaveSegments(int itemID, MetadataType kind, List<MovieSegment> segments, List<TrafficItem> selectedSegments = null) {\r
             string result = null;\r
             switch (kind) {\r
                 case MetadataType.TrafficMaterial: {\r
                         if (true.Equals(Parameters?.Configuration?.MultiSegmentEnabled)) {\r
                             materialWorker.SetMaterialOK(itemID, false);\r
-                            int delSegCount = selectedSegments.Count - segments.Count;\r
-                            while (delSegCount > 0) {\r
-                                var segNr = (int)selectedSegments[selectedSegments.Count - 1].SegmentNr;\r
-                                materialWorker.DeleteMaterialSegment(itemID, segNr);\r
-                                selectedSegments.RemoveAt(selectedSegments.Count - 1);\r
-                                delSegCount--;\r
-                            }\r
-\r
-                            for (int i = 0; i < segments.Count; i++) {\r
-                                MovieSegment actualSegment = segments[i];\r
-                                var segNr = (int)selectedSegments[i].SegmentNr;\r
-                                result = materialWorker.AddMaterialSegment(itemID, actualSegment, result, segNr);\r
-                            }\r
+                            DeleteUnmappedSegments(itemID, segments, selectedSegments);\r
+                            result = ModifySegments(itemID, segments, selectedSegments);\r
+                            Parameters?.MessageBus.Send(new TrafficAPIRefreshMessage());\r
 \r
                         } else {\r
                             //egyebkent nem fogadja el a szegmnesadatokat?\r
@@ -117,6 +109,58 @@ namespace TrafficClient {
             return result;\r
         }\r
 \r
+        private string ModifySegments(int itemID, List<MovieSegment> segments, List<TrafficItem> selectedSegments) {\r
+            string result = null;\r
+            int segNr = 0;\r
+            string newSegmentName = null;\r
+            for (int i = 0; i < segments.Count; i++) {\r
+                MovieSegment actualSegment = segments[i];\r
+                bool newSegment = selectedSegments.Count - 1 < i || (selectedSegments.Count == 1 && selectedSegments[0].SegmentId == null);\r
+                if (newSegment) {\r
+                    segNr++;\r
+                } else {\r
+                    if (selectedSegments[i].SegmentNr == null)\r
+                        segNr++;\r
+                    else\r
+                        segNr = (int)selectedSegments[i].SegmentNr;\r
+\r
+                }\r
+\r
+                string fileName = null;\r
+\r
+                //ha redifine volt, akkor minden modositott szegmens tartalmazza a fajlnevet\r
+                //ha define akkor az null, de a masodik szegmensnel mar az elsovel letrehozott fajlnev kell\r
+                if (!newSegment && actualSegment.SegID != 0)\r
+                    fileName = actualSegment.MediaID;\r
+\r
+                if (newSegment) {\r
+                    if (actualSegment.MediaID == null)\r
+                        fileName = newSegmentName;\r
+                    else\r
+                        fileName = actualSegment.MediaID;\r
+                }\r
+\r
+                logger.Info("Adding segment {0} {1}", segNr, fileName ?? "null");\r
+                result = materialWorker.AddMaterialSegment(itemID, actualSegment, fileName, segNr);\r
+                if (newSegment && newSegmentName == null)\r
+                    newSegmentName = result;\r
+            }\r
+\r
+            return newSegmentName ?? result;\r
+        }\r
+\r
+        private void DeleteUnmappedSegments(int itemID, List<MovieSegment> segments, List<TrafficItem> selectedSegments) {\r
+            int delSegCount = selectedSegments.Count - segments.Count;\r
+            while (delSegCount > 0) {\r
+                if (selectedSegments[selectedSegments.Count - 1].SegmentId == null)\r
+                    break;\r
+                var segId = (int)selectedSegments[selectedSegments.Count - 1].SegmentId;\r
+                materialWorker.DeleteMaterialSegment(itemID, segId);\r
+                selectedSegments.RemoveAt(selectedSegments.Count - 1);\r
+                delSegCount--;\r
+            }\r
+        }\r
+\r
         public List<TrafficItem> GetPromos(string search, bool problematic, DateTime? from = null, DateTime? to = null) {\r
             return promoWorker.GetPromos(search, problematic, from, to);\r
         }\r
index 0249fcb513deaf9b07d11ce44d89365391d728c3..4981b581c0cbb1d510a7c4fefd19556d20b70592 100644 (file)
@@ -1,4 +1,5 @@
 using Interfaces;\r
+using LinkDotNet.MessageHandling.Contracts;\r
 using MaestroShared.Commons;\r
 using MaestroShared.Configuration;\r
 using MaestroShared.MessageBus;\r
@@ -35,6 +36,19 @@ namespace TrafficClient {
             rbMaterial.Text = metadata.Resource("MATERIAL", Resources.MATERIAL);\r
             rbPromo.Text = metadata.Resource("PROMOTION", Resources.PROMOTION);\r
             rbAD.Text = metadata.Resource("ADVERTISEMENT", Resources.ADVERTISEMENT);\r
+            parameters?.MessageBus.Subscribe<TrafficAPIRefreshMessage>(OnRefreshTrafficGrid);\r
+        }\r
+\r
+        private void RefreshKeepPosition() {\r
+            int pos = dgTraffic.FirstDisplayedScrollingRowIndex;\r
+            RefreshResults();\r
+            dgTraffic.FirstDisplayedScrollingRowIndex = pos;\r
+        }\r
+\r
+        private void OnRefreshTrafficGrid(IMessage m) {\r
+            BeginInvoke((Action)(() => {\r
+                RefreshKeepPosition();\r
+            }));\r
         }\r
 \r
         public TrafficParameters Parameters {\r
@@ -48,11 +62,14 @@ namespace TrafficClient {
             }\r
         }\r
 \r
+        public bool MultiSegment { get => true.Equals(parameters?.Configuration?.MultiSegmentEnabled); }\r
+\r
         public void RefreshResults() {\r
             if (refreshDisabled || trafficAPI == null)\r
                 return;\r
             ClearSelection();\r
             Cursor.Current = Cursors.WaitCursor;\r
+            dgTraffic.SuspendLayout();\r
             DateTime? scheduledDate = null;\r
             if (this.dtScheduled.Checked)\r
                 scheduledDate = this.dtScheduled.Value.Date;\r
@@ -61,7 +78,7 @@ namespace TrafficClient {
             dgTraffic.Columns.Clear();\r
             TrafficMetadata metadata = parameters?.Configuration ?? new TrafficMetadata();\r
             if (rbMaterial.Checked) {\r
-                if (true.Equals(parameters?.Configuration?.MultiSegmentEnabled))\r
+                if (MultiSegment)\r
                     dgTraffic.Columns.AddRange(GetMultiMaterialColumns(metadata));\r
                 else\r
                     dgTraffic.Columns.AddRange(GetSingleMaterialColumns(metadata));\r
@@ -79,6 +96,8 @@ namespace TrafficClient {
                 trafficAPIBindingSource.DataSource = null;\r
             else\r
                 trafficAPIBindingSource.DataSource = items;\r
+            SelectResult();\r
+            dgTraffic.ResumeLayout();\r
             Cursor.Current = Cursors.Default;\r
         }\r
 \r
@@ -125,7 +144,7 @@ namespace TrafficClient {
             selectedCell.Value = !(bool)selectedCell.Value;\r
             bool selected = (bool)selectedCell.Value;\r
 \r
-            if (true.Equals(parameters?.Configuration?.MultiSegmentEnabled)) {\r
+            if (MultiSegment) {\r
                 bool clear = true;\r
                 List<DataGridViewRow> selectedOthers = null;\r
                 if (selected) {\r
@@ -157,7 +176,7 @@ namespace TrafficClient {
         }\r
 \r
         private void CreateVersionIfMissing(TrafficItem trafficItem) {\r
-            /*\r
+\r
             if (String.IsNullOrEmpty(trafficItem.MediaID)) {\r
                 var currentVersion = trafficAPI.GetMaterials(trafficItem.EpisodeID, false)?.FirstOrDefault();\r
                 if (currentVersion == null || String.IsNullOrEmpty(currentVersion.MediaID)) {\r
@@ -171,23 +190,29 @@ namespace TrafficClient {
                     trafficItem.VariantID = currentVersion.VariantID;\r
                 }\r
 \r
-                if (trafficItem.VariantID == 0 || String.IsNullOrEmpty(trafficItem.MediaID))\r
+                if (trafficItem.VariantID == 0 || string.IsNullOrEmpty(trafficItem.MediaID))\r
                     return;\r
             } else if (ModifierKeys.HasFlag(Keys.Shift)) {\r
                 var currentVersion = trafficAPI.GetMaterials(trafficItem.EpisodeID, false)?.FirstOrDefault();\r
                 TrafficVersion newVersion = trafficAPI.CreateMaterialVersion(trafficItem.EpisodeID, true);\r
                 if (newVersion != null) {\r
-                    RefreshResults();\r
+                    RefreshKeepPosition();\r
                 }\r
             }\r
-            */\r
+\r
+        }\r
+        public void ClearLookup() {\r
+            ClearSelection();\r
+            txtFilter.Text = "";\r
+            dtScheduled.Checked = true;\r
+            chkProblematic.Checked = true;\r
         }\r
 \r
         public void ClearSelection() {\r
             foreach (DataGridViewRow r in dgTraffic.Rows) {\r
                 TrafficItem item = r.DataBoundItem as TrafficItem;\r
                 if (item.Selected)\r
-                    r.Cells[0].Value = false;\r
+                    OnSelectionChanged(r);\r
             }\r
         }\r
 \r
@@ -231,13 +256,37 @@ namespace TrafficClient {
         }\r
 \r
         private void SelectResult() {\r
+            if (string.IsNullOrWhiteSpace(txtFilter.Text))\r
+                return;\r
             List<TrafficItem> result = trafficAPIBindingSource.DataSource as List<TrafficItem>;\r
             if (result == null || result.Count == 0) {\r
                 TrafficMetadata metadata = parameters?.Configuration ?? new TrafficMetadata();\r
                 MsgBox.Info(metadata.Resource("IDNOTEXISTS", Resources.IDNOTEXISTS));\r
             } else {\r
-                OnSelectionChanged(dgTraffic.Rows[0]);\r
-                result[0].Selected = true;\r
+\r
+                bool hasSelection = false;\r
+                string searchText = txtFilter.Text;\r
+                if (MultiSegment) {\r
+                    if (MetadataTypeUtil.Guess(searchText) == MetadataType.TrafficMaterialSegment)\r
+                        searchText = searchText.Substring(0, searchText.Length - 1);\r
+                }\r
+\r
+                var results = result.Where(r => true.Equals(r.MediaID?.Contains(searchText)));\r
+                if (results != null) {\r
+                    foreach (TrafficItem ti in results) {\r
+                        foreach (DataGridViewRow row in dgTraffic.Rows) {\r
+                            if (row.DataBoundItem == ti) {\r
+                                hasSelection = true;\r
+                                OnSelectionChanged(row);\r
+                                if (!MultiSegment)\r
+                                    break;\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+\r
+                if (!hasSelection)\r
+                    OnSelectionChanged(dgTraffic.Rows[0]);\r
             }\r
         }\r
 \r
@@ -247,7 +296,6 @@ namespace TrafficClient {
             rbMaterial.Checked = true;\r
             refreshDisabled = false;\r
             RefreshResults();\r
-            SelectResult();\r
         }\r
 \r
         public void LookupByPromoID(string id) {\r
@@ -256,7 +304,6 @@ namespace TrafficClient {
             rbPromo.Checked = true;\r
             refreshDisabled = false;\r
             RefreshResults();\r
-            SelectResult();\r
         }\r
 \r
         public void LookupByADID(string id) {\r
@@ -265,7 +312,6 @@ namespace TrafficClient {
             rbAD.Checked = true;\r
             refreshDisabled = false;\r
             RefreshResults();\r
-            SelectResult();\r
         }\r
 \r
         private void OnRefresh(object sender, EventArgs e) {\r
@@ -283,7 +329,13 @@ namespace TrafficClient {
     }\r
 \r
     public class TrafficAPIMessage : MaestroMessage {\r
-        public TrafficAPIMessage(string message) : base(message) {\r
+        public Exception Exception { get; }\r
+\r
+        public TrafficAPIMessage(string message, Exception e) : base(message) {\r
+            Exception = e;\r
         }\r
     }\r
+\r
+    public class TrafficAPIRefreshMessage : IMessage {\r
+    }\r
 }\r
index 2858a86c2874d60540c0314870fa972229f1ad9e..c40e0a56e4b992f156cfc9cd46d2234aa2eaa2f2 100644 (file)
@@ -4,10 +4,12 @@ using System.Windows.Forms;
 \r
 namespace TrafficClient {\r
     public partial class TrafficIDSelector {\r
+        const int CHECKWIDTH = 10;\r
+\r
         DataGridViewColumn[] GetSingleMaterialColumns(TrafficMetadata metadata) {\r
             return new DataGridViewColumn[] {\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    Width = CHECKWIDTH,\r
                     DataPropertyName = "Selected",\r
                     Frozen = true\r
                 },\r
@@ -15,10 +17,11 @@ namespace TrafficClient {
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "MediaID",\r
                     HeaderText = metadata.Resource("TRAFFICID", Resources.TRAFFICID),\r
-                    Width = 100\r
+                    Width = 100,\r
+                    Frozen = true\r
                 },\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    HeaderText = "OK",\r
                     DataPropertyName = "OK",\r
                     ReadOnly = true\r
                 },\r
@@ -70,7 +73,7 @@ namespace TrafficClient {
         DataGridViewColumn[] GetMultiMaterialColumns(TrafficMetadata metadata) {\r
             return new DataGridViewColumn[] {\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    Width = CHECKWIDTH,\r
                     DataPropertyName = "Selected",\r
                     Frozen = true\r
                 },\r
@@ -78,13 +81,19 @@ namespace TrafficClient {
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "MediaID",\r
                     HeaderText = metadata.Resource("TRAFFICID", Resources.TRAFFICID),\r
-                    Width = 100\r
+                    Width = 100,\r
+                    Frozen = true,\r
+                },\r
+                new DataGridViewCheckBoxColumn() {\r
+                    HeaderText = "OK",\r
+                    DataPropertyName = "OK",\r
+                    ReadOnly = true\r
                 },\r
                 new DataGridViewTextBoxColumn() {\r
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "Segment",\r
                     HeaderText = metadata.Resource("SEGMENT", Resources.SEGMENT),\r
-                    Width = 100\r
+                    Width = 120\r
                 },\r
                 new DataGridViewTextBoxColumn() {\r
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
@@ -98,11 +107,6 @@ namespace TrafficClient {
                     HeaderText = metadata.Resource("EPISODETITLE", Resources.EPISODETITLE),\r
                     Width = 100\r
                 },\r
-                new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
-                    DataPropertyName = "OK",\r
-                    ReadOnly = true\r
-                },\r
                 new DataGridViewTextBoxColumn() {\r
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "EpisodeNumber",\r
@@ -134,7 +138,7 @@ namespace TrafficClient {
         DataGridViewColumn[] GetADColumns(TrafficMetadata metadata) {\r
             return new DataGridViewColumn[] {\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    Width = CHECKWIDTH,\r
                     DataPropertyName = "Selected",\r
                     Frozen = true\r
                 },\r
@@ -142,10 +146,11 @@ namespace TrafficClient {
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "MediaID",\r
                     HeaderText = metadata.Resource("TRAFFICID", Resources.TRAFFICID),\r
-                    Width = 100\r
+                    Width = 100,\r
+                    Frozen = true\r
                 },\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    HeaderText = "OK",\r
                     DataPropertyName = "OK",\r
                     ReadOnly = true\r
                 },\r
@@ -173,6 +178,7 @@ namespace TrafficClient {
         DataGridViewColumn[] GetPromoColumns(TrafficMetadata metadata) {\r
             return new DataGridViewColumn[] {\r
                 new DataGridViewCheckBoxColumn() {\r
+                    Width = CHECKWIDTH,\r
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
                     DataPropertyName = "Selected",\r
                     Frozen = true\r
@@ -181,10 +187,11 @@ namespace TrafficClient {
                     AutoSizeMode = DataGridViewAutoSizeColumnMode.None,\r
                     DataPropertyName = "MediaID",\r
                     HeaderText = metadata.Resource("TRAFFICID", Resources.TRAFFICID),\r
-                    Width = 100\r
+                    Width = 100,\r
+                    Frozen = true\r
                 },\r
                 new DataGridViewCheckBoxColumn() {\r
-                    AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,\r
+                    HeaderText = "OK",\r
                     DataPropertyName = "OK",\r
                     ReadOnly = true\r
                 },\r
index 57e2b4ef94896c0ee0e5bf08096c24b4a5cd9f04..3bba28b3cb3c3a231cd60dc16c6247e08ce10a06 100644 (file)
@@ -29,7 +29,7 @@ namespace TrafficClient.Workers {
             return new TrafficItemMetadata() {\r
                 EpisodeID = data.t_MediaID,\r
                 EpisodeTitle = data.v_Title,\r
-                ProgID = data.t_SpotID.ToString(),\r
+                ProgID = data.t_MediaID,\r
                 ProgTitle = data.v_Title\r
             };\r
         }\r
index e7646f1c28a06a993d0b7a3f5b259d707314b9e5..614437870d19dd05888a0130f405b73bb859bd0d 100644 (file)
@@ -9,6 +9,8 @@ namespace TrafficClient.Workers {
     public class MultiSegmentMaterialWorker : SingleSegmentMaterialWorker {\r
         private static Logger logger = LogManager.GetCurrentClassLogger();\r
 \r
+        protected override bool MultiSegmentEnabled { get => true; }\r
+\r
         public MultiSegmentMaterialWorker(SqlConnection connection, PlanAirDataReader cliFSPReader, string functionName, IMessageBus messageBus)\r
             : base(connection, cliFSPReader, functionName, messageBus) {\r
         }\r
index 95953902d0027343d65582533c622880d144b850..b1175abaaebd408c180eb6982e456b49ac93571d 100644 (file)
@@ -12,6 +12,7 @@ namespace TrafficClient.Workers {
     public class SingleSegmentMaterialWorker : TrafficWorker {\r
 \r
         private static Logger logger = LogManager.GetCurrentClassLogger();\r
+        protected virtual bool MultiSegmentEnabled { get => false; }\r
 \r
         public SingleSegmentMaterialWorker(SqlConnection connection, PlanAirDataReader cliFSPReader, string functionName, IMessageBus messageBus)\r
             : base(connection, cliFSPReader, functionName, messageBus) {\r
@@ -37,7 +38,8 @@ namespace TrafficClient.Workers {
                     TCIn = new Timecode((int)data.v_SegTcIn),\r
                     TCOut = new Timecode((int)data.v_SegTcOut),\r
                     Comment = data.v_SegTitle,\r
-                    Optional = true.Equals(data.v_SegDropable)\r
+                    Optional = true.Equals(data.v_SegDropable),\r
+                    MediaID = data.v_SegMediaID\r
                 };\r
             }\r
             return result;\r
@@ -168,23 +170,27 @@ namespace TrafficClient.Workers {
             get => 1100;\r
         }\r
 \r
-        public void SetMaterialOK(int itemID, bool ok, bool ifCompleted = false) {\r
+        public void SetMaterialOK(int itemID, bool ok, TrafficItem trafficItem = null, bool ifCompleted = false) {\r
             try {\r
                 if (ifCompleted) {\r
                     logger.Info("Checking if material {0} can be approved", itemID);\r
-                    List<TrafficItem> items = GetMaterials(itemID.ToString(), false, null, null);\r
+                    List<TrafficItem> items = GetMaterials(trafficItem.MediaID, false, null, null);\r
+\r
                     if (items == null || items.Count == 0) {\r
                         logger.Info("Material {0} not exists", itemID);\r
                         return;\r
                     }\r
+\r
                     var allCount = items[0].SegmentCount;\r
                     if (allCount == 0) {\r
                         logger.Info("Material {0} has no segments", itemID);\r
+                        return;\r
                     }\r
 \r
                     List<MovieSegment> segments = GetMaterialSegments(itemID);\r
                     if (allCount != segments.Count) {\r
                         logger.Info("Material {0} needs more segments", itemID);\r
+                        return;\r
                     }\r
 \r
                     if (segments == null || segments.Count == 0) {\r
@@ -218,6 +224,9 @@ namespace TrafficClient.Workers {
 \r
         private MovieSegment ToSegment(PlanAirMaterialSegmentResult item) {\r
             return new MovieSegment() {\r
+                SegNr = (int)item.v_SegNumber,\r
+                SegID = item.v_SegID,\r
+                MediaID = item.v_MediaID,\r
                 TCIn = item.v_TcIn.HasValue ? new Timecode(item.v_TcIn.Value) : new Timecode(),\r
                 TCOut = item.v_TcOut.HasValue ? new Timecode(item.v_TcOut.Value) : new Timecode(),\r
                 Comment = item.v_SegTitle,\r
@@ -293,6 +302,7 @@ namespace TrafficClient.Workers {
         }\r
 \r
         public string AddMaterialSegment(int itemID, MovieSegment segment, string fileName = null, int segNr = 0) {\r
+            string result = null;\r
             try {\r
                 TryConnect();\r
                 using (SqlCommand cmd = CreateCommmad()) {\r
@@ -311,14 +321,24 @@ namespace TrafficClient.Workers {
                     if (fileName != null)\r
                         cmd.Parameters.AddWithValue("@@StrParam3", fileName);\r
                     cmd.Parameters.AddWithValue("@@@Options", optionalParam);\r
-                    cmd.ExecuteNonQuery();\r
+\r
+                    if (MultiSegmentEnabled) {\r
+                        var reader = cmd.ExecuteReader();\r
+                        if (reader.Read()) {\r
+                            int i = reader.GetOrdinal("v_MediaID");\r
+                            if (!reader.IsDBNull(i))\r
+                                result = reader.GetString(i);\r
+                        }\r
+                    } else\r
+                        cmd.ExecuteNonQuery();\r
+                    //reader.DumpColumns();\r
                 }\r
             } catch (Exception e) {\r
                 OnError(logger, e);\r
             } finally {\r
                 connection.Close();\r
             }\r
-            return null;\r
+            return result;\r
         }\r
 \r
     }\r
index e96e6acdad1037a214e945fc87b4b650c364ad96..ef26b1eff573f08eb04571c5c77e403e3811ab08 100644 (file)
@@ -29,7 +29,7 @@ namespace TrafficClient.Workers {
         protected void OnError(Logger logger, Exception e) {\r
             logger.Error(e);\r
             if (messageBus != null)\r
-                messageBus.Send(new TrafficAPIMessage("Sikertelen kapcsolódás a TRAFFIC rendszerhez."));\r
+                messageBus.Send(new TrafficAPIMessage("Hiba a PlanAir kommunikációban. Rendszerüzenet: " + e.Message, e));\r
         }\r
 \r
         protected SqlCommand CreateCommmad() {\r
index a2211e53b095f314da03169af301f92f69377794..8109e7b0eefef30f895e72688bd00f27c8e8a235 100644 (file)
@@ -1,5 +1,6 @@
 # MediaCube Maestro DxPlay\r
-> *Verzió: 1.0 - 2018.09.03*\r
+> *Dokumentum verzió: 1.1 - 2018.12.14*\r
+> *Szoftver verzió: 2.0.8.7*\r
 \r
 A DxPlay alkalmazás lehetővé teszi a nagyfelbontású MXF fájlok lejátszását, és a megnyitott anyaghoz PlanAir szegmens adatok hozzárendelését.\r
 \r
@@ -17,7 +18,11 @@ A fájl megnyitása után a média első képkockája válik láthatóvá a fel
 \r
 ## Metadat kiválasztása\r
 \r
-Ha a megnyitott fájl neve egy létező azonosító, akkor a kereső automatikusan listázza és a listában kijelöli azt. Ismert azonosító esetén a felső keresősávba beírva azt és Enter-t nyomva listázhatók ki a találatok. Ha nincs azonosító beírva a keresősávba, akkor egy adásnap listázására van lehetőség, kiválasztva a típust (műsor, reklám, promó) továbbá a dátum választóban a napot. Ha azokra a bejegyzésekre vagyunk kiváncsiak, amikhez még nem társult a rendszerben verzió, szegmens, illetve nincsenek elfogadva, akkor a "problémásak" pipát is be kell jelölni. A lista automatikusan frissül a szűrők módosításának hatására, vagy a frissítés gombra kattintva. Az azonosító kiválasztáskor a rendszer automatikusan betölti a szegmens szerkesztőbe a már korábban létrehozott szegmensek adatait.\r
+Alapértelmezett esetben a rendszer működése azt feltételezi, hogy egy műsor minden szegmense ugyan abban a fájlban találató meg. Ha a megnyitott fájl neve egy létező azonosító, akkor a kereső automatikusan listázza és a listában kijelöli azt. Ismert azonosító esetén a felső keresősávba beírva azt és Enter-t nyomva listázhatók ki a találatok. Ha nincs azonosító beírva a keresősávba, akkor egy adásnap listázására van lehetőség, kiválasztva a típust (műsor, reklám, promó) továbbá a dátum választóban a napot. Ha azokra a bejegyzésekre vagyunk kiváncsiak, amikhez még nem társult a rendszerben verzió, szegmens, illetve nincsenek elfogadva, akkor a "problémásak" pipát is be kell jelölni. A lista automatikusan frissül a szűrők módosításának hatására, vagy a frissítés gombra kattintva. Az azonosító kiválasztáskor a rendszer automatikusan betölti a szegmens szerkesztőbe a már korábban létrehozott szegmensek adatait, és ez a kiválasztott azonosító lesz majd a fájl neve. Az epizód kiválasztását a sorok elején látható pipára kattintva lehet elvégezni, de egyszerre csak egy bejegyzést lehet kiválasztani, erről a felület gondoskodik.\r
+\r
+### Multiszegmens opció\r
+\r
+A megfelelő beállítással át lehet kapcsolni a működést úgy, hogy a listában ne műsor/epizód bontás jelenjen meg, hanem műsor/epizód/szegmens bontás. Tehát ha a műsorhoz az adásszerkesztő előre létrehoz szegmenseket, akkor a listázóban annyi bejegyzés jelenik meg, ahány szegmens van. Ebben az esetben az ugyan ahhoz az epizódhoz tartozó szegmensek közül akármennyi kiválasztható, a felület ezt engedi. A fájlnévképzés is más, mert annak végére egy verzionáló szám kerül. Ha egy forráshoz a szegmensek egy részét hozzárendeljük, akkor azokat ugyan abban a fájlban adjuk meg. A szegmensek egy másik csoportját egy másik forráshoz hozzárendelve, az eredmény fájl nevének a vége megváltozik. Ha több szegmenst hozunk létre, mint amennyit a listában kiválasztottunk, akkor a plusz szegmensek a mentés után automatikusan létrejönnek az adásszerkesztő rendszerben. Ha kevesebb szegmenst hozunk létre, akkor a kiválasztott szegmensek listájában hátulról haladva törli a program a felesleges szegmenseket.       \r
 \r
 ## Szegmensek szerkesztése\r
 A jobb oldali fülek közül a "Segments" nevűre kattintva jelenik meg a szegmens szerkesztő.\r
@@ -25,17 +30,23 @@ A jobb oldali fülek közül a "Segments" nevűre kattintva jelenik meg a szegme
 ![Dxplay define segments](dxplay-define.png)\r
  \r
 A szerkesztő tetején elérhető funkciók rendre az alábbiak:\r
-* Szegmens létrehozása: A teljes fájlra definiál egy szegmenst, kezdete a file kezdő timecode-ja, a vége pedig a kezdéshez hozzáadott hossz.\r
+* Szegmens létrehozása: Az elérhető szabad területen definiál egy szegmenst. Ha a szegmenslista még üres, akkor az új  szegmens  kezdete a file kezdő timecode-ja, a vége pedig a kezdéshez hozzáadott hossz. Ha már van elem a listában, akkor a létrejövő szegmens kezdő timecode-ja az utolsó szegmens vége után egy képkockával kezdődik.\r
 * Aktuális pozíció belépőként: A kijelölt szegmens belépőjét átállítja az aktuális lejátszópozícióra.\r
 * Szegmens szétvágása: A kijelölt szegmensből kettőt készít, az első szegmens vége és a második szegmens eleje az aktuális lejátszópozíció lesz. \r
 * Aktuális pozíció kilépőként: A kijelölt szegmens kilépőjét átállítja az aktuális lejátszópozícióra.\r
-* Szegmens törlése: A kijelölt szegmenst eltávolítja a listából.\r
+* Szegmens törlése: A kijelölt szegmenst eltávolítja a listából, ha azt az aktuális szegmentálási foéyamatban adjuk hozzá a listához.\r
+\r
+A multiszegmens opciót használva a listán végrehajtható tevékenységek mindíg az adott fájra érvényesek. Más nevű fájlokhoz rendelt szegmensek nem szerkeszthetőek, ezek módosítását az újraszegmentálás funkcióval lehet elérni.\r
+A szerkesztés véglegesítése a "Kész" (Approve) gombra kattintva történik meg, a fájl célmappába mozgatása után.\r
 \r
-A szerkesztés véglegesítése a "Mentés" gombra kattintva történik meg, a fájl célmappába mozgatása után.\r
+## Újraszegmentálás\r
+\r
+Ha már egy korábban feldolgozott műsort szeretnénk fájlmozgatás nélkül újraszegmentálni, akkor ezt a menüből lehet megtenni. Kiválasztva a funkciót megjelenik egy fájl tallózó ablak. A kívánt fájl megnyitása után, a "Kész" (Approve) gomb szövege megváltozik "Újraszegmentálás"-ra (Redefine). Az újraszegmentálás az adott fájlhoz tartozó szegmensek módosítását (belépő, kilépő) és törlését teszik csak lehetővé. A szegmentálást elvégezve a gombra kattintva, a fájl mozgatása nem történik meg, de a szegmensadatok mentésre kerülnek.\r
  \r
 ## Gyorsító billenytűk\r
 Ctrl+O : Fájl megnyitása.  \r
 Ctrl+S : A változtatások elfogadása, tehát a fájl mozgatása a célmappába és a szegmens adatok mentése a PlanAir rendszerbe.  \r
+Ctrl+R : Szegmensek újradefiniálása.  \r
 Space : Fájl lejátszása, lejátszás szüneteltetése. Ha a metaadat tallózó az aktív, akkor ott az aktuális metaadat azonosítójának kijelölése, vagy annak eltávolítása. Ha nincs verziója a kiválasztott bejegyzésnek, akkor létrehoz egyet.  \r
 Shift+Space : Ha a metaadat tallózó az aktív, új verzió létrehozását végzi el a kijelölt anyagon. A lista automatikusan frissül utána.  \r
 Esc: Teljes képernyős módban, kilép ablak módba. A teljes képrnyős módba lépéshez a képen duplán kell kattintani a bal egérgombbal. Ablak módban kilép az alkalmazás.  \r
@@ -60,6 +71,7 @@ A program __Configuration__ mappájában található meg a program beállítása
   "metadata": {\r
     "$type": "TrafficMetadata",\r
     "uiFileName": "dxplay.en",\r
+       "version": 0,   \r
     "server": {\r
       "address": "Data Source=10.10.10.1;Initial Catalog=DBNAME;Persist Security Info=True;",\r
       "userName": "username",\r
@@ -92,6 +104,11 @@ A tallózó típusa.
 A tallózó felületének honosított címkéit tartalmazó JSON állomány neve.\r
 > **dxplay.en**\r
 \r
+### metadata.version\r
+A metadat listázási módját és a szegmentálás módját határozza meg. 0 érték esetén az alpértelmezett műsor/epizód listázás az aktív, egy epizód összes szegmensét egy fájlhoz rendelhetjük csak hozzá.\r
+1 érték esetén a műsor/epizód/szegmens listázás lesz aktív, és tetszőleges számú szegmens rendelhető tetszőleges számú fájlhoz.  \r
+> **0**\r
+\r
 ### metadata.server\r
 A szolgáltatás elérhetősége a távoli szerveren.\r
 \r
index b004926bea9f9a6fed2b35a1ab0ed707b6d7f5cc..60593dc90510dad5c338af841d50f81381337d3c 100644 (file)
@@ -19,7 +19,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=true&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=true&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns181026&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders181026&#13;&#10;-Djobengine.octopus.stories.name=stories181026&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
 <stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
diff --git a/server/-dependencies/libs/solr-solrj-7.5.0.jar b/server/-dependencies/libs/solr-solrj-7.5.0.jar
new file mode 100644 (file)
index 0000000..33c194c
Binary files /dev/null and b/server/-dependencies/libs/solr-solrj-7.5.0.jar differ
index ceb004d3bdc63c93b4656c04e59c0181725378e2..724ea60faa5aea5cfe1d5cea6177bd09836746a3 100644 (file)
                                                        <packaging>jar</packaging>\r
                                                </configuration>\r
                                        </execution>\r
+<!--                                   <execution> -->\r
+<!--                                           <id>install6</id> -->\r
+<!--                                           <phase>package</phase> -->\r
+<!--                                           <goals> -->\r
+<!--                                                   <goal>install-file</goal> -->\r
+<!--                                           </goals> -->\r
+<!--                                           <configuration> -->\r
+<!--                                                   <file>libs/solr-solrj-7.5.0.jar</file> -->\r
+<!--                                                   <groupId>org.apache.solr</groupId> -->\r
+<!--                                                   <artifactId>solr-sorlj</artifactId> -->\r
+<!--                                                   <version>7.5.0</version> -->\r
+<!--                                                   <packaging>jar</packaging> -->\r
+<!--                                           </configuration> -->\r
+<!--                                   </execution> -->\r
                                </executions>\r
                        </plugin>\r
                        <plugin>\r
                                                <configuration>\r
                                                        <artifacts>\r
 <!--                                                           <artifact> -->\r
-<!--                                                                   <id>org.apache.solr:solr-solrj:7.5.0</id> -->\r
+<!--                                                                   <id>org.apache.solr:solr-sorlj:7.5.0</id> -->\r
 <!--                                                           </artifact> -->\r
                                                                <artifact>\r
                                                                        <id>humble.video:linux:0.2.1</id>\r
                                                                <artifact>\r
                                                                        <id>com.ibm:db2jcc4:4.19.26</id>\r
                                                                </artifact>\r
-<!--                                                           <artifact> -->\r
-<!--                                                                   <id>io.swagger:swagger-jersey2-jaxrs:${swagger-core-version}</id> -->\r
-<!--                                                           </artifact> -->\r
                                                                <artifact>\r
                                                                        <id>org.slf4j:slf4j-simple:1.6.3</id>\r
                                                                </artifact>\r
index cbb7f2c46567ff9fc1a9c94c8e86343706972790..2fa649d6fc2dc29a53c9d747753ad722a78b9358 100644 (file)
@@ -5,4 +5,5 @@ Bundle-SymbolicName: hu.user.mediacube.executors.tests
 Bundle-Version: 1.0.0.qualifier
 Fragment-Host: user.jobengine.executors;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.junit
+Import-Package: org.apache.commons.io.filefilter;version="2.2.0",
+ org.junit
diff --git a/server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/RescueNEXIOMaterials.java b/server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/RescueNEXIOMaterials.java
new file mode 100644 (file)
index 0000000..50ff875
--- /dev/null
@@ -0,0 +1,328 @@
+package hu.user.mediacube.executors.tests;\r
+\r
+import java.io.OutputStream;\r
+import java.net.InetAddress;\r
+import java.net.URI;\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.net.ftp.FTP;\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.commons.net.ftp.FTPReply;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBObject;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.StoreUri;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.commons.octopus.IOctopusAPI;\r
+import user.commons.octopus.OctopusAPI;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.steps.EscortFiles;\r
+import user.jobengine.server.steps.FileArchive;\r
+import user.jobengine.server.steps.RundownArchive;\r
+import user.jobengine.server.steps.StoryArchive;\r
+\r
+public class RescueNEXIOMaterials {\r
+       private static final String SCHEDULED_FORMAT = "yyyy.MM.dd HH:mm";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String UTF_8 = "utf-8";\r
+       private static final String JSON_EXT = ".json";\r
+       private static final String XML_EXT = ".xml";\r
+       private static final String DURATION = "duration";\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final String NEXIOCLIPS = "nexioclips";\r
+       private static final String LONGNAMEID = "longnameid";\r
+       private static final String ID = "id";\r
+       private static final String MEDIATYPE = "Hír bejátszó";\r
+       private OctopusAPI octopusAPI;\r
+\r
+       private DB db;\r
+       private FTPClient sourceFtp;\r
+       private FTPClient targetFtp;\r
+       private StoreUri sourceUri;\r
+       private StoreUri targetUri;\r
+       private int nexioKillDateDays;\r
+       private String nexioAgency;\r
+       private Marker systemMarker;\r
+       private List<String> transferredFileNames = null;\r
+       private boolean demo = false;\r
+\r
+       public void copy(RundownArchive rundownArchive) throws Exception {\r
+               for (StoryArchive storyArchive : rundownArchive.getStoryArchives()) {\r
+                       for (FileArchive fileArchive : storyArchive.getFileArchives()) {\r
+                               try {\r
+                                       copyFile(fileArchive, rundownArchive, storyArchive);\r
+                               } catch (Exception e) {\r
+                                       logger.error(systemMarker, "A '{}' clip archiválása sikertelen. A rendszer üzenete: {}", fileArchive.getFileName(), e.getMessage());\r
+                                       throw e;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void copyFile(FileArchive fileArchive, RundownArchive rundownArchive, StoryArchive storyArchive) throws Exception {\r
+               String origFileName = fileArchive.getFileName();\r
+               String fileName = String.format("%s-%s", origFileName, rundownArchive.getItemHouseId());\r
+               String videoFileName = fileName + MXFEXT;\r
+\r
+               if (transferredFileNames == null)\r
+                       transferredFileNames = new ArrayList<>();\r
+\r
+               //A mar letezo mozikat nem archivaljuk le ujra, csak a metaadatot\r
+               long existingMediaId = 0;\r
+               if (!transferredFileNames.contains(origFileName)) {\r
+                       transferredFileNames.add(origFileName);\r
+                       if (!demo)\r
+                               transferFile(origFileName + MXFEXT, videoFileName);\r
+                       logger.info(systemMarker, "A '{}' file archiválásra felkészítése sikeres volt.", origFileName);\r
+               }\r
+\r
+               if (!demo) {\r
+                       BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive, existingMediaId);\r
+                       transferMetadata(videoFileName, metadata);\r
+                       createSourceKillDateFile(rundownArchive, origFileName);\r
+               }\r
+       }\r
+\r
+       private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive, long existingMediaId) {\r
+               BasicDBObject result = new BasicDBObject();\r
+               result.put("itemHouseId", rundownArchive.getItemHouseId());\r
+               result.put("itemTitle", rundownArchive.getItemTitle());\r
+               result.put("itemDescription", rundownArchive.getItemDesc());\r
+               result.put("userName", "mediacube");\r
+               result.put("mediaHouseId", storyArchive.getMediaHouseId());\r
+               result.put("mediaTitle", storyArchive.getMediaTitle());\r
+               result.put("mediaDescription", storyArchive.getMediaDesc());\r
+               result.put("mediaType", MEDIATYPE);\r
+               result.put("duration", fileArchive.getDuration());\r
+               result.put("existingMediaId", existingMediaId);\r
+               return result;\r
+       }\r
+\r
+       private void createSourceKillDateFile(RundownArchive rundownArchive, String fileName) throws Exception {\r
+               logger.info("Create killdate/agency for {}", fileName);\r
+               OutputStream outStream = null;\r
+               try {\r
+                       sourceFtp = ((FtpDirectoryLister) sourceUri.getLister()).connect();\r
+                       Calendar killDate = CalendarUtils.createCalendar(rundownArchive.getScheduleDate());\r
+                       killDate.add(Calendar.DAY_OF_YEAR, nexioKillDateDays);\r
+                       byte[] killDateFile = EscortFiles.createNEXIOKillDateFile(fileName, killDate.getTime(), null, nexioAgency);\r
+                       outStream = sourceFtp.storeFileStream(fileName + XML_EXT);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + fileName + XML_EXT + " Reply:" + sourceFtp.getReplyString());\r
+                       }\r
+                       outStream.write(killDateFile);\r
+                       outStream.flush();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       sourceUri.cleanUp();\r
+               }\r
+       }\r
+\r
+       private FileArchive processMosObject(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject, String clipName, long duration) throws Exception {\r
+               String mosID = mosObject.getString(IOctopusAPI.OBJ_ID);\r
+               if (!mosID.equals(clipName))\r
+                       return null;\r
+               return new FileArchive(mosID, duration);\r
+       }\r
+\r
+       public RundownArchive processRundow(String clipName, long duration) throws Exception {\r
+               octopusAPI = new OctopusAPI();\r
+               List<DBObject> rds = octopusAPI.getRundownsByPlaceHolderID(clipName);\r
+               if (rds == null || rds.size() == 0)\r
+                       return null;\r
+               BasicDBObject rundown = (BasicDBObject) rds.get(0);\r
+               long rundownID = rundown.getLong(ID);\r
+               if (!demo)\r
+                       logger.info("Processing rundown {} {}", rundownID, rundown.getString(IOctopusAPI.NAME));\r
+               List<DBObject> stories = octopusAPI.getRundownFullStories(rundownID);\r
+               if (stories == null)\r
+                       return null;\r
+               RundownArchive result = new RundownArchive();\r
+\r
+               long id = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
+               if (id == 0)\r
+                       return null;\r
+               String name = NoSQLUtils.asString(NoSQLUtils.asDBObject(rundown, IOctopusAPI.RUNDOWN_TYPE), IOctopusAPI.NAME);\r
+               if (StringUtils.isBlank(name))\r
+                       return null;\r
+               String channel = NoSQLUtils.asString(NoSQLUtils.asDBObject(rundown, IOctopusAPI.CHANNEL), IOctopusAPI.NAME);\r
+               Date scheduledStart = rundown.getDate(IOctopusAPI.SCHEDULED_START);\r
+               if (scheduledStart == null)\r
+                       return null;\r
+               String start = CalendarUtils.toString(CalendarUtils.createCalendar(scheduledStart), SCHEDULED_FORMAT);\r
+               result.setScheduleDate(scheduledStart);\r
+               result.setItemHouseId(String.valueOf(id));\r
+               result.setItemTitle(String.format("%s %s %s", start, name, channel));\r
+\r
+               for (DBObject s : stories) {\r
+                       StoryArchive storyArchive = processStory(rundown, s, clipName, duration);\r
+                       if (storyArchive == null)\r
+                               continue;\r
+                       result.addStoryArchive(storyArchive);\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private StoryArchive processStory(BasicDBObject rundown, DBObject s, String clipName, long duration) throws Exception {\r
+               BasicDBObject story = (BasicDBObject) s;\r
+               String parentStoryID = story.getString(IOctopusAPI.PARENT_STORY_ID);\r
+               if (StringUtils.isBlank(parentStoryID)) {\r
+                       logger.warn("Story parentStoryID is null: {}", story.toPrettyString(null));\r
+                       return null;\r
+               } else\r
+                       logger.debug("Processing story {}", parentStoryID);\r
+               List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
+               if (mosObjects == null)\r
+                       return null;\r
+\r
+               StoryArchive storyArchive = null;\r
+               for (BasicDBObject mosObject : mosObjects) {\r
+                       FileArchive fileArchive = processMosObject(rundown, story, mosObject, clipName, duration);\r
+                       if (fileArchive == null)\r
+                               continue;\r
+                       if (storyArchive == null) {\r
+                               storyArchive = new StoryArchive();\r
+                               storyArchive.setMediaHouseId(parentStoryID);\r
+                               storyArchive.setMediaTitle(story.getString(IOctopusAPI.NAME));\r
+                               storyArchive.setMediaDesc(story.getString(IOctopusAPI.SCRIPT_CONTENT));\r
+\r
+                       }\r
+                       storyArchive.addFileArchive(fileArchive);\r
+               }\r
+               return storyArchive;\r
+\r
+       }\r
+\r
+       public void set(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+                       int nexioKillDateDays, String nexioAgency, IItemManager manager) throws Exception {\r
+               db = NoSQLUtils.getNoSQLDB();\r
+               if (db == null) {\r
+                       logger.error(systemMarker, "Az NoSQL adatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing NoSQL DB reference.");\r
+               }\r
+\r
+               if (manager == null) {\r
+                       logger.error(systemMarker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               String nexioHost = System.getProperty("nexio.host");\r
+               if (StringUtils.isBlank(nexioHost)) {\r
+                       logger.error(systemMarker, "A 'nexio.host' rendszer paraméter nem található.");\r
+                       throw new NullPointerException("System is not configured properly, 'jobengine.selenio.address' startup parameter missing.");\r
+               }\r
+               this.nexioKillDateDays = nexioKillDateDays;\r
+               this.nexioAgency = nexioAgency;\r
+\r
+               sourceUri = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+               sourceUri.setPortNumber(nexioPort);\r
+               sourceUri.setUserName(nexioUserName);\r
+               sourceUri.setPassword(nexioPassword);\r
+               if (sourceUri == null) {\r
+                       logger.error(systemMarker, "A forrás nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing 'sourceUri'.");\r
+               }\r
+\r
+               targetUri = manager.createStoreUri(new URI(archiveFtp));\r
+               targetUri.setUserName(archiveUserName);\r
+               targetUri.setPassword(archivePassword);\r
+               if (targetUri == null) {\r
+                       logger.error(systemMarker, "A cél nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing 'targetUri'.");\r
+               }\r
+\r
+       }\r
+\r
+       private void transferFile(String sourceFileName, String targetFileName) throws Exception {\r
+               int reply = 0;\r
+               logger.info("Transfer clip {}", sourceFileName);\r
+               try {\r
+                       sourceFtp = ((FtpDirectoryLister) sourceUri.getLister()).connect();\r
+                       targetFtp = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+                       if (!targetFtp.enterRemotePassiveMode())\r
+                               throw new Exception("!PASV");\r
+\r
+                       reply = sourceFtp.port(InetAddress.getByName(targetFtp.getPassiveHost()), targetFtp.getPassivePort());\r
+                       if (!FTPReply.isPositiveCompletion(reply))\r
+                               throw new Exception("PORT parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       if (!sourceFtp.setFileType(FTP.BINARY_FILE_TYPE))\r
+                               throw new Exception("!SOURCE TYPE");\r
+\r
+                       reply = sourceFtp.retr(sourceFileName);\r
+                       if (!FTPReply.isPositivePreliminary(reply))\r
+                               throw new Exception("RETR parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       if (!targetFtp.setFileType(FTP.BINARY_FILE_TYPE))\r
+                               throw new Exception("!TARGET TYPE");\r
+\r
+                       reply = targetFtp.stor(targetFileName);\r
+                       if (!FTPReply.isPositivePreliminary(reply))\r
+                               throw new Exception("STOR parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                       while (true) {\r
+                               reply = sourceFtp.stat();\r
+                               if (!FTPReply.isPositiveCompletion(reply))\r
+                                       throw new Exception("STAT parancs válasza: " + sourceFtp.getReplyString());\r
+\r
+                               logger.info("Status: {}", sourceFtp.getReplyString());\r
+                               if (reply == 226) {\r
+                                       break;\r
+                               }\r
+                               Thread.sleep(1000);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       sourceUri.cleanUp();\r
+                       targetUri.cleanUp();\r
+               }\r
+\r
+       }\r
+\r
+       private void transferMetadata(String fileName, BasicDBObject metadata) throws Exception {\r
+               logger.info("Transfer metadata {}", fileName);\r
+               OutputStream outStream = null;\r
+               try {\r
+                       targetFtp = ((FtpDirectoryLister) targetUri.getLister()).connect();\r
+                       if (!targetFtp.changeWorkingDirectory(EscortFiles.STATUSFOLDER)) {\r
+                               targetFtp.makeDirectory(EscortFiles.STATUSFOLDER);\r
+                               if (!targetFtp.changeWorkingDirectory(EscortFiles.STATUSFOLDER))\r
+                                       throw new Exception("!STATUSFOLDER");\r
+                       }\r
+\r
+                       outStream = targetFtp.storeFileStream(fileName + JSON_EXT);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + fileName + JSON_EXT + " Reply:" + targetFtp.getReplyString());\r
+                       }\r
+                       outStream.write(metadata.toString().getBytes(UTF_8));\r
+                       outStream.flush();\r
+                       //targetFtp.changeToParentDirectory();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       targetUri.cleanUp();\r
+               }\r
+       }\r
+\r
+}\r
index 7c7ca260a621057735a2385b51ac2ab8dca51746..9d66e9655196601e8c2bbd26b81fc3d9b5d60651 100644 (file)
@@ -4,9 +4,15 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;\r
 \r
 import java.io.File;\r
+import java.net.URI;\r
+import java.nio.file.DirectoryStream;\r
 import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
 import java.nio.file.attribute.BasicFileAttributes;\r
 import java.sql.Timestamp;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
 \r
 import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
 import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
@@ -15,13 +21,27 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;\r
 import org.junit.Test;\r
 \r
+import com.ibm.nosql.json.api.BasicDBList;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.DBCursor;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+\r
+import user.commons.ListUtils;\r
 import user.commons.logging.LogUtils;\r
+import user.commons.nosql.NoSQLUtils;\r
 import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.IResultSetConsumer;\r
 import user.jobengine.db.Item;\r
 import user.jobengine.db.ItemManager;\r
 import user.jobengine.db.Media;\r
 import user.jobengine.db.MediaFile;\r
+import user.jobengine.server.steps.ItemManagerExtensions;\r
+import user.jobengine.server.steps.MetadataTypeDetector;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
 import user.jobengine.server.steps.PlanAirExtensions;\r
+import user.jobengine.server.steps.RundownArchive;\r
 \r
 public class Support {\r
 \r
@@ -32,13 +52,17 @@ public class Support {
                //              System.setProperty("jobengine.octopus.rundowns.name", "test_rundowns");\r
                //              System.setProperty("jobengine.octopus.stories.name", "test_stories");\r
                //              System.setProperty("jobengine.octopus.storyfolders.name", "test_storyfolders");\r
-               System.setProperty("jobengine.octopus.rundowns.name", "rundowns180620");\r
-               System.setProperty("jobengine.octopus.stories.name", "stories180620");\r
-               System.setProperty("jobengine.octopus.storyfolders.name", "storyfolders180620");\r
+               //              System.setProperty("jobengine.octopus.rundowns.name", "rundowns180620");\r
+               //              System.setProperty("jobengine.octopus.stories.name", "stories180620");\r
+               //              System.setProperty("jobengine.octopus.storyfolders.name", "storyfolders180620");\r
+               System.setProperty("jobengine.octopus.rundowns.name", "rundowns181217");\r
+               System.setProperty("jobengine.octopus.stories.name", "stories181217");\r
+               System.setProperty("jobengine.octopus.storyfolders.name", "storyfolders181217");\r
 \r
                System.setProperty("jobengine.nosql.db.url", "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
                System.setProperty("jobengine.nosql.db.user", "db2admin");\r
                System.setProperty("jobengine.nosql.db.password", "password");\r
+               System.setProperty("nexio.host", "10.10.1.55");\r
                System.setProperty(ItemManager.DBURL, "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
                System.setProperty(ItemManager.DBUSERNAME, "db2admin");\r
                System.setProperty(ItemManager.DBPASSWORD, "password");\r
@@ -54,6 +78,122 @@ public class Support {
                manager.disconnect();\r
        }\r
 \r
+       @Test\r
+       public void check_rd_archives() throws Exception {\r
+               DirectoryStream<Path> stream = null;\r
+               URI sourcePath = new URI("file://10.10.1.100/BRAAVOS/ARCHIVE");\r
+               try {\r
+                       stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+                       List<File> allFiles = new ArrayList<>();\r
+                       for (Path p : stream) {\r
+                               check_rd_collect(p, allFiles);\r
+                       }\r
+                       stream.close();\r
+\r
+                       stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+                       for (Path p : stream) {\r
+                               check_rd_process(p, allFiles);\r
+                       }\r
+                       stream.close();\r
+               } catch (Exception e) {\r
+                       System.err.println(e.getMessage());\r
+               }\r
+\r
+       }\r
+\r
+       private void check_rd_collect(Path mediaFilePath, List<File> allFiles) {\r
+               File mediaFile = mediaFilePath.toFile();\r
+               if (mediaFile.isDirectory() || !mediaFile.getName().toUpperCase().endsWith(".MXF"))\r
+                       return;\r
+               allFiles.add(mediaFile);\r
+       }\r
+\r
+       private File check_rd_nonzero_fellow(String mediaid, List<File> allFiles) {\r
+               for (File mediaFile : allFiles) {\r
+                       String houseid = mediaFile.getName().substring(0, mediaFile.getName().lastIndexOf("-"));\r
+                       if (houseid.equals(mediaid) && mediaFile.length() > 0)\r
+                               return mediaFile;\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void check_rd_process(Path mediaFilePath, List<File> allFiles) {\r
+               File mediaFile = mediaFilePath.toFile();\r
+               if (mediaFile.isDirectory() || !mediaFile.getName().toUpperCase().endsWith(".MXF"))\r
+                       return;\r
+               Path status = Paths.get(mediaFilePath.getParent().toString(), ".STATUS", mediaFile.getName() + ".json");\r
+               if (!status.toFile().exists()) {\r
+                       System.out.println("Nincs JSON: " + mediaFile.getAbsolutePath());\r
+               }\r
+\r
+               if (mediaFile.length() == 0) {\r
+                       String houseid = mediaFile.getName().substring(0, mediaFile.getName().lastIndexOf("."));\r
+                       final String idToCheck = houseid.substring(0, houseid.lastIndexOf("-"));\r
+                       MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(idToCheck);\r
+                       if (metadataType == MetadataType.OctopusPlaceholder) {\r
+                               String query = String.format("select count(*) from mediafile where houseid like '%s%%'", idToCheck);\r
+                               IResultSetConsumer consumer = rs -> {\r
+                                       if (rs.getInt(1) == 0) {\r
+\r
+                                               File f = check_rd_nonzero_fellow(idToCheck, allFiles);\r
+                                               if (f == null)\r
+                                                       System.out.println("0 még sincs korábbi: " + mediaFile.getAbsolutePath());\r
+\r
+                                       }\r
+                                       return false;\r
+                               };\r
+                               manager.executeQuery(query, consumer, null);\r
+                       }\r
+\r
+               }\r
+\r
+       }\r
+\r
+       private void rescue_archive(RescueNEXIOMaterials processor, String clipName, long duration) throws Exception {\r
+               /*\r
+               int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+               int nexioKillDateDays, String nexioAgency, IItemManager manager\r
+               */\r
+\r
+               RundownArchive ra = processor.processRundow(clipName, duration);\r
+               if (ra != null) {\r
+                       System.out.println(ra.getItemTitle());\r
+                       //processor.copy(ra);\r
+               } else\r
+                       System.out.println("No rundown for " + clipName);\r
+\r
+       }\r
+\r
+       @Test\r
+       public void rescue_rd_clips() throws Exception {\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("nexioclips");\r
+               BasicDBList agencies = new BasicDBList();\r
+               agencies.add("ARCHIVED");\r
+               QueryBuilder queryBuilder = QueryBuilder.start("extagency").in(agencies);\r
+               DBCursor cursor = collection.find(queryBuilder.get());\r
+               int count = 0;\r
+               RescueNEXIOMaterials processor = new RescueNEXIOMaterials();\r
+               processor.set(2098, "administrator", "system", "ftp://10.10.1.100/ARCHIVE/TEST", "mediacube", "Broadca5T", 21, "ARCHIVED", manager);\r
+\r
+               List<BasicDBObject> clips = ListUtils.cast(cursor.toArray());\r
+               for (BasicDBObject clip : clips) {\r
+                       String name = clip.getString("longnameid");\r
+                       long duration = clip.getLong("duration");\r
+                       if (name.length() > 1) {\r
+\r
+                               long existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, name);\r
+                               if (existingMediaId == 0) {\r
+                                       rescue_archive(processor, name, duration);\r
+                                       System.out.println(name);\r
+                                       count++;\r
+                               }\r
+                       }\r
+\r
+               }\r
+               System.out.println(count);\r
+       }\r
+\r
        @Test\r
        public void test_PlanAirExtensions() throws Exception {\r
                String actual = PlanAirExtensions.getMorpeusXML(manager, "jdbc:sqlserver://10.10.1.45;databaseName=PA_Echo;", "MAM", "Echotv.hu", "M009729A", "ISILON");\r
@@ -64,10 +204,14 @@ public class Support {
        @Test\r
        public void test_Solr() throws Exception {\r
                //http://lucene.apache.org/solr/guide/7_5/using-solrj.html#using-solrj\r
+\r
+               final String solrUrl = "http://localhost:8983/solr";\r
+               //return new HttpSolrClient.Builder(solrUrl).withConnectionTimeout(10000).withSocketTimeout(60000).build();\r
+\r
                ResteasyClient client = new ResteasyClientBuilder().build();\r
-               ResteasyWebTarget webTarget = client.target("");\r
+               ResteasyWebTarget webTarget = client.target("httpp:");\r
 \r
-               String query = "SELECT * FROM MEDIADESCRIPTION FETCH FIRST ROW ONLY";\r
+               String query = "SELECT * FROM MEDIADESCRIPTION FETCH FIRST 10 ROWS ONLY";\r
                manager.executeQuery(query, rs -> {\r
                        rs.getLong("itemid");\r
                        rs.getLong("mediaid");\r
@@ -97,4 +241,5 @@ public class Support {
 \r
                System.out.println("itemid=" + i.getId() + " AND mediaid=" + m.getId() + " AND mediafileid=" + mf.getId());\r
        }\r
+\r
 }\r
index 79497481b5915598a7048341b51c4c087386d430..36b092f9b8eea843fc6b0782f9b53133380b43ef 100644 (file)
@@ -93,7 +93,7 @@ public class ArchiveListBuilderStep extends JobStep {
                try {\r
                        DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
                        for (Path p : stream) {\r
-                               boolean processed = processPathItem(p, archiveList);\r
+                               processPathItem(p, archiveList);\r
                        }\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep2.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep2.java
new file mode 100644 (file)
index 0000000..0f93d62
--- /dev/null
@@ -0,0 +1,200 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/**\r
+ * Az archivalhato mediak listazasa MediaFileWrapper objektumokban. A listazott media allomanyokat megjeloli .catched signal allomannyal, hogy a legkozelebbi\r
+ * listazas figyelmen kivul hagyja.\r
+ *\r
+ * @author robi\r
+ */\r
+public class ArchiveListBuilderStep2 extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       //      private static final String UTF8 = "utf-8";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String MXFEXT = ".mxf";\r
+       private static final String WAVEXT = ".wav";\r
+       private static final String JSONEXT = ".json";\r
+       private static final String CATCHEDEXT = ".catched";\r
+\r
+       public static final String ITEM_TITLE = "itemTitle";\r
+       public static final String ITEM_HOUSEID = "itemHouseId";\r
+       public static final String ITEM_DESCRIPTION = "itemDescription";\r
+       public static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       public static final String MEDIA_TITLE = "mediaTitle";\r
+       public static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       public static final String MEDIA_TYPE = "mediaType";\r
+       private static final String DURATION = "duration";\r
+       private static final String EXISTING_MEDIAID = "existingMediaId";\r
+\r
+       private Marker marker;\r
+\r
+       private ArchiveItem createArchiveItem(Path jsonFilePath, Path mediaFilePath, Path catchedFilePath) {\r
+               ArchiveItem result = null;\r
+               byte[] readAllBytes = null;\r
+               try {\r
+                       readAllBytes = Files.readAllBytes(jsonFilePath);\r
+                       BasicDBObject dbObject = (BasicDBObject) JSONUtil.jsonToDbObject(new String(readAllBytes));\r
+                       if (dbObject == null)\r
+                               throw new NullPointerException("Can not parse JSON file: " + jsonFilePath);\r
+                       result = new ArchiveItem();\r
+                       result.setItemHouseId(getMetadata(dbObject, ITEM_HOUSEID));\r
+                       result.setItemTitle(getMetadata(dbObject, ITEM_TITLE));\r
+                       result.setItemDescription(getMetadata(dbObject, ITEM_DESCRIPTION));\r
+                       result.setMediaHouseId(getMetadata(dbObject, MEDIA_HOUSEID));\r
+                       result.setMediaTitle(getMetadata(dbObject, MEDIA_TITLE));\r
+                       result.setMediaDescription(getMetadata(dbObject, MEDIA_DESCRIPTION));\r
+                       result.setMediaType(getMetadata(dbObject, MEDIA_TYPE));\r
+                       result.setMediaFile(mediaFilePath.toString());\r
+                       result.setCatchedFile(catchedFilePath.toString());\r
+                       result.setDuration(NoSQLUtils.asLong(dbObject, DURATION));\r
+                       result.setExistingMediaId(NoSQLUtils.asLong(dbObject, EXISTING_MEDIAID));\r
+               } catch (IOException e) {\r
+                       logger.catching(e);\r
+                       return null;\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private void createCatchedFile(Path catchedFilePath) {\r
+               try {\r
+                       Files.createFile(catchedFilePath);\r
+                       //Files.write(catchedFilePath, CATCHED.getBytes(UTF8), StandardOpenOption.CREATE);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               marker = jobRuntime.getMarker();\r
+               List<ArchiveItem> archiveList = new LinkedList<ArchiveItem>();\r
+               DirectoryStream<Path> directoryStream = null;\r
+               try {\r
+                       DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+                       for (Path p : stream) {\r
+                               processPathItem(p, archiveList);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", e.getMessage());\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (archiveList.size() > 0) {\r
+\r
+                       if (limit > 0) {\r
+                               List<ArchiveItem> limitedList = new ArrayList<>();\r
+                               int realItemCount = 0;\r
+                               for (ArchiveItem archiveItem : archiveList) {\r
+                                       File f = new File(archiveItem.getMediaFile());\r
+                                       if (f.length() > 0) {\r
+                                               realItemCount++;\r
+                                               limitedList.add(archiveItem);\r
+                                               if (realItemCount == limit)\r
+                                                       break;\r
+                                       } else\r
+                                               limitedList.add(archiveItem);\r
+                               }\r
+                               archiveList = limitedList;\r
+                               logger.info(marker, "A folyamat elérte a beállított {} limitet.", limit);\r
+                       } else\r
+                               logger.info(marker, "Az archiváló folyamat {} új anyagot érzékelt.", archiveList == null ? 0 : archiveList.size());\r
+\r
+                       for (ArchiveItem archiveItem : archiveList) {\r
+                               createCatchedFile(Paths.get(archiveItem.getCatchedFile()));\r
+                       }\r
+               } else\r
+                       logger.info(marker, "Nincs archiválandó anyag.");\r
+\r
+               return new Object[] { archiveList };\r
+       }\r
+\r
+       private String getMetadata(BasicDBObject dbObject, String fieldName) {\r
+               String result = null;\r
+               if (dbObject.containsKey(fieldName))\r
+                       result = dbObject.getString(fieldName);\r
+               return result;\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaFilePath, final List<ArchiveItem> archiveList) {\r
+               File mediaFile = mediaFilePath.toFile();\r
+\r
+               if (mediaFile.isDirectory() || !mediaFile.getName().toLowerCase().endsWith(MXFEXT.toLowerCase())\r
+                               || mediaFile.getName().toLowerCase().endsWith(WAVEXT.toLowerCase())) {\r
+                       return false;\r
+               }\r
+\r
+               Path dotStorePath = Paths.get(mediaFilePath.getParent().toString(), STATUSFOLDER);\r
+               Path catchedFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + CATCHEDEXT);\r
+               File catchedFile = catchedFilePath.toFile();\r
+               if (catchedFile.exists()) {\r
+                       logger.warn("{} file is already catched.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               Path jsonFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + JSONEXT);\r
+               File jsonFile = jsonFilePath.toFile();\r
+               if (!jsonFile.exists()) {\r
+                       logger.warn("{} has no json metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               ArchiveItem archiveItem = createArchiveItem(jsonFilePath, mediaFilePath, catchedFilePath);\r
+\r
+               if (archiveItem == null) {\r
+                       logger.warn("{} has no metadata specified.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemHouseId())) {\r
+                       logger.warn("{} has no Item HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemTitle())) {\r
+                       logger.warn("{} has no Item Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaHouseId())) {\r
+                       logger.warn("{} has no Media HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaTitle())) {\r
+                       logger.warn("{} has no Media Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               archiveList.add(archiveItem);\r
+               return true;\r
+       }\r
+}\r
index 4dbef3810a87bc74c77aff845a1a3abd31ff6edd..c754867fab32e551d148938bfedd469b55eefeb0 100644 (file)
@@ -34,6 +34,7 @@ public class CleanupMountedLocationStep extends JobStep implements FileVisitor<P
        private static final String DOT = ".";\r
        private static final String STATUSFOLDER = ".STATUS";\r
        private static final String EWC2EXT = ".ewc2";\r
+       private static final String XMPEXT = ".xmp";\r
        private static final String CATCHEDEXT = ".catched";\r
        private static final String KILLDATEEXT = ".killdate";\r
        private static final String JSONEXT = ".json";\r
@@ -239,6 +240,7 @@ public class CleanupMountedLocationStep extends JobStep implements FileVisitor<P
                        return false;\r
 \r
                removeFile(Paths.get(filePath.toString() + EWC2EXT));\r
+               removeFile(Paths.get(filePath.toString() + XMPEXT));\r
                removeFile(Paths.get(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString()) + CATCHEDEXT));\r
                removeFile(Paths.get(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString()) + JSONEXT));\r
 \r
index a3e73b6a284a80abf516d78d0427b9e23771100a..d39c6ca1f7a154312b34d3985384d9bed2115e9c 100644 (file)
@@ -60,6 +60,7 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
        private String nexioAgency;\r
        private Marker systemMarker;\r
        private List<String> transferredFileNames = null;\r
+       private boolean demo = false;\r
 \r
        private int check(int value, String name) {\r
                if (value == 0) {\r
@@ -84,6 +85,7 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
                                        copyFile(fileArchive, rundownArchive, storyArchive);\r
                                } catch (Exception e) {\r
                                        logger.error(systemMarker, "A '{}' clip archiválása sikertelen. A rendszer üzenete: {}", fileArchive.getFileName(), e.getMessage());\r
+                                       throw e;\r
                                }\r
                        }\r
                }\r
@@ -102,21 +104,28 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
                if (transferredFileNames.contains(origFileName)) {\r
                        logger.info(systemMarker, "A '{}' file archiválásra felkészítése egy másik story kapcsán már megtörtént, ezért csak metaadat archiválás szükséges.",\r
                                        origFileName);\r
-                       transferChunk(videoFileName);\r
+                       if (!demo)\r
+                               transferChunk(videoFileName);\r
                } else {\r
                        existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, origFileName);\r
                        if (existingMediaId == 0) {\r
                                transferredFileNames.add(origFileName);\r
-                               transferFile(origFileName + MXFEXT, videoFileName);\r
+                               if (!demo)\r
+                                       transferFile(origFileName + MXFEXT, videoFileName);\r
+                               logger.info(systemMarker, "A '{}' file archiválásra felkészítése sikeres volt.", origFileName);\r
                        } else {\r
+\r
                                logger.info(systemMarker, "A '{}' file archiválása már megtörtént, ezért csak metaadat archiválás szükséges.", origFileName);\r
-                               transferChunk(videoFileName);\r
+                               if (!demo)\r
+                                       transferChunk(videoFileName);\r
                        }\r
                }\r
 \r
-               BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive, existingMediaId);\r
-               transferMetadata(videoFileName, metadata);\r
-               createSourceKillDateFile(rundownArchive, origFileName);\r
+               if (!demo) {\r
+                       BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive, existingMediaId);\r
+                       transferMetadata(videoFileName, metadata);\r
+                       createSourceKillDateFile(rundownArchive, origFileName);\r
+               }\r
        }\r
 \r
        private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive, long existingMediaId) {\r
@@ -229,7 +238,8 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
        private RundownArchive processRundow(DBObject r) throws Exception {\r
                BasicDBObject rundown = (BasicDBObject) r;\r
                long rundownID = rundown.getLong(ID);\r
-               logger.info("Processing rundown {} {}", rundownID, rundown.getString(IOctopusAPI.NAME));\r
+               if (!demo)\r
+                       logger.info("Processing rundown {} {}", rundownID, rundown.getString(IOctopusAPI.NAME));\r
                List<DBObject> stories = octopusAPI.getRundownFullStories(rundownID);\r
                if (stories == null)\r
                        return null;\r
@@ -274,23 +284,27 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
                        String rundownName = NoSQLUtils.asString(rundown, IOctopusAPI.NAME);\r
                        try {\r
                                BasicDBObject currentRundownID = new BasicDBObject(IOctopusAPI.ID, rundownID);\r
-                               if (archivedRundowns != null && archivedRundowns.contains(currentRundownID)) {\r
+                               if (!demo && archivedRundowns != null && archivedRundowns.contains(currentRundownID)) {\r
                                        logger.info("Skipping archived rundown {} {}", rundownID, rundownName);\r
                                        continue;\r
                                }\r
 \r
                                RundownArchive rundownArchive = processRundow(r);\r
                                if (rundownArchive == null || rundownArchive.isEmpty()) {\r
-                                       logger.info("Skipping rundown {} {}", rundownID, rundownName);\r
+                                       if (!demo)\r
+                                               logger.info("Skipping rundown {} {}", rundownID, rundownName);\r
                                        continue;\r
                                }\r
 \r
-                               logger.info("Saving rundown {} {}", rundownID, rundownName);\r
+                               if (!demo)\r
+                                       logger.info("Saving rundown {} {}", rundownID, rundownName);\r
                                copy(rundownArchive);\r
-                               logger.info(systemMarker, "A '{}' tükör {}db bejátszójának archiválása sikeres volt", rundownArchive.getItemTitle(),\r
-                                               rundownArchive.getStoryArchives().size());\r
+                               if (!demo)\r
+                                       logger.info(systemMarker, "A '{}' tükör {}db bejátszójának archiválása sikeres volt", rundownArchive.getItemTitle(),\r
+                                                       rundownArchive.getStoryArchives().size());\r
 \r
-                               db.getCollection(ARCHIVEDRUNDOWNS).save(currentRundownID);\r
+                               if (!demo)\r
+                                       db.getCollection(ARCHIVEDRUNDOWNS).save(currentRundownID);\r
                        } catch (Exception e) {\r
                                logger.catching(e);\r
                                logger.error(systemMarker,\r
index dbda83b3589e057c6c959d1bd3755a6514eeb791..81f199c03615dedd8d7dcafaded2979c6dda990f 100644 (file)
@@ -29,27 +29,28 @@ public class ItemManagerExtensions {
 \r
        public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
                final long[] result = { 0 };\r
-               int indexOf = houseid.lastIndexOf("-");\r
-               if (indexOf > 0) {\r
-                       final String idToCheck = houseid.substring(0, houseid.lastIndexOf("-"));\r
-                       MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(idToCheck);\r
-                       if (metadataType == MetadataType.OctopusPlaceholder) {\r
-                               StringBuilder query = new StringBuilder();\r
-                               query.append("select mediaid, mediafilehouseid, filename");\r
-                               query.append(" ");\r
-                               query.append(String.format("from vw_rundown_items where mediafilehouseid like '%s%%'", idToCheck));\r
-                               query.append(" ");\r
-                               query.append("order by filename, mediaid");\r
-                               IResultSetConsumer consumer = rs -> {\r
-                                       String fileName = rs.getString("filename");\r
-                                       if (idToCheck.equals(fileName)) {\r
-                                               result[0] = rs.getLong("mediaid");\r
-                                               return false;\r
-                                       } else\r
-                                               return true;\r
-                               };\r
-                               manager.executeQuery(query.toString(), consumer, null);\r
-                       }\r
+               final String[] idToCheck = { houseid };\r
+               int pos = houseid.lastIndexOf("-");\r
+               //a hivas a CopyForArchiveNEXIOMaterialsStep-bol is johet, ott meg nincs idobelyegezve a nev!\r
+               if (pos > 0 && houseid.length() - pos > 4)\r
+                       idToCheck[0] = houseid.substring(0, pos);\r
+               MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(idToCheck[0]);\r
+               if (metadataType == MetadataType.OctopusPlaceholder) {\r
+                       StringBuilder query = new StringBuilder();\r
+                       query.append("select mediaid, mediafilehouseid, filename");\r
+                       query.append(" ");\r
+                       query.append(String.format("from vw_rundown_items where mediafilehouseid like '%s%%'", idToCheck[0]));\r
+                       query.append(" ");\r
+                       query.append("order by filename, mediaid");\r
+                       IResultSetConsumer consumer = rs -> {\r
+                               String fileName = rs.getString("filename");\r
+                               if (idToCheck[0].equals(fileName)) {\r
+                                       result[0] = rs.getLong("mediaid");\r
+                                       return false;\r
+                               } else\r
+                                       return true;\r
+                       };\r
+                       manager.executeQuery(query.toString(), consumer, null);\r
                }\r
 \r
                return result[0];\r
index d9b583118fb8c104b1c169274447f2f6c6d4955d..d5408eb5dfa599989b6fd4adad1725384e18992f 100644 (file)
@@ -592,5 +592,4 @@ public class Support {
                String idToCheck = houseid.substring(0, houseid.lastIndexOf("-"));\r
                System.out.println(idToCheck);\r
        }\r
-\r
 }\r