From 91eae526f963708f12423302955f545a70329480 Mon Sep 17 00:00:00 2001 From: chibidev Date: Sat, 1 Jul 2017 18:23:57 +0200 Subject: [PATCH] Bugfix/1404 fix potato search (#1516) * Line endings... * Integrating OMDB into Potato results Now PotatoController will actually produce results * VS complains it could be simplified, yet AppVeyor cannot do anything with it... * How come only Appveyor unveils this error? @drunkvs --- src/Jackett/Controllers/AdminController.cs | 8 ++- src/Jackett/Controllers/PotatoController.cs | 19 +++---- src/Jackett/Indexers/Meta/Fallbacks.cs | 14 +++-- src/Jackett/Indexers/Meta/ResultFilters.cs | 19 +++++-- src/Jackett/Jackett.csproj | 1 + src/Jackett/Services/ImdbResolver.cs | 14 ++--- src/Jackett/Services/IndexerManagerService.cs | 19 +++++-- src/Jackett/Utils/Extensions.cs | 54 +++++++++++++++++++ 8 files changed, 116 insertions(+), 32 deletions(-) create mode 100644 src/Jackett/Utils/Extensions.cs diff --git a/src/Jackett/Controllers/AdminController.cs b/src/Jackett/Controllers/AdminController.cs index 9524cfdc2..81458b600 100644 --- a/src/Jackett/Controllers/AdminController.cs +++ b/src/Jackett/Controllers/AdminController.cs @@ -369,13 +369,19 @@ namespace Jackett.Controllers Engine.Server.Config.UpdateDisabled = updateDisabled; Engine.Server.Config.UpdatePrerelease = preRelease; Engine.Server.Config.BasePathOverride = basePathOverride; - Engine.Server.Config.OmdbApiKey = omdbApiKey; Startup.BasePath = Engine.Server.BasePath(); Engine.Server.SaveConfig(); Engine.SetLogLevel(logging ? LogLevel.Debug : LogLevel.Info); Startup.TracingEnabled = logging; + if (omdbApiKey != Engine.Server.Config.OmdbApiKey) + { + Engine.Server.Config.OmdbApiKey = omdbApiKey; + // HACK + indexerService.InitAggregateIndexer(); + } + if (port != Engine.Server.Config.Port || external != Engine.Server.Config.AllowExternal) { diff --git a/src/Jackett/Controllers/PotatoController.cs b/src/Jackett/Controllers/PotatoController.cs index ac266a795..d93a249fe 100644 --- a/src/Jackett/Controllers/PotatoController.cs +++ b/src/Jackett/Controllers/PotatoController.cs @@ -80,21 +80,14 @@ namespace Jackett.Controllers var year = 0; - if (string.IsNullOrWhiteSpace(request.search)) + var omdbApiKey = serverService.Config.OmdbApiKey; + if (!request.imdbid.IsNullOrEmptyOrWhitespace() && !omdbApiKey.IsNullOrEmptyOrWhitespace()) { // We are searching by IMDB id so look up the name - var omdbapiRequest = new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid); - omdbapiRequest.Encoding = Encoding.UTF8; - var response = await webClient.GetString(omdbapiRequest); - if (response.Status == HttpStatusCode.OK) - { - JObject result = JObject.Parse(response.Content); - if (result["Title"] != null) - { - request.search = result["Title"].ToString(); - year = ParseUtil.CoerceInt(result["Year"].ToString()); - } - } + var resolver = new OmdbResolver(webClient, omdbApiKey.ToNonNull()); + var movie = await resolver.MovieForId(request.imdbid.ToNonNull()); + request.search = movie.Title; + year = ParseUtil.CoerceInt(movie.Year); } var torznabQuery = new TorznabQuery() diff --git a/src/Jackett/Indexers/Meta/Fallbacks.cs b/src/Jackett/Indexers/Meta/Fallbacks.cs index f4ca8edab..f7b5e4fb2 100644 --- a/src/Jackett/Indexers/Meta/Fallbacks.cs +++ b/src/Jackett/Indexers/Meta/Fallbacks.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Jackett.Models; using Jackett.Services; +using Jackett.Utils; namespace Jackett.Indexers.Meta { @@ -25,6 +26,14 @@ namespace Jackett.Indexers.Meta } } + public class NoFallbackStrategyProvider : IFallbackStrategyProvider + { + public IEnumerable FallbackStrategiesForQuery(TorznabQuery query) + { + return (new NoFallbackStrategy()).ToEnumerable(); + } + } + public class ImdbFallbackStrategy : IFallbackStrategy { public ImdbFallbackStrategy(IImdbResolver resolver, TorznabQuery query) @@ -36,9 +45,8 @@ namespace Jackett.Indexers.Meta public async Task> FallbackQueries() { - if (titles == null) { - titles = await resolver.GetAllTitles(query.ImdbID); - } + if (titles == null) + titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable(); return titles.Select(t => query.CreateFallback(t)); } diff --git a/src/Jackett/Indexers/Meta/ResultFilters.cs b/src/Jackett/Indexers/Meta/ResultFilters.cs index f8862c743..90a0a3b53 100644 --- a/src/Jackett/Indexers/Meta/ResultFilters.cs +++ b/src/Jackett/Indexers/Meta/ResultFilters.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Jackett.Models; using Jackett.Services; +using Jackett.Utils; namespace Jackett.Indexers.Meta { @@ -48,7 +49,7 @@ namespace Jackett.Indexers.Meta var remainingResults = results.Except(wrongResults).Except(perfectResults); - var titles = await resolver.GetAllTitles(query.ImdbID); + var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable(); var strippedTitles = titles.Select(t => RemoveSpecialChars(t)); var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t)); @@ -93,6 +94,14 @@ namespace Jackett.Indexers.Meta } } + public class NoResultFilterProvider : IResultFilterProvider + { + public IEnumerable FiltersForQuery(TorznabQuery query) + { + return (new NoFilter()).ToEnumerable(); + } + } + public class ImdbTitleResultFilterProvider : IResultFilterProvider { public ImdbTitleResultFilterProvider(IImdbResolver resolver) @@ -102,12 +111,12 @@ namespace Jackett.Indexers.Meta public IEnumerable FiltersForQuery(TorznabQuery query) { - var result = new List(); + IResultFilter filter = null; if (!query.IsImdbQuery) - result.Add(new NoFilter()); + filter = new NoFilter(); else - result.Add(new ImdbTitleResultFilter(resolver, query)); - return result; + filter = new ImdbTitleResultFilter(resolver, query); + return filter.ToEnumerable(); } private IImdbResolver resolver; diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 718c71ef2..a6c03b671 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -376,6 +376,7 @@ + diff --git a/src/Jackett/Services/ImdbResolver.cs b/src/Jackett/Services/ImdbResolver.cs index 845eeaf0c..715ed6a36 100644 --- a/src/Jackett/Services/ImdbResolver.cs +++ b/src/Jackett/Services/ImdbResolver.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using System.Web; using CsQuery; +using Jackett.Utils; using Jackett.Utils.Clients; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -11,34 +12,35 @@ namespace Jackett.Services { public interface IImdbResolver { - Task> GetAllTitles(string imdbId); + Task MovieForId(NonNull imdbId); } public struct Movie { public string Title; + public string Year; } public class OmdbResolver : IImdbResolver { - public OmdbResolver(IWebClient webClient, string omdbApiKey) + public OmdbResolver(IWebClient webClient, NonNull omdbApiKey) { WebClient = webClient; apiKey = omdbApiKey; } - public async Task> GetAllTitles(string imdbId) + public async Task MovieForId(NonNull id) { - if (apiKey == null) - return new string[] { }; + string imdbId = id; if (!imdbId.StartsWith("tt", StringComparison.Ordinal)) imdbId = "tt" + imdbId; + var request = new WebRequest("http://omdbapi.com/?apikey=" + apiKey + "&i=" + imdbId); var result = await WebClient.GetString(request); var movie = JsonConvert.DeserializeObject(result.Content); - return new string[] { movie.Title }; + return movie; } private IWebClient WebClient; diff --git a/src/Jackett/Services/IndexerManagerService.cs b/src/Jackett/Services/IndexerManagerService.cs index d5abb24de..6c1e011fd 100644 --- a/src/Jackett/Services/IndexerManagerService.cs +++ b/src/Jackett/Services/IndexerManagerService.cs @@ -131,12 +131,23 @@ namespace Jackett.Services public void InitAggregateIndexer() { - var imdbResolver = new OmdbResolver(container.Resolve(), container.Resolve().Config.OmdbApiKey); - var imdbFallbackStrategyProvider = new ImdbFallbackStrategyProvider(imdbResolver); - var imdbTitleResultFilterProvider = new ImdbTitleResultFilterProvider(imdbResolver); + var omdbApiKey = container.Resolve().Config.OmdbApiKey; + IFallbackStrategyProvider fallbackStrategyProvider = null; + IResultFilterProvider resultFilterProvider = null; + if (omdbApiKey != null) + { + var imdbResolver = new OmdbResolver(container.Resolve(), omdbApiKey.ToNonNull()); + fallbackStrategyProvider = new ImdbFallbackStrategyProvider(imdbResolver); + resultFilterProvider = new ImdbTitleResultFilterProvider(imdbResolver); + } + else + { + fallbackStrategyProvider = new NoFallbackStrategyProvider(); + resultFilterProvider = new NoResultFilterProvider(); + } logger.Info("Adding aggregate indexer"); - AggregateIndexer aggregateIndexer = new AggregateIndexer(imdbFallbackStrategyProvider, imdbTitleResultFilterProvider, this, container.Resolve(), logger, container.Resolve()); + AggregateIndexer aggregateIndexer = new AggregateIndexer(fallbackStrategyProvider, resultFilterProvider, this, container.Resolve(), logger, container.Resolve()); this.aggregateIndexer = aggregateIndexer; UpdateAggregateIndexer(); } diff --git a/src/Jackett/Utils/Extensions.cs b/src/Jackett/Utils/Extensions.cs new file mode 100644 index 000000000..38bf6af37 --- /dev/null +++ b/src/Jackett/Utils/Extensions.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace Jackett.Utils +{ + public class NonNullException : Exception + { + public NonNullException() : base("Parameter cannot be null") + { + } + } + + public class NonNull where T : class + { + public NonNull(T val) + { + if (val == null) + new NonNullException(); + + Value = val; + } + + public static implicit operator T(NonNull n) + { + return n.Value; + } + + private T Value; + } + + public static class ToEnumerableExtension + { + public static IEnumerable ToEnumerable(this T obj) + { + return new T[] { obj }; + } + } + + public static class ToNonNullExtension + { + public static NonNull ToNonNull(this T obj) where T : class + { + return new NonNull(obj); + } + } + + public static class StringExtension + { + public static bool IsNullOrEmptyOrWhitespace(this string str) + { + return string.IsNullOrEmpty(str) || string.IsNullOrWhiteSpace(str); + } + } +}