|
@@ -11,8 +11,6 @@ using SearchOption = Microsoft.VisualBasic.FileIO.SearchOption;
|
|
|
|
|
|
namespace FNZCM.ConHost
|
|
|
{
|
|
|
-
|
|
|
-
|
|
|
internal static class Program
|
|
|
{
|
|
|
private static bool _isRunning;
|
|
@@ -101,7 +99,7 @@ namespace FNZCM.ConHost
|
|
|
|
|
|
_smallFileCaches = caches;
|
|
|
|
|
|
- Console.WriteLine($" Cached {_smallFileCaches.Count} small files");
|
|
|
+ Console.WriteLine($" Cached {_smallFileCaches.Count} small files, total {_smallFileCaches.Values.Sum(p=>p.Length)/(1024.0*1024):N6} MB");
|
|
|
|
|
|
Console.WriteLine("Starting...");
|
|
|
|
|
@@ -112,11 +110,11 @@ namespace FNZCM.ConHost
|
|
|
Console.WriteLine("Press ENTER to Stop.");
|
|
|
Console.ReadLine();
|
|
|
|
|
|
- Console.Write("Shutting down...");
|
|
|
+ Console.WriteLine("Shutting down...");
|
|
|
_isRunning = false;
|
|
|
tWorker.Join();
|
|
|
|
|
|
- Console.Write("Stopped.");
|
|
|
+ Console.WriteLine("Stopped.");
|
|
|
|
|
|
Console.WriteLine();
|
|
|
Console.Write("Press ENTER to Exit.");
|
|
@@ -140,8 +138,12 @@ namespace FNZCM.ConHost
|
|
|
{
|
|
|
var timeSpan = DateTime.Now - _lastRequestAccepted;
|
|
|
var up = DateTime.Now - upTime;
|
|
|
- Console.Title = "FNZCM LA" + $" {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}" +
|
|
|
- $" / UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}";
|
|
|
+ Console.Title =
|
|
|
+ "FNZCM"
|
|
|
+ + $" UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}"
|
|
|
+ + $" / "
|
|
|
+ + $" LA {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}"
|
|
|
+ ;
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
}
|
|
@@ -201,7 +203,7 @@ namespace FNZCM.ConHost
|
|
|
{
|
|
|
var sb = new StringBuilder();
|
|
|
sb.Append($"<title> Libraries - {ConfigFile.Instance.Title} </title>");
|
|
|
- sb.Append("<body bgColor=skyBlue style=font-size:5vh><h1>Libraries</h1>");
|
|
|
+ sb.Append("<body bgColor=skyBlue style=font-size:3vh><h1>Libraries</h1>");
|
|
|
|
|
|
sb.Append("<ul>");
|
|
|
foreach (var library in ConfigFile.Instance.Libraries.Keys)
|
|
@@ -262,8 +264,8 @@ namespace FNZCM.ConHost
|
|
|
sb.Append($"<img class=cover src=\"/cover/{lib.PathName}/{a.PathName}/cover.jpg\" />");
|
|
|
sb.Append("<div class=buttons>");
|
|
|
sb.Append($"<a class=button href=\"/list/{lib.PathName}/{a.PathName}/trackers/\">[TRACKERS]</a>");
|
|
|
- sb.Append($"<a class=button href=\"/list/{lib.PathName}/{a.PathName.FuckVlc()}/playlist.m3u8\">[M3U8]</a>");
|
|
|
if (a.Bks != null) sb.Append($"<a class=button href=\"/list/{lib.PathName}/{a.PathName}/bk/\">[BK]</a>");
|
|
|
+ sb.Append($"<a class=button href=\"/list/{lib.PathName}/{a.PathName.FuckVlc()}/playlist.m3u8\">[M3U8]</a>");
|
|
|
sb.Append("</div>");
|
|
|
sb.Append($"<span>{a.Name}<span>");
|
|
|
sb.Append("</div>");
|
|
@@ -278,12 +280,7 @@ namespace FNZCM.ConHost
|
|
|
context.Response.Redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
|
|
|
}
|
|
|
}
|
|
|
- else if (pathParts.Count == 4
|
|
|
- && pathParts[0] == "list"
|
|
|
- //&& pathParts[1] == "lib"
|
|
|
- //&& pathParts[2] == "alb"
|
|
|
- && pathParts[3] == "trackers"
|
|
|
- )
|
|
|
+ else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "trackers")
|
|
|
{
|
|
|
var libName = pathParts[1];
|
|
|
var albPath = pathParts[2];
|
|
@@ -293,7 +290,7 @@ namespace FNZCM.ConHost
|
|
|
{
|
|
|
var sb = new StringBuilder();
|
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
|
- sb.Append($"<h1>Trackers of {alb.Name}</h1>");
|
|
|
+ sb.Append($"<body bgColor=skyBlue style=font-size:2vh><h2>Trackers of</h2><h1>{alb.Name}</h1>");
|
|
|
sb.Append($"<div><a href=/list/{lib.PathName}/>Back to library</a></div>");
|
|
|
|
|
|
for (var i = 0; i < alb.TrackerPaths.Count; i++)
|
|
@@ -310,12 +307,7 @@ namespace FNZCM.ConHost
|
|
|
context.Response.Redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
|
|
|
}
|
|
|
}
|
|
|
- else if (pathParts.Count == 4
|
|
|
- && pathParts[0] == "list"
|
|
|
- //&& pathParts[1] == "lib"
|
|
|
- //&& pathParts[2] == "alb"
|
|
|
- && pathParts[3] == "bk"
|
|
|
- )
|
|
|
+ else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "bk")
|
|
|
{
|
|
|
var libName = pathParts[1];
|
|
|
var albPath = pathParts[2];
|
|
@@ -325,7 +317,7 @@ namespace FNZCM.ConHost
|
|
|
{
|
|
|
var sb = new StringBuilder();
|
|
|
sb.Append("<!DOCTYPE html><html lang=\"zh-cn\"><meta charset=\"UTF-8\">");
|
|
|
- sb.Append($"<body bgColor=skyBlue style=font-size:4vh><h1>BK of {alb.Name}</h1>");
|
|
|
+ sb.Append($"<body bgColor=skyBlue style=font-size:2vh><h2>BK of </h2><h1>{alb.Name}</h1>");
|
|
|
sb.Append($"<div><a href=/list/{lib.PathName}/>Back to library</a></div>");
|
|
|
|
|
|
foreach (var albBk in alb.Bks)
|
|
@@ -343,12 +335,7 @@ namespace FNZCM.ConHost
|
|
|
context.Response.Redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
|
|
|
}
|
|
|
}
|
|
|
- else if (pathParts.Count == 4
|
|
|
- && pathParts[0] == "list"
|
|
|
- //&& pathParts[1] == "lib"
|
|
|
- //&& pathParts[2] == "alb"
|
|
|
- && pathParts[3] == "playlist.m3u8"
|
|
|
- )
|
|
|
+ else if (pathParts.Count == 4 && pathParts[0] == "list" && pathParts[3] == "playlist.m3u8")
|
|
|
{
|
|
|
var libName = pathParts[1];
|
|
|
var albPath = pathParts[2];
|
|
@@ -388,23 +375,39 @@ namespace FNZCM.ConHost
|
|
|
}
|
|
|
else if (_pathMapping.TryGetValue(requestPath, out var realPath))
|
|
|
{
|
|
|
+ var range = request.Headers.GetValues("Range");
|
|
|
+
|
|
|
if (_smallFileCaches.TryGetValue(requestPath, out var data))
|
|
|
{
|
|
|
- context.Response.OutputStream.Write(data);
|
|
|
+ if (range is { Length: > 0 })
|
|
|
+ {
|
|
|
+ var rngParts = range[0].Split(new[] { "bytes=", "-" }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
+ if (rngParts.Length >= 1 && long.TryParse(rngParts[0], out var start))
|
|
|
+ {
|
|
|
+ context.Response.StatusCode = 206;
|
|
|
+ context.Response.Headers.Add("Accept-Ranges", "bytes");
|
|
|
+ context.Response.Headers.Add("Content-Range", $"bytes {start}-{data.Length - 1}/{data.Length}");
|
|
|
+ context.Response.ContentLength64 = data.Length - start;
|
|
|
+ context.Response.ContentType = "video/mp4";
|
|
|
+ context.Response.OutputStream.Write(new ReadOnlySpan<byte>(data, (int)start, (int)(data.Length - start)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ context.Response.OutputStream.Write(data);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- var range = request.Headers.GetValues("Range");
|
|
|
-
|
|
|
FileStream fs = null;
|
|
|
try
|
|
|
{
|
|
|
fs = File.OpenRead(realPath);
|
|
|
|
|
|
- if (range is {Length: > 0})
|
|
|
+ if (range is { Length: > 0 })
|
|
|
{
|
|
|
var rngParts = range[0].Split(new[] { "bytes=", "-" }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
- if (rngParts.Length == 1 && long.TryParse(rngParts[0], out var start))
|
|
|
+ if (rngParts.Length >= 1 && long.TryParse(rngParts[0], out var start))
|
|
|
{
|
|
|
fs.Position = start;
|
|
|
context.Response.StatusCode = 206;
|
|
@@ -414,11 +417,6 @@ namespace FNZCM.ConHost
|
|
|
context.Response.ContentType = "video/mp4";
|
|
|
fs.CopyTo(context.Response.OutputStream);
|
|
|
}
|
|
|
- // ReSharper disable once UnusedVariable
|
|
|
- else if (rngParts.Length == 2 && long.TryParse(rngParts[0], out start) && long.TryParse(rngParts[1], out var end))
|
|
|
- {
|
|
|
- //TODO
|
|
|
- }
|
|
|
}
|
|
|
else
|
|
|
{
|