fix: language filter also checks the title's original language (v1.0.0.15)
All checks were successful
Publish Release / release (push) Successful in 9s

AllowedLanguages only filtered on each video's iso_639_1 tag, and TMDB
often tags subtitled foreign trailers as "en". With en,fr selected, 6 of
27 downloaded trailers were Korean, Chinese or Zulu titles. Candidates
now also need an allowed original_language (from the list results, so
no extra API calls).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Martin
2026-10-05 18:27:50 -04:00
parent 2664ab4d5a
commit fb75fa5a07
5 changed files with 29 additions and 9 deletions

View File

@@ -45,7 +45,9 @@
<fieldset class="verticalSection verticalSection-extrabottompadding"> <fieldset class="verticalSection verticalSection-extrabottompadding">
<legend><h3 class="sectionTitle">Trailer Languages</h3></legend> <legend><h3 class="sectionTitle">Trailer Languages</h3></legend>
<p class="fieldDescription"> <p class="fieldDescription">
Only download trailers in the selected languages. Only download trailers in the selected languages. Both the trailer and the
movie/show itself (its original language) must be in one of them, so a
subtitled foreign trailer is skipped.
Leave everything unchecked to allow all languages. Leave everything unchecked to allow all languages.
</p> </p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:0 2em;"> <div style="display:grid;grid-template-columns:1fr 1fr;gap:0 2em;">

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.14</AssemblyVersion> <AssemblyVersion>1.0.0.15</AssemblyVersion>
<FileVersion>1.0.0.14</FileVersion> <FileVersion>1.0.0.15</FileVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GenerateDocumentationFile>false</GenerateDocumentationFile> <GenerateDocumentationFile>false</GenerateDocumentationFile>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors> <TreatWarningsAsErrors>false</TreatWarningsAsErrors>

View File

@@ -177,6 +177,14 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.ScheduledTasks
continue; continue;
} }
// A trailer's own language tag is often "en" just because it has English
// subtitles, so also require the title itself to be in an allowed language.
if (allowedLanguages != null && !allowedLanguages.Contains(movie.OriginalLanguage))
{
_logger.LogDebug("|CinemaTrailers4Jellyfins| Skipping '{Title}': original language '{Lang}' is not allowed", movie.Title, movie.OriginalLanguage);
continue;
}
var trailers = await _tmdbService.GetTrailersAsync( var trailers = await _tmdbService.GetTrailersAsync(
"movie", movie.Id.ToString(), config.TmdbApiKey, allowedLanguages, cancellationToken).ConfigureAwait(false); "movie", movie.Id.ToString(), config.TmdbApiKey, allowedLanguages, cancellationToken).ConfigureAwait(false);
@@ -284,6 +292,14 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.ScheduledTasks
continue; continue;
} }
// A trailer's own language tag is often "en" just because it has English
// subtitles, so also require the title itself to be in an allowed language.
if (allowedLanguages != null && !allowedLanguages.Contains(show.OriginalLanguage))
{
_logger.LogDebug("|CinemaTrailers4Jellyfins| Skipping '{Title}': original language '{Lang}' is not allowed", show.Title, show.OriginalLanguage);
continue;
}
var trailers = await _tmdbService.GetTrailersAsync( var trailers = await _tmdbService.GetTrailersAsync(
"tv", show.Id.ToString(), config.TmdbApiKey, allowedLanguages, cancellationToken).ConfigureAwait(false); "tv", show.Id.ToString(), config.TmdbApiKey, allowedLanguages, cancellationToken).ConfigureAwait(false);

View File

@@ -14,7 +14,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
{ {
public record TmdbVideo(string Key, string Name, string Language, bool Official, int Size); public record TmdbVideo(string Key, string Name, string Language, bool Official, int Size);
public record TmdbMediaResult(int Id, string Title, string ReleaseDate) public record TmdbMediaResult(int Id, string Title, string ReleaseDate, string OriginalLanguage)
{ {
public int? Year => DateTime.TryParse(ReleaseDate, out var d) ? d.Year : (int?)null; public int? Year => DateTime.TryParse(ReleaseDate, out var d) ? d.Year : (int?)null;
} }
@@ -170,6 +170,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
var releaseDate = entry.TryGetProperty(dateField, out var rd) ? rd.GetString() ?? string.Empty : string.Empty; var releaseDate = entry.TryGetProperty(dateField, out var rd) ? rd.GetString() ?? string.Empty : string.Empty;
var title = entry.TryGetProperty(titleField, out var t) ? t.GetString() ?? string.Empty : string.Empty; var title = entry.TryGetProperty(titleField, out var t) ? t.GetString() ?? string.Empty : string.Empty;
var id = entry.GetProperty("id").GetInt32(); var id = entry.GetProperty("id").GetInt32();
var originalLanguage = entry.TryGetProperty("original_language", out var ol) ? ol.GetString() ?? string.Empty : string.Empty;
if (releasedAfter.HasValue && DateTime.TryParse(releaseDate, out var parsed)) if (releasedAfter.HasValue && DateTime.TryParse(releaseDate, out var parsed))
{ {
@@ -177,7 +178,7 @@ namespace Jellyfin.Plugin.CinemaTrailers4Jellyfins.Services
} }
anyInRange = true; anyInRange = true;
results.Add(new TmdbMediaResult(id, title, releaseDate)); results.Add(new TmdbMediaResult(id, title, releaseDate, originalLanguage));
} }
if (page >= totalPages || (releasedAfter.HasValue && !anyInRange)) if (page >= totalPages || (releasedAfter.HasValue && !anyInRange))

View File

@@ -1,5 +1,5 @@
--- ---
version: 1.0.0.14 version: 1.0.0.15
name: CinemaTrailers4Jellyfins name: CinemaTrailers4Jellyfins
guid: b581493e-1046-40ed-b6dc-cb8027624984 guid: b581493e-1046-40ed-b6dc-cb8027624984
description: > description: >
@@ -12,9 +12,10 @@ category: General
owner: 514mart owner: 514mart
targetAbi: 10.11.0.0 targetAbi: 10.11.0.0
changelog: changelog:
- When yt-dlp fails part-way, its partial download files (.part, .ytdl, - Trailer Languages now also checks the original language of the movie or
separate video/audio) are now deleted instead of being left in the show. Before, only the trailer's own language tag was checked, and
trailer folder TMDB often tags subtitled foreign trailers as English, so Korean,
Chinese or Japanese trailers got through
dotnetProjects: dotnetProjects:
- name: Jellyfin.Plugin.CinemaTrailers4Jellyfins - name: Jellyfin.Plugin.CinemaTrailers4Jellyfins