From bc20d7527c803d2206c7d031f5c79d526aa6b90f Mon Sep 17 00:00:00 2001 From: Frank Skare Date: Wed, 26 Jun 2019 02:54:59 +0200 Subject: [PATCH] - --- Changelog.md | 8 +- mpv.net/Properties/Resources.Designer.cs | 34 +--- mpv.net/Properties/Resources.resx | 3 - mpv.net/Resources/inputConf.txt | 7 +- mpv.net/Resources/inputConfHeader.txt | 25 --- mpv.net/Resources/mpvConf.txt | 6 +- mpv.net/Resources/mpvConfToml.txt | 24 ++- mpv.net/WPF/InputWindow.xaml.cs | 10 +- mpv.net/WinForms/MainForm.cs | 190 ++++++++++++----------- mpv.net/mpv.net.csproj | 1 - mpv.net/mpv/mp.cs | 47 +++--- 11 files changed, 169 insertions(+), 186 deletions(-) delete mode 100644 mpv.net/Resources/inputConfHeader.txt diff --git a/Changelog.md b/Changelog.md index d52942c..bbeea4b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,8 +7,14 @@ - when single process queue is used the folder is no longer loaded - the playlist is never cleared whenever the control key is down but files and URLs are appended instead -- 2 powershell script hosting bugs were fixed and a new powershell example script +- powershell script hosting bugs were fixed and a new powershell example script was added to the [scripting wiki page](https://github.com/stax76/mpv.net/wiki/Scripting#powershell) +- the menu entry for the command palette was renamed to 'Show All Commands' and + the default key binding was changed to F1 which is also the default in VS Code +- the default key binding of the Everything media search was changed to F3 +- support for the mpv property 'border' was added to show/hide + the window decoration (titlebar, border). A menu item and key binding (b) + was added as well ### 4.3.1 diff --git a/mpv.net/Properties/Resources.Designer.cs b/mpv.net/Properties/Resources.Designer.cs index 250f7fe..7b4e8af 100644 --- a/mpv.net/Properties/Resources.Designer.cs +++ b/mpv.net/Properties/Resources.Designer.cs @@ -82,28 +82,6 @@ namespace mpvnet.Properties { } } - /// - /// Looks up a localized string similar to - /// # This file defines the input (keys and mouse) bindings of mpv and mpv.net - /// # and it also defines the context menu of mpv.net. mpv.net has an input - /// # editor and an config editor as alternatives to editing conf text files. - /// # The input and config editor can be found in mpv.net's context menu at: - /// - /// # Settings > Show Config Editor - /// # Settings > Show Input Editor - /// - /// # The defaults of this file can be found at: - /// - /// # https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt - /// - /// # t [rest of string was truncated]";. - /// - internal static string inputConfHeader { - get { - return ResourceManager.GetString("inputConfHeader", resourceCulture); - } - } - /// /// Looks up a localized string similar to ///# manual: https://mpv.io/manual/master/ @@ -116,10 +94,9 @@ namespace mpvnet.Properties { ///hwdec = yes ///keep-open = yes ///keep-open-pause = no - ///osd-playing-msg = ${filename} - ///screenshot-directory = ~~desktop/ - ///input-default-bindings = no - ///. + ///osd-playing-msg = '${filename}' + ///screenshot-directory = '~~desktop/' + ///input-default-bindings = no. /// internal static string mpvConf { get { @@ -166,13 +143,14 @@ namespace mpvnet.Properties { ///[[settings]] ///name = "url-whitelist" ///filter = "mpv.net" - ///help = "Domain whitelist to monitor the clipboard for URLs to play.\n\nDefault: youtube ard zdf" + ///type = "string" + ///help = "Whitelist to monitor the clipboard for URLs to play.\n\nDefault: tube vimeo ard zdf" /// ///[[settings]] ///name = "process-instance" ///default = "single" ///filter = "mpv.net" - ///help = "Defines if more then [rest of string was truncated]";. + ///help = "Defines [rest of string was truncated]";. /// internal static string mpvNetConfToml { get { diff --git a/mpv.net/Properties/Resources.resx b/mpv.net/Properties/Resources.resx index 38a49a6..ed2b04c 100644 --- a/mpv.net/Properties/Resources.resx +++ b/mpv.net/Properties/Resources.resx @@ -121,9 +121,6 @@ ..\Resources\inputConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - ..\Resources\inputConfHeader.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - ..\Resources\mpvConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 diff --git a/mpv.net/Resources/inputConf.txt b/mpv.net/Resources/inputConf.txt index 74148fa..6664699 100644 --- a/mpv.net/Resources/inputConf.txt +++ b/mpv.net/Resources/inputConf.txt @@ -31,7 +31,7 @@ Alt+s script-message mpv.net load-sub #menu: Open > Load external subtitle files... _ ignore #menu: Open > - _ script-message mpv.net open-files append #menu: Open > Add files to playlist... - Ctrl+S script-message mpv.net show-media-search #menu: Open > Show media search... + F3 script-message mpv.net show-media-search #menu: Open > Show media search... _ ignore #menu: Open > - _ ignore #menu: Open > Recent @@ -132,6 +132,7 @@ Ctrl+t set ontop yes #menu: View > On Top > Enable Ctrl+T set ontop no #menu: View > On Top > Disable + b cycle border #menu: View > Toggle Border i script-message mpv.net show-info #menu: View > File Info t script-binding stats/display-stats #menu: View > Show Statistics T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics @@ -143,11 +144,11 @@ Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor Ctrl+f script-message mpv.net open-conf-folder #menu: Settings > Open Config Folder - Ctrl+P script-message mpv.net show-command-palette #menu: Tools > Command Palette + F1 script-message mpv.net show-command-palette #menu: Tools > Show All Commands h script-message mpv.net show-history #menu: Tools > Show History l ab-loop #menu: Tools > Set/clear A-B loop points L cycle-values loop-file "inf" "no" #menu: Tools > Toggle infinite file looping - Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Cycle Hardware Decoding + Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Toggle Hardware Decoding _ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command... _ script-message mpv.net manage-file-associations #menu: Tools > Manage File Associations... diff --git a/mpv.net/Resources/inputConfHeader.txt b/mpv.net/Resources/inputConfHeader.txt deleted file mode 100644 index 63f3f94..0000000 --- a/mpv.net/Resources/inputConfHeader.txt +++ /dev/null @@ -1,25 +0,0 @@ - - # This file defines the input (keys and mouse) bindings of mpv and mpv.net - # and it also defines the context menu of mpv.net. mpv.net has an input - # editor and an config editor as alternatives to editing conf text files. - # The input and config editor can be found in mpv.net's context menu at: - - # Settings > Show Config Editor - # Settings > Show Input Editor - - # The defaults of this file can be found at: - - # https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt - - # the defaults of mpv can be found at: - - # https://github.com/mpv-player/mpv/blob/master/etc/inputConf - - # mpv.net's defaults of mpv.conf contain: 'input-default-bindings = no' - # which disables mpv's input defaults. Every line in this file begins with a - # space character to make it easier to do a text search, so if you want to know - # if 'o' has already a binding you can make a text search on ' o '. - - # mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands - - # mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys diff --git a/mpv.net/Resources/mpvConf.txt b/mpv.net/Resources/mpvConf.txt index de9e80b..fa5be08 100644 --- a/mpv.net/Resources/mpvConf.txt +++ b/mpv.net/Resources/mpvConf.txt @@ -9,6 +9,6 @@ volume = 50 hwdec = yes keep-open = yes keep-open-pause = no -osd-playing-msg = ${filename} -screenshot-directory = ~~desktop/ -input-default-bindings = no +osd-playing-msg = '${filename}' +screenshot-directory = '~~desktop/' +input-default-bindings = no \ No newline at end of file diff --git a/mpv.net/Resources/mpvConfToml.txt b/mpv.net/Resources/mpvConfToml.txt index cbc9a2f..9b9f41a 100644 --- a/mpv.net/Resources/mpvConfToml.txt +++ b/mpv.net/Resources/mpvConfToml.txt @@ -206,6 +206,22 @@ type = "color" filter = "Subtitle" help = "See sub-color. Color used for sub text background. You can use sub-shadow-offset to change its size relative to the text." +[[settings]] +name = "fullscreen" +default = "no" +filter = "Screen" +help = "Start the player in fullscreen mode." +options = [{ name = "yes" }, + { name = "no" }] + +[[settings]] +name = "border" +default = "yes" +filter = "Screen" +help = "Show window with decoration (titlebar, border)." +options = [{ name = "yes" }, + { name = "no" }] + [[settings]] name = "screen" filter = "Screen" @@ -225,14 +241,6 @@ default = "55" filter = "Screen" help = "Specify the OSD font size. See sub-font-size for details. Default: 55" -[[settings]] -name = "fullscreen" -default = "no" -filter = "Screen" -help = "Start the player in fullscreen mode." -options = [{ name = "yes" }, - { name = "no" }] - [[settings]] name = "screenshot-directory" width = 500 diff --git a/mpv.net/WPF/InputWindow.xaml.cs b/mpv.net/WPF/InputWindow.xaml.cs index a27411c..18e4161 100644 --- a/mpv.net/WPF/InputWindow.xaml.cs +++ b/mpv.net/WPF/InputWindow.xaml.cs @@ -102,7 +102,15 @@ namespace mpvnet string GetInputConfContent() { - string text = Properties.Resources.inputConfHeader + "\r\n"; + string text = null; + + foreach (string line in Properties.Resources.inputConf.Split(new[] { "\r\n" }, StringSplitOptions.None)) + { + string test = line.Trim(); + if (test == "" || test.StartsWith("#")) text += test + "\r\n"; + } + + text = "\r\n" + text.Trim() + "\r\n\r\n"; foreach (CommandItem item in CommandItem.Items) { diff --git a/mpv.net/WinForms/MainForm.cs b/mpv.net/WinForms/MainForm.cs index cd73c0b..21c98ac 100644 --- a/mpv.net/WinForms/MainForm.cs +++ b/mpv.net/WinForms/MainForm.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; -using System.Diagnostics; namespace mpvnet { @@ -51,7 +50,7 @@ namespace mpvnet App.ProcessCommandLineEarly(); if (mp.Screen == -1) mp.Screen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen); SetScreen(mp.Screen); - ChangeFullscreen(mp.Fullscreen); + CycleFullscreen(mp.Fullscreen); } catch (Exception ex) { @@ -59,6 +58,24 @@ namespace mpvnet } } + public MenuItem FindMenuItem(string text) => FindMenuItem(text, ContextMenu.Items); + + void Idle() => BeginInvoke(new Action(() => { Text = "mpv.net " + Application.ProductVersion; })); + + void CM_Popup(object sender, EventArgs e) => CursorHelp.Show(); + + void VideoSizeChanged() => BeginInvoke(new Action(() => SetFormPosAndSizeKeepHeight())); + + void Shutdown() => BeginInvoke(new Action(() => Close())); + + void PropChangeFullscreen(bool value) => BeginInvoke(new Action(() => CycleFullscreen(value))); + + void ContextMenu_Opened(object sender, EventArgs e) => CursorHelp.Show(); + + bool IsFullscreen => WindowState == FormWindowState.Maximized; + + bool IsMouseInOSC() => PointToClient(Control.MousePosition).Y > ClientSize.Height * 0.9; + void ContextMenu_Opening(object sender, CancelEventArgs e) { lock (mp.MediaTracks) @@ -148,10 +165,8 @@ namespace mpvnet if (recent != null) { recent.DropDownItems.Clear(); - foreach (string path in RecentFiles) MenuItem.Add(recent.DropDownItems, path, () => mp.Load(new[] { path }, true, Control.ModifierKeys.HasFlag(Keys.Control))); - recent.DropDownItems.Add(new ToolStripSeparator()); MenuItem mi = new MenuItem("Clear List"); mi.Action = () => RecentFiles.Clear(); @@ -159,8 +174,6 @@ namespace mpvnet } } - public MenuItem FindMenuItem(string text) => FindMenuItem(text, ContextMenu.Items); - MenuItem FindMenuItem(string text, ToolStripItemCollection items) { foreach (var item in items) @@ -209,7 +222,7 @@ namespace mpvnet Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */); } - void SetFormPositionAndSizeKeepHeight() + void SetFormPosAndSizeKeepHeight() { if (IsFullscreen || mp.VideoSize.Width == 0) return; Screen screen = Screen.FromControl(this); @@ -242,8 +255,7 @@ namespace mpvnet foreach (CommandItem item in items) { - if (string.IsNullOrEmpty(item.Path)) - continue; + if (string.IsNullOrEmpty(item.Path)) continue; string path = item.Path.Replace("&", "&&"); MenuItem menuItem = ContextMenu.Add(path, () => { try { @@ -252,14 +264,11 @@ namespace mpvnet Msg.ShowException(ex); } }); - if (menuItem != null) - menuItem.ShortcutKeyDisplayString = item.Input + " "; + if (menuItem != null) menuItem.ShortcutKeyDisplayString = item.Input + " "; } } - void ContextMenu_Opened(object sender, EventArgs e) => CursorHelp.Show(); - - private void Mp_FileLoaded() + private void FileLoaded() { string path = mp.get_property_string("path"); BeginInvoke(new Action(() => { @@ -273,10 +282,6 @@ namespace mpvnet if (RecentFiles.Count > 15) RecentFiles.RemoveAt(15); } - void Mp_Idle() => BeginInvoke(new Action(() => { Text = "mpv.net " + Application.ProductVersion; })); - - void CM_Popup(object sender, EventArgs e) => CursorHelp.Show(); - void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { Msg.ShowException(e.Exception); @@ -286,29 +291,12 @@ namespace mpvnet { Msg.ShowError(e.ExceptionObject.ToString()); } - - void mp_VideoSizeChanged() + + public void CycleFullscreen(bool enabled) { - BeginInvoke(new Action(() => SetFormPositionAndSizeKeepHeight())); - } - - void mp_Shutdown() - { - BeginInvoke(new Action(() => Close())); - } - - public bool IsFullscreen => WindowState == FormWindowState.Maximized; - - void mpPropChangeFullscreen(bool value) - { - BeginInvoke(new Action(() => ChangeFullscreen(value))); - } - - void ChangeFullscreen(bool value) - { - if (value) + if (enabled) { - if (FormBorderStyle != FormBorderStyle.None) + if (WindowState != FormWindowState.Maximized) { FormBorderStyle = FormBorderStyle.None; WindowState = FormWindowState.Maximized; @@ -317,14 +305,19 @@ namespace mpvnet else { WindowState = FormWindowState.Normal; - FormBorderStyle = FormBorderStyle.Sizable; - SetFormPositionAndSizeKeepHeight(); + + if (mp.Border) + FormBorderStyle = FormBorderStyle.Sizable; + else + FormBorderStyle = FormBorderStyle.None; + + SetFormPosAndSizeKeepHeight(); } } protected override void WndProc(ref Message m) { - //Debug.WriteLine(m); + //System.Diagnostics.Debug.WriteLine(m); switch (m.Msg) { @@ -343,6 +336,9 @@ namespace mpvnet mp.command_string($"mouse {pos.X} {pos.Y}"); if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) CursorHelp.Show(); break; + case 0x2a3: // WM_MOUSELEAVE + mp.command_string("mouse 1 1"); // osc won't always auto hide + break; case 0x319: // WM_APPCOMMAND if (mp.WindowHandle != IntPtr.Zero) Native.PostMessage(mp.WindowHandle, m.Msg, m.WParam, m.LParam); @@ -417,25 +413,6 @@ namespace mpvnet mp.Load(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control)); } - protected override void OnMouseDown(MouseEventArgs e) - { - base.OnMouseDown(e); - - if (WindowState == FormWindowState.Normal && - e.Button == MouseButtons.Left && - e.Y < ClientSize.Height * 0.9) - { - var HTCAPTION = new IntPtr(2); - Native.ReleaseCapture(); - Native.PostMessage(Handle, 0xA1 /* WM_NCLBUTTONDOWN */, HTCAPTION, IntPtr.Zero); - } - - if (Width - e.Location.X < 10 && e.Location.Y < 10) - mp.commandv("quit"); - } - - bool IsMouseInOSC() => PointToClient(Control.MousePosition).Y > ClientSize.Height * 0.9; - void Timer_Tick(object sender, EventArgs e) { if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) @@ -446,37 +423,51 @@ namespace mpvnet else if (Environment.TickCount - LastCursorChangedTickCount > 1500 && !IsMouseInOSC() && ClientRectangle.Contains(PointToClient(MousePosition)) && Form.ActiveForm == this && !ContextMenu.Visible) - { + CursorHelp.Hide(); - } + } + + void PropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value)); + + void PropChangeAid(string value) => mp.Aid = value; + + void PropChangeSid(string value) => mp.Sid = value; + + void PropChangeVid(string value) => mp.Vid = value; + + void PropChangeEdition(int value) => mp.Edition = value; + + void PropChangeBorder(bool enabled) { + mp.Border = enabled; + + BeginInvoke(new Action(() => { + if (!IsFullscreen) + { + if (mp.Border && FormBorderStyle == FormBorderStyle.None) + FormBorderStyle = FormBorderStyle.Sizable; + if (!mp.Border && FormBorderStyle == FormBorderStyle.Sizable) + FormBorderStyle = FormBorderStyle.None; + } + })); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); mp.Init(); - mp.observe_property_bool("fullscreen", mpPropChangeFullscreen); - mp.observe_property_bool("ontop", mpPropChangeOnTop); - mp.observe_property_string("sid", mpPropChangeSid); - mp.observe_property_string("aid", mpPropChangeAid); - mp.observe_property_string("vid", mpPropChangeVid); - mp.observe_property_int("edition", mpPropChangeEdition); - mp.Shutdown += mp_Shutdown; - mp.VideoSizeChanged += mp_VideoSizeChanged; - mp.FileLoaded += Mp_FileLoaded; - mp.Idle += Mp_Idle; + mp.observe_property_bool("fullscreen", PropChangeFullscreen); + mp.observe_property_bool("ontop", PropChangeOnTop); + mp.observe_property_bool("border", PropChangeBorder); + mp.observe_property_string("sid", PropChangeSid); + mp.observe_property_string("aid", PropChangeAid); + mp.observe_property_string("vid", PropChangeVid); + mp.observe_property_int("edition", PropChangeEdition); + mp.Shutdown += Shutdown; + mp.VideoSizeChanged += VideoSizeChanged; + mp.FileLoaded += FileLoaded; + mp.Idle += Idle; } - void mpPropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value)); - - void mpPropChangeAid(string value) => mp.Aid = value; - - void mpPropChangeSid(string value) => mp.Sid = value; - - void mpPropChangeVid(string value) => mp.Vid = value; - - void mpPropChangeEdition(int value) => mp.Edition = value; - protected override void OnShown(EventArgs e) { base.OnShown(e); @@ -490,6 +481,14 @@ namespace mpvnet CheckUrlInClipboard(); } + protected override void OnActivated(EventArgs e) + { + base.OnActivated(e); + CheckUrlInClipboard(); + Message m = new Message() { Msg = 0x0202 }; // WM_LBUTTONUP + Native.SendMessage(Handle, m.Msg, m.WParam, m.LParam); + } + protected override void OnResize(EventArgs e) { base.OnResize(e); @@ -505,20 +504,29 @@ namespace mpvnet mp.AutoResetEvent.WaitOne(3000); } + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + if (WindowState == FormWindowState.Normal && + e.Button == MouseButtons.Left && + e.Y < ClientSize.Height * 0.9) + { + var HTCAPTION = new IntPtr(2); + Native.ReleaseCapture(); + Native.PostMessage(Handle, 0xA1 /* WM_NCLBUTTONDOWN */, HTCAPTION, IntPtr.Zero); + } + + if (Width - e.Location.X < 10 && e.Location.Y < 10) + mp.commandv("quit"); + } + protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); CursorHelp.Show(); } - protected override void OnActivated(EventArgs e) - { - base.OnActivated(e); - CheckUrlInClipboard(); - Message m = new Message() { Msg = 0x0202 }; // WM_LBUTTONUP - Native.SendMessage(Handle, m.Msg, m.WParam, m.LParam); - } - void CheckUrlInClipboard() { string clipboard = Clipboard.GetText(); diff --git a/mpv.net/mpv.net.csproj b/mpv.net/mpv.net.csproj index 2336902..ccbb4cc 100644 --- a/mpv.net/mpv.net.csproj +++ b/mpv.net/mpv.net.csproj @@ -260,7 +260,6 @@ - diff --git a/mpv.net/mpv/mp.cs b/mpv.net/mpv/mp.cs index 285ca5c..082123e 100644 --- a/mpv.net/mpv/mp.cs +++ b/mpv.net/mpv/mp.cs @@ -65,17 +65,36 @@ namespace mpvnet public static List MediaTracks { get; set; } = new List(); public static List> Chapters { get; set; } = new List>(); - public static string InputConfPath { get; } = ConfFolder + "\\input.conf"; - public static string ConfPath { get; } = ConfFolder + "\\mpv.conf"; - - public static bool Fullscreen { get; set; } - public static float Autofit { get; set; } = 0.50f; - public static int Screen { get; set; } = -1; + public static string InputConfPath { get; } = ConfFolder + "\\input.conf"; + public static string ConfPath { get; } = ConfFolder + "\\mpv.conf"; public static string Sid { get; set; } = ""; public static string Aid { get; set; } = ""; public static string Vid { get; set; } = ""; + + public static bool Fullscreen { get; set; } + public static bool Border { get; set; } = true; + + public static int Screen { get; set; } = -1; public static int Edition { get; set; } + public static float Autofit { get; set; } = 0.50f; + + public static void ProcessProperty(string name, string value) + { + switch (name) + { + case "autofit": + if (value.Length == 3 && value.EndsWith("%")) + if (int.TryParse(value.Substring(0, 2), out int result)) + Autofit = result / 100f; + break; + case "fs": + case "fullscreen": Fullscreen = value == "yes"; break; + case "border": Border = value == "yes"; break; + case "screen": Screen = Convert.ToInt32(value); break; + } + } + static string _ConfFolder; public static string ConfFolder { @@ -146,7 +165,6 @@ namespace mpvnet string dummy = ConfFolder; LoadLibrary("mpv-1.dll"); Handle = mpv_create(); - set_property_string("input-default-bindings", "yes"); set_property_string("osc", "yes"); set_property_string("config", "yes"); set_property_string("wid", MainForm.Hwnd.ToString()); @@ -652,21 +670,6 @@ namespace mpvnet } } - public static void ProcessProperty(string name, string value) - { - switch (name) - { - case "autofit": - if (value.Length == 3 && value.EndsWith("%")) - if (int.TryParse(value.Substring(0, 2), out int result)) - Autofit = result / 100f; - break; - case "fs": - case "fullscreen": Fullscreen = value == "yes"; break; - case "screen": Screen = Convert.ToInt32(value); break; - } - } - static void ReadMetaData() { lock (MediaTracks)