1
0
Fork 0
mirror of https://github.com/Jackett/Jackett synced 2025-02-24 23:22:46 +00:00

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
This commit is contained in:
chibidev 2017-07-01 18:23:57 +02:00 committed by kaso17
parent 11fd2db5a5
commit 91eae526f9
8 changed files with 116 additions and 32 deletions

View file

@ -369,13 +369,19 @@ namespace Jackett.Controllers
Engine.Server.Config.UpdateDisabled = updateDisabled; Engine.Server.Config.UpdateDisabled = updateDisabled;
Engine.Server.Config.UpdatePrerelease = preRelease; Engine.Server.Config.UpdatePrerelease = preRelease;
Engine.Server.Config.BasePathOverride = basePathOverride; Engine.Server.Config.BasePathOverride = basePathOverride;
Engine.Server.Config.OmdbApiKey = omdbApiKey;
Startup.BasePath = Engine.Server.BasePath(); Startup.BasePath = Engine.Server.BasePath();
Engine.Server.SaveConfig(); Engine.Server.SaveConfig();
Engine.SetLogLevel(logging ? LogLevel.Debug : LogLevel.Info); Engine.SetLogLevel(logging ? LogLevel.Debug : LogLevel.Info);
Startup.TracingEnabled = logging; 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) if (port != Engine.Server.Config.Port || external != Engine.Server.Config.AllowExternal)
{ {

View file

@ -80,21 +80,14 @@ namespace Jackett.Controllers
var year = 0; 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 // 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); var resolver = new OmdbResolver(webClient, omdbApiKey.ToNonNull());
omdbapiRequest.Encoding = Encoding.UTF8; var movie = await resolver.MovieForId(request.imdbid.ToNonNull());
var response = await webClient.GetString(omdbapiRequest); request.search = movie.Title;
if (response.Status == HttpStatusCode.OK) year = ParseUtil.CoerceInt(movie.Year);
{
JObject result = JObject.Parse(response.Content);
if (result["Title"] != null)
{
request.search = result["Title"].ToString();
year = ParseUtil.CoerceInt(result["Year"].ToString());
}
}
} }
var torznabQuery = new TorznabQuery() var torznabQuery = new TorznabQuery()

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Jackett.Models; using Jackett.Models;
using Jackett.Services; using Jackett.Services;
using Jackett.Utils;
namespace Jackett.Indexers.Meta namespace Jackett.Indexers.Meta
{ {
@ -25,6 +26,14 @@ namespace Jackett.Indexers.Meta
} }
} }
public class NoFallbackStrategyProvider : IFallbackStrategyProvider
{
public IEnumerable<IFallbackStrategy> FallbackStrategiesForQuery(TorznabQuery query)
{
return (new NoFallbackStrategy()).ToEnumerable();
}
}
public class ImdbFallbackStrategy : IFallbackStrategy public class ImdbFallbackStrategy : IFallbackStrategy
{ {
public ImdbFallbackStrategy(IImdbResolver resolver, TorznabQuery query) public ImdbFallbackStrategy(IImdbResolver resolver, TorznabQuery query)
@ -36,9 +45,8 @@ namespace Jackett.Indexers.Meta
public async Task<IEnumerable<TorznabQuery>> FallbackQueries() public async Task<IEnumerable<TorznabQuery>> FallbackQueries()
{ {
if (titles == null) { if (titles == null)
titles = await resolver.GetAllTitles(query.ImdbID); titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
}
return titles.Select(t => query.CreateFallback(t)); return titles.Select(t => query.CreateFallback(t));
} }

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Jackett.Models; using Jackett.Models;
using Jackett.Services; using Jackett.Services;
using Jackett.Utils;
namespace Jackett.Indexers.Meta namespace Jackett.Indexers.Meta
{ {
@ -48,7 +49,7 @@ namespace Jackett.Indexers.Meta
var remainingResults = results.Except(wrongResults).Except(perfectResults); 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 strippedTitles = titles.Select(t => RemoveSpecialChars(t));
var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t)); var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t));
@ -93,6 +94,14 @@ namespace Jackett.Indexers.Meta
} }
} }
public class NoResultFilterProvider : IResultFilterProvider
{
public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query)
{
return (new NoFilter()).ToEnumerable();
}
}
public class ImdbTitleResultFilterProvider : IResultFilterProvider public class ImdbTitleResultFilterProvider : IResultFilterProvider
{ {
public ImdbTitleResultFilterProvider(IImdbResolver resolver) public ImdbTitleResultFilterProvider(IImdbResolver resolver)
@ -102,12 +111,12 @@ namespace Jackett.Indexers.Meta
public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query) public IEnumerable<IResultFilter> FiltersForQuery(TorznabQuery query)
{ {
var result = new List<IResultFilter>(); IResultFilter filter = null;
if (!query.IsImdbQuery) if (!query.IsImdbQuery)
result.Add(new NoFilter()); filter = new NoFilter();
else else
result.Add(new ImdbTitleResultFilter(resolver, query)); filter = new ImdbTitleResultFilter(resolver, query);
return result; return filter.ToEnumerable();
} }
private IImdbResolver resolver; private IImdbResolver resolver;

View file

@ -376,6 +376,7 @@
<Compile Include="Indexers\Meta\Fallbacks.cs" /> <Compile Include="Indexers\Meta\Fallbacks.cs" />
<Compile Include="Indexers\Meta\ResultFilters.cs" /> <Compile Include="Indexers\Meta\ResultFilters.cs" />
<Compile Include="Services\ImdbResolver.cs" /> <Compile Include="Services\ImdbResolver.cs" />
<Compile Include="Utils\Extensions.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="App.config"> <None Include="App.config">

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
using CsQuery; using CsQuery;
using Jackett.Utils;
using Jackett.Utils.Clients; using Jackett.Utils.Clients;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -11,34 +12,35 @@ namespace Jackett.Services
{ {
public interface IImdbResolver public interface IImdbResolver
{ {
Task<IEnumerable<string>> GetAllTitles(string imdbId); Task<Movie> MovieForId(NonNull<string> imdbId);
} }
public struct Movie public struct Movie
{ {
public string Title; public string Title;
public string Year;
} }
public class OmdbResolver : IImdbResolver public class OmdbResolver : IImdbResolver
{ {
public OmdbResolver(IWebClient webClient, string omdbApiKey) public OmdbResolver(IWebClient webClient, NonNull<string> omdbApiKey)
{ {
WebClient = webClient; WebClient = webClient;
apiKey = omdbApiKey; apiKey = omdbApiKey;
} }
public async Task<IEnumerable<string>> GetAllTitles(string imdbId) public async Task<Movie> MovieForId(NonNull<string> id)
{ {
if (apiKey == null) string imdbId = id;
return new string[] { };
if (!imdbId.StartsWith("tt", StringComparison.Ordinal)) if (!imdbId.StartsWith("tt", StringComparison.Ordinal))
imdbId = "tt" + imdbId; imdbId = "tt" + imdbId;
var request = new WebRequest("http://omdbapi.com/?apikey=" + apiKey + "&i=" + imdbId); var request = new WebRequest("http://omdbapi.com/?apikey=" + apiKey + "&i=" + imdbId);
var result = await WebClient.GetString(request); var result = await WebClient.GetString(request);
var movie = JsonConvert.DeserializeObject<Movie>(result.Content); var movie = JsonConvert.DeserializeObject<Movie>(result.Content);
return new string[] { movie.Title }; return movie;
} }
private IWebClient WebClient; private IWebClient WebClient;

View file

@ -131,12 +131,23 @@ namespace Jackett.Services
public void InitAggregateIndexer() public void InitAggregateIndexer()
{ {
var imdbResolver = new OmdbResolver(container.Resolve<IWebClient>(), container.Resolve<IServerService>().Config.OmdbApiKey); var omdbApiKey = container.Resolve<IServerService>().Config.OmdbApiKey;
var imdbFallbackStrategyProvider = new ImdbFallbackStrategyProvider(imdbResolver); IFallbackStrategyProvider fallbackStrategyProvider = null;
var imdbTitleResultFilterProvider = new ImdbTitleResultFilterProvider(imdbResolver); IResultFilterProvider resultFilterProvider = null;
if (omdbApiKey != null)
{
var imdbResolver = new OmdbResolver(container.Resolve<IWebClient>(), omdbApiKey.ToNonNull());
fallbackStrategyProvider = new ImdbFallbackStrategyProvider(imdbResolver);
resultFilterProvider = new ImdbTitleResultFilterProvider(imdbResolver);
}
else
{
fallbackStrategyProvider = new NoFallbackStrategyProvider();
resultFilterProvider = new NoResultFilterProvider();
}
logger.Info("Adding aggregate indexer"); logger.Info("Adding aggregate indexer");
AggregateIndexer aggregateIndexer = new AggregateIndexer(imdbFallbackStrategyProvider, imdbTitleResultFilterProvider, this, container.Resolve<IWebClient>(), logger, container.Resolve<IProtectionService>()); AggregateIndexer aggregateIndexer = new AggregateIndexer(fallbackStrategyProvider, resultFilterProvider, this, container.Resolve<IWebClient>(), logger, container.Resolve<IProtectionService>());
this.aggregateIndexer = aggregateIndexer; this.aggregateIndexer = aggregateIndexer;
UpdateAggregateIndexer(); UpdateAggregateIndexer();
} }

View file

@ -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<T> where T : class
{
public NonNull(T val)
{
if (val == null)
new NonNullException();
Value = val;
}
public static implicit operator T(NonNull<T> n)
{
return n.Value;
}
private T Value;
}
public static class ToEnumerableExtension
{
public static IEnumerable<T> ToEnumerable<T>(this T obj)
{
return new T[] { obj };
}
}
public static class ToNonNullExtension
{
public static NonNull<T> ToNonNull<T>(this T obj) where T : class
{
return new NonNull<T>(obj);
}
}
public static class StringExtension
{
public static bool IsNullOrEmptyOrWhitespace(this string str)
{
return string.IsNullOrEmpty(str) || string.IsNullOrWhiteSpace(str);
}
}
}