4 Commits

Author SHA1 Message Date
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
Martin
c76ddbc352 chore: trace GetIntros calls and outcomes at Information level (v1.0.0.7)
All checks were successful
Publish Release / release (push) Successful in 10s
Logs every GetIntros call (item, path, enabled features), why an item
is skipped, and pre-roll/post-roll lookup outcomes, without depending
on a Debug logging.json override.
2026-06-10 11:09:48 -04:00
gitea-actions
e9d9543941 chore: update manifest.json for v1.0.0.6 2026-06-10 14:35:52 +00:00
4 changed files with 60 additions and 16 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.6</AssemblyVersion> <AssemblyVersion>1.0.0.8</AssemblyVersion>
<FileVersion>1.0.0.6</FileVersion> <FileVersion>1.0.0.8</FileVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GenerateDocumentationFile>false</GenerateDocumentationFile> <GenerateDocumentationFile>false</GenerateDocumentationFile>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors> <TreatWarningsAsErrors>false</TreatWarningsAsErrors>

View File

@@ -48,6 +48,16 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
var preRollEnabled = !string.IsNullOrEmpty(config.TrailerPreRollLibraryId); var preRollEnabled = !string.IsNullOrEmpty(config.TrailerPreRollLibraryId);
var featurePreRollEnabled = !string.IsNullOrEmpty(config.FeaturePreRollLibraryId); var featurePreRollEnabled = !string.IsNullOrEmpty(config.FeaturePreRollLibraryId);
_logger.LogInformation(
"|CinemaTrailers4Jellyfins| GetIntros called for {Type} '{Name}' (Path={Path}). "
+ "trailersEnabled={Trailers} preRollEnabled={PreRoll} featurePreRollEnabled={FeaturePreRoll}",
item.GetType().Name,
item.Name,
item.Path,
trailersEnabled,
preRollEnabled,
featurePreRollEnabled);
if (!trailersEnabled && !preRollEnabled && !featurePreRollEnabled) if (!trailersEnabled && !preRollEnabled && !featurePreRollEnabled)
return Task.FromResult(Enumerable.Empty<IntroInfo>()); return Task.FromResult(Enumerable.Empty<IntroInfo>());
@@ -65,16 +75,23 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
case Episode episode: case Episode episode:
if (!config.TrailersForEpisodes) if (!config.TrailersForEpisodes)
{
_logger.LogInformation("|CinemaTrailers4Jellyfins| Skipping: TrailersForEpisodes is disabled.");
return Task.FromResult(Enumerable.Empty<IntroInfo>()); return Task.FromResult(Enumerable.Empty<IntroInfo>());
}
if (!IsFirstEpisodeOfDay(user.Id)) if (!IsFirstEpisodeOfDay(user.Id))
{
_logger.LogInformation("|CinemaTrailers4Jellyfins| Skipping: not the first episode of the day for this user.");
return Task.FromResult(Enumerable.Empty<IntroInfo>()); return Task.FromResult(Enumerable.Empty<IntroInfo>());
}
feature = episode.Series ?? (BaseItem)episode; feature = episode.Series ?? (BaseItem)episode;
isEpisode = true; isEpisode = true;
break; break;
default: default:
_logger.LogInformation("|CinemaTrailers4Jellyfins| Skipping: item type {Type} is not a Movie or Episode.", item.GetType().Name);
return Task.FromResult(Enumerable.Empty<IntroInfo>()); return Task.FromResult(Enumerable.Empty<IntroInfo>());
} }
@@ -85,7 +102,10 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
// (covers both the fake-movie files and their trailer extras). // (covers both the fake-movie files and their trailer extras).
if (!string.IsNullOrEmpty(outputFolder) if (!string.IsNullOrEmpty(outputFolder)
&& item.Path?.StartsWith(outputFolder, StringComparison.OrdinalIgnoreCase) == true) && item.Path?.StartsWith(outputFolder, StringComparison.OrdinalIgnoreCase) == true)
{
_logger.LogInformation("|CinemaTrailers4Jellyfins| Skipping: item path is inside the output folder ({Folder}).", outputFolder);
return Task.FromResult(Enumerable.Empty<IntroInfo>()); return Task.FromResult(Enumerable.Empty<IntroInfo>());
}
var intros = new List<IntroInfo>(); var intros = new List<IntroInfo>();
@@ -150,6 +170,11 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
intros.Add(featureRoll); intros.Add(featureRoll);
} }
_logger.LogInformation(
"|CinemaTrailers4Jellyfins| Returning {Count} intro(s): {Paths}",
intros.Count,
string.Join(", ", intros.Select(i => i.Path)));
return Task.FromResult<IEnumerable<IntroInfo>>(intros); return Task.FromResult<IEnumerable<IntroInfo>>(intros);
} }
@@ -168,20 +193,23 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
return null; return null;
} }
var movies = _libraryManager if (_libraryManager.GetItemById(parsedId) is not Folder folder)
.GetItemList(new InternalItemsQuery {
{ _logger.LogWarning(
IncludeItemTypes = new[] { BaseItemKind.Movie }, "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} could not be found.",
TopParentIds = new[] { parsedId }, label,
Recursive = true, parsedId);
}) return null;
}
var movies = folder.GetRecursiveChildren()
.OfType<Movie>() .OfType<Movie>()
.Where(m => m.Id != excludeId) .Where(m => m.Id != excludeId)
.ToList(); .ToList();
if (movies.Count == 0) if (movies.Count == 0)
{ {
_logger.LogDebug( _logger.LogInformation(
"|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items. " "|CinemaTrailers4Jellyfins| {Label} library {LibraryId} has no eligible Movie items. "
+ "Ensure the library has been scanned and contains at least one other Movie.", + "Ensure the library has been scanned and contains at least one other Movie.",
label, label,
@@ -190,7 +218,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
} }
var movie = movies[_rng.Next(movies.Count)]; var movie = movies[_rng.Next(movies.Count)];
_logger.LogDebug( _logger.LogInformation(
"|CinemaTrailers4Jellyfins| {Label}: picked '{Title}' ({Path}).", "|CinemaTrailers4Jellyfins| {Label}: picked '{Title}' ({Path}).",
label, label,
movie.Name, movie.Name,

View File

@@ -1,5 +1,5 @@
--- ---
version: 1.0.0.6 version: 1.0.0.8
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 diagnostic logging for Trailer Pre-Roll and Feature Pre-Roll bumpers - Fix Trailer Pre-Roll / Feature Pre-Roll bumpers not being found — the
logs a warning if the configured library ID is invalid, and a debug message library lookup now walks the configured library folder's children
when no eligible movie is found or which movie was picked, to help directly instead of relying on TopParentIds matching, which could fail
troubleshoot why a bumper isn't playing to match movies even when they appear correctly in the library
dotnetProjects: dotnetProjects:
- name: Jellyfin.Plugin.CinemaTrailers4Jellyfins - name: Jellyfin.Plugin.CinemaTrailers4Jellyfins

View File

@@ -8,6 +8,22 @@
"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": "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",
"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",
"targetAbi": "10.11.0.0",
"sourceUrl": "https://www.git.quarantinedstudio.com/mvezina/CinemaTrailers4Jellyfins/releases/download/v1.0.0.6/cinematrailers4jellyfins_1.0.0.6.zip",
"timestamp": "2026-06-10T14:35:52Z",
"version": "1.0.0.6"
},
{ {
"checksum": "6c88aaeb38023b327e9b042181dc0708", "checksum": "6c88aaeb38023b327e9b042181dc0708",
"changelog": "- Add Trailer Pre-Roll and Feature Pre-Roll bumpers via IIntroProvider \u2014 pick existing Jellyfin Movie libraries in settings and a random movie from each is played before the trailer block (\"Now Playing\") and/or right before the feature (\"Feature Presentation\"); both are independent and disabled by default\n", "changelog": "- Add Trailer Pre-Roll and Feature Pre-Roll bumpers via IIntroProvider \u2014 pick existing Jellyfin Movie libraries in settings and a random movie from each is played before the trailer block (\"Now Playing\") and/or right before the feature (\"Feature Presentation\"); both are independent and disabled by default\n",