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:
parent
11fd2db5a5
commit
91eae526f9
8 changed files with 116 additions and 32 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
54
src/Jackett/Utils/Extensions.cs
Normal file
54
src/Jackett/Utils/Extensions.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue