git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31369
"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
{\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
"userName": "MAM",\r
"password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
"timeout": 10000\r
- }\r
+ },\r
+ "version": 0,\r
+ "redefineSegments": true\r
}\r
}\r
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
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
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
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
// 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
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
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
}\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
\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
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
\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
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
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
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
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
}\r
}\r
\r
+\r
+ public bool IsRedefineSegments { get; set; }\r
+\r
private bool isMenuVisible;\r
public bool IsMenuVisible {\r
get {\r
\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
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
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
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
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
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
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
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
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
// 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
// \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
// \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
// \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
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
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
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
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
}\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
\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
logger.Error(e);\r
}\r
}\r
+ model.IsRedefineSegments = false;\r
\r
\r
//for (int i = 0; i < 100; i++) {\r
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
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
\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
\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
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo\r
- CAAAAk1TRnQBSQFMAgEBAgEAAaABAQGgAQEBGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
+ CAAAAk1TRnQBSQFMAgEBAgEAASABAgEgAQIBGAEAARgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
AwABYAMAARgDAAEBAQABCAYAAQkYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\r
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\r
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\r
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
\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
}\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
// 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
[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
}\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
}\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 + <).\r
/// </summary>\r
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
<data name="STEPFORWARD" xml:space="preserve">\r
<value>Előre léptetés (>)</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
{\r
"title": "Development",\r
- "active": false,\r
+ "active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"filter": "avi",\r
"$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
{\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
"$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
using Interfaces;\r
using Maestro.Metadata;\r
+using Maestro.Sources;\r
using MaestroShared.Commons;\r
using MaestroShared.Configuration;\r
using MaestroShared.Metadata;\r
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
}\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
set {\r
archiveMetadata = value;\r
btnEditMetadata.ToolTipText = archiveMetadata == null ? "Metaadat" : archiveMetadata.ToString();\r
+ UpdateEditArchiveMetadataStatus();\r
}\r
}\r
\r
textSelectedMetadata.ReadOnly = !Configuration.EnableCustomMetadataId;\r
UpdateDefineSegmentEnabled();\r
UpdateEditArchiveMetadataEnabled();\r
+\r
}\r
\r
private void InitializeTrafficSelector() {\r
ArchiveMetadata = saved;\r
SelectedMetadata.MetadataText = ArchiveMetadata.itemTitle;\r
}\r
- UpdateEditArchiveMetadataStatus();\r
}\r
\r
private void OnDefineSegments(object sender, EventArgs e) {\r
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
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
} 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
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
return result;\r
}\r
\r
-\r
private ArchiveMetadata GetArchiveMetadata() {\r
ArchiveMetadata result = null;\r
Cursor.Current = Cursors.WaitCursor;\r
}\r
}\r
\r
- movieSegments = null;\r
+ MovieSegments = null;\r
ArchiveMetadata = null;\r
\r
UpdateProcessorButtonsEnabled();\r
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
}\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
}\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
\r
private void UpdateEditArchiveMetadataEnabled() {\r
btnEditMetadata.Enabled = SelectedSource != null;\r
- UpdateEditArchiveMetadataStatus();\r
}\r
\r
private void UpdateDefineSegmentEnabled() {\r
SelectedSource.FileInfo != null &&\r
SelectedMetadata != null &&\r
validTypes.ToList().Contains(SelectedMetadata.Kind);\r
- UpdateDefineSegmentsStatus();\r
}\r
\r
private void UpdateLookupByMetadataEnabled() {\r
selectedSourceItems.Clear();\r
}\r
textSelectedSource.Text = selectedSource?.Name;\r
- movieSegments = null;\r
+ MovieSegments = null;\r
UpdateProcessorButtonsEnabled();\r
UpdateDefineSegmentEnabled();\r
UpdateEditArchiveMetadataEnabled();\r
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
\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
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
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
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
// 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
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
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
\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
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
-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
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
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
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
}\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
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
// 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
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
}\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
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
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
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
\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
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
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
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
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
// 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
// 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
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
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
}\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
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
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
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
}\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
// 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
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
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
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
using Interfaces;\r
+using LinkDotNet.MessageHandling.Contracts;\r
using MaestroShared.Commons;\r
using MaestroShared.Configuration;\r
using MaestroShared.MessageBus;\r
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
}\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
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
trafficAPIBindingSource.DataSource = null;\r
else\r
trafficAPIBindingSource.DataSource = items;\r
+ SelectResult();\r
+ dgTraffic.ResumeLayout();\r
Cursor.Current = Cursors.Default;\r
}\r
\r
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
}\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
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
}\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
rbMaterial.Checked = true;\r
refreshDisabled = false;\r
RefreshResults();\r
- SelectResult();\r
}\r
\r
public void LookupByPromoID(string id) {\r
rbPromo.Checked = true;\r
refreshDisabled = false;\r
RefreshResults();\r
- SelectResult();\r
}\r
\r
public void LookupByADID(string id) {\r
rbAD.Checked = true;\r
refreshDisabled = false;\r
RefreshResults();\r
- SelectResult();\r
}\r
\r
private void OnRefresh(object sender, EventArgs e) {\r
}\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
\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
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
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
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
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
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
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
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
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
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
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
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
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
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
\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
}\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
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
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
# 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
\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
\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
"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
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
<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 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -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 -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Dnexio.host=10.10.1.55 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=true -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns -Djobengine.octopus.storyfolders.name=storyfolders -Djobengine.octopus.stories.name=stories -Dmediacube.auth.location="${workspace_loc}/-configuration/mediacube-auth.properties""/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -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 -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Dnexio.host=10.10.1.55 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=true -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns181026 -Djobengine.octopus.storyfolders.name=storyfolders181026 -Djobengine.octopus.stories.name=stories181026 -Dmediacube.auth.location="${workspace_loc}/-configuration/mediacube-auth.properties""/>\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
<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
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
--- /dev/null
+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
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
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
// 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
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
@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
\r
System.out.println("itemid=" + i.getId() + " AND mediaid=" + m.getId() + " AND mediafileid=" + mf.getId());\r
}\r
+\r
}\r
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
--- /dev/null
+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
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
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
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
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
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
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
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
\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
String idToCheck = houseid.substring(0, houseid.lastIndexOf("-"));\r
System.out.println(idToCheck);\r
}\r
-\r
}\r