5 Commits

Author SHA1 Message Date
gitea-actions
e518b79c36 chore: update manifest.json for v1.0.0.9 2026-06-10 17:07:24 +00:00
Martin
6bb23dc9c4 feat: skip trailers/pre-rolls inaccessible to the current user (v1.0.0.9)
All checks were successful
Publish Release / release (push) Successful in 12s
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.
2026-06-10 13:07:11 -04:00
gitea-actions
5f7a76feb5 chore: update manifest.json for v1.0.0.8 2026-06-10 15:28:02 +00:00
Martin
adfa570569 fix: pre-roll/feature pre-roll bumpers not found in library (v1.0.0.8)
All checks were successful
Publish Release / release (push) Successful in 8s
TopParentIds-based queries could fail to match Movie items in the
configured pre-roll library even when they appear correctly in the
Jellyfin UI. Look up the library Folder by ID and walk its recursive
children directly instead, matching the path-based approach already
used for the trailer pool.
2026-06-10 11:27:52 -04:00
gitea-actions
99798b5174 chore: update manifest.json for v1.0.0.7 2026-06-10 15:10:56 +00:00
4 changed files with 50 additions and 20 deletions

View File

@@ -3,8 +3,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<RootNamespace>Jellyfin.Plugin.CinemaTrailers4Jellyfins</RootNamespace> <RootNamespace>Jellyfin.Plugin.CinemaTrailers4Jellyfins</RootNamespace>
<AssemblyVersion>1.0.0.7</AssemblyVersion> <AssemblyVersion>1.0.0.9</AssemblyVersion>
<FileVersion>1.0.0.7</FileVersion> <FileVersion>1.0.0.9</FileVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GenerateDocumentationFile>false</GenerateDocumentationFile> <GenerateDocumentationFile>false</GenerateDocumentationFile>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors> <TreatWarningsAsErrors>false</TreatWarningsAsErrors>

View File

@@ -111,7 +111,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
if (preRollEnabled) 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) if (preRoll != null)
intros.Add(preRoll); intros.Add(preRoll);
} }
@@ -129,6 +129,9 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
.Where(m => .Where(m =>
m.Path?.StartsWith(outputFolder, StringComparison.OrdinalIgnoreCase) == true m.Path?.StartsWith(outputFolder, StringComparison.OrdinalIgnoreCase) == true
&& m.LocalTrailers.Count > 0 && 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. // Keep TV show trailers for episodes and movie trailers for movies separate.
&& m.Tags.Contains(TrailerTags.TvShow, StringComparer.OrdinalIgnoreCase) == isEpisode) && m.Tags.Contains(TrailerTags.TvShow, StringComparer.OrdinalIgnoreCase) == isEpisode)
.SelectMany(m => m.LocalTrailers.Select(t => (Movie: m, Trailer: t))) .SelectMany(m => m.LocalTrailers.Select(t => (Movie: m, Trailer: t)))
@@ -165,7 +168,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
if (featurePreRollEnabled) 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) if (featureRoll != null)
intros.Add(featureRoll); 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 /// 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. /// pre-roll/post-roll bumper, excluding the item currently being played.
/// </summary> /// </summary>
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)) if (!Guid.TryParse(libraryId, out var parsedId))
{ {
@@ -193,22 +196,25 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
return null; return null;
} }
var movies = _libraryManager if (_libraryManager.GetItemById(parsedId) is not Folder folder)
.GetItemList(new InternalItemsQuery
{ {
IncludeItemTypes = new[] { BaseItemKind.Movie }, _logger.LogWarning(
TopParentIds = new[] { parsedId }, "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} could not be found.",
Recursive = true, label,
}) parsedId);
return null;
}
var movies = folder.GetRecursiveChildren()
.OfType<Movie>() .OfType<Movie>()
.Where(m => m.Id != excludeId) .Where(m => m.Id != excludeId && m.IsVisibleStandalone(user))
.ToList(); .ToList();
if (movies.Count == 0) if (movies.Count == 0)
{ {
_logger.LogInformation( _logger.LogInformation(
"|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items. " "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items visible to this user. "
+ "Ensure the library has been scanned and contains at least one other Movie.", + "Ensure the library has been scanned, contains at least one other Movie, and is in this user's library access list.",
label, label,
parsedId); parsedId);
return null; return null;

View File

@@ -1,5 +1,5 @@
--- ---
version: 1.0.0.7 version: 1.0.0.9
name: CinemaTrailers4Jellyfins name: CinemaTrailers4Jellyfins
guid: b581493e-1046-40ed-b6dc-cb8027624984 guid: b581493e-1046-40ed-b6dc-cb8027624984
description: > description: >
@@ -12,10 +12,10 @@ category: General
owner: 514mart owner: 514mart
targetAbi: 10.11.0.0 targetAbi: 10.11.0.0
changelog: changelog:
- Add Information-level diagnostic logging to IIntroProvider.GetIntros — logs - Skip trailers and pre-roll/feature pre-roll bumpers the current user
every call (item, path, and which features are enabled), why an item is can't actually access (e.g. a library not in their library access list)
skipped, and the outcome of Trailer/Feature Pre-Roll lookups, to help — some Cinema Mode clients hang indefinitely trying to play an
troubleshoot why a pre-roll bumper isn't playing inaccessible item, so these are now filtered out per-user instead
dotnetProjects: dotnetProjects:
- name: Jellyfin.Plugin.CinemaTrailers4Jellyfins - name: Jellyfin.Plugin.CinemaTrailers4Jellyfins

View File

@@ -8,6 +8,30 @@
"owner": "514mart", "owner": "514mart",
"imageUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/raw/branch/main/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Images/logo.svg", "imageUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/raw/branch/main/Jellyfin.Plugin.CinemaTrailers4Jellyfins/Images/logo.svg",
"versions": [ "versions": [
{
"checksum": "9594d14a5fed94ee5eea55d72c71728c",
"changelog": "- 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) \u2014 some Cinema Mode clients hang indefinitely trying to play an inaccessible item, so these are now filtered out per-user instead\n",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/releases/download/v1.0.0.9/cinematrailers4jellyfins_1.0.0.9.zip",
"timestamp": "2026-06-10T17:07:24Z",
"version": "1.0.0.9"
},
{
"checksum": "89c66caa789da56ead7d60e01d3207a5",
"changelog": "- Fix Trailer Pre-Roll / Feature Pre-Roll bumpers not being found \u2014 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\n",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/releases/download/v1.0.0.8/cinematrailers4jellyfins_1.0.0.8.zip",
"timestamp": "2026-06-10T15:28:02Z",
"version": "1.0.0.8"
},
{
"checksum": "a52f1354c9737cf9ec92f588bb4e750e",
"changelog": "- Add Information-level diagnostic logging to IIntroProvider.GetIntros \u2014 logs every call (item, path, and which features are enabled), why an item is skipped, and the outcome of Trailer/Feature Pre-Roll lookups, to help troubleshoot why a pre-roll bumper isn't playing\n",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/releases/download/v1.0.0.7/cinematrailers4jellyfins_1.0.0.7.zip",
"timestamp": "2026-06-10T15:10:56Z",
"version": "1.0.0.7"
},
{ {
"checksum": "96e0624e5173e5e6bf829d47118e1b40", "checksum": "96e0624e5173e5e6bf829d47118e1b40",
"changelog": "- Add diagnostic logging for Trailer Pre-Roll and Feature Pre-Roll bumpers \u2014 logs a warning if the configured library ID is invalid, and a debug message when no eligible movie is found or which movie was picked, to help troubleshoot why a bumper isn't playing\n", "changelog": "- Add diagnostic logging for Trailer Pre-Roll and Feature Pre-Roll bumpers \u2014 logs a warning if the configured library ID is invalid, and a debug message when no eligible movie is found or which movie was picked, to help troubleshoot why a bumper isn't playing\n",