Enhance metadata handling by introducing ShowKind parameter across various components. Update SearchShowMetadataQuery and related handlers to support querying by show type, ensuring accurate metadata retrieval for series and films. Implement validation to prevent episodes from being associated with non-series shows. Update frontend API to include ShowKind in metadata search requests, improving overall functionality and user experience.
This commit is contained in:
@@ -20,13 +20,16 @@ public sealed class OmdbMetadataProvider(
|
||||
|
||||
public async Task<IReadOnlyList<MetadataCandidate>> SearchShowsAsync(
|
||||
string query,
|
||||
ShowKind kind,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
// Тип в запросе не фиксируем: imdbID уникален и для фильма, и для сериала, а GetShowAsync
|
||||
// ходит по нему же — значит полнометражки находятся и обогащаются тем же путём, без
|
||||
// разделения пространств идентификаторов (в отличие от TMDb, где tv и movie нумеруются врозь).
|
||||
var url = $"{_omdb.BaseUrl}/?apikey={_omdb.ApiKey}&s={Uri.EscapeDataString(query)}";
|
||||
// Тип сужает выдачу, но не влияет на идентификатор: imdbID уникален и для фильма, и для
|
||||
// сериала, поэтому GetShowAsync ходит по нему одинаково — в отличие от TMDb, где tv и movie
|
||||
// нумеруются врозь.
|
||||
var type = kind == ShowKind.Series ? "series" : "movie";
|
||||
var url =
|
||||
$"{_omdb.BaseUrl}/?apikey={_omdb.ApiKey}&type={type}&s={Uri.EscapeDataString(query)}";
|
||||
using var doc = await GetAsync(httpFactory, url, cancellationToken);
|
||||
if (!doc.RootElement.TryGetProperty("Search", out var search))
|
||||
return [];
|
||||
@@ -38,9 +41,10 @@ public sealed class OmdbMetadataProvider(
|
||||
if (id is null)
|
||||
continue;
|
||||
|
||||
// Отдельные серии в выдаче — шум: шоу из них не собирают, а список они забивают.
|
||||
var kind = KindFrom(Clean(GetString(item, "Type")));
|
||||
if (kind is null)
|
||||
// Тип читаем из ответа, а не подставляем запрошенный: фильтр в запросе OMDb соблюдает,
|
||||
// но отдельные серии (Type = episode) иногда просачиваются, а шоу из них не собирают.
|
||||
var found = KindFrom(Clean(GetString(item, "Type")));
|
||||
if (found is null)
|
||||
continue;
|
||||
|
||||
list.Add(
|
||||
@@ -50,15 +54,17 @@ public sealed class OmdbMetadataProvider(
|
||||
YearFrom(GetString(item, "Year")),
|
||||
null,
|
||||
Clean(GetString(item, "Poster")),
|
||||
kind
|
||||
found
|
||||
)
|
||||
);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>Тип здесь не используется: imdbID однозначен для фильмов и сериалов одинаково.</summary>
|
||||
public async Task<ShowMetadata?> GetShowAsync(
|
||||
string externalId,
|
||||
ShowKind kind,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user