Browse Source

Host: handle exception in request header
BlazorUI: add export dialog

HOME 2 years ago
parent
commit
130de2035e

+ 1 - 0
FNZCM/FNZCM.BlazorWasm/UI/Components/Bases/FnzComponentBase.cs

@@ -11,6 +11,7 @@ namespace FNZCM.BlazorWasm.UI.Components.Bases
         [Inject] protected FnzDataSetSingleto DataSet { get; set; }
         [Inject] protected LocalStorageHelper LocalStorage { get; set; }
         [Inject] protected PlaylistHelper PlaylistHelper { get; set; }
+        [Inject] protected NavigationManager NavigationManager { get; set; }
 
         [Parameter(CaptureUnmatchedValues = true)]
         public Dictionary<string, object> InputAttributes { get; set; }

+ 62 - 0
FNZCM/FNZCM.BlazorWasm/UI/Views/Default/Playlist/PlaylistExportDialog.razor

@@ -0,0 +1,62 @@
+@inherits FnzComponentBase
+
+@code {
+    private FnzBoostrapModal mdl;
+    private string ExportName { get; set; } = "brrr";
+    private string ExportExtension { get; set; } = "m3u";
+    private string ExportMime { get; set; } = "text/mpegurl";
+    private Guid PlaylistId { get; set; }
+}
+
+<FnzBoostrapModal @ref="mdl">
+    <Title>Export playlist</Title>
+    <Body>
+        <div class="input-group mb-3">
+            <span class="input-group-text">File Name</span>
+            <InputText class="form-control" placeholder="Filename" ValueExpression="()=>ExportName" Value="@ExportName"></InputText>
+        </div>
+        <div class="input-group mb-3">
+            <span class="input-group-text">Extension</span>
+            <InputText type="text" class="form-control" placeholder="Extension" ValueExpression="()=>ExportExtension" Value="@ExportExtension"></InputText>
+            <span class="input-group-text">Mime</span>
+            <InputText type="text" class="form-control" placeholder="Extension" ValueExpression="()=>ExportMime" Value="@ExportMime"></InputText>
+        </div>
+    </Body>
+    <Footer>
+        <button class="btn btn-primary" @onclick="DoExport">Save</button>
+    </Footer>
+</FnzBoostrapModal>
+
+@code {
+    public void Show(Guid playlistId)
+    {
+        var playlist = PlaylistHelper.PlayListLoadSave[playlistId];
+        var uri = new Uri(NavigationManager.Uri);
+        ExportName = $"{playlist}-{uri.Host}-{DateTime.Now:yyMMdd}";
+
+        PlaylistId = playlistId;
+
+        StateHasChanged();
+        mdl.Show();
+    }
+
+    public void DoExport()
+    {
+        // generate m3u content
+        var sb = new StringBuilder();
+        sb.WriteM3U8Header();
+
+        foreach (var item in PlaylistHelper[PlaylistId])
+        {
+            var track = DataSet.AllTracks.FirstOrDefault(p => p.Path == item);
+            if (track == null) continue;
+
+            sb.AppendLine($"#EXTINF:{track.Tag?.Duration ?? 0} logo=\"{track.Disc.CoverPath.UrlEscape()}\",{track.Tag?.Artist} - {track.Tag?.Title ?? track.Name}");
+            sb.AppendLine(track.Path.UrlEscape());
+        }
+
+        // export
+        JSRuntime.InvokeVoidAsync("fnz.downloadFile", $"{ExportName}.{ExportExtension}", ExportMime, sb.ToString());
+        mdl.Hide();
+    }
+}

+ 5 - 15
FNZCM/FNZCM.BlazorWasm/UI/Views/Default/Playlist/PlaylistTableItem.razor

@@ -9,7 +9,7 @@
     [Parameter] public EventCallback<Guid> DeletePlaylist { get; set; } = EventCallback<Guid>.Empty;
 
     private bool IsExpand;
-    private DiscDialog dlgDisc;
+    private PlaylistExportDialog dlgExport;
 }
 
 <div class="table-responsive">
@@ -134,24 +134,14 @@
     </table>
 </div>
 
+<PlaylistExportDialog @ref="dlgExport">
+</PlaylistExportDialog>
+
 @code {
     private void DownloadPlaylist(Guid playlistId)
     {
-        // generate m3u content
-        var sb = new StringBuilder();
-        sb.WriteM3U8Header();
-
-        foreach (var item in PlaylistHelper[playlistId])
-        {
-            var track = DataSet.AllTracks.FirstOrDefault(p => p.Path == item);
-            if (track == null) continue;
-
-            sb.AppendLine($"#EXTINF:{track.Tag?.Duration ?? 0} logo=\"{track.Disc.CoverPath.UrlEscape()}\",{track.Tag?.Artist} - {track.Tag?.Title ?? track.Name}");
-            sb.AppendLine(track.Path.UrlEscape());
-        }
+        dlgExport.Show(playlistId);
 
-        // export
-        JSRuntime.InvokeVoidAsync("fnz.downloadFile", $"{PlaylistHelper.PlayListLoadSave[playlistId]}.m3u", "text/mpegurl", sb.ToString());
     }
 
     private void Remove(Guid playlistId, int index, string path)

+ 31 - 34
FNZCM/FNZCM.ConHost/HostProgram.cs

@@ -323,49 +323,47 @@ namespace FNZCM.ConHost
         private static void ProcessRequest(HttpListenerContext context)
         {
             _lastRequestAccepted = DateTime.Now;
-
-            var request = context.Request;
-
-            var requestAbsPrefix = ConfigFile.Instance.M3uPrefix ?? $"{request.Url.Scheme + Uri.SchemeDelimiter + request.Url.Host + ":" + request.Url.Port}";
-
             var num = Interlocked.Increment(ref _requestId);
+            var request = context.Request;
             Console.WriteLine($"Request #{num:00000} from {request.RemoteEndPoint} {request.HttpMethod} {request.RawUrl}");
 
-            if (false == string.IsNullOrEmpty(request.Headers["Origin"]))
+            try
             {
-                if (ConfigFile.Instance.AccessControlAllowOrigin?.Any(p => request.Headers["Origin"].StartsWith(p)) == true)
-                    context.Response.Headers["Access-Control-Allow-Origin"] = "*";
-            }
+                var requestAbsPrefix = ConfigFile.Instance.M3uPrefix ?? $"{request.Url.Scheme + Uri.SchemeDelimiter + request.Url.Host + ":" + request.Url.Port}";
 
-            // GET / show all libraries
+                if (request.Headers.AllKeys.Contains("Origin") && false == string.IsNullOrEmpty(request.Headers["Origin"]))
+                {
+                    if (ConfigFile.Instance.AccessControlAllowOrigin?.Any(p => request.Headers["Origin"].StartsWith(p)) == true)
+                        context.Response.Headers["Access-Control-Allow-Origin"] = "*";
+                }
 
-            // 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/tracks/ list all tracks as text list
+                // GET / show all libraries
 
-            // GET /lib_list/foo/playlist.m3u8 auto gen
-            // GET /lib_list/foo/aac_q1.00/playlist.m3u8 auto gen
+                // 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/tracks/ list all tracks as text list
 
-            // GET /list/foo/bar/playlist.m3u8 auto gen
-            // GET /list/foo/bar/aac_q1.00/playlist.m3u8 auto gen
+                // GET /lib_list/foo/playlist.m3u8 auto gen
+                // GET /lib_list/foo/aac_q1.00/playlist.m3u8 auto gen
 
-            // media streaming HTTP Partial RANGE SUPPORT
-            // GET /cover/foo/bar/cover.jpg image/<ext>
-            // GET /media/foo/bar/01.%20foobar.flac audio/<ext>
-            // GET /media/foo/bar/aac_q1.00/01.%20foobar.m4a audio/<ext>
-            // GET /bk/foo/bar/foobar.jpg image/<ext>
+                // GET /list/foo/bar/playlist.m3u8 auto gen
+                // GET /list/foo/bar/aac_q1.00/playlist.m3u8 auto gen
 
-            // metadata catalog
-            // GET /metadata/progress.json
-            // GET /metadata/file-set.json
-            // GET /metadata/tag-dict.json
+                // media streaming HTTP Partial RANGE SUPPORT
+                // GET /cover/foo/bar/cover.jpg image/<ext>
+                // GET /media/foo/bar/01.%20foobar.flac audio/<ext>
+                // GET /media/foo/bar/aac_q1.00/01.%20foobar.m4a audio/<ext>
+                // GET /bk/foo/bar/foobar.jpg image/<ext>
 
-            // loadable module
-            // GET /module/<module-key>/<in-module-path>/
+                // metadata catalog
+                // GET /metadata/progress.json
+                // GET /metadata/file-set.json
+                // GET /metadata/tag-dict.json
+
+                // loadable module
+                // GET /module/<module-key>/<in-module-path>/
 
-            try
-            {
                 // ReSharper disable once PossibleNullReferenceException
                 var requestPath = request.Url.LocalPath.ToLower();
                 var pathParts = (IReadOnlyList<string>)requestPath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
@@ -427,7 +425,8 @@ namespace FNZCM.ConHost
                                 var html = Encoding.UTF8.GetString(bin);
                                 var r = html.Replace(module.HtmlBaseReplace, $"<base href=\"/modules/{moduleKey}/\" />");
                                 bin = Encoding.UTF8.GetBytes(r);
-                            }else context.Response.ContentType = "application/octet-stream";
+                            }
+                            else context.Response.ContentType = "application/octet-stream";
 
                             context.Response.ContentLength64 = bin.Length;
                             context.Response.OutputStream.Write(bin, 0, bin.Length);
@@ -873,7 +872,6 @@ namespace FNZCM.ConHost
                         var sb = new StringBuilder();
                         sb.WriteM3U8Header();
 
-
                         foreach (var discKvp in lib.Discs.OrderByDescending(p => p.Key))
                         {
                             var disc = discKvp.Value;
@@ -1127,7 +1125,6 @@ namespace FNZCM.ConHost
                         context.WriteTextUtf8(_tagSetJson ?? "null", Const.ApplicationJson);
                     }
                 }
-
                 else if (PathMapping.TryGetValue(requestPath, out var realPath))
                 {
                     var ext = requestPath.Split('.').LastOrDefault()?.ToLower();

+ 1 - 1
FNZCM/FNZCM.sln

@@ -17,7 +17,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FNZCM.LyricTools", "FNZCM.L
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FNZCM.Shared", "FNZCM.Shared\FNZCM.Shared.csproj", "{1E0B8152-0310-4EA1-8271-211F1E41C778}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FNZCM.BlazorWasm", "FNZCM.BlazorWasm\FNZCM.BlazorWasm.csproj", "{6610DBEA-B1FC-44E2-AC16-4E482C19E251}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FNZCM.BlazorWasm", "FNZCM.BlazorWasm\FNZCM.BlazorWasm.csproj", "{6610DBEA-B1FC-44E2-AC16-4E482C19E251}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution