From 7e4ea640cfd6f3e5e8c48e46def06798f7f36cb8 Mon Sep 17 00:00:00 2001 From: stax76 Date: Fri, 27 May 2022 12:20:37 +0200 Subject: [PATCH] Command messages are dispatched with `script-message-to mpvnet` --- docs/Changelog.md | 1 + docs/Manual.md | 2 +- src/Misc/Commands.cs | 2 - src/Misc/MainForm.cs | 5 +- src/Misc/Misc.cs | 1 - src/Misc/Player.cs | 83 ++++++++++++------ src/Native/libmpv.cs | 6 +- src/Resources/input.conf.txt | 162 +++++++++++++++++------------------ 8 files changed, 147 insertions(+), 115 deletions(-) diff --git a/docs/Changelog.md b/docs/Changelog.md index 77c9c63..563a45a 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -1,4 +1,5 @@ +- Command messages are dispatched with `script-message-to mpvnet`. - New feature to change profile using the command palette. - New show-santa-logo (green and grumpy) option. - New quick bookmark feature, see manual. diff --git a/docs/Manual.md b/docs/Manual.md index 707be71..64f000d 100644 --- a/docs/Manual.md +++ b/docs/Manual.md @@ -221,7 +221,7 @@ A common task for the terminal is debugging scripts. mpv.net specific commands ------------------------- -`script-message mpv.net ` +`script-message-to mpvnet ` mpv.net commands are used when mpv commands don't exist or lack a feature. diff --git a/src/Misc/Commands.cs b/src/Misc/Commands.cs index eed3815..b00964b 100644 --- a/src/Misc/Commands.cs +++ b/src/Misc/Commands.cs @@ -67,8 +67,6 @@ namespace mpvnet case "show-subtitle-tracks": ShowSubtitleTracks(); break; case "show-text": ShowText(args[0], Convert.ToInt32(args[1]), Convert.ToInt32(args[2])); break; case "window-scale": WindowScale(float.Parse(args[0], CultureInfo.InvariantCulture)); break; - - default: Terminal.WriteError($"No command '{id}' found, reset input.conf by deleting it."); break; } } diff --git a/src/Misc/MainForm.cs b/src/Misc/MainForm.cs index 5bbc89e..ff3adab 100644 --- a/src/Misc/MainForm.cs +++ b/src/Misc/MainForm.cs @@ -656,10 +656,9 @@ namespace mpvnet public void BuildMenu() { - string content = File.ReadAllText(Core.InputConfPath); - var items = CommandItem.GetItems(content); + var items = CommandItem.GetItems(Core.InputConfContent); - if (!content.Contains("#menu:")) + if (!Core.InputConfContent.Contains("#menu:")) { var defaultItems = CommandItem.GetItems(Properties.Resources.input_conf); diff --git a/src/Misc/Misc.cs b/src/Misc/Misc.cs index 6349b8c..dd4f514 100644 --- a/src/Misc/Misc.cs +++ b/src/Misc/Misc.cs @@ -227,7 +227,6 @@ namespace mpvnet get { if (_Items is null) _Items = GetItems(File.ReadAllText(Core.InputConfPath)); - return _Items; } } diff --git a/src/Misc/Player.cs b/src/Misc/Player.cs index 496f0bc..257cfba 100644 --- a/src/Misc/Player.cs +++ b/src/Misc/Player.cs @@ -72,6 +72,7 @@ namespace mpvnet public List> Chapters { get; set; } = new List>(); public List BluRayTitles { get; } = new List(); public IntPtr Handle { get; set; } + public IntPtr NamedHandle { get; set; } public Size VideoSize { get; set; } public TimeSpan Duration; @@ -114,13 +115,13 @@ namespace mpvnet Handle = mpv_create(); + mpv_request_log_messages(Handle, "no"); + + App.RunTask(() => MainEventLoop()); + if (Handle == IntPtr.Zero) throw new Exception("error mpv_create"); - mpv_request_log_messages(Handle, "terminal-default"); - - App.RunTask(() => EventLoop()); - if (App.IsTerminalAttached) { SetPropertyString("terminal", "yes"); @@ -152,6 +153,15 @@ namespace mpvnet string idle = GetPropertyString("idle"); App.Exit = idle == "no" || idle == "once"; + NamedHandle = mpv_create_client(Handle, "mpvnet"); + + if (NamedHandle == IntPtr.Zero) + throw new Exception("mpv_create_client error"); + + mpv_request_log_messages(NamedHandle, "terminal-default"); + + App.RunTask(() => EventLoop()); + // otherwise shutdown is raised before media files are loaded, // this means Lua scripts that use idle might not work correctly SetPropertyString("idle", "yes"); @@ -260,6 +270,26 @@ namespace mpvnet AutofitLarger = 1; } + bool? _UseNewMsgModel; + + public bool UseNewMsgModel { + get { + if (!_UseNewMsgModel.HasValue) + _UseNewMsgModel = InputConfContent.Contains("script-message-to mpvnet"); + return _UseNewMsgModel.Value; + } + } + + string _InputConfContent; + + public string InputConfContent { + get { + if (_InputConfContent == null) + _InputConfContent = File.ReadAllText(Core.InputConfPath); + return _InputConfContent; + } + } + string _ConfigFolder; public string ConfigFolder { @@ -417,11 +447,17 @@ namespace mpvnet } } + public void MainEventLoop() + { + while (true) + mpv_wait_event(Handle, -1); + } + public void EventLoop() { while (true) { - IntPtr ptr = mpv_wait_event(Handle, -1); + IntPtr ptr = mpv_wait_event(NamedHandle, -1); mpv_event evt = (mpv_event)Marshal.PtrToStructure(ptr, typeof(mpv_event)); try @@ -459,14 +495,13 @@ namespace mpvnet var data = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message)); string[] args = ConvertFromUtf8Strings(data.args, data.num_args); - if (args.Length > 1) - { - if (args[0] == "mpv.net") - App.RunTask(() => Commands.Execute(args[1], args.Skip(2).ToArray())); - - if (args[0] == "osc-idlelogo" && args[1] == "no") - HideLogo(); - } + if (UseNewMsgModel && args[0] != "mpv.net") + App.RunTask(() => Commands.Execute(args[0], args.Skip(1).ToArray())); + else if (args.Length > 1 && args[0] == "mpv.net") + App.RunTask(() => Commands.Execute(args[1], args.Skip(2).ToArray())); + + if (args.Length > 1 && args[0] == "osc-idlelogo" && args[1] == "no") + HideLogo(); InvokeAsync(ClientMessageAsync, args); ClientMessage?.Invoke(args); @@ -681,12 +716,6 @@ namespace mpvnet } } - void HideLogo() - { - Command("overlay-remove 0"); - IsLogoVisible = false; - } - public void Command(string command) { mpv_error err = mpv_command_string(Handle, command); @@ -903,7 +932,7 @@ namespace mpvnet { if (!IntPropChangeActions.ContainsKey(name)) { - mpv_error err = mpv_observe_property(Handle, 0, name, mpv_format.MPV_FORMAT_INT64); + mpv_error err = mpv_observe_property(NamedHandle, 0, name, mpv_format.MPV_FORMAT_INT64); if (err < 0) HandleError(err, $"error observing property: {name}"); @@ -922,7 +951,7 @@ namespace mpvnet { if (!DoublePropChangeActions.ContainsKey(name)) { - mpv_error err = mpv_observe_property(Handle, 0, name, mpv_format.MPV_FORMAT_DOUBLE); + mpv_error err = mpv_observe_property(NamedHandle, 0, name, mpv_format.MPV_FORMAT_DOUBLE); if (err < 0) HandleError(err, $"error observing property: {name}"); @@ -941,7 +970,7 @@ namespace mpvnet { if (!BoolPropChangeActions.ContainsKey(name)) { - mpv_error err = mpv_observe_property(Handle, 0, name, mpv_format.MPV_FORMAT_FLAG); + mpv_error err = mpv_observe_property(NamedHandle, 0, name, mpv_format.MPV_FORMAT_FLAG); if (err < 0) HandleError(err, $"error observing property: {name}"); @@ -960,7 +989,7 @@ namespace mpvnet { if (!StringPropChangeActions.ContainsKey(name)) { - mpv_error err = mpv_observe_property(Handle, 0, name, mpv_format.MPV_FORMAT_STRING); + mpv_error err = mpv_observe_property(NamedHandle, 0, name, mpv_format.MPV_FORMAT_STRING); if (err < 0) HandleError(err, $"error observing property: {name}"); @@ -979,7 +1008,7 @@ namespace mpvnet { if (!PropChangeActions.ContainsKey(name)) { - mpv_error err = mpv_observe_property(Handle, 0, name, mpv_format.MPV_FORMAT_NONE); + mpv_error err = mpv_observe_property(NamedHandle, 0, name, mpv_format.MPV_FORMAT_NONE); if (err < 0) HandleError(err, $"error observing property: {name}"); @@ -1337,6 +1366,12 @@ namespace mpvnet } } + void HideLogo() + { + Command("overlay-remove 0"); + IsLogoVisible = false; + } + string GetLanguage(string id) { foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) diff --git a/src/Native/libmpv.cs b/src/Native/libmpv.cs index ebcc131..422aeb0 100644 --- a/src/Native/libmpv.cs +++ b/src/Native/libmpv.cs @@ -8,6 +8,9 @@ public class libmpv [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr mpv_create(); + [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr mpv_create_client(IntPtr mpvHandle, [MarshalAs(UnmanagedType.LPUTF8Str)] string command); + [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] public static extern mpv_error mpv_initialize(IntPtr mpvHandle); @@ -26,9 +29,6 @@ public class libmpv [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr mpv_error_string(mpv_error error); - [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int mpv_terminate_destroy(IntPtr mpvHandle); - [DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)] public static extern mpv_error mpv_request_log_messages(IntPtr mpvHandle, [MarshalAs(UnmanagedType.LPUTF8Str)] string min_level); diff --git a/src/Resources/input.conf.txt b/src/Resources/input.conf.txt index 0cd612d..77622c5 100644 --- a/src/Resources/input.conf.txt +++ b/src/Resources/input.conf.txt @@ -1,28 +1,28 @@ # https://github.com/stax76/mpv.net/blob/master/docs/Manual.md#input-and-context-menu -o script-message mpv.net open-files #menu: Open > Open Files... -V script-message mpv.net open-clipboard #menu: Open > Open URL or file from clipboard -_ script-message mpv.net open-optical-media #menu: Open > Open DVD/Blu-ray Drive/Folder... -_ ignore #menu: Open > - -Alt+a script-message mpv.net load-audio #menu: Open > Load external audio files... -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... -_ ignore #menu: Open > - -_ ignore #menu: Open > Recent +o script-message-to mpvnet open-files #menu: Open > Open Files... +V script-message-to mpvnet open-clipboard #menu: Open > Open URL or file from clipboard +_ script-message-to mpvnet open-optical-media #menu: Open > Open DVD/Blu-ray Drive/Folder... +_ ignore #menu: Open > - +Alt+a script-message-to mpvnet load-audio #menu: Open > Load external audio files... +Alt+s script-message-to mpvnet load-sub #menu: Open > Load external subtitle files... +_ ignore #menu: Open > - +_ script-message-to mpvnet open-files append #menu: Open > Add files to playlist... +_ ignore #menu: Open > - +_ ignore #menu: Open > Recent -_ ignore #menu: - -Space script-message mpv.net play-pause #menu: Play/Pause -Ctrl+s stop #menu: Stop -_ ignore #menu: - -Enter cycle fullscreen #menu: Toggle Fullscreen +_ ignore #menu: - +Space script-message-to mpvnet play-pause #menu: Play/Pause +Ctrl+s stop #menu: Stop +_ ignore #menu: - +Enter cycle fullscreen #menu: Toggle Fullscreen -F11 script-message mpv.net playlist-add -1 #menu: Navigate > Previous File -F12 script-message mpv.net playlist-add 1 #menu: Navigate > Next File +F11 script-message-to mpvnet playlist-add -1 #menu: Navigate > Previous File +F12 script-message-to mpvnet playlist-add 1 #menu: Navigate > Next File _ ignore #menu: Navigate > - -Home script-message mpv.net playlist-first #menu: Navigate > First File -End script-message mpv.net playlist-last #menu: Navigate > Last File +Home script-message-to mpvnet playlist-first #menu: Navigate > First File +End script-message-to mpvnet playlist-last #menu: Navigate > Last File _ ignore #menu: Navigate > - PGUP add chapter 1 #menu: Navigate > Next Chapter PGDWN add chapter -1 #menu: Navigate > Previous Chapter @@ -73,7 +73,7 @@ d cycle deinterlace #menu: Video > Toggle Deinterlace a cycle-values video-aspect 16:9 4:3 2.35:1 -1 #menu: Video > Cycle Aspect Ratio Ctrl+r cycle-values video-rotate 90 180 270 0 #menu: Video > Rotate Video -KP7 script-message mpv.net cycle-audio #menu: Audio > Cycle/Next +KP7 script-message-to mpvnet cycle-audio #menu: Audio > Cycle/Next _ ignore #menu: Audio > - Ctrl+d add audio-delay 0.1 #menu: Audio > Delay +0.1 Ctrl+D add audio-delay -0.1 #menu: Audio > Delay -0.1 @@ -105,78 +105,78 @@ _ ignore #menu: Speed > - _ ignore #menu: Speed > - BS set speed 1 #menu: Speed > Reset -Alt++ script-message mpv.net scale-window 1.2 #menu: View > Zoom > Enlarge -Alt+- script-message mpv.net scale-window 0.8 #menu: View > Zoom > Shrink -_ ignore #menu: View > Zoom > - -Alt+0 script-message mpv.net window-scale 0.5 #menu: View > Zoom > 50 % -Alt+1 script-message mpv.net window-scale 1.0 #menu: View > Zoom > 100 % -Alt+2 script-message mpv.net window-scale 2.0 #menu: View > Zoom > 200 % -Alt+3 script-message mpv.net window-scale 3.0 #menu: View > Zoom > 300 % +Alt++ script-message-to mpvnet scale-window 1.2 #menu: View > Zoom > Enlarge +Alt+- script-message-to mpvnet scale-window 0.8 #menu: View > Zoom > Shrink +_ ignore #menu: View > Zoom > - +Alt+0 script-message-to mpvnet window-scale 0.5 #menu: View > Zoom > 50 % +Alt+1 script-message-to mpvnet window-scale 1.0 #menu: View > Zoom > 100 % +Alt+2 script-message-to mpvnet window-scale 2.0 #menu: View > Zoom > 200 % +Alt+3 script-message-to mpvnet window-scale 3.0 #menu: View > Zoom > 300 % -F8 script-message mpv.net show-playlist #menu: View > Show Playlist -Ctrl+p script-message mpv.net select-profile #menu: View > Show Profile Selection -Ctrl+P script-message mpv.net show-profiles #menu: View > Show Profiles -Ctrl+7 script-message mpv.net show-audio-tracks #menu: View > Show Audio Tracks -Ctrl+8 script-message mpv.net show-subtitle-tracks #menu: View > Show Subtitle Tracks -b cycle border #menu: View > Toggle Border -Ctrl+t cycle ontop #menu: View > Toggle On Top -t script-binding stats/display-stats-toggle #menu: View > Toggle Statistics -Del script-binding osc/visibility #menu: View > Toggle OSC Visibility -i script-message mpv.net show-info #menu: View > Show File/Stream Info -p show-progress #menu: View > Show Progress -F9 show-text ${track-list} 5000 #menu: View > Show Tracks -Ctrl+m script-message mpv.net show-media-info #menu: View > Show Media Info -Alt+r script-message mpv.net show-recent #menu: View > Show Recent +F8 script-message-to mpvnet show-playlist #menu: View > Show Playlist +Ctrl+p script-message-to mpvnet select-profile #menu: View > Show Profile Selection +Ctrl+P script-message-to mpvnet show-profiles #menu: View > Show Profiles +Ctrl+7 script-message-to mpvnet show-audio-tracks #menu: View > Show Audio Tracks +Ctrl+8 script-message-to mpvnet show-subtitle-tracks #menu: View > Show Subtitle Tracks +b cycle border #menu: View > Toggle Border +Ctrl+t cycle ontop #menu: View > Toggle On Top +t script-binding stats/display-stats-toggle #menu: View > Toggle Statistics +Del script-binding osc/visibility #menu: View > Toggle OSC Visibility +i script-message-to mpvnet show-info #menu: View > Show File/Stream Info +p show-progress #menu: View > Show Progress +F9 show-text ${track-list} 5000 #menu: View > Show Tracks +Ctrl+m script-message-to mpvnet show-media-info #menu: View > Show Media Info +Alt+r script-message-to mpvnet show-recent #menu: View > Show Recent -` script-binding console/enable #menu: View > Advanced > Show Console -_ script-message mpv.net show-audio-devices #menu: View > Advanced > Show Audio Devices -P script-message mpv.net show-properties #menu: View > Advanced > Show Properties -C script-message mpv.net show-commands #menu: View > Advanced > Show Commands -_ script-message mpv.net show-demuxers #menu: View > Advanced > Show Demuxers -_ script-message mpv.net show-decoders #menu: View > Advanced > Show Decoders -_ script-message mpv.net show-protocols #menu: View > Advanced > Show Protocols -_ script-message mpv.net show-keys #menu: View > Advanced > Show Keys +` script-binding console/enable #menu: View > Advanced > Show Console +_ script-message-to mpvnet show-audio-devices #menu: View > Advanced > Show Audio Devices +P script-message-to mpvnet show-properties #menu: View > Advanced > Show Properties +C script-message-to mpvnet show-commands #menu: View > Advanced > Show Commands +_ script-message-to mpvnet show-demuxers #menu: View > Advanced > Show Demuxers +_ script-message-to mpvnet show-decoders #menu: View > Advanced > Show Decoders +_ script-message-to mpvnet show-protocols #menu: View > Advanced > Show Protocols +_ script-message-to mpvnet show-keys #menu: View > Advanced > Show Keys -_ ignore #menu: Profile +_ ignore #menu: Profile -c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor -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 +c script-message-to mpvnet show-conf-editor #menu: Settings > Show Config Editor +Ctrl+i script-message-to mpvnet show-input-editor #menu: Settings > Show Input Editor +Ctrl+f script-message-to mpvnet open-conf-folder #menu: Settings > Open Config Folder -_ script-message mpv.net reg-file-assoc video #menu: Settings > Setup > Register video file associations -_ script-message mpv.net reg-file-assoc audio #menu: Settings > Setup > Register audio file associations -_ script-message mpv.net reg-file-assoc image #menu: Settings > Setup > Register image file associations -_ script-message mpv.net reg-file-assoc unreg #menu: Settings > Setup > Unregister file associations +_ script-message-to mpvnet reg-file-assoc video #menu: Settings > Setup > Register video file associations +_ script-message-to mpvnet reg-file-assoc audio #menu: Settings > Setup > Register audio file associations +_ script-message-to mpvnet reg-file-assoc image #menu: Settings > Setup > Register image file associations +_ script-message-to mpvnet reg-file-assoc unreg #menu: Settings > Setup > Unregister file associations -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 -_ playlist-shuffle #menu: Tools > Shuffle Playlist -Ctrl+h cycle-values hwdec auto no #menu: Tools > Toggle Hardware Decoding -Q quit-watch-later #menu: Tools > Exit Watch Later +h script-message-to mpvnet 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 +_ playlist-shuffle #menu: Tools > Shuffle Playlist +Ctrl+h cycle-values hwdec auto no #menu: Tools > Toggle Hardware Decoding +Q quit-watch-later #menu: Tools > Exit Watch Later -_ script-message mpv.net shell-execute https://mpv.io #menu: Help > Website mpv -_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net #menu: Help > Website mpv.net -_ ignore #menu: Help > - -_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Manual mpv -_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/docs/Manual.md #menu: Help > Manual mpv.net -_ ignore #menu: Help > - -_ script-message mpv.net show-about #menu: Help > About mpv.net +_ script-message-to mpvnet shell-execute https://mpv.io #menu: Help > Website mpv +_ script-message-to mpvnet shell-execute https://github.com/stax76/mpv.net #menu: Help > Website mpv.net +_ ignore #menu: Help > - +_ script-message-to mpvnet shell-execute https://mpv.io/manual/stable/ #menu: Help > Manual mpv +_ script-message-to mpvnet shell-execute https://github.com/stax76/mpv.net/blob/master/docs/Manual.md #menu: Help > Manual mpv.net +_ ignore #menu: Help > - +_ script-message-to mpvnet show-about #menu: Help > About mpv.net -F1 script-message mpv.net show-command-palette #menu: Command Palette -_ ignore #menu: - -Esc quit #menu: Exit +F1 script-message-to mpvnet show-command-palette #menu: Command Palette +_ ignore #menu: - +Esc quit #menu: Exit -MBTN_Right script-message mpv.net show-menu -6 script-message mpv.net show-progress -KP6 script-message mpv.net show-progress +MBTN_Right script-message-to mpvnet show-menu +6 script-message-to mpvnet show-progress +KP6 script-message-to mpvnet show-progress 9 ab-loop KP9 ab-loop -7 script-message mpv.net cycle-audio -Sharp script-message mpv.net cycle-audio -Ctrl+F11 script-message mpv.net playlist-add -10 -Ctrl+F12 script-message mpv.net playlist-add 10 -Alt+q script-message mpv.net quick-bookmark +7 script-message-to mpvnet cycle-audio +Sharp script-message-to mpvnet cycle-audio +Ctrl+F11 script-message-to mpvnet playlist-add -10 +Ctrl+F12 script-message-to mpvnet playlist-add 10 +Alt+q script-message-to mpvnet quick-bookmark 8 cycle sub j cycle sub q quit