From 4552e7c1dc25d804ab62bbaaa73bed89020d8e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Fri, 23 Oct 2015 19:56:44 +0200 Subject: [PATCH 01/10] Option for only danish categories to NextGen Added an option to the config of NextGen, so that it only returns categories with danish content (DK subs or voice). --- src/Jackett/Indexers/NxtGn.cs | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 899014885..5d7facb06 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -17,6 +17,7 @@ using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.UI.WebControls; +using CsQuery.ExtensionMethods; using Jackett.Models.IndexerConfig; namespace Jackett.Indexers @@ -27,9 +28,9 @@ namespace Jackett.Indexers private string SearchUrl { get { return SiteLink + "browse.php"; } } private string ProfileUrl { get { return SiteLink + "my.php"; } } - new ConfigurationDataBasicLoginWithRSS configData + new NxtGnConfigurationData configData { - get { return (ConfigurationDataBasicLoginWithRSS)base.configData; } + get { return (NxtGnConfigurationData)base.configData; } set { base.configData = value; } } @@ -42,7 +43,7 @@ namespace Jackett.Indexers client: c, logger: l, p: ps, - configData: new ConfigurationDataBasicLoginWithRSS()) + configData: new NxtGnConfigurationData()) { //Movies Mapping AddCategoryMapping(9, TorznabCatType.MoviesHD); @@ -155,8 +156,17 @@ namespace Jackett.Indexers var qLink = qRow.Find("#torrent-udgivelse2-users > a").First(); var qDesc = qRow.Find("#torrent-udgivelse2-users > p").FirstOrDefault(); - var moviesCats = new[] { 47, 38, 5, 23, 22, 33, 17, 9 }; - var seriesCats = new[] { 4, 21, 24, 26, 31, 43, 45, 46 }; + + var moviesCatsDanish = new[] { 38, 23, 22, 33, 17 }; + var moviesCatsIntl = new[] { 47, 5, 9 }; + var moviesCats = configData.OnlyDanishCategories.Value + ? moviesCatsDanish + : moviesCatsDanish.Concat(moviesCatsIntl); + var seriesCatsDanish = new[] {26, 43, 46}; + var seriesCatsIntl = new[] { 4, 21, 24, 31, 45 }; + var seriesCats = configData.OnlyDanishCategories.Value + ? seriesCatsDanish + : seriesCatsDanish.Concat(seriesCatsIntl); var catUrl = qRow.Find(".torrent-icon > a").Attr("href"); var cat = catUrl.Substring(catUrl.LastIndexOf('=') + 1); var catNo = int.Parse(cat); @@ -219,5 +229,20 @@ namespace Jackett.Indexers } return releases; } + + public class NxtGnConfigurationData : ConfigurationData + { + public NxtGnConfigurationData() + { + Username = new StringItem { Name = "Username" }; + Password = new StringItem { Name = "Password" }; + RSSKey = new HiddenItem { Name = "RSSKey" }; + OnlyDanishCategories = new BoolItem { Name = "Only Danish Categories" }; + } + public StringItem Username { get; private set; } + public StringItem Password { get; private set; } + public HiddenItem RSSKey { get; private set; } + public BoolItem OnlyDanishCategories { get; private set; } + } } } From 10e81d15d2672a709728ed506f876cf5f0cb5009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Fri, 23 Oct 2015 20:04:08 +0200 Subject: [PATCH 02/10] NextGen danish only continued Additions to the change from last commit that was forgotten before. --- src/Jackett/Indexers/NxtGn.cs | 45 ++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 5d7facb06..8edf2eef3 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -46,47 +46,54 @@ namespace Jackett.Indexers configData: new NxtGnConfigurationData()) { //Movies Mapping - AddCategoryMapping(9, TorznabCatType.MoviesHD); - AddCategoryMapping(9, TorznabCatType.Movies); - AddCategoryMapping(9, TorznabCatType.MoviesBluRay); - AddCategoryMapping(47, TorznabCatType.Movies3D); + AddCategoryMapping(38, TorznabCatType.MoviesHD); AddCategoryMapping(38, TorznabCatType.MoviesWEBDL); AddCategoryMapping(38, TorznabCatType.MoviesBluRay); - AddCategoryMapping(5, TorznabCatType.MoviesSD); AddCategoryMapping(23, TorznabCatType.MoviesForeign); AddCategoryMapping(22, TorznabCatType.MoviesSD); AddCategoryMapping(33, TorznabCatType.MoviesHD); AddCategoryMapping(33, TorznabCatType.Movies); AddCategoryMapping(17, TorznabCatType.MoviesForeign); AddCategoryMapping(17, TorznabCatType.MoviesDVD); + if (!configData.OnlyDanishCategories.Value) + { + AddCategoryMapping(9, TorznabCatType.MoviesHD); + AddCategoryMapping(9, TorznabCatType.Movies); + AddCategoryMapping(9, TorznabCatType.MoviesBluRay); + AddCategoryMapping(47, TorznabCatType.Movies3D); + AddCategoryMapping(5, TorznabCatType.MoviesSD); + } //TV Mapping - //Category 4: TV (Working) - AddCategoryMapping(4, TorznabCatType.TVSD); - AddCategoryMapping(4, TorznabCatType.TV); - AddCategoryMapping(4, TorznabCatType.TVHD); - //Category 21: Boxset/SD (Working) - AddCategoryMapping(21, TorznabCatType.TVFOREIGN); - //Category 24: Boxsets/TV (Working) - AddCategoryMapping(24, TorznabCatType.TVFOREIGN); //Category 26: NG Serier WEB-DL (Working) AddCategoryMapping(26, TorznabCatType.TVHD); AddCategoryMapping(26, TorznabCatType.TV); AddCategoryMapping(26, TorznabCatType.TVWEBDL); - //Category 31: TVHD (Working) - AddCategoryMapping(31, TorznabCatType.TVHD); - AddCategoryMapping(31, TorznabCatType.TV); //Category 43: NG WWW HD (Working) AddCategoryMapping(43, TorznabCatType.TVHD); AddCategoryMapping(43, TorznabCatType.TV); AddCategoryMapping(43, TorznabCatType.TVWEBDL); - //Category 45: TV-Misc (Working) - AddCategoryMapping(45, TorznabCatType.TV); - AddCategoryMapping(45, TorznabCatType.TVSD); //Category 46: NG Serier HDTV (Working) AddCategoryMapping(46, TorznabCatType.TVHD); AddCategoryMapping(46, TorznabCatType.TV); + if (!configData.OnlyDanishCategories.Value) + { + //Category 4: TV (Working) + AddCategoryMapping(4, TorznabCatType.TVSD); + AddCategoryMapping(4, TorznabCatType.TV); + AddCategoryMapping(4, TorznabCatType.TVHD); + //Category 21: Boxset/SD (Working) + AddCategoryMapping(21, TorznabCatType.TVFOREIGN); + //Category 24: Boxsets/TV (Working) + AddCategoryMapping(24, TorznabCatType.TVFOREIGN); + //Category 31: TVHD (Working) + AddCategoryMapping(31, TorznabCatType.TVHD); + AddCategoryMapping(31, TorznabCatType.TV); + //Category 45: TV-Misc (Working) + AddCategoryMapping(45, TorznabCatType.TV); + AddCategoryMapping(45, TorznabCatType.TVSD); + } } public async Task ApplyConfiguration(JToken configJson) From 97bf0e50b0a82af9c314acaac5cec591824abb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Fri, 23 Oct 2015 20:24:05 +0200 Subject: [PATCH 03/10] Added e-book and audiobook categories --- src/Jackett/Indexers/NxtGn.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 8edf2eef3..680c3732e 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -94,6 +94,11 @@ namespace Jackett.Indexers AddCategoryMapping(45, TorznabCatType.TV); AddCategoryMapping(45, TorznabCatType.TVSD); } + + // Audio Books + AddCategoryMapping(37, TorznabCatType.AudioAudiobook); + + AddCategoryMapping(8, TorznabCatType.BooksEbook); } public async Task ApplyConfiguration(JToken configJson) From 87b3f7e108150bc956aff1cde28fe1c212a47926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Sat, 24 Oct 2015 16:53:37 +0200 Subject: [PATCH 04/10] Changed NextGen to completed NextGen has been tested now, changed to completed. --- src/Jackett/Indexers/NxtGn.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 680c3732e..ee63f6c3d 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -98,6 +98,7 @@ namespace Jackett.Indexers // Audio Books AddCategoryMapping(37, TorznabCatType.AudioAudiobook); + // Books AddCategoryMapping(8, TorznabCatType.BooksEbook); } @@ -130,7 +131,7 @@ namespace Jackett.Indexers passKey = passKey.Substring(0, passKey.IndexOf(' ')); configData.RSSKey.Value = passKey; SaveConfig(); - return IndexerConfigurationStatus.RequiresTesting; + return IndexerConfigurationStatus.Completed; } public async Task> PerformQuery(TorznabQuery query) From e56875f1a33e4fb42ea6fba065494ef0ac7aa200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Sat, 24 Oct 2015 16:54:32 +0200 Subject: [PATCH 05/10] Added new danish tracker: DanishBits Added a new closed tracker from Denmark. It's easier to get into than NextGen, and is a good backup for missing episodes on NextGen. --- src/Jackett/Content/logos/danishbits.PNG | Bin 0 -> 7947 bytes src/Jackett/Indexers/DanishBits.cs | 267 +++++++++++++++++++++++ src/Jackett/Jackett.csproj | 3 +- 3 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/Jackett/Content/logos/danishbits.PNG create mode 100644 src/Jackett/Indexers/DanishBits.cs diff --git a/src/Jackett/Content/logos/danishbits.PNG b/src/Jackett/Content/logos/danishbits.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e2b7c372f59cd2bf80aed6093b30add0b6eeb71b GIT binary patch literal 7947 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 TDG&d9U?VBXs{yKI&4d332KVOR literal 0 HcmV?d00001 diff --git a/src/Jackett/Indexers/DanishBits.cs b/src/Jackett/Indexers/DanishBits.cs new file mode 100644 index 000000000..cfa44268e --- /dev/null +++ b/src/Jackett/Indexers/DanishBits.cs @@ -0,0 +1,267 @@ +using CsQuery; +using Jackett.Indexers; +using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Utils.Clients; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Web; +using System.Web.UI.WebControls; +using CsQuery.ExtensionMethods; +using Jackett.Models.IndexerConfig; + +namespace Jackett.Indexers +{ + public class DanishBits : BaseIndexer, IIndexer + { + private string LoginUrl { get { return SiteLink + "login.php"; } } + private string SearchUrl { get { return SiteLink + "torrents.php"; } } + + new NxtGnConfigurationData configData + { + get { return (NxtGnConfigurationData)base.configData; } + set { base.configData = value; } + } + + public DanishBits(IIndexerManagerService i, Logger l, IWebClient c, IProtectionService ps) + : base(name: "DanishBits", + description: "A danish closed torrent tracker", + link: "https://danishbits.org/", + caps: TorznabUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: c, + logger: l, + p: ps, + configData: new NxtGnConfigurationData()) + { + // Movies Mapping + // DanishBits HD + AddCategoryMapping(2, TorznabCatType.MoviesHD); + AddCategoryMapping(2, TorznabCatType.MoviesWEBDL); + + // Danske film + AddCategoryMapping(3, TorznabCatType.MoviesHD); + AddCategoryMapping(3, TorznabCatType.MoviesWEBDL); + AddCategoryMapping(3, TorznabCatType.MoviesDVD); + AddCategoryMapping(3, TorznabCatType.MoviesForeign); + AddCategoryMapping(3, TorznabCatType.MoviesSD); + + // DVDR Nordic + AddCategoryMapping(10, TorznabCatType.MoviesDVD); + AddCategoryMapping(10, TorznabCatType.MoviesForeign); + + // Custom + AddCategoryMapping(28, TorznabCatType.MoviesHD); + AddCategoryMapping(28, TorznabCatType.MoviesDVD); + + // Custom HD + AddCategoryMapping(29, TorznabCatType.MoviesHD); + AddCategoryMapping(29, TorznabCatType.MoviesWEBDL); + + // Custom Tablet + AddCategoryMapping(31, TorznabCatType.MoviesSD); + + if (!configData.OnlyDanishCategories.Value) + { + // Bluray + AddCategoryMapping(8, TorznabCatType.MoviesBluRay); + + // Boxset + AddCategoryMapping(9, TorznabCatType.MoviesHD); + AddCategoryMapping(9, TorznabCatType.MoviesForeign); + AddCategoryMapping(9, TorznabCatType.MoviesDVD); + + // DVDR + AddCategoryMapping(11, TorznabCatType.MoviesDVD); + + // HDx264 + AddCategoryMapping(22, TorznabCatType.MoviesHD); + + // XviD/MP4/SDx264 + AddCategoryMapping(24, TorznabCatType.MoviesSD); + } + + // TV Mapping + // DanishBits TV + AddCategoryMapping(1, TorznabCatType.TVHD); + AddCategoryMapping(1, TorznabCatType.TVWEBDL); + + // Dansk TV + AddCategoryMapping(4, TorznabCatType.TVHD); + AddCategoryMapping(4, TorznabCatType.TVWEBDL); + AddCategoryMapping(4, TorznabCatType.TVFOREIGN); + AddCategoryMapping(4, TorznabCatType.TVSD); + + // Custom TV + AddCategoryMapping(30, TorznabCatType.TVHD); + AddCategoryMapping(30, TorznabCatType.TVWEBDL); + + if (!configData.OnlyDanishCategories.Value) + { + // TV + AddCategoryMapping(20, TorznabCatType.TVHD); + AddCategoryMapping(20, TorznabCatType.TVSD); + AddCategoryMapping(20, TorznabCatType.TVWEBDL); + + // TV Boxset + AddCategoryMapping(21, TorznabCatType.TVHD); + AddCategoryMapping(21, TorznabCatType.TVSD); + AddCategoryMapping(21, TorznabCatType.TVWEBDL); + } + + // E-book + AddCategoryMapping(12, TorznabCatType.BooksEbook); + // Audiobooks + AddCategoryMapping(6, TorznabCatType.AudioAudiobook); + } + + public async Task ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary { + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "langlang", null }, + { "login", "login" } + }; + // Get inital cookies + CookieHeader = string.Empty; + 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); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + var releasesPerPage = 100; + var releases = new List(); + + var page = (query.Offset/releasesPerPage) + 1; + + string episodeSearchUrl; + if (string.IsNullOrEmpty(query.GetQueryString())) + { + episodeSearchUrl = SearchUrl + "?page=" + page; + } + else + { + var cats = MapTorznabCapsToTrackers(query); + var catsUrlPart = string.Join("&", cats.Select(c => $"filter_{c}=on")); + episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type="; + } + var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); + try + { + CQ dom = results.Content; + var rows = dom["#torrent_table tr.torrent"]; + foreach (var row in rows) + { + var qRow = row.Cq(); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 172800 + }; + + var catAnchor = row.FirstChild.FirstChild; + var catUrl = catAnchor.GetAttribute("href"); + var catStr = Regex.Match(catUrl, "filter_(?[0-9]+)=on").Groups["catNo"].Value; + var catNo = int.Parse(catStr); + var moviesCatsDanish = new[] { 2,3,10,28,29,31 }; + var moviesCatsIntl = new[] { 8,9,11,22,24 }; + var moviesCats = configData.OnlyDanishCategories.Value + ? moviesCatsDanish + : moviesCatsDanish.Concat(moviesCatsIntl); + var seriesCatsDanish = new[] { 1,4,30 }; + var seriesCatsIntl = new[] { 20,21 }; + var seriesCats = configData.OnlyDanishCategories.Value + ? seriesCatsDanish + : seriesCatsDanish.Concat(seriesCatsIntl); + if (moviesCats.Contains(catNo)) + release.Category = TorznabCatType.Movies.ID; + else if (seriesCats.Contains(catNo)) + release.Category = TorznabCatType.TV.ID; + else if (catNo == 12) + release.Category = TorznabCatType.BooksEbook.ID; + else if (catNo == 6) + release.Category = TorznabCatType.AudioAudiobook.ID; + else + 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 title = titleAnchor.GetAttribute("title"); + release.Title = title; + + var torrentLink = titleAnchor.GetAttribute("href"); + release.Guid = new Uri(SiteLink + torrentLink); + release.Comments = new Uri(SearchUrl + torrentLink); + + var addedElement = qRow.Find("span.time").FirstElement(); + var addedStr = addedElement.GetAttribute("title"); + release.PublishDate = DateTime.ParseExact(addedStr, "MMM dd yyyy, HH:mm", + CultureInfo.InvariantCulture); + + var columns = qRow.Children(); + var seedersElement = columns.Reverse().Skip(1).First(); + release.Seeders = int.Parse(seedersElement.InnerText); + + var leechersElement = columns.Last().FirstElement(); + release.Peers = release.Seeders + int.Parse(leechersElement.InnerText); + + var sizeElement = columns.Skip(2).First(); + var sizeStr = sizeElement.InnerText; + release.Size = ReleaseInfo.GetBytes(sizeStr); + + var imdbAnchor = qRow.Find(".torrentnotes a") + .FirstOrDefault(a => a.GetAttribute("href").Contains("imdb.com")); + if (imdbAnchor != null) + { + var referrerUrl = imdbAnchor.GetAttribute("href"); + release.Imdb = long.Parse(Regex.Match(referrerUrl, "tt(?[0-9]+)").Groups["imdbId"].Value); + } + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + return releases; + } + + public class NxtGnConfigurationData : ConfigurationData + { + public NxtGnConfigurationData() + { + Username = new StringItem { Name = "Username" }; + Password = new StringItem { Name = "Password" }; + OnlyDanishCategories = new BoolItem { Name = "Only Danish Categories" }; + } + public StringItem Username { get; private set; } + public StringItem Password { get; private set; } + public BoolItem OnlyDanishCategories { get; private set; } + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 3e27aa3c8..1f0764f31 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -186,6 +186,7 @@ + @@ -635,4 +636,4 @@ - + \ No newline at end of file From 43922191584ff492b15928d89b67ec44ac42e37d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Mon, 26 Oct 2015 10:20:14 +0100 Subject: [PATCH 06/10] 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. --- src/Jackett/Controllers/AdminController.cs | 2 +- src/Jackett/Controllers/DownloadController.cs | 6 +++- src/Jackett/Controllers/PotatoController.cs | 2 +- src/Jackett/Controllers/TorznabController.cs | 2 +- src/Jackett/Indexers/DanishBits.cs | 32 ++++++++++++++++--- src/Jackett/Jackett.csproj | 1 + src/Jackett/Services/ServerService.cs | 8 ++--- src/Jackett/Startup.cs | 2 +- 8 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/Jackett/Controllers/AdminController.cs b/src/Jackett/Controllers/AdminController.cs index b65eb6485..0fda24052 100644 --- a/src/Jackett/Controllers/AdminController.cs +++ b/src/Jackett/Controllers/AdminController.cs @@ -425,7 +425,7 @@ namespace Jackett.Controllers foreach (var result in results) { 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)) result.BlackholeLink = serverService.ConvertToProxyLink(link, serverUrl, result.TrackerId, "bh", string.Empty); diff --git a/src/Jackett/Controllers/DownloadController.cs b/src/Jackett/Controllers/DownloadController.cs index ee3e8373d..9841843a4 100644 --- a/src/Jackett/Controllers/DownloadController.cs +++ b/src/Jackett/Controllers/DownloadController.cs @@ -29,7 +29,7 @@ namespace Jackett.Controllers } [HttpGet] - public async Task Download(string indexerID, string path, string apikey) + public async Task Download(string indexerID, string path, string apikey, string file) { try { @@ -54,6 +54,10 @@ namespace Jackett.Controllers var result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new ByteArrayContent(downloadBytes); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-bittorrent"); + result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") + { + FileName = file + }; return result; } catch (Exception e) diff --git a/src/Jackett/Controllers/PotatoController.cs b/src/Jackett/Controllers/PotatoController.cs index e10662652..86992829c 100644 --- a/src/Jackett/Controllers/PotatoController.cs +++ b/src/Jackett/Controllers/PotatoController.cs @@ -126,7 +126,7 @@ namespace Jackett.Controllers foreach (var r in releases) { var release = Mapper.Map(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 if (release.Link != null) diff --git a/src/Jackett/Controllers/TorznabController.cs b/src/Jackett/Controllers/TorznabController.cs index aa5d25671..225066d16 100644 --- a/src/Jackett/Controllers/TorznabController.cs +++ b/src/Jackett/Controllers/TorznabController.cs @@ -116,7 +116,7 @@ namespace Jackett.Controllers foreach(var result in releases) { var clone = Mapper.Map(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); } diff --git a/src/Jackett/Indexers/DanishBits.cs b/src/Jackett/Indexers/DanishBits.cs index cfa44268e..bb1b9485c 100644 --- a/src/Jackett/Indexers/DanishBits.cs +++ b/src/Jackett/Indexers/DanishBits.cs @@ -168,6 +168,27 @@ namespace Jackett.Indexers episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type="; } var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); + if (string.IsNullOrEmpty(results.Content)) + { + CookieHeader = string.Empty; + var pairs = new Dictionary + { + {"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 { CQ dom = results.Content; @@ -206,14 +227,17 @@ namespace Jackett.Indexers else 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 title = titleAnchor.GetAttribute("title"); release.Title = title; + var dlUrlAnchor = qRow.Find("span.right a").FirstElement(); + var dlUrl = dlUrlAnchor.GetAttribute("href"); + var authkey = Regex.Match(dlUrl, "authkey=(?[0-9a-zA-Z]+)").Groups["authkey"].Value; + var torrentPass = Regex.Match(dlUrl, "torrent_pass=(?[0-9a-zA-Z]+)").Groups["torrent_pass"].Value; + var torrentId = Regex.Match(dlUrl, "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"); release.Guid = new Uri(SiteLink + torrentLink); release.Comments = new Uri(SearchUrl + torrentLink); diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 1f0764f31..b62444f8f 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -438,6 +438,7 @@ PreserveNewest + PreserveNewest diff --git a/src/Jackett/Services/ServerService.cs b/src/Jackett/Services/ServerService.cs index c3a324e9c..f5e90e929 100644 --- a/src/Jackett/Services/ServerService.cs +++ b/src/Jackett/Services/ServerService.cs @@ -32,7 +32,7 @@ namespace Jackett.Services void ReserveUrls(bool doInstall = true); ServerConfig Config { get; } 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 @@ -65,13 +65,13 @@ namespace Jackett.Services 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")) return link; - var encodedLink = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(link.ToString())) + file; - var proxyLink = string.Format("{0}{1}/{2}/{3}/{4}", serverUrl, action, indexerId, config.APIKey, encodedLink); + var encodedLink = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(link.ToString())); + var proxyLink = string.Format("{0}{1}/{2}/{3}?path={4}&file={5}", serverUrl, action, indexerId, config.APIKey, encodedLink, file); return new Uri(proxyLink); } diff --git a/src/Jackett/Startup.cs b/src/Jackett/Startup.cs index efa814c37..8e4070d26 100644 --- a/src/Jackett/Startup.cs +++ b/src/Jackett/Startup.cs @@ -111,7 +111,7 @@ namespace Jackett config.Routes.MapHttpRoute( name: "download", - routeTemplate: "dl/{indexerID}/{apikey}/{path}/t.torrent", + routeTemplate: "dl/{indexerID}/{apiKey}", defaults: new { controller = "Download", action = "Download" } ); From ea6f65e72529769ef955766b52d817febb537060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Mon, 26 Oct 2015 10:20:58 +0100 Subject: [PATCH 07/10] NextGen url change --- src/Jackett/Indexers/NxtGn.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index ee63f6c3d..27e70546e 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -37,7 +37,7 @@ namespace Jackett.Indexers public NxtGn(IIndexerManagerService i, Logger l, IWebClient c, IProtectionService ps) : base(name: "NextGen", description: "A danish closed torrent tracker", - link: "https://nxtgn.info/", + link: "https://nxtgn.biz/", caps: TorznabUtil.CreateDefaultTorznabTVCaps(), manager: i, client: c, From c07fc4de44cb61152e006d27e09a681299ca9b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Mon, 26 Oct 2015 20:13:09 +0100 Subject: [PATCH 08/10] Fixes some invalid torrent files Sonarr would not accept torrents where the keys were not sorted. This update will sort the keys before sending the file to the downloader to make the torrent valid for Sonarr. --- src/Jackett/Controllers/DownloadController.cs | 5 +++++ src/Jackett/Jackett.csproj | 4 ++++ src/Jackett/packages.config | 1 + 3 files changed, 10 insertions(+) diff --git a/src/Jackett/Controllers/DownloadController.cs b/src/Jackett/Controllers/DownloadController.cs index 9841843a4..e3cdc9686 100644 --- a/src/Jackett/Controllers/DownloadController.cs +++ b/src/Jackett/Controllers/DownloadController.cs @@ -10,6 +10,7 @@ using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Http; +using MonoTorrent.BEncoding; namespace Jackett.Controllers { @@ -51,6 +52,10 @@ namespace Jackett.Controllers var downloadBytes = await indexer.Download(target); + // This will fix torrents where the keys are not sorted, and thereby not supported by Sonarr. + var torrentDictionary = BEncodedDictionary.DecodeTorrent(downloadBytes); + downloadBytes = torrentDictionary.Encode(); + var result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new ByteArrayContent(downloadBytes); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-bittorrent"); diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index b62444f8f..bc5a8c01c 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -110,6 +110,10 @@ ..\packages\Microsoft.Owin.StaticFiles.3.0.1\lib\net45\Microsoft.Owin.StaticFiles.dll True + + ..\packages\MonoTorrent.0.9.0\lib\net20\MonoTorrent.dll + True + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll True diff --git a/src/Jackett/packages.config b/src/Jackett/packages.config index b602742aa..427976d0d 100644 --- a/src/Jackett/packages.config +++ b/src/Jackett/packages.config @@ -22,6 +22,7 @@ + From 09d00eba32450e8b8ca74a3093282ffc25008228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Mon, 26 Oct 2015 20:48:04 +0100 Subject: [PATCH 09/10] Pagination on NxtGn I've added support for offset and limit parameters on the NextGen tracker --- src/Jackett/Indexers/NxtGn.cs | 182 ++++++++++++++++------------------ src/Jackett/Jackett.csproj | 4 +- 2 files changed, 89 insertions(+), 97 deletions(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 27e70546e..53e259ca5 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -136,109 +136,99 @@ namespace Jackett.Indexers public async Task> PerformQuery(TorznabQuery query) { + var releasesPerPage = 100; var releases = new List(); - var breakWhile = false; - var page = 0; - while (page < 3) + var page = (query.Offset / releasesPerPage) + 1; + string episodeSearchUrl; + if (string.IsNullOrEmpty(query.GetQueryString())) { - string episodeSearchUrl; - if (string.IsNullOrEmpty(query.GetQueryString())) - { - episodeSearchUrl = SearchUrl + "?page=" + page; - breakWhile = true; - } - else - { - var cats = MapTorznabCapsToTrackers(query); - var catsUrlPart = string.Join("&", cats.Select(c => $"c{c}=1")); - episodeSearchUrl = string.Format("{0}?search={1}&cat=0&incldead=0&{2}&page={3}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()), catsUrlPart, page); - } - page++; - var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); - try - { - CQ dom = results.Content; + episodeSearchUrl = SearchUrl + "?page=" + page; + } + else + { + var cats = MapTorznabCapsToTrackers(query); + var catsUrlPart = string.Join("&", cats.Select(c => $"c{c}=1")); + episodeSearchUrl = string.Format("{0}?search={1}&cat=0&incldead=0&{2}&page={3}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()), catsUrlPart, page); + } + var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); + try + { + CQ dom = results.Content; - var rows = dom["#torrent-table-wrapper > div"]; + var rows = dom["#torrent-table-wrapper > div"]; - foreach (var row in rows.Skip(1)) + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + + var qRow = row.Cq(); + var qLink = qRow.Find("#torrent-udgivelse2-users > a").First(); + var qDesc = qRow.Find("#torrent-udgivelse2-users > p").FirstOrDefault(); + + + var moviesCatsDanish = new[] { 38, 23, 22, 33, 17 }; + var moviesCatsIntl = new[] { 47, 5, 9 }; + var moviesCats = configData.OnlyDanishCategories.Value + ? moviesCatsDanish + : moviesCatsDanish.Concat(moviesCatsIntl); + var seriesCatsDanish = new[] { 26, 43, 46 }; + var seriesCatsIntl = new[] { 4, 21, 24, 31, 45 }; + var seriesCats = configData.OnlyDanishCategories.Value + ? seriesCatsDanish + : seriesCatsDanish.Concat(seriesCatsIntl); + var catUrl = qRow.Find(".torrent-icon > a").Attr("href"); + var cat = catUrl.Substring(catUrl.LastIndexOf('=') + 1); + var catNo = int.Parse(cat); + if (moviesCats.Contains(catNo)) + release.Category = TorznabCatType.Movies.ID; + else if (seriesCats.Contains(catNo)) + release.Category = TorznabCatType.TV.ID; + else + continue; + + releases.Add(release); + + var torrentUrl = qLink.Attr("href"); + var torrentId = torrentUrl.Substring(torrentUrl.LastIndexOf('=') + 1); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + release.Title = qLink.Attr("title"); + release.Description = qDesc != null ? qDesc.InnerText : release.Title; + release.Guid = new Uri(SiteLink + torrentUrl); + release.Comments = new Uri(release.Guid + "#startcomments"); + + var downloadUrl = $"{SiteLink}download.php?id={torrentId}&rss&passkey={configData.RSSKey.Value}"; + release.Link = new Uri(downloadUrl); + + var qAdded = qRow.Find("#torrent-added").First(); + var addedStr = qAdded.Text().Trim(); + release.PublishDate = DateTime.ParseExact(addedStr, "dd-MM-yyyyHH:mm:ss", CultureInfo.InvariantCulture); + + release.Seeders = ParseUtil.CoerceInt(qRow.Find("#torrent-seeders").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("#torrent-leechers").Text().Trim()) + release.Seeders; + + var sizeStr = qRow.Find("#torrent-size").First().Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + var infoLink = qRow.Find("#infolink"); + var linkContainer = infoLink.Children().First().Children().First(); + var url = linkContainer.Attr("href"); + var img = linkContainer.Children().First(); + var imgUrl = img.Attr("src"); + if (imgUrl == "/pic/imdb.png") { - var release = new ReleaseInfo(); - - var qRow = row.Cq(); - var qLink = qRow.Find("#torrent-udgivelse2-users > a").First(); - var qDesc = qRow.Find("#torrent-udgivelse2-users > p").FirstOrDefault(); - - - var moviesCatsDanish = new[] { 38, 23, 22, 33, 17 }; - var moviesCatsIntl = new[] { 47, 5, 9 }; - var moviesCats = configData.OnlyDanishCategories.Value - ? moviesCatsDanish - : moviesCatsDanish.Concat(moviesCatsIntl); - var seriesCatsDanish = new[] {26, 43, 46}; - var seriesCatsIntl = new[] { 4, 21, 24, 31, 45 }; - var seriesCats = configData.OnlyDanishCategories.Value - ? seriesCatsDanish - : seriesCatsDanish.Concat(seriesCatsIntl); - var catUrl = qRow.Find(".torrent-icon > a").Attr("href"); - var cat = catUrl.Substring(catUrl.LastIndexOf('=') + 1); - var catNo = int.Parse(cat); - if (moviesCats.Contains(catNo)) - release.Category = TorznabCatType.Movies.ID; - else if (seriesCats.Contains(catNo)) - release.Category = TorznabCatType.TV.ID; - else - continue; - - releases.Add(release); - - var torrentUrl = qLink.Attr("href"); - var torrentId = torrentUrl.Substring(torrentUrl.LastIndexOf('=') + 1); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; - release.Title = qLink.Attr("title"); - release.Description = qDesc != null ? qDesc.InnerText : release.Title; - release.Guid = new Uri(SiteLink + torrentUrl); - release.Comments = new Uri(release.Guid + "#startcomments"); - - var downloadUrl = $"{SiteLink}download.php?id={torrentId}&rss&passkey={configData.RSSKey.Value}"; - release.Link = new Uri(downloadUrl); - - var qAdded = qRow.Find("#torrent-added").First(); - var addedStr = qAdded.Text().Trim(); - release.PublishDate = DateTime.ParseExact(addedStr, "dd-MM-yyyyHH:mm:ss", CultureInfo.InvariantCulture); - - release.Seeders = ParseUtil.CoerceInt(qRow.Find("#torrent-seeders").Text().Trim()); - release.Peers = ParseUtil.CoerceInt(qRow.Find("#torrent-leechers").Text().Trim()) + release.Seeders; - - var sizeStr = qRow.Find("#torrent-size").First().Text(); - release.Size = ReleaseInfo.GetBytes(sizeStr); - - var infoLink = qRow.Find("#infolink"); - var linkContainer = infoLink.Children().First().Children().First(); - var url = linkContainer.Attr("href"); - var img = linkContainer.Children().First(); - var imgUrl = img.Attr("src"); - if (imgUrl == "/pic/imdb.png") - { - release.Imdb = long.Parse(url.Substring(url.LastIndexOf('t') + 1)); - } - else if (imgUrl == "/pic/TV.png") - { - release.TVDBId = long.Parse(url.Substring(url.LastIndexOf('=') + 1)); - } + release.Imdb = long.Parse(url.Substring(url.LastIndexOf('t') + 1)); + } + else if (imgUrl == "/pic/TV.png") + { + release.TVDBId = long.Parse(url.Substring(url.LastIndexOf('=') + 1)); } - var nextPage = dom["#torrent-table-wrapper + p[align=center]"].Children().Last(); - if (!nextPage.Is("a")) - breakWhile = true; } - catch (Exception ex) - { - OnParseError(results.Content, ex); - } - if (breakWhile) - break; + } + catch (Exception ex) + { + OnParseError(results.Content, ex); } return releases; } diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index bc5a8c01c..b9dd78a40 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -442,7 +442,9 @@ PreserveNewest - + + PreserveNewest + PreserveNewest From 83717cc220a364c587ae24ee1854ad72045f1346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Mon, 26 Oct 2015 21:06:07 +0100 Subject: [PATCH 10/10] Fixed bug in pagination on NextGen --- src/Jackett/Indexers/NxtGn.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Jackett/Indexers/NxtGn.cs b/src/Jackett/Indexers/NxtGn.cs index 53e259ca5..872d50210 100644 --- a/src/Jackett/Indexers/NxtGn.cs +++ b/src/Jackett/Indexers/NxtGn.cs @@ -138,7 +138,7 @@ namespace Jackett.Indexers { var releasesPerPage = 100; var releases = new List(); - var page = (query.Offset / releasesPerPage) + 1; + var page = (query.Offset / releasesPerPage); string episodeSearchUrl; if (string.IsNullOrEmpty(query.GetQueryString())) {