using MediaBrowser.Common.Net; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using MediaBrowser.Providers.Omdb; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Providers.TV { class OmdbEpisodeProvider : IRemoteMetadataProvider, IHasOrder { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; private readonly OmdbItemProvider _itemProvider; public OmdbEpisodeProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogger logger, ILibraryManager libraryManager) { _jsonSerializer = jsonSerializer; _httpClient = httpClient; _itemProvider = new OmdbItemProvider(jsonSerializer, httpClient, logger, libraryManager); } public Task> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken) { return _itemProvider.GetSearchResults(searchInfo, "episode", cancellationToken); } public async Task> GetMetadata(EpisodeInfo info, CancellationToken cancellationToken) { var result = new MetadataResult { Item = new Episode() }; // Allowing this will dramatically increase scan times if (info.IsMissingEpisode || info.IsVirtualUnaired) { return result; } var imdbId = info.GetProviderId(MetadataProviders.Imdb); if (string.IsNullOrWhiteSpace(imdbId)) { imdbId = await GetEpisodeImdbId(info, cancellationToken).ConfigureAwait(false); } if (!string.IsNullOrEmpty(imdbId)) { result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } return result; } private async Task GetEpisodeImdbId(EpisodeInfo info, CancellationToken cancellationToken) { var results = await GetSearchResults(info, cancellationToken).ConfigureAwait(false); var first = results.FirstOrDefault(); return first == null ? null : first.GetProviderId(MetadataProviders.Imdb); } public int Order { get { // After TheTvDb return 1; } } public string Name { get { return "The Open Movie Database"; } } public Task GetImageResponse(string url, CancellationToken cancellationToken) { return _itemProvider.GetImageResponse(url, cancellationToken); } } }