using System; using System.IO; using System.Threading.Tasks; using Jellyfin.Extensions; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Resolvers; namespace MediaBrowser.Providers.Lyric; /// public class DefaultLyricProvider : ILyricProvider { private static readonly string[] _lyricExtensions = { ".lrc", ".elrc", ".txt" }; /// public string Name => "DefaultLyricProvider"; /// public ResolverPriority Priority => ResolverPriority.First; /// public bool HasLyrics(BaseItem item) { var path = GetLyricsPath(item); return path is not null; } /// public async Task GetLyrics(BaseItem item) { var path = GetLyricsPath(item); if (path is not null) { var content = await File.ReadAllTextAsync(path).ConfigureAwait(false); if (!string.IsNullOrEmpty(content)) { return new LyricFile(path, content); } } return null; } private string? GetLyricsPath(BaseItem item) { // Ensure the path to the item is not null string? itemDirectoryPath = Path.GetDirectoryName(item.Path); if (itemDirectoryPath is null) { return null; } // Ensure the directory path exists if (!Directory.Exists(itemDirectoryPath)) { return null; } foreach (var lyricFilePath in Directory.GetFiles(itemDirectoryPath, $"{Path.GetFileNameWithoutExtension(item.Path)}.*")) { if (_lyricExtensions.Contains(Path.GetExtension(lyricFilePath.AsSpan()), StringComparison.OrdinalIgnoreCase)) { return lyricFilePath; } } return null; } }