1
0
Fork 0
mirror of https://github.com/Jackett/Jackett synced 2025-02-24 15:21:06 +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.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)
{

View file

@ -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()

View file

@ -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<IFallbackStrategy> 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<IEnumerable<TorznabQuery>> 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));
}

View file

@ -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<IResultFilter> 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<IResultFilter> FiltersForQuery(TorznabQuery query)
{
var result = new List<IResultFilter>();
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;

View file

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

View file

@ -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<IEnumerable<string>> GetAllTitles(string imdbId);
Task<Movie> MovieForId(NonNull<string> 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<string> omdbApiKey)
{
WebClient = webClient;
apiKey = omdbApiKey;
}
public async Task<IEnumerable<string>> GetAllTitles(string imdbId)
public async Task<Movie> MovieForId(NonNull<string> 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<Movie>(result.Content);
return new string[] { movie.Title };
return movie;
}
private IWebClient WebClient;

View file

@ -131,12 +131,23 @@ namespace Jackett.Services
public void InitAggregateIndexer()
{
var imdbResolver = new OmdbResolver(container.Resolve<IWebClient>(), container.Resolve<IServerService>().Config.OmdbApiKey);
var imdbFallbackStrategyProvider = new ImdbFallbackStrategyProvider(imdbResolver);
var imdbTitleResultFilterProvider = new ImdbTitleResultFilterProvider(imdbResolver);
var omdbApiKey = container.Resolve<IServerService>().Config.OmdbApiKey;
IFallbackStrategyProvider fallbackStrategyProvider = null;
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");
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;
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);
}
}
}