From 1325822798804943941c3c999ecdf8af98f9cb5d Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Thu, 5 Jan 2017 10:49:55 +0100 Subject: [PATCH] Added the TMDB Configuration service. This allows Image urls to be dynamically generated! --- .../Cloud/SonarrCloudRequestBuilder.cs | 6 ++ .../SkyHook/Resource/ConfigurationResource.cs | 26 +++++++ .../MetadataSource/SkyHook/SkyHookProxy.cs | 11 ++- .../TmdbConfigurationService.cs | 77 +++++++++++++++++++ src/NzbDrone.Core/NzbDrone.Core.csproj | 2 + 5 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ConfigurationResource.cs create mode 100644 src/NzbDrone.Core/MetadataSource/TmdbConfigurationService.cs diff --git a/src/NzbDrone.Common/Cloud/SonarrCloudRequestBuilder.cs b/src/NzbDrone.Common/Cloud/SonarrCloudRequestBuilder.cs index e5347f71a..bcf03c4ee 100644 --- a/src/NzbDrone.Common/Cloud/SonarrCloudRequestBuilder.cs +++ b/src/NzbDrone.Common/Cloud/SonarrCloudRequestBuilder.cs @@ -7,6 +7,7 @@ namespace NzbDrone.Common.Cloud IHttpRequestBuilderFactory Services { get; } IHttpRequestBuilderFactory SkyHookTvdb { get; } IHttpRequestBuilderFactory TMDB { get; } + IHttpRequestBuilderFactory TMDBSingle { get; } } public class SonarrCloudRequestBuilder : ISonarrCloudRequestBuilder @@ -23,11 +24,16 @@ namespace NzbDrone.Common.Cloud TMDB = new HttpRequestBuilder("https://api.themoviedb.org/3/{route}/{id}{secondaryRoute}") .AddQueryParam("api_key", "1a7373301961d03f97f853a876dd1212") .CreateFactory(); + + TMDBSingle = new HttpRequestBuilder("https://api.themoviedb.org/3/{route}") + .AddQueryParam("api_key", "1a7373301961d03f97f853a876dd1212") + .CreateFactory(); } public IHttpRequestBuilderFactory Services { get; private set; } public IHttpRequestBuilderFactory SkyHookTvdb { get; private set; } public IHttpRequestBuilderFactory TMDB { get; private set; } + public IHttpRequestBuilderFactory TMDBSingle { get; private set; } } } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ConfigurationResource.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ConfigurationResource.cs new file mode 100644 index 000000000..808bd9ab9 --- /dev/null +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ConfigurationResource.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NzbDrone.Core.MetadataSource.SkyHook.Resource +{ + + public class ConfigResource + { + public Images images { get; set; } + public string[] change_keys { get; set; } + } + + public class Images + { + public string base_url { get; set; } + public string secure_base_url { get; set; } + public string[] backdrop_sizes { get; set; } + public string[] logo_sizes { get; set; } + public string[] poster_sizes { get; set; } + public string[] profile_sizes { get; set; } + public string[] still_sizes { get; set; } + } + +} diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index c7aaee069..e0014a728 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Http; using NzbDrone.Core.Exceptions; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MetadataSource.SkyHook.Resource; +using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Tv; using Newtonsoft.Json; @@ -21,12 +22,14 @@ namespace NzbDrone.Core.MetadataSource.SkyHook private readonly IHttpRequestBuilderFactory _requestBuilder; private readonly IHttpRequestBuilderFactory _movieBuilder; + private readonly ITmdbConfigService _configService; - public SkyHookProxy(IHttpClient httpClient, ISonarrCloudRequestBuilder requestBuilder, Logger logger) + public SkyHookProxy(IHttpClient httpClient, ISonarrCloudRequestBuilder requestBuilder, ITmdbConfigService configService, Logger logger) { _httpClient = httpClient; _requestBuilder = requestBuilder.SkyHookTvdb; _movieBuilder = requestBuilder.TMDB; + _configService = configService; _logger = logger; } @@ -89,8 +92,8 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.InCinemas = DateTime.Parse(resource.release_date); movie.Year = movie.InCinemas.Value.Year; - movie.Images.Add(new MediaCover.MediaCover(MediaCoverTypes.Poster, "http://image.tmdb.org/t/p/"+"w500"+resource.poster_path));//TODO: Update to load image specs from tmdb page! - movie.Images.Add(new MediaCover.MediaCover(MediaCoverTypes.Banner, "http://image.tmdb.org/t/p/" + "w1280" + resource.backdrop_path)); + movie.Images.Add(_configService.GetCoverForURL(resource.poster_path, MediaCoverTypes.Poster));//TODO: Update to load image specs from tmdb page! + movie.Images.Add(_configService.GetCoverForURL(resource.backdrop_path, MediaCoverTypes.Banner)); movie.Runtime = resource.runtime; foreach(Title title in resource.alternative_titles.titles) @@ -250,7 +253,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook try { string url = result.poster_path; - var imdbPoster = new MediaCover.MediaCover(MediaCoverTypes.Poster, "http://image.tmdb.org/t/p/" + "w500" + url); + var imdbPoster = _configService.GetCoverForURL(result.poster_path, MediaCoverTypes.Poster); imdbMovie.Images.Add(imdbPoster); } catch (Exception e) diff --git a/src/NzbDrone.Core/MetadataSource/TmdbConfigurationService.cs b/src/NzbDrone.Core/MetadataSource/TmdbConfigurationService.cs new file mode 100644 index 000000000..2b960f0de --- /dev/null +++ b/src/NzbDrone.Core/MetadataSource/TmdbConfigurationService.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NzbDrone.Core.MediaCover; +using NzbDrone.Common.Cache; +using NzbDrone.Common.Http; +using NzbDrone.Common.Cloud; +using NzbDrone.Core.MetadataSource.SkyHook.Resource; + +namespace NzbDrone.Core.MetadataSource +{ + public interface ITmdbConfigService + { + MediaCover.MediaCover GetCoverForURL(string url, MediaCover.MediaCoverTypes type); + } + + class TmdbConfigService : ITmdbConfigService + { + private readonly ICached _configurationCache; + private readonly IHttpClient _httpClient; + private readonly IHttpRequestBuilderFactory _tmdbBuilder; + + public TmdbConfigService(ICacheManager cacheManager, IHttpClient httpClient, ISonarrCloudRequestBuilder requestBuilder) + { + _configurationCache = cacheManager.GetCache(GetType(), "configuration_cache"); + _httpClient = httpClient; + _tmdbBuilder = requestBuilder.TMDBSingle; + } + + public MediaCover.MediaCover GetCoverForURL(string url, MediaCover.MediaCoverTypes type) + { + if (_configurationCache.Count == 0) + { + RefreshCache(); + } + + var images = _configurationCache.Find("configuration").images; + + var cover = new MediaCover.MediaCover(); + cover.CoverType = type; + + var realUrl = images.base_url; + + switch (type) + { + case MediaCoverTypes.Banner: + realUrl += images.backdrop_sizes.Last(); + break; + case MediaCoverTypes.Poster: + realUrl += images.poster_sizes.Last(); + break; + default: + realUrl += "original"; + break; + } + + realUrl += url; + + cover.Url = realUrl; + + return cover; + } + + private void RefreshCache() + { + var request = _tmdbBuilder.Create().SetSegment("route", "configuration").Build(); + + var response = _httpClient.Get(request); + + if (response.Resource.images != null) + { + _configurationCache.Set("configuration", response.Resource); + } + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 89ed34e9f..286f569bc 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -805,6 +805,7 @@ + @@ -837,6 +838,7 @@ +