"PROMOTION": "Promotion",\r
"ADVERTISEMENT": "Advertisement",\r
"SEGMENTCOUNT": "Segment count",\r
- "TRAFFICID": "Traffic ID"\r
+ "TRAFFICID": "Traffic ID",\r
+ "ERRORCREATESEGMENT": "No space for mode 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
}\r
{\r
+ "targetDirectory": "DONE",\r
"uiFileName": "dxplay.en",\r
"isMaximized": true,\r
"player": {\r
"autoStart": false,\r
- "segmentEditor": true,\r
+ "segmentEditor": true\r
},\r
"metadata": {\r
"$type": "TrafficMetadata",\r
\r
namespace DxPlay {\r
public class DxPlaySettings : UISettings {\r
+ public string TargetDirectory { get; set; }\r
public Player Player { get; set; }\r
public TrafficMetadata Metadata { get; set; }\r
public BindingList<MovieSegment> Segments { get; set; }\r
}\r
\r
public void ToggleFullscreen() {\r
+ if (graph == null)\r
+ return;\r
graph.VideoWindow.put_FullScreenMode(IsFullscreen() ? OABool.False : OABool.True);\r
}\r
\r
public bool IsFullscreen() {\r
+ if (graph == null)\r
+ return false;\r
OABool isFullscreen;\r
- int hr = graph.VideoWindow.get_FullScreenMode(out isFullscreen);\r
+ int hr = graph.VideoWindow.get_FullScreenMode(out isFullscreen);\r
DsError.ThrowExceptionForHR(hr);\r
return isFullscreen == OABool.True ? true : false;\r
}\r
\r
- // Set the options on the sample grabber\r
+ // Set the options on the sa_ve grabber\r
private void ConfigureSampleGrabber(ISampleGrabber sampGrabber) {\r
int hr;\r
//AMMediaType media;\r
return result;\r
}\r
\r
- public void OnTargetUpdateTrafficMessage(TargetUpdateTrafficMessage message) {\r
+ public void Update(TargetUpdateTrafficMessage message) {\r
logger.Info("Now update!!!!!!!!!");\r
- //selector.trafficAPI.UpdateTrafficInformation(message.VariantID, message.Ready, message.MetadataType, message.Segments);\r
+ selector.trafficAPI.UpdateTrafficInformation(message.VariantID, message.Ready, message.MetadataType, message.Segments);\r
}\r
}\r
}\r
Configuration = settings.Metadata,\r
MessageBus = MessageBus\r
};\r
- MessageBus.Subscribe<TargetUpdateTrafficMessage>(m => traffic.OnTargetUpdateTrafficMessage(m));\r
}\r
\r
public DxPlayModel(DxPlaySettings settings) {\r
}\r
}\r
\r
-\r
public BindingList<MovieSegment> Segments { get; private set; }\r
\r
private void InitializeSegments() {\r
}\r
\r
public void Approve() {\r
- TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage {\r
- VariantID = VariantID,\r
- Ready = true,\r
- MetadataType = MetadataType,\r
- Segments = Segments.ToList()\r
- };\r
- MessageBus.Send(message);\r
+ if (CurrentFile == null || !CurrentFile.Exists)\r
+ return;\r
+\r
+ string targetDirectory = Path.Combine(CurrentFile.DirectoryName, settings.TargetDirectory);\r
+ string targetPath = Path.Combine(CurrentFile.DirectoryName, settings.TargetDirectory, ID + ".MXF");\r
+ try {\r
+ if (!Directory.Exists(targetDirectory))\r
+ Directory.CreateDirectory(targetDirectory);\r
+\r
+ File.Move(CurrentFile.FullName, targetPath);\r
+\r
+ TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage {\r
+ VariantID = VariantID,\r
+ Ready = true,\r
+ MetadataType = MetadataType,\r
+ Segments = Segments.ToList()\r
+ };\r
+ traffic.Update(message);\r
+ } catch (Exception e) {\r
+ File.Move(targetPath, CurrentFile.FullName);\r
+ throw e;\r
+ }\r
}\r
}\r
}\r
using DxPlay.Model;\r
using MaestroShared.Commons;\r
using DxPlay.Properties;\r
-using MaestroShared.Targets;\r
\r
namespace DxPlay {\r
\r
private static readonly Logger logger = LogManager.GetCurrentClassLogger();\r
\r
private DateTime lastClick = DateTime.Now;\r
- private string selectedFile;\r
private volatile bool trackBarAtUser;\r
private DxPlayer m_play = null;\r
private MediaDescription m_mediaDescription = null;\r
m_play = null;\r
try {\r
//m_mediaDescription = MediaDetector.GetDescription(selectedFile);\r
- m_mediaDescription = new MediaDescription() { fileName = selectedFile };\r
+ m_mediaDescription = new MediaDescription() { fileName = model.CurrentFile.FullName };\r
\r
playerControls.TrackBar.Value = 0;\r
playerControls.TrackBar.Minimum = 0;\r
m_play = new DxPlayer(pVideo, ref m_mediaDescription, Settings);\r
if (m_play.IsError)\r
- throw new Exception(selectedFile);\r
+ throw new Exception(model.CurrentFile.FullName);\r
\r
m_play.PlayEvent += new DxPlayEvent(OnPlayEvent);\r
if (m_mediaDescription != null) {\r
if (m_play != null)\r
m_play.Dispose();\r
this.Text = fileInfo.Name;\r
- selectedFile = fileInfo.FullName;\r
\r
+ model.CurrentFile = fileInfo;\r
Cueue();\r
\r
if (model.IsMenuVisible) {\r
- model.CurrentFile = fileInfo;\r
openFileDialog.InitialDirectory = fileInfo.Directory.FullName;\r
string id = fileInfo.Name.Replace(fileInfo.Extension, "");\r
try {\r
}\r
result = true;\r
break;\r
- case Keys.I:\r
- if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor))\r
- SetActualPositionAsIn();\r
- break;\r
- case Keys.O:\r
- if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor))\r
- SetActualPositionAsOut();\r
- break;\r
+ //case Keys.I:\r
+ // if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor))\r
+ // SetActualPositionAsIn();\r
+ // break;\r
+ //case Keys.O:\r
+ // if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor))\r
+ // SetActualPositionAsOut();\r
+ // break;\r
}\r
return result;\r
}\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
- MessageBox.Show("Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens.");\r
+ MsgBox.Error(Settings.Resource("ERRORCREATESEGMENT", Resources.ERRORCREATESEGMENT));\r
return;\r
}\r
segment = new MovieSegment() {\r
bsSegments.Position = bsSegments.Add(newSegment);\r
return;\r
}\r
- MessageBox.Show("A belépõ nem lehet a kilépõ után.");\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
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
- MessageBox.Show("A szegmensek között nem lehet átfedés.");\r
+ MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
return;\r
}\r
\r
bsSegments.Position = bsSegments.Add(newSegment);\r
} else {\r
if (currentSegment.TCIn.Frames >= m_play.CurrentTC.Frames)\r
- MessageBox.Show("A kilépõ nem lehet a belépõ elõtt.");\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
- MessageBox.Show("A szegmensek között nem lehet átfedés.");\r
+ MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION));\r
return;\r
}\r
\r
} else\r
m_play.Seek(pos);\r
} catch (Exception ex) {\r
- MessageBox.Show(ex.Message, null, MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ MsgBox.Error(ex.Message);\r
}\r
\r
}\r
}\r
\r
private void OnApprove(object sender, EventArgs e) {\r
- model.Approve();\r
+ if (m_play == null)\r
+ return;\r
+\r
+ try {\r
+ m_play.Dispose();\r
+ model.Approve();\r
+ } catch (Exception ex) {\r
+ logger.Error(ex);\r
+ MsgBox.Error(ex.Message);\r
+ }\r
+\r
}\r
\r
private void OnToggleSegmentEditor(object sender, EventArgs e) {\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Looks up a localized string similar to Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens..\r
+ /// </summary>\r
+ internal static string ERRORCREATESEGMENT {\r
+ get {\r
+ return ResourceManager.GetString("ERRORCREATESEGMENT", resourceCulture);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Looks up a localized string similar to A belépő nem lehet a kilépő után..\r
+ /// </summary>\r
+ internal static string ERRORINVALIDTCIN {\r
+ get {\r
+ return ResourceManager.GetString("ERRORINVALIDTCIN", resourceCulture);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Looks up a localized string similar to A kilépő nem lehet a belépő előtt..\r
+ /// </summary>\r
+ internal static string ERRORINVALIDTCOUT {\r
+ get {\r
+ return ResourceManager.GetString("ERRORINVALIDTCOUT", resourceCulture);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Looks up a localized string similar to A szegmensek között nem lehet átfedés..\r
+ /// </summary>\r
+ internal static string ERRORSEGMENTCOLLISION {\r
+ get {\r
+ return ResourceManager.GetString("ERRORSEGMENTCOLLISION", resourceCulture);\r
+ }\r
+ }\r
+ \r
/// <summary>\r
/// Looks up a localized string similar to Nem tudok kapcsolódni a PlanAir rendszerhez ezen az útvonalon: {0}.\r
/// </summary>\r
<data name="OPEN" xml:space="preserve">\r
<value>Megnyitás</value>\r
</data>\r
+ <data name="ERRORCREATESEGMENT" xml:space="preserve">\r
+ <value>Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens.</value>\r
+ </data>\r
+ <data name="ERRORINVALIDTCIN" xml:space="preserve">\r
+ <value>A belépő nem lehet a kilépő után.</value>\r
+ </data>\r
+ <data name="ERRORINVALIDTCOUT" xml:space="preserve">\r
+ <value>A kilépő nem lehet a belépő előtt.</value>\r
+ </data>\r
+ <data name="ERRORSEGMENTCOLLISION" xml:space="preserve">\r
+ <value>A szegmensek között nem lehet átfedés.</value>\r
+ </data>\r
</root>
\ No newline at end of file
\r
## Konfigurációs állomány\r
\r
+A program __Configuration__ mappájában található meg program beállításait tartalmazó __audiorecorder.json__.\r
+\r
```json\r
{\r
"deviceName": "Internal Microphone",\r
# MediaCube Maestro DxPlay\r
-> *Verzió: 1.0 - 2018.08.13*\r
+> *Verzió: 1.0 - 2018.09.03*\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
A videóanyag megnyitására több módon is lehetőség van:\r
* Az operációs rendszerben ezt az alkalmzást társítjuk az MXF fájlkiterjesztéshez.\r
* A megnyitott alkalmazásra húzd és ejtsd módszerrel rádobjuk a fájlrendszerből a megnyitni kívánt állományt.\r
-* A File menü Open funkciójával (Ctrl+O)\r
+* A "File" menü "Open" funkciójával.\r
\r
-A fájl megnyitása után a média első képkockája válik láthatóvá a felületen. A vezérlők és a gyorsítóbillenytűk segítségével lehet a tartalmat lejátszani. A szegmensek definiálásához metaadat tallózóban ki kell választani egy azonosítót a jelölőnégyzet kipipálásával. Ismert azonosító esetén a felső keresősávba beírva és Enter-t nyomva, listázhatók ki a találatok.\r
+A fájl megnyitása után a média első képkockája válik láthatóvá a felületen. A vezérlők és a gyorsítóbillenytűk segítségével lehet a tartalmat lejátszani. A szegmensek definiálásához a metaadat tallózóban ki kell választani egy azonosítót a jelölőnégyzet kipipálásával. A lejátszó képes kiolvasni a kezdő timecode-ot, és azt megjeleníti a felület bal oldalán, a file hossza pedig a jobb oldalon jelenik meg.\r
\r
-Ha a megnyitott fájl neve egy létező azonosító, akkor a kereső automatikusan listázza és a listában kijleöli azt.\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
\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
+ \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
+* 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
+\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
+ \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
-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
+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
+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
Balra nyíl: Léptetés az előző képkockára. \r
Jobbra nyíl: Léptetés a következő képkockára. \r
Ctrl+Balra nyíl: Léptetés 5 képkockával vissza. \r
Ctrl+Jobbra nyíl: Léptetés 5 képkockával előre. \r
+Del: Ha a szegmens szerkesztő az aktív törli a kiválasztott szegmenst.\r
+\r
+## Konfigurációs állomány\r
+A program __Configuration__ mappájában található meg a program beállításait tartalmazó __dxplay.json__.\r
+\r
+```json\r
+{\r
+ "workingDirectory": "DONE",\r
+ "uiFileName": "dxplay.en",\r
+ "isMaximized": true,\r
+ "player": {\r
+ "autoStart": false,\r
+ "segmentEditor": true,\r
+ },\r
+ "metadata": {\r
+ "$type": "TrafficMetadata",\r
+ "uiFileName": "dxplay.en",\r
+ "server": {\r
+ "address": "Data Source=10.10.10.1;Initial Catalog=DBNAME;Persist Security Info=True;",\r
+ "userName": "username",\r
+ "password": "encoded password",\r
+ "timeout": 1000\r
+ }\r
+ }\r
+}\r
+```\r
+\r
+### targetDirectory\r
+A kész állományok célmappája. Ezt a forrásfájl mappájához képest lehet megadni. Ha a mappa nem létezik, akkor a program létrehozza.\r
+> **DONE**\r
+\r
+### uiFileName\r
+A program felületének honosított címkéit tartalmazó JSON állomány neve.\r
+> **dxplay.en**\r
+\r
+### isMaximized\r
+A program a képernyő méretével azonos méretben indul el.\r
+\r
+### metadata\r
+A metaadat tallózó beállításai.\r
+\r
+### metadata.$type\r
+A tallózó típusa.\r
+> **TrafficMetadata**: direkt SQL kapcsolat a PlanAir API felé. \r
+\r
+### metadata.uiFileName\r
+A tallózó felületének honosított címkéit tartalmazó JSON állomány neve.\r
+> **dxplay.en**\r
+\r
+### metadata.server\r
+A szolgáltatás elérhetősége a távoli szerveren.\r
+\r
+__A "szolgáltatás elérhetősége" típusú bejegyzések paraméterei:__\r
+\r
+### address\r
+A PlanAir adatbázisának SQL kapcsolati elérhetősége.\r
+\r
+### userName\r
+A csatlakozáshoz használható felhasználói név.\r
+\r
+### password\r
+A felhasználói névhez tartozó jelszónak a __PasswordEncrypter.exe__ programmal titkosított lenyomata.\r
\r
-## Beállítások\r
+### timeout\r
+Csatlakozás időtúllépése ezredmásodpercben.\r
+> **1000**\r
\r
+## Naplózás\r
+A naplózást az NLOG alrendszer végzi: https://github.com/nlog/nlog/wiki
\ No newline at end of file