git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 3 Sep 2018 13:07:02 +0000 (13:07 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 3 Sep 2018 13:07:02 +0000 (13:07 +0000)
client/DxPlay/Configuration/dxplay.en
client/DxPlay/Configuration/dxplay.json
client/DxPlay/DxPlaySettings.cs
client/DxPlay/DxPlayer.cs
client/DxPlay/Integration/Traffic.cs
client/DxPlay/Model/DxPlayModel.cs
client/DxPlay/PlayerForm.cs
client/DxPlay/Properties/Resources.Designer.cs
client/DxPlay/Properties/Resources.resx
docs/mediacube-audiorecorder.md
docs/mediacube-dxplay.md

index 0ad1e7eb85f5a9e6a2bb4ca22a086b99502a9257..f75ceb57a8d3604ff35e212fbe0a1efe1d5a62f2 100644 (file)
@@ -40,5 +40,9 @@
   "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
index 2c911b66a7e2e884146733bf1c0640e12df6d721..921bee091d5a6e155b43fb428d9d52c16782e5e9 100644 (file)
@@ -1,9 +1,10 @@
 {\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
index d59d0b876315b6383da0d524798e361c72593c9b..97b9bd7450d7b19fbc129a75c4e9144f35e7e7d2 100644 (file)
@@ -4,6 +4,7 @@ using System.ComponentModel;
 \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
index 5ca269c04a245c1fc41813146fb4ed756525cec5..82fdefac46766c0f4d8e20c6cbf4434819ecf197 100644 (file)
@@ -295,17 +295,21 @@ namespace DxPlay {
         }\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
index d2548cef80898d64cbb283dabaff771ff90e784f..1138d33c2ce41441cd434269b887eddf1593d04a 100644 (file)
@@ -53,9 +53,9 @@ namespace DxPlay.Integration {
             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
index 74951964539d1467bdedc56f74efe45d1bd3d884..80efe19abadeea7448c6e9472798be556a253186 100644 (file)
@@ -26,7 +26,6 @@ namespace DxPlay.Model {
                 Configuration = settings.Metadata,\r
                 MessageBus = MessageBus\r
             };\r
-            MessageBus.Subscribe<TargetUpdateTrafficMessage>(m => traffic.OnTargetUpdateTrafficMessage(m));\r
         }\r
 \r
         public DxPlayModel(DxPlaySettings settings) {\r
@@ -117,7 +116,6 @@ namespace DxPlay.Model {
             }\r
         }\r
 \r
-\r
         public BindingList<MovieSegment> Segments { get; private set; }\r
 \r
         private void InitializeSegments() {\r
@@ -136,13 +134,28 @@ namespace DxPlay.Model {
         }\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
index dd0d21d4b3c827f5c86925d0f33ac7691db2eda0..c70f627de537a3353116b68083412252adac1dbd 100644 (file)
@@ -7,7 +7,6 @@ using NLog;
 using DxPlay.Model;\r
 using MaestroShared.Commons;\r
 using DxPlay.Properties;\r
-using MaestroShared.Targets;\r
 \r
 namespace DxPlay {\r
 \r
@@ -15,7 +14,6 @@ namespace DxPlay {
         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
@@ -125,13 +123,13 @@ namespace DxPlay {
             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
@@ -179,12 +177,11 @@ namespace DxPlay {
             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
@@ -354,14 +351,14 @@ namespace DxPlay {
                     }\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
@@ -400,7 +397,7 @@ namespace DxPlay {
                 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
@@ -437,7 +434,7 @@ namespace DxPlay {
                         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
@@ -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();\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
@@ -466,12 +463,12 @@ namespace DxPlay {
                 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
@@ -543,7 +540,7 @@ namespace DxPlay {
                     } 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
@@ -563,7 +560,17 @@ namespace DxPlay {
         }\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
index 083dc242d176edf7848092f15a5deaef3520d058..ae4b10944aa01ec1fdce94e4c99c2469cc248950 100644 (file)
@@ -105,6 +105,42 @@ namespace DxPlay.Properties {
             }\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
index 96e184363affa9788fefacea3eb006ce77fe59a1..8df717b3242900fd1656afe1c6d257562d4d289e 100644 (file)
   <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
index 7589a124a90900f3125c7af6564c5d7c1b979a20..884c96074af3773e8af17f63eb80d64a2ae19ec7 100644 (file)
@@ -55,6 +55,8 @@ Az ablakban látható információs- és vezérlőelemek:
        \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
index d1e87f236ef77e04ee7e236743534c85ae809fb8..a2211e53b095f314da03169af301f92f69377794 100644 (file)
@@ -1,5 +1,5 @@
 # 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
@@ -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:\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
+![Dxplay define segments](dxplay-define.png)\r
\r
+A szerkesztő tetején elérhető funkciók rendre az alábbiak:\r
+* Szegmens létrehozása: A teljes fájlra definiál egy szegmenst, kezdete a file kezdő timecode-ja, a vége pedig a kezdéshez hozzáadott hossz.\r
+* 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