diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-02-15 11:36:09 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-02-15 11:36:09 -0500 |
| commit | 8b71ab2e7d81f315f729aaee5eb976d181b8909b (patch) | |
| tree | dd21a96c08d1f9353ce61e0e77d34b8070c97a07 /MediaBrowser.Providers | |
| parent | 4e414ebc919df021bfe339a98a5385a0e618c391 (diff) | |
expose omdb to metadata config
Diffstat (limited to 'MediaBrowser.Providers')
| -rw-r--r-- | MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs | 20 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Manager/MetadataService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbProvider.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbSearch.cs | 40 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Omdb/OmdbItemProvider.cs | 118 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Omdb/OmdbProvider.cs | 38 | ||||
| -rw-r--r-- | MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs | 9 | ||||
| -rw-r--r-- | MediaBrowser.Providers/TV/TvdbSeriesProvider.cs | 11 |
10 files changed, 186 insertions, 82 deletions
diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index e990ddd65b..1f0f0e2e72 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.BoxSets { public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo> { - private readonly CultureInfo _enUs = new CultureInfo("en-US"); + private readonly CultureInfo _enUs = new CultureInfo("en-US"); private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images"; internal static MovieDbBoxSetProvider Current; @@ -45,7 +45,12 @@ namespace MediaBrowser.Providers.BoxSets // We don't already have an Id, need to fetch it if (string.IsNullOrEmpty(tmdbId)) { - tmdbId = await GetTmdbId(id, cancellationToken).ConfigureAwait(false); + var searchResult = await new MovieDbSearch(_logger, _json).FindCollectionId(id, cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + tmdbId = searchResult.id.ToString(_enUs); + } } var result = new MetadataResult<BoxSet>(); @@ -87,7 +92,7 @@ namespace MediaBrowser.Providers.BoxSets { var item = new BoxSet { - Name = obj.name, + Name = obj.name, Overview = obj.overview }; @@ -189,12 +194,7 @@ namespace MediaBrowser.Providers.BoxSets return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken); } - - private Task<string> GetTmdbId(ItemLookupInfo id, CancellationToken cancellationToken) - { - return new MovieDbSearch(_logger, _json).FindCollectionId(id, cancellationToken); - } - + public string Name { get { return "TheMovieDb"; } @@ -209,7 +209,7 @@ namespace MediaBrowser.Providers.BoxSets return Path.Combine(path, filename); } - + private static string GetDataPath(IApplicationPaths appPaths, string tmdbId) { var dataPath = GetCollectionsDataPath(appPaths); diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index f64d1b152b..1a28e57583 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -327,7 +327,7 @@ namespace MediaBrowser.Providers.Manager } // Local metadata is king - if any is found don't run remote providers - if ((!options.ReplaceAllMetadata && !hasLocalMetadata) || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh) + if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh)) { await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs index 44e2beb7f3..abd48e37c4 100644 --- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs +++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs @@ -39,8 +39,12 @@ namespace MediaBrowser.Providers.Movies // Don't search for music video id's because it is very easy to misidentify. if (string.IsNullOrEmpty(tmdbId) && string.IsNullOrEmpty(imdbId) && typeof(T) != typeof(MusicVideo)) { - tmdbId = await new MovieDbSearch(_logger, _jsonSerializer) - .FindMovieId(itemId, cancellationToken).ConfigureAwait(false); + var searchResult = await new MovieDbSearch(_logger, _jsonSerializer).FindMovieId(itemId, cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + tmdbId = searchResult.id.ToString(_usCulture); + } } if (!string.IsNullOrEmpty(tmdbId) || !string.IsNullOrEmpty(imdbId)) diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 36dfc64d2b..3bfd69ef19 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Movies /// <summary> /// Class MovieDbProvider /// </summary> - public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable + public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable, IHasOrder { internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1); @@ -529,5 +529,14 @@ namespace MediaBrowser.Providers.Movies public Keywords keywords { get; set; } public Trailers trailers { get; set; } } + + public int Order + { + get + { + // After Omdb + return 1; + } + } } } diff --git a/MediaBrowser.Providers/Movies/MovieDbSearch.cs b/MediaBrowser.Providers/Movies/MovieDbSearch.cs index fb673739ca..b171a21787 100644 --- a/MediaBrowser.Providers/Movies/MovieDbSearch.cs +++ b/MediaBrowser.Providers/Movies/MovieDbSearch.cs @@ -29,22 +29,22 @@ namespace MediaBrowser.Providers.Movies _json = json; } - public Task<string> FindSeriesId(ItemLookupInfo idInfo, CancellationToken cancellationToken) + public Task<TmdbMovieSearchResult> FindSeriesId(ItemLookupInfo idInfo, CancellationToken cancellationToken) { return FindId(idInfo, "tv", cancellationToken); } - public Task<string> FindMovieId(ItemLookupInfo idInfo, CancellationToken cancellationToken) + public Task<TmdbMovieSearchResult> FindMovieId(ItemLookupInfo idInfo, CancellationToken cancellationToken) { return FindId(idInfo, "movie", cancellationToken); } - public Task<string> FindCollectionId(ItemLookupInfo idInfo, CancellationToken cancellationToken) + public Task<TmdbMovieSearchResult> FindCollectionId(ItemLookupInfo idInfo, CancellationToken cancellationToken) { return FindId(idInfo, "collection", cancellationToken); } - private async Task<string> FindId(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken) + private async Task<TmdbMovieSearchResult> FindId(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken) { var name = idInfo.Name; var year = idInfo.Year; @@ -101,7 +101,7 @@ namespace MediaBrowser.Providers.Movies return id; } - private async Task<string> AttemptFindId(string name, string type, int? year, string language, CancellationToken cancellationToken) + private async Task<TmdbMovieSearchResult> AttemptFindId(string name, string type, int? year, string language, CancellationToken cancellationToken) { var url3 = string.Format(Search3, WebUtility.UrlEncode(name), ApiKey, language, type); @@ -114,16 +114,16 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false)) { var searchResult = _json.DeserializeFromStream<TmdbMovieSearchResults>(json); - return FindIdOfBestResult(searchResult.results, name, year); + return FindBestResult(searchResult.results, name, year); } } - private string FindIdOfBestResult(List<TmdbMovieSearchResult> results, string name, int? year) + private TmdbMovieSearchResult FindBestResult(List<TmdbMovieSearchResult> results, string name, int? year) { if (year.HasValue) { // Take the first result from the same year - var id = results.Where(i => + var result = results.FirstOrDefault(i => { // Make sure it has a name if (!string.IsNullOrEmpty(i.title ?? i.name)) @@ -138,17 +138,15 @@ namespace MediaBrowser.Providers.Movies } return false; - }) - .Select(i => i.id.ToString(CultureInfo.InvariantCulture)) - .FirstOrDefault(); + }); - if (!string.IsNullOrEmpty(id)) + if (result != null) { - return id; + return null; } // Take the first result within one year - id = results.Where(i => + result = results.FirstOrDefault(i => { // Make sure it has a name if (!string.IsNullOrEmpty(i.title ?? i.name)) @@ -163,27 +161,23 @@ namespace MediaBrowser.Providers.Movies } return false; - }) - .Select(i => i.id.ToString(CultureInfo.InvariantCulture)) - .FirstOrDefault(); + }); - if (!string.IsNullOrEmpty(id)) + if (result != null) { - return id; + return null; } } // Just take the first one - return results.Where(i => !string.IsNullOrEmpty(i.title ?? i.name)) - .Select(i => i.id.ToString(CultureInfo.InvariantCulture)) - .FirstOrDefault(); + return results.FirstOrDefault(i => !string.IsNullOrEmpty(i.title ?? i.name)); } /// <summary> /// Class TmdbMovieSearchResult /// </summary> - private class TmdbMovieSearchResult + public class TmdbMovieSearchResult { /// <summary> /// Gets or sets a value indicating whether this <see cref="TmdbMovieSearchResult" /> is adult. diff --git a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs index ed36cb7afc..0ad19840ea 100644 --- a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo> + public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo>, IHasOrder { public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken) { @@ -22,5 +22,14 @@ namespace MediaBrowser.Providers.Movies { return MovieDbProvider.Current.HasChanged(item, date); } + + public int Order + { + get + { + // After Omdb + return 1; + } + } } } diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs index 8f870d25a1..3f30626fff 100644 --- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs @@ -2,24 +2,31 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; +using MediaBrowser.Providers.Movies; +using MediaBrowser.Providers.TV; +using System; +using System.Globalization; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Providers.Omdb { - public class OmdbItemProvider : ICustomMetadataProvider<Series>, - ICustomMetadataProvider<Movie>, ICustomMetadataProvider<Trailer> + public class OmdbItemProvider : IRemoteMetadataProvider<Series, SeriesInfo>, + IRemoteMetadataProvider<Movie, MovieInfo>, IRemoteMetadataProvider<Trailer, TrailerInfo> { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; + private readonly ILogger _logger; - public OmdbItemProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient) + public OmdbItemProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogger logger) { _jsonSerializer = jsonSerializer; _httpClient = httpClient; + _logger = logger; } public string Name @@ -27,25 +34,110 @@ namespace MediaBrowser.Providers.Omdb get { return "IMDb via The Open Movie Database"; } } - public Task<ItemUpdateType> FetchAsync(Series item, IDirectoryService directoryService, CancellationToken cancellationToken) + public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken cancellationToken) { - return new OmdbProvider(_jsonSerializer, _httpClient).Fetch(item, cancellationToken); + var result = new MetadataResult<Series> + { + Item = new Series() + }; + + var imdbId = info.GetProviderId(MetadataProviders.Imdb); + + if (string.IsNullOrEmpty(imdbId)) + { + var searchResult = await GetSeriesImdbId(info, cancellationToken).ConfigureAwait(false); + + imdbId = searchResult.Item1; + + if (!string.IsNullOrEmpty(searchResult.Item2)) + { + result.Item.SetProviderId(MetadataProviders.Tvdb, searchResult.Item2); + } + } + + if (!string.IsNullOrEmpty(imdbId)) + { + result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); + result.HasMetadata = true; + + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken) + .ConfigureAwait(false); + } + + return result; } - public Task<ItemUpdateType> FetchAsync(Movie item, IDirectoryService directoryService, CancellationToken cancellationToken) + public Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken) { - return new OmdbProvider(_jsonSerializer, _httpClient).Fetch(item, cancellationToken); + return GetMovieResult<Movie>(info, cancellationToken); } - private readonly Task<ItemUpdateType> _cachedTask = Task.FromResult(ItemUpdateType.None); - public Task<ItemUpdateType> FetchAsync(Trailer item, IDirectoryService directoryService, CancellationToken cancellationToken) + public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken) { - if (item.IsLocalTrailer) + var result = new MetadataResult<Trailer>(); + + if (info.IsLocalTrailer) { - return _cachedTask; + return Task.FromResult(result); } - return new OmdbProvider(_jsonSerializer, _httpClient).Fetch(item, cancellationToken); + return GetMovieResult<Trailer>(info, cancellationToken); + } + + private async Task<MetadataResult<T>> GetMovieResult<T>(ItemLookupInfo info, CancellationToken cancellationToken) + where T : Video, new() + { + var result = new MetadataResult<T> + { + Item = new T() + }; + + var imdbId = info.GetProviderId(MetadataProviders.Imdb); + + if (string.IsNullOrEmpty(imdbId)) + { + var searchResult = await GetMovieImdbId(info, cancellationToken).ConfigureAwait(false); + + imdbId = searchResult.Item1; + + if (!string.IsNullOrEmpty(searchResult.Item2)) + { + result.Item.SetProviderId(MetadataProviders.Tmdb, searchResult.Item2); + } + } + + if (!string.IsNullOrEmpty(imdbId)) + { + result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); + result.HasMetadata = true; + + await new OmdbProvider(_jsonSerializer, _httpClient).Fetch(result.Item, imdbId, cancellationToken) + .ConfigureAwait(false); + } + + return result; + } + + private async Task<Tuple<string, string>> GetMovieImdbId(ItemLookupInfo info, CancellationToken cancellationToken) + { + var result = await new GenericMovieDbInfo<Movie>(_logger, _jsonSerializer).GetMetadata(info, cancellationToken) + .ConfigureAwait(false); + + var imdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Imdb) : null; + var tmdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Tmdb) : null; + + return new Tuple<string, string>(imdb, tmdb); + } + + private async Task<Tuple<string,string>> GetSeriesImdbId(SeriesInfo info, CancellationToken cancellationToken) + { + var result = await TvdbSeriesProvider.Current.GetMetadata(info, cancellationToken) + .ConfigureAwait(false); + + var imdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Imdb) : null; + var tvdb = result.HasMetadata ? result.Item.GetProviderId(MetadataProviders.Tvdb) : null; + + return new Tuple<string, string>(imdb, tvdb); } } } diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index 8eabc51642..38f5551335 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Serialization; using System; @@ -16,26 +15,23 @@ namespace MediaBrowser.Providers.Omdb { public class OmdbProvider { - private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1); + internal readonly SemaphoreSlim ResourcePool = new SemaphoreSlim(1, 1); private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + public static OmdbProvider Current; + public OmdbProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient) { _jsonSerializer = jsonSerializer; _httpClient = httpClient; + + Current = this; } - public async Task<ItemUpdateType> Fetch(BaseItem item, CancellationToken cancellationToken) + public async Task Fetch(BaseItem item, string imdbId, CancellationToken cancellationToken) { - var imdbId = item.GetProviderId(MetadataProviders.Imdb); - - if (string.IsNullOrEmpty(imdbId)) - { - return ItemUpdateType.None; - } - var imdbParam = imdbId.StartsWith("tt", StringComparison.OrdinalIgnoreCase) ? imdbId : "tt" + imdbId; var url = string.Format("http://www.omdbapi.com/?i={0}&tomatoes=true", imdbParam); @@ -43,7 +39,7 @@ namespace MediaBrowser.Providers.Omdb using (var stream = await _httpClient.Get(new HttpRequestOptions { Url = url, - ResourcePool = _resourcePool, + ResourcePool = ResourcePool, CancellationToken = cancellationToken }).ConfigureAwait(false)) @@ -98,16 +94,13 @@ namespace MediaBrowser.Providers.Omdb ParseAdditionalMetadata(item, result); } - - return ItemUpdateType.MetadataDownload; } private void ParseAdditionalMetadata(BaseItem item, RootObject result) { // Grab series genres because imdb data is better than tvdb. Leave movies alone // But only do it if english is the preferred language because this data will not be localized - if (!item.LockedFields.Contains(MetadataFields.Genres) && - ShouldFetchGenres(item) && + if (ShouldFetchGenres(item) && !string.IsNullOrWhiteSpace(result.Genre) && !string.Equals(result.Genre, "n/a", StringComparison.OrdinalIgnoreCase)) { @@ -146,21 +139,10 @@ namespace MediaBrowser.Providers.Omdb var lang = item.GetPreferredMetadataLanguage(); // The data isn't localized and so can only be used for english users - if (!string.Equals(lang, "en", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - // Only fetch if other providers didn't get anything - if (item is Trailer) - { - return item.Genres.Count == 0; - } - - return item is Series || item is Movie; + return string.Equals(lang, "en", StringComparison.OrdinalIgnoreCase); } - protected class RootObject + public class RootObject { public string Title { get; set; } public string Year { get; set; } diff --git a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs index 5dd8a056f5..f62922f6a6 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs @@ -73,7 +73,12 @@ namespace MediaBrowser.Providers.TV if (string.IsNullOrEmpty(tmdbId)) { - tmdbId = await new MovieDbSearch(_logger, _jsonSerializer).FindSeriesId(info, cancellationToken).ConfigureAwait(false); + var searchResult = await new MovieDbSearch(_logger, _jsonSerializer).FindSeriesId(info, cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + tmdbId = searchResult.id.ToString(_usCulture); + } } if (!string.IsNullOrEmpty(tmdbId)) @@ -434,7 +439,7 @@ namespace MediaBrowser.Providers.TV { get { - // After Tvdb + // After Omdb and Tvdb return 2; } } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index f3909e2c68..44950c4d3b 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -22,7 +22,7 @@ using System.Xml; namespace MediaBrowser.Providers.TV { - public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo> + public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder { internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2); internal static TvdbSeriesProvider Current { get; private set; } @@ -1072,5 +1072,14 @@ namespace MediaBrowser.Providers.TV { get { return "TheTVDB"; } } + + public int Order + { + get + { + // After Omdb + return 1; + } + } } } |
