using TeleWave.Application.Metadata;
using TeleWave.Domain.Library;
namespace TeleWave.Application.Common.Interfaces;
///
/// Источник метаданных о шоу/сериях (TMDb, OMDb). Реализация ходит во внешний API.
///
/// Тип шоу передаётся отдельным параметром, а не зашивается в externalId: у TMDb сериалы и
/// фильмы нумеруются в разных пространствах, и одно и то же число там означает разное. Хранить
/// в идентификаторе синтетический префикс не пришлось — тип и так известен на месте вызова, а
/// неизменяем, поэтому найденный при поиске идентификатор при любом
/// последующем обращении истолкуется тем же типом.
///
public interface IMetadataProvider
{
/// Ключ источника: «tmdb», «omdb».
string Key { get; }
/// Кандидаты по названию среди контента указанного типа.
Task> SearchShowsAsync(
string query,
ShowKind kind,
CancellationToken cancellationToken
);
///
/// Метаданные шоу. брать из самого шоу, а не из внешнего запроса:
/// иначе клиент может заставить записать сериалу метаданные одноимённого фильма.
///
Task GetShowAsync(
string externalId,
ShowKind kind,
CancellationToken cancellationToken
);
/// Метаданные серии. Только для — у остальных серий нет.
Task GetEpisodeAsync(
string externalId,
int season,
int episode,
CancellationToken cancellationToken
);
/// Сколько серий в указанном сезоне по данным источника (null — сезон не найден/нет данных).
Task GetSeasonEpisodeCountAsync(
string externalId,
int season,
CancellationToken cancellationToken
);
///
/// Номера сезонов сериала по данным источника (пусто — источник не отдал данные). Спецвыпуски
/// (нулевой сезон) не отдаются: в библиотеку они не грузятся и считались бы вечно отсутствующими.
///
Task> GetSeasonNumbersAsync(
string externalId,
CancellationToken cancellationToken
);
}
/// Резолвит провайдер по ключу и перечисляет реально настроенные (с API-ключом) источники.
public interface IMetadataProviderResolver
{
IMetadataProvider? Resolve(string key);
/// Ключи источников, у которых задан API-ключ (доступны в UI).
IReadOnlyList AvailableKeys { get; }
}