From 9d24362695632665c160b40543204261e0446495 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 12 May 2013 19:16:46 -0400 Subject: [PATCH] support tv banner from fanart --- .../Providers/Movies/MovieDbImagesProvider.cs | 4 +- .../Providers/TV/FanArtTVProvider.cs | 88 +++++--- .../Providers/TV/RemoteSeasonProvider.cs | 192 ++++++++---------- 3 files changed, 149 insertions(+), 135 deletions(-) diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbImagesProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbImagesProvider.cs index 7aeb976bf7..2f1057033d 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbImagesProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbImagesProvider.cs @@ -270,8 +270,8 @@ namespace MediaBrowser.Controller.Providers.Movies cancellationToken.ThrowIfCancellationRequested(); - // backdrops - if (images.backdrops != null && images.backdrops.Count > 0 && ConfigurationManager.Configuration.DownloadMovieImages.Backdrops) + // backdrops - only download if earlier providers didn't find any (fanart) + if (images.backdrops != null && images.backdrops.Count > 0 && ConfigurationManager.Configuration.DownloadMovieImages.Backdrops && item.BackdropImagePaths.Count == 0) { item.BackdropImagePaths = new List(); diff --git a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs index 7b7224ef4b..33ebf62cc1 100644 --- a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; @@ -6,7 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using System; -using System.IO; using System.Threading; using System.Threading.Tasks; using System.Xml; @@ -53,43 +53,62 @@ namespace MediaBrowser.Controller.Providers.TV { return false; } - + if (!ConfigurationManager.Configuration.DownloadSeriesImages.Art && !ConfigurationManager.Configuration.DownloadSeriesImages.Logo && - !ConfigurationManager.Configuration.DownloadSeriesImages.Thumb) + !ConfigurationManager.Configuration.DownloadSeriesImages.Thumb && + !ConfigurationManager.Configuration.DownloadSeriesImages.Backdrops && + !ConfigurationManager.Configuration.DownloadSeriesImages.Banner) { return false; } + if (providerInfo.Data != GetComparisonData(item.GetProviderId(MetadataProviders.Tvdb))) + { + return true; + } + return base.NeedsRefreshInternal(item, providerInfo); } + /// + /// Gets the comparison data. + /// + /// Guid. + private Guid GetComparisonData(string id) + { + return string.IsNullOrEmpty(id) ? Guid.Empty : id.GetMD5(); + } + public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); + var status = ProviderRefreshStatus.Success; + BaseProviderInfo data; + + if (!item.ProviderData.TryGetValue(Id, out data)) + { + data = new BaseProviderInfo(); + item.ProviderData[Id] = data; + } + var series = (Series)item; string language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower(); string url = string.Format(FanArtBaseUrl, APIKey, series.GetProviderId(MetadataProviders.Tvdb)); var doc = new XmlDocument(); - try + using (var xml = await HttpClient.Get(new HttpRequestOptions { - using (var xml = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = FanArtResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + Url = url, + ResourcePool = FanArtResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - }).ConfigureAwait(false)) - { - doc.Load(xml); - } - } - catch (HttpException) + }).ConfigureAwait(false)) { + doc.Load(xml); } cancellationToken.ThrowIfCancellationRequested(); @@ -114,10 +133,7 @@ namespace MediaBrowser.Controller.Providers.TV } catch (HttpException) { - } - catch (IOException) - { - + status = ProviderRefreshStatus.CompletedWithErrors; } } } @@ -141,10 +157,7 @@ namespace MediaBrowser.Controller.Providers.TV } catch (HttpException) { - } - catch (IOException) - { - + status = ProviderRefreshStatus.CompletedWithErrors; } } } @@ -161,20 +174,37 @@ namespace MediaBrowser.Controller.Providers.TV Logger.Debug("FanArtProvider getting ThumbArt for " + series.Name); try { - series.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(series, path, THUMB_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); + series.SetImage(ImageType.Thumb, await _providerManager.DownloadAndSaveImage(series, path, THUMB_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); } catch (HttpException) { + status = ProviderRefreshStatus.CompletedWithErrors; } - catch (IOException) - { + } + } + if (ConfigurationManager.Configuration.DownloadSeriesImages.Banner && !series.ResolveArgs.ContainsMetaFileByName(BANNER_FILE)) + { + var node = doc.SelectSingleNode("//fanart/series/tbbanners/tvbanner[@lang = \"" + language + "\"]/@url") ?? + doc.SelectSingleNode("//fanart/series/tbbanners/tvbanner/@url"); + path = node != null ? node.Value : null; + if (!string.IsNullOrEmpty(path)) + { + Logger.Debug("FanArtProvider getting banner for " + series.Name); + try + { + series.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(series, path, BANNER_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); + } + catch (HttpException) + { + status = ProviderRefreshStatus.CompletedWithErrors; } } } } - SetLastRefreshed(series, DateTime.UtcNow); + data.Data = GetComparisonData(item.GetProviderId(MetadataProviders.Tvcom)); + SetLastRefreshed(series, DateTime.UtcNow, status); return true; } diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs index 211b6fec8f..b9f3c01349 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs @@ -105,8 +105,10 @@ namespace MediaBrowser.Controller.Providers.TV if (seriesId != null) { - await FetchSeasonData(season, seriesId, cancellationToken).ConfigureAwait(false); - SetLastRefreshed(item, DateTime.UtcNow); + var status = await FetchSeasonData(season, seriesId, cancellationToken).ConfigureAwait(false); + + SetLastRefreshed(item, DateTime.UtcNow, status); + return true; } Logger.Info("Season provider unable to obtain series id for {0}", item.Path); @@ -126,10 +128,8 @@ namespace MediaBrowser.Controller.Providers.TV /// The series id. /// The cancellation token. /// Task{System.Boolean}. - private async Task FetchSeasonData(Season season, string seriesId, CancellationToken cancellationToken) + private async Task FetchSeasonData(Season season, string seriesId, CancellationToken cancellationToken) { - string name = season.Name; - var seasonNumber = TVUtils.GetSeasonNumberFromPath(season.Path) ?? -1; season.IndexNumber = seasonNumber; @@ -139,151 +139,135 @@ namespace MediaBrowser.Controller.Providers.TV season.Name = "Specials"; } - if (!string.IsNullOrEmpty(seriesId)) + var status = ProviderRefreshStatus.Success; + + if (string.IsNullOrEmpty(seriesId)) + { + return status; + } + + if ((season.PrimaryImagePath == null) || (!season.HasImage(ImageType.Banner)) || (season.BackdropImagePaths == null)) { - if ((season.PrimaryImagePath == null) || (!season.HasImage(ImageType.Banner)) || (season.BackdropImagePaths == null)) + var images = new XmlDocument(); + var url = string.Format("http://www.thetvdb.com/api/" + TVUtils.TVDBApiKey + "/series/{0}/banners.xml", seriesId); + + using (var imgs = await HttpClient.Get(new HttpRequestOptions { - var images = new XmlDocument(); - var url = string.Format("http://www.thetvdb.com/api/" + TVUtils.TVDBApiKey + "/series/{0}/banners.xml", seriesId); + Url = url, + ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, + CancellationToken = cancellationToken, + EnableResponseCache = true - try + }).ConfigureAwait(false)) + { + images.Load(imgs); + } + + if (images.HasChildNodes) + { + if (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("folder")) { - using (var imgs = await HttpClient.Get(new HttpRequestOptions + var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='season'][Season='" + seasonNumber + "']"); + if (n != null) { - Url = url, - ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true + n = n.SelectSingleNode("./BannerPath"); - }).ConfigureAwait(false)) - { - images.Load(imgs); + try + { + if (n != null) + season.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false); + } + catch (HttpException) + { + status = ProviderRefreshStatus.CompletedWithErrors; + } } } - catch (HttpException) - { - } - if (images.HasChildNodes) + if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("banner"))) { - if (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("folder")) + var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='seasonwide'][Season='" + seasonNumber + "']"); + if (n != null) { - var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='season'][Season='" + seasonNumber + "']"); + n = n.SelectSingleNode("./BannerPath"); if (n != null) { - n = n.SelectSingleNode("./BannerPath"); - try { - if (n != null) - season.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false); + var bannerImagePath = + await _providerManager.DownloadAndSaveImage(season, + TVUtils.BannerUrl + n.InnerText, + "banner" + + Path.GetExtension(n.InnerText), + ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken). + ConfigureAwait(false); + + season.SetImage(ImageType.Banner, bannerImagePath); } catch (HttpException) { - } - catch (IOException) - { - + status = ProviderRefreshStatus.CompletedWithErrors; } } } + } - if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("banner"))) + if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("backdrop"))) + { + var n = images.SelectSingleNode("//Banner[BannerType='fanart'][Season='" + seasonNumber + "']"); + if (n != null) { - var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='seasonwide'][Season='" + seasonNumber + "']"); + n = n.SelectSingleNode("./BannerPath"); if (n != null) { - n = n.SelectSingleNode("./BannerPath"); - if (n != null) + try { - try - { - var bannerImagePath = - await _providerManager.DownloadAndSaveImage(season, - TVUtils.BannerUrl + n.InnerText, - "banner" + - Path.GetExtension(n.InnerText), - ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken). - ConfigureAwait(false); - - season.SetImage(ImageType.Banner, bannerImagePath); - } - catch (HttpException) - { - } - catch (IOException) - { - - } + if (season.BackdropImagePaths == null) season.BackdropImagePaths = new List(); + season.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false)); + } + catch (HttpException) + { + status = ProviderRefreshStatus.CompletedWithErrors; } } } - - if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("backdrop"))) + else if (!ConfigurationManager.Configuration.SaveLocalMeta) //if saving local - season will inherit from series { - var n = images.SelectSingleNode("//Banner[BannerType='fanart'][Season='" + seasonNumber + "']"); - if (n != null) + // not necessarily accurate but will give a different bit of art to each season + var lst = images.SelectNodes("//Banner[BannerType='fanart']"); + if (lst != null && lst.Count > 0) { + var num = seasonNumber % lst.Count; + n = lst[num]; n = n.SelectSingleNode("./BannerPath"); if (n != null) { + if (season.BackdropImagePaths == null) + season.BackdropImagePaths = new List(); + try { - if (season.BackdropImagePaths == null) season.BackdropImagePaths = new List(); - season.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false)); + season.BackdropImagePaths.Add( + await _providerManager.DownloadAndSaveImage(season, + TVUtils.BannerUrl + + n.InnerText, + "backdrop" + + Path.GetExtension( + n.InnerText), + ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken) + .ConfigureAwait(false)); } catch (HttpException) { - } - catch (IOException) - { - - } - } - } - else if (!ConfigurationManager.Configuration.SaveLocalMeta) //if saving local - season will inherit from series - { - // not necessarily accurate but will give a different bit of art to each season - var lst = images.SelectNodes("//Banner[BannerType='fanart']"); - if (lst != null && lst.Count > 0) - { - var num = seasonNumber % lst.Count; - n = lst[num]; - n = n.SelectSingleNode("./BannerPath"); - if (n != null) - { - if (season.BackdropImagePaths == null) - season.BackdropImagePaths = new List(); - - try - { - season.BackdropImagePaths.Add( - await _providerManager.DownloadAndSaveImage(season, - TVUtils.BannerUrl + - n.InnerText, - "backdrop" + - Path.GetExtension( - n.InnerText), - ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken) - .ConfigureAwait(false)); - } - catch (HttpException) - { - } - catch (IOException) - { - - } + status = ProviderRefreshStatus.CompletedWithErrors; } } } } } } - return true; } - - return false; + return status; } ///