Fix #426 external audio and subtitle tracks

This commit is contained in:
stax76
2022-05-27 14:07:04 +02:00
parent 7e4ea640cf
commit c78719c3bf
4 changed files with 92 additions and 25 deletions

View File

@@ -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.

View File

@@ -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");
}
};

View File

@@ -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)

View File

@@ -1387,6 +1387,47 @@ namespace mpvnet
public void RaiseShowMenu() => ShowMenu();
public List<MediaTrack> GetExternalTracks()
{
List<MediaTrack> tracks = new List<MediaTrack>();
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<string, double>(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;