{\r
"title": "Szerkesztő",\r
- "active": true,\r
+ "active": false,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"player": {\r
],\r
"targets": [\r
{\r
- "label": "Hír nyersanyag betöltés",\r
+ "label": "Stúdióba küldés",\r
"processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%-%SOURCENAME%",\r
+ "outputFormat": "%ID%",\r
"tag": "Betöltés",\r
- "subFolderFormat": "%IDROOT%",\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": 7,\r
- "saveArchiveMetadata": false,\r
+ "disableFileVersioning": true,\r
+ "agency": "MAESTRO-EDITOR",\r
+ "reference": [ "Octopus mappába küldés" ],\r
"remote": {\r
- "address": "ftp://10.10.1.100/OCTOPUS",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\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": "Magazin nyersanyag betöltés",\r
+ "label": "Octopus mappába küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
"killDateDays": 7,\r
"saveArchiveMetadata": false,\r
"remote": {\r
- "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\r
"userName": "mediacube",\r
"password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
}\r
},\r
{\r
- "label": "Stúdióba küldés",\r
+ "label": "Traffic mappába küldés",\r
"processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\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
+ "subFolderFormat": "%IDROOT%",\r
"killDateDays": 7,\r
- "disableFileVersioning": true,\r
- "agency": "MAESTRO-EDITOR",\r
- "reference": "Hír nyersanyag betöltés",\r
+ "saveArchiveMetadata": false,\r
"remote": {\r
- "address": "ftp://10.10.1.55:2098",\r
- "userName": "administrator",\r
- "password": "+QtkeQdCTiOvZOgK/kUND4pO4/D+//r7ZIyluwMMdiqMEgO8iJErAG10ooWhPfiljQeXrdeyMzo7gWEZtcWpNSomGeDIbdMyQwtpqmMo1VEM3A27ZfzigY09YD46ECRh",\r
+ "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
}\r
},\r
"$type": "UNCSource",\r
"filter": "avi,wav,mxf",\r
"local": {\r
- "address": "file://c:/x"\r
+ "address": "file://10.10.1.100/BRAAVOS/READY",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ },\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/READY",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
}\r
},\r
"metadatas": [\r
}\r
],\r
"targets": [\r
+ {\r
+ "label": "Octopus mappába küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
+ "tag": "Betöltés",\r
+ "subFolderFormat": "%IDROOT%",\r
+ "killDateDays": 7,\r
+ "saveArchiveMetadata": false,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Traffic mappába küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
+ "tag": "Betöltés",\r
+ "subFolderFormat": "%IDROOT%",\r
+ "killDateDays": 7,\r
+ "saveArchiveMetadata": false,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
{\r
"label": "Stúdióba küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%",\r
"tag": "Betöltés",\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": 7,\r
"disableFileVersioning": true,\r
- "agency": "HÍRADÓ TEST",\r
+ "agency": "MAESTRO-EDITOR",\r
+ "reference": [ "Octopus mappába küldés" ],\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": "Lebonyba küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%",\r
+ "tag": "Betöltés",\r
+ "killDateDays": 7,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
+ },\r
+ {\r
+ "label": "Archiválás",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%",\r
+ "tag": "Archiválás",\r
+ "saveArchiveMetadata": true,\r
+ "remote": {\r
+ "address": "ftp://10.10.1.100/ARCHIVE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+ "timeout": 1000\r
+ }\r
}\r
]\r
}\r
{\r
"title": "NLE",\r
- "active": false,\r
+ "active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"player": {\r
"source": {\r
"$type": "UNCSource",\r
"filter": "avi,wav,mxf",\r
+ "foldersAutoExpand": true,\r
"local": {\r
"address": "file://c:/x"\r
}\r
],\r
"targets": [\r
{\r
- "label": "Hír nyersanyag betöltés",\r
+ "label": "Stúdióba küldés",\r
+ "processor": "FTPTargetProcessor",\r
+ "outputFormat": "%ID%",\r
+ "tag": "Betöltés",\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": 7,\r
+ "disableFileVersioning": true,\r
+ "agency": "MAESTRO-NLE",\r
+ "reference": [ "Octopus mappába küldés", "Megtekintőbe küldés" ],\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": "Octopus mappába küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
}\r
},\r
{\r
- "label": "Magazin nyersanyag betöltés",\r
+ "label": "Megtekintőbe küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
"killDateDays": 7,\r
"saveArchiveMetadata": false,\r
"remote": {\r
- "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "address": "ftp://10.10.1.100/OCTOPUS",\r
"userName": "mediacube",\r
"password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
}\r
},\r
{\r
- "label": "Stúdióba küldés",\r
+ "label": "Traffic mappába küldés",\r
"processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%",\r
+ "outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
- "nexioServer": true,\r
+ "subFolderFormat": "%IDROOT%",\r
"killDateDays": 7,\r
- "agency": "MAESTRO-NLE",\r
- "reference": "Hír nyersanyag betöltés",\r
+ "saveArchiveMetadata": false,\r
"remote": {\r
- "address": "ftp://10.10.1.56:2098",\r
- "userName": "administrator",\r
- "password": "+QtkeQdCTiOvZOgK/kUND4pO4/D+//r7ZIyluwMMdiqMEgO8iJErAG10ooWhPfiljQeXrdeyMzo7gWEZtcWpNSomGeDIbdMyQwtpqmMo1VEM3A27ZfzigY09YD46ECRh",\r
+ "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+ "userName": "mediacube",\r
+ "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
}\r
},\r
{\r
"title": "Lebony betöltő",\r
- "active": false,\r
+ "active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"player": {\r
"outputFormat": "%ID%",\r
"saveSegments": true,\r
"tag": "Adáskész",\r
- "reference": "Archiválás",\r
+ "reference": [ "Archiválás" ],\r
"remote": {\r
"address": "ftp://10.10.1.100/PLAYOUT/IceGateway",\r
"userName": "mediacube",\r
{\r
"title": "Stúdió",\r
- "active": false,\r
+ "active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"filter": "avi",\r
],\r
"targets": [\r
{\r
- "label": "Hír nyersanyag betöltés",\r
+ "label": "Octopus mappába küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
}\r
},\r
{\r
- "label": "Magazin nyersanyag betöltés",\r
+ "label": "Traffic mappába küldés",\r
"processor": "FTPTargetProcessor",\r
"outputFormat": "%ID%-%SOURCENAME%",\r
"tag": "Betöltés",\r
</ProjectReference>\r
</ItemGroup>\r
<ItemGroup>\r
- <None Include="Resources\installforge-installer-project.ifp" />\r
+ <None Include="Installer\installforge-installer-project.ifp" />\r
<None Include="Resources\mediacube_logo_small.ico" />\r
<None Include="maestro.ico" />\r
<None Include="Resources\ic_clear_black_24dp_1x.png" />\r
this.treeFolders.BorderStyle = System.Windows.Forms.BorderStyle.None;\r
this.treeFolders.Dock = System.Windows.Forms.DockStyle.Bottom;\r
this.treeFolders.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+ this.treeFolders.HotTracking = true;\r
this.treeFolders.ImageIndex = 0;\r
this.treeFolders.ImageList = this.ilFolders;\r
this.treeFolders.Location = new System.Drawing.Point(10, 206);\r
this.treeFolders.Size = new System.Drawing.Size(330, 161);\r
this.treeFolders.TabIndex = 18;\r
this.treeFolders.Visible = false;\r
+ this.treeFolders.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnBeforeExpandFolder);\r
+ this.treeFolders.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnAfterSelectFolder);\r
// \r
// ilFolders\r
// \r
// btnShowFolders\r
// \r
this.btnShowFolders.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\r
+ this.btnShowFolders.Enabled = false;\r
this.btnShowFolders.Image = global::Maestro.Properties.Resources.ic_folder_open_black_24dp_1x;\r
this.btnShowFolders.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
this.btnShowFolders.ImageTransparentColor = System.Drawing.Color.GreenYellow;\r
using DxPlay;\r
using Maestro.Metadata;\r
using Maestro.Sources;\r
-using MaestroShared.Commons;\r
using MaestroShared.Configuration;\r
using MaestroShared.Metadata;\r
using MaestroShared.Resources;\r
using System.Drawing;\r
using System.IO;\r
using System.Linq;\r
+using System.Text;\r
using System.Windows.Forms;\r
\r
namespace Maestro {\r
public partial class MaestroForm {\r
private ISource source;\r
private SourceInfo selectedSource;\r
- private List<DataGridViewRow> selectedSourceRows = new List<DataGridViewRow>();\r
+ private List<ISourceItem> selectedSourceItems = new List<ISourceItem>();\r
\r
public SourceInfo SelectedSource {\r
get {\r
set {\r
selectedSource = value;\r
if (selectedSource == null)\r
- selectedSourceRows.Clear();\r
+ selectedSourceItems.Clear();\r
textSelectedSource.Text = selectedSource?.Name;\r
archiveMetadata = null;\r
segments = null;\r
Uri localAddress = Configuration?.Source?.Local?.Address;\r
Uri remoteAddress = Configuration?.Source?.Remote?.Address;\r
if (String.IsNullOrEmpty(remoteAddress?.ToString())) {\r
- if (!String.IsNullOrEmpty(localAddress?.ToString()))\r
- formTooltip.SetToolTip(groupSource, localAddress?.ToString());\r
+ if (!String.IsNullOrEmpty(localAddress?.LocalPath))\r
+ formTooltip.SetToolTip(groupSource, localAddress.LocalPath);\r
} else\r
formTooltip.SetToolTip(groupSource, remoteAddress?.ToString());\r
\r
foreach (var folder in folders) {\r
TreeNode folderNode = rootNode.Nodes.Add(GetLastSegment(folder));\r
folderNode.Nodes.Add("..");\r
- folderNode.ImageIndex = 0;\r
- \r
}\r
+ if ((Configuration.Source as UNCSource).FoldersAutoExpand)\r
+ treeFolders.ExpandAll();\r
}\r
\r
private void HideFolders() {\r
treeFolders.Nodes.Clear();\r
}\r
\r
+ private string GetPath(TreeNode node) {\r
+ TreeNode treeNode = node;\r
+ StringBuilder sb = new StringBuilder();\r
+ sb.Append(treeNode.Text);\r
+ while (treeNode.Level != 1) {\r
+ treeNode = treeNode.Parent;\r
+ sb.Insert(0, "/");\r
+ sb.Insert(0, treeNode.Text);\r
+ }\r
+ return sb.ToString();\r
+ }\r
+\r
+ private void OnBeforeExpandFolder(object sender, TreeViewCancelEventArgs e) {\r
+ if (e.Node.Nodes.Count != 1 || !"..".Equals(e.Node.Nodes[0].Text))\r
+ return;\r
+ e.Node.Nodes.Clear();\r
+ Uri address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
+ string[] folders = Directory.GetDirectories(address.LocalPath);\r
+ foreach (var folder in folders) {\r
+ TreeNode folderNode = e.Node.Nodes.Add(GetLastSegment(folder));\r
+ folderNode.Nodes.Add("..");\r
+ }\r
+ }\r
+\r
+ private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) {\r
+ if (e.Action != TreeViewAction.ByMouse)\r
+ return;\r
+ txtSourceFilter.Text = null;\r
+ FileSystemSource source = bindingSource.DataSource as FileSystemSource;\r
+ Uri address = null;\r
+ if (e.Node.Level == 0)\r
+ address = Configuration.Source.Local.Address;\r
+ else\r
+ address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
+ if (!String.IsNullOrEmpty(address.LocalPath))\r
+ formTooltip.SetToolTip(groupSource, address.LocalPath);\r
+ source.Reset(address.LocalPath);\r
+ btnShowFolders.Checked = false;\r
+ HideFolders();\r
+ }\r
+\r
private void OnShowFolders(object sender, EventArgs e) {\r
if (btnShowFolders.CheckState == CheckState.Checked) {\r
HideFolders();\r
if (selectedrows == null)\r
return;\r
if (e.ColumnIndex == 0) {\r
-\r
UpdateCheckStates(selectedrows);\r
return;\r
}\r
}\r
\r
private void UpdateCheckStates(DataGridViewSelectedRowCollection selectedRows) {\r
- IEnumerable<DataGridViewRow> currentSelectedRows = selectedRows.Cast<DataGridViewRow>();\r
- if (currentSelectedRows == null)\r
+ IEnumerable<ISourceItem> currentSelectedItems = selectedRows.Cast<DataGridViewRow>().Select(r => r.DataBoundItem as ISourceItem);\r
+ if (currentSelectedItems == null)\r
return;\r
- int checkedCount = currentSelectedRows.Count(r => AsISourceItem(r).IsChecked);\r
- foreach (DataGridViewRow row in selectedRows) {\r
- ISourceItem item = AsISourceItem(row);\r
+ int checkedCount = currentSelectedItems.Count(r => r.IsChecked);\r
+ foreach (ISourceItem item in currentSelectedItems) {\r
if (selectedRows.Count == 1)\r
item.IsChecked = !item.IsChecked;\r
else\r
item.IsChecked = checkedCount == selectedRows.Count ? false : true;\r
\r
if (item.IsChecked) {\r
- if (!selectedSourceRows.Contains(row)) {\r
- selectedSourceRows.Add(row);\r
- Debug.WriteLine("Added " + AsISourceItem(row).Name);\r
+ if (!selectedSourceItems.Contains(item)) {\r
+ selectedSourceItems.Add(item);\r
+ Debug.WriteLine("Added " + item.Name);\r
}\r
} else {\r
- if (selectedSourceRows.Contains(row)) {\r
- selectedSourceRows.Remove(row);\r
- Debug.WriteLine("Removed " + AsISourceItem(row).Name);\r
+ if (selectedSourceItems.Contains(item)) {\r
+ selectedSourceItems.Remove(item);\r
+ Debug.WriteLine("Removed " + item.Name);\r
}\r
}\r
}\r
SetSelectedSource();\r
}\r
\r
+ //private void UpdateCheckStates_(DataGridViewSelectedRowCollection selectedRows) {\r
+ // IEnumerable<DataGridViewRow> currentSelectedRows = selectedRows.Cast<DataGridViewRow>();\r
+ // if (currentSelectedRows == null)\r
+ // return;\r
+ // int checkedCount = currentSelectedRows.Count(r => AsISourceItem(r).IsChecked);\r
+ // foreach (DataGridViewRow row in selectedRows) {\r
+ // ISourceItem item = AsISourceItem(row);\r
+ // if (selectedRows.Count == 1)\r
+ // item.IsChecked = !item.IsChecked;\r
+ // else\r
+ // item.IsChecked = checkedCount == selectedRows.Count ? false : true;\r
+\r
+ // if (item.IsChecked) {\r
+ // if (!selectedSourceRows.Contains(row)) {\r
+ // selectedSourceRows.Add(row);\r
+ // Debug.WriteLine("Added " + AsISourceItem(row).Name);\r
+ // }\r
+ // } else {\r
+ // if (selectedSourceRows.Contains(row)) {\r
+ // selectedSourceRows.Remove(row);\r
+ // Debug.WriteLine("Removed " + AsISourceItem(row).Name);\r
+ // }\r
+ // }\r
+ // }\r
+ // SetSelectedSource();\r
+ //}\r
+\r
private void SetSelectedSource() {\r
string selectionPrefix = null;\r
string selectedNames = String.Empty;\r
- foreach (DataGridViewRow actual in selectedSourceRows) {\r
- string name = (actual.DataBoundItem as ISourceItem)?.Name;\r
+ foreach (ISourceItem actual in selectedSourceItems) {\r
+ string name = actual.Name;\r
if (String.IsNullOrEmpty(name))\r
continue;\r
selectedNames += name + " ";\r
private FileInfo GetSelectedSourceFileInfo() {\r
if (Configuration.Source.GetType() == typeof(NEXIOSource))\r
return null;\r
- if (selectedSourceRows.Count != 1)\r
+ if (selectedSourceItems.Count != 1)\r
return null;\r
- string name = (selectedSourceRows[0].DataBoundItem as ISourceItem).Name;\r
+ string name = selectedSourceItems[0].Name;\r
Uri inputUri = new Uri(String.Format("{0}/{1}", Configuration.Source.Local.Address.LocalPath, name));\r
return new FileInfo(inputUri.LocalPath);\r
}\r
using System;\r
using System.Linq;\r
using System.Windows.Forms;\r
-using Maestro.Metadata;\r
using System.Collections.Generic;\r
using TrafficClient;\r
using MaestroShared.Configuration;\r
using MaestroShared.Metadata;\r
using MaestroShared.Targets;\r
using MaestroShared.Target;\r
-using System.Reflection;\r
+using System.Diagnostics;\r
\r
namespace Maestro {\r
\r
private void OnChecked(CheckBox checkBox, Target target) {\r
if (checkBox.Checked) {\r
List<ITargetProcessor> processors = CreateProcessors(target, checkBox);\r
+ foreach (ITargetProcessor processor in processors) {\r
+ if (processor.Parameters.TargetConfig.Reference != null) {\r
+ foreach (String reference in processor.Parameters.TargetConfig.Reference) {\r
+ var key = currentProcessors.Keys.Where(c => c.Text.Equals(reference)).SingleOrDefault();\r
+ var referencedProcessor = currentProcessors[key]?.Where(p => p.Input.Equals(processor.Input)).SingleOrDefault();\r
+ if (referencedProcessor != null)\r
+ processor.AddReference(referencedProcessor);\r
+ }\r
+ }\r
+ }\r
+\r
if (processors != null && processors.Count > 0) {\r
if (currentProcessors.ContainsKey(checkBox))\r
currentProcessors[checkBox].AddRange(processors);\r
\r
private List<ITargetProcessor> CreateProcessors(Target target, CheckBox checkBox) {\r
List<ITargetProcessor> result = null;\r
- foreach (DataGridViewRow actualRow in selectedSourceRows) {\r
- ISourceItem sourceItem = actualRow.DataBoundItem as ISourceItem;\r
+ foreach (ISourceItem sourceItem in selectedSourceItems) {\r
+ //ISourceItem sourceItem = actualRow.DataBoundItem as ISourceItem;\r
if (sourceItem == null)\r
continue;\r
if (!EnsureSegments(target)) {\r
if (result == null)\r
result = new List<ITargetProcessor>();\r
result.Add(processor);\r
+\r
+ //var beforeProcessors = new Dictionary<CheckBox, List<ITargetProcessor>>(currentProcessors);\r
HandleCheckBoxReferences(target.Reference, true);\r
+ //var diff = beforeProcessors.Except(currentProcessors).Concat(currentProcessors.Except(beforeProcessors));\r
}\r
return result;\r
}\r
};\r
}\r
\r
- private void HandleCheckBoxReferences(string reference, bool check) {\r
- if (String.IsNullOrEmpty(reference))\r
- return;\r
+ private List<CheckBox> HandleCheckBoxReferences(string[] reference, bool check) {\r
+ if (reference == null || reference.Length == 0)\r
+ return null;\r
var controlls = panelActions.Controls;\r
+ List<CheckBox> result = null;\r
foreach (Control actual in controlls) {\r
- if (actual is CheckBox actualCheckbox && actualCheckbox.Text.Equals(reference)) {\r
- if (check)\r
+ if (actual is CheckBox actualCheckbox && reference.Contains(actualCheckbox.Text)) {\r
+ if (check) {\r
actualCheckbox.Checked = check;\r
+ if (result == null)\r
+ result = new List<CheckBox>();\r
+ result.Add(actualCheckbox);\r
+ }\r
actualCheckbox.Enabled = !check;\r
}\r
}\r
+ return result;\r
}\r
\r
private ISourceItem GetSourceItemFromBindingSource(string actual) {\r
}\r
\r
private void OnExecuteClick(object sender, EventArgs e) {\r
- foreach (var element in currentProcessors) {\r
- foreach (ITargetProcessor processor in element.Value) {\r
- jobs.Add(processor);\r
- jobsQueue.Enqueue(processor);\r
- }\r
+ IEnumerable<CheckBox> keys = currentProcessors.Keys.OrderByDescending(k => (k.Tag as Target).NexioServer);\r
+ if (keys == null)\r
+ return;\r
+\r
+ foreach (var key in keys) {\r
+ List<ITargetProcessor> targetProcessors = currentProcessors[key];\r
+ if (targetProcessors == null)\r
+ continue;\r
+ targetProcessors.ForEach(p => {\r
+ jobs.Add(p);\r
+ jobsQueue.Enqueue(p);\r
+ });\r
}\r
\r
ClearSelectedProcessors();\r
break;\r
}\r
}\r
+\r
}\r
}\r
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACc\r
- BwAAAk1TRnQBSQFMAwEBAAEYAQABGAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA\r
+ BwAAAk1TRnQBSQFMAwEBAAFAAQABQAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA\r
AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA\r
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA\r
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm\r
using System.Runtime.InteropServices;\r
using System.Security.AccessControl;\r
using System.Security.Principal;\r
-using System.Text.RegularExpressions;\r
using System.Threading;\r
using System.Threading.Tasks;\r
using System.Windows.Forms;\r
[STAThread]\r
static void Main() {\r
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();\r
- string mutexId = string.Format("Global\\{{{0}}}", appGuid);\r
+ string userName = WindowsIdentity.GetCurrent().Name;\r
+ string mutexId = string.Format("Global\\{0}-{1}", appGuid, userName.Replace('\\', '-'));\r
bool createdNew;\r
var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);\r
var securitySettings = new MutexSecurity();\r
ContextMenu = new ContextMenu(menuItems.ToArray()),\r
Visible = true\r
};\r
- //trayIcon.Click += TrayIcon_Click;\r
+ trayIcon.Click += OnTrayIconClick;\r
}\r
\r
- private void TrayIcon_Click(object sender, EventArgs e) {\r
- MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);\r
- try {\r
- mi.Invoke(sender as NotifyIcon, null);\r
- }\r
- catch (Exception ex) { }\r
+ private void OnTrayIconClick(object sender, EventArgs e) {\r
+ ShowAllForms();\r
}\r
\r
+ //private void TrayIcon_Click(object sender, EventArgs e) {\r
+ // MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);\r
+ // try {\r
+ // mi.Invoke(sender as NotifyIcon, null);\r
+ // }\r
+ // catch (Exception ex) { }\r
+ //}\r
+\r
private void ShowAllForms() {\r
foreach (MeastroFormNotifyIcon form in forms) {\r
form.ShowForm();\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.2.1")]\r
-[assembly: AssemblyFileVersion("2.0.2.1")]\r
+[assembly: AssemblyVersion("2.0.3.1")]\r
+[assembly: AssemblyFileVersion("2.0.3.1")]\r
}\r
\r
public void RemoveFilter() {\r
+ Reset(null);\r
+ }\r
+\r
+ public void Reset(string path) {\r
+ if (path != null)\r
+ this.path = path;\r
Clear();\r
cache = null;\r
Shutdown();\r
InitializeComponent();\r
Version version = Assembly.GetEntryAssembly().GetName().Version;\r
labelVersion.ForeColor = Color.White;\r
- labelVersion.Text = String.Format("v{0}.{1}.{2}", version.Major, version.Minor, version.Build);\r
+ labelVersion.Text = String.Format("v{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);\r
}\r
\r
private void splashTimer_Tick(object sender, EventArgs e) {\r
public bool SendEmailOnSuccess { get; set; }\r
public string SuccessEmailRecipient { get; set; }\r
public string SuccessEmailPattern { get; set; }\r
- public string Reference { get; set; }\r
+ public string[] Reference { get; set; }\r
public bool NexioServer { get; set; }\r
public string NexioFileExistsMessage { get; set; }\r
public string Agency { get; set; }\r
}\r
\r
public class UNCSource : Source {\r
+ public bool FoldersAutoExpand { get; set; }\r
}\r
\r
public class NEXIOSource : Source {\r
\r
namespace MaestroShared.Targets {\r
public interface ITargetProcessor : INotifyPropertyChanged {\r
+ void AddReference(ITargetProcessor reference);\r
TargetProcessorParameter Parameters { get; }\r
DateTime Started { get; set; }\r
DateTime Finished { get; set; }\r
using MaestroShared.Commons;\r
using MaestroShared.Target;\r
using System;\r
+using System.Collections.Generic;\r
using System.ComponentModel;\r
+using System.Diagnostics;\r
using System.Runtime.CompilerServices;\r
using System.Windows.Forms;\r
\r
private string label;\r
private string killDatePath;\r
protected Control parent;\r
+ private List<ITargetProcessor> references;\r
+\r
public event PropertyChangedEventHandler PropertyChanged;\r
\r
public virtual void Initialize(Control parent, TargetProcessorParameter parameters) {\r
protected virtual void ExecuteCompleted() {\r
}\r
\r
+ public void AddReference(ITargetProcessor reference) {\r
+ if (references == null)\r
+ references = new List<ITargetProcessor>();\r
+ if (!references.Contains(reference)) {\r
+ Debug.WriteLine(String.Format("Adding {0} [{1}] to {2} [{3}]", reference.Parameters.TargetConfig.Label, reference.Input, Parameters.TargetConfig.Label, Input));\r
+ references.Add(reference);\r
+ }\r
+ }\r
+\r
+ private void RevokeReferences() {\r
+ references?.ForEach(i => i.Status = REVOKED);\r
+ }\r
+\r
public TargetProcessorParameter Parameters { get; internal set; }\r
\r
public string Status {\r
if (status != value) {\r
status = value;\r
NotifyPropertyChanged();\r
+ if (Status == REVOKED || Status == ERROR)\r
+ RevokeReferences();\r
}\r
}\r
}\r
<argument>"synchronize remote"</argument>\r
<argument>"mkdir log"</argument>\r
<argument>"call chmod +x mediacube"</argument>\r
- <argument>"call pcs resource enable mediacube_script"</argument>\r
+<!-- <argument>"call pcs resource enable mediacube_script"</argument> -->\r
<!-- <argument>"call chmod +x stop-mediacube.sh"</argument> -->\r
<!-- <argument>"call chmod +x start-mediacube.sh"</argument> -->\r
<!-- <argument>"call ./start-mediacube.sh"</argument> -->\r
"name" : "OCTOPUS adatok szinkronizálása",\r
"template": "sync-octopus.xml",\r
"executeimmediate": true,\r
- "cronexpression": "0 0/1 * * * ?",\r
+ "cronexpression": "0/20 * * * * ?",\r
"parameters": [\r
{"name": "forceFull", "value": false, "type": "java.lang.Boolean"}\r
]\r
"name" : "OCTOPUS adatok teljes szinkronizálása",\r
"template": "sync-octopus.xml",\r
"executeimmediate": false,\r
- "cronexpression": "#0 0/1 * * * ?",\r
+ "cronexpression": "#0/20 * * * * ?",\r
"parameters": [\r
{"name": "forceFull", "value": true, "type": "java.lang.Boolean"}\r
]\r
import user.commons.nosql.NoSQLUtils;\r
\r
public class OctopusAPI implements IOctopusAPI {\r
- private static final String RUNDOWN = "rundown";\r
private static final Logger logger = LogManager.getLogger();\r
private static final String ID = "id";\r
private static final String STORY_FOLDER = "story_folder";\r
private static final String MOS_OBJECTS = "mosObjects";\r
+ private static final String RUNDOWN = "rundown";\r
public static final String RUNDOWN_COLLECTION_NAME = "rundowns";\r
public static final String STORY_COLLECTION_NAME = "stories";\r
public static final String STORY_FOLDER_COLLECTION_NAME = "story_folders";\r
private static final String STARTING = "Starting";\r
private static final String STORYID = "storyId";\r
\r
- public static final String RUNDOWN_COLLECTION_NAME = "rundowns";\r
- public static final String STORY_COLLECTION_NAME = "stories";\r
- public static final String STORY_FOLDER_COLLECTION_NAME = "story_folders";\r
- public static final String TIME_COLLECTION_NAME = "time";\r
- public static final String LASTUPDATE_TIME = "lastUpdateTime";\r
+ public static String RUNDOWN_COLLECTION_NAME = "rundowns";\r
+ public static String STORY_COLLECTION_NAME = "stories";\r
+ public static String STORY_FOLDER_COLLECTION_NAME = "story_folders";\r
+ public static String TIME_COLLECTION_NAME = "time";\r
+ public static String LASTUPDATE_TIME = "lastUpdateTime";\r
\r
private DB db;\r
private ResteasyWebTarget webTarget;\r
private Map<Long, BasicDBList> storyStoryFolders;\r
private Map<Long, BasicDBList> storedStoryRundowns;\r
private Map<Long, BasicDBList> storedStoryStoryFolders;\r
+ private Map<Long, BasicDBList> storedStoryMosObjects;\r
\r
public OctopusDataMiner() {\r
String jdbcUrl = System.getProperty("jobengine.nosql.db.url");\r
\r
private void buildStoriesReferences() {\r
DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
- DBCursor cursor = collection.find(null, new BasicDBObject(ID, 1).append(REF_RUNDOWN, 1).append(REF_STORYFOLDER, 1));\r
+ DBCursor cursor = collection.find(null, new BasicDBObject(ID, 1).append(REF_RUNDOWN, 1).append(REF_STORYFOLDER, 1).append(MOS_OBJECTS, 1));\r
//DBCursor find = collection.find(QueryBuilder.start(ID).greaterThan(0).get());\r
try {\r
\r
storedStoryStoryFolders = new HashMap<>();\r
storedStoryStoryFolders.put(storyId, storyFolderRef);\r
}\r
+\r
+ BasicDBList storyMosObjects = asDBList(story, MOS_OBJECTS);\r
+ if (storyMosObjects != null) {\r
+ if (storedStoryMosObjects == null)\r
+ storedStoryMosObjects = new HashMap<>();\r
+ storedStoryMosObjects.put(storyId, storyMosObjects);\r
+ }\r
}\r
} catch (Exception e) {\r
logger.catching(e);\r
}\r
\r
public void run(boolean forceFull) {\r
- if (forceFull)\r
+ if (forceFull) {\r
+ // RUNDOWN_COLLECTION_NAME = "rundowns_tmp";\r
+ // STORY_COLLECTION_NAME = "stories_tmp";\r
+ // STORY_FOLDER_COLLECTION_NAME = "storyfolders_tmp";\r
+ // TIME_COLLECTION_NAME = "octopusSyncTime_tmp";\r
clear();\r
+ }\r
run();\r
+ // if (forceFull) {\r
+ // RUNDOWN_COLLECTION_NAME = "rundowns";\r
+ // STORY_COLLECTION_NAME = "stories";\r
+ // STORY_FOLDER_COLLECTION_NAME = "storyfolders";\r
+ // TIME_COLLECTION_NAME = "octopusSyncTime";\r
+ // db.getCollection("rundowns_tmp").rename(RUNDOWN_COLLECTION_NAME, true);\r
+ // db.getCollection("stories_tmp").rename(STORY_COLLECTION_NAME, true);\r
+ // db.getCollection("storyfolders_tmp").rename(STORY_FOLDER_COLLECTION_NAME, true);\r
+ // db.getCollection("octopusSyncTime_tmp").rename(TIME_COLLECTION_NAME, true);\r
+ // //clear();\r
+ // }\r
+\r
+ //TODO reset collection names\r
}\r
\r
public void setLastUpdateTime(Date lastUpdateTime) {\r
rundownRef = (rundownRef == null) ? new BasicDBList() : rundownRef;\r
BasicDBList storyFolderRef = storyStoryFolders.get(storyID);\r
storyFolderRef = (storyFolderRef == null) ? new BasicDBList() : storyFolderRef;\r
+ BasicDBList modifiedMOS = GetRelevantMOSObjects(story);\r
+ modifiedMOS = (modifiedMOS == null) ? new BasicDBList() : modifiedMOS;\r
\r
boolean uptodate = true;\r
if (!isModified(lastUpdateTime, story)) {\r
storedStoryFolderRef = (storedStoryFolderRef == null) ? new BasicDBList() : storedStoryFolderRef;\r
uptodate = storedStoryFolderRef.equals(storyFolderRef);\r
}\r
+\r
+ if (uptodate) {\r
+ BasicDBList storedMOS = storedStoryMosObjects.get(storyID);\r
+ storedMOS = (storedMOS == null) ? new BasicDBList() : storedMOS;\r
+ uptodate = storedMOS.equals(modifiedMOS);\r
+ }\r
+\r
if (uptodate)\r
return;\r
}\r
story.put(REF_STORYFOLDER, storyFolderRef);\r
String scriptContent = GetScriptContent(story);\r
story.put(SCRIPT_CONTENT, scriptContent);\r
- BasicDBList modifiedMOS = GetRelevantMOSObjects(story);\r
if (modifiedMOS == null || modifiedMOS.isEmpty()) {\r
if (story.containsKey(MOS_OBJECTS))\r
story.remove(MOS_OBJECTS);\r
package user.common.octopus.test;\r
\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertTrue;\r
+\r
import java.io.FileInputStream;\r
import java.lang.invoke.MethodHandles;\r
import java.net.URL;\r
}\r
}\r
\r
+ @Test\r
+ public void testListEquals() {\r
+ BasicDBList list1 = new BasicDBList(new BasicDBObject("x", 1));\r
+ BasicDBList list2 = new BasicDBList(new BasicDBObject("x", 1));\r
+\r
+ assertTrue(list1.equals(list2));\r
+ }\r
+\r
+ @Test\r
+ public void testListEquals_fail1() {\r
+ BasicDBList list1 = new BasicDBList(new BasicDBObject("x", 1));\r
+ BasicDBList list2 = new BasicDBList(new BasicDBObject("x", "1"));\r
+\r
+ assertFalse(list1.equals(list2));\r
+ }\r
+\r
+ @Test\r
+ public void testListEquals2() {\r
+ BasicDBList list1 = new BasicDBList(new BasicDBObject("x", 1));\r
+ list1.add(new BasicDBObject("y", 2));\r
+ list1.add(new BasicDBObject("z", 3));\r
+ BasicDBList list2 = new BasicDBList(new BasicDBObject("x", 1));\r
+ list2.add(new BasicDBObject("y", 2));\r
+ list2.add(new BasicDBObject("z", 3));\r
+ assertTrue(list1.equals(list2));\r
+ }\r
}\r
onSelect="@command('selectJob')" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" >\r
<listhead sizable="true">\r
<listheader label="Id" hflex="min" align="left"/>\r
- <listheader label="Name" hflex="300px" align="left"/>\r
+ <listheader label="Name" hflex="150px" align="left"/>\r
<listheader label="Priority" hflex="min" align="left"/>\r
- <listheader label="Status" hflex="100px" align="left"/>\r
+ <listheader label="Status" hflex="50px" align="left"/>\r
<listheader label="Progress" width="200px" align="left"/>\r
<listheader label="Message" align="left"/>\r
</listhead>\r