Compare commits

...

19 Commits

Author SHA1 Message Date
Garfield69
f3048ad71c asiandvdclub: removed. resolves #11994 2022-01-01 12:27:33 +13:00
Garfield69
a211ae9af8 alleenretail: removed. resolves #12557 2022-01-01 08:24:14 +13:00
Uilton Oliveira
434d574867 bjshare: use cookie login method. resolves #12756 (#12757)
should also resolve #12746
2021-12-31 17:35:30 +00:00
ilike2burnthing
627864111f tests: update expected year 2021-12-31 17:23:08 +00:00
ilike2burnthing
2bf3526033 torrentseeds-api: minor edits 2021-12-30 03:06:07 +00:00
Mouton99
d8a48b2e50 TorrentSeeds now uses UNIT3D (#12752) 2021-12-30 14:33:23 +13:00
ilike2burnthing
3cd1b44896 Revert "New .in Url for ilcorsaronero (#12744)" pt3
would help if I actually paid attention...
2021-12-29 19:58:23 +00:00
ilike2burnthing
21850bf6a1 Revert "New .in Url for ilcorsaronero (#12744)" pt2 2021-12-29 19:18:04 +00:00
AlexR00T
82eeb1e4d3 Revert "New .in Url for ilcorsaronero (#12744)" (#12748) 2021-12-29 16:52:17 +00:00
diemade
1766de2a76 pornbay.org; Strings from site (#12741) 2021-12-29 09:04:24 +13:00
AlexR00T
d1b14e45ff New .in Url for ilcorsaronero (#12744) 2021-12-29 09:03:16 +13:00
diemade
27d88b4f49 readme: synocommunity package link added (#12740) 2021-12-28 14:24:31 +00:00
Garfield69
6d3903235a torrentz2eu: new domain 2021-12-27 14:16:16 +13:00
Garfield69
905f751a6f torrentview: bump domain 2021-12-27 14:16:01 +13:00
Garfield69
bad0076248 torrentqq: bump domain 2021-12-27 14:15:50 +13:00
Garfield69
cbea57b22a whiteangel: add new cat 2021-12-27 08:46:28 +13:00
ilike2burnthing
3b00646ac9 newpct: change domain *.net. resolves #12736
*.one isn't providing download links anymore
2021-12-26 06:22:22 +00:00
Garfield69
f61a2b4740 pornolab: add new cats resolves #12731 2021-12-24 07:12:52 +13:00
Garfield69
f890ddd119 danishbytes: new domain resolves #10758 2021-12-24 06:52:07 +13:00
16 changed files with 192 additions and 662 deletions

View File

@@ -254,7 +254,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Aftershock
* Aidoru!Online
* Aither
* Alleen Retail
* AlphaRatio (AR)
* AmigosShareClub
* anasch.cc
@@ -265,7 +264,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Araba Fenice (Phoenix) [![(invite needed)][inviteneeded]](#)
* ArabP2P
* AsianCinema
* AsianDVDClub
* AudioNews (AN)
* Aussierul.es [![(invite needed)][inviteneeded]](#)
* AvistaZ (AsiaTorrents)
@@ -734,7 +732,7 @@ Detailed instructions are available at [LinuxServer.io Jackett Docker](https://h
## Installation on Synology
Jackett is available as a beta package from [SynoCommunity](https://synocommunity.com/)
Jackett is available as a [beta package](https://synocommunity.com/package/jackett) from [SynoCommunity](https://synocommunity.com/)
## Running Jackett behind a reverse proxy

View File

@@ -1,186 +0,0 @@
---
id: alleenretail
name: Alleen Retail
description: "Alleen Retail is a DUTCH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: nl-NL
type: private
encoding: UTF-8
links:
- http://www.alleenretail.org/ # does not support https ERR_CONNECTION_REFUSED
caps:
categorymappings:
- {id: 2, cat: Movies/DVD, desc: "Films DVD"}
- {id: 17, cat: Movies, desc: "Films Promo"}
- {id: 3, cat: Audio/Video, desc: "Muziek Video"}
- {id: 4, cat: Audio/Video, desc: "Cabaret"}
- {id: 18, cat: Movies, desc: "Films Kids"}
- {id: 6, cat: TV, desc: "TV Series"}
- {id: 19, cat: Other, desc: "Overigen"}
- {id: 20, cat: TV/Documentary, desc: "Documentaire"}
- {id: 9, cat: PC/Games, desc: "Games PC"}
- {id: 10, cat: Books/Mags, desc: "Magazines"}
- {id: 11, cat: Movies/SD, desc: "Films AVI/DivX"}
- {id: 22, cat: Movies, desc: "Films Classics"}
- {id: 8, cat: Audio, desc: "Muziek"}
- {id: 23, cat: PC/Mac, desc: "Software Mac"}
- {id: 1, cat: Books/Comics, desc: "Stripboeken"}
- {id: 13, cat: PC/Mobile-Android, desc: "Android"}
- {id: 14, cat: PC/Mobile-Other, desc: "Navigatie"}
- {id: 7, cat: PC/0day, desc: "Software PC"}
- {id: 12, cat: PC/Mobile-iOS, desc: "iOS"}
- {id: 21, cat: Movies/HD, desc: "Films HD"}
- {id: 5, cat: Audio/Audiobook, desc: "Luisterboeken"}
- {id: 15, cat: XXX, desc: "18+"}
- {id: 24, cat: Movies/UHD, desc: "Films Blu-ray/3D/4K"}
- {id: 16, cat: Books/EBook, desc: "Ebooks"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
# - name: thankyou
# type: text
# label: Thank You Comment
# - name: info
# type: info
# label: Thank you comment
# default: This site requires you to leave a Thank You comment before you can download. Enter your personalised comment above.
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Aanmelden mislukt")
test:
path: /
selector: a[href="logout.php"]
# download:
# before:
# # /comment.php?action=add&tid=166386
# path: comment.php
# method: post
# inputs:
# action: add
# tid: "{{ .DownloadUri.Query.id }}"
# text: "{{ .Config.thankyou }}"
# submit: Opslaan
# selectors:
# - selector: a[href^="download.php?id="]
# attribute: href
search:
paths:
- path: browse.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 1
# does not support imdbid search and does not return imdb link in results
rows:
selector: table.mainouter
filters:
- name: andmatch
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
filters:
- name: re_replace
args: ["(?i)seizoen\\s*(\\d{1,2})\\s*(tot|t\/m)\\s*(\\d{1,2})", "S$1-$3"]
- name: re_replace
args: ["(?i)(seizoen\\s*)(\\d{1,2})", "S$2"]
- name: re_replace
args: ["(?i)(afl.\\s*|aflevering\\s*)(\\d{1,2})", "E$2"]
- name: re_replace
args: ["(?i)compleet", "Complete"]
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
size:
selector: a[href^="details_bestanden.php?torrent_id="]
filters:
- name: regexp
args: "(.+?) in"
files:
selector: a[href^="details_bestanden.php?torrent_id="]
filters:
- name: regexp
args: "in (\\d+) bestan"
grabs:
selector: table tr:nth-child(2) td:nth-child(1)
date:
selector: table tr:nth-child(2) td:nth-child(3)
filters:
- name: replace
args: ["januari", "January"]
- name: replace
args: ["februari", "February"]
- name: replace
args: ["maart", "March"]
- name: replace
args: ["april", "April"]
- name: replace
args: ["mei", "May"]
- name: replace
args: ["juni", "June"]
- name: replace
args: ["juli", "July"]
- name: replace
args: ["augustus", "August"]
- name: replace
args: ["september", "September"]
- name: replace
args: ["oktober", "October"]
- name: replace
args: ["november", "November"]
- name: replace
args: ["december", "December"]
- name: re_replace
args: ["\\s*om\\s*", " "]
- name: append
args: " +01:00" # CET
- name: dateparse
args: "2 January 2006 15:04:05 -07:00"
seeders_optional:
optional: true
selector: table tr:nth-child(3) td:nth-child(6) font b
seeders:
text: "{{ if .Result.seeders_optional }}{{ .Result.seeders_optional }}{{ else }}0{{ end }}"
leechers_optional:
optional: true
selector: table tr:nth-child(3) td:nth-child(6) font b:nth-child(2)
leechers:
text: "{{ if .Result.leechers_optional }}{{ .Result.leechers_optional }}{{ else }}0{{ end }}"
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
minimumratio:
# between 1.00 and 1.50 is required, and above 1.50 prohibited
text: 1.25
# engine n/a

View File

@@ -1,125 +0,0 @@
---
id: asiandvdclub
name: AsianDVDClub
description: "AsianDVDClub (ADC) is a Private Torrent Tracker for Asian DVD and BluRay"
language: en-US
type: private
encoding: UTF-8
links:
- https://asiandvdclub.org/
caps:
categorymappings:
- {id: 1, cat: TV/Anime, desc: "Anime"}
- {id: 3, cat: Movies, desc: "Japan"}
- {id: 5, cat: Movies, desc: "China"}
- {id: 4, cat: Movies, desc: "Korea"}
- {id: 2, cat: Movies, desc: "Hong Kong"}
- {id: 6, cat: Movies, desc: "Philippines"}
- {id: 7, cat: Movies, desc: "Taiwan"}
- {id: 8, cat: Movies, desc: "Thailand"}
- {id: 9, cat: Movies, desc: "Vietnam"}
- {id: 10, cat: Movies, desc: "Malaysia"}
- {id: 11, cat: Movies, desc: "Other Asian"}
- {id: 12, cat: Other, desc: "Miscellaneous"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: info_tpp
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
path: login
method: post
inputs:
apple: evil
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: p:contains("Error")
test:
path: index
selector: a[href="/logout"]
search:
paths:
- path: torrents/
inputs:
$raw: "{{ range .Categories }}countries[]={{.}}&{{end}}"
searchbox: "{{ .Keywords }}"
search: Search
golden: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
rows:
selector: table.torrenttable_helper > tbody > tr:has(img)
fields:
category:
selector: img[class^="cat-"]
attribute: class
case:
img.cat-anime: 1
img.cat-hk: 2
img.cat-japan: 3
img.cat-korea: 4
img.cat-china: 5
img.cat-phil: 6
img.cat-taiwan: 7
img.cat-thai: 8
img.cat-viet: 9
img.cat-malaysia: 10
img.cat-rest: 11
img.cat-misc: 12 # unconfirmed as there are currently no torrents for cat[12]
title:
selector: a[href^="/torrent/"]
details:
selector: a[href^="/torrent/"]
attribute: href
download:
selector: a[href^="/torrent/"]
attribute: href
filters:
- name: replace
args: ["torrent", "download"]
size:
selector: td:nth-last-child(6)
seeders:
selector: td:nth-last-child(5)
leechers:
selector: td:nth-last-child(4)
date:
selector: td:nth-last-child(3)
remove: p
filters:
- name: timeago
grabs:
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
img[src="../images/golden.gif"]: 0
img[src="../images/silver.gif"]: 0.5 # unconfirmed as there are currently no silver torrents
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 1.5
minimumseedtime:
# 45 days (as seconds = 45 x 24 x 60 x 60)
text: 3888000
# Engine n/a

View File

@@ -66,11 +66,11 @@ settings:
- name: info_grid
type: info
label: GRID view
default: This indexer does not support the GRID view on the torrent search page. Change the <b>GRID</b> setting to <b>OFF</b> on your account profile. If set to <i>ON</i> will cause no results to be returned.
default: This indexer does not support the GRID view on the torrent search page. Change the <b>Grid View</b> setting to <b>OFF</b> on your User Settings. If set to <i>ON</i> will cause no results to be returned.
- name: info_tpp
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile. The default is <i>25</i>.
default: For best results, change the <b>Torrents per page</b> setting to <b>100</b> on your User Settings. The default is <i>25</i>.
login:
path: login.php

View File

@@ -7,9 +7,8 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq121.com/
- https://torrentqq122.com/
legacylinks:
- https://torrentqq101.com/
- https://torrentqq102.com/
- https://torrentqq103.com/
- https://torrentqq104.com/
@@ -28,6 +27,7 @@ legacylinks:
- https://torrentqq118.com/
- https://torrentqq119.com/
- https://torrentqq120.com/
- https://torrentqq121.com/
caps:
categorymappings:

View File

@@ -0,0 +1,140 @@
---
id: torrentseeds-api
name: TorrentSeeds (API)
description: "TorrentSeeds is a Private Torrent Tracker for MOVIES / TV / MUSIC / GENERAL"
language: en-US
type: private
encoding: UTF-8
links:
- https://torrentseeds.org/
caps:
# dont forget to update the case block in the search fields category
categorymappings:
- {id: 1, cat: PC/0day, desc: "Apps"}
- {id: 5, cat: TV/Anime, desc: "Anime"}
- {id: 2, cat: PC/Games, desc: "Games"}
- {id: 3, cat: Movies, desc: "Movies"}
- {id: 4, cat: Audio, desc: "Music"}
- {id: 6, cat: XXX, desc: "Porn"}
- {id: 7, cat: TV/Sport, desc: "Sport"}
- {id: 3205, cat: TV, desc: "TV"}
- {id: 8, cat: TV, desc: "Packs"}
- {id: 3206, cat: TV/Foreign, desc: "TV/Foreign"}
- {id: 3207, cat: Movies/Foreign, desc: "Movies/Foreign"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tvdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
settings:
- name: apikey
type: text
label: APIKey
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://torrentseeds.org/\" target =_blank>TorrentSeeds</a> account <i>My Security</i> page and clicking on the <b>API Token</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: created_at
options:
created_at: created
seeders: seeders
size: size
name: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
search:
paths:
# https://hdinnovations.github.io/UNIT3D-Community-Edition-Docs/api_endpoints.html
# https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php
- path: "/api/torrents/filter?api_token={{ .Config.apikey }}&name={{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}{{ if .Query.TMDBID }}&tmdbId={{ .Query.TMDBID }}{{ else }}{{ end }}{{ if .Query.IMDBIDShort }}&imdbId={{ .Query.IMDBIDShort }}{{ else }}{{ end }}{{ if .Query.TVDBID }}&tvdbId={{ .Query.TVDBID }}{{ else }}{{ end }}&sortField={{ .Config.sort }}&sortDirection={{ .Config.type }}&perPage=100&page=1{{ range .Categories }}&categories[]={{.}}{{end}}{{ if .Config.freeleech }}&free=1{{ else }}{{ end }}"
response:
type: json
attribute: attributes
rows:
selector: data
count:
selector: meta.total
fields:
category:
selector: category
case:
"Apps": 1
"Games": 2
"Movies": 3
"Music": 4
"Anime": 5
"Porn": 6
"Sport": 7
"Packs": 8
"TV": 3205
"TV/Foreign": 3206
"Movies/Foreign": 3207
title:
selector: name
details:
selector: details_link
download:
selector: download_link
poster:
selector: poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
- name: replace
args: ["https://via.placeholder.com/400x600", ""]
imdbid:
selector: imdb_id
tmdbid:
selector: tmdb_id
tvdbid:
selector: tvdb_id
files:
selector: num_file
seeders:
selector: seeders
leechers:
selector: leechers
grabs:
selector: times_completed
date:
# 2021-10-18T00:34:50.000000Z"
selector: created_at
size:
selector: size
downloadvolumefactor:
# api returns 0=false, 1=true
selector: freeleech
case:
0: 1 # not free
1: 0 # freeleech
uploadvolumefactor:
# api returns 0=false, 1=true
selector: double_upload
case:
0: 1 # normal
1: 2 # double
# global MR is 0.5 but torrents must be seeded for 5 days regardless of ratio
# minimumratio:
# text: 0.5
minimumseedtime:
# 5 days (as seconds = 5 x 24 x 60 x 60)
text: 432000
# json UNIT3D 5.3.0

View File

@@ -7,10 +7,9 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentview47.com/
- https://torrentview49.com/
legacylinks:
- https://torrentview.net/
- https://torrentview26.com/
- https://torrentview27.com/
- https://torrentview28.com/
- https://torrentview29.com/
@@ -30,6 +29,7 @@ legacylinks:
- https://torrentview44.com/
- https://torrentview45.com/
- https://torrentview46.com/
- https://torrentview47.com/
caps:
categorymappings:

View File

@@ -7,10 +7,12 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentz2.club/
- https://torrentz2eu.me/ # often rotates between *.me and *.org
- https://torrentzeu.org/
- https://torrentz2.org.in/
- https://torrentz2.unblockninja.com/
legacylinks:
- https://torrentz2.club/
- https://torrentz2eu.me/
- https://torrentzeu.org/
caps:
# unfortunately torrentz2eu does not display categories anywhere in its search results page :-(

View File

@@ -12,6 +12,7 @@ caps:
categorymappings:
- {id: 39, cat: Books/EBook, desc: "E-book"}
- {id: 53, cat: XXX, desc: "Film (XXX)"}
- {id: 74, cat: TV/Anime, desc: "Film (Animáció cam)"}
- {id: 72, cat: TV/Anime, desc: "Film (Animáció)"}
- {id: 44, cat: Movies/SD, desc: "Film (Cam Hun)"}
- {id: 40, cat: Movies/DVD, desc: "Film (DVD Eng)"}

View File

@@ -22,7 +22,6 @@ namespace Jackett.Common.Indexers
[ExcludeFromCodeCoverage]
public class BJShare : BaseWebIndexer
{
private string LoginUrl => SiteLink + "login.php";
private string BrowseUrl => SiteLink + "torrents.php";
private string TodayUrl => SiteLink + "torrents.php?action=today";
private static readonly Regex _EpisodeRegex = new Regex(@"(?:[SsEe]\d{2,4}){1,2}");
@@ -32,7 +31,7 @@ namespace Jackett.Common.Indexers
"https://bj-share.me/"
};
private ConfigurationDataBasicLoginWithRSSAndDisplay ConfigData => (ConfigurationDataBasicLoginWithRSSAndDisplay)configData;
private new ConfigurationDataCookie configData => (ConfigurationDataCookie)base.configData;
@@ -90,7 +89,7 @@ namespace Jackett.Common.Indexers
logger: l,
p: ps,
cacheService: cs,
configData: new ConfigurationDataBasicLoginWithRSSAndDisplay())
configData: new ConfigurationDataCookie())
{
Encoding = Encoding.UTF8;
Language = "pt-BR";
@@ -123,20 +122,21 @@ namespace Jackett.Common.Indexers
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
var pairs = new Dictionary<string, string>
CookieHeader = configData.Cookie.Value;
try
{
{"username", ConfigData.Username.Value},
{"password", ConfigData.Password.Value},
{"keeplogged", "1"}
};
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
await ConfigureIfOK(
result.Cookies, result.ContentString?.Contains("logout.php") == true, () =>
{
var errorMessage = result.ContentString;
throw new ExceptionWithConfigData(errorMessage, ConfigData);
});
return IndexerConfigurationStatus.RequiresTesting;
var results = await PerformQuery(new TorznabQuery());
if (!results.Any())
throw new Exception("Found 0 results in the tracker");
IsConfigured = true;
SaveConfig();
return IndexerConfigurationStatus.Completed;
}
catch (Exception e)
{
IsConfigured = false;
throw new Exception("Your cookie did not work: " + e.Message);
}
}
private static string InternationalTitle(string title)
@@ -222,17 +222,14 @@ namespace Jackett.Common.Indexers
// until they or the source from where they get that info fix it...
if (IsAbsoluteNumbering(title))
{
title = Regex.Replace(title, @"(Ep[\.]?[ ]?)|([S]\d\d[Ee])", "");
title = Regex.Replace(title, @"(Ep[\.]?[ ]?)|([S]\d\d[Ee])", "E");
return title;
}
return title;
}
private bool IsSessionIsClosed(WebResult result)
{
return result.IsRedirect && result.RedirectingTo.Contains("login.php");
}
private bool IsSessionIsClosed(WebResult result) => result.IsRedirect && result.RedirectingTo.Contains("login.php");
private string FixSearchTerm(TorznabQuery query)
{
@@ -265,14 +262,16 @@ namespace Jackett.Common.Indexers
{"searchsubmit", "1"}
};
foreach (var cat in MapTorznabCapsToTrackers(query))
{
queryCollection.Add("filter_cat[" + cat + "]", "1");
}
searchUrl += "?" + queryCollection.GetQueryString();
var results = await RequestWithCookiesAsync(searchUrl);
if (IsSessionIsClosed(results))
{
// re-login
await ApplyConfiguration(null);
results = await RequestWithCookiesAsync(searchUrl);
throw new Exception("The user is not logged in. It is possible that the cookie has expired or you " +
"made a mistake when copying it. Please check the settings.");
}
try
@@ -436,9 +435,8 @@ namespace Jackett.Common.Indexers
var results = await RequestWithCookiesAsync(TodayUrl);
if (IsSessionIsClosed(results))
{
// re-login
await ApplyConfiguration(null);
results = await RequestWithCookiesAsync(TodayUrl);
throw new Exception("The user is not logged in. It is possible that the cookie has expired or you " +
"made a mistake when copying it. Please check the settings.");
}
try

View File

@@ -23,12 +23,16 @@ namespace Jackett.Common.Indexers
private new ConfigurationDataAPIKey configData => (ConfigurationDataAPIKey)base.configData;
public override string[] LegacySiteLinks { get; protected set; } = {
"https://danishbytes.org/"
};
public DanishBytes(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
ICacheService cs)
: base(id: "danishbytes",
name: "DanishBytes",
description: "DanishBytes is a Private Danish Tracker",
link: "https://danishbytes.org/",
link: "https://danishbytes.club/",
caps: new TorznabCapabilities
{
LimitsDefault = 25,

View File

@@ -99,7 +99,7 @@ namespace Jackett.Common.Indexers
private readonly string[] _voUrls = { "serie-vo", "serievo" };
public override string[] AlternativeSiteLinks { get; protected set; } = {
"https://atomixhq.one/",
"https://atomixhq.net/",
"https://pctmix1.unblockit.tv/"
};
@@ -125,7 +125,8 @@ namespace Jackett.Common.Indexers
"https://maxitorrent.com",
"https://pctmix1.unblockit.kim/",
"https://atomixhq.com/",
"https://pctmix1.unblockit.bz/"
"https://pctmix1.unblockit.bz/",
"https://atomixhq.one/"
};
public NewPCT(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
@@ -133,7 +134,7 @@ namespace Jackett.Common.Indexers
: base(id: "newpct",
name: "NewPCT",
description: "NewPCT - Descargar peliculas, series y estrenos torrent gratis",
link: "https://atomixhq.one/",
link: "https://atomixhq.net/",
caps: new TorznabCapabilities
{
TvSearchParams = new List<TvSearchParam>

View File

@@ -102,6 +102,7 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(1836, TorznabCatType.XXX, "Сайтрипы 2019 (HD Video) / SiteRip's 2019 (HD Video)");
AddCategoryMapping(1842, TorznabCatType.XXX, "Сайтрипы 2020 (HD Video) / SiteRip's 2020 (HD Video)");
AddCategoryMapping(1846, TorznabCatType.XXX, "Сайтрипы 2021 (HD Video) / SiteRip's 2021 (HD Video)");
AddCategoryMapping(1857, TorznabCatType.XXX, "Сайтрипы 2022 (HD Video) / SiteRip's 2022 (HD Video)");
AddCategoryMapping(1451, TorznabCatType.XXX, "Сайтрипы 1991-2010 / SiteRip's 1991-2010");
AddCategoryMapping(1788, TorznabCatType.XXX, "Сайтрипы 2011-2012 / SiteRip's 2011-2012");
AddCategoryMapping(1789, TorznabCatType.XXX, "Сайтрипы 2013 / SiteRip's 2013");
@@ -113,6 +114,7 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(1837, TorznabCatType.XXX, "Сайтрипы 2019 / SiteRip's 2019");
AddCategoryMapping(1843, TorznabCatType.XXX, "Сайтрипы 2020 / SiteRip's 2020");
AddCategoryMapping(1847, TorznabCatType.XXX, "Сайтрипы 2021 / SiteRip's 2021");
AddCategoryMapping(1856, TorznabCatType.XXX, "Сайтрипы 2022 / SiteRip's 2022");
AddCategoryMapping(1707, TorznabCatType.XXX, "Сцены из фильмов / Movie Scenes (кроме SiteRip)");
AddCategoryMapping(284, TorznabCatType.XXX, "Порноролики Разное / Clips (various)");
AddCategoryMapping(1853, TorznabCatType.XXX, "Компиляции и Музыкальные порно клипы / Compilations & Porn Music Video (PMV)");

View File

@@ -1,307 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
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 TorrentSeeds : BaseWebIndexer
{
private string LoginUrl => SiteLink + "takelogin.php";
private string CaptchaUrl => SiteLink + "simpleCaptcha.php?numImages=1";
private string SearchUrl => SiteLink + "browse_elastic.php";
private new ConfigurationDataBasicLoginWithRSSAndDisplay configData => (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData;
public TorrentSeeds(IIndexerConfigurationService configService, Utils.Clients.WebClient wc, Logger l,
IProtectionService ps, ICacheService cs)
: base(id: "torrentseeds",
name: "TorrentSeeds",
description: "TorrentSeeds is a Private site for MOVIES / TV / GENERAL",
link: "https://torrentseeds.org/",
caps: new TorznabCapabilities
{
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
},
MovieSearchParams = new List<MovieSearchParam>
{
MovieSearchParam.Q
},
MusicSearchParams = new List<MusicSearchParam>
{
MusicSearchParam.Q
},
BookSearchParams = new List<BookSearchParam>
{
BookSearchParam.Q
}
},
configService: configService,
client: wc,
logger: l,
p: ps,
cacheService: cs,
configData: new ConfigurationDataBasicLoginWithRSSAndDisplay("For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile."))
{
Encoding = Encoding.UTF8;
Language = "en-US";
Type = "private";
// NOTE: Tracker Category Description must match Type/Category in details page!
AddCategoryMapping(37, TorznabCatType.TVAnime, "Anime/HD");
AddCategoryMapping(9, TorznabCatType.TVAnime, "Anime/SD");
AddCategoryMapping(72, TorznabCatType.TVAnime, "Anime/UHD");
AddCategoryMapping(13, TorznabCatType.PC0day, "Apps/0DAY");
AddCategoryMapping(27, TorznabCatType.Books, "Apps/Bookware");
AddCategoryMapping(1, TorznabCatType.PCISO, "Apps/ISO");
AddCategoryMapping(73, TorznabCatType.AudioAudiobook, "Music/Audiobooks");
AddCategoryMapping(47, TorznabCatType.ConsoleOther, "Console/NSW");
AddCategoryMapping(8, TorznabCatType.ConsolePS3, "Console/PS3");
AddCategoryMapping(30, TorznabCatType.ConsolePS4, "Console/PS4");
AddCategoryMapping(71, TorznabCatType.ConsolePS4, "Console/PS5");
AddCategoryMapping(7, TorznabCatType.ConsolePSP, "Console/PSP");
AddCategoryMapping(70, TorznabCatType.ConsolePSVita, "Console/PSV");
AddCategoryMapping(16, TorznabCatType.ConsoleWii, "Console/WII");
AddCategoryMapping(29, TorznabCatType.ConsoleWiiU, "Console/WIIU");
AddCategoryMapping(17, TorznabCatType.ConsoleXBox360, "Console/XBOX360");
AddCategoryMapping(32, TorznabCatType.BooksEBook, "E-books");
AddCategoryMapping(63, TorznabCatType.ConsoleOther, "Games/DOX");
AddCategoryMapping(2, TorznabCatType.PCGames, "Games/ISO");
AddCategoryMapping(12, TorznabCatType.PCGames, "Games/PC Rips");
AddCategoryMapping(31, TorznabCatType.MoviesBluRay, "Movies/Bluray");
AddCategoryMapping(50, TorznabCatType.MoviesBluRay, "Movies/Bluray-UHD");
AddCategoryMapping(3, TorznabCatType.MoviesDVD, "Movies/DVDR");
AddCategoryMapping(69, TorznabCatType.MoviesForeign, "Movies/DVDR-Foreign");
AddCategoryMapping(19, TorznabCatType.MoviesHD, "Movies/HD");
AddCategoryMapping(39, TorznabCatType.MoviesForeign, "Movies/HD-Foreign");
AddCategoryMapping(74, TorznabCatType.MoviesHD, "Movies/Remuxes");
AddCategoryMapping(25, TorznabCatType.MoviesSD, "Movies/SD");
AddCategoryMapping(62, TorznabCatType.MoviesForeign, "Movies/SD-Foreign");
AddCategoryMapping(49, TorznabCatType.MoviesUHD, "Movies/UHD");
AddCategoryMapping(76, TorznabCatType.MoviesForeign, "Movies/UHD-Foreign");
AddCategoryMapping(33, TorznabCatType.AudioLossless, "Music/FLAC");
AddCategoryMapping(89, TorznabCatType.AudioVideo, "Music/MBluRay");
AddCategoryMapping(28, TorznabCatType.AudioVideo, "Music/MBluRay-Rips");
AddCategoryMapping(34, TorznabCatType.AudioVideo, "Music/MDVDR");
AddCategoryMapping(4, TorznabCatType.AudioMP3, "Music/MP3");
AddCategoryMapping(20, TorznabCatType.AudioVideo, "Music/MVID");
AddCategoryMapping(77, TorznabCatType.TVAnime, "Anime/Packs");
AddCategoryMapping(78, TorznabCatType.BooksEBook, "Books/Packs");
AddCategoryMapping(80, TorznabCatType.MoviesHD, "Movies/HD-Packs");
AddCategoryMapping(81, TorznabCatType.MoviesHD, "Movies/Remux-Packs");
AddCategoryMapping(79, TorznabCatType.MoviesSD, "Movies/SD-Packs");
AddCategoryMapping(68, TorznabCatType.Audio, "Music/Packs");
AddCategoryMapping(67, TorznabCatType.TVHD, "TV/HD-Packs");
AddCategoryMapping(82, TorznabCatType.TVHD, "TV/Remux-Packs");
AddCategoryMapping(65, TorznabCatType.TVSD, "TV/SD-Packs");
AddCategoryMapping(84, TorznabCatType.TVUHD, "TV/UHD-Packs");
AddCategoryMapping(85, TorznabCatType.XXX, "XXX/Packs");
AddCategoryMapping(23, TorznabCatType.TVSD, "TV/DVDR");
AddCategoryMapping(26, TorznabCatType.TVHD, "TV/HD");
AddCategoryMapping(64, TorznabCatType.TVForeign, "TV/HD-Foreign");
AddCategoryMapping(11, TorznabCatType.TVHD, "TV/HD-Retail");
AddCategoryMapping(36, TorznabCatType.TVSport, "TV/HD-Sport");
AddCategoryMapping(18, TorznabCatType.TVSD, "TV/SD");
AddCategoryMapping(86, TorznabCatType.TVForeign, "TV/SD-Foreign");
AddCategoryMapping(24, TorznabCatType.TVSD, "TV/SD-Retail");
AddCategoryMapping(35, TorznabCatType.TVSport, "TV/SD-Sport");
AddCategoryMapping(61, TorznabCatType.TVUHD, "TV/UHD");
AddCategoryMapping(87, TorznabCatType.TVForeign, "TV/UHD-Foreign");
AddCategoryMapping(53, TorznabCatType.XXX, "XXX/HD");
AddCategoryMapping(88, TorznabCatType.XXXImageSet, "XXX/Image-Sets");
AddCategoryMapping(57, TorznabCatType.XXX, "XXX/Paysite");
AddCategoryMapping(6, TorznabCatType.XXXSD, "XXX/SD");
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
CookieHeader = ""; // clear old cookies
var result1 = await RequestWithCookiesAsync(CaptchaUrl);
var json1 = JObject.Parse(result1.ContentString);
var captchaSelection = json1["images"][0]["hash"];
var pairs = new Dictionary<string, string> {
{ "username", configData.Username.Value },
{ "password", configData.Password.Value },
{ "submitme", "X" },
{ "captchaSelection", (string)captchaSelection }
};
var result2 = await RequestLoginAndFollowRedirect(LoginUrl, pairs, result1.Cookies, true, null, null, true);
await ConfigureIfOK(result2.Cookies, result2.ContentString.Contains("logout.php"), () =>
throw new ExceptionWithConfigData("Login Failed", configData));
return IndexerConfigurationStatus.RequiresTesting;
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
// remove operator characters
var cleanSearchString = Regex.Replace(query.GetQueryString().Trim(), "[ _.+-]+", " ", RegexOptions.Compiled);
var searchUrl = SearchUrl;
var queryCollection = new NameValueCollection
{
{ "search_in", "name" },
{ "search_mode", "all" },
{ "order_by", "added" },
{ "order_way", "desc" }
};
if (!string.IsNullOrWhiteSpace(cleanSearchString))
queryCollection.Add("query", cleanSearchString);
foreach (var cat in MapTorznabCapsToTrackers(query))
queryCollection.Add($"cat[{cat}]", "1");
searchUrl += "?" + queryCollection.GetQueryString();
var response = await RequestWithCookiesAndRetryAsync(searchUrl);
// handle cookie expiration
var results = response.ContentString;
if ((response.IsRedirect && response.RedirectingTo.Contains("/login.php?")) ||
(!response.IsRedirect && !results.Contains("/logout.php?")))
{
await ApplyConfiguration(null); // re-login
response = await RequestWithCookiesAndRetryAsync(searchUrl);
}
// handle single entries
if (response.IsRedirect)
{
var detailsLink = new Uri(response.RedirectingTo);
await FollowIfRedirect(response, accumulateCookies: true);
return ParseSingleResult(response, detailsLink);
}
return ParseMultiResult(response);
}
private List<ReleaseInfo> ParseSingleResult(WebResult response, Uri detailsLink)
{
var releases = new List<ReleaseInfo>();
var results = response.ContentString;
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results);
var content = dom.QuerySelector("tbody:has(script)");
if (content == null)
return releases; // no results
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 72 * 60 * 60;
var catStr = content.QuerySelector("tr:has(td.heading:contains(\"Type\"))").Children[1].TextContent;
release.Category = MapTrackerCatDescToNewznab(catStr);
var qLink = content.QuerySelector("tr:has(td.heading:contains(\"Download\"))")
.QuerySelector("a[href*=\"download.php?torrent=\"]");
release.Link = new Uri(SiteLink + qLink.GetAttribute("href"));
release.Title = dom.QuerySelector("h1").TextContent.Trim();
release.Details = detailsLink;
release.Guid = detailsLink;
var qSize = content.QuerySelector("tr:has(td.heading:contains(\"Size\"))").Children[1].TextContent
.Split('(')[0].Trim();
release.Size = ReleaseInfo.GetBytes(qSize);
var peerStats = content.QuerySelector("tr:has(td:has(a[href^=\"./peerlist_xbt.php?id=\"]))").Children[1]
.TextContent.Split(',');
var qSeeders = peerStats[0].Replace(" seeder(s)", "").Trim();
var qLeechers = peerStats[1].Split('=')[0].Replace(" leecher(s) ", "").Trim();
release.Seeders = ParseUtil.CoerceInt(qSeeders);
release.Peers = ParseUtil.CoerceInt(qLeechers) + release.Seeders;
var rawDateStr = content.QuerySelector("tr:has(td.heading:contains(\"Added\"))").Children[1].TextContent;
var dateUpped = DateTimeUtil.FromUnknown(rawDateStr.Replace(",", string.Empty));
// Mar 4 2020, 05:47 AM
release.PublishDate = dateUpped.ToLocalTime();
var qGrabs = content.QuerySelector("tr:has(td.heading:contains(\"Snatched\"))").Children[1];
release.Grabs = ParseUtil.CoerceInt(qGrabs.TextContent.Replace(" time(s)", ""));
var qFiles = content.QuerySelector("tr:has(td.heading:has(a[href^=\"./filelist.php?id=\"]))").Children[1];
release.Files = ParseUtil.CoerceInt(qFiles.TextContent.Replace(" files", ""));
var qRatio = content.QuerySelector("tr:has(td.heading:contains(\"Ratio After Download\"))").Children[1];
release.DownloadVolumeFactor = qRatio.QuerySelector("del") != null ? 0 : 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
catch (Exception ex)
{
OnParseError(results, ex);
}
return releases;
}
private List<ReleaseInfo> ParseMultiResult(WebResult response)
{
var releases = new List<ReleaseInfo>();
var results = response.ContentString;
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results);
var rows = dom.QuerySelectorAll("table.table-bordered > tbody > tr[class*=\"torrent_row_\"]");
foreach (var row in rows)
{
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 72 * 60 * 60;
var qCatLink = row.QuerySelector("a[href^=\"/browse_elastic.php?cat=\"]");
var catStr = qCatLink.GetAttribute("href").Split('=')[1];
release.Category = MapTrackerCatToNewznab(catStr);
var qDetailsLink = row.QuerySelector("a[href^=\"/details.php?id=\"]");
var qDetailsTitle = row.QuerySelector("td:has(a[href^=\"/details.php?id=\"]) b");
release.Title = qDetailsTitle.TextContent.Trim();
var qDlLink = row.QuerySelector("a[href^=\"/download.php?torrent=\"]");
release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href").TrimStart('/'));
release.Details = new Uri(SiteLink + qDetailsLink.GetAttribute("href").TrimStart('/'));
release.Guid = release.Details;
var qColumns = row.QuerySelectorAll("td");
release.Files = ParseUtil.CoerceInt(qColumns[3].TextContent);
release.PublishDate = DateTimeUtil.FromUnknown(qColumns[5].TextContent);
release.Size = ReleaseInfo.GetBytes(qColumns[6].TextContent);
release.Grabs = ParseUtil.CoerceInt(qColumns[7].TextContent.Replace("Times", ""));
release.Seeders = ParseUtil.CoerceInt(qColumns[8].TextContent);
release.Peers = ParseUtil.CoerceInt(qColumns[9].TextContent) + release.Seeders;
var qImdb = row.QuerySelector("a[href*=\"www.imdb.com\"]");
if (qImdb != null)
{
var deRefUrl = qImdb.GetAttribute("href");
release.Imdb = ParseUtil.GetImdbID(WebUtility.UrlDecode(deRefUrl).Split('/').Last());
}
release.DownloadVolumeFactor = row.QuerySelector("span.freeleech") != null ? 0 : 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(results, ex);
}
return releases;
}
}
}

View File

@@ -55,7 +55,7 @@ namespace Jackett.Test.Common.Indexers
Assert.AreEqual("magnet:?xt=urn:btih:d540fc48eb12f2833163eed6421d449dd8f1ce1f&dn=ubuntu-19.04-desktop-amd64.iso",
firstRelease.MagnetUri.ToString().Split(new[] { "&tr" }, StringSplitOptions.None).First());
Assert.AreEqual("d540fc48eb12f2833163eed6421d449dd8f1ce1f", firstRelease.InfoHash);
Assert.AreEqual(2019, firstRelease.PublishDate.Year);
Assert.AreEqual(2020, firstRelease.PublishDate.Year);
Assert.AreEqual(2097152000, firstRelease.Size);
Assert.AreEqual(12, firstRelease.Seeders);
Assert.AreEqual(13, firstRelease.Peers);

View File

@@ -262,11 +262,13 @@ namespace Jackett.Updater
"Definitions/academictorrents.yml",
"Definitions/alein.yml",
"Definitions/alexfilm.yml",
"Definitions/alleenretail.yml",
"Definitions/anidex.yml", // migrated to C#
"Definitions/aox.yml",
"Definitions/apollo.yml", // migrated to C# gazelle base tracker
"Definitions/archetorrent.yml",
"Definitions/asgaard.yml",
"Definitions/asiandvdclub.yml",
"Definitions/ast4u.yml", // renamed to animeworld #10578
"Definitions/asylumshare.yml",
"Definitions/audiobooktorrents.yml", // renamed to abtorrents