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`.
|
- Command messages are dispatched with `script-message-to mpvnet`.
|
||||||
- New feature to change profile using the command palette.
|
- New feature to change profile using the command palette.
|
||||||
- New show-santa-logo (green and grumpy) option.
|
- New show-santa-logo (green and grumpy) option.
|
||||||
|
|||||||
@@ -303,8 +303,13 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void CycleAudio()
|
public static void CycleAudio()
|
||||||
{
|
{
|
||||||
MediaTrack[] audioTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
var tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||||
int len = audioTracks.Length;
|
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)
|
if (len < 1)
|
||||||
{
|
{
|
||||||
@@ -322,7 +327,7 @@ namespace mpvnet
|
|||||||
Core.CommandV("set", "aid", aid.ToString());
|
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()
|
public static void ShowCommands()
|
||||||
@@ -420,10 +425,13 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void ShowAudioTracks() => App.InvokeOnMainThread(() =>
|
public static void ShowAudioTracks() => App.InvokeOnMainThread(() =>
|
||||||
{
|
{
|
||||||
MediaTrack[] tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
var tracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||||
int len = tracks.Length;
|
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");
|
Core.CommandV("show-text", "No audio tracks");
|
||||||
return;
|
return;
|
||||||
@@ -440,7 +448,7 @@ namespace mpvnet
|
|||||||
Text = track.Text,
|
Text = track.Text,
|
||||||
Action = () => {
|
Action = () => {
|
||||||
Core.CommandV("set", "aid", track.ID.ToString());
|
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");
|
tracks[track.ID - 1].Text.Substring(3), "5000");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -455,10 +463,13 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void ShowSubtitleTracks() => App.InvokeOnMainThread(() =>
|
public static void ShowSubtitleTracks() => App.InvokeOnMainThread(() =>
|
||||||
{
|
{
|
||||||
MediaTrack[] tracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
var tracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
||||||
int len = tracks.Length;
|
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");
|
Core.CommandV("show-text", "No subtitle tracks");
|
||||||
return;
|
return;
|
||||||
@@ -475,7 +486,7 @@ namespace mpvnet
|
|||||||
Text = track.Text,
|
Text = track.Text,
|
||||||
Action = () => {
|
Action = () => {
|
||||||
Core.CommandV("set", "sid", track.ID.ToString());
|
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");
|
tracks[track.ID - 1].Text.Substring(3), "5000");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -235,10 +234,24 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
trackMenuItem.Items.Clear();
|
trackMenuItem.Items.Clear();
|
||||||
|
|
||||||
MediaTrack[] audTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
var audTracks = Core.MediaTracks.Where(track => track.Type == "a");
|
||||||
MediaTrack[] subTracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
var subTracks = Core.MediaTracks.Where(track => track.Type == "s");
|
||||||
MediaTrack[] vidTracks = Core.MediaTracks.Where(track => track.Type == "v").ToArray();
|
var vidTracks = Core.MediaTracks.Where(track => track.Type == "v");
|
||||||
MediaTrack[] ediTracks = Core.MediaTracks.Where(track => track.Type == "e").ToArray();
|
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)
|
foreach (MediaTrack track in vidTracks)
|
||||||
{
|
{
|
||||||
@@ -248,7 +261,7 @@ namespace mpvnet
|
|||||||
trackMenuItem.Items.Add(mi);
|
trackMenuItem.Items.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vidTracks.Length > 0)
|
if (vidTracks.Count() > 0)
|
||||||
trackMenuItem.Items.Add(new WpfControls.Separator());
|
trackMenuItem.Items.Add(new WpfControls.Separator());
|
||||||
|
|
||||||
foreach (MediaTrack track in audTracks)
|
foreach (MediaTrack track in audTracks)
|
||||||
@@ -259,7 +272,7 @@ namespace mpvnet
|
|||||||
trackMenuItem.Items.Add(mi);
|
trackMenuItem.Items.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subTracks.Length > 0)
|
if (subTracks.Count() > 0)
|
||||||
trackMenuItem.Items.Add(new WpfControls.Separator());
|
trackMenuItem.Items.Add(new WpfControls.Separator());
|
||||||
|
|
||||||
foreach (MediaTrack track in subTracks)
|
foreach (MediaTrack track in subTracks)
|
||||||
@@ -270,7 +283,7 @@ namespace mpvnet
|
|||||||
trackMenuItem.Items.Add(mi);
|
trackMenuItem.Items.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subTracks.Length > 0)
|
if (subTracks.Count() > 0)
|
||||||
{
|
{
|
||||||
var mi = new WpfControls.MenuItem() { Header = "S: No subtitles" };
|
var mi = new WpfControls.MenuItem() { Header = "S: No subtitles" };
|
||||||
mi.Click += (sender, args) => Core.CommandV("set", "sid", "no");
|
mi.Click += (sender, args) => Core.CommandV("set", "sid", "no");
|
||||||
@@ -278,7 +291,7 @@ namespace mpvnet
|
|||||||
trackMenuItem.Items.Add(mi);
|
trackMenuItem.Items.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ediTracks.Length > 0)
|
if (ediTracks.Count() > 0)
|
||||||
trackMenuItem.Items.Add(new WpfControls.Separator());
|
trackMenuItem.Items.Add(new WpfControls.Separator());
|
||||||
|
|
||||||
foreach (MediaTrack track in ediTracks)
|
foreach (MediaTrack track in ediTracks)
|
||||||
|
|||||||
@@ -1387,6 +1387,47 @@ namespace mpvnet
|
|||||||
|
|
||||||
public void RaiseShowMenu() => ShowMenu();
|
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()
|
void ReadMetaData()
|
||||||
{
|
{
|
||||||
string path = GetPropertyString("path");
|
string path = GetPropertyString("path");
|
||||||
@@ -1555,12 +1596,12 @@ namespace mpvnet
|
|||||||
Chapters.Add(new KeyValuePair<string, double>(text, time));
|
Chapters.Add(new KeyValuePair<string, double>(text, time));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Add(MediaTrack track, object value)
|
void Add(MediaTrack track, object value)
|
||||||
{
|
{
|
||||||
if (value != null && !(track.Text != null && track.Text.Contains(value.ToString())))
|
if (value != null && !(track.Text != null && track.Text.Contains(value.ToString())))
|
||||||
track.Text += " " + value + ",";
|
track.Text += " " + value + ",";
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string[] _ProfileNames;
|
private string[] _ProfileNames;
|
||||||
|
|||||||
Reference in New Issue
Block a user