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; } }