-
This commit is contained in:
@@ -70,6 +70,7 @@ namespace mpvnet
|
||||
public Dictionary<string, List<Action<string>>> StringPropChangeActions { get; set; } = new Dictionary<string, List<Action<string>>>();
|
||||
|
||||
public List<MediaTrack> MediaTracks { get; set; } = new List<MediaTrack>();
|
||||
public object MediaTracksLock { get; } = new object();
|
||||
public List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
||||
public List<TimeSpan> BluRayTitles { get; } = new List<TimeSpan>();
|
||||
public IntPtr Handle { get; set; }
|
||||
@@ -541,8 +542,7 @@ namespace mpvnet
|
||||
VideoSizeAutoResetEvent.Set();
|
||||
}
|
||||
|
||||
if (App.MediaInfo)
|
||||
App.RunTask(new Action(() => UpdateTrackDataUsingMediaInfo()));
|
||||
App.RunTask(new Action(() => UpdateTracks()));
|
||||
|
||||
App.RunTask(new Action(() => {
|
||||
if (path.Contains("://"))
|
||||
@@ -1377,10 +1377,31 @@ namespace mpvnet
|
||||
string GetLanguage(string id)
|
||||
{
|
||||
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.NeutralCultures))
|
||||
if (ci.ThreeLetterISOLanguageName == id)
|
||||
if (ci.ThreeLetterISOLanguageName == id || Convert(ci.ThreeLetterISOLanguageName) == id)
|
||||
return ci.EnglishName;
|
||||
|
||||
return id;
|
||||
|
||||
string Convert(string id2)
|
||||
{
|
||||
switch (id2)
|
||||
{
|
||||
case "bng": return "ben";
|
||||
case "ces": return "cze";
|
||||
case "deu": return "ger";
|
||||
case "ell": return "gre";
|
||||
case "eus": return "baq";
|
||||
case "fra": return "fre";
|
||||
case "hye": return "arm";
|
||||
case "isl": return "ice";
|
||||
case "kat": return "geo";
|
||||
case "mya": return "bur";
|
||||
case "nld": return "dut";
|
||||
case "sqi": return "alb";
|
||||
case "zho": return "chi";
|
||||
default: return id2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RaiseScaleWindow(float value) => ScaleWindow(value);
|
||||
@@ -1389,54 +1410,7 @@ 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");
|
||||
string filename = GetPropertyString($"filename/no-ext");
|
||||
string title = GetPropertyString($"track-list/{i}/title").Replace(filename, "");
|
||||
title = Regex.Replace(title, @"^[\._\-]", "").Replace("_", "__");
|
||||
|
||||
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");
|
||||
Add(track, title);
|
||||
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, GetPropertyString($"track-list/{i}/codec").ToUpperEx());
|
||||
Add(track, "External");
|
||||
Add(track, title);
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
tracks.Add(track);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public void UpdateTrackData()
|
||||
public void UpdateTracks()
|
||||
{
|
||||
string path = GetPropertyString("path");
|
||||
|
||||
@@ -1444,64 +1418,118 @@ namespace mpvnet
|
||||
lock (BluRayTitles)
|
||||
BluRayTitles.Clear();
|
||||
|
||||
lock (MediaTracks)
|
||||
lock (MediaTracksLock)
|
||||
{
|
||||
MediaTracks.Clear();
|
||||
if (App.MediaInfo && !path.Contains("://") && !path.Contains(@"\\.\pipe\") && File.Exists(path))
|
||||
MediaTracks = GetMediaInfoTracks(path);
|
||||
else
|
||||
MediaTracks = GetTracks();
|
||||
}
|
||||
|
||||
int trackListCount = GetPropertyInt("track-list/count");
|
||||
lock (Chapters)
|
||||
{
|
||||
Chapters.Clear();
|
||||
int count = GetPropertyInt("chapter-list/count");
|
||||
|
||||
for (int i = 0; i < trackListCount; i++)
|
||||
for (int x = 0; x < count; x++)
|
||||
{
|
||||
string type = GetPropertyString($"track-list/{i}/type");
|
||||
string filename = GetPropertyString($"filename/no-ext");
|
||||
string title = GetPropertyString($"track-list/{i}/title").Replace(filename, "");
|
||||
|
||||
title = Regex.Replace(title, @"^[\._\-]", "").Replace("_", "__");
|
||||
string text = GetPropertyString($"chapter-list/{x}/title");
|
||||
double time = GetPropertyDouble($"chapter-list/{x}/time");
|
||||
|
||||
if (type == "video")
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, GetPropertyString($"track-list/{i}/codec").ToUpperEx());
|
||||
Add(track, GetPropertyString($"track-list/{i}/demux-w") + "x" + GetPropertyString($"track-list/{i}/demux-h"));
|
||||
Add(track, GetPropertyString($"track-list/{i}/demux-fps").Replace(".000000", "") + " FPS");
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "v";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
else 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, GetPropertyInt($"track-list/{i}/demux-samplerate") + " Hz");
|
||||
Add(track, GetPropertyBool($"track-list/{i}/forced") ? "Forced" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/external") ? "External" : null);
|
||||
Add(track, title);
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
else if (type == "sub")
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, GetLanguage(GetPropertyString($"track-list/{i}/lang")));
|
||||
Add(track, GetPropertyString($"track-list/{i}/codec").ToUpperEx());
|
||||
Add(track, GetPropertyBool($"track-list/{i}/forced") ? "Forced" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/external") ? "External" : null);
|
||||
Add(track, title);
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
if (string.IsNullOrEmpty(text))
|
||||
text = "Chapter " + (x + 1);
|
||||
|
||||
Chapters.Add(new KeyValuePair<string, double>(text, time));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateExternalTracks()
|
||||
{
|
||||
int trackCount = GetPropertyInt("track-list/count");
|
||||
int editionCount = GetPropertyInt("edition-list/count");
|
||||
|
||||
lock (MediaTracksLock)
|
||||
{
|
||||
if (MediaTracks.Count != (trackCount + editionCount))
|
||||
{
|
||||
MediaTracks = MediaTracks.Where(i => !i.External).ToList();
|
||||
MediaTracks.AddRange(GetTracks(false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<MediaTrack> GetTracks(bool includeInternal = true, bool includeExternal = true)
|
||||
{
|
||||
List<MediaTrack> tracks = new List<MediaTrack>();
|
||||
|
||||
int trackCount = GetPropertyInt("track-list/count");
|
||||
|
||||
for (int i = 0; i < trackCount; i++)
|
||||
{
|
||||
bool external = GetPropertyBool($"track-list/{i}/external");
|
||||
|
||||
if ((external && !includeExternal) || (!external && !includeInternal))
|
||||
continue;
|
||||
|
||||
string type = GetPropertyString($"track-list/{i}/type");
|
||||
string filename = GetPropertyString($"filename/no-ext");
|
||||
string title = GetPropertyString($"track-list/{i}/title").Replace(filename, "");
|
||||
|
||||
title = Regex.Replace(title, @"^[\._\-]", "").Replace("_", "__");
|
||||
|
||||
if (type == "video")
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, GetPropertyString($"track-list/{i}/codec").ToUpperEx());
|
||||
Add(track, GetPropertyString($"track-list/{i}/demux-w") + "x" + GetPropertyString($"track-list/{i}/demux-h"));
|
||||
Add(track, GetPropertyString($"track-list/{i}/demux-fps").Replace(".000000", "") + " FPS");
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "v";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
tracks.Add(track);
|
||||
}
|
||||
else 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, GetPropertyInt($"track-list/{i}/demux-samplerate") + " Hz");
|
||||
Add(track, GetPropertyBool($"track-list/{i}/forced") ? "Forced" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/external") ? "External" : null);
|
||||
Add(track, title);
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
track.External = external;
|
||||
tracks.Add(track);
|
||||
}
|
||||
else if (type == "sub")
|
||||
{
|
||||
string codec = GetPropertyString($"track-list/{i}/codec");
|
||||
if (codec == "hdmv_pgs_subtitle")
|
||||
codec = "pgs";
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, GetLanguage(GetPropertyString($"track-list/{i}/lang")));
|
||||
Add(track, codec.ToUpperEx());
|
||||
Add(track, GetPropertyBool($"track-list/{i}/forced") ? "Forced" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/default") ? "Default" : null);
|
||||
Add(track, GetPropertyBool($"track-list/{i}/external") ? "External" : null);
|
||||
Add(track, title);
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
track.External = external;
|
||||
tracks.Add(track);
|
||||
Debug.WriteLine(GetPropertyString($"track-list/{i}/codec"));
|
||||
}
|
||||
}
|
||||
|
||||
if (includeInternal)
|
||||
{
|
||||
int editionCount = GetPropertyInt("edition-list/count");
|
||||
|
||||
for (int i = 0; i < editionCount; i++)
|
||||
@@ -1513,164 +1541,91 @@ namespace mpvnet
|
||||
track.Text = "E: " + title;
|
||||
track.Type = "e";
|
||||
track.ID = i;
|
||||
MediaTracks.Add(track);
|
||||
tracks.Add(track);
|
||||
}
|
||||
}
|
||||
|
||||
lock (Chapters)
|
||||
{
|
||||
Chapters.Clear();
|
||||
int count = GetPropertyInt("chapter-list/count");
|
||||
|
||||
for (int x = 0; x < count; x++)
|
||||
{
|
||||
string text = GetPropertyString($"chapter-list/{x}/title");
|
||||
double time = GetPropertyDouble($"chapter-list/{x}/time");
|
||||
|
||||
if (string.IsNullOrEmpty(text))
|
||||
text = "Chapter " + (x + 1);
|
||||
|
||||
Chapters.Add(new KeyValuePair<string, double>(text, time));
|
||||
}
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public void UpdateTrackDataUsingMediaInfo()
|
||||
public List<MediaTrack> GetMediaInfoTracks(string path)
|
||||
{
|
||||
string path = GetPropertyString("path");
|
||||
List<MediaTrack> tracks = new List<MediaTrack>();
|
||||
|
||||
if (!path.ToLowerEx().StartsWithEx("bd://"))
|
||||
lock (BluRayTitles)
|
||||
BluRayTitles.Clear();
|
||||
|
||||
lock (MediaTracks)
|
||||
using (MediaInfo mi = new MediaInfo(path))
|
||||
{
|
||||
MediaTracks.Clear();
|
||||
int videoCount = mi.GetCount(MediaInfoStreamKind.Video);
|
||||
|
||||
if (path.ToLowerEx().Contains("://"))
|
||||
for (int i = 0; i < videoCount; i++)
|
||||
{
|
||||
int trackListCount = GetPropertyInt("track-list/count");
|
||||
|
||||
for (int i = 0; i < trackListCount; i++)
|
||||
{
|
||||
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");
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
else if (type == "sub")
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, GetLanguage(GetPropertyString($"track-list/{i}/lang")));
|
||||
Add(track, GetPropertyString($"track-list/{i}/codec").ToUpperEx());
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = GetPropertyInt($"track-list/{i}/id");
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
}
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetVideo(i, "Format"));
|
||||
Add(track, mi.GetVideo(i, "Format_Profile"));
|
||||
Add(track, mi.GetVideo(i, "Width") + "x" + mi.GetVideo(i, "Height"));
|
||||
Add(track, mi.GetVideo(i, "FrameRate") + " FPS");
|
||||
Add(track, mi.GetVideo(i, "Language/String"));
|
||||
Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetVideo(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetVideo(i, "Title"));
|
||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "v";
|
||||
track.ID = i + 1;
|
||||
tracks.Add(track);
|
||||
}
|
||||
else if (File.Exists(path) && !path.Contains(@"\\.\pipe\"))
|
||||
|
||||
int audioCount = mi.GetCount(MediaInfoStreamKind.Audio);
|
||||
|
||||
for (int i = 0; i < audioCount; i++)
|
||||
{
|
||||
using (MediaInfo mi = new MediaInfo(path))
|
||||
{
|
||||
int videoCount = mi.GetCount(MediaInfoStreamKind.Video);
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetAudio(i, "Language/String"));
|
||||
Add(track, mi.GetAudio(i, "Format"));
|
||||
Add(track, mi.GetAudio(i, "Format_Profile"));
|
||||
Add(track, mi.GetAudio(i, "BitRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Channel(s)/String"));
|
||||
Add(track, mi.GetAudio(i, "SamplingRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetAudio(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetAudio(i, "Title"));
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = i + 1;
|
||||
tracks.Add(track);
|
||||
}
|
||||
|
||||
for (int i = 0; i < videoCount; i++)
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetVideo(i, "Format"));
|
||||
Add(track, mi.GetVideo(i, "Format_Profile"));
|
||||
Add(track, mi.GetVideo(i, "Width") + "x" + mi.GetVideo(i, "Height"));
|
||||
Add(track, mi.GetVideo(i, "FrameRate") + " FPS");
|
||||
Add(track, mi.GetVideo(i, "Language/String"));
|
||||
Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetVideo(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetVideo(i, "Title"));
|
||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "v";
|
||||
track.ID = i + 1;
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
int subCount = mi.GetCount(MediaInfoStreamKind.Text);
|
||||
|
||||
int audioCount = mi.GetCount(MediaInfoStreamKind.Audio);
|
||||
|
||||
for (int i = 0; i < audioCount; i++)
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetAudio(i, "Language/String"));
|
||||
Add(track, mi.GetAudio(i, "Format"));
|
||||
Add(track, mi.GetAudio(i, "Format_Profile"));
|
||||
Add(track, mi.GetAudio(i, "BitRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Channel(s)/String"));
|
||||
Add(track, mi.GetAudio(i, "SamplingRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetAudio(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetAudio(i, "Title"));
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = i + 1;
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
|
||||
int subCount = mi.GetCount(MediaInfoStreamKind.Text);
|
||||
|
||||
for (int i = 0; i < subCount; i++)
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetText(i, "Language/String"));
|
||||
Add(track, mi.GetText(i, "Format"));
|
||||
Add(track, mi.GetText(i, "Format_Profile"));
|
||||
Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetText(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetText(i, "Title"));
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = i + 1;
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
|
||||
int editionCount = GetPropertyInt("edition-list/count");
|
||||
|
||||
for (int i = 0; i < editionCount; i++)
|
||||
{
|
||||
string title = GetPropertyString($"edition-list/{i}/title");
|
||||
if (string.IsNullOrEmpty(title))
|
||||
title = "Edition " + i;
|
||||
MediaTrack track = new MediaTrack();
|
||||
track.Text = "E: " + title;
|
||||
track.Type = "e";
|
||||
track.ID = i;
|
||||
MediaTracks.Add(track);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < subCount; i++)
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetText(i, "Language/String"));
|
||||
Add(track, mi.GetText(i, "Format"));
|
||||
Add(track, mi.GetText(i, "Format_Profile"));
|
||||
Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, mi.GetText(i, "Default") == "Yes" ? "Default" : "");
|
||||
Add(track, mi.GetText(i, "Title"));
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = i + 1;
|
||||
tracks.Add(track);
|
||||
}
|
||||
}
|
||||
|
||||
lock (Chapters)
|
||||
int editionCount = GetPropertyInt("edition-list/count");
|
||||
|
||||
for (int i = 0; i < editionCount; i++)
|
||||
{
|
||||
Chapters.Clear();
|
||||
int count = GetPropertyInt("chapter-list/count");
|
||||
|
||||
for (int x = 0; x < count; x++)
|
||||
{
|
||||
string text = GetPropertyString($"chapter-list/{x}/title");
|
||||
double time = GetPropertyDouble($"chapter-list/{x}/time");
|
||||
|
||||
if (string.IsNullOrEmpty(text))
|
||||
text = "Chapter " + (x + 1);
|
||||
|
||||
Chapters.Add(new KeyValuePair<string, double>(text, time));
|
||||
}
|
||||
string title = GetPropertyString($"edition-list/{i}/title");
|
||||
if (string.IsNullOrEmpty(title))
|
||||
title = "Edition " + i;
|
||||
MediaTrack track = new MediaTrack();
|
||||
track.Text = "E: " + title;
|
||||
track.Type = "e";
|
||||
track.ID = i;
|
||||
tracks.Add(track);
|
||||
}
|
||||
|
||||
return tracks;
|
||||
}
|
||||
|
||||
void Add(MediaTrack track, object value)
|
||||
|
||||
Reference in New Issue
Block a user