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:
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.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)
|
||||
{
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
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