From d9be3874ba3842d5888c5cbbe583614ed990849e Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Thu, 15 Sep 2022 19:45:26 -0400 Subject: Auto stash before merge of "lyric-lrc-file-support" and "origin/lyric-lrc-file-support" --- MediaBrowser.Controller/Lyrics/ILyricsProvider.cs | 24 +++++++ MediaBrowser.Controller/Lyrics/Lyric.cs | 18 +++++ MediaBrowser.Controller/Lyrics/LyricInfo.cs | 87 +++++++++++++++++++++++ MediaBrowser.Controller/Lyrics/LyricResponse.cs | 15 ++++ 4 files changed, 144 insertions(+) create mode 100644 MediaBrowser.Controller/Lyrics/ILyricsProvider.cs create mode 100644 MediaBrowser.Controller/Lyrics/Lyric.cs create mode 100644 MediaBrowser.Controller/Lyrics/LyricInfo.cs create mode 100644 MediaBrowser.Controller/Lyrics/LyricResponse.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs new file mode 100644 index 000000000..bac32a398 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Lyrics +{ + /// + /// Interface ILyricsProvider. + /// + public interface ILyricsProvider + { + /// + /// Gets the supported media types for this provider. + /// + /// The supported media types. + IEnumerable SupportedMediaTypes { get; } + + /// + /// Gets the lyrics. + /// + /// The item to to process. + /// Task{LyricResponse}. + LyricResponse? GetLyrics(BaseItem item); + } +} diff --git a/MediaBrowser.Controller/Lyrics/Lyric.cs b/MediaBrowser.Controller/Lyrics/Lyric.cs new file mode 100644 index 000000000..d44546dd3 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/Lyric.cs @@ -0,0 +1,18 @@ +namespace MediaBrowser.Controller.Lyrics +{ + /// + /// Lyric dto. + /// + public class Lyric + { + /// + /// Gets or sets the start time (ticks). + /// + public double? Start { get; set; } + + /// + /// Gets or sets the text. + /// + public string Text { get; set; } = string.Empty; + } +} diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs new file mode 100644 index 000000000..83a10701a --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Lyrics; +using MediaBrowser.Controller.Net; +using Microsoft.AspNetCore.Mvc; + +namespace MediaBrowser.Controller.Lyrics +{ + /// + /// Item helper. + /// + public class LyricInfo + { + /// + /// Opens lyrics file, converts to a List of Lyrics, and returns it. + /// + /// Collection of all registered interfaces. + /// Requested Item. + /// Collection of Lyrics. + public static LyricResponse? GetLyricData(IEnumerable lyricProviders, BaseItem item) + { + + foreach (var provider in lyricProviders) + { + var result = provider.GetLyrics(item); + if (result is not null) + { + return result; + } + } + + return new LyricResponse + { + Lyrics = new List + { + new Lyric { Start = 0, Text = "Test" } + } + }; + } + + /// + /// Checks if requested item has a matching lyric file. + /// + /// The current lyricProvider interface. + /// Path of requested item. + /// True if item has a matching lyrics file. + public static string? GetLyricFilePath(ILyricsProvider lyricProvider, string itemPath) + { + if (lyricProvider.SupportedMediaTypes.Any()) + { + foreach (string lyricFileExtension in lyricProvider.SupportedMediaTypes) + { + string lyricFilePath = @Path.ChangeExtension(itemPath, lyricFileExtension); + if (System.IO.File.Exists(lyricFilePath)) + { + return lyricFilePath; + } + } + } + + return null; + } + + /// + /// Checks if requested item has a matching local lyric file. + /// + /// Collection of all registered interfaces. + /// Path of requested item. + /// True if item has a matching lyrics file; otherwise false. + public static bool HasLyricFile(IEnumerable lyricProviders, string itemPath) + { + foreach (var provider in lyricProviders) + { + if (GetLyricFilePath(provider, itemPath) is not null) + { + return true; + } + } + + return false; + } + } +} diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs new file mode 100644 index 000000000..e312638ec --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -0,0 +1,15 @@ +#nullable disable + +#pragma warning disable CS1591 + +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Lyrics +{ + public class LyricResponse + { + public IDictionary MetaData { get; set; } + + public IEnumerable Lyrics { get; set; } + } +} -- cgit v1.2.3 From f4fd908f8d7ffcdea6acaf75928f6c2960ed6338 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Thu, 15 Sep 2022 20:49:25 -0400 Subject: Create ILyricManager --- Emby.Server.Implementations/ApplicationHost.cs | 4 +- Emby.Server.Implementations/Dto/DtoService.cs | 8 +- Jellyfin.Api/Controllers/UserLibraryController.cs | 16 ++- MediaBrowser.Controller/Lyrics/ILyricManager.cs | 37 +++++++ MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 29 ++++++ MediaBrowser.Controller/Lyrics/ILyricsProvider.cs | 24 ----- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 50 +-------- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 119 ++++++++++++++++++++++ MediaBrowser.Providers/Lyric/LrcLyricsProvider.cs | 112 -------------------- MediaBrowser.Providers/Lyric/LyricManager.cs | 97 ++++++++++++++++++ MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 82 +++++++++++++++ MediaBrowser.Providers/Lyric/TxtLyricsProvider.cs | 74 -------------- 12 files changed, 378 insertions(+), 274 deletions(-) create mode 100644 MediaBrowser.Controller/Lyrics/ILyricManager.cs create mode 100644 MediaBrowser.Controller/Lyrics/ILyricProvider.cs delete mode 100644 MediaBrowser.Controller/Lyrics/ILyricsProvider.cs create mode 100644 MediaBrowser.Providers/Lyric/LrcLyricProvider.cs delete mode 100644 MediaBrowser.Providers/Lyric/LrcLyricsProvider.cs create mode 100644 MediaBrowser.Providers/Lyric/LyricManager.cs create mode 100644 MediaBrowser.Providers/Lyric/TxtLyricProvider.cs delete mode 100644 MediaBrowser.Providers/Lyric/TxtLyricsProvider.cs (limited to 'MediaBrowser.Controller') diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs index 5487e5e02..409fc04b1 100644 --- a/Emby.Server.Implementations/ApplicationHost.cs +++ b/Emby.Server.Implementations/ApplicationHost.cs @@ -583,8 +583,6 @@ namespace Emby.Server.Implementations serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService)); serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService)); serviceCollection.AddTransient(provider => new Lazy(provider.GetRequiredService)); - serviceCollection.AddTransient(); - serviceCollection.AddTransient(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -603,6 +601,7 @@ namespace Emby.Server.Implementations serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -790,6 +789,7 @@ namespace Emby.Server.Implementations Resolve().AddParts(GetExports(), GetExports(), GetExports()); Resolve().AddParts(GetExports()); + Resolve().AddParts(GetExports()); Resolve().AddParts(GetExports()); diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index bed82a4bb..6ab574c5c 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -52,7 +52,7 @@ namespace Emby.Server.Implementations.Dto private readonly IMediaSourceManager _mediaSourceManager; private readonly Lazy _livetvManagerFactory; - private readonly IEnumerable _lyricProviders; + private readonly ILyricManager _lyricManager; public DtoService( ILogger logger, @@ -64,7 +64,7 @@ namespace Emby.Server.Implementations.Dto IApplicationHost appHost, IMediaSourceManager mediaSourceManager, Lazy livetvManagerFactory, - IEnumerable lyricProviders) + ILyricManager lyricManager) { _logger = logger; _libraryManager = libraryManager; @@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.Dto _appHost = appHost; _mediaSourceManager = mediaSourceManager; _livetvManagerFactory = livetvManagerFactory; - _lyricProviders = lyricProviders; + _lyricManager = lyricManager; } private ILiveTvManager LivetvManager => _livetvManagerFactory.Value; @@ -147,7 +147,7 @@ namespace Emby.Server.Implementations.Dto } else if (item is Audio) { - dto.HasLyrics = MediaBrowser.Controller.Lyrics.LyricInfo.HasLyricFile(_lyricProviders, item.Path); + dto.HasLyrics = _lyricManager.HasLyricFile(item); } if (item is IItemByName itemByName diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index 3da78c116..1421ab444 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -38,7 +38,7 @@ namespace Jellyfin.Api.Controllers private readonly IDtoService _dtoService; private readonly IUserViewManager _userViewManager; private readonly IFileSystem _fileSystem; - private readonly IEnumerable _lyricProviders; + private readonly ILyricManager _lyricManager; /// /// Initializes a new instance of the class. @@ -49,7 +49,7 @@ namespace Jellyfin.Api.Controllers /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. - /// Collection of all registered interfaces. + /// Instance of the interface. public UserLibraryController( IUserManager userManager, IUserDataManager userDataRepository, @@ -57,7 +57,7 @@ namespace Jellyfin.Api.Controllers IDtoService dtoService, IUserViewManager userViewManager, IFileSystem fileSystem, - IEnumerable lyricProviders) + ILyricManager lyricManager) { _userManager = userManager; _userDataRepository = userDataRepository; @@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers _dtoService = dtoService; _userViewManager = userViewManager; _fileSystem = fileSystem; - _lyricProviders = lyricProviders; + _lyricManager = lyricManager; } /// @@ -415,14 +415,10 @@ namespace Jellyfin.Api.Controllers return NotFound(); } - var result = MediaBrowser.Controller.Lyrics.LyricInfo.GetLyricData(_lyricProviders, item); + var result = _lyricManager.GetLyric(item); if (result is not null) { - provider.Process(item); - if (provider.HasData) - { - return Ok(provider.Data); - } + return Ok(result); } return NotFound(); diff --git a/MediaBrowser.Controller/Lyrics/ILyricManager.cs b/MediaBrowser.Controller/Lyrics/ILyricManager.cs new file mode 100644 index 000000000..4fd11b9e0 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/ILyricManager.cs @@ -0,0 +1,37 @@ +#nullable disable + +#pragma warning disable CS1591 + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Providers; + +namespace MediaBrowser.Controller.Lyrics +{ + public interface ILyricManager + { + /// + /// Adds the parts. + /// + /// The lyric providers. + void AddParts(IEnumerable lyricProviders); + + /// + /// Gets the lyrics. + /// + /// The media item. + /// Lyrics for passed item. + LyricResponse GetLyric(BaseItem item); + + /// + /// Checks if requested item has a matching local lyric file. + /// + /// The media item. + /// True if item has a matching lyrics file; otherwise false. + bool HasLyricFile(BaseItem item); + } +} diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs new file mode 100644 index 000000000..691fed1fd --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Lyrics +{ + /// + /// Interface ILyricsProvider. + /// + public interface ILyricProvider + { + /// + /// Gets a value indicating the provider name. + /// + string Name { get; } + + /// + /// Gets the supported media types for this provider. + /// + /// The supported media types. + IEnumerable SupportedMediaTypes { get; } + + /// + /// Gets the lyrics. + /// + /// The item to to process. + /// Task{LyricResponse}. + LyricResponse? GetLyrics(BaseItem item); + } +} diff --git a/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs deleted file mode 100644 index bac32a398..000000000 --- a/MediaBrowser.Controller/Lyrics/ILyricsProvider.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using MediaBrowser.Controller.Entities; - -namespace MediaBrowser.Controller.Lyrics -{ - /// - /// Interface ILyricsProvider. - /// - public interface ILyricsProvider - { - /// - /// Gets the supported media types for this provider. - /// - /// The supported media types. - IEnumerable SupportedMediaTypes { get; } - - /// - /// Gets the lyrics. - /// - /// The item to to process. - /// Task{LyricResponse}. - LyricResponse? GetLyrics(BaseItem item); - } -} diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index 83a10701a..d44e14237 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -13,42 +13,15 @@ namespace MediaBrowser.Controller.Lyrics /// /// Item helper. /// - public class LyricInfo + public static class LyricInfo { - /// - /// Opens lyrics file, converts to a List of Lyrics, and returns it. - /// - /// Collection of all registered interfaces. - /// Requested Item. - /// Collection of Lyrics. - public static LyricResponse? GetLyricData(IEnumerable lyricProviders, BaseItem item) - { - - foreach (var provider in lyricProviders) - { - var result = provider.GetLyrics(item); - if (result is not null) - { - return result; - } - } - - return new LyricResponse - { - Lyrics = new List - { - new Lyric { Start = 0, Text = "Test" } - } - }; - } - /// /// Checks if requested item has a matching lyric file. /// /// The current lyricProvider interface. /// Path of requested item. /// True if item has a matching lyrics file. - public static string? GetLyricFilePath(ILyricsProvider lyricProvider, string itemPath) + public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath) { if (lyricProvider.SupportedMediaTypes.Any()) { @@ -64,24 +37,5 @@ namespace MediaBrowser.Controller.Lyrics return null; } - - /// - /// Checks if requested item has a matching local lyric file. - /// - /// Collection of all registered interfaces. - /// Path of requested item. - /// True if item has a matching lyrics file; otherwise false. - public static bool HasLyricFile(IEnumerable lyricProviders, string itemPath) - { - foreach (var provider in lyricProviders) - { - if (GetLyricFilePath(provider, itemPath) is not null) - { - return true; - } - } - - return false; - } } } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs new file mode 100644 index 000000000..18a85c93a --- /dev/null +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Dynamic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using Jellyfin.Api.Helpers; +using LrcParser.Model; +using LrcParser.Parser; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Lyrics; + +namespace MediaBrowser.Providers.Lyric +{ + /// + /// LRC File Lyric Provider. + /// + public class LrcLyricProvider : ILyricProvider + { + /// + /// Initializes a new instance of the class. + /// + public LrcLyricProvider() + { + Name = "LrcLyricProvider"; + + SupportedMediaTypes = new Collection + { + "lrc" + }; + } + + /// + /// Gets a value indicating the provider name. + /// + public string Name { get; } + + /// + /// Gets a value indicating the File Extenstions this provider works with. + /// + public IEnumerable SupportedMediaTypes { get; } + + /// + /// Gets or Sets Data object generated by Process() method. + /// + /// Object with data if no error occured; otherwise, null. + public object? Data { get; set; } + + /// + /// Opens lyric file for [the specified item], and processes it for API return. + /// + /// The item to to process. + /// A representing the asynchronous operation. + public LyricResponse? GetLyrics(BaseItem item) + { + string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); + + if (string.IsNullOrEmpty(lyricFilePath)) + { + return null; + } + + List lyricsList = new List(); + + List sortedLyricData = new List(); + var metaData = new ExpandoObject() as IDictionary; + string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); + + try + { + // Parse and sort lyric rows + LyricParser lrcLyricParser = new LrcParser.Parser.Lrc.LrcParser(); + Song lyricData = lrcLyricParser.Decode(lrcFileContent); + sortedLyricData = lyricData.Lyrics.Where(x => x.TimeTags.Count > 0).OrderBy(x => x.TimeTags.ToArray()[0].Value).ToList(); + + // Parse metadata rows + var metaDataRows = lyricData.Lyrics + .Where(x => x.TimeTags.Count == 0) + .Where(x => x.Text.StartsWith("[", StringComparison.Ordinal) && x.Text.EndsWith("]", StringComparison.Ordinal)) + .Select(x => x.Text) + .ToList(); + + foreach (string metaDataRow in metaDataRows) + { + var metaDataField = metaDataRow.Split(":"); + + string metaDataFieldName = metaDataField[0].Replace("[", string.Empty, StringComparison.Ordinal); + string metaDataFieldValue = metaDataField[1].Replace("]", string.Empty, StringComparison.Ordinal); + + metaData.Add(metaDataFieldName, metaDataFieldValue); + } + } + catch + { + return null; + } + + if (!sortedLyricData.Any()) + { + return null; + } + + for (int i = 0; i < sortedLyricData.Count; i++) + { + var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; + double ticks = Convert.ToDouble(timeData, new NumberFormatInfo()) * 10000; + lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Start = Math.Ceiling(ticks), Text = sortedLyricData[i].Text }); + } + + if (metaData.Any()) + { + return new LyricResponse { MetaData = metaData, Lyrics = lyricsList }; + } + + return new LyricResponse { Lyrics = lyricsList }; + } + } +} diff --git a/MediaBrowser.Providers/Lyric/LrcLyricsProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricsProvider.cs deleted file mode 100644 index e30d56308..000000000 --- a/MediaBrowser.Providers/Lyric/LrcLyricsProvider.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Dynamic; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using Jellyfin.Api.Helpers; -using LrcParser.Model; -using LrcParser.Parser; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Lyrics; - -namespace MediaBrowser.Providers.Lyric -{ - /// - /// LRC File Lyric Provider. - /// - public class LrcLyricsProvider : ILyricsProvider - { - /// - /// Initializes a new instance of the class. - /// - public LrcLyricsProvider() - { - SupportedMediaTypes = new Collection - { - "lrc" - }; - } - - /// - /// Gets a value indicating the File Extenstions this provider works with. - /// - public IEnumerable SupportedMediaTypes { get; } - - /// - /// Gets or Sets Data object generated by Process() method. - /// - /// Object with data if no error occured; otherwise, null. - public object? Data { get; set; } - - /// - /// Opens lyric file for [the specified item], and processes it for API return. - /// - /// The item to to process. - /// A representing the asynchronous operation. - public LyricResponse? GetLyrics(BaseItem item) - { - string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); - - if (string.IsNullOrEmpty(lyricFilePath)) - { - return null; - } - - List lyricsList = new List(); - - List sortedLyricData = new List(); - var metaData = new ExpandoObject() as IDictionary; - string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); - - try - { - // Parse and sort lyric rows - LyricParser lrcLyricParser = new LrcParser.Parser.Lrc.LrcParser(); - Song lyricData = lrcLyricParser.Decode(lrcFileContent); - sortedLyricData = lyricData.Lyrics.Where(x => x.TimeTags.Count > 0).OrderBy(x => x.TimeTags.ToArray()[0].Value).ToList(); - - // Parse metadata rows - var metaDataRows = lyricData.Lyrics - .Where(x => x.TimeTags.Count == 0) - .Where(x => x.Text.StartsWith("[", StringComparison.Ordinal) && x.Text.EndsWith("]", StringComparison.Ordinal)) - .Select(x => x.Text) - .ToList(); - - foreach (string metaDataRow in metaDataRows) - { - var metaDataField = metaDataRow.Split(":"); - - string metaDataFieldName = metaDataField[0].Replace("[", string.Empty, StringComparison.Ordinal); - string metaDataFieldValue = metaDataField[1].Replace("]", string.Empty, StringComparison.Ordinal); - - metaData.Add(metaDataFieldName, metaDataFieldValue); - } - } - catch - { - return null; - } - - if (!sortedLyricData.Any()) - { - return null; - } - - for (int i = 0; i < sortedLyricData.Count; i++) - { - var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; - double ticks = Convert.ToDouble(timeData, new NumberFormatInfo()) * 10000; - lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Start = Math.Ceiling(ticks), Text = sortedLyricData[i].Text }); - } - - if (metaData.Any()) - { - return new LyricResponse { MetaData = metaData, Lyrics = lyricsList }; - } - - return new LyricResponse { Lyrics = lyricsList }; - } - } -} diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs new file mode 100644 index 000000000..48572c63e --- /dev/null +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -0,0 +1,97 @@ +#nullable disable + +#pragma warning disable CS1591 + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Jellyfin.Extensions; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Lyrics; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Subtitles; +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Providers; +using Microsoft.Extensions.Logging; + +namespace MediaBrowser.Providers.Lyric +{ + public class LyricManager : ILyricManager + { + private readonly ILogger _logger; + private readonly IFileSystem _fileSystem; + private readonly ILibraryMonitor _monitor; + private readonly IMediaSourceManager _mediaSourceManager; + private readonly ILocalizationManager _localization; + + private ILyricProvider[] _lyricProviders; + + public LyricManager( + ILogger logger, + IFileSystem fileSystem, + ILibraryMonitor monitor, + IMediaSourceManager mediaSourceManager, + ILocalizationManager localizationManager) + { + _logger = logger; + _fileSystem = fileSystem; + _monitor = monitor; + _mediaSourceManager = mediaSourceManager; + _localization = localizationManager; + } + + /// + public void AddParts(IEnumerable lyricProviders) + { + _lyricProviders = lyricProviders + .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0) + .ToArray(); + } + + /// + public LyricResponse GetLyric(BaseItem item) + { + foreach (ILyricProvider provider in _lyricProviders) + { + var results = provider.GetLyrics(item); + if (results is not null) + { + return results; + } + } + + return null; + } + + /// + public bool HasLyricFile(BaseItem item) + { + foreach (ILyricProvider provider in _lyricProviders) + { + if (item is null) + { + continue; + } + + if (LyricInfo.GetLyricFilePath(provider, item.Path) is not null) + { + return true; + } + } + + return false; + } + } +} diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs new file mode 100644 index 000000000..939d8708b --- /dev/null +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using System.Xml.Linq; +using Jellyfin.Api.Helpers; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Lyrics; + +namespace MediaBrowser.Providers.Lyric +{ + /// + /// TXT File Lyric Provider. + /// + public class TxtLyricProvider : ILyricProvider + { + /// + /// Initializes a new instance of the class. + /// + public TxtLyricProvider() + { + Name = "TxtLyricProvider"; + + SupportedMediaTypes = new Collection + { + "lrc", "txt" + }; + } + + /// + /// Gets a value indicating the provider name. + /// + public string Name { get; } + + /// + /// Gets a value indicating the File Extenstions this provider works with. + /// + public IEnumerable SupportedMediaTypes { get; } + + /// + /// Gets or Sets Data object generated by Process() method. + /// + /// Object with data if no error occured; otherwise, null. + public object? Data { get; set; } + + /// + /// Opens lyric file for [the specified item], and processes it for API return. + /// + /// The item to to process. + /// A representing the asynchronous operation. + public LyricResponse? GetLyrics(BaseItem item) + { + string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); + + if (string.IsNullOrEmpty(lyricFilePath)) + { + return null; + } + + List lyricsList = new List(); + + string lyricData = System.IO.File.ReadAllText(lyricFilePath); + + // Splitting on Environment.NewLine caused some new lines to be missed in Windows. + char[] newLinedelims = new[] { '\r', '\n' }; + string[] lyricTextLines = lyricData.Split(newLinedelims, StringSplitOptions.RemoveEmptyEntries); + + if (!lyricTextLines.Any()) + { + return null; + } + + foreach (string lyricLine in lyricTextLines) + { + lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Text = lyricLine }); + } + + return new LyricResponse { Lyrics = lyricsList }; + } + } +} diff --git a/MediaBrowser.Providers/Lyric/TxtLyricsProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricsProvider.cs deleted file mode 100644 index 2a5da4e4d..000000000 --- a/MediaBrowser.Providers/Lyric/TxtLyricsProvider.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading.Tasks; -using Jellyfin.Api.Helpers; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Lyrics; - -namespace MediaBrowser.Providers.Lyric -{ - /// - /// TXT File Lyric Provider. - /// - public class TxtLyricsProvider : ILyricsProvider - { - /// - /// Initializes a new instance of the class. - /// - public TxtLyricsProvider() - { - SupportedMediaTypes = new Collection - { - "lrc", "txt" - }; - } - - /// - /// Gets a value indicating the File Extenstions this provider works with. - /// - public IEnumerable SupportedMediaTypes { get; } - - /// - /// Gets or Sets Data object generated by Process() method. - /// - /// Object with data if no error occured; otherwise, null. - public object? Data { get; set; } - - /// - /// Opens lyric file for [the specified item], and processes it for API return. - /// - /// The item to to process. - /// A representing the asynchronous operation. - public LyricResponse? GetLyrics(BaseItem item) - { - string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); - - if (string.IsNullOrEmpty(lyricFilePath)) - { - return null; - } - - List lyricsList = new List(); - - string lyricData = System.IO.File.ReadAllText(lyricFilePath); - - // Splitting on Environment.NewLine caused some new lines to be missed in Windows. - char[] newLinedelims = new[] { '\r', '\n' }; - string[] lyricTextLines = lyricData.Split(newLinedelims, StringSplitOptions.RemoveEmptyEntries); - - if (!lyricTextLines.Any()) - { - return null; - } - - foreach (string lyricLine in lyricTextLines) - { - lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Text = lyricLine }); - } - - return new LyricResponse { Lyrics = lyricsList }; - } - } -} -- cgit v1.2.3 From f740d1b9f00d91bfad970f56abed67d8c8c16c9c Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Fri, 16 Sep 2022 20:52:40 -0400 Subject: Remove use of AddParts. Cleanup use of Lyric vs Lyrics. --- Emby.Server.Implementations/ApplicationHost.cs | 2 +- Jellyfin.Api/Controllers/UserLibraryController.cs | 6 +++--- Jellyfin.Server/CoreAppHost.cs | 6 ++++++ MediaBrowser.Controller/Lyrics/ILyricManager.cs | 18 ++-------------- MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 4 ++-- MediaBrowser.Controller/Lyrics/Lyric.cs | 4 ++-- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 8 +++---- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 9 ++++++++ MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 24 ++++++++------------- MediaBrowser.Providers/Lyric/LyricManager.cs | 16 +++++--------- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 26 +++++++++-------------- 11 files changed, 53 insertions(+), 70 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs index 409fc04b1..5edc25952 100644 --- a/Emby.Server.Implementations/ApplicationHost.cs +++ b/Emby.Server.Implementations/ApplicationHost.cs @@ -789,7 +789,7 @@ namespace Emby.Server.Implementations Resolve().AddParts(GetExports(), GetExports(), GetExports()); Resolve().AddParts(GetExports()); - Resolve().AddParts(GetExports()); + //Resolve().AddParts(GetExports()); Resolve().AddParts(GetExports()); diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index 1421ab444..2cb2e9328 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -394,10 +394,10 @@ namespace Jellyfin.Api.Controllers /// Item id. /// Lyrics returned. /// Something went wrong. No Lyrics will be returned. - /// An containing the intros to play. + /// An containing the item's lyrics. [HttpGet("Users/{userId}/Items/{itemId}/Lyrics")] [ProducesResponseType(StatusCodes.Status200OK)] - public ActionResult> GetLyrics([FromRoute, Required] Guid userId, [FromRoute, Required] Guid itemId) + public ActionResult> GetLyrics([FromRoute, Required] Guid userId, [FromRoute, Required] Guid itemId) { var user = _userManager.GetUserById(userId); @@ -415,7 +415,7 @@ namespace Jellyfin.Api.Controllers return NotFound(); } - var result = _lyricManager.GetLyric(item); + var result = _lyricManager.GetLyrics(item); if (result is not null) { return Ok(result); diff --git a/Jellyfin.Server/CoreAppHost.cs b/Jellyfin.Server/CoreAppHost.cs index 67e50b92d..984711dc2 100644 --- a/Jellyfin.Server/CoreAppHost.cs +++ b/Jellyfin.Server/CoreAppHost.cs @@ -19,6 +19,7 @@ using MediaBrowser.Controller.Devices; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Events; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Lyrics; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Security; using MediaBrowser.Model.Activity; @@ -95,6 +96,11 @@ namespace Jellyfin.Server serviceCollection.AddScoped(); + foreach (var type in GetExportTypes()) + { + serviceCollection.AddSingleton(typeof(ILyricProvider), type); + } + base.RegisterServices(serviceCollection); } diff --git a/MediaBrowser.Controller/Lyrics/ILyricManager.cs b/MediaBrowser.Controller/Lyrics/ILyricManager.cs index 4fd11b9e0..c0f78d177 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricManager.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricManager.cs @@ -1,37 +1,23 @@ -#nullable disable - #pragma warning disable CS1591 -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Configuration; -using MediaBrowser.Model.Providers; namespace MediaBrowser.Controller.Lyrics { public interface ILyricManager { - /// - /// Adds the parts. - /// - /// The lyric providers. - void AddParts(IEnumerable lyricProviders); - /// /// Gets the lyrics. /// /// The media item. /// Lyrics for passed item. - LyricResponse GetLyric(BaseItem item); + LyricResponse GetLyrics(BaseItem item); /// /// Checks if requested item has a matching local lyric file. /// /// The media item. - /// True if item has a matching lyrics file; otherwise false. + /// True if item has a matching lyric file; otherwise false. bool HasLyricFile(BaseItem item); } } diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs index 691fed1fd..5e677ab26 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -22,8 +22,8 @@ namespace MediaBrowser.Controller.Lyrics /// /// Gets the lyrics. /// - /// The item to to process. - /// Task{LyricResponse}. + /// The media item. + /// If found, returns lyrics for passed item; otherwise, null. LyricResponse? GetLyrics(BaseItem item); } } diff --git a/MediaBrowser.Controller/Lyrics/Lyric.cs b/MediaBrowser.Controller/Lyrics/Lyric.cs index d44546dd3..56a0a8a72 100644 --- a/MediaBrowser.Controller/Lyrics/Lyric.cs +++ b/MediaBrowser.Controller/Lyrics/Lyric.cs @@ -1,12 +1,12 @@ namespace MediaBrowser.Controller.Lyrics { /// - /// Lyric dto. + /// Lyric model. /// public class Lyric { /// - /// Gets or sets the start time (ticks). + /// Gets or sets the start time in ticks. /// public double? Start { get; set; } diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index d44e14237..018f296b1 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -11,16 +11,16 @@ using Microsoft.AspNetCore.Mvc; namespace MediaBrowser.Controller.Lyrics { /// - /// Item helper. + /// Lyric helper methods. /// public static class LyricInfo { /// - /// Checks if requested item has a matching lyric file. + /// Gets matching lyric file for a requested item. /// - /// The current lyricProvider interface. + /// The lyricProvider interface to use. /// Path of requested item. - /// True if item has a matching lyrics file. + /// Lyric file path if passed lyric provider's supported media type is found; otherwise, null. public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath) { if (lyricProvider.SupportedMediaTypes.Any()) diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index e312638ec..498eb873c 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -6,10 +6,19 @@ using System.Collections.Generic; namespace MediaBrowser.Controller.Lyrics { + /// + /// LyricResponse model. + /// public class LyricResponse { + /// + /// Gets or sets MetaData. + /// public IDictionary MetaData { get; set; } + /// + /// Gets or sets Lyrics. + /// public IEnumerable Lyrics { get; set; } } } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 18a85c93a..10db10ac6 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -14,7 +14,7 @@ using MediaBrowser.Controller.Lyrics; namespace MediaBrowser.Providers.Lyric { /// - /// LRC File Lyric Provider. + /// LRC Lyric Provider. /// public class LrcLyricProvider : ILyricProvider { @@ -37,21 +37,15 @@ namespace MediaBrowser.Providers.Lyric public string Name { get; } /// - /// Gets a value indicating the File Extenstions this provider works with. + /// Gets a value indicating the File Extenstions this provider supports. /// public IEnumerable SupportedMediaTypes { get; } /// - /// Gets or Sets Data object generated by Process() method. - /// - /// Object with data if no error occured; otherwise, null. - public object? Data { get; set; } - - /// - /// Opens lyric file for [the specified item], and processes it for API return. + /// Opens lyric file for the requested item, and processes it for API return. /// /// The item to to process. - /// A representing the asynchronous operation. + /// If provider can determine lyrics, returns a with or without metadata; otherwise, null. public LyricResponse? GetLyrics(BaseItem item) { string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); @@ -61,9 +55,9 @@ namespace MediaBrowser.Providers.Lyric return null; } - List lyricsList = new List(); - + List lyricList = new List(); List sortedLyricData = new List(); + var metaData = new ExpandoObject() as IDictionary; string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); @@ -105,15 +99,15 @@ namespace MediaBrowser.Providers.Lyric { var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; double ticks = Convert.ToDouble(timeData, new NumberFormatInfo()) * 10000; - lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Start = Math.Ceiling(ticks), Text = sortedLyricData[i].Text }); + lyricList.Add(new Controller.Lyrics.Lyric { Start = Math.Ceiling(ticks), Text = sortedLyricData[i].Text }); } if (metaData.Any()) { - return new LyricResponse { MetaData = metaData, Lyrics = lyricsList }; + return new LyricResponse { MetaData = metaData, Lyrics = lyricList }; } - return new LyricResponse { Lyrics = lyricsList }; + return new LyricResponse { Lyrics = lyricList }; } } } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index 48572c63e..698da4686 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -36,32 +36,26 @@ namespace MediaBrowser.Providers.Lyric private readonly IMediaSourceManager _mediaSourceManager; private readonly ILocalizationManager _localization; - private ILyricProvider[] _lyricProviders; + private IEnumerable _lyricProviders; public LyricManager( ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, IMediaSourceManager mediaSourceManager, - ILocalizationManager localizationManager) + ILocalizationManager localizationManager, + IEnumerable lyricProviders) { _logger = logger; _fileSystem = fileSystem; _monitor = monitor; _mediaSourceManager = mediaSourceManager; _localization = localizationManager; + _lyricProviders = lyricProviders; } /// - public void AddParts(IEnumerable lyricProviders) - { - _lyricProviders = lyricProviders - .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0) - .ToArray(); - } - - /// - public LyricResponse GetLyric(BaseItem item) + public LyricResponse GetLyrics(BaseItem item) { foreach (ILyricProvider provider in _lyricProviders) { diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index 939d8708b..aa222ed97 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -11,7 +11,7 @@ using MediaBrowser.Controller.Lyrics; namespace MediaBrowser.Providers.Lyric { /// - /// TXT File Lyric Provider. + /// TXT Lyric Provider. /// public class TxtLyricProvider : ILyricProvider { @@ -34,21 +34,15 @@ namespace MediaBrowser.Providers.Lyric public string Name { get; } /// - /// Gets a value indicating the File Extenstions this provider works with. + /// Gets a value indicating the File Extenstions this provider supports. /// public IEnumerable SupportedMediaTypes { get; } /// - /// Gets or Sets Data object generated by Process() method. - /// - /// Object with data if no error occured; otherwise, null. - public object? Data { get; set; } - - /// - /// Opens lyric file for [the specified item], and processes it for API return. + /// Opens lyric file for the requested item, and processes it for API return. /// /// The item to to process. - /// A representing the asynchronous operation. + /// If provider can determine lyrics, returns a ; otherwise, null. public LyricResponse? GetLyrics(BaseItem item) { string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); @@ -58,25 +52,25 @@ namespace MediaBrowser.Providers.Lyric return null; } - List lyricsList = new List(); + List lyricList = new List(); string lyricData = System.IO.File.ReadAllText(lyricFilePath); // Splitting on Environment.NewLine caused some new lines to be missed in Windows. - char[] newLinedelims = new[] { '\r', '\n' }; - string[] lyricTextLines = lyricData.Split(newLinedelims, StringSplitOptions.RemoveEmptyEntries); + char[] newLineDelims = new[] { '\r', '\n' }; + string[] lyricTextLines = lyricData.Split(newLineDelims, StringSplitOptions.RemoveEmptyEntries); if (!lyricTextLines.Any()) { return null; } - foreach (string lyricLine in lyricTextLines) + foreach (string lyricTextLine in lyricTextLines) { - lyricsList.Add(new MediaBrowser.Controller.Lyrics.Lyric { Text = lyricLine }); + lyricList.Add(new Controller.Lyrics.Lyric { Text = lyricTextLine }); } - return new LyricResponse { Lyrics = lyricsList }; + return new LyricResponse { Lyrics = lyricList }; } } } -- cgit v1.2.3 From 823e2ec029d8708b71452afc7442524823d82acb Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 17 Sep 2022 09:22:07 -0400 Subject: Removing unused lines --- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 7 ------- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 -- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 2 -- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 3 --- 4 files changed, 14 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index 018f296b1..ae831b4d2 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -1,12 +1,5 @@ -using System; -using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading.Tasks; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Lyrics; -using MediaBrowser.Controller.Net; -using Microsoft.AspNetCore.Mvc; namespace MediaBrowser.Controller.Lyrics { diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 498eb873c..59ee5c7f2 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -1,7 +1,5 @@ #nullable disable -#pragma warning disable CS1591 - using System.Collections.Generic; namespace MediaBrowser.Controller.Lyrics diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 10db10ac6..ea42d7525 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -4,8 +4,6 @@ using System.Collections.ObjectModel; using System.Dynamic; using System.Globalization; using System.Linq; -using System.Threading.Tasks; -using Jellyfin.Api.Helpers; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index aa222ed97..8a51d7277 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using System.Threading.Tasks; -using System.Xml.Linq; -using Jellyfin.Api.Helpers; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; -- cgit v1.2.3 From 7d886116fd3b617cae6884a33b8b545358fa6289 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 17 Sep 2022 10:42:48 -0400 Subject: Var type refinements --- MediaBrowser.Controller/Lyrics/Lyric.cs | 2 +- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 4 ++-- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/Lyric.cs b/MediaBrowser.Controller/Lyrics/Lyric.cs index 56a0a8a72..35cdabbb9 100644 --- a/MediaBrowser.Controller/Lyrics/Lyric.cs +++ b/MediaBrowser.Controller/Lyrics/Lyric.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.Lyrics /// /// Gets or sets the start time in ticks. /// - public double? Start { get; set; } + public long? Start { get; set; } /// /// Gets or sets the text. diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 59ee5c7f2..796ca3bc3 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,9 +10,9 @@ namespace MediaBrowser.Controller.Lyrics public class LyricResponse { /// - /// Gets or sets MetaData. + /// Gets or sets Metadata. /// - public IDictionary MetaData { get; set; } + public IDictionary Metadata { get; set; } /// /// Gets or sets Lyrics. diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index ea42d7525..59a172cee 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -8,6 +8,7 @@ using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; +using Swashbuckle.AspNetCore.SwaggerGen; namespace MediaBrowser.Providers.Lyric { @@ -56,7 +57,7 @@ namespace MediaBrowser.Providers.Lyric List lyricList = new List(); List sortedLyricData = new List(); - var metaData = new ExpandoObject() as IDictionary; + IDictionary metaData = new Dictionary(); string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); try @@ -77,8 +78,8 @@ namespace MediaBrowser.Providers.Lyric { var metaDataField = metaDataRow.Split(":"); - string metaDataFieldName = metaDataField[0].Replace("[", string.Empty, StringComparison.Ordinal); - string metaDataFieldValue = metaDataField[1].Replace("]", string.Empty, StringComparison.Ordinal); + string metaDataFieldName = metaDataField[0].Replace("[", string.Empty, StringComparison.Ordinal).Trim(); + string metaDataFieldValue = metaDataField[1].Replace("]", string.Empty, StringComparison.Ordinal).Trim(); metaData.Add(metaDataFieldName, metaDataFieldValue); } @@ -96,13 +97,13 @@ namespace MediaBrowser.Providers.Lyric for (int i = 0; i < sortedLyricData.Count; i++) { var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; - double ticks = Convert.ToDouble(timeData, new NumberFormatInfo()) * 10000; - lyricList.Add(new Controller.Lyrics.Lyric { Start = Math.Ceiling(ticks), Text = sortedLyricData[i].Text }); + long ticks = Convert.ToInt64(timeData, new NumberFormatInfo()) * 10000; + lyricList.Add(new Controller.Lyrics.Lyric { Start = ticks, Text = sortedLyricData[i].Text }); } if (metaData.Any()) { - return new LyricResponse { MetaData = metaData, Lyrics = lyricList }; + return new LyricResponse { Metadata = metaData, Lyrics = lyricList }; } return new LyricResponse { Lyrics = lyricList }; -- cgit v1.2.3 From c65819221d9a84ec0ae69a243fdcb17bce7aa65f Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 17 Sep 2022 17:37:38 -0400 Subject: Code cleanups. Remove pragma commands --- MediaBrowser.Controller/Lyrics/ILyricManager.cs | 36 ++--- MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 39 +++--- MediaBrowser.Controller/Lyrics/Lyric.cs | 34 +++-- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 39 +++--- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 27 ++-- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 152 ++++++++++----------- MediaBrowser.Providers/Lyric/LyricManager.cs | 72 +++++----- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 86 +++++------- .../MediaBrowser.Providers.csproj | 1 - 9 files changed, 231 insertions(+), 255 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/ILyricManager.cs b/MediaBrowser.Controller/Lyrics/ILyricManager.cs index c0f78d177..dad0250f6 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricManager.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricManager.cs @@ -1,23 +1,23 @@ -#pragma warning disable CS1591 - using MediaBrowser.Controller.Entities; -namespace MediaBrowser.Controller.Lyrics +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Interface ILyricManager. +/// +public interface ILyricManager { - public interface ILyricManager - { - /// - /// Gets the lyrics. - /// - /// The media item. - /// Lyrics for passed item. - LyricResponse GetLyrics(BaseItem item); + /// + /// Gets the lyrics. + /// + /// The media item. + /// Lyrics for passed item. + LyricResponse GetLyrics(BaseItem item); - /// - /// Checks if requested item has a matching local lyric file. - /// - /// The media item. - /// True if item has a matching lyric file; otherwise false. - bool HasLyricFile(BaseItem item); - } + /// + /// Checks if requested item has a matching local lyric file. + /// + /// The media item. + /// True if item has a matching lyric file; otherwise false. + bool HasLyricFile(BaseItem item); } diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs index 5e677ab26..1b52de255 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -1,29 +1,28 @@ using System.Collections.Generic; using MediaBrowser.Controller.Entities; -namespace MediaBrowser.Controller.Lyrics +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Interface ILyricsProvider. +/// +public interface ILyricProvider { /// - /// Interface ILyricsProvider. + /// Gets a value indicating the provider name. /// - public interface ILyricProvider - { - /// - /// Gets a value indicating the provider name. - /// - string Name { get; } + string Name { get; } - /// - /// Gets the supported media types for this provider. - /// - /// The supported media types. - IEnumerable SupportedMediaTypes { get; } + /// + /// Gets the supported media types for this provider. + /// + /// The supported media types. + IEnumerable SupportedMediaTypes { get; } - /// - /// Gets the lyrics. - /// - /// The media item. - /// If found, returns lyrics for passed item; otherwise, null. - LyricResponse? GetLyrics(BaseItem item); - } + /// + /// Gets the lyrics. + /// + /// The media item. + /// If found, returns lyrics for passed item; otherwise, null. + LyricResponse? GetLyrics(BaseItem item); } diff --git a/MediaBrowser.Controller/Lyrics/Lyric.cs b/MediaBrowser.Controller/Lyrics/Lyric.cs index 35cdabbb9..f39fbb022 100644 --- a/MediaBrowser.Controller/Lyrics/Lyric.cs +++ b/MediaBrowser.Controller/Lyrics/Lyric.cs @@ -1,18 +1,28 @@ -namespace MediaBrowser.Controller.Lyrics +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Lyric model. +/// +public class Lyric { /// - /// Lyric model. + /// Initializes a new instance of the class. /// - public class Lyric + /// The lyric start time in ticks. + /// The lyric text. + public Lyric(string text, long? start = null) { - /// - /// Gets or sets the start time in ticks. - /// - public long? Start { get; set; } - - /// - /// Gets or sets the text. - /// - public string Text { get; set; } = string.Empty; + Start = start; + Text = text; } + + /// + /// Gets the start time in ticks. + /// + public long? Start { get; } + + /// + /// Gets the text. + /// + public string Text { get; } } diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index ae831b4d2..61e205b6c 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -1,34 +1,29 @@ using System.IO; -using System.Linq; -namespace MediaBrowser.Controller.Lyrics +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Lyric helper methods. +/// +public static class LyricInfo { /// - /// Lyric helper methods. + /// Gets matching lyric file for a requested item. /// - public static class LyricInfo + /// The lyricProvider interface to use. + /// Path of requested item. + /// Lyric file path if passed lyric provider's supported media type is found; otherwise, null. + public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath) { - /// - /// Gets matching lyric file for a requested item. - /// - /// The lyricProvider interface to use. - /// Path of requested item. - /// Lyric file path if passed lyric provider's supported media type is found; otherwise, null. - public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath) + foreach (string lyricFileExtension in lyricProvider.SupportedMediaTypes) { - if (lyricProvider.SupportedMediaTypes.Any()) + var lyricFilePath = Path.ChangeExtension(itemPath, lyricFileExtension); + if (File.Exists(lyricFilePath)) { - foreach (string lyricFileExtension in lyricProvider.SupportedMediaTypes) - { - string lyricFilePath = @Path.ChangeExtension(itemPath, lyricFileExtension); - if (System.IO.File.Exists(lyricFilePath)) - { - return lyricFilePath; - } - } + return lyricFilePath; } - - return null; } + + return null; } } diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 796ca3bc3..e18cb1101 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -1,22 +1,19 @@ -#nullable disable - using System.Collections.Generic; -namespace MediaBrowser.Controller.Lyrics +namespace MediaBrowser.Controller.Lyrics; + +/// +/// LyricResponse model. +/// +public class LyricResponse { /// - /// LyricResponse model. + /// Gets or sets Metadata. /// - public class LyricResponse - { - /// - /// Gets or sets Metadata. - /// - public IDictionary Metadata { get; set; } + public IDictionary? Metadata { get; set; } - /// - /// Gets or sets Lyrics. - /// - public IEnumerable Lyrics { get; set; } - } + /// + /// Gets or sets Lyrics. + /// + public IEnumerable? Lyrics { get; set; } } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 59a172cee..9bacfc296 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -1,112 +1,102 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Dynamic; using System.Globalization; using System.Linq; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; -using Swashbuckle.AspNetCore.SwaggerGen; -namespace MediaBrowser.Providers.Lyric +namespace MediaBrowser.Providers.Lyric; + +/// +/// LRC Lyric Provider. +/// +public class LrcLyricProvider : ILyricProvider { - /// - /// LRC Lyric Provider. - /// - public class LrcLyricProvider : ILyricProvider - { - /// - /// Initializes a new instance of the class. - /// - public LrcLyricProvider() - { - Name = "LrcLyricProvider"; + /// + public string Name { get; } = "LrcLyricProvider"; - SupportedMediaTypes = new Collection + /// + public IEnumerable SupportedMediaTypes + { + get => new Collection { "lrc" }; - } + } - /// - /// Gets a value indicating the provider name. - /// - public string Name { get; } - - /// - /// Gets a value indicating the File Extenstions this provider supports. - /// - public IEnumerable SupportedMediaTypes { get; } - - /// - /// Opens lyric file for the requested item, and processes it for API return. - /// - /// The item to to process. - /// If provider can determine lyrics, returns a with or without metadata; otherwise, null. - public LyricResponse? GetLyrics(BaseItem item) - { - string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); + /// + /// Opens lyric file for the requested item, and processes it for API return. + /// + /// The item to to process. + /// If provider can determine lyrics, returns a with or without metadata; otherwise, null. + public LyricResponse? GetLyrics(BaseItem item) + { + string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); - if (string.IsNullOrEmpty(lyricFilePath)) - { - return null; - } + if (string.IsNullOrEmpty(lyricFilePath)) + { + return null; + } - List lyricList = new List(); - List sortedLyricData = new List(); + List lyricList = new List(); + List sortedLyricData = new List(); - IDictionary metaData = new Dictionary(); - string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); + IDictionary metaData = new Dictionary(); + string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); - try + try + { + // Parse and sort lyric rows + LyricParser lrcLyricParser = new LrcParser.Parser.Lrc.LrcParser(); + Song lyricData = lrcLyricParser.Decode(lrcFileContent); + sortedLyricData = lyricData.Lyrics.Where(x => x.TimeTags.Count > 0).OrderBy(x => x.TimeTags.First().Value).ToList(); + + // Parse metadata rows + var metaDataRows = lyricData.Lyrics + .Where(x => x.TimeTags.Count == 0) + .Where(x => x.Text.StartsWith('[') && x.Text.EndsWith(']')) + .Select(x => x.Text) + .ToList(); + + foreach (string metaDataRow in metaDataRows) { - // Parse and sort lyric rows - LyricParser lrcLyricParser = new LrcParser.Parser.Lrc.LrcParser(); - Song lyricData = lrcLyricParser.Decode(lrcFileContent); - sortedLyricData = lyricData.Lyrics.Where(x => x.TimeTags.Count > 0).OrderBy(x => x.TimeTags.ToArray()[0].Value).ToList(); - - // Parse metadata rows - var metaDataRows = lyricData.Lyrics - .Where(x => x.TimeTags.Count == 0) - .Where(x => x.Text.StartsWith("[", StringComparison.Ordinal) && x.Text.EndsWith("]", StringComparison.Ordinal)) - .Select(x => x.Text) - .ToList(); - - foreach (string metaDataRow in metaDataRows) + var metaDataField = metaDataRow.Split(':'); + if (metaDataField.Length != 2) { - var metaDataField = metaDataRow.Split(":"); - - string metaDataFieldName = metaDataField[0].Replace("[", string.Empty, StringComparison.Ordinal).Trim(); - string metaDataFieldValue = metaDataField[1].Replace("]", string.Empty, StringComparison.Ordinal).Trim(); - - metaData.Add(metaDataFieldName, metaDataFieldValue); + continue; } - } - catch - { - return null; - } - if (!sortedLyricData.Any()) - { - return null; - } + string metaDataFieldName = metaDataField[0][1..].Trim(); + string metaDataFieldValue = metaDataField[1][..^1].Trim(); - for (int i = 0; i < sortedLyricData.Count; i++) - { - var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; - long ticks = Convert.ToInt64(timeData, new NumberFormatInfo()) * 10000; - lyricList.Add(new Controller.Lyrics.Lyric { Start = ticks, Text = sortedLyricData[i].Text }); + metaData.Add(metaDataFieldName, metaDataFieldValue); } + } + catch + { + return null; + } - if (metaData.Any()) - { - return new LyricResponse { Metadata = metaData, Lyrics = lyricList }; - } + if (sortedLyricData.Count == 0) + { + return null; + } - return new LyricResponse { Lyrics = lyricList }; + for (int i = 0; i < sortedLyricData.Count; i++) + { + var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; + long ticks = TimeSpan.FromMilliseconds((double)timeData).Ticks; + lyricList.Add(new Controller.Lyrics.Lyric(sortedLyricData[i].Text, ticks)); } + + if (metaData.Any()) + { + return new LyricResponse { Metadata = metaData, Lyrics = lyricList }; + } + + return new LyricResponse { Lyrics = lyricList }; } } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index f5560b054..06f913d07 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -1,55 +1,57 @@ -#nullable disable - -#pragma warning disable CS1591 - using System.Collections.Generic; using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; -namespace MediaBrowser.Providers.Lyric +namespace MediaBrowser.Providers.Lyric; + +/// +/// Lyric Manager. +/// +public class LyricManager : ILyricManager { - public class LyricManager : ILyricManager - { - private readonly ILyricProvider[] _lyricProviders; + private readonly ILyricProvider[] _lyricProviders; - public LyricManager(IEnumerable lyricProviders) - { - _lyricProviders = lyricProviders.ToArray(); - } + /// + /// Initializes a new instance of the class. + /// + /// All found lyricProviders. + public LyricManager(IEnumerable lyricProviders) + { + _lyricProviders = lyricProviders.ToArray(); + } - /// - public LyricResponse GetLyrics(BaseItem item) + /// + public LyricResponse GetLyrics(BaseItem item) + { + foreach (ILyricProvider provider in _lyricProviders) { - foreach (ILyricProvider provider in _lyricProviders) + var results = provider.GetLyrics(item); + if (results is not null) { - var results = provider.GetLyrics(item); - if (results is not null) - { - return results; - } + return results; } - - return null; } - /// - public bool HasLyricFile(BaseItem item) + return null; + } + + /// + public bool HasLyricFile(BaseItem item) + { + foreach (ILyricProvider provider in _lyricProviders) { - foreach (ILyricProvider provider in _lyricProviders) + if (item is null) { - if (item is null) - { - continue; - } - - if (LyricInfo.GetLyricFilePath(provider, item.Path) is not null) - { - return true; - } + continue; } - return false; + if (LyricInfo.GetLyricFilePath(provider, item.Path) is not null) + { + return true; + } } + + return false; } } diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index 8a51d7277..d417c8598 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -5,69 +5,53 @@ using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; -namespace MediaBrowser.Providers.Lyric +namespace MediaBrowser.Providers.Lyric; + +/// +/// TXT Lyric Provider. +/// +public class TxtLyricProvider : ILyricProvider { - /// - /// TXT Lyric Provider. - /// - public class TxtLyricProvider : ILyricProvider - { - /// - /// Initializes a new instance of the class. - /// - public TxtLyricProvider() - { - Name = "TxtLyricProvider"; + /// + public string Name { get; } = "TxtLyricProvider"; - SupportedMediaTypes = new Collection + /// + public IEnumerable SupportedMediaTypes + { + get => new Collection { "lrc", "txt" }; - } - - /// - /// Gets a value indicating the provider name. - /// - public string Name { get; } + } - /// - /// Gets a value indicating the File Extenstions this provider supports. - /// - public IEnumerable SupportedMediaTypes { get; } + /// + /// Opens lyric file for the requested item, and processes it for API return. + /// + /// The item to to process. + /// If provider can determine lyrics, returns a ; otherwise, null. + public LyricResponse? GetLyrics(BaseItem item) + { + string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); - /// - /// Opens lyric file for the requested item, and processes it for API return. - /// - /// The item to to process. - /// If provider can determine lyrics, returns a ; otherwise, null. - public LyricResponse? GetLyrics(BaseItem item) + if (string.IsNullOrEmpty(lyricFilePath)) { - string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); - - if (string.IsNullOrEmpty(lyricFilePath)) - { - return null; - } - - List lyricList = new List(); - - string lyricData = System.IO.File.ReadAllText(lyricFilePath); + return null; + } - // Splitting on Environment.NewLine caused some new lines to be missed in Windows. - char[] newLineDelims = new[] { '\r', '\n' }; - string[] lyricTextLines = lyricData.Split(newLineDelims, StringSplitOptions.RemoveEmptyEntries); + string[] lyricTextLines = System.IO.File.ReadAllLines(lyricFilePath); - if (!lyricTextLines.Any()) - { - return null; - } + List lyricList = new List(); - foreach (string lyricTextLine in lyricTextLines) - { - lyricList.Add(new Controller.Lyrics.Lyric { Text = lyricTextLine }); - } + if (lyricTextLines.Length == 0) + { + return null; + } - return new LyricResponse { Lyrics = lyricList }; + foreach (string lyricTextLine in lyricTextLines) + { + lyricList.Add(new Controller.Lyrics.Lyric(lyricTextLine)); } + + return new LyricResponse { Lyrics = lyricList }; } } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 8514489f8..e12776ba0 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -6,7 +6,6 @@ - -- cgit v1.2.3 From 64b013b121f472d2658e5f2b3a672c4c4ced342d Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 17 Sep 2022 17:48:27 -0400 Subject: Resolve Azure build issues --- MediaBrowser.Controller/Lyrics/ILyricManager.cs | 2 +- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 7 ++++++- MediaBrowser.Providers/Lyric/LyricManager.cs | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/ILyricManager.cs b/MediaBrowser.Controller/Lyrics/ILyricManager.cs index dad0250f6..5920bcc62 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricManager.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricManager.cs @@ -12,7 +12,7 @@ public interface ILyricManager /// /// The media item. /// Lyrics for passed item. - LyricResponse GetLyrics(BaseItem item); + LyricResponse? GetLyrics(BaseItem item); /// /// Checks if requested item has a matching local lyric file. diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 9bacfc296..db87d9236 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -87,7 +87,12 @@ public class LrcLyricProvider : ILyricProvider for (int i = 0; i < sortedLyricData.Count; i++) { - var timeData = sortedLyricData[i].TimeTags.ToArray()[0].Value; + var timeData = sortedLyricData[i].TimeTags.First().Value; + if (timeData is null) + { + continue; + } + long ticks = TimeSpan.FromMilliseconds((double)timeData).Ticks; lyricList.Add(new Controller.Lyrics.Lyric(sortedLyricData[i].Text, ticks)); } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index 06f913d07..0de008db7 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -22,7 +22,7 @@ public class LyricManager : ILyricManager } /// - public LyricResponse GetLyrics(BaseItem item) + public LyricResponse? GetLyrics(BaseItem item) { foreach (ILyricProvider provider in _lyricProviders) { -- cgit v1.2.3 From 0b86630be7737e28555f0132322ecd02915284c5 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 17 Sep 2022 19:47:29 -0400 Subject: Use model properties for LRC metadata --- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 +- MediaBrowser.Controller/Lyrics/Metadata.cs | 54 ++++++++++++++++++++++ .../MediaBrowser.Controller.csproj | 1 + MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 11 +++-- 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 MediaBrowser.Controller/Lyrics/Metadata.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index e18cb1101..adc13050e 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,7 +10,7 @@ public class LyricResponse /// /// Gets or sets Metadata. /// - public IDictionary? Metadata { get; set; } + public Metadata? Metadata { get; set; } /// /// Gets or sets Lyrics. diff --git a/MediaBrowser.Controller/Lyrics/Metadata.cs b/MediaBrowser.Controller/Lyrics/Metadata.cs new file mode 100644 index 000000000..114b56777 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/Metadata.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Metadata model. +/// +public class Metadata +{ + /// + /// Gets or sets Artist - [ar:The song artist]. + /// + public string? Ar { get; set; } + + /// + /// Gets or sets Album - [al:The album this song is on]. + /// + public string? Al { get; set; } + + /// + /// Gets or sets Title - [ti:The title of the song]. + /// + public string? Ti { get; set; } + + /// + /// Gets or sets Author - [au:Creator of the lyric data]. + /// + public string? Au { get; set; } + + /// + /// Gets or sets Length - [length:How long the song is]. + /// + public string? Length { get; set; } + + /// + /// Gets or sets By - [by:Creator of the LRC file]. + /// + public string? By { get; set; } + + /// + /// Gets or sets Offset - [offsec:+/- Timestamp adjustment in milliseconds]. + /// + public string? Offset { get; set; } + + /// + /// Gets or sets Creator - [re:The Software used to create the LRC file]. + /// + public string? Re { get; set; } + + /// + /// Gets or sets Version - [ve:The version of the Creator used]. + /// + public string? Ve { get; set; } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index d4e025a43..c08e276dc 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -18,6 +18,7 @@ + diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index db87d9236..b527c5303 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.Linq; +using AutoMapper; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; @@ -44,7 +45,8 @@ public class LrcLyricProvider : ILyricProvider List lyricList = new List(); List sortedLyricData = new List(); - IDictionary metaData = new Dictionary(); + // Must be for automapper support + IDictionary metaData = new Dictionary(); string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); try @@ -69,7 +71,7 @@ public class LrcLyricProvider : ILyricProvider continue; } - string metaDataFieldName = metaDataField[0][1..].Trim(); + string metaDataFieldName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(metaDataField[0][1..].Trim().ToLowerInvariant()); string metaDataFieldValue = metaDataField[1][..^1].Trim(); metaData.Add(metaDataFieldName, metaDataFieldValue); @@ -85,6 +87,9 @@ public class LrcLyricProvider : ILyricProvider return null; } + var config = new MapperConfiguration(cfg => { }); + var mapper = config.CreateMapper(); + for (int i = 0; i < sortedLyricData.Count; i++) { var timeData = sortedLyricData[i].TimeTags.First().Value; @@ -99,7 +104,7 @@ public class LrcLyricProvider : ILyricProvider if (metaData.Any()) { - return new LyricResponse { Metadata = metaData, Lyrics = lyricList }; + return new LyricResponse { Metadata = mapper.Map(metaData), Lyrics = lyricList }; } return new LyricResponse { Lyrics = lyricList }; -- cgit v1.2.3 From a52d108af6b8519715bc7005e7db3f1a116760bc Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 11:47:57 -0400 Subject: Remove automapper tool --- MediaBrowser.Controller/Lyrics/LyricMetadata.cs | 52 +++++++++++++++ MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 +- MediaBrowser.Controller/Lyrics/Metadata.cs | 54 --------------- .../MediaBrowser.Controller.csproj | 1 - MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 78 +++++++++++++++++++--- 5 files changed, 120 insertions(+), 67 deletions(-) create mode 100644 MediaBrowser.Controller/Lyrics/LyricMetadata.cs delete mode 100644 MediaBrowser.Controller/Lyrics/Metadata.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricMetadata.cs b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs new file mode 100644 index 000000000..36a833f85 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs @@ -0,0 +1,52 @@ +namespace MediaBrowser.Controller.Lyrics; + +/// +/// LyricMetadata model. +/// +public class LyricMetadata +{ + /// + /// Gets or sets Artist - The song artist. + /// + public string? Artist { get; set; } + + /// + /// Gets or sets Album - The album this song is on. + /// + public string? Album { get; set; } + + /// + /// Gets or sets Title - The title of the song. + /// + public string? Title { get; set; } + + /// + /// Gets or sets Author - Creator of the lyric data. + /// + public string? Author { get; set; } + + /// + /// Gets or sets Length - How long the song is. + /// + public string? Length { get; set; } + + /// + /// Gets or sets By - Creator of the LRC file. + /// + public string? By { get; set; } + + /// + /// Gets or sets Offset - Offset:+/- Timestamp adjustment in milliseconds. + /// + public string? Offset { get; set; } + + /// + /// Gets or sets Creator - The Software used to create the LRC file. + /// + public string? Creator { get; set; } + + /// + /// Gets or sets Version - The version of the Creator used. + /// + public string? Version { get; set; } +} diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index adc13050e..989248388 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,7 +10,7 @@ public class LyricResponse /// /// Gets or sets Metadata. /// - public Metadata? Metadata { get; set; } + public LyricMetadata? Metadata { get; set; } /// /// Gets or sets Lyrics. diff --git a/MediaBrowser.Controller/Lyrics/Metadata.cs b/MediaBrowser.Controller/Lyrics/Metadata.cs deleted file mode 100644 index 114b56777..000000000 --- a/MediaBrowser.Controller/Lyrics/Metadata.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Lyrics; - -/// -/// Metadata model. -/// -public class Metadata -{ - /// - /// Gets or sets Artist - [ar:The song artist]. - /// - public string? Ar { get; set; } - - /// - /// Gets or sets Album - [al:The album this song is on]. - /// - public string? Al { get; set; } - - /// - /// Gets or sets Title - [ti:The title of the song]. - /// - public string? Ti { get; set; } - - /// - /// Gets or sets Author - [au:Creator of the lyric data]. - /// - public string? Au { get; set; } - - /// - /// Gets or sets Length - [length:How long the song is]. - /// - public string? Length { get; set; } - - /// - /// Gets or sets By - [by:Creator of the LRC file]. - /// - public string? By { get; set; } - - /// - /// Gets or sets Offset - [offsec:+/- Timestamp adjustment in milliseconds]. - /// - public string? Offset { get; set; } - - /// - /// Gets or sets Creator - [re:The Software used to create the LRC file]. - /// - public string? Re { get; set; } - - /// - /// Gets or sets Version - [ve:The version of the Creator used]. - /// - public string? Ve { get; set; } -} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index c08e276dc..d4e025a43 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -18,7 +18,6 @@ - diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index b527c5303..4cc06dac8 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Globalization; using System.Linq; -using AutoMapper; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; +using Newtonsoft.Json.Linq; namespace MediaBrowser.Providers.Lyric; @@ -45,8 +44,7 @@ public class LrcLyricProvider : ILyricProvider List lyricList = new List(); List sortedLyricData = new List(); - // Must be for automapper support - IDictionary metaData = new Dictionary(); + IDictionary fileMetaData = new Dictionary(); string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); try @@ -71,10 +69,10 @@ public class LrcLyricProvider : ILyricProvider continue; } - string metaDataFieldName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(metaDataField[0][1..].Trim().ToLowerInvariant()); + string metaDataFieldName = metaDataField[0][1..].Trim().ToLowerInvariant(); string metaDataFieldValue = metaDataField[1][..^1].Trim(); - metaData.Add(metaDataFieldName, metaDataFieldValue); + fileMetaData.Add(metaDataFieldName, metaDataFieldValue); } } catch @@ -87,9 +85,6 @@ public class LrcLyricProvider : ILyricProvider return null; } - var config = new MapperConfiguration(cfg => { }); - var mapper = config.CreateMapper(); - for (int i = 0; i < sortedLyricData.Count; i++) { var timeData = sortedLyricData[i].TimeTags.First().Value; @@ -102,11 +97,72 @@ public class LrcLyricProvider : ILyricProvider lyricList.Add(new Controller.Lyrics.Lyric(sortedLyricData[i].Text, ticks)); } - if (metaData.Any()) + if (fileMetaData.Any()) { - return new LyricResponse { Metadata = mapper.Map(metaData), Lyrics = lyricList }; + // Map metaData values from LRC file to LyricMetadata properties + LyricMetadata lyricMetadata = MapMetadataValues(fileMetaData); + + return new LyricResponse { Metadata = lyricMetadata, Lyrics = lyricList }; } return new LyricResponse { Lyrics = lyricList }; } + + /// + /// Converts metadata from an LRC file to LyricMetadata properties. + /// + /// The metadata from the LRC file. + /// A lyricMetadata object with mapped property data. + private LyricMetadata MapMetadataValues(IDictionary metaData) + { + LyricMetadata lyricMetadata = new LyricMetadata(); + + if (metaData.TryGetValue("ar", out var artist) && artist is not null) + { + lyricMetadata.Artist = artist; + } + + if (metaData.TryGetValue("al", out var album) && album is not null) + { + lyricMetadata.Album = album; + } + + if (metaData.TryGetValue("ti", out var title) && title is not null) + { + lyricMetadata.Title = title; + } + + if (metaData.TryGetValue("au", out var author) && author is not null) + { + lyricMetadata.Author = author; + } + + if (metaData.TryGetValue("length", out var length) && length is not null) + { + lyricMetadata.Length = length; + } + + if (metaData.TryGetValue("by", out var by) && by is not null) + { + lyricMetadata.By = by; + } + + if (metaData.TryGetValue("offset", out var offset) && offset is not null) + { + lyricMetadata.Offset = offset; + } + + if (metaData.TryGetValue("re", out var creator) && creator is not null) + { + lyricMetadata.Creator = creator; + } + + if (metaData.TryGetValue("ve", out var version) && version is not null) + { + lyricMetadata.Version = version; + } + + return lyricMetadata; + + } } -- cgit v1.2.3 From f737581d49dd9f6ab0c68269f8be073df27fb0ba Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 13:13:01 -0400 Subject: Use providers in order of priority --- MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 7 ++++ MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 48 ++++++++++++++++-------- MediaBrowser.Providers/Lyric/LyricManager.cs | 2 +- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 7 ++++ 4 files changed, 47 insertions(+), 17 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs index 1b52de255..651fe507f 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Resolvers; namespace MediaBrowser.Controller.Lyrics; @@ -13,6 +14,12 @@ public interface ILyricProvider /// string Name { get; } + /// + /// Gets the priority. + /// + /// The priority. + ResolverPriority Priority { get; } + /// /// Gets the supported media types for this provider. /// diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 90396e553..4690c3e20 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Linq; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; -using Newtonsoft.Json.Linq; +using MediaBrowser.Controller.Resolvers; +using Microsoft.Extensions.Logging; namespace MediaBrowser.Providers.Lyric; @@ -15,9 +15,26 @@ namespace MediaBrowser.Providers.Lyric; /// public class LrcLyricProvider : ILyricProvider { + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// Instance of the interface. + public LrcLyricProvider(ILogger logger) + { + _logger = logger; + } + /// public string Name => "LrcLyricProvider"; + /// + /// Gets the priority. + /// + /// The priority. + public ResolverPriority Priority => ResolverPriority.First; + /// public IEnumerable SupportedMediaTypes { get; } = new[] { "lrc" }; @@ -38,7 +55,7 @@ public class LrcLyricProvider : ILyricProvider List lyricList = new List(); List sortedLyricData = new List(); - IDictionary fileMetaData = new Dictionary(); + IDictionary fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); try @@ -63,15 +80,15 @@ public class LrcLyricProvider : ILyricProvider continue; } - string metaDataFieldName = metaDataField[0][1..].Trim().ToLowerInvariant(); + string metaDataFieldName = metaDataField[0][1..].Trim(); string metaDataFieldValue = metaDataField[1][..^1].Trim(); fileMetaData.Add(metaDataFieldName, metaDataFieldValue); } } - catch + catch (Exception ex) { - return null; + _logger.LogError(ex, "Error parsing lyric data from {Provider}", Name); } if (sortedLyricData.Count == 0) @@ -111,52 +128,51 @@ public class LrcLyricProvider : ILyricProvider { LyricMetadata lyricMetadata = new LyricMetadata(); - if (metaData.TryGetValue("ar", out var artist) && artist is not null) + if (metaData.TryGetValue("ar", out var artist) && !string.IsNullOrEmpty(artist)) { lyricMetadata.Artist = artist; } - if (metaData.TryGetValue("al", out var album) && album is not null) + if (metaData.TryGetValue("al", out var album) && !string.IsNullOrEmpty(album)) { lyricMetadata.Album = album; } - if (metaData.TryGetValue("ti", out var title) && title is not null) + if (metaData.TryGetValue("ti", out var title) && !string.IsNullOrEmpty(title)) { lyricMetadata.Title = title; } - if (metaData.TryGetValue("au", out var author) && author is not null) + if (metaData.TryGetValue("au", out var author) && !string.IsNullOrEmpty(author)) { lyricMetadata.Author = author; } - if (metaData.TryGetValue("length", out var length) && length is not null) + if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length)) { lyricMetadata.Length = length; } - if (metaData.TryGetValue("by", out var by) && by is not null) + if (metaData.TryGetValue("by", out var by) && !string.IsNullOrEmpty(by)) { lyricMetadata.By = by; } - if (metaData.TryGetValue("offset", out var offset) && offset is not null) + if (metaData.TryGetValue("offset", out var offset) && !string.IsNullOrEmpty(offset)) { lyricMetadata.Offset = offset; } - if (metaData.TryGetValue("re", out var creator) && creator is not null) + if (metaData.TryGetValue("re", out var creator) && !string.IsNullOrEmpty(creator)) { lyricMetadata.Creator = creator; } - if (metaData.TryGetValue("ve", out var version) && version is not null) + if (metaData.TryGetValue("ve", out var version) && !string.IsNullOrEmpty(version)) { lyricMetadata.Version = version; } return lyricMetadata; - } } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index 0de008db7..7487c6861 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -18,7 +18,7 @@ public class LyricManager : ILyricManager /// All found lyricProviders. public LyricManager(IEnumerable lyricProviders) { - _lyricProviders = lyricProviders.ToArray(); + _lyricProviders = lyricProviders.OrderBy(i => i.Priority).ToArray(); } /// diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index a2161c427..c69008686 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; +using MediaBrowser.Controller.Resolvers; namespace MediaBrowser.Providers.Lyric; @@ -15,6 +16,12 @@ public class TxtLyricProvider : ILyricProvider /// public string Name => "TxtLyricProvider"; + /// + /// Gets the priority. + /// + /// The priority. + public ResolverPriority Priority => ResolverPriority.Second; + /// public IEnumerable SupportedMediaTypes { get; } = new[] { "lrc", "txt" }; -- cgit v1.2.3 From dce81d88182c90fdce90f2690b3adb22485fecd4 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 14:53:25 -0400 Subject: Update MediaBrowser.Controller/Lyrics/LyricResponse.cs Co-authored-by: Niels van Velzen --- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 989248388..f3d8b07bc 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,7 +10,7 @@ public class LyricResponse /// /// Gets or sets Metadata. /// - public LyricMetadata? Metadata { get; set; } + public LyricMetadata Metadata { get; set; } /// /// Gets or sets Lyrics. -- cgit v1.2.3 From dddebec794c72242952cb45e84fed452d828a641 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 14:53:36 -0400 Subject: Update MediaBrowser.Controller/Lyrics/LyricResponse.cs Co-authored-by: Niels van Velzen --- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index f3d8b07bc..405e8cac1 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -15,5 +15,5 @@ public class LyricResponse /// /// Gets or sets Lyrics. /// - public IEnumerable? Lyrics { get; set; } + public IEnumerable Lyrics { get; set; } } -- cgit v1.2.3 From 7e923e268865d8c0933a22247424d205429a474b Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 16:05:50 -0400 Subject: Use numeric values for metadata values --- MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 2 +- MediaBrowser.Controller/Lyrics/Lyric.cs | 28 ------------- MediaBrowser.Controller/Lyrics/LyricLine.cs | 28 +++++++++++++ MediaBrowser.Controller/Lyrics/LyricMetadata.cs | 6 ++- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 2 +- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 53 ++++++++++++++++++++---- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 9 ++-- 7 files changed, 81 insertions(+), 47 deletions(-) delete mode 100644 MediaBrowser.Controller/Lyrics/Lyric.cs create mode 100644 MediaBrowser.Controller/Lyrics/LyricLine.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs index 651fe507f..c5b625226 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -24,7 +24,7 @@ public interface ILyricProvider /// Gets the supported media types for this provider. /// /// The supported media types. - IEnumerable SupportedMediaTypes { get; } + IReadOnlyCollection SupportedMediaTypes { get; } /// /// Gets the lyrics. diff --git a/MediaBrowser.Controller/Lyrics/Lyric.cs b/MediaBrowser.Controller/Lyrics/Lyric.cs deleted file mode 100644 index f39fbb022..000000000 --- a/MediaBrowser.Controller/Lyrics/Lyric.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace MediaBrowser.Controller.Lyrics; - -/// -/// Lyric model. -/// -public class Lyric -{ - /// - /// Initializes a new instance of the class. - /// - /// The lyric start time in ticks. - /// The lyric text. - public Lyric(string text, long? start = null) - { - Start = start; - Text = text; - } - - /// - /// Gets the start time in ticks. - /// - public long? Start { get; } - - /// - /// Gets the text. - /// - public string Text { get; } -} diff --git a/MediaBrowser.Controller/Lyrics/LyricLine.cs b/MediaBrowser.Controller/Lyrics/LyricLine.cs new file mode 100644 index 000000000..43997f656 --- /dev/null +++ b/MediaBrowser.Controller/Lyrics/LyricLine.cs @@ -0,0 +1,28 @@ +namespace MediaBrowser.Controller.Lyrics; + +/// +/// Lyric model. +/// +public class LyricLine +{ + /// + /// Initializes a new instance of the class. + /// + /// The lyric start time in ticks. + /// The lyric text. + public LyricLine(string text, long? start = null) + { + Start = start; + Text = text; + } + + /// + /// Gets the start time in ticks. + /// + public long? Start { get; } + + /// + /// Gets the text. + /// + public string Text { get; } +} diff --git a/MediaBrowser.Controller/Lyrics/LyricMetadata.cs b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs index 36a833f85..0ba777975 100644 --- a/MediaBrowser.Controller/Lyrics/LyricMetadata.cs +++ b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs @@ -1,3 +1,5 @@ +using System; + namespace MediaBrowser.Controller.Lyrics; /// @@ -28,7 +30,7 @@ public class LyricMetadata /// /// Gets or sets Length - How long the song is. /// - public string? Length { get; set; } + public long? Length { get; set; } /// /// Gets or sets By - Creator of the LRC file. @@ -38,7 +40,7 @@ public class LyricMetadata /// /// Gets or sets Offset - Offset:+/- Timestamp adjustment in milliseconds. /// - public string? Offset { get; set; } + public long? Offset { get; set; } /// /// Gets or sets Creator - The Software used to create the LRC file. diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 405e8cac1..b3c65ac8c 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -15,5 +15,5 @@ public class LyricResponse /// /// Gets or sets Lyrics. /// - public IEnumerable Lyrics { get; set; } + public IEnumerable Lyrics { get; set; } } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 4690c3e20..50fa519b3 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Model.Entities; using Microsoft.Extensions.Logging; namespace MediaBrowser.Providers.Lyric; @@ -36,7 +38,7 @@ public class LrcLyricProvider : ILyricProvider public ResolverPriority Priority => ResolverPriority.First; /// - public IEnumerable SupportedMediaTypes { get; } = new[] { "lrc" }; + public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc" }; /// /// Opens lyric file for the requested item, and processes it for API return. @@ -52,7 +54,7 @@ public class LrcLyricProvider : ILyricProvider return null; } - List lyricList = new List(); + List lyricList = new List(); List sortedLyricData = new List(); IDictionary fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -74,14 +76,28 @@ public class LrcLyricProvider : ILyricProvider foreach (string metaDataRow in metaDataRows) { - var metaDataField = metaDataRow.Split(':'); - if (metaDataField.Length != 2) + int colonCount = metaDataRow.Count(f => (f == ':')); + if (colonCount == 0) { continue; } - string metaDataFieldName = metaDataField[0][1..].Trim(); - string metaDataFieldValue = metaDataField[1][..^1].Trim(); + string[] metaDataField; + string metaDataFieldName; + string metaDataFieldValue; + + if (colonCount == 1) + { + metaDataField = metaDataRow.Split(':'); + metaDataFieldName = metaDataField[0][1..].Trim(); + metaDataFieldValue = metaDataField[1][..^1].Trim(); + } + else + { + int colonIndex = metaDataRow.IndexOf(':', StringComparison.OrdinalIgnoreCase); + metaDataFieldName = metaDataRow[..colonIndex][1..].Trim(); + metaDataFieldValue = metaDataRow[(colonIndex + 1)..][..^1].Trim(); + } fileMetaData.Add(metaDataFieldName, metaDataFieldValue); } @@ -105,7 +121,7 @@ public class LrcLyricProvider : ILyricProvider } long ticks = TimeSpan.FromMilliseconds(timeData.Value).Ticks; - lyricList.Add(new Controller.Lyrics.Lyric(sortedLyricData[i].Text, ticks)); + lyricList.Add(new LyricLine(sortedLyricData[i].Text, ticks)); } if (fileMetaData.Count != 0) @@ -150,7 +166,23 @@ public class LrcLyricProvider : ILyricProvider if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length)) { - lyricMetadata.Length = length; + // Ensure minutes include leading zero + var lengthData = length.Split(':'); + if (lengthData[0].Length == 1) + { + length = "0" + length; + } + + // If only Minutes and Seconds were provided, prepend zeros for hours + if (lengthData.Length == 2) + { + length = "00:" + length; + } + + if (DateTime.TryParseExact(length, "HH:mm:ss", null, DateTimeStyles.None, out var value)) + { + lyricMetadata.Length = value.TimeOfDay.Ticks; + } } if (metaData.TryGetValue("by", out var by) && !string.IsNullOrEmpty(by)) @@ -160,7 +192,10 @@ public class LrcLyricProvider : ILyricProvider if (metaData.TryGetValue("offset", out var offset) && !string.IsNullOrEmpty(offset)) { - lyricMetadata.Offset = offset; + if (int.TryParse(offset, out var value)) + { + lyricMetadata.Offset = TimeSpan.FromMilliseconds(value).Ticks; + } } if (metaData.TryGetValue("re", out var creator) && !string.IsNullOrEmpty(creator)) diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index c69008686..cd0e1599e 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -1,7 +1,4 @@ -using System; using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; using MediaBrowser.Controller.Resolvers; @@ -23,7 +20,7 @@ public class TxtLyricProvider : ILyricProvider public ResolverPriority Priority => ResolverPriority.Second; /// - public IEnumerable SupportedMediaTypes { get; } = new[] { "lrc", "txt" }; + public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc", "txt" }; /// /// Opens lyric file for the requested item, and processes it for API return. @@ -41,7 +38,7 @@ public class TxtLyricProvider : ILyricProvider string[] lyricTextLines = System.IO.File.ReadAllLines(lyricFilePath); - List lyricList = new List(); + List lyricList = new List(); if (lyricTextLines.Length == 0) { @@ -50,7 +47,7 @@ public class TxtLyricProvider : ILyricProvider foreach (string lyricTextLine in lyricTextLines) { - lyricList.Add(new Controller.Lyrics.Lyric(lyricTextLine)); + lyricList.Add(new LyricLine(lyricTextLine)); } return new LyricResponse { Lyrics = lyricList }; -- cgit v1.2.3 From 552b6aceae94bd8079a027407d15acf6d46f9b6e Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 16:17:26 -0400 Subject: Add default values to LyricResponse --- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index b3c65ac8c..ded3ca10e 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,10 +10,10 @@ public class LyricResponse /// /// Gets or sets Metadata. /// - public LyricMetadata Metadata { get; set; } + public LyricMetadata Metadata { get; set; } = new LyricMetadata(); /// /// Gets or sets Lyrics. /// - public IEnumerable Lyrics { get; set; } + public IReadOnlyCollection Lyrics { get; set; } = new List(); } -- cgit v1.2.3 From 28d017865b7f51babc7c13dbfaf71a660d834d46 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:17:53 -0400 Subject: Code Cleanup --- MediaBrowser.Controller/Lyrics/LyricLine.cs | 2 +- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 4 +-- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 39 ++++++------------------ MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 4 +-- 4 files changed, 14 insertions(+), 35 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricLine.cs b/MediaBrowser.Controller/Lyrics/LyricLine.cs index 43997f656..eb5ff9972 100644 --- a/MediaBrowser.Controller/Lyrics/LyricLine.cs +++ b/MediaBrowser.Controller/Lyrics/LyricLine.cs @@ -8,8 +8,8 @@ public class LyricLine /// /// Initializes a new instance of the class. /// - /// The lyric start time in ticks. /// The lyric text. + /// The lyric start time in ticks. public LyricLine(string text, long? start = null) { Start = start; diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index ded3ca10e..64c3b3c28 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -10,10 +10,10 @@ public class LyricResponse /// /// Gets or sets Metadata. /// - public LyricMetadata Metadata { get; set; } = new LyricMetadata(); + public LyricMetadata Metadata { get; set; } = new(); /// /// Gets or sets Lyrics. /// - public IReadOnlyCollection Lyrics { get; set; } = new List(); + public IReadOnlyList Lyrics { get; set; } = new List(); } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 50fa519b3..9d622a1cd 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -38,7 +38,7 @@ public class LrcLyricProvider : ILyricProvider public ResolverPriority Priority => ResolverPriority.First; /// - public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc" }; + public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc", "elrc" }; /// /// Opens lyric file for the requested item, and processes it for API return. @@ -54,8 +54,8 @@ public class LrcLyricProvider : ILyricProvider return null; } - List lyricList = new List(); - List sortedLyricData = new List(); + List lyricList = new(); + List sortedLyricData = new(); IDictionary fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); @@ -85,19 +85,11 @@ public class LrcLyricProvider : ILyricProvider string[] metaDataField; string metaDataFieldName; string metaDataFieldValue; + string[] test; - if (colonCount == 1) - { - metaDataField = metaDataRow.Split(':'); - metaDataFieldName = metaDataField[0][1..].Trim(); - metaDataFieldValue = metaDataField[1][..^1].Trim(); - } - else - { - int colonIndex = metaDataRow.IndexOf(':', StringComparison.OrdinalIgnoreCase); - metaDataFieldName = metaDataRow[..colonIndex][1..].Trim(); - metaDataFieldValue = metaDataRow[(colonIndex + 1)..][..^1].Trim(); - } + metaDataField = metaDataRow.Split(':', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + metaDataFieldName = metaDataField[0][1..].Trim(); + metaDataFieldValue = metaDataField[1][..^1].Trim(); fileMetaData.Add(metaDataFieldName, metaDataFieldValue); } @@ -142,7 +134,7 @@ public class LrcLyricProvider : ILyricProvider /// A lyricMetadata object with mapped property data. private LyricMetadata MapMetadataValues(IDictionary metaData) { - LyricMetadata lyricMetadata = new LyricMetadata(); + LyricMetadata lyricMetadata = new(); if (metaData.TryGetValue("ar", out var artist) && !string.IsNullOrEmpty(artist)) { @@ -166,20 +158,7 @@ public class LrcLyricProvider : ILyricProvider if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length)) { - // Ensure minutes include leading zero - var lengthData = length.Split(':'); - if (lengthData[0].Length == 1) - { - length = "0" + length; - } - - // If only Minutes and Seconds were provided, prepend zeros for hours - if (lengthData.Length == 2) - { - length = "00:" + length; - } - - if (DateTime.TryParseExact(length, "HH:mm:ss", null, DateTimeStyles.None, out var value)) + if (DateTime.TryParseExact(length, new string[] { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" }, null, DateTimeStyles.None, out var value)) { lyricMetadata.Length = value.TimeOfDay.Ticks; } diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index cd0e1599e..542df1387 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -20,7 +20,7 @@ public class TxtLyricProvider : ILyricProvider public ResolverPriority Priority => ResolverPriority.Second; /// - public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc", "txt" }; + public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc", "elrc", "txt" }; /// /// Opens lyric file for the requested item, and processes it for API return. @@ -38,7 +38,7 @@ public class TxtLyricProvider : ILyricProvider string[] lyricTextLines = System.IO.File.ReadAllLines(lyricFilePath); - List lyricList = new List(); + List lyricList = new(); if (lyricTextLines.Length == 0) { -- cgit v1.2.3 From 5d2364f0646ba4f4b6866115ad82fd8fac0733de Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Mon, 19 Sep 2022 16:59:16 -0400 Subject: Move AcceptedTimeFormats to class level variable --- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 3 ++- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 64c3b3c28..56a569645 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace MediaBrowser.Controller.Lyrics; @@ -15,5 +16,5 @@ public class LyricResponse /// /// Gets or sets Lyrics. /// - public IReadOnlyList Lyrics { get; set; } = new List(); + public IReadOnlyList Lyrics { get; set; } = Array.Empty(); } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index ea10749b9..b67b8c5d3 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -39,6 +39,8 @@ public class LrcLyricProvider : ILyricProvider /// public IReadOnlyCollection SupportedMediaTypes { get; } = new[] { "lrc", "elrc" }; + private static string[] AcceptedTimeFormats => new[] { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" }; + /// /// Opens lyric file for the requested item, and processes it for API return. /// @@ -88,8 +90,8 @@ public class LrcLyricProvider : ILyricProvider } string[] metaDataField = metaDataRow.Split(':', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - string metaDataFieldName = metaDataField[0][1..].Trim(); - string metaDataFieldValue = metaDataField[1][..^1].Trim(); + string metaDataFieldName = metaDataField[0][1..]; + string metaDataFieldValue = metaDataField[1][..^1]; fileMetaData.Add(metaDataFieldName, metaDataFieldValue); } @@ -155,7 +157,7 @@ public class LrcLyricProvider : ILyricProvider if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length)) { - if (DateTime.TryParseExact(length, new string[] { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" }, null, DateTimeStyles.None, out var value)) + if (DateTime.TryParseExact(length, AcceptedTimeFormats, null, DateTimeStyles.None, out var value)) { lyricMetadata.Length = value.TimeOfDay.Ticks; } -- cgit v1.2.3 From 6f0d33b1caafdf5c8c0413bf3fdcddc822a08f51 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Tue, 20 Sep 2022 08:36:43 -0400 Subject: Use Directory GetFiles to find lyric files --- Emby.Server.Implementations/ApplicationHost.cs | 1 - MediaBrowser.Controller/Lyrics/LyricInfo.cs | 20 ++++++++++++++++---- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 12 ++++++++---- MediaBrowser.Providers/Lyric/LyricManager.cs | 2 +- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 2 +- 5 files changed, 26 insertions(+), 11 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs index 3c3c90e61..67c63bb59 100644 --- a/Emby.Server.Implementations/ApplicationHost.cs +++ b/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; diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index 61e205b6c..a063a4cc5 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/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 /// The lyricProvider interface to use. /// Path of requested item. /// Lyric file path if passed lyric provider's supported media type is found; otherwise, null. - 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; } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 3177abb96..8ed0552cc 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -20,7 +20,7 @@ public class LrcLyricProvider : ILyricProvider private readonly LyricParser _lrcLyricParser; - private static readonly IReadOnlyList _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" }; /// /// Initializes a new instance of the class. @@ -51,14 +51,14 @@ public class LrcLyricProvider : ILyricProvider /// If provider can determine lyrics, returns a with or without metadata; otherwise, null. 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 fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); + var fileMetaData = new Dictionary(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; } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index 7487c6861..336b324a7 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/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; } diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index 6a189e132..df6d52630 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -29,7 +29,7 @@ public class TxtLyricProvider : ILyricProvider /// If provider can determine lyrics, returns a ; otherwise, null. public LyricResponse? GetLyrics(BaseItem item) { - string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path); + string? lyricFilePath = this.GetLyricFilePath(item.Path); if (string.IsNullOrEmpty(lyricFilePath)) { -- cgit v1.2.3 From 0d5bd85d6d292b0876f60bf0654e243f595ec9f9 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Tue, 20 Sep 2022 08:48:08 -0400 Subject: Resolve Azure build error --- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index a063a4cc5..57964eee5 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -18,18 +18,29 @@ public static class LyricInfo /// Lyric file path if passed lyric provider's supported media type is found; otherwise, null. public static string? GetLyricFilePath(this ILyricProvider lyricProvider, string itemPath) { + // Ensure we have a provider if (lyricProvider is null) { return null; } - if (!Directory.Exists(Path.GetDirectoryName(itemPath))) + // Ensure the path to the item is not null + string? itemDirectoryPath = Path.GetDirectoryName(itemPath); + if (itemDirectoryPath is null) { return null; } - foreach (var lyricFilePath in Directory.GetFiles(Path.GetDirectoryName(itemPath), $"{Path.GetFileNameWithoutExtension(itemPath)}.*")) + // Ensure the directory path exists + if (!Directory.Exists(itemDirectoryPath)) { + return null; + } + + foreach (var lyricFilePath in Directory.GetFiles(itemDirectoryPath, $"{Path.GetFileNameWithoutExtension(itemPath)}.*")) + { + if (lyricFilePath is null) { continue; } + if (lyricProvider.SupportedMediaTypes.Contains(Path.GetExtension(lyricFilePath)[1..])) { return lyricFilePath; -- cgit v1.2.3 From b1771f07e92dd47f8e49c7f96f61b731d4a6065c Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Tue, 20 Sep 2022 13:34:46 -0400 Subject: Use Span in SupportedMediaTypes comparison --- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index 57964eee5..6ebb83d12 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -1,6 +1,5 @@ -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; using Jellyfin.Extensions; namespace MediaBrowser.Controller.Lyrics; @@ -39,9 +38,7 @@ public static class LyricInfo foreach (var lyricFilePath in Directory.GetFiles(itemDirectoryPath, $"{Path.GetFileNameWithoutExtension(itemPath)}.*")) { - if (lyricFilePath is null) { continue; } - - if (lyricProvider.SupportedMediaTypes.Contains(Path.GetExtension(lyricFilePath)[1..])) + if (EnumerableExtensions.Contains(lyricProvider.SupportedMediaTypes, Path.GetExtension(lyricFilePath.AsSpan())[1..], StringComparison.OrdinalIgnoreCase)) { return lyricFilePath; } -- cgit v1.2.3 From 35399ce8fef0559f65bee4f519c582d192a04e52 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Wed, 21 Sep 2022 17:49:28 -0400 Subject: Update summaries, Use spans --- MediaBrowser.Controller/Lyrics/LyricLine.cs | 10 +++++----- MediaBrowser.Controller/Lyrics/LyricMetadata.cs | 18 +++++++++--------- MediaBrowser.Controller/Lyrics/LyricResponse.cs | 4 ++-- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 16 ++++++++-------- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 10 ++++++---- 5 files changed, 30 insertions(+), 28 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricLine.cs b/MediaBrowser.Controller/Lyrics/LyricLine.cs index eb5ff9972..c406f92fc 100644 --- a/MediaBrowser.Controller/Lyrics/LyricLine.cs +++ b/MediaBrowser.Controller/Lyrics/LyricLine.cs @@ -12,17 +12,17 @@ public class LyricLine /// The lyric start time in ticks. public LyricLine(string text, long? start = null) { - Start = start; Text = text; + Start = start; } /// - /// Gets the start time in ticks. + /// Gets the text of this lyric line. /// - public long? Start { get; } + public string Text { get; } /// - /// Gets the text. + /// Gets the start time in ticks. /// - public string Text { get; } + public long? Start { get; } } diff --git a/MediaBrowser.Controller/Lyrics/LyricMetadata.cs b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs index 0ba777975..6091ede52 100644 --- a/MediaBrowser.Controller/Lyrics/LyricMetadata.cs +++ b/MediaBrowser.Controller/Lyrics/LyricMetadata.cs @@ -8,47 +8,47 @@ namespace MediaBrowser.Controller.Lyrics; public class LyricMetadata { /// - /// Gets or sets Artist - The song artist. + /// Gets or sets the song artist. /// public string? Artist { get; set; } /// - /// Gets or sets Album - The album this song is on. + /// Gets or sets the album this song is on. /// public string? Album { get; set; } /// - /// Gets or sets Title - The title of the song. + /// Gets or sets the title of the song. /// public string? Title { get; set; } /// - /// Gets or sets Author - Creator of the lyric data. + /// Gets or sets the author of the lyric data. /// public string? Author { get; set; } /// - /// Gets or sets Length - How long the song is. + /// Gets or sets the length of the song in ticks. /// public long? Length { get; set; } /// - /// Gets or sets By - Creator of the LRC file. + /// Gets or sets who the LRC file was created by. /// public string? By { get; set; } /// - /// Gets or sets Offset - Offset:+/- Timestamp adjustment in milliseconds. + /// Gets or sets the lyric offset compared to audio in ticks. /// public long? Offset { get; set; } /// - /// Gets or sets Creator - The Software used to create the LRC file. + /// Gets or sets the software used to create the LRC file. /// public string? Creator { get; set; } /// - /// Gets or sets Version - The version of the Creator used. + /// Gets or sets the version of the creator used. /// public string? Version { get; set; } } diff --git a/MediaBrowser.Controller/Lyrics/LyricResponse.cs b/MediaBrowser.Controller/Lyrics/LyricResponse.cs index 56a569645..0d52b5ec5 100644 --- a/MediaBrowser.Controller/Lyrics/LyricResponse.cs +++ b/MediaBrowser.Controller/Lyrics/LyricResponse.cs @@ -9,12 +9,12 @@ namespace MediaBrowser.Controller.Lyrics; public class LyricResponse { /// - /// Gets or sets Metadata. + /// Gets or sets Metadata for the lyrics. /// public LyricMetadata Metadata { get; set; } = new(); /// - /// Gets or sets Lyrics. + /// Gets or sets a collection of individual lyric lines. /// public IReadOnlyList Lyrics { get; set; } = Array.Empty(); } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 8ed0552cc..1dbe5958e 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using LrcParser.Model; using LrcParser.Parser; @@ -59,7 +60,7 @@ public class LrcLyricProvider : ILyricProvider } var fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); - string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath); + string lrcFileContent = File.ReadAllText(lyricFilePath); Song lyricData; @@ -84,25 +85,24 @@ public class LrcLyricProvider : ILyricProvider foreach (string metaDataRow in metaDataRows) { - if (!metaDataRow.Contains(':', StringComparison.OrdinalIgnoreCase)) + var index = metaDataRow.IndexOf(':', StringComparison.OrdinalIgnoreCase); + if (index == -1) { continue; } - 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]; + var metaDataFieldNameSpan = metaDataRow.AsSpan(1, index - 1).Trim(); + var metaDataFieldValueSpan = metaDataRow.AsSpan(index + 1, metaDataRow.Length - index - 2).Trim(); - if (string.IsNullOrEmpty(metaDataFieldName) || string.IsNullOrEmpty(metaDataFieldValue)) + if (metaDataFieldValueSpan.IsEmpty || metaDataFieldValueSpan.IsEmpty) { continue; } - fileMetaData[metaDataFieldName] = metaDataFieldValue; + fileMetaData[metaDataFieldNameSpan.ToString()] = metaDataFieldValueSpan.ToString(); } if (sortedLyricData.Count == 0) diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index df6d52630..bce881054 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.IO; +using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; using MediaBrowser.Controller.Resolvers; @@ -36,18 +38,18 @@ public class TxtLyricProvider : ILyricProvider return null; } - string[] lyricTextLines = System.IO.File.ReadAllLines(lyricFilePath); + string[] lyricTextLines = File.ReadAllLines(lyricFilePath); if (lyricTextLines.Length == 0) { return null; } - List lyricList = new(lyricTextLines.Length); + LyricLine[] lyricList = new LyricLine[lyricTextLines.Length]; - foreach (string lyricTextLine in lyricTextLines) + for (int lyricLine = 0; lyricLine < lyricTextLines.Length; lyricLine++) { - lyricList.Add(new LyricLine(lyricTextLine)); + lyricList[lyricLine] = new LyricLine(lyricTextLines[lyricLine]); } return new LyricResponse { Lyrics = lyricList }; -- cgit v1.2.3 From a50bdb47709be0412b3abb2729f8c657b5d0c779 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Thu, 22 Sep 2022 08:13:53 -0400 Subject: Use async functions --- Jellyfin.Api/Controllers/UserLibraryController.cs | 4 ++-- MediaBrowser.Controller/Lyrics/ILyricManager.cs | 5 +++-- MediaBrowser.Controller/Lyrics/ILyricProvider.cs | 5 +++-- MediaBrowser.Providers/Lyric/LrcLyricProvider.cs | 23 +++++++++++++++++------ MediaBrowser.Providers/Lyric/LyricManager.cs | 5 +++-- MediaBrowser.Providers/Lyric/TxtLyricProvider.cs | 5 +++-- 6 files changed, 31 insertions(+), 16 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index df91a8efc..682a6e832 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -397,7 +397,7 @@ namespace Jellyfin.Api.Controllers /// An containing the item's lyrics. [HttpGet("Users/{userId}/Items/{itemId}/Lyrics")] [ProducesResponseType(StatusCodes.Status200OK)] - public ActionResult GetLyrics([FromRoute, Required] Guid userId, [FromRoute, Required] Guid itemId) + public async Task> GetLyrics([FromRoute, Required] Guid userId, [FromRoute, Required] Guid itemId) { var user = _userManager.GetUserById(userId); @@ -415,7 +415,7 @@ namespace Jellyfin.Api.Controllers return NotFound(); } - var result = _lyricManager.GetLyrics(item); + var result = await _lyricManager.GetLyrics(item).ConfigureAwait(false); if (result is not null) { return Ok(result); diff --git a/MediaBrowser.Controller/Lyrics/ILyricManager.cs b/MediaBrowser.Controller/Lyrics/ILyricManager.cs index 5920bcc62..bb93e1e4c 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricManager.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricManager.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Lyrics; @@ -11,8 +12,8 @@ public interface ILyricManager /// Gets the lyrics. /// /// The media item. - /// Lyrics for passed item. - LyricResponse? GetLyrics(BaseItem item); + /// A task representing found lyrics the passed item. + Task GetLyrics(BaseItem item); /// /// Checks if requested item has a matching local lyric file. diff --git a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs index c5b625226..2a04c6152 100644 --- a/MediaBrowser.Controller/Lyrics/ILyricProvider.cs +++ b/MediaBrowser.Controller/Lyrics/ILyricProvider.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Resolvers; @@ -30,6 +31,6 @@ public interface ILyricProvider /// Gets the lyrics. /// /// The media item. - /// If found, returns lyrics for passed item; otherwise, null. - LyricResponse? GetLyrics(BaseItem item); + /// A task representing found lyrics. + Task GetLyrics(BaseItem item); } diff --git a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs index 1dbe5958e..d06db3afc 100644 --- a/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/LrcLyricProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Threading.Tasks; using LrcParser.Model; using LrcParser.Parser; using MediaBrowser.Controller.Entities; @@ -50,7 +51,7 @@ public class LrcLyricProvider : ILyricProvider /// /// The item to to process. /// If provider can determine lyrics, returns a with or without metadata; otherwise, null. - public LyricResponse? GetLyrics(BaseItem item) + public async Task GetLyrics(BaseItem item) { string? lyricFilePath = this.GetLyricFilePath(item.Path); @@ -60,7 +61,7 @@ public class LrcLyricProvider : ILyricProvider } var fileMetaData = new Dictionary(StringComparer.OrdinalIgnoreCase); - string lrcFileContent = File.ReadAllText(lyricFilePath); + string lrcFileContent = await Task.FromResult(File.ReadAllText(lyricFilePath)).ConfigureAwait(false); Song lyricData; @@ -94,15 +95,15 @@ public class LrcLyricProvider : ILyricProvider // Remove square bracket before field name, and after field value // Example 1: [au: 1hitsong] // Example 2: [ar: Calabrese] - var metaDataFieldNameSpan = metaDataRow.AsSpan(1, index - 1).Trim(); - var metaDataFieldValueSpan = metaDataRow.AsSpan(index + 1, metaDataRow.Length - index - 2).Trim(); + var metaDataFieldName = GetMetadataFieldName(metaDataRow, index); + var metaDataFieldValue = GetMetadataValue(metaDataRow, index); - if (metaDataFieldValueSpan.IsEmpty || metaDataFieldValueSpan.IsEmpty) + if (string.IsNullOrEmpty(metaDataFieldName) || string.IsNullOrEmpty(metaDataFieldValue)) { continue; } - fileMetaData[metaDataFieldNameSpan.ToString()] = metaDataFieldValueSpan.ToString(); + fileMetaData[metaDataFieldName.ToString()] = metaDataFieldValue.ToString(); } if (sortedLyricData.Count == 0) @@ -197,4 +198,14 @@ public class LrcLyricProvider : ILyricProvider return lyricMetadata; } + + private static string GetMetadataFieldName(string metaDataRow, int index) + { + return metaDataRow.AsSpan(1, index - 1).Trim().ToString(); + } + + private static string GetMetadataValue(string metaDataRow, int index) + { + return metaDataRow.AsSpan(index + 1, metaDataRow.Length - index - 2).Trim().ToString(); + } } diff --git a/MediaBrowser.Providers/Lyric/LyricManager.cs b/MediaBrowser.Providers/Lyric/LyricManager.cs index 336b324a7..f9547e0f0 100644 --- a/MediaBrowser.Providers/Lyric/LyricManager.cs +++ b/MediaBrowser.Providers/Lyric/LyricManager.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; @@ -22,11 +23,11 @@ public class LyricManager : ILyricManager } /// - public LyricResponse? GetLyrics(BaseItem item) + public async Task GetLyrics(BaseItem item) { foreach (ILyricProvider provider in _lyricProviders) { - var results = provider.GetLyrics(item); + var results = await provider.GetLyrics(item).ConfigureAwait(false); if (results is not null) { return results; diff --git a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs index bce881054..9df4ec83e 100644 --- a/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs +++ b/MediaBrowser.Providers/Lyric/TxtLyricProvider.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Lyrics; using MediaBrowser.Controller.Resolvers; @@ -29,7 +30,7 @@ public class TxtLyricProvider : ILyricProvider /// /// The item to to process. /// If provider can determine lyrics, returns a ; otherwise, null. - public LyricResponse? GetLyrics(BaseItem item) + public async Task GetLyrics(BaseItem item) { string? lyricFilePath = this.GetLyricFilePath(item.Path); @@ -38,7 +39,7 @@ public class TxtLyricProvider : ILyricProvider return null; } - string[] lyricTextLines = File.ReadAllLines(lyricFilePath); + string[] lyricTextLines = await Task.FromResult(File.ReadAllLines(lyricFilePath)).ConfigureAwait(false); if (lyricTextLines.Length == 0) { -- cgit v1.2.3 From 5efa138c221fddf86696ed6b1c58409ad8527bd3 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Mon, 26 Sep 2022 16:24:21 -0400 Subject: Update MediaBrowser.Controller/Lyrics/LyricInfo.cs Co-authored-by: Bond-009 --- MediaBrowser.Controller/Lyrics/LyricInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Lyrics/LyricInfo.cs b/MediaBrowser.Controller/Lyrics/LyricInfo.cs index 6ebb83d12..6ec6df582 100644 --- a/MediaBrowser.Controller/Lyrics/LyricInfo.cs +++ b/MediaBrowser.Controller/Lyrics/LyricInfo.cs @@ -38,7 +38,7 @@ public static class LyricInfo foreach (var lyricFilePath in Directory.GetFiles(itemDirectoryPath, $"{Path.GetFileNameWithoutExtension(itemPath)}.*")) { - if (EnumerableExtensions.Contains(lyricProvider.SupportedMediaTypes, Path.GetExtension(lyricFilePath.AsSpan())[1..], StringComparison.OrdinalIgnoreCase)) + if (lyricProvider.SupportedMediaTypes.Contains(Path.GetExtension(lyricFilePath.AsSpan())[1..], StringComparison.OrdinalIgnoreCase)) { return lyricFilePath; } -- cgit v1.2.3