|
@@ -1,5 +1,6 @@
|
|
|
using System.Text;
|
|
|
using Bmp.Core.Common.Net;
|
|
|
+using Bmp.Core.Common.Utility;
|
|
|
using Bmp.Core.FFMpeg.CsCorePorts;
|
|
|
using Bmp.Core.FFMpeg.CsCorePorts.FFMpegWrap;
|
|
|
using Bmp.Core.Playback.Inputs;
|
|
@@ -9,31 +10,6 @@ namespace Bmp.Core.Playback.Inputs
|
|
|
{
|
|
|
public static class InputSourceProvider
|
|
|
{
|
|
|
- private static readonly IReadOnlyList<string> CoverFilePaths = new List<string>
|
|
|
- {
|
|
|
- "./Cover.jpg",
|
|
|
- "./Folder.jpg",
|
|
|
- "BK/Cover.jpg",
|
|
|
- "PIC/Cover.jpg",
|
|
|
- "PICS/Cover.jpg",
|
|
|
- "SCAN/Cover.jpg",
|
|
|
- "SCANS/Cover.jpg",
|
|
|
- "./Cover.webp",
|
|
|
- "./Folder.webp",
|
|
|
- "BK/Cover.webp",
|
|
|
- "PIC/Cover.webp",
|
|
|
- "PICS/Cover.webp",
|
|
|
- "SCAN/Cover.webp",
|
|
|
- "SCANS/Cover.webp",
|
|
|
- "./Cover.png",
|
|
|
- "./Folder.png",
|
|
|
- "BK/Cover.png",
|
|
|
- "PIC/Cover.png",
|
|
|
- "PICS/Cover.png",
|
|
|
- "SCAN/Cover.png",
|
|
|
- "SCANS/Cover.png"
|
|
|
- };
|
|
|
-
|
|
|
public static AttachedPic[] GetPics(string urlOrPath)
|
|
|
{
|
|
|
AttachedPic[]? mappedEmbeddedPics = null;
|
|
@@ -75,7 +51,7 @@ namespace Bmp.Core.Playback.Inputs
|
|
|
return mappedEmbeddedPics ?? Array.Empty<AttachedPic>();
|
|
|
}
|
|
|
|
|
|
- public static MetaData GetMeta(string urlOrPath)
|
|
|
+ public static MetaData ReadMeta(string urlOrPath)
|
|
|
{
|
|
|
if (Uri.TryCreate(urlOrPath, UriKind.Absolute, out var url))
|
|
|
{
|
|
@@ -108,6 +84,8 @@ namespace Bmp.Core.Playback.Inputs
|
|
|
|
|
|
public static WaveStream CreateWaveStream(string urlOrPath, bool decodeDsdToPcm = false)
|
|
|
{
|
|
|
+ //TODO: InputSourceProvider::CreateWaveStream detect inner path
|
|
|
+
|
|
|
//BACKLOG: more decoder
|
|
|
|
|
|
if (decodeDsdToPcm == false)
|
|
@@ -129,6 +107,62 @@ namespace Bmp.Core.Playback.Inputs
|
|
|
return new FFMPEGAudioReader(urlOrPath);
|
|
|
}
|
|
|
|
|
|
+ public static string[] ExpandPaths(string inputPath)
|
|
|
+ {
|
|
|
+ // TODO: InputSourceProvider::ExpandPath M3U(8) ISO ZIP RAR 7Z / InURL
|
|
|
+ // TODO: InputSourceProvider::ExpandPath EventBus for warn and err
|
|
|
+ // [http://]foo.bar/foo.zip?path/to/inner/01.flac
|
|
|
+
|
|
|
+ var (exists, size) = FileCheckSize(inputPath);
|
|
|
+ if (exists)
|
|
|
+ {
|
|
|
+ var ex = Path.GetExtension(inputPath).ToLower();
|
|
|
+ using var stream = ReadContentAsSeekableStream(inputPath);
|
|
|
+ // ------------ m3u/8 ------------
|
|
|
+ if (size.HasValue && size < 1024 * 1025 * 1) // < 1MB
|
|
|
+ {
|
|
|
+ const string sign_ExtM3u = "#EXTM3U";
|
|
|
+ if (Encoding.ASCII.GetString(stream.ReadBytes(sign_ExtM3u.Length)) == sign_ExtM3u)
|
|
|
+ {
|
|
|
+ stream.Position = 0;
|
|
|
+ var lines = stream.ReadLines(ex == ".m3u8" ? Encoding.UTF8 : null);
|
|
|
+ return lines.Where(p => p.StartsWith("#")).ToArray();
|
|
|
+ }
|
|
|
+ //TODO: Debug here
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return new[] { inputPath };
|
|
|
+ }
|
|
|
+
|
|
|
+ // ----- utils -----
|
|
|
+
|
|
|
+ private static readonly IReadOnlyList<string> CoverFilePaths = new List<string>
|
|
|
+ {
|
|
|
+ "./Cover.jpg",
|
|
|
+ "./Folder.jpg",
|
|
|
+ "BK/Cover.jpg",
|
|
|
+ "PIC/Cover.jpg",
|
|
|
+ "PICS/Cover.jpg",
|
|
|
+ "SCAN/Cover.jpg",
|
|
|
+ "SCANS/Cover.jpg",
|
|
|
+ "./Cover.webp",
|
|
|
+ "./Folder.webp",
|
|
|
+ "BK/Cover.webp",
|
|
|
+ "PIC/Cover.webp",
|
|
|
+ "PICS/Cover.webp",
|
|
|
+ "SCAN/Cover.webp",
|
|
|
+ "SCANS/Cover.webp",
|
|
|
+ "./Cover.png",
|
|
|
+ "./Folder.png",
|
|
|
+ "BK/Cover.png",
|
|
|
+ "PIC/Cover.png",
|
|
|
+ "PICS/Cover.png",
|
|
|
+ "SCAN/Cover.png",
|
|
|
+ "SCANS/Cover.png"
|
|
|
+ };
|
|
|
+
|
|
|
public static (bool exists, long? size) FileCheckSize(string urlOrPath)
|
|
|
{
|
|
|
var exists = false;
|
|
@@ -136,30 +170,20 @@ namespace Bmp.Core.Playback.Inputs
|
|
|
|
|
|
if (!Uri.TryCreate(urlOrPath, UriKind.RelativeOrAbsolute, out var uri) || uri.IsAbsoluteUri == false || uri.IsFile)
|
|
|
{
|
|
|
- if (File.Exists(urlOrPath))
|
|
|
- {
|
|
|
- exists = true;
|
|
|
- var fileInfo = new FileInfo(urlOrPath);
|
|
|
- size = fileInfo.Length;
|
|
|
- }
|
|
|
+ if (!File.Exists(urlOrPath)) return (exists, size);
|
|
|
+ exists = true;
|
|
|
+ var fileInfo = new FileInfo(urlOrPath);
|
|
|
+ size = fileInfo.Length;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- using (var client = new HttpClient())
|
|
|
+ using var client = new HttpClient();
|
|
|
+ var request = new HttpRequestMessage(HttpMethod.Head, urlOrPath);
|
|
|
+ var response = client.Send(request);
|
|
|
+ exists = response.IsSuccessStatusCode;
|
|
|
+ if (exists && response.Content.Headers.ContentLength.HasValue)
|
|
|
{
|
|
|
- HttpResponseMessage response = null;
|
|
|
-
|
|
|
- Task.Run(async () =>
|
|
|
- {
|
|
|
- var request = new HttpRequestMessage(HttpMethod.Head, urlOrPath);
|
|
|
- response = await client.SendAsync(request);
|
|
|
- }).Wait();
|
|
|
-
|
|
|
- exists = response.IsSuccessStatusCode;
|
|
|
- if (exists && response.Content.Headers.ContentLength.HasValue)
|
|
|
- {
|
|
|
- size = response.Content.Headers.ContentLength.Value;
|
|
|
- }
|
|
|
+ size = response.Content.Headers.ContentLength.Value;
|
|
|
}
|
|
|
}
|
|
|
|