From c022b728f8570a89973e7690bfdf80e245aa2690 Mon Sep 17 00:00:00 2001 From: softworkz Date: Fri, 1 Jul 2016 22:03:36 +0200 Subject: [PATCH] OMDB improvements - Improved parsing of production year (cases like '2001-2003') - Parse writer field as person - Parse director field as person - Parse actors fields as persons --- .../Omdb/OmdbItemProvider.cs | 4 +- MediaBrowser.Providers/Omdb/OmdbProvider.cs | 68 ++++++++++++++++--- .../TV/Omdb/OmdbEpisodeProvider.cs | 2 +- 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs index 7a803eb6f..914b775af 100644 --- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs @@ -226,7 +226,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).Fetch(result.Item, imdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).Fetch(result, imdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } return result; @@ -265,7 +265,7 @@ namespace MediaBrowser.Providers.Omdb result.Item.SetProviderId(MetadataProviders.Imdb, imdbId); result.HasMetadata = true; - await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).Fetch(result.Item, imdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); + await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).Fetch(result, imdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } return result; diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs index 397107c74..d3692f7c6 100644 --- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Serialization; using System; @@ -34,13 +35,16 @@ namespace MediaBrowser.Providers.Omdb _configurationManager = configurationManager; } - public async Task Fetch(BaseItem item, string imdbId, string language, string country, CancellationToken cancellationToken) + public async Task Fetch(MetadataResult itemResult, string imdbId, string language, string country, CancellationToken cancellationToken) + where T :BaseItem { if (string.IsNullOrWhiteSpace(imdbId)) { throw new ArgumentNullException("imdbId"); } + T item = itemResult.Item; + var result = await GetRootObject(imdbId, cancellationToken); // Only take the name and rating if the user's language is set to english, since Omdb has no localization @@ -56,8 +60,8 @@ namespace MediaBrowser.Providers.Omdb int year; - if (!string.IsNullOrEmpty(result.Year) - && int.TryParse(result.Year, NumberStyles.Number, _usCulture, out year) + if (!string.IsNullOrEmpty(result.Year) && result.Year.Length >= 4 + && int.TryParse(result.Year.Substring(0, 4), NumberStyles.Number, _usCulture, out year) && year >= 0) { item.ProductionYear = year; @@ -112,16 +116,19 @@ namespace MediaBrowser.Providers.Omdb item.SetProviderId(MetadataProviders.Imdb, result.imdbID); } - ParseAdditionalMetadata(item, result); + ParseAdditionalMetadata(itemResult, result); } - public async Task FetchEpisodeData(BaseItem item, int episodeNumber, int seasonNumber, string imdbId, string language, string country, CancellationToken cancellationToken) + public async Task FetchEpisodeData(MetadataResult itemResult, int episodeNumber, int seasonNumber, string imdbId, string language, string country, CancellationToken cancellationToken) + where T : BaseItem { if (string.IsNullOrWhiteSpace(imdbId)) { throw new ArgumentNullException("imdbId"); } + T item = itemResult.Item; + var seasonResult = await GetSeasonRootObject(imdbId, seasonNumber, cancellationToken); RootObject result = null; @@ -154,8 +161,8 @@ namespace MediaBrowser.Providers.Omdb int year; - if (!string.IsNullOrEmpty(result.Year) - && int.TryParse(result.Year, NumberStyles.Number, _usCulture, out year) + if (!string.IsNullOrEmpty(result.Year) && result.Year.Length >= 4 + && int.TryParse(result.Year.Substring(0, 4), NumberStyles.Number, _usCulture, out year) && year >= 0) { item.ProductionYear = year; @@ -210,7 +217,7 @@ namespace MediaBrowser.Providers.Omdb item.SetProviderId(MetadataProviders.Imdb, result.imdbID); } - ParseAdditionalMetadata(item, result); + ParseAdditionalMetadata(itemResult, result); return true; } @@ -376,8 +383,11 @@ namespace MediaBrowser.Providers.Omdb return Path.Combine(dataPath, filename); } - private void ParseAdditionalMetadata(BaseItem item, RootObject result) + private void ParseAdditionalMetadata(MetadataResult itemResult, RootObject result) + where T : BaseItem { + T item = itemResult.Item; + // 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 (ShouldFetchGenres(item) && @@ -417,6 +427,46 @@ namespace MediaBrowser.Providers.Omdb // Imdb plots are usually pretty short hasShortOverview.ShortOverview = result.Plot; } + + if (!string.IsNullOrWhiteSpace(result.Director)) + { + var person = new PersonInfo + { + Name = result.Director.Trim(), + Type = PersonType.Director + }; + + itemResult.AddPerson(person); + } + + if (!string.IsNullOrWhiteSpace(result.Writer)) + { + var person = new PersonInfo + { + Name = result.Director.Trim(), + Type = PersonType.Writer + }; + + itemResult.AddPerson(person); + } + + if (!string.IsNullOrWhiteSpace(result.Actors)) + { + var actorList = result.Actors.Split(','); + foreach (var actor in actorList) + { + if (!string.IsNullOrWhiteSpace(actor)) + { + var person = new PersonInfo + { + Name = actor.Trim(), + Type = PersonType.Actor + }; + + itemResult.AddPerson(person); + } + } + } } private bool ShouldFetchGenres(BaseItem item) diff --git a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs index 21668f014..64e30f47f 100644 --- a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs @@ -57,7 +57,7 @@ namespace MediaBrowser.Providers.TV { var seriesImdbId = info.SeriesProviderIds[MetadataProviders.Imdb.ToString()]; - result.HasMetadata = await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).FetchEpisodeData(result.Item, info.IndexNumber.Value, info.ParentIndexNumber.Value, seriesImdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); + result.HasMetadata = await new OmdbProvider(_jsonSerializer, _httpClient, _fileSystem, _configurationManager).FetchEpisodeData(result, info.IndexNumber.Value, info.ParentIndexNumber.Value, seriesImdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false); } return result;