瀏覽代碼

Change layout, small file RANGE support

HOME 2 年之前
父節點
當前提交
2862ba3cd4
共有 1 個文件被更改,包括 37 次插入39 次删除
  1. 37 39
      FNZCM/FNZCM.ConHost/Program.cs

+ 37 - 39
FNZCM/FNZCM.ConHost/Program.cs

@@ -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
                             {