From 6bb23dc9c45eb6d59a569dbef50ca1a1edc78a6f Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 10 Jun 2026 13:07:11 -0400 Subject: [PATCH] feat: skip trailers/pre-rolls inaccessible to the current user (v1.0.0.9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filters trailer pool items and pre-roll/feature pre-roll bumpers using BaseItem.IsVisibleStandalone(user), so users without access to the relevant library are never handed an item they can't actually play — some Cinema Mode clients hang indefinitely in that case. --- ...ellyfin.Plugin.CinemaTrailers4Jellyfins.csproj | 4 ++-- .../Services/TrailerIntroProvider.cs | 15 +++++++++------ build.yaml | 10 +++++----- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Jellyfin.Plugin.CinemaTrailers4Jellyfins.csproj b/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Jellyfin.Plugin.CinemaTrailers4Jellyfins.csproj index 28adba8..a3ff21c 100644 --- a/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Jellyfin.Plugin.CinemaTrailers4Jellyfins.csproj +++ b/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Jellyfin.Plugin.CinemaTrailers4Jellyfins.csproj @@ -3,8 +3,8 @@ net9.0 Jellyfin.Plugin.CinemaTrailers4Jellyfins - 1.0.0.8 - 1.0.0.8 + 1.0.0.9 + 1.0.0.9 enable false false diff --git a/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Services/TrailerIntroProvider.cs b/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Services/TrailerIntroProvider.cs index 24f614a..f7aa6c7 100644 --- a/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Services/TrailerIntroProvider.cs +++ b/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Services/TrailerIntroProvider.cs @@ -111,7 +111,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services if (preRollEnabled) { - var preRoll = GetRandomLibraryMovieIntro("Trailer Pre-Roll", config.TrailerPreRollLibraryId, item.Id); + var preRoll = GetRandomLibraryMovieIntro("Trailer Pre-Roll", config.TrailerPreRollLibraryId, item.Id, user); if (preRoll != null) intros.Add(preRoll); } @@ -129,6 +129,9 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services .Where(m => m.Path?.StartsWith(outputFolder, StringComparison.OrdinalIgnoreCase) == true && m.LocalTrailers.Count > 0 + // Skip items the user can't actually play (e.g. library not in their access list) — + // some clients hang indefinitely trying to play an inaccessible item. + && m.IsVisibleStandalone(user) // Keep TV show trailers for episodes and movie trailers for movies separate. && m.Tags.Contains(TrailerTags.TvShow, StringComparer.OrdinalIgnoreCase) == isEpisode) .SelectMany(m => m.LocalTrailers.Select(t => (Movie: m, Trailer: t))) @@ -165,7 +168,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services if (featurePreRollEnabled) { - var featureRoll = GetRandomLibraryMovieIntro("Feature Pre-Roll", config.FeaturePreRollLibraryId, item.Id); + var featureRoll = GetRandomLibraryMovieIntro("Feature Pre-Roll", config.FeaturePreRollLibraryId, item.Id, user); if (featureRoll != null) intros.Add(featureRoll); } @@ -182,7 +185,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services /// Picks a random Movie from the given Jellyfin library (VirtualFolder ItemId) to use as a /// pre-roll/post-roll bumper, excluding the item currently being played. /// - private IntroInfo? GetRandomLibraryMovieIntro(string label, string libraryId, Guid excludeId) + private IntroInfo? GetRandomLibraryMovieIntro(string label, string libraryId, Guid excludeId, User user) { if (!Guid.TryParse(libraryId, out var parsedId)) { @@ -204,14 +207,14 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services var movies = folder.GetRecursiveChildren() .OfType() - .Where(m => m.Id != excludeId) + .Where(m => m.Id != excludeId && m.IsVisibleStandalone(user)) .ToList(); if (movies.Count == 0) { _logger.LogInformation( - "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items. " - + "Ensure the library has been scanned and contains at least one other Movie.", + "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items visible to this user. " + + "Ensure the library has been scanned, contains at least one other Movie, and is in this user's library access list.", label, parsedId); return null; diff --git a/build.yaml b/build.yaml index 6dfe2cf..bbf6424 100644 --- a/build.yaml +++ b/build.yaml @@ -1,5 +1,5 @@ --- -version: 1.0.0.8 +version: 1.0.0.9 name: CinemaTrailers4Jellyfins guid: b581493e-1046-40ed-b6dc-cb8027624984 description: > @@ -12,10 +12,10 @@ category: General owner: 514mart targetAbi: 10.11.0.0 changelog: - - Fix Trailer Pre-Roll / Feature Pre-Roll bumpers not being found — the - library lookup now walks the configured library folder's children - directly instead of relying on TopParentIds matching, which could fail - to match movies even when they appear correctly in the library + - Skip trailers and pre-roll/feature pre-roll bumpers the current user + can't actually access (e.g. a library not in their library access list) + — some Cinema Mode clients hang indefinitely trying to play an + inaccessible item, so these are now filtered out per-user instead dotnetProjects: - name: Jellyfin.Plugin.CinemaTrailers4Jellyfins