Enhance TmdbMetadataProvider to support fallback for localized poster retrieval
Updated the TmdbMetadataProvider class to implement a fallback mechanism for obtaining show posters when localized images are unavailable. Introduced a new method, NeutralPosterPathAsync, which retrieves a language-neutral poster if the localized one is missing. Additionally, updated related tests to verify the correct behavior of this fallback logic, ensuring that shows without localized posters still display appropriate imagery.
This commit is contained in:
@@ -104,12 +104,20 @@ public sealed class TmdbMetadataProvider(
|
||||
if (doc is null)
|
||||
return null;
|
||||
var root = doc.RootElement;
|
||||
|
||||
// Постер TMDb отдаёт под запрошенный язык, и у шоу без локализованной обложки поле пустое —
|
||||
// хотя в поиске картинка была: там приходит язык-нейтральная. Без добора «Применить» молча
|
||||
// оставляло бы шоу без постера, и это неотличимо от «постера нет вовсе».
|
||||
var posterPath =
|
||||
GetString(root, "poster_path")
|
||||
?? await NeutralPosterPathAsync(movie, externalId, cancellationToken);
|
||||
|
||||
return new ShowMetadata(
|
||||
externalId,
|
||||
GetString(root, TitleField(movie)) ?? "—",
|
||||
YearFrom(GetString(root, DateField(movie))),
|
||||
GetString(root, "overview"),
|
||||
PosterUrl(GetString(root, "poster_path")),
|
||||
PosterUrl(posterPath),
|
||||
GenresFrom(root),
|
||||
movie ? MovieCertification(root) : TvCertification(root),
|
||||
FranchiseFrom(root),
|
||||
@@ -117,6 +125,22 @@ public sealed class TmdbMetadataProvider(
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Постер без привязки к языку: тот же запрос, но без <c>language</c>. Второе обращение к API
|
||||
/// делается только когда локализованного постера нет, — то есть редко.
|
||||
/// </summary>
|
||||
private async Task<string?> NeutralPosterPathAsync(
|
||||
bool movie,
|
||||
string externalId,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var query = UsesBearer ? string.Empty : $"?api_key={Tmdb.ApiKey}";
|
||||
var url = $"{Tmdb.BaseUrl}/{Segment(movie)}/{externalId}{query}";
|
||||
using var doc = await TryGetAsync(httpFactory, url, cancellationToken, BearerToken);
|
||||
return doc is null ? null : GetString(doc.RootElement, "poster_path");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Франшиза фильма: TMDb отдаёт её прямо в ответе по фильму (<c>belongs_to_collection</c>),
|
||||
/// отдельного запроса не нужно. У сериалов этого поля нет.
|
||||
|
||||
Reference in New Issue
Block a user