Changed download urls

I changed the download urls, because the current way with segments
(having the parameters between slashes) was causing problems with long
encoded urls, since a segment can be no longer than 255 characters. It
was changed to use regular url parameters which have no such limit on
length.
This commit is contained in:
René Simonsen
2015-10-26 10:20:14 +01:00
parent e56875f1a3
commit 4392219158
8 changed files with 42 additions and 13 deletions

View File

@@ -425,7 +425,7 @@ namespace Jackett.Controllers
foreach (var result in results) foreach (var result in results)
{ {
var link = result.Link; var link = result.Link;
result.Link = serverService.ConvertToProxyLink(link, serverUrl, result.TrackerId); result.Link = serverService.ConvertToProxyLink(link, serverUrl, result.TrackerId, "dl", result.Title + ".torrent");
if (result.Link != null && result.Link.Scheme != "magnet" && !string.IsNullOrWhiteSpace(Engine.Server.Config.BlackholeDir)) if (result.Link != null && result.Link.Scheme != "magnet" && !string.IsNullOrWhiteSpace(Engine.Server.Config.BlackholeDir))
result.BlackholeLink = serverService.ConvertToProxyLink(link, serverUrl, result.TrackerId, "bh", string.Empty); result.BlackholeLink = serverService.ConvertToProxyLink(link, serverUrl, result.TrackerId, "bh", string.Empty);

View File

@@ -29,7 +29,7 @@ namespace Jackett.Controllers
} }
[HttpGet] [HttpGet]
public async Task<HttpResponseMessage> Download(string indexerID, string path, string apikey) public async Task<HttpResponseMessage> Download(string indexerID, string path, string apikey, string file)
{ {
try try
{ {
@@ -54,6 +54,10 @@ namespace Jackett.Controllers
var result = new HttpResponseMessage(HttpStatusCode.OK); var result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(downloadBytes); result.Content = new ByteArrayContent(downloadBytes);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-bittorrent"); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-bittorrent");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = file
};
return result; return result;
} }
catch (Exception e) catch (Exception e)

View File

@@ -126,7 +126,7 @@ namespace Jackett.Controllers
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, "dl", release.Title + ".torrent");
// Only accept torrent links, magnet is not supported // Only accept torrent links, magnet is not supported
if (release.Link != null) if (release.Link != null)

View File

@@ -116,7 +116,7 @@ namespace Jackett.Controllers
foreach(var result in releases) foreach(var result in releases)
{ {
var clone = Mapper.Map<ReleaseInfo>(result); var clone = Mapper.Map<ReleaseInfo>(result);
clone.Link = serverService.ConvertToProxyLink(clone.Link, serverUrl, indexerID); clone.Link = serverService.ConvertToProxyLink(clone.Link, serverUrl, indexerID, "dl", result.Title + ".torrent");
resultPage.Releases.Add(clone); resultPage.Releases.Add(clone);
} }

View File

@@ -168,6 +168,27 @@ namespace Jackett.Indexers
episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type="; episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type=";
} }
var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
if (string.IsNullOrEmpty(results.Content))
{
CookieHeader = string.Empty;
var pairs = new Dictionary<string, string>
{
{"username", configData.Username.Value},
{"password", configData.Password.Value},
{"langlang", null},
{"login", "login"}
};
var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, CookieHeader, true, null, LoginUrl);
await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("logout.php"), () =>
{
CQ dom = response.Content;
var messageEl = dom["#loginform .warning"];
var errorMessage = messageEl.Text().Trim();
throw new ExceptionWithConfigData(errorMessage, configData);
});
results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
}
try try
{ {
CQ dom = results.Content; CQ dom = results.Content;
@@ -206,14 +227,17 @@ namespace Jackett.Indexers
else else
continue; continue;
var dlUrlAnchor = qRow.Find("span.right a").FirstElement();
var dlUrl = dlUrlAnchor.GetAttribute("href");
release.Link = new Uri(SiteLink + dlUrl);
var titleAnchor = qRow.Find("div.croptorrenttext a").FirstElement(); var titleAnchor = qRow.Find("div.croptorrenttext a").FirstElement();
var title = titleAnchor.GetAttribute("title"); var title = titleAnchor.GetAttribute("title");
release.Title = title; release.Title = title;
var dlUrlAnchor = qRow.Find("span.right a").FirstElement();
var dlUrl = dlUrlAnchor.GetAttribute("href");
var authkey = Regex.Match(dlUrl, "authkey=(?<authkey>[0-9a-zA-Z]+)").Groups["authkey"].Value;
var torrentPass = Regex.Match(dlUrl, "torrent_pass=(?<torrent_pass>[0-9a-zA-Z]+)").Groups["torrent_pass"].Value;
var torrentId = Regex.Match(dlUrl, "id=(?<id>[0-9]+)").Groups["id"].Value;
release.Link = new Uri($"{SearchUrl}/{title}.torrent/?action=download&authkey={authkey}&torrent_pass={torrentPass}&id={torrentId}");
var torrentLink = titleAnchor.GetAttribute("href"); var torrentLink = titleAnchor.GetAttribute("href");
release.Guid = new Uri(SiteLink + torrentLink); release.Guid = new Uri(SiteLink + torrentLink);
release.Comments = new Uri(SearchUrl + torrentLink); release.Comments = new Uri(SearchUrl + torrentLink);

View File

@@ -438,6 +438,7 @@
<Content Include="Content\logos\broadcastthenet.png"> <Content Include="Content\logos\broadcastthenet.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="Content\logos\danishbits.PNG" />
<Content Include="Content\logos\demonoid.png"> <Content Include="Content\logos\demonoid.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>

View File

@@ -32,7 +32,7 @@ namespace Jackett.Services
void ReserveUrls(bool doInstall = true); void ReserveUrls(bool doInstall = true);
ServerConfig Config { get; } ServerConfig Config { get; }
void SaveConfig(); void SaveConfig();
Uri ConvertToProxyLink(Uri link, string serverUrl, string indexerId, string action = "dl", string file = "/t.torrent"); Uri ConvertToProxyLink(Uri link, string serverUrl, string indexerId, string action = "dl", string file = "t.torrent");
} }
public class ServerService : IServerService public class ServerService : IServerService
@@ -65,13 +65,13 @@ namespace Jackett.Services
get { return config; } get { return config; }
} }
public Uri ConvertToProxyLink(Uri link, string serverUrl, string indexerId, string action = "dl", string file = "/t.torrent") public Uri ConvertToProxyLink(Uri link, string serverUrl, string indexerId, string action = "dl", string file = "t.torrent")
{ {
if (link == null || (link.IsAbsoluteUri && link.Scheme == "magnet")) if (link == null || (link.IsAbsoluteUri && link.Scheme == "magnet"))
return link; return link;
var encodedLink = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(link.ToString())) + file; var encodedLink = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(link.ToString()));
var proxyLink = string.Format("{0}{1}/{2}/{3}/{4}", serverUrl, action, indexerId, config.APIKey, encodedLink); var proxyLink = string.Format("{0}{1}/{2}/{3}?path={4}&file={5}", serverUrl, action, indexerId, config.APIKey, encodedLink, file);
return new Uri(proxyLink); return new Uri(proxyLink);
} }

View File

@@ -111,7 +111,7 @@ namespace Jackett
config.Routes.MapHttpRoute( config.Routes.MapHttpRoute(
name: "download", name: "download",
routeTemplate: "dl/{indexerID}/{apikey}/{path}/t.torrent", routeTemplate: "dl/{indexerID}/{apiKey}",
defaults: new { controller = "Download", action = "Download" } defaults: new { controller = "Download", action = "Download" }
); );