mirror of https://github.com/Jackett/Jackett
Fix torrentless magnet links failing on the torrentpotato endpoint #157
This commit is contained in:
parent
116a9026a0
commit
1fa36925ad
|
@ -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)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue