diff --git a/docs/Changelog.md b/docs/Changelog.md index 563a45a..b4ed0ce 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -1,4 +1,6 @@ +- External audio and subtitle tracks are shown in the menu and + command palette and can be cycled via keyboard. - 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. diff --git a/src/Misc/Commands.cs b/src/Misc/Commands.cs index b00964b..babed1d 100644 --- a/src/Misc/Commands.cs +++ b/src/Misc/Commands.cs @@ -303,8 +303,13 @@ namespace mpvnet public static void CycleAudio() { - MediaTrack[] audioTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray(); - int len = audioTracks.Length; + var tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray(); + var externalTracks = Core.GetExternalTracks().Where(track => track.Type == "a"); + + if (externalTracks.Count() > 0) + tracks = tracks.Concat(externalTracks).ToArray(); + + int len = tracks.Length; if (len < 1) { @@ -322,7 +327,7 @@ namespace mpvnet Core.CommandV("set", "aid", aid.ToString()); } - Core.CommandV("show-text", aid + "/" + len + ": " + audioTracks[aid - 1].Text.Substring(3), "5000"); + Core.CommandV("show-text", aid + "/" + len + ": " + tracks[aid - 1].Text.Substring(3), "5000"); } public static void ShowCommands() @@ -420,10 +425,13 @@ namespace mpvnet public static void ShowAudioTracks() => App.InvokeOnMainThread(() => { - MediaTrack[] tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray(); - int len = tracks.Length; + var tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray(); + var externalTracks = Core.GetExternalTracks().Where(track => track.Type == "a"); - if (len < 1) + if (externalTracks.Count() > 0) + tracks = tracks.Concat(externalTracks).ToArray(); + + if (tracks.Length < 1) { Core.CommandV("show-text", "No audio tracks"); return; @@ -440,7 +448,7 @@ namespace mpvnet Text = track.Text, Action = () => { Core.CommandV("set", "aid", track.ID.ToString()); - Core.CommandV("show-text", track.ID + "/" + len + ": " + + Core.CommandV("show-text", track.ID + "/" + tracks.Length + ": " + tracks[track.ID - 1].Text.Substring(3), "5000"); } }; @@ -455,10 +463,13 @@ namespace mpvnet public static void ShowSubtitleTracks() => App.InvokeOnMainThread(() => { - MediaTrack[] tracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray(); - int len = tracks.Length; + var tracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray(); + var externalTracks = Core.GetExternalTracks().Where(track => track.Type == "s"); - if (len < 1) + if (externalTracks.Count() > 0) + tracks = tracks.Concat(externalTracks).ToArray(); + + if (tracks.Length < 1) { Core.CommandV("show-text", "No subtitle tracks"); return; @@ -475,7 +486,7 @@ namespace mpvnet Text = track.Text, Action = () => { Core.CommandV("set", "sid", track.ID.ToString()); - Core.CommandV("show-text", track.ID + "/" + len + ": " + + Core.CommandV("show-text", track.ID + "/" + tracks.Length + ": " + tracks[track.ID - 1].Text.Substring(3), "5000"); } }; diff --git a/src/Misc/MainForm.cs b/src/Misc/MainForm.cs index ff3adab..6f9ac8a 100644 --- a/src/Misc/MainForm.cs +++ b/src/Misc/MainForm.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; -using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading; @@ -235,10 +234,24 @@ namespace mpvnet { trackMenuItem.Items.Clear(); - MediaTrack[] audTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray(); - MediaTrack[] subTracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray(); - MediaTrack[] vidTracks = Core.MediaTracks.Where(track => track.Type == "v").ToArray(); - MediaTrack[] ediTracks = Core.MediaTracks.Where(track => track.Type == "e").ToArray(); + var audTracks = Core.MediaTracks.Where(track => track.Type == "a"); + var subTracks = Core.MediaTracks.Where(track => track.Type == "s"); + var vidTracks = Core.MediaTracks.Where(track => track.Type == "v"); + var ediTracks = Core.MediaTracks.Where(track => track.Type == "e"); + + var externalTracks = Core.GetExternalTracks(); + + if (externalTracks.Count > 0) + { + var exAudTracks = externalTracks.Where(track => track.Type == "a"); + var exSubTracks = externalTracks.Where(track => track.Type == "s"); + + if (exAudTracks.Count() > 0) + audTracks = audTracks.Concat(exAudTracks); + + if (exSubTracks.Count() > 0) + subTracks = subTracks.Concat(exSubTracks); + } foreach (MediaTrack track in vidTracks) { @@ -248,7 +261,7 @@ namespace mpvnet trackMenuItem.Items.Add(mi); } - if (vidTracks.Length > 0) + if (vidTracks.Count() > 0) trackMenuItem.Items.Add(new WpfControls.Separator()); foreach (MediaTrack track in audTracks) @@ -259,7 +272,7 @@ namespace mpvnet trackMenuItem.Items.Add(mi); } - if (subTracks.Length > 0) + if (subTracks.Count() > 0) trackMenuItem.Items.Add(new WpfControls.Separator()); foreach (MediaTrack track in subTracks) @@ -270,7 +283,7 @@ namespace mpvnet trackMenuItem.Items.Add(mi); } - if (subTracks.Length > 0) + if (subTracks.Count() > 0) { var mi = new WpfControls.MenuItem() { Header = "S: No subtitles" }; mi.Click += (sender, args) => Core.CommandV("set", "sid", "no"); @@ -278,7 +291,7 @@ namespace mpvnet trackMenuItem.Items.Add(mi); } - if (ediTracks.Length > 0) + if (ediTracks.Count() > 0) trackMenuItem.Items.Add(new WpfControls.Separator()); foreach (MediaTrack track in ediTracks) diff --git a/src/Misc/Player.cs b/src/Misc/Player.cs index 257cfba..56f8981 100644 --- a/src/Misc/Player.cs +++ b/src/Misc/Player.cs @@ -1387,6 +1387,47 @@ namespace mpvnet public void RaiseShowMenu() => ShowMenu(); + public List GetExternalTracks() + { + List tracks = new List(); + int count = GetPropertyInt("track-list/count"); + + for (int i = 0; i < count; i++) + { + bool external = GetPropertyBool($"track-list/{i}/external"); + + if (external) + { + string type = GetPropertyString($"track-list/{i}/type"); + + if (type == "audio") + { + MediaTrack track = new MediaTrack(); + Add(track, GetLanguage(GetPropertyString($"track-list/{i}/lang"))); + Add(track, GetPropertyString($"track-list/{i}/codec").ToUpperEx()); + Add(track, GetPropertyInt($"track-list/{i}/audio-channels") + " channels"); + Add(track, "External"); + track.Text = "A: " + track.Text.Trim(' ', ','); + track.Type = "a"; + track.ID = GetPropertyInt($"track-list/{i}/id"); + tracks.Add(track); + } + else if (type == "sub") + { + MediaTrack track = new MediaTrack(); + Add(track, GetLanguage(GetPropertyString($"track-list/{i}/lang"))); + Add(track, "External"); + track.Text = "S: " + track.Text.Trim(' ', ','); + track.Type = "s"; + track.ID = GetPropertyInt($"track-list/{i}/id"); + tracks.Add(track); + } + } + } + + return tracks; + } + void ReadMetaData() { string path = GetPropertyString("path"); @@ -1555,12 +1596,12 @@ namespace mpvnet Chapters.Add(new KeyValuePair(text, time)); } } + } - void Add(MediaTrack track, object value) - { - if (value != null && !(track.Text != null && track.Text.Contains(value.ToString()))) - track.Text += " " + value + ","; - } + void Add(MediaTrack track, object value) + { + if (value != null && !(track.Text != null && track.Text.Contains(value.ToString()))) + track.Text += " " + value + ","; } private string[] _ProfileNames;