From 4c971ed1615c2a1f5a88e4f160672718fe24f1b4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 18 May 2013 14:16:07 -0400 Subject: [PATCH] fixes #281 - Metadata images incomplete --- .../ImageFromMediaLocationProvider.cs | 7 +- .../Providers/TV/RemoteEpisodeProvider.cs | 50 +++--- .../Providers/TV/RemoteSeriesProvider.cs | 157 ++++++------------ 3 files changed, 71 insertions(+), 143 deletions(-) diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 3e8501dfaf..6e14682ddc 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 2b4173ed90..b6852e9ba1 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs @@ -46,11 +46,11 @@ namespace MediaBrowser.Controller.Providers.TV /// /// The episode query /// - 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"; /// /// The abs episode query /// - 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"; /// /// 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 eb689ed2f7..39fe4f2c67 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); } /// @@ -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 /// The series id. /// The cancellation token. /// Task{System.Boolean}. - private async Task FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken) + private async Task 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; } /// @@ -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; @@ -480,18 +433,6 @@ namespace MediaBrowser.Controller.Providers.TV } } - /// - /// Determines whether [has complete metadata] [the specified series]. - /// - /// The series. - /// true if [has complete metadata] [the specified series]; otherwise, false. - 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); - } - /// /// Determines whether [has local meta] [the specified item]. /// @@ -499,9 +440,7 @@ namespace MediaBrowser.Controller.Providers.TV /// true if [has local meta] [the specified item]; otherwise, false. 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); } ///