diff --git a/src/Jackett.Common/Definitions/exoticaz.yml b/src/Jackett.Common/Definitions/exoticaz.yml deleted file mode 100644 index 2955d3d6a..000000000 --- a/src/Jackett.Common/Definitions/exoticaz.yml +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: exoticaz -name: ExoticaZ -description: "ExoticaZ (YourExotic) is a Private Torrent Tracker for 3X" -language: en-us -type: private -encoding: UTF-8 -links: - - https://exoticaz.to/ -legacylinks: - - https://torrents.yourexotic.com/ - -caps: - categorymappings: - - {id: 1, cat: XXX, desc: "DVDRip"} - - modes: - search: [q] - tv-search: [q] - movie-search: [q] - -login: - path: login - method: form - inputs: - username_email: "{{ .Config.username }}" - password: "{{ .Config.password }}" - remember: on - captcha: - type: image - selector: img[alt="Captcha Image"] - input: captcha - error: - - selector: div.invalid-feedback - test: - selector: div.ratio-bar - -search: - path: torrents - inputs: - # 0 any 1 filename 2 descr 3 files - in: 1 - search: "{{ .Keywords }}" - category: 0 - - rows: - selector: div.table-responsive > table > tbody > tr - - fields: - category: - text: 1 - title: - selector: a.torrent-link - attribute: title - details: - selector: a.torrent-link - attribute: href - download: - selector: a[href*="/download/"] - attribute: href - banner: - selector: .screen-image - attribute: data-screens - filters: - - name: split - args: ["|", 0] - date: - selector: td:nth-last-child(5) - filters: - - name: append - args: " ago" - size: - selector: td:nth-last-child(4) - seeders: - selector: td:nth-last-child(3) - leechers: - selector: td:nth-last-child(2) - grabs: - selector: td:nth-last-child(1) - downloadvolumefactor: - case: - i[title="Free Download"]: 0 - i[title="Half Download"]: 0.5 - "*": 1 - uploadvolumefactor: - case: - i.fa-gem: 2 - "*": 1 -# engine tbd diff --git a/src/Jackett.Common/Indexers/Abstract/AvistazTracker.cs b/src/Jackett.Common/Indexers/Abstract/AvistazTracker.cs index f6346dbc9..98298c21b 100644 --- a/src/Jackett.Common/Indexers/Abstract/AvistazTracker.cs +++ b/src/Jackett.Common/Indexers/Abstract/AvistazTracker.cs @@ -34,6 +34,79 @@ namespace Jackett.Common.Indexers.Abstract // hook to adjust the search term protected virtual string GetSearchTerm(TorznabQuery query) => $"{query.SearchTerm} {query.GetEpisodeSearchString()}"; + // hook to adjust the search category + protected virtual List> GetSearchQueryParameters(TorznabQuery query) + { + var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList(); + var qc = new List> // NameValueCollection don't support cat[]=19&cat[]=6 + { + {"in", "1"}, + {"type", categoryMapping.Any() ? categoryMapping.First() : "0"} + }; + + // resolution filter to improve the search + if (!query.Categories.Contains(TorznabCatType.Movies.ID) && !query.Categories.Contains(TorznabCatType.TV.ID) && + !query.Categories.Contains(TorznabCatType.Audio.ID)) + { + if (query.Categories.Contains(TorznabCatType.MoviesUHD.ID) || query.Categories.Contains(TorznabCatType.TVUHD.ID)) + qc.Add("video_quality[]", "6"); // 2160p + if (query.Categories.Contains(TorznabCatType.MoviesHD.ID) || query.Categories.Contains(TorznabCatType.TVHD.ID)) + { + qc.Add("video_quality[]", "2"); // 720p + qc.Add("video_quality[]", "7"); // 1080i + qc.Add("video_quality[]", "3"); // 1080p + } + if (query.Categories.Contains(TorznabCatType.MoviesSD.ID) || query.Categories.Contains(TorznabCatType.TVSD.ID)) + qc.Add("video_quality[]", "1"); // SD + } + + // note, search by tmdb and tvdb are supported too + // https://privatehd.to/api/v1/jackett/torrents?tmdb=1234 + // https://privatehd.to/api/v1/jackett/torrents?tvdb=3653 + if (query.IsImdbQuery) + qc.Add("imdb", query.ImdbID); + else + qc.Add("search", GetSearchTerm(query).Trim()); + + return qc; + } + + // hook to adjust category parsing + protected virtual List ParseCategories(TorznabQuery query, JToken row) + { + var cats = new List(); + var resolution = row.Value("video_quality"); + switch(row.Value("type")) + { + case "Movie": + if (query.Categories.Contains(TorznabCatType.Movies.ID)) + cats.Add(TorznabCatType.Movies.ID); + cats.Add(resolution switch + { + var res when _hdResolutions.Contains(res) => TorznabCatType.MoviesHD.ID, + "2160p" => TorznabCatType.MoviesUHD.ID, + _ => TorznabCatType.MoviesSD.ID + }); + break; + case "TV-Show": + if (query.Categories.Contains(TorznabCatType.TV.ID)) + cats.Add(TorznabCatType.TV.ID); + cats.Add(resolution switch + { + var res when _hdResolutions.Contains(res) => TorznabCatType.TVHD.ID, + "2160p" => TorznabCatType.TVUHD.ID, + _ => TorznabCatType.TVSD.ID + }); + break; + case "Music": + cats.Add(TorznabCatType.Audio.ID); + break; + default: + throw new Exception("Error parsing category!"); + } + return cats; + } + protected AvistazTracker(string link, string id, string name, string description, IIndexerConfigurationService configService, WebClient client, Logger logger, IProtectionService p, TorznabCapabilities caps) @@ -51,16 +124,7 @@ without this configuration the torrent download does not work.
You can find { Encoding = Encoding.UTF8; Language = "en-us"; - - AddCategoryMapping(1, TorznabCatType.Movies); - AddCategoryMapping(1, TorznabCatType.MoviesUHD); - AddCategoryMapping(1, TorznabCatType.MoviesHD); - AddCategoryMapping(1, TorznabCatType.MoviesSD); - AddCategoryMapping(2, TorznabCatType.TV); - AddCategoryMapping(2, TorznabCatType.TVUHD); - AddCategoryMapping(2, TorznabCatType.TVHD); - AddCategoryMapping(2, TorznabCatType.TVSD); - AddCategoryMapping(3, TorznabCatType.Audio); + Type = "private"; } public override async Task ApplyConfiguration(JToken configJson) @@ -95,37 +159,7 @@ without this configuration the torrent download does not work.
You can find { var releases = new List(); - var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList(); - var qc = new List> // NameValueCollection don't support cat[]=19&cat[]=6 - { - {"in", "1"}, - {"type", categoryMapping.Any() ? categoryMapping.First() : "0"} // type=0 => all categories - }; - - // resolution filter to improve the search - if (!query.Categories.Contains(TorznabCatType.Movies.ID) && !query.Categories.Contains(TorznabCatType.TV.ID) && - !query.Categories.Contains(TorznabCatType.Audio.ID)) - { - if (query.Categories.Contains(TorznabCatType.MoviesUHD.ID) || query.Categories.Contains(TorznabCatType.TVUHD.ID)) - qc.Add("video_quality[]", "6"); // 2160p - if (query.Categories.Contains(TorznabCatType.MoviesHD.ID) || query.Categories.Contains(TorznabCatType.TVHD.ID)) - { - qc.Add("video_quality[]", "2"); // 720p - qc.Add("video_quality[]", "7"); // 1080i - qc.Add("video_quality[]", "3"); // 1080p - } - if (query.Categories.Contains(TorznabCatType.MoviesSD.ID) || query.Categories.Contains(TorznabCatType.TVSD.ID)) - qc.Add("video_quality[]", "1"); // SD - } - - // note, search by tmdb and tvdb are supported too - // https://privatehd.to/api/v1/jackett/torrents?tmdb=1234 - // https://privatehd.to/api/v1/jackett/torrents?tvdb=3653 - if (query.IsImdbQuery) - qc.Add("imdb", query.ImdbID); - else - qc.Add("search", GetSearchTerm(query).Trim()); - + var qc = GetSearchQueryParameters(query); var episodeSearchUrl = SearchUrl + "?" + qc.GetQueryString(); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl, headers: GetSearchHeaders()); if (response.Status == HttpStatusCode.Unauthorized || response.Status == HttpStatusCode.PreconditionFailed) @@ -172,36 +206,7 @@ without this configuration the torrent download does not work.
You can find description += $"
Subtitles: {string.Join(", ", subtitleList)}"; } - var cats = new List(); - var resolution = row.Value("video_quality"); - switch(row.Value("type")) - { - case "Movie": - if (query.Categories.Contains(TorznabCatType.Movies.ID)) - cats.Add(TorznabCatType.Movies.ID); - cats.Add(resolution switch - { - var res when _hdResolutions.Contains(res) => TorznabCatType.MoviesHD.ID, - "2160p" => TorznabCatType.MoviesUHD.ID, - _ => TorznabCatType.MoviesSD.ID - }); - break; - case "TV-Show": - if (query.Categories.Contains(TorznabCatType.TV.ID)) - cats.Add(TorznabCatType.TV.ID); - cats.Add(resolution switch - { - var res when _hdResolutions.Contains(res) => TorznabCatType.TVHD.ID, - "2160p" => TorznabCatType.TVUHD.ID, - _ => TorznabCatType.TVSD.ID - }); - break; - case "Music": - cats.Add(TorznabCatType.Audio.ID); - break; - default: - throw new Exception("Error parsing category!"); - } + var cats = ParseCategories(query, row); var release = new ReleaseInfo { diff --git a/src/Jackett.Common/Indexers/AvistaZ.cs b/src/Jackett.Common/Indexers/AvistaZ.cs index f6a0a8262..bb31476ef 100644 --- a/src/Jackett.Common/Indexers/AvistaZ.cs +++ b/src/Jackett.Common/Indexers/AvistaZ.cs @@ -24,7 +24,17 @@ namespace Jackett.Common.Indexers client: wc, logger: l, p: ps) - => Type = "private"; + { + AddCategoryMapping(1, TorznabCatType.Movies); + AddCategoryMapping(1, TorznabCatType.MoviesUHD); + AddCategoryMapping(1, TorznabCatType.MoviesHD); + AddCategoryMapping(1, TorznabCatType.MoviesSD); + AddCategoryMapping(2, TorznabCatType.TV); + AddCategoryMapping(2, TorznabCatType.TVUHD); + AddCategoryMapping(2, TorznabCatType.TVHD); + AddCategoryMapping(2, TorznabCatType.TVSD); + AddCategoryMapping(3, TorznabCatType.Audio); + } // Avistaz has episodes without season. eg Running Man E323 protected override string GetSearchTerm(TorznabQuery query) => diff --git a/src/Jackett.Common/Indexers/CinemaZ.cs b/src/Jackett.Common/Indexers/CinemaZ.cs index eed1ac71b..dce7701df 100644 --- a/src/Jackett.Common/Indexers/CinemaZ.cs +++ b/src/Jackett.Common/Indexers/CinemaZ.cs @@ -24,6 +24,16 @@ namespace Jackett.Common.Indexers client: wc, logger: l, p: ps) - => Type = "private"; + { + AddCategoryMapping(1, TorznabCatType.Movies); + AddCategoryMapping(1, TorznabCatType.MoviesUHD); + AddCategoryMapping(1, TorznabCatType.MoviesHD); + AddCategoryMapping(1, TorznabCatType.MoviesSD); + AddCategoryMapping(2, TorznabCatType.TV); + AddCategoryMapping(2, TorznabCatType.TVUHD); + AddCategoryMapping(2, TorznabCatType.TVHD); + AddCategoryMapping(2, TorznabCatType.TVSD); + AddCategoryMapping(3, TorznabCatType.Audio); + } } } diff --git a/src/Jackett.Common/Indexers/ExoticaZ.cs b/src/Jackett.Common/Indexers/ExoticaZ.cs new file mode 100644 index 000000000..8489ae59d --- /dev/null +++ b/src/Jackett.Common/Indexers/ExoticaZ.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Jackett.Common.Indexers.Abstract; +using Jackett.Common.Models; +using Jackett.Common.Services.Interfaces; +using Jackett.Common.Utils; +using Jackett.Common.Utils.Clients; +using Newtonsoft.Json.Linq; +using NLog; + +namespace Jackett.Common.Indexers +{ + [ExcludeFromCodeCoverage] + public class ExoticaZ : AvistazTracker + { + public override string[] LegacySiteLinks { get; protected set; } = + { + "https://torrents.yourexotic.com/" + }; + + public ExoticaZ(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps) + : base(id: "exoticaz", + name: "ExoticaZ", + description: "ExoticaZ (YourExotic) is a Private Torrent Tracker for 3X", + link: "https://exoticaz.to/", + caps: new TorznabCapabilities(), + configService: configService, + client: wc, + logger: l, + p: ps) + { + AddCategoryMapping(1, TorznabCatType.XXXx264); + AddCategoryMapping(2, TorznabCatType.XXXPacks); + AddCategoryMapping(3, TorznabCatType.XXXPacks); + AddCategoryMapping(4, TorznabCatType.XXXPacks); + AddCategoryMapping(5, TorznabCatType.XXXDVD); + AddCategoryMapping(6, TorznabCatType.XXXOther); + AddCategoryMapping(7, TorznabCatType.XXXImageset); + } + + protected override List> GetSearchQueryParameters(TorznabQuery query) + { + var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList(); + var qc = new List> // NameValueCollection don't support cat[]=19&cat[]=6 + { + {"in", "1"}, + {"category", categoryMapping.Any() ? categoryMapping.First() : "0"}, + {"search", GetSearchTerm(query).Trim()} + }; + + return qc; + } + + protected override List ParseCategories(TorznabQuery query, JToken row) + { + var cat = row.Value("category").Properties().First().Name; + return MapTrackerCatToNewznab(cat).ToList(); + } + } +} diff --git a/src/Jackett.Common/Indexers/PrivateHD.cs b/src/Jackett.Common/Indexers/PrivateHD.cs index 0f28356ef..e123b57d0 100644 --- a/src/Jackett.Common/Indexers/PrivateHD.cs +++ b/src/Jackett.Common/Indexers/PrivateHD.cs @@ -24,6 +24,16 @@ namespace Jackett.Common.Indexers client: wc, logger: l, p: ps) - => Type = "private"; + { + AddCategoryMapping(1, TorznabCatType.Movies); + AddCategoryMapping(1, TorznabCatType.MoviesUHD); + AddCategoryMapping(1, TorznabCatType.MoviesHD); + AddCategoryMapping(1, TorznabCatType.MoviesSD); + AddCategoryMapping(2, TorznabCatType.TV); + AddCategoryMapping(2, TorznabCatType.TVUHD); + AddCategoryMapping(2, TorznabCatType.TVHD); + AddCategoryMapping(2, TorznabCatType.TVSD); + AddCategoryMapping(3, TorznabCatType.Audio); + } } } diff --git a/src/Jackett.Updater/Program.cs b/src/Jackett.Updater/Program.cs index 2c8308c46..b6afbe398 100644 --- a/src/Jackett.Updater/Program.cs +++ b/src/Jackett.Updater/Program.cs @@ -306,6 +306,7 @@ namespace Jackett.Updater "Definitions/eotforum.yml", "Definitions/estrenosdtl.yml", "Definitions/evolutionpalace.yml", + "Definitions/exoticaz.yml", // migrated to C# "Definitions/extratorrentclone.yml", "Definitions/feedurneed.yml", "Definitions/freakstrackingsystem.yml",