feat: only play animated trailers before animated content (v1.0.0.11)
All checks were successful
Publish Release / release (push) Successful in 10s

An anime trailer could play before live-action content: the genre filter
accepts any single shared genre (anime is tagged Animation + Drama/Action/...),
and when nothing matched it fell back to the whole pool. Trailers tagged
Animation or Anime are now dropped for non-animated features before the
filters and the fallback run, so a live-action feature gets no trailer
rather than an animated one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Martin
2026-10-05 17:52:33 -04:00
parent c208a81b75
commit 322d6cc65d
3 changed files with 24 additions and 13 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.10</AssemblyVersion> <AssemblyVersion>1.0.0.11</AssemblyVersion>
<FileVersion>1.0.0.10</FileVersion> <FileVersion>1.0.0.11</FileVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GenerateDocumentationFile>false</GenerateDocumentationFile> <GenerateDocumentationFile>false</GenerateDocumentationFile>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors> <TreatWarningsAsErrors>false</TreatWarningsAsErrors>

View File

@@ -147,9 +147,16 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
} }
else else
{ {
// Apply enabled filters. If nothing survives, fall back to the full pool. // Animation is a style, not a topic: animated trailers (anime included) only play
var filtered = ApplyFilters(pairs, feature, config); // before animated content. Applied before the fallback below, so a live-action
var pool = filtered.Count > 0 ? filtered : pairs; // feature never gets one — it gets no trailer instead.
var eligible = IsAnimated(feature)
? pairs
: pairs.Where(p => !IsAnimated(p.Movie)).ToList();
// Apply enabled filters. If nothing survives, fall back to the eligible pool.
var filtered = ApplyFilters(eligible, feature, config);
var pool = filtered.Count > 0 ? filtered : eligible;
// Prefer unseen trailers within the pool; reset the cycle when all have been shown. // Prefer unseen trailers within the pool; reset the cycle when all have been shown.
pool = ApplyAvoidRepeats(pool, user.Id, config.AvoidRepeats); pool = ApplyAvoidRepeats(pool, user.Id, config.AvoidRepeats);
@@ -229,6 +236,12 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
return new IntroInfo { ItemId = movie.Id, Path = movie.Path }; return new IntroInfo { ItemId = movie.Id, Path = movie.Path };
} }
// TMDB tags anime as "Animation"; anime metadata providers (e.g. AniDB) use "Anime".
private static readonly string[] AnimatedGenres = { "Animation", "Anime" };
private static bool IsAnimated(BaseItem item)
=> item.Genres.Any(g => AnimatedGenres.Contains(g, StringComparer.OrdinalIgnoreCase));
private static List<(Movie Movie, BaseItem Trailer)> ApplyFilters( private static List<(Movie Movie, BaseItem Trailer)> ApplyFilters(
List<(Movie Movie, BaseItem Trailer)> pairs, List<(Movie Movie, BaseItem Trailer)> pairs,
BaseItem feature, BaseItem feature,

View File

@@ -1,5 +1,5 @@
--- ---
version: 1.0.0.10 version: 1.0.0.11
name: CinemaTrailers4Jellyfins name: CinemaTrailers4Jellyfins
guid: b581493e-1046-40ed-b6dc-cb8027624984 guid: b581493e-1046-40ed-b6dc-cb8027624984
description: > description: >
@@ -12,13 +12,11 @@ category: General
owner: 514mart owner: 514mart
targetAbi: 10.11.0.0 targetAbi: 10.11.0.0
changelog: changelog:
- Fix trailer downloads, broken by a YouTube change. YouTube no longer - Animated trailers (anime included) now only play before animated
serves combined video+audio files, so the built-in downloader now fetches content. Before, an anime trailer could play before a live-action
the video and audio separately, merges them with ffmpeg (no re-encode) movie or show when they shared a genre like Drama or Action, or when
and deletes the separate files afterwards no trailer matched the genre filter. A live-action feature now gets no
- A failed download no longer leaves an empty trailer folder behind. trailer rather than an animated one
Empty folders counted toward "Max trailers to keep" (pushing out real
trailers) and were never retried
dotnetProjects: dotnetProjects:
- name: Jellyfin.Plugin.CinemaTrailers4Jellyfins - name: Jellyfin.Plugin.CinemaTrailers4Jellyfins