2
0
Эх сурвалжийг харах

Adds lyric providers to DI pipeline

This is adding those lyric providers to the DI pipeline along with a super simple implementation of how to use them in the controller method. Probably should be refactored into a lyric service of some sort that would have the providers injected into it.
Jamie Introcaso 2 жил өмнө
parent
commit
c0dae0fef5

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

@@ -46,6 +46,7 @@ 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;
@@ -580,6 +581,8 @@ namespace Emby.Server.Implementations
             serviceCollection.AddTransient(provider => new Lazy<ILibraryMonitor>(provider.GetRequiredService<ILibraryMonitor>));
             serviceCollection.AddTransient(provider => new Lazy<IProviderManager>(provider.GetRequiredService<IProviderManager>));
             serviceCollection.AddTransient(provider => new Lazy<IUserViewManager>(provider.GetRequiredService<IUserViewManager>));
+            serviceCollection.AddTransient<ILyricsProvider, TxtLyricsProvider>();
+            serviceCollection.AddTransient<ILyricsProvider, LrcLyricsProvider>();
             serviceCollection.AddSingleton<ILibraryManager, LibraryManager>();
             serviceCollection.AddSingleton<NamingOptions>();
 

+ 12 - 7
Jellyfin.Api/Controllers/UserLibraryController.cs

@@ -1,17 +1,14 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using System.IO;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using Jellyfin.Api.Constants;
 using Jellyfin.Api.Extensions;
-using Jellyfin.Api.Helpers;
 using Jellyfin.Api.ModelBinders;
 using Jellyfin.Api.Models.UserDtos;
 using Jellyfin.Data.Enums;
-using Jellyfin.Extensions;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
@@ -40,6 +37,7 @@ namespace Jellyfin.Api.Controllers
         private readonly IDtoService _dtoService;
         private readonly IUserViewManager _userViewManager;
         private readonly IFileSystem _fileSystem;
+        private readonly IEnumerable<ILyricsProvider> _lyricProviders;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="UserLibraryController"/> class.
@@ -50,13 +48,15 @@ namespace Jellyfin.Api.Controllers
         /// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
         /// <param name="userViewManager">Instance of the <see cref="IUserViewManager"/> interface.</param>
         /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+        /// <param name="lyricProviders">Collection of all registered <see cref="ILyricsProvider"/> interfaces.</param>
         public UserLibraryController(
             IUserManager userManager,
             IUserDataManager userDataRepository,
             ILibraryManager libraryManager,
             IDtoService dtoService,
             IUserViewManager userViewManager,
-            IFileSystem fileSystem)
+            IFileSystem fileSystem,
+            IEnumerable<ILyricsProvider> lyricProviders)
         {
             _userManager = userManager;
             _userDataRepository = userDataRepository;
@@ -64,6 +64,7 @@ namespace Jellyfin.Api.Controllers
             _dtoService = dtoService;
             _userViewManager = userViewManager;
             _fileSystem = fileSystem;
+            _lyricProviders = lyricProviders;
         }
 
         /// <summary>
@@ -413,10 +414,14 @@ namespace Jellyfin.Api.Controllers
                 return NotFound();
             }
 
-            var result = ItemHelper.GetLyricData(item);
-            if (result is not null)
+            // Super nieve implementation. I would suggest building a lyric service of some sort and doing this there.
+            foreach (var provider in _lyricProviders)
             {
-                return Ok(result);
+                provider.Process(item);
+                if (provider.HasData)
+                {
+                    return Ok(provider.Data);
+                }
             }
 
             return NotFound();