Просмотр исходного кода

Use Directory GetFiles to find lyric files

1hitsong 2 лет назад
Родитель
Сommit
6f0d33b1ca

+ 0 - 1
Emby.Server.Implementations/ApplicationHost.cs

@@ -46,7 +46,6 @@ using Emby.Server.Implementations.SyncPlay;
 using Emby.Server.Implementations.TV;
 using Emby.Server.Implementations.Updates;
 using Jellyfin.Api.Helpers;
-using Jellyfin.Api.Models.UserDtos;
 using Jellyfin.MediaEncoding.Hls.Playlist;
 using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;

+ 16 - 4
MediaBrowser.Controller/Lyrics/LyricInfo.cs

@@ -1,4 +1,7 @@
+using System.Collections.Generic;
 using System.IO;
+using System.Linq;
+using Jellyfin.Extensions;
 
 namespace MediaBrowser.Controller.Lyrics;
 
@@ -13,12 +16,21 @@ public static class LyricInfo
     /// <param name="lyricProvider">The lyricProvider interface to use.</param>
     /// <param name="itemPath">Path of requested item.</param>
     /// <returns>Lyric file path if passed lyric provider's supported media type is found; otherwise, null.</returns>
-    public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath)
+    public static string? GetLyricFilePath(this ILyricProvider lyricProvider, string itemPath)
     {
-        foreach (string lyricFileExtension in lyricProvider.SupportedMediaTypes)
+        if (lyricProvider is null)
         {
-            var lyricFilePath = Path.ChangeExtension(itemPath, lyricFileExtension);
-            if (File.Exists(lyricFilePath))
+            return null;
+        }
+
+        if (!Directory.Exists(Path.GetDirectoryName(itemPath)))
+        {
+            return null;
+        }
+
+        foreach (var lyricFilePath in Directory.GetFiles(Path.GetDirectoryName(itemPath), $"{Path.GetFileNameWithoutExtension(itemPath)}.*"))
+        {
+            if (lyricProvider.SupportedMediaTypes.Contains(Path.GetExtension(lyricFilePath)[1..]))
             {
                 return lyricFilePath;
             }

+ 8 - 4
MediaBrowser.Providers/Lyric/LrcLyricProvider.cs

@@ -20,7 +20,7 @@ public class LrcLyricProvider : ILyricProvider
 
     private readonly LyricParser _lrcLyricParser;
 
-    private static readonly IReadOnlyList<string> _acceptedTimeFormats = new string[] { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" };
+    private static readonly string[] _acceptedTimeFormats = { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" };
 
     /// <summary>
     /// Initializes a new instance of the <see cref="LrcLyricProvider"/> class.
@@ -51,14 +51,14 @@ public class LrcLyricProvider : ILyricProvider
     /// <returns>If provider can determine lyrics, returns a <see cref="LyricResponse"/> with or without metadata; otherwise, null.</returns>
     public LyricResponse? GetLyrics(BaseItem item)
     {
-        string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path);
+        string? lyricFilePath = this.GetLyricFilePath(item.Path);
 
         if (string.IsNullOrEmpty(lyricFilePath))
         {
             return null;
         }
 
-        IDictionary<string, string> fileMetaData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+        var fileMetaData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
         string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath);
 
         Song lyricData;
@@ -90,6 +90,10 @@ public class LrcLyricProvider : ILyricProvider
             }
 
             string[] metaDataField = metaDataRow.Split(':', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
+
+            // Remove square bracket before field name, and after field value
+            // Example 1: [au: 1hitsong]
+            // Example 2: [ar: Calabrese]
             string metaDataFieldName = metaDataField[0][1..];
             string metaDataFieldValue = metaDataField[1][..^1];
 
@@ -162,7 +166,7 @@ public class LrcLyricProvider : ILyricProvider
 
         if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length))
         {
-            if (DateTime.TryParseExact(length, _acceptedTimeFormats.ToArray(), null, DateTimeStyles.None, out var value))
+            if (DateTime.TryParseExact(length, _acceptedTimeFormats, null, DateTimeStyles.None, out var value))
             {
                 lyricMetadata.Length = value.TimeOfDay.Ticks;
             }

+ 1 - 1
MediaBrowser.Providers/Lyric/LyricManager.cs

@@ -46,7 +46,7 @@ public class LyricManager : ILyricManager
                 continue;
             }
 
-            if (LyricInfo.GetLyricFilePath(provider, item.Path) is not null)
+            if (provider.GetLyricFilePath(item.Path) is not null)
             {
                 return true;
             }

+ 1 - 1
MediaBrowser.Providers/Lyric/TxtLyricProvider.cs

@@ -29,7 +29,7 @@ public class TxtLyricProvider : ILyricProvider
     /// <returns>If provider can determine lyrics, returns a <see cref="LyricResponse"/>; otherwise, null.</returns>
     public LyricResponse? GetLyrics(BaseItem item)
     {
-        string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path);
+        string? lyricFilePath = this.GetLyricFilePath(item.Path);
 
         if (string.IsNullOrEmpty(lyricFilePath))
         {