|
@@ -19,7 +19,7 @@ namespace FNZCM.ConHost.Ver2
|
|
//0. start http server
|
|
//0. start http server
|
|
//1. scan libraries and fill data struct
|
|
//1. scan libraries and fill data struct
|
|
// libs
|
|
// libs
|
|
- // albums
|
|
|
|
|
|
+ // disc
|
|
// Tracks(FLAC / AAC_*)
|
|
// Tracks(FLAC / AAC_*)
|
|
// Meta(title(artist) / duration)
|
|
// Meta(title(artist) / duration)
|
|
// FSI ( size )
|
|
// FSI ( size )
|
|
@@ -77,22 +77,22 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
var libPath = kvpLib.Key.ToLower();
|
|
var libPath = kvpLib.Key.ToLower();
|
|
var lib = Libraries[libPath] = new Library2(kvpLib.Key);
|
|
var lib = Libraries[libPath] = new Library2(kvpLib.Key);
|
|
- var albDirArray = Directory.GetDirectories(kvpLib.Value);
|
|
|
|
|
|
+ var discDirArray = Directory.GetDirectories(kvpLib.Value);
|
|
|
|
|
|
- foreach (var albDir in albDirArray)
|
|
|
|
|
|
+ foreach (var discDir in discDirArray)
|
|
{
|
|
{
|
|
if (_isRunning == false) throw new OperationCanceledException();
|
|
if (_isRunning == false) throw new OperationCanceledException();
|
|
|
|
|
|
- Console.WriteLine($" Disc {albDir}");
|
|
|
|
|
|
+ Console.WriteLine($" Disc {discDir}");
|
|
|
|
|
|
- var albName = Path.GetFileName(albDir);
|
|
|
|
- var albPath = albName.ToLower();
|
|
|
|
- var alb = lib.Discs[albPath] = new Disc(albName);
|
|
|
|
|
|
+ var discName = Path.GetFileName(discDir);
|
|
|
|
+ var discPath = discName.ToLower();
|
|
|
|
+ var disc = lib.Discs[discPath] = new Disc(discName);
|
|
|
|
|
|
- var coverFilePath = Path.Combine(albDir, "cover.jpg");
|
|
|
|
- if (File.Exists(coverFilePath)) PathMapping[$"/cover/{libPath}/{albPath}/cover.jpg"] = coverFilePath;
|
|
|
|
|
|
+ var coverFilePath = Path.Combine(discDir, "cover.jpg");
|
|
|
|
+ if (File.Exists(coverFilePath)) PathMapping[$"/cover/{libPath}/{discPath}/cover.jpg"] = coverFilePath;
|
|
|
|
|
|
- var bkDir = Path.Combine(albDir, "bk");
|
|
|
|
|
|
+ var bkDir = Path.Combine(discDir, "bk");
|
|
if (Directory.Exists(bkDir))
|
|
if (Directory.Exists(bkDir))
|
|
{
|
|
{
|
|
var bkFiles = FileSystem.GetFiles(bkDir, SearchOption.SearchTopLevelOnly, ConfigFile.Instance.BkFilePattern);
|
|
var bkFiles = FileSystem.GetFiles(bkDir, SearchOption.SearchTopLevelOnly, ConfigFile.Instance.BkFilePattern);
|
|
@@ -100,29 +100,29 @@ namespace FNZCM.ConHost.Ver2
|
|
{
|
|
{
|
|
var bkName = Path.GetFileName(file);
|
|
var bkName = Path.GetFileName(file);
|
|
var bkPath = bkName.ToLower();
|
|
var bkPath = bkName.ToLower();
|
|
- alb.Bks[bkPath] = bkName;
|
|
|
|
|
|
+ disc.Bks[bkPath] = bkName;
|
|
|
|
|
|
- PathMapping[$"/bk/{libPath}/{albPath}/{bkPath}"] = file;
|
|
|
|
|
|
+ PathMapping[$"/bk/{libPath}/{discPath}/{bkPath}"] = file;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- var mainTrackFiles = FileSystem.GetFiles(albDir, SearchOption.SearchTopLevelOnly, ConfigFile.Instance.MediaFilePattern);
|
|
|
|
|
|
+ var mainTrackFiles = FileSystem.GetFiles(discDir, SearchOption.SearchTopLevelOnly, ConfigFile.Instance.MediaFilePattern);
|
|
|
|
|
|
foreach (var mainTrackFile in mainTrackFiles)
|
|
foreach (var mainTrackFile in mainTrackFiles)
|
|
{
|
|
{
|
|
var trackName = Path.GetFileName(mainTrackFile);
|
|
var trackName = Path.GetFileName(mainTrackFile);
|
|
var trackPath = trackName.ToLower();
|
|
var trackPath = trackName.ToLower();
|
|
- alb.MainTracks[trackPath] = trackName;
|
|
|
|
|
|
+ disc.MainTracks[trackPath] = trackName;
|
|
|
|
|
|
- PathMapping[$"/media/{libPath}/{albPath}/{trackPath}"] = mainTrackFile;
|
|
|
|
|
|
+ PathMapping[$"/media/{libPath}/{discPath}/{trackPath}"] = mainTrackFile;
|
|
}
|
|
}
|
|
|
|
|
|
- var aacTrackDirArray = Directory.GetDirectories(albDir, "AAC_Q*");
|
|
|
|
|
|
+ var aacTrackDirArray = Directory.GetDirectories(discDir, "AAC_Q*");
|
|
foreach (var aacTrackDir in aacTrackDirArray)
|
|
foreach (var aacTrackDir in aacTrackDirArray)
|
|
{
|
|
{
|
|
var aacTrackSetName = Path.GetFileName(aacTrackDir);
|
|
var aacTrackSetName = Path.GetFileName(aacTrackDir);
|
|
var aacTrackSetPath = aacTrackSetName.ToLower();
|
|
var aacTrackSetPath = aacTrackSetName.ToLower();
|
|
- var aacTrackSet = alb.SubTracks[aacTrackSetPath] = new TrackSet(aacTrackSetName);
|
|
|
|
|
|
+ var aacTrackSet = disc.SubTracks[aacTrackSetPath] = new TrackSet(aacTrackSetName);
|
|
|
|
|
|
foreach (var file in Directory.GetFiles(aacTrackDir, "*.m4a"))
|
|
foreach (var file in Directory.GetFiles(aacTrackDir, "*.m4a"))
|
|
{
|
|
{
|
|
@@ -130,7 +130,7 @@ namespace FNZCM.ConHost.Ver2
|
|
var aacTrackPath = aacTrackName.ToLower();
|
|
var aacTrackPath = aacTrackName.ToLower();
|
|
aacTrackSet.Tracks[aacTrackPath] = aacTrackName;
|
|
aacTrackSet.Tracks[aacTrackPath] = aacTrackName;
|
|
|
|
|
|
- PathMapping[$"/media/{libPath}/{albPath}/{aacTrackSetPath}/{aacTrackPath}"] = file;
|
|
|
|
|
|
+ PathMapping[$"/media/{libPath}/{discPath}/{aacTrackSetPath}/{aacTrackPath}"] = file;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -209,8 +209,8 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
// GET / show all libraries
|
|
// GET / show all libraries
|
|
|
|
|
|
- // foo=library bar=album
|
|
|
|
- // GET /list/foo/ show all album and cover with name, provide m3u path
|
|
|
|
|
|
+ // foo=library bar=disc
|
|
|
|
+ // GET /list/foo/ show all disc and cover with name, provide m3u path
|
|
// GET /list/foo/bar/bk/ list all picture as grid
|
|
// GET /list/foo/bar/bk/ list all picture as grid
|
|
// GET /list/foo/bar/tracks/ list all tracks as text list
|
|
// GET /list/foo/bar/tracks/ list all tracks as text list
|
|
|
|
|
|
@@ -388,9 +388,9 @@ namespace FNZCM.ConHost.Ver2
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "tracks")
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "tracks")
|
|
{
|
|
{
|
|
var libName = pathParts[1];
|
|
var libName = pathParts[1];
|
|
- var albPath = pathParts[2];
|
|
|
|
|
|
+ var discPath = pathParts[2];
|
|
|
|
|
|
- if (Libraries.TryGetValue(libName, out var l) && l.Discs.TryGetValue(albPath, out var alb))
|
|
|
|
|
|
+ if (Libraries.TryGetValue(libName, out var l) && l.Discs.TryGetValue(discPath, out var disc))
|
|
{
|
|
{
|
|
var sb = new StringBuilder();
|
|
var sb = new StringBuilder();
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
@@ -398,19 +398,19 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
if (_isLoading) sb.Append("<h4 style=position:fixed;right:0px;top:0px;margin:0>Still Loading...</h4>");
|
|
if (_isLoading) sb.Append("<h4 style=position:fixed;right:0px;top:0px;margin:0>Still Loading...</h4>");
|
|
|
|
|
|
- sb.Append($"<h2>Tracks of</h2><h1>{alb.Name}</h1>");
|
|
|
|
|
|
+ sb.Append($"<h2>Tracks of</h2><h1>{disc.Name}</h1>");
|
|
sb.Append($"<div><a href='/list/{libName.FuckVlcAndEscape()}/'>Back to library</a></div>");
|
|
sb.Append($"<div><a href='/list/{libName.FuckVlcAndEscape()}/'>Back to library</a></div>");
|
|
|
|
|
|
var durTotal = 0;
|
|
var durTotal = 0;
|
|
var sizeTotal = 0L;
|
|
var sizeTotal = 0L;
|
|
|
|
|
|
var sbm = new StringBuilder();
|
|
var sbm = new StringBuilder();
|
|
- foreach (var kvpTrack in alb.MainTracks.OrderBy(p => p.Key))
|
|
|
|
|
|
+ foreach (var kvpTrack in disc.MainTracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
sbm.Append($"<li>");
|
|
sbm.Append($"<li>");
|
|
- sbm.Append($"<a href=\"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{kvpTrack.Key.FuckVlcAndEscape()}\" >{kvpTrack.Value}</a>");
|
|
|
|
|
|
+ sbm.Append($"<a href=\"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{kvpTrack.Key.FuckVlcAndEscape()}\" >{kvpTrack.Value}</a>");
|
|
|
|
|
|
- var tag = GetTag($"/media/{libName}/{albPath}/{kvpTrack.Key}");
|
|
|
|
|
|
+ var tag = GetTag($"/media/{libName}/{discPath}/{kvpTrack.Key}");
|
|
durTotal += tag.Duration;
|
|
durTotal += tag.Duration;
|
|
sizeTotal += tag.Length;
|
|
sizeTotal += tag.Length;
|
|
sbm.Append($"<br> {tag.Duration.FormatDuration()} {tag.Length.FormatFileSize()}");
|
|
sbm.Append($"<br> {tag.Duration.FormatDuration()} {tag.Length.FormatFileSize()}");
|
|
@@ -421,7 +421,7 @@ namespace FNZCM.ConHost.Ver2
|
|
sb.Append($"<h2>Main ({durTotal.FormatDuration()}) {sizeTotal.FormatFileSize()}</h2>");
|
|
sb.Append($"<h2>Main ({durTotal.FormatDuration()}) {sizeTotal.FormatFileSize()}</h2>");
|
|
sb.Append(sbm);
|
|
sb.Append(sbm);
|
|
|
|
|
|
- foreach (var kvpSubSet in alb.SubTracks.OrderBy(p => p.Key))
|
|
|
|
|
|
+ foreach (var kvpSubSet in disc.SubTracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
durTotal = 0;
|
|
durTotal = 0;
|
|
sizeTotal = 0L;
|
|
sizeTotal = 0L;
|
|
@@ -430,9 +430,9 @@ namespace FNZCM.ConHost.Ver2
|
|
foreach (var kvpTrack in kvpSubSet.Value.Tracks.OrderBy(p => p.Key))
|
|
foreach (var kvpTrack in kvpSubSet.Value.Tracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
sbm.Append($"<li>");
|
|
sbm.Append($"<li>");
|
|
- sbm.Append($"<a href=\"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{kvpSubSet.Key.FuckVlcAndEscape()}/{kvpTrack.Key.FuckVlcAndEscape()}\" >{kvpTrack.Value}</a>");
|
|
|
|
|
|
+ sbm.Append($"<a href=\"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{kvpSubSet.Key.FuckVlcAndEscape()}/{kvpTrack.Key.FuckVlcAndEscape()}\" >{kvpTrack.Value}</a>");
|
|
|
|
|
|
- var tag = GetTag($"/media/{libName}/{albPath}/{kvpSubSet.Key}/{kvpTrack.Key}");
|
|
|
|
|
|
+ var tag = GetTag($"/media/{libName}/{discPath}/{kvpSubSet.Key}/{kvpTrack.Key}");
|
|
durTotal += tag.Duration;
|
|
durTotal += tag.Duration;
|
|
sizeTotal += tag.Length;
|
|
sizeTotal += tag.Length;
|
|
sbm.Append($"<br/> {tag.Duration.FormatDuration()} {tag.Length.FormatFileSize()}");
|
|
sbm.Append($"<br/> {tag.Duration.FormatDuration()} {tag.Length.FormatFileSize()}");
|
|
@@ -457,9 +457,9 @@ namespace FNZCM.ConHost.Ver2
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "bk")
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "bk")
|
|
{
|
|
{
|
|
var libName = pathParts[1];
|
|
var libName = pathParts[1];
|
|
- var albPath = pathParts[2];
|
|
|
|
|
|
+ var discPath = pathParts[2];
|
|
|
|
|
|
- if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(albPath, out var alb))
|
|
|
|
|
|
+ if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(discPath, out var disc))
|
|
{
|
|
{
|
|
var sb = new StringBuilder();
|
|
var sb = new StringBuilder();
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
@@ -467,13 +467,13 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
if (_isLoading) sb.Append("<h4 style=position:fixed;right:0px;top:0px;margin:0>Still Loading...</h4>");
|
|
if (_isLoading) sb.Append("<h4 style=position:fixed;right:0px;top:0px;margin:0>Still Loading...</h4>");
|
|
|
|
|
|
- sb.Append($"<h2>BK of </h2><h1>{alb.Name}</h1>");
|
|
|
|
|
|
+ sb.Append($"<h2>BK of </h2><h1>{disc.Name}</h1>");
|
|
sb.Append($"<div><a href='/list/{libName.FuckVlcAndEscape()}/'>Back to library</a></div>");
|
|
sb.Append($"<div><a href='/list/{libName.FuckVlcAndEscape()}/'>Back to library</a></div>");
|
|
|
|
|
|
- foreach (var albBk in alb.Bks.OrderBy(p => p.Key))
|
|
|
|
|
|
+ foreach (var discBk in disc.Bks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
//TODO: auto gen thumbnail 512x512 jpg 80
|
|
//TODO: auto gen thumbnail 512x512 jpg 80
|
|
- sb.Append($"<img src='/bk/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{albBk.Key.FuckVlcAndEscape()}' style=max-width:24vw;max-height:24vw;margin-right:1vw;margin-bottom:1vh; />");
|
|
|
|
|
|
+ sb.Append($"<img src='/bk/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{discBk.Key.FuckVlcAndEscape()}' style=max-width:24vw;max-height:24vw;margin-right:1vw;margin-bottom:1vh; />");
|
|
}
|
|
}
|
|
|
|
|
|
context.Response.ContentType = "text/html";
|
|
context.Response.ContentType = "text/html";
|
|
@@ -497,23 +497,23 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
|
|
|
|
- foreach (var albKvp in lib.Discs)
|
|
|
|
|
|
+ foreach (var discKvp in lib.Discs.OrderByDescending(p=>p.Key))
|
|
{
|
|
{
|
|
- var alb = albKvp.Value;
|
|
|
|
- var albPath = albKvp.Key;
|
|
|
|
|
|
+ var disc = discKvp.Value;
|
|
|
|
+ var discPath = discKvp.Key;
|
|
|
|
|
|
- var tracks = alb.MainTracks;
|
|
|
|
|
|
+ var tracks = disc.MainTracks;
|
|
|
|
|
|
foreach (var track in tracks.OrderBy(p => p.Key))
|
|
foreach (var track in tracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
- var mediaTag = GetTag($"/media/{libName}/{albPath}/{track.Key}");
|
|
|
|
|
|
+ var mediaTag = GetTag($"/media/{libName}/{discPath}/{track.Key}");
|
|
if (mediaTag != null)
|
|
if (mediaTag != null)
|
|
{
|
|
{
|
|
- var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/cover.jpg";
|
|
|
|
|
|
+ var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/cover.jpg";
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
}
|
|
}
|
|
|
|
|
|
- var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
|
|
|
|
+ var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
sb.AppendLine(prefix + mediaPath);
|
|
sb.AppendLine(prefix + mediaPath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -540,25 +540,25 @@ namespace FNZCM.ConHost.Ver2
|
|
|
|
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
|
|
|
|
- foreach (var albKvp in lib.Discs)
|
|
|
|
|
|
+ foreach (var discKvp in lib.Discs.OrderByDescending(p => p.Key))
|
|
{
|
|
{
|
|
- var alb = albKvp.Value;
|
|
|
|
- var albPath = albKvp.Key;
|
|
|
|
|
|
+ var disc = discKvp.Value;
|
|
|
|
+ var discPath = discKvp.Key;
|
|
|
|
|
|
- if (alb.SubTracks.TryGetValue(trackSetName, out var tracksSet))
|
|
|
|
|
|
+ if (disc.SubTracks.TryGetValue(trackSetName, out var tracksSet))
|
|
{
|
|
{
|
|
var tracks = tracksSet.Tracks;
|
|
var tracks = tracksSet.Tracks;
|
|
|
|
|
|
foreach (var track in tracks.OrderBy(p => p.Key))
|
|
foreach (var track in tracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
- var mediaTag = GetTag($"/media/{libName}/{albPath}/{trackSetName}/{track.Key}");
|
|
|
|
|
|
+ var mediaTag = GetTag($"/media/{libName}/{discPath}/{trackSetName}/{track.Key}");
|
|
if (mediaTag != null)
|
|
if (mediaTag != null)
|
|
{
|
|
{
|
|
- var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/cover.jpg";
|
|
|
|
|
|
+ var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/cover.jpg";
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
}
|
|
}
|
|
|
|
|
|
- var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
|
|
|
|
+ var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
sb.AppendLine(prefix + mediaPath);
|
|
sb.AppendLine(prefix + mediaPath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -577,9 +577,9 @@ namespace FNZCM.ConHost.Ver2
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "playlist.m3u8")
|
|
else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "playlist.m3u8")
|
|
{
|
|
{
|
|
var libName = pathParts[1];
|
|
var libName = pathParts[1];
|
|
- var albPath = pathParts[2];
|
|
|
|
|
|
+ var discPath = pathParts[2];
|
|
|
|
|
|
- if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(albPath, out var alb))
|
|
|
|
|
|
+ if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(discPath, out var disc))
|
|
{
|
|
{
|
|
// ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
|
|
// ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
@@ -587,16 +587,16 @@ namespace FNZCM.ConHost.Ver2
|
|
var sb = new StringBuilder();
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
sb.AppendLine("#EXTM3U");
|
|
sb.AppendLine("#EXTM3U");
|
|
- foreach (var track in alb.MainTracks.OrderBy(p => p.Key))
|
|
|
|
|
|
+ foreach (var track in disc.MainTracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
- var mediaTag = GetTag($"/media/{libName}/{albPath}/{track.Key}");
|
|
|
|
|
|
+ var mediaTag = GetTag($"/media/{libName}/{discPath}/{track.Key}");
|
|
if (mediaTag != null)
|
|
if (mediaTag != null)
|
|
{
|
|
{
|
|
- var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/cover.jpg";
|
|
|
|
|
|
+ var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/cover.jpg";
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
}
|
|
}
|
|
|
|
|
|
- var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
|
|
|
|
+ var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
sb.AppendLine(prefix + mediaPath);
|
|
sb.AppendLine(prefix + mediaPath);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -613,15 +613,15 @@ namespace FNZCM.ConHost.Ver2
|
|
else if (pathParts.Count == 5 && pathParts[0] == "list" && pathParts[4] == "playlist.m3u8")
|
|
else if (pathParts.Count == 5 && pathParts[0] == "list" && pathParts[4] == "playlist.m3u8")
|
|
{
|
|
{
|
|
var libName = pathParts[1];
|
|
var libName = pathParts[1];
|
|
- var albPath = pathParts[2];
|
|
|
|
|
|
+ var discPath = pathParts[2];
|
|
var subSetPath = pathParts[3];
|
|
var subSetPath = pathParts[3];
|
|
|
|
|
|
- if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(albPath, out var alb))
|
|
|
|
|
|
+ if (Libraries.TryGetValue(libName, out var lib) && lib.Discs.TryGetValue(discPath, out var disc))
|
|
{
|
|
{
|
|
// ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
|
|
// ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
var prefix = $"{request.Url.GetLeftPart(UriPartial.Scheme | UriPartial.Authority)}";
|
|
|
|
|
|
- if (false == alb.SubTracks.TryGetValue(subSetPath, out var trackSet))
|
|
|
|
|
|
+ if (false == disc.SubTracks.TryGetValue(subSetPath, out var trackSet))
|
|
{
|
|
{
|
|
context.Response.StatusCode = 404;
|
|
context.Response.StatusCode = 404;
|
|
}
|
|
}
|
|
@@ -632,14 +632,14 @@ namespace FNZCM.ConHost.Ver2
|
|
sb.AppendLine("#EXTM3U");
|
|
sb.AppendLine("#EXTM3U");
|
|
foreach (var track in trackSet.Tracks.OrderBy(p => p.Key))
|
|
foreach (var track in trackSet.Tracks.OrderBy(p => p.Key))
|
|
{
|
|
{
|
|
- var mediaTag = GetTag($"/media/{libName}/{albPath}/{subSetPath}/{track.Key}");
|
|
|
|
|
|
+ var mediaTag = GetTag($"/media/{libName}/{discPath}/{subSetPath}/{track.Key}");
|
|
if (mediaTag != null)
|
|
if (mediaTag != null)
|
|
{
|
|
{
|
|
- var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/cover.jpg";
|
|
|
|
|
|
+ var coverPath = $"/cover/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/cover.jpg";
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
sb.AppendLine($"#EXTINF:{mediaTag.Duration} tvg-logo=\"{prefix + coverPath}\",{mediaTag.Title}");
|
|
}
|
|
}
|
|
|
|
|
|
- var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{albPath.FuckVlcAndEscape()}/{subSetPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
|
|
|
|
+ var mediaPath = $"/media/{libName.FuckVlcAndEscape()}/{discPath.FuckVlcAndEscape()}/{subSetPath.FuckVlcAndEscape()}/{track.Key.FuckVlcAndEscape()}";
|
|
sb.AppendLine(prefix + mediaPath);
|
|
sb.AppendLine(prefix + mediaPath);
|
|
}
|
|
}
|
|
|
|
|