Fix torrentless magnet links failing on the torrentpotato endpoint #157

This commit is contained in:
KZ 2015-08-26 19:38:50 +01:00
parent 116a9026a0
commit 1fa36925ad
1 changed files with 167 additions and 163 deletions

View File

@ -1,163 +1,167 @@
using AutoMapper; using AutoMapper;
using Jackett.Models; using Jackett.Models;
using Jackett.Services; using Jackett.Services;
using Jackett.Utils; using Jackett.Utils;
using Jackett.Utils.Clients; using Jackett.Utils.Clients;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog; using NLog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
using System.Web.Http; using System.Web.Http;
namespace Jackett.Controllers namespace Jackett.Controllers
{ {
[AllowAnonymous] [AllowAnonymous]
[JackettAPINoCache] [JackettAPINoCache]
public class PotatoController : ApiController public class PotatoController : ApiController
{ {
private IIndexerManagerService indexerService; private IIndexerManagerService indexerService;
private Logger logger; private Logger logger;
private IServerService serverService; private IServerService serverService;
private ICacheService cacheService; private ICacheService cacheService;
private IWebClient webClient; private IWebClient webClient;
public static int[] MOVIE_CATS public static int[] MOVIE_CATS
{ {
get get
{ {
var torznabQuery = new TorznabQuery() var torznabQuery = new TorznabQuery()
{ {
Categories = new int[1] { TorznabCatType.Movies.ID }, Categories = new int[1] { TorznabCatType.Movies.ID },
}; };
torznabQuery.ExpandCatsToSubCats(); torznabQuery.ExpandCatsToSubCats();
return torznabQuery.Categories; return torznabQuery.Categories;
} }
} }
public PotatoController(IIndexerManagerService i, Logger l, IServerService s, ICacheService c, IWebClient w) public PotatoController(IIndexerManagerService i, Logger l, IServerService s, ICacheService c, IWebClient w)
{ {
indexerService = i; indexerService = i;
logger = l; logger = l;
serverService = s; serverService = s;
cacheService = c; cacheService = c;
webClient = w; webClient = w;
} }
[HttpGet] [HttpGet]
public async Task<HttpResponseMessage> Call(string indexerID, [FromUri]TorrentPotatoRequest request) public async Task<HttpResponseMessage> Call(string indexerID, [FromUri]TorrentPotatoRequest request)
{ {
var indexer = indexerService.GetIndexer(indexerID); var indexer = indexerService.GetIndexer(indexerID);
var allowBadApiDueToDebug = false; var allowBadApiDueToDebug = false;
#if DEBUG #if DEBUG
allowBadApiDueToDebug = Debugger.IsAttached; allowBadApiDueToDebug = Debugger.IsAttached;
#endif #endif
if (!allowBadApiDueToDebug && !string.Equals(request.passkey, serverService.Config.APIKey, StringComparison.InvariantCultureIgnoreCase)) if (!allowBadApiDueToDebug && !string.Equals(request.passkey, serverService.Config.APIKey, StringComparison.InvariantCultureIgnoreCase))
{ {
logger.Warn(string.Format("A request from {0} was made with an incorrect API key.", Request.GetOwinContext().Request.RemoteIpAddress)); logger.Warn(string.Format("A request from {0} was made with an incorrect API key.", Request.GetOwinContext().Request.RemoteIpAddress));
return Request.CreateResponse(HttpStatusCode.Forbidden, "Incorrect API key"); return Request.CreateResponse(HttpStatusCode.Forbidden, "Incorrect API key");
} }
if (!indexer.IsConfigured) if (!indexer.IsConfigured)
{ {
logger.Warn(string.Format("Rejected a request to {0} which is unconfigured.", indexer.DisplayName)); logger.Warn(string.Format("Rejected a request to {0} which is unconfigured.", indexer.DisplayName));
return Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer is not configured."); return Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer is not configured.");
} }
if (!indexer.TorznabCaps.Categories.Select(c => c.ID).Any(i => MOVIE_CATS.Contains(i))){ if (!indexer.TorznabCaps.Categories.Select(c => c.ID).Any(i => MOVIE_CATS.Contains(i))){
logger.Warn(string.Format("Rejected a request to {0} which does not support searching for movies.", indexer.DisplayName)); logger.Warn(string.Format("Rejected a request to {0} which does not support searching for movies.", indexer.DisplayName));
return Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer does not support movies."); return Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer does not support movies.");
} }
var year = 0; var year = 0;
if (string.IsNullOrWhiteSpace(request.search)) if (string.IsNullOrWhiteSpace(request.search))
{ {
// We are searching by IMDB id so look up the name // We are searching by IMDB id so look up the name
var response = await webClient.GetString(new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid)); var response = await webClient.GetString(new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid));
if (response.Status == HttpStatusCode.OK) if (response.Status == HttpStatusCode.OK)
{ {
JObject result = JObject.Parse(response.Content); JObject result = JObject.Parse(response.Content);
if (result["Title"] != null) if (result["Title"] != null)
{ {
request.search = result["Title"].ToString(); request.search = result["Title"].ToString();
year = ParseUtil.CoerceInt(result["Year"].ToString()); year = ParseUtil.CoerceInt(result["Year"].ToString());
} }
} }
} }
var torznabQuery = new TorznabQuery() var torznabQuery = new TorznabQuery()
{ {
ApiKey = request.passkey, ApiKey = request.passkey,
Categories = MOVIE_CATS, Categories = MOVIE_CATS,
SearchTerm = request.search SearchTerm = request.search
}; };
IEnumerable<ReleaseInfo> releases = new List<ReleaseInfo>(); IEnumerable<ReleaseInfo> releases = new List<ReleaseInfo>();
if (!string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) if (!string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm))
{ {
releases = await indexer.PerformQuery(torznabQuery); releases = await indexer.PerformQuery(torznabQuery);
releases = indexer.CleanLinks(releases); releases = indexer.CleanLinks(releases);
} }
// Cache non query results // Cache non query results
if (string.IsNullOrEmpty(torznabQuery.SanitizedSearchTerm)) if (string.IsNullOrEmpty(torznabQuery.SanitizedSearchTerm))
{ {
cacheService.CacheRssResults(indexer, releases); cacheService.CacheRssResults(indexer, releases);
} }
releases = indexer.FilterResults(torznabQuery, releases); releases = indexer.FilterResults(torznabQuery, releases);
var serverUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port); var serverUrl = string.Format("{0}://{1}:{2}/", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port);
var potatoResponse = new TorrentPotatoResponse(); var potatoResponse = new TorrentPotatoResponse();
releases = TorznabUtil.FilterResultsToTitle(releases, torznabQuery.SanitizedSearchTerm, year); releases = TorznabUtil.FilterResultsToTitle(releases, torznabQuery.SanitizedSearchTerm, year);
releases = TorznabUtil.FilterResultsToImdb(releases, request.imdbid); releases = TorznabUtil.FilterResultsToImdb(releases, request.imdbid);
foreach (var r in releases) foreach (var r in releases)
{ {
var release = Mapper.Map<ReleaseInfo>(r); var release = Mapper.Map<ReleaseInfo>(r);
release.Link = serverService.ConvertToProxyLink(release.Link, serverUrl, indexerID); release.Link = serverService.ConvertToProxyLink(release.Link, serverUrl, indexerID);
potatoResponse.results.Add(new TorrentPotatoResponseItem() // Only accept torrent links, magnet is not supported
{ if (release.Link != null)
release_name = release.Title + "[" + indexer.DisplayName + "]", // Suffix the indexer so we can see which tracker we are using in CPS as it just says torrentpotato >.> {
torrent_id = release.Guid.ToString(), potatoResponse.results.Add(new TorrentPotatoResponseItem()
details_url = release.Comments.ToString(), {
download_url = release.Link.ToString(), release_name = release.Title + "[" + indexer.DisplayName + "]", // Suffix the indexer so we can see which tracker we are using in CPS as it just says torrentpotato >.>
imdb_id = release.Imdb.HasValue ? "tt" + release.Imdb : null, torrent_id = release.Guid.ToString(),
freeleech = false, details_url = release.Comments.ToString(),
type = "movie", download_url = release.Link.ToString(),
size = (long)release.Size/ (1024 * 1024), // This is in MB imdb_id = release.Imdb.HasValue ? "tt" + release.Imdb : null,
leechers = (int)release.Peers - (int)release.Seeders, freeleech = false,
seeders = (int)release.Seeders type = "movie",
}); size = (long)release.Size / (1024 * 1024), // This is in MB
} leechers = (int)release.Peers - (int)release.Seeders,
seeders = (int)release.Seeders
// Log info });
if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm)) }
{ }
logger.Info(string.Format("Found {0} torrentpotato releases from {1}", releases.Count(), indexer.DisplayName));
} // Log info
else if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm))
{ {
logger.Info(string.Format("Found {0} torrentpotato releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.GetQueryString())); logger.Info(string.Format("Found {0} torrentpotato releases from {1}", releases.Count(), indexer.DisplayName));
} }
else
// Force the return as Json {
return new HttpResponseMessage() logger.Info(string.Format("Found {0} torrentpotato releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.GetQueryString()));
{ }
Content = new JsonContent(potatoResponse)
}; // Force the return as Json
} return new HttpResponseMessage()
} {
} Content = new JsonContent(potatoResponse)
};
}
}
}