diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-18 14:16:07 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-18 14:16:07 -0400 |
| commit | 4c971ed1615c2a1f5a88e4f160672718fe24f1b4 (patch) | |
| tree | 7b8b3bb41642d2f9f873d7f396a76d72a9da2d6e | |
| parent | 4cd7030248ae26e48f43a7557cab5893f50c3d74 (diff) | |
fixes #281 - Metadata images incomplete
3 files changed, 71 insertions, 143 deletions
diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 3e8501dfa..6e14682dd 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -91,12 +91,13 @@ namespace MediaBrowser.Controller.Providers } // Only validate paths from the same directory - need to copy to a list because we are going to potentially modify the collection below - var deletedKeys = item.Images.Keys.Where(image => + var deletedKeys = item.Images.ToList().Where(image => { - var path = item.Images[image]; + var path = image.Value; return IsInMetaLocation(item, path) && item.ResolveArgs.GetMetaFileByPath(path) == null; - }).ToList(); + + }).Select(i => i.Key).ToList(); // Now remove them from the dictionary foreach (var key in deletedKeys) diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs index 2b4173ed9..b6852e9ba 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs @@ -46,11 +46,11 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// The episode query /// </summary> - private const string episodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/default/{2}/{3}/{4}.xml"; + private const string EpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/default/{2}/{3}/{4}.xml"; /// <summary> /// The abs episode query /// </summary> - private const string absEpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/absolute/{2}/{3}.xml"; + private const string AbsEpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/absolute/{2}/{3}.xml"; /// <summary> /// Supportses the specified item. @@ -179,25 +179,19 @@ namespace MediaBrowser.Controller.Providers.TV seasonNumber = "0"; // Specials } - var url = string.Format(episodeQuery, TVUtils.TvdbApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); + var url = string.Format(EpisodeQuery, TVUtils.TvdbApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); var doc = new XmlDocument(); - try + using (var result = await HttpClient.Get(new HttpRequestOptions { - using (var result = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = url, + ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - doc.Load(result); - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + doc.Load(result); } //episode does not exist under this season, try absolute numbering. @@ -205,25 +199,19 @@ namespace MediaBrowser.Controller.Providers.TV //this is basicly just for anime. if (!doc.HasChildNodes && Int32.Parse(seasonNumber) == 1) { - url = string.Format(absEpisodeQuery, TVUtils.TvdbApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); + url = string.Format(AbsEpisodeQuery, TVUtils.TvdbApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); - try + using (var result = await HttpClient.Get(new HttpRequestOptions { - using (var result = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = url, + ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - if (result != null) doc.Load(result); - usingAbsoluteData = true; - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + if (result != null) doc.Load(result); + usingAbsoluteData = true; } } diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs index eb689ed2f..39fe4f2c6 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs @@ -1,5 +1,4 @@ -using System.Globalization; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; @@ -11,6 +10,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Net; using System.Text; @@ -142,8 +142,7 @@ namespace MediaBrowser.Controller.Providers.TV if (item.DontFetchMeta) return false; - return !HasLocalMeta(item) && (ConfigurationManager.Configuration.MetadataRefreshDays != -1 && - DateTime.UtcNow.Subtract(downloadDate).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays); + return !HasLocalMeta(item) && base.NeedsRefreshInternal(item, providerInfo); } /// <summary> @@ -164,16 +163,17 @@ namespace MediaBrowser.Controller.Providers.TV var seriesId = Path.GetFileName(path).GetAttributeValue("tvdbid") ?? await GetSeriesId(series, cancellationToken); cancellationToken.ThrowIfCancellationRequested(); - + + var status = ProviderRefreshStatus.Success; + if (!string.IsNullOrEmpty(seriesId)) { series.SetProviderId(MetadataProviders.Tvdb, seriesId); - if (!HasCompleteMetadata(series)) - { - await FetchSeriesData(series, seriesId, cancellationToken).ConfigureAwait(false); - } + + status = await FetchSeriesData(series, seriesId, cancellationToken).ConfigureAwait(false); } - SetLastRefreshed(item, DateTime.UtcNow); + + SetLastRefreshed(item, DateTime.UtcNow, status); return true; } Logger.Info("Series provider not fetching because local meta exists or requested to ignore: " + item.Name); @@ -188,11 +188,9 @@ namespace MediaBrowser.Controller.Providers.TV /// <param name="seriesId">The series id.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> - private async Task<bool> FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken) + private async Task<ProviderRefreshStatus> FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken) { - var success = false; - - var name = series.Name; + var status = ProviderRefreshStatus.Success; if (!string.IsNullOrEmpty(seriesId)) { @@ -200,22 +198,16 @@ namespace MediaBrowser.Controller.Providers.TV string url = string.Format(seriesGet, TVUtils.TvdbApiKey, seriesId, ConfigurationManager.Configuration.PreferredMetadataLanguage); var doc = new XmlDocument(); - try + using (var xml = await HttpClient.Get(new HttpRequestOptions { - using (var xml = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = url, + ResourcePool = TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - doc.Load(xml); - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + doc.Load(xml); } if (doc.HasChildNodes) @@ -224,8 +216,6 @@ namespace MediaBrowser.Controller.Providers.TV var actorTask = FetchActors(series, seriesId, doc, cancellationToken); var imageTask = FetchImages(series, seriesId, cancellationToken); - success = true; - series.Name = doc.SafeGetString("//SeriesName"); series.Overview = doc.SafeGetString("//Overview"); series.CommunityRating = doc.SafeGetSingle("//Rating", 0, 10); @@ -268,8 +258,15 @@ namespace MediaBrowser.Controller.Providers.TV } } - //wait for other tasks - await Task.WhenAll(actorTask, imageTask).ConfigureAwait(false); + try + { + //wait for other tasks + await Task.WhenAll(actorTask, imageTask).ConfigureAwait(false); + } + catch (HttpException) + { + status = ProviderRefreshStatus.CompletedWithErrors; + } if (ConfigurationManager.Configuration.SaveLocalMeta) { @@ -281,9 +278,7 @@ namespace MediaBrowser.Controller.Providers.TV } } - - - return success; + return status; } /// <summary> @@ -299,22 +294,16 @@ namespace MediaBrowser.Controller.Providers.TV string urlActors = string.Format(getActors, TVUtils.TvdbApiKey, seriesId); var docActors = new XmlDocument(); - try + using (var actors = await HttpClient.Get(new HttpRequestOptions { - using (var actors = await HttpClient.Get(new HttpRequestOptions - { - Url = urlActors, - ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = urlActors, + ResourcePool = TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - docActors.Load(actors); - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + docActors.Load(actors); } if (docActors.HasChildNodes) @@ -380,22 +369,16 @@ namespace MediaBrowser.Controller.Providers.TV string url = string.Format("http://www.thetvdb.com/api/" + TVUtils.TvdbApiKey + "/series/{0}/banners.xml", seriesId); var images = new XmlDocument(); - try + using (var imgs = await HttpClient.Get(new HttpRequestOptions { - using (var imgs = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = url, + ResourcePool = TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - images.Load(imgs); - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + images.Load(imgs); } if (images.HasChildNodes) @@ -408,17 +391,7 @@ namespace MediaBrowser.Controller.Providers.TV n = n.SelectSingleNode("./BannerPath"); if (n != null) { - try - { - series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false); - } - catch (HttpException) - { - } - catch (IOException) - { - - } + series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false); } } } @@ -431,19 +404,9 @@ namespace MediaBrowser.Controller.Providers.TV n = n.SelectSingleNode("./BannerPath"); if (n != null) { - try - { - var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken); - - series.SetImage(ImageType.Banner, bannerImagePath); - } - catch (HttpException) - { - } - catch (IOException) - { + var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken); - } + series.SetImage(ImageType.Banner, bannerImagePath); } } } @@ -460,17 +423,7 @@ namespace MediaBrowser.Controller.Providers.TV var bdName = "backdrop" + (bdNo > 0 ? bdNo.ToString(UsCulture) : ""); if (ConfigurationManager.Configuration.RefreshItemImages || !series.HasLocalImage(bdName)) { - try - { - series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false)); - } - catch (HttpException) - { - } - catch (IOException) - { - - } + series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false)); } bdNo++; if (bdNo >= ConfigurationManager.Configuration.MaxBackdrops) break; @@ -481,27 +434,13 @@ namespace MediaBrowser.Controller.Providers.TV } /// <summary> - /// Determines whether [has complete metadata] [the specified series]. - /// </summary> - /// <param name="series">The series.</param> - /// <returns><c>true</c> if [has complete metadata] [the specified series]; otherwise, <c>false</c>.</returns> - private bool HasCompleteMetadata(Series series) - { - return (series.HasImage(ImageType.Banner)) && (series.CommunityRating != null) - && (series.Overview != null) && (series.Name != null) && (series.People != null) - && (series.Genres != null) && (series.OfficialRating != null); - } - - /// <summary> /// Determines whether [has local meta] [the specified item]. /// </summary> /// <param name="item">The item.</param> /// <returns><c>true</c> if [has local meta] [the specified item]; otherwise, <c>false</c>.</returns> private bool HasLocalMeta(BaseItem item) { - //need at least the xml and folder.jpg/png - return item.ResolveArgs.ContainsMetaFileByName(LOCAL_META_FILE_NAME) && (item.ResolveArgs.ContainsMetaFileByName("folder.jpg") || - item.ResolveArgs.ContainsMetaFileByName("folder.png")); + return item.ResolveArgs.ContainsMetaFileByName(LOCAL_META_FILE_NAME); } /// <summary> |
