From c17d62fc62daa67c2785981e0f181f8f72db00e2 Mon Sep 17 00:00:00 2001 From: YannikMG <19749617+YannikMG@users.noreply.github.com> Date: Fri, 31 Jul 2026 23:10:40 +0200 Subject: [PATCH] Port to Jellyfin 10.11 (net9.0, IHostedService) IServerEntryPoint was removed in favor of IHostedService; migrated PlaybackScrobbler and updated PluginServiceRegistrator accordingly (RegisterServices now takes IServerApplicationHost, AnilistApi moved to a singleton so the hosted service can depend on it). Bumped TargetFramework to net9.0 and targetAbi to 10.11.0.0. Also fixed Endpoints.cs, which referenced an "DefaultAuthorization" authorization policy that no longer resolves for plugin controllers on 10.11, causing every API call to 500 instead of 401'ing when unauthenticated. Verified end-to-end against a live 10.11.11 server: plugin loads, OAuth re-auth works, and a real scrobble to Anilist succeeded. Co-Authored-By: Claude Sonnet 5 --- Jellyfin.Plugin.AnilistSync/API/Endpoints.cs | 2 +- .../Jellyfin.Plugin.AnilistSync.csproj | 10 +++---- .../PluginServiceRegistrator.cs | 9 ++++-- .../Services/PlaybackScrobbler.cs | 29 ++++++------------- build.yaml | 8 ++--- 5 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Jellyfin.Plugin.AnilistSync/API/Endpoints.cs b/Jellyfin.Plugin.AnilistSync/API/Endpoints.cs index 89389e7..208911c 100644 --- a/Jellyfin.Plugin.AnilistSync/API/Endpoints.cs +++ b/Jellyfin.Plugin.AnilistSync/API/Endpoints.cs @@ -9,7 +9,7 @@ namespace Jellyfin.Plugin.AnilistSync.API /// Anilist endpoints. /// [ApiController] - [Authorize(Policy = "DefaultAuthorization")] + [Authorize] [Route("AnilistSync")] public class Endpoints : ControllerBase { diff --git a/Jellyfin.Plugin.AnilistSync/Jellyfin.Plugin.AnilistSync.csproj b/Jellyfin.Plugin.AnilistSync/Jellyfin.Plugin.AnilistSync.csproj index b205851..f237f0b 100644 --- a/Jellyfin.Plugin.AnilistSync/Jellyfin.Plugin.AnilistSync.csproj +++ b/Jellyfin.Plugin.AnilistSync/Jellyfin.Plugin.AnilistSync.csproj @@ -1,9 +1,9 @@ - net6.0 - 2.0.0.0 - 2.0.0.0 + net9.0 + 2.1.0.0 + 2.1.0.0 true true enable @@ -11,12 +11,12 @@ - + - + diff --git a/Jellyfin.Plugin.AnilistSync/PluginServiceRegistrator.cs b/Jellyfin.Plugin.AnilistSync/PluginServiceRegistrator.cs index aeef4e7..1f7b3f1 100644 --- a/Jellyfin.Plugin.AnilistSync/PluginServiceRegistrator.cs +++ b/Jellyfin.Plugin.AnilistSync/PluginServiceRegistrator.cs @@ -1,5 +1,7 @@ using Jellyfin.Plugin.AnilistSync.API; -using MediaBrowser.Common.Plugins; +using Jellyfin.Plugin.AnilistSync.Services; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Plugins; using Microsoft.Extensions.DependencyInjection; namespace Jellyfin.Plugin.AnilistSync @@ -8,9 +10,10 @@ namespace Jellyfin.Plugin.AnilistSync public class PluginServiceRegistrator : IPluginServiceRegistrator { /// - public void RegisterServices(IServiceCollection serviceCollection) + public void RegisterServices(IServiceCollection serviceCollection, IServerApplicationHost applicationHost) { - serviceCollection.AddScoped(); + serviceCollection.AddSingleton(); + serviceCollection.AddHostedService(); } } } \ No newline at end of file diff --git a/Jellyfin.Plugin.AnilistSync/Services/PlaybackScrobbler.cs b/Jellyfin.Plugin.AnilistSync/Services/PlaybackScrobbler.cs index 2b6d6c4..648c823 100644 --- a/Jellyfin.Plugin.AnilistSync/Services/PlaybackScrobbler.cs +++ b/Jellyfin.Plugin.AnilistSync/Services/PlaybackScrobbler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; using Jellyfin.Plugin.AnilistSync.API; @@ -10,8 +11,8 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Jellyfin.Plugin.AnilistSync.Services @@ -19,7 +20,7 @@ namespace Jellyfin.Plugin.AnilistSync.Services /// /// Playback progress scrobbler. /// - public class PlaybackScrobbler : IServerEntryPoint + public class PlaybackScrobbler : IHostedService { private readonly ISessionManager _sessionManager; // Needed to set up the startPlayBack and endPlayBack functions private readonly ILogger _logger; @@ -43,7 +44,7 @@ namespace Jellyfin.Plugin.AnilistSync.Services } /// - public Task RunAsync() + public Task StartAsync(CancellationToken cancellationToken) { _sessionManager.PlaybackProgress += OnPlaybackProgress; _sessionManager.PlaybackStopped += OnPlaybackStopped; @@ -51,23 +52,11 @@ namespace Jellyfin.Plugin.AnilistSync.Services } /// - public void Dispose() + public Task StopAsync(CancellationToken cancellationToken) { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose. - /// - /// Dispoe all resources. - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - _sessionManager.PlaybackProgress -= OnPlaybackProgress; - _sessionManager.PlaybackStopped -= OnPlaybackStopped; - } + _sessionManager.PlaybackProgress -= OnPlaybackProgress; + _sessionManager.PlaybackStopped -= OnPlaybackStopped; + return Task.CompletedTask; } // UserConfig config, @@ -169,7 +158,7 @@ namespace Jellyfin.Plugin.AnilistSync.Services string? anilistId = GetAnilistId(eventArgs); if (anilistId == null) { - _logger.LogDebug("Cannot Scrobble {ItemName}, unknown AniList Id."); + _logger.LogDebug("Cannot Scrobble {ItemName}, unknown AniList Id.", eventArgs.MediaInfo.Name); return; } diff --git a/build.yaml b/build.yaml index 191e8cd..f73297b 100644 --- a/build.yaml +++ b/build.yaml @@ -1,15 +1,15 @@ --- name: "AnilistSync" guid: "18c2a8ea-afa0-4a0b-aa94-072b492ab80b" -version: "2.0.0.0" -targetAbi: "10.8.0.0" +version: "2.1.0.0" +targetAbi: "10.11.0.0" owner: "ARufenach" overview: "Scrobble to Anilist" description: > Jellyfin plugin to scrobble to Anilist category: "General" -framework: "net6.0" +framework: "net9.0" artifacts: - "Jellyfin.Plugin.AnilistSync.dll" changelog: > - Added support for jellyfin 10.8.0 + Added support for Jellyfin 10.11 (migrated IServerEntryPoint to IHostedService, net9.0)