Fix #426 external audio and subtitle tracks
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user