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

@@ -147,9 +147,16 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
}
else
{
// Apply enabled filters. If nothing survives, fall back to the full pool.
var filtered = ApplyFilters(pairs, feature, config);
var pool = filtered.Count > 0 ? filtered : pairs;
// Animation is a style, not a topic: animated trailers (anime included) only play
// before animated content. Applied before the fallback below, so a live-action
// 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.
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 };
}
// 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(
List<(Movie Movie, BaseItem Trailer)> pairs,
BaseItem feature,