From f5223ce04c1cb97ffd4e8de3e00e3fe037955875 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Mon, 3 Sep 2018 13:07:02 +0000 Subject: [PATCH] git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31256 --- client/DxPlay/Configuration/dxplay.en | 6 +- client/DxPlay/Configuration/dxplay.json | 3 +- client/DxPlay/DxPlaySettings.cs | 1 + client/DxPlay/DxPlayer.cs | 8 +- client/DxPlay/Integration/Traffic.cs | 4 +- client/DxPlay/Model/DxPlayModel.cs | 31 ++++-- client/DxPlay/PlayerForm.cs | 49 ++++++---- .../DxPlay/Properties/Resources.Designer.cs | 36 +++++++ client/DxPlay/Properties/Resources.resx | 12 +++ docs/mediacube-audiorecorder.md | 2 + docs/mediacube-dxplay.md | 95 +++++++++++++++++-- 11 files changed, 204 insertions(+), 43 deletions(-) diff --git a/client/DxPlay/Configuration/dxplay.en b/client/DxPlay/Configuration/dxplay.en index 0ad1e7eb..f75ceb57 100644 --- a/client/DxPlay/Configuration/dxplay.en +++ b/client/DxPlay/Configuration/dxplay.en @@ -40,5 +40,9 @@ "PROMOTION": "Promotion", "ADVERTISEMENT": "Advertisement", "SEGMENTCOUNT": "Segment count", - "TRAFFICID": "Traffic ID" + "TRAFFICID": "Traffic ID", + "ERRORCREATESEGMENT": "No space for mode segments.", + "ERRORINVALIDTCIN": "TC IN must be before TC OUT.", + "ERRORINVALIDTCOUT": "TC OUT must be after TC IN.", + "ERRORSEGMENTCOLLISION": "Segment overlaps are not allowed." } diff --git a/client/DxPlay/Configuration/dxplay.json b/client/DxPlay/Configuration/dxplay.json index 2c911b66..921bee09 100644 --- a/client/DxPlay/Configuration/dxplay.json +++ b/client/DxPlay/Configuration/dxplay.json @@ -1,9 +1,10 @@ { + "targetDirectory": "DONE", "uiFileName": "dxplay.en", "isMaximized": true, "player": { "autoStart": false, - "segmentEditor": true, + "segmentEditor": true }, "metadata": { "$type": "TrafficMetadata", diff --git a/client/DxPlay/DxPlaySettings.cs b/client/DxPlay/DxPlaySettings.cs index d59d0b87..97b9bd74 100644 --- a/client/DxPlay/DxPlaySettings.cs +++ b/client/DxPlay/DxPlaySettings.cs @@ -4,6 +4,7 @@ using System.ComponentModel; namespace DxPlay { public class DxPlaySettings : UISettings { + public string TargetDirectory { get; set; } public Player Player { get; set; } public TrafficMetadata Metadata { get; set; } public BindingList Segments { get; set; } diff --git a/client/DxPlay/DxPlayer.cs b/client/DxPlay/DxPlayer.cs index 5ca269c0..82fdefac 100644 --- a/client/DxPlay/DxPlayer.cs +++ b/client/DxPlay/DxPlayer.cs @@ -295,17 +295,21 @@ namespace DxPlay { } public void ToggleFullscreen() { + if (graph == null) + return; graph.VideoWindow.put_FullScreenMode(IsFullscreen() ? OABool.False : OABool.True); } public bool IsFullscreen() { + if (graph == null) + return false; OABool isFullscreen; - int hr = graph.VideoWindow.get_FullScreenMode(out isFullscreen); + int hr = graph.VideoWindow.get_FullScreenMode(out isFullscreen); DsError.ThrowExceptionForHR(hr); return isFullscreen == OABool.True ? true : false; } - // Set the options on the sample grabber + // Set the options on the sa_ve grabber private void ConfigureSampleGrabber(ISampleGrabber sampGrabber) { int hr; //AMMediaType media; diff --git a/client/DxPlay/Integration/Traffic.cs b/client/DxPlay/Integration/Traffic.cs index d2548cef..1138d33c 100644 --- a/client/DxPlay/Integration/Traffic.cs +++ b/client/DxPlay/Integration/Traffic.cs @@ -53,9 +53,9 @@ namespace DxPlay.Integration { return result; } - public void OnTargetUpdateTrafficMessage(TargetUpdateTrafficMessage message) { + public void Update(TargetUpdateTrafficMessage message) { logger.Info("Now update!!!!!!!!!"); - //selector.trafficAPI.UpdateTrafficInformation(message.VariantID, message.Ready, message.MetadataType, message.Segments); + selector.trafficAPI.UpdateTrafficInformation(message.VariantID, message.Ready, message.MetadataType, message.Segments); } } } diff --git a/client/DxPlay/Model/DxPlayModel.cs b/client/DxPlay/Model/DxPlayModel.cs index 74951964..80efe19a 100644 --- a/client/DxPlay/Model/DxPlayModel.cs +++ b/client/DxPlay/Model/DxPlayModel.cs @@ -26,7 +26,6 @@ namespace DxPlay.Model { Configuration = settings.Metadata, MessageBus = MessageBus }; - MessageBus.Subscribe(m => traffic.OnTargetUpdateTrafficMessage(m)); } public DxPlayModel(DxPlaySettings settings) { @@ -117,7 +116,6 @@ namespace DxPlay.Model { } } - public BindingList Segments { get; private set; } private void InitializeSegments() { @@ -136,13 +134,28 @@ namespace DxPlay.Model { } public void Approve() { - TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage { - VariantID = VariantID, - Ready = true, - MetadataType = MetadataType, - Segments = Segments.ToList() - }; - MessageBus.Send(message); + if (CurrentFile == null || !CurrentFile.Exists) + return; + + string targetDirectory = Path.Combine(CurrentFile.DirectoryName, settings.TargetDirectory); + string targetPath = Path.Combine(CurrentFile.DirectoryName, settings.TargetDirectory, ID + ".MXF"); + try { + if (!Directory.Exists(targetDirectory)) + Directory.CreateDirectory(targetDirectory); + + File.Move(CurrentFile.FullName, targetPath); + + TargetUpdateTrafficMessage message = new TargetUpdateTrafficMessage { + VariantID = VariantID, + Ready = true, + MetadataType = MetadataType, + Segments = Segments.ToList() + }; + traffic.Update(message); + } catch (Exception e) { + File.Move(targetPath, CurrentFile.FullName); + throw e; + } } } } diff --git a/client/DxPlay/PlayerForm.cs b/client/DxPlay/PlayerForm.cs index dd0d21d4..c70f627d 100644 --- a/client/DxPlay/PlayerForm.cs +++ b/client/DxPlay/PlayerForm.cs @@ -7,7 +7,6 @@ using NLog; using DxPlay.Model; using MaestroShared.Commons; using DxPlay.Properties; -using MaestroShared.Targets; namespace DxPlay { @@ -15,7 +14,6 @@ namespace DxPlay { private static readonly Logger logger = LogManager.GetCurrentClassLogger(); private DateTime lastClick = DateTime.Now; - private string selectedFile; private volatile bool trackBarAtUser; private DxPlayer m_play = null; private MediaDescription m_mediaDescription = null; @@ -125,13 +123,13 @@ namespace DxPlay { m_play = null; try { //m_mediaDescription = MediaDetector.GetDescription(selectedFile); - m_mediaDescription = new MediaDescription() { fileName = selectedFile }; + m_mediaDescription = new MediaDescription() { fileName = model.CurrentFile.FullName }; playerControls.TrackBar.Value = 0; playerControls.TrackBar.Minimum = 0; m_play = new DxPlayer(pVideo, ref m_mediaDescription, Settings); if (m_play.IsError) - throw new Exception(selectedFile); + throw new Exception(model.CurrentFile.FullName); m_play.PlayEvent += new DxPlayEvent(OnPlayEvent); if (m_mediaDescription != null) { @@ -179,12 +177,11 @@ namespace DxPlay { if (m_play != null) m_play.Dispose(); this.Text = fileInfo.Name; - selectedFile = fileInfo.FullName; + model.CurrentFile = fileInfo; Cueue(); if (model.IsMenuVisible) { - model.CurrentFile = fileInfo; openFileDialog.InitialDirectory = fileInfo.Directory.FullName; string id = fileInfo.Name.Replace(fileInfo.Extension, ""); try { @@ -354,14 +351,14 @@ namespace DxPlay { } result = true; break; - case Keys.I: - if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor)) - SetActualPositionAsIn(); - break; - case Keys.O: - if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor)) - SetActualPositionAsOut(); - break; + //case Keys.I: + // if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor)) + // SetActualPositionAsIn(); + // break; + //case Keys.O: + // if (m_play != null && true.Equals(Settings?.Player?.SegmentEditor)) + // SetActualPositionAsOut(); + // break; } return result; } @@ -400,7 +397,7 @@ namespace DxPlay { MovieSegment lastSegment = model.Segments[model.Segments.Count - 1]; Timecode tcEnd = new Timecode(m_mediaDescription.FirstFrame, m_mediaDescription.Duration); if (lastSegment.TCOut.Frames == tcEnd.Frames) { - MessageBox.Show("Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens."); + MsgBox.Error(Settings.Resource("ERRORCREATESEGMENT", Resources.ERRORCREATESEGMENT)); return; } segment = new MovieSegment() { @@ -437,7 +434,7 @@ namespace DxPlay { bsSegments.Position = bsSegments.Add(newSegment); return; } - MessageBox.Show("A belépõ nem lehet a kilépõ után."); + MsgBox.Error(Settings.Resource("ERRORINVALIDTCIN", Resources.ERRORINVALIDTCIN)); return; } //if (MessageBox.Show("Biztos felül akarja írni az belépõt?", "Belépõ felülírása", MessageBoxButtons.YesNo) == DialogResult.No) @@ -445,7 +442,7 @@ namespace DxPlay { MovieSegment collisionSegment = model.Segments.Where(s => s.TCIn.Frames < m_play.CurrentTC.Frames && m_play.CurrentTC.Frames < s.TCOut.Frames).SingleOrDefault(); if (collisionSegment != null && !currentSegment.Equals(collisionSegment)) { - MessageBox.Show("A szegmensek között nem lehet átfedés."); + MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION)); return; } @@ -466,12 +463,12 @@ namespace DxPlay { bsSegments.Position = bsSegments.Add(newSegment); } else { if (currentSegment.TCIn.Frames >= m_play.CurrentTC.Frames) - MessageBox.Show("A kilépõ nem lehet a belépõ elõtt."); + MsgBox.Error(Settings.Resource("ERRORINVALIDTCOUT", Resources.ERRORINVALIDTCOUT)); MovieSegment collisionSegment = model.Segments.Where(s => s.TCIn.Frames < m_play.CurrentTC.Frames && m_play.CurrentTC.Frames < s.TCOut.Frames).SingleOrDefault(); if (collisionSegment != null && !currentSegment.Equals(collisionSegment)) { - MessageBox.Show("A szegmensek között nem lehet átfedés."); + MsgBox.Error(Settings.Resource("ERRORSEGMENTCOLLISION", Resources.ERRORSEGMENTCOLLISION)); return; } @@ -543,7 +540,7 @@ namespace DxPlay { } else m_play.Seek(pos); } catch (Exception ex) { - MessageBox.Show(ex.Message, null, MessageBoxButtons.OK, MessageBoxIcon.Error); + MsgBox.Error(ex.Message); } } @@ -563,7 +560,17 @@ namespace DxPlay { } private void OnApprove(object sender, EventArgs e) { - model.Approve(); + if (m_play == null) + return; + + try { + m_play.Dispose(); + model.Approve(); + } catch (Exception ex) { + logger.Error(ex); + MsgBox.Error(ex.Message); + } + } private void OnToggleSegmentEditor(object sender, EventArgs e) { diff --git a/client/DxPlay/Properties/Resources.Designer.cs b/client/DxPlay/Properties/Resources.Designer.cs index 083dc242..ae4b1094 100644 --- a/client/DxPlay/Properties/Resources.Designer.cs +++ b/client/DxPlay/Properties/Resources.Designer.cs @@ -105,6 +105,42 @@ namespace DxPlay.Properties { } } + /// + /// Looks up a localized string similar to Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens.. + /// + internal static string ERRORCREATESEGMENT { + get { + return ResourceManager.GetString("ERRORCREATESEGMENT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A belépő nem lehet a kilépő után.. + /// + internal static string ERRORINVALIDTCIN { + get { + return ResourceManager.GetString("ERRORINVALIDTCIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A kilépő nem lehet a belépő előtt.. + /// + internal static string ERRORINVALIDTCOUT { + get { + return ResourceManager.GetString("ERRORINVALIDTCOUT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A szegmensek között nem lehet átfedés.. + /// + internal static string ERRORSEGMENTCOLLISION { + get { + return ResourceManager.GetString("ERRORSEGMENTCOLLISION", resourceCulture); + } + } + /// /// Looks up a localized string similar to Nem tudok kapcsolódni a PlanAir rendszerhez ezen az útvonalon: {0}. /// diff --git a/client/DxPlay/Properties/Resources.resx b/client/DxPlay/Properties/Resources.resx index 96e18436..8df717b3 100644 --- a/client/DxPlay/Properties/Resources.resx +++ b/client/DxPlay/Properties/Resources.resx @@ -211,4 +211,16 @@ Megnyitás + + Az utolsó szegmens az anyag végéig tart, így nem hozható létre új szegmens. + + + A belépő nem lehet a kilépő után. + + + A kilépő nem lehet a belépő előtt. + + + A szegmensek között nem lehet átfedés. + \ No newline at end of file diff --git a/docs/mediacube-audiorecorder.md b/docs/mediacube-audiorecorder.md index 7589a124..884c9607 100644 --- a/docs/mediacube-audiorecorder.md +++ b/docs/mediacube-audiorecorder.md @@ -55,6 +55,8 @@ Az ablakban látható információs- és vezérlőelemek: ## Konfigurációs állomány +A program __Configuration__ mappájában található meg program beállításait tartalmazó __audiorecorder.json__. + ```json { "deviceName": "Internal Microphone", diff --git a/docs/mediacube-dxplay.md b/docs/mediacube-dxplay.md index d1e87f23..a2211e53 100644 --- a/docs/mediacube-dxplay.md +++ b/docs/mediacube-dxplay.md @@ -1,5 +1,5 @@ # MediaCube Maestro DxPlay -> *Verzió: 1.0 - 2018.08.13* +> *Verzió: 1.0 - 2018.09.03* 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. @@ -11,23 +11,104 @@ A program elindítása után a főablak jelenik meg. A videóanyag megnyitására több módon is lehetőség van: * Az operációs rendszerben ezt az alkalmzást társítjuk az MXF fájlkiterjesztéshez. * A megnyitott alkalmazásra húzd és ejtsd módszerrel rádobjuk a fájlrendszerből a megnyitni kívánt állományt. -* A File menü Open funkciójával (Ctrl+O) +* A "File" menü "Open" funkciójával. -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. +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. -Ha a megnyitott fájl neve egy létező azonosító, akkor a kereső automatikusan listázza és a listában kijleöli azt. +## Metadat kiválasztása +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. +## Szegmensek szerkesztése +A jobb oldali fülek közül a "Segments" nevűre kattintva jelenik meg a szegmens szerkesztő. + +![Dxplay define segments](dxplay-define.png) + +A szerkesztő tetején elérhető funkciók rendre az alábbiak: +* 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. +* 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. +* 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. +* 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. +* Szegmens törlése: A kijelölt szegmenst eltávolítja a listából. + +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. + ## Gyorsító billenytűk Ctrl+O : Fájl megnyitása. 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. -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. +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. 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. -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. +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. Balra nyíl: Léptetés az előző képkockára. Jobbra nyíl: Léptetés a következő képkockára. Ctrl+Balra nyíl: Léptetés 5 képkockával vissza. Ctrl+Jobbra nyíl: Léptetés 5 képkockával előre. +Del: Ha a szegmens szerkesztő az aktív törli a kiválasztott szegmenst. + +## Konfigurációs állomány +A program __Configuration__ mappájában található meg a program beállításait tartalmazó __dxplay.json__. + +```json +{ + "workingDirectory": "DONE", + "uiFileName": "dxplay.en", + "isMaximized": true, + "player": { + "autoStart": false, + "segmentEditor": true, + }, + "metadata": { + "$type": "TrafficMetadata", + "uiFileName": "dxplay.en", + "server": { + "address": "Data Source=10.10.10.1;Initial Catalog=DBNAME;Persist Security Info=True;", + "userName": "username", + "password": "encoded password", + "timeout": 1000 + } + } +} +``` + +### targetDirectory +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. +> **DONE** + +### uiFileName +A program felületének honosított címkéit tartalmazó JSON állomány neve. +> **dxplay.en** + +### isMaximized +A program a képernyő méretével azonos méretben indul el. + +### metadata +A metaadat tallózó beállításai. + +### metadata.$type +A tallózó típusa. +> **TrafficMetadata**: direkt SQL kapcsolat a PlanAir API felé. + +### metadata.uiFileName +A tallózó felületének honosított címkéit tartalmazó JSON állomány neve. +> **dxplay.en** + +### metadata.server +A szolgáltatás elérhetősége a távoli szerveren. + +__A "szolgáltatás elérhetősége" típusú bejegyzések paraméterei:__ + +### address +A PlanAir adatbázisának SQL kapcsolati elérhetősége. + +### userName +A csatlakozáshoz használható felhasználói név. + +### password +A felhasználói névhez tartozó jelszónak a __PasswordEncrypter.exe__ programmal titkosított lenyomata. -## Beállítások +### timeout +Csatlakozás időtúllépése ezredmásodpercben. +> **1000** +## Naplózás +A naplózást az NLOG alrendszer végzi: https://github.com/nlog/nlog/wiki \ No newline at end of file -- 2.54.0