diff --git a/src/Jackett/IndexerInterface.cs b/src/Jackett/IndexerInterface.cs index 7d2b0a4f6..347cd4d2f 100644 --- a/src/Jackett/IndexerInterface.cs +++ b/src/Jackett/IndexerInterface.cs @@ -33,5 +33,7 @@ namespace Jackett void LoadFromSavedConfiguration(JToken jsonConfig); Task PerformQuery(TorznabQuery query); + + Task Download(Uri link); } } diff --git a/src/Jackett/Indexers/BitMeTV.cs b/src/Jackett/Indexers/BitMeTV.cs index ef1e389dd..b9d5cbbb1 100644 --- a/src/Jackett/Indexers/BitMeTV.cs +++ b/src/Jackett/Indexers/BitMeTV.cs @@ -195,5 +195,10 @@ namespace Jackett return releases.ToArray(); }); } + + public Task Download(Uri link) + { + return client.GetByteArrayAsync(link); + } } } diff --git a/src/Jackett/Indexers/Freshon.cs b/src/Jackett/Indexers/Freshon.cs index a3885c3db..8f6f2e4df 100644 --- a/src/Jackett/Indexers/Freshon.cs +++ b/src/Jackett/Indexers/Freshon.cs @@ -135,5 +135,10 @@ namespace Jackett return releases.ToArray(); }); } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } } } diff --git a/src/Jackett/Indexers/IPTorrents.cs b/src/Jackett/Indexers/IPTorrents.cs index 89335d574..2d0f98c1a 100644 --- a/src/Jackett/Indexers/IPTorrents.cs +++ b/src/Jackett/Indexers/IPTorrents.cs @@ -131,5 +131,10 @@ namespace Jackett.Indexers return releases.ToArray(); }); } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } } } diff --git a/src/Jackett/Indexers/ThePirateBay.cs b/src/Jackett/Indexers/ThePirateBay.cs index db911b5e0..bb57a8049 100644 --- a/src/Jackett/Indexers/ThePirateBay.cs +++ b/src/Jackett/Indexers/ThePirateBay.cs @@ -204,5 +204,11 @@ namespace Jackett.Indexers return releases.ToArray(); }); } + + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } } } diff --git a/src/Jackett/Server.cs b/src/Jackett/Server.cs index baed4e1c0..1b7234c8f 100644 --- a/src/Jackett/Server.cs +++ b/src/Jackett/Server.cs @@ -84,8 +84,18 @@ namespace Jackett var reader = new StreamReader(inputStream, context.Request.ContentEncoding); var bytes = await reader.ReadToEndAsync(); - var indexerId = context.Request.Url.AbsolutePath.Replace("/api", "").TrimStart('/').ToLower(); + var indexerId = context.Request.Url.Segments[2].TrimEnd('/').ToLower(); var indexer = indexerManager.GetIndexer(indexerId); + + if (context.Request.Url.Segments.Length > 4 && context.Request.Url.Segments[3] == "download/") + { + var downloadLink = Encoding.UTF8.GetString(Convert.FromBase64String((context.Request.Url.Segments[4].TrimEnd('/')))); + var downloadBytes = await indexer.Download(new Uri(downloadLink)); + await context.Response.OutputStream.WriteAsync(downloadBytes, 0, downloadBytes.Length); + context.Response.Close(); + return; + } + var torznabQuery = TorznabQuery.FromHttpQuery(query); var severUrl = string.Format("{0}://{1}:{2}/", context.Request.Url.Scheme, context.Request.Url.Host, context.Request.Url.Port); @@ -101,6 +111,16 @@ namespace Jackett }); var releases = await indexer.PerformQuery(torznabQuery); + + // add Jackett proxy to download links... + foreach (var release in releases) + { + var originalLink = release.Link; + var encodedLink = Convert.ToBase64String(Encoding.UTF8.GetBytes(originalLink.ToString())) + "/download.torrent"; + var proxyLink = string.Format("{0}api/{1}/download/{2}", severUrl, indexerId, encodedLink); + release.Link = new Uri(proxyLink); + } + resultPage.Releases.AddRange(releases); var xml = resultPage.ToXml(new Uri(severUrl)); @@ -118,9 +138,13 @@ namespace Jackett exception = ex; } - var errorBytes = Encoding.UTF8.GetBytes(exception.Message); - await context.Response.OutputStream.WriteAsync(errorBytes, 0, errorBytes.Length); - context.Response.Close(); + try + { + var errorBytes = Encoding.UTF8.GetBytes(exception.Message); + await context.Response.OutputStream.WriteAsync(errorBytes, 0, errorBytes.Length); + context.Response.Close(); + } + catch (Exception ex) { } }