Compare commits

...

35 Commits

Author SHA1 Message Date
ilike2burnthing
5f8c2de953 kinorun: cat can be missing, pt2
a3225049e7 (r69619331)
2022-03-27 04:21:25 +01:00
ilike2burnthing
4963cacc07 torrentsir: change domain *52.com 2022-03-27 04:02:03 +01:00
ilike2burnthing
c95fb103fe xiteme: fix cat id 2022-03-27 03:24:32 +01:00
ilike2burnthing
a3225049e7 kinorun: cat can be missing 2022-03-27 03:06:20 +01:00
ilike2burnthing
3b87b862da lostfilm: update ignored expired certs 2022-03-27 03:03:43 +01:00
Garfield69
655262e76b cinecalidad: new domain 2022-03-27 11:26:50 +13:00
ilike2burnthing
47b6e1594f hidden-palace: change to *.net and unit3d. resolves #13042 2022-03-26 16:36:34 +00:00
Garfield69
d31e084f4f zetorrents: new domain *.bz -> *.nl 2022-03-26 15:45:58 +13:00
Garfield69
a3dfdc6aaf hdmonkey: new date layout 2022-03-26 15:45:35 +13:00
Garfield69
ce11beb6e1 xthor: drop andmatch #13083 2022-03-26 07:32:43 +13:00
Bright-W
4773e3bc4c Abnormal: fix size 0 issue (#13084) 2022-03-25 17:25:52 +13:00
Garfield69
e47d2b1961 torrentmasters: add new cat 2022-03-25 15:28:21 +13:00
Garfield69
319e196341 zooqle: cat can be missing 2022-03-25 15:18:08 +13:00
Garfield69
30fee2b231 torrentqq: bump domain 2022-03-25 15:17:49 +13:00
Garfield69
80d3f4c1a0 xthor: fix path. resolves #13083 2022-03-25 11:47:24 +13:00
Garfield69
aae061e7a9 bitbazis: lint 2022-03-25 07:39:13 +13:00
Garfield69
48ba07f500 add animeitalia an Italian private site. resolves #13082 2022-03-25 07:38:45 +13:00
Garfield69
144957821f dontorrent: new domain *.re -> *.wf 2022-03-24 06:40:59 +13:00
Garfield69
8d468be93a toros: removed. resolves #6497 2022-03-23 18:29:52 +13:00
Gauthier
97e8196edd tasmanit.es: re-Add certificate hash (#13079) 2022-03-23 15:45:52 +13:00
Bright-W
b5f457e06f torrentgalaxy : add imdbid search (#13078) 2022-03-23 15:24:12 +13:00
Garfield69
8b5ef12567 xthor: more fixes for a78a0e94d 2022-03-23 12:59:05 +13:00
Garfield69
674ddc09b8 xthor: more lint a78a0e94d 2022-03-23 09:57:22 +13:00
Garfield69
51d5eee095 xthor: lint a78a0e94d 2022-03-23 09:51:40 +13:00
Garfield69
a78a0e94d5 xthor: C# -> yml
credit: 45a61ab9b1
2022-03-23 09:43:11 +13:00
Garfield69
a4f7c7a826 hdonly: fix cat 2022-03-23 09:17:03 +13:00
Garfield69
c2b2d51875 zamundanet: incldead
credit: 73c9c0cb1e
2022-03-23 09:08:22 +13:00
Garfield69
6f761d1bc4 hidden-palace: add new cat 2022-03-22 16:36:05 +13:00
ilike2burnthing
ed8be733fc Revert "the-devils-lounge: invalid CA resolves #12552"
No longer using Plesk cert
2022-03-21 16:43:16 +00:00
Garfield69
5584438a94 tasmanit: expired CA 2022-03-21 19:40:30 +13:00
Garfield69
b68ba1b338 legacyhd: -> reelflix cleanup 2022-03-21 19:23:48 +13:00
Garfield69
d06272a26a hdcity: expired CA 2022-03-21 19:00:04 +13:00
Garfield69
6015da3e4c the-devils-lounge: invalid CA resolves #12552 2022-03-21 08:55:22 +13:00
Garfield69
4d3e2ba323 teamctgame: add 3x processing
and identify correct nexus version
2022-03-21 07:32:25 +13:00
ilike2burnthing
61578e8412 casatorrent: rename and update. resolves #13071 (#13072) 2022-03-20 17:58:39 +00:00
28 changed files with 718 additions and 1136 deletions

View File

@@ -139,7 +139,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Tokyo Tosho
* Torlock
* Torlook
* TOROS
* Torrent Downloads (TD)
* Torrent Oyun indir
* torrent.by
@@ -256,6 +255,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* AmigosShareClub
* anasch.cc
* AnimeBytes (AB)
* AnimeItalia
* AnimeTorrents (AnT) [![(invite needed)][inviteneeded]](#)
* AnimeWorld [![(invite needed)][inviteneeded]](#)
* Anthelion
@@ -302,7 +302,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Carp-Hunter
* Carpathians
* CartoonChaos (CC)
* CasaTorrent [![(invite needed)][inviteneeded]](#)
* Cathode-Ray.Tube (CRT)
* CCFBits [![(invite needed)][inviteneeded]](#)
* CeskeForum
@@ -529,6 +528,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Swarmazon
* Tapochek
* Tasmanit [![(invite needed)][inviteneeded]](#)
* Team CT Game (TCTG)
* TeamHD
* TeamOS
* TEKNO3D [![(invite needed)][inviteneeded]](#)

View File

@@ -0,0 +1,155 @@
---
id: animeitalia
name: AnimeItalia
description: "AnimeItalia is an ITALIAN Private Torrent Tracker for ANIME"
language: it-IT
type: private
encoding: UTF-8
links:
- https://animeitalia.org/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Film ITA"}
- {id: 2, cat: TV, desc: "Serie TV"}
- {id: 3, cat: Audio, desc: "Musica"}
- {id: 4, cat: Console, desc: "Giochi"}
- {id: 5, cat: PC, desc: "Programmi"}
- {id: 6, cat: TV/Anime, desc: "Anime SUB-ITA"}
- {id: 7, cat: TV/Anime, desc: "Anime ITA"}
- {id: 8, cat: Movies/Other, desc: "Film Anime SUB-ITA"}
- {id: 9, cat: Movies/Other, desc: "Film Anime ITA"}
- {id: 10, cat: Books/Comics, desc: "Manga ITA"}
- {id: 11, cat: Books/Comics, desc: "Manga ENG"}
- {id: 12, cat: Audio, desc: "Anime Music"}
- {id: 13, cat: Other, desc: "Foto Anime"}
- {id: 14, cat: XXX/Other, desc: "Hentai SUB-ITA"}
- {id: 15, cat: XXX/Other, desc: "Hentai ITA"}
- {id: 16, cat: XXX/ImageSet, desc: "Foto Hentai"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tvdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
book-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://animeitalia.org/\" target =_blank>AnimeItalia</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
login:
path: /api/torrents
method: get
inputs:
api_token: "{{ .Config.apikey }}"
error:
- selector: a[href*="/login"]
message:
text: "The API key was not accepted by {{ .Config.sitelink }}."
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"
response:
type: json
inputs:
# if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6
api_token: "{{ .Config.apikey }}"
name: "{{ .Keywords }}"
$raw: "{{ if .Query.Season }}&seasonNumber={{ .Query.Season }}{{ else }}{{ end }}{{ if .Query.Ep }}&episodeNumber={{ .Query.Ep }}{{ else }}{{ 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 }}{{ range .Categories }}&categories[]={{.}}{{end}}{{ if .Config.freeleech }}&free=1{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
page: 1
keywordsfilters:
- name: re_replace
args: ["\\.", " "]
rows:
selector: data
attribute: attributes
count:
selector: meta.total
fields:
categorydesc:
selector: category
title:
selector: name
details:
selector: details_link
download:
selector: download_link
poster:
selector: poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
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%, 25%, 50%, 75%, 100%
selector: freeleech
case:
0%: 1 # not free
25%: 0.75
50%: 0.5
75%: 0.25
100%: 0 # freeleech
"*": 0 # catch errors
uploadvolumefactor:
# api returns 0=false, 1=true
selector: double_upload
case:
0: 1 # normal
1: 2 # double
minimumratio:
text: 1.0
# json UNIT3D 6.0.4

View File

@@ -130,7 +130,7 @@ search:
size:
selector: td:nth-child(6)
date:
#2022<br>03/15.
# 2022<br>03/15.
selector: td:nth-child(7)
filters:
- name: append

View File

@@ -1,213 +0,0 @@
---
id: casatorrent
name: Casa-Torrent
description: "Casa-Torrent is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: fr-FR
type: private
encoding: UTF-8
links:
- https://tctg.in/
legacylinks:
- https://teamctgame.co/
- http://teamctgame.xyz/
- https://teamctgame.xyz/
caps:
categorymappings:
- {id: 65, cat: Movies/HD, desc: "BD: BD"}
- {id: 68, cat: Books/Mags, desc: "Ebooks: Presse"}
- {id: 90, cat: Audio/Audiobook, desc: "Ebooks: Audio books"}
- {id: 56, cat: Books/EBook, desc: "Ebooks: Ebooks"}
- {id: 95, cat: Books/Comics, desc: "Ebooks: Mangas"}
- {id: 84, cat: XXX, desc: "Ebooks: XXX"}
- {id: 54, cat: Movies/3D, desc: "Films: 3D"}
- {id: 53, cat: Movies/HD, desc: "Films: 4K"}
- {id: 77, cat: Movies/UHD, desc: "Films: 4K-HDR"}
- {id: 82, cat: Movies/UHD, desc: "Films: 4K-light"}
- {id: 50, cat: Movies/UHD, desc: "Films: 4K-Remux"}
- {id: 61, cat: Movies, desc: "Films: Animation"}
- {id: 48, cat: Movies/BluRay, desc: "Films: BDRip / BRRip"}
- {id: 78, cat: Movies/DVD, desc: "Films: DVD-R"}
- {id: 47, cat: Movies/DVD, desc: "Films: DVDRip"}
- {id: 71, cat: Movies/BluRay, desc: "Films: Full Bluray"}
- {id: 63, cat: Movies/HD, desc: "Films: HD TV"}
- {id: 52, cat: Movies/HD, desc: "Films: HD.1080p"}
- {id: 51, cat: Movies/HD, desc: "Films: HD.720p"}
- {id: 80, cat: Movies/HD, desc: "Films: HDLiGHT / M-HD"}
- {id: 87, cat: Movies/HD, desc: "Films: HDRiP"}
- {id: 60, cat: Movies, desc: "Films: Pack"}
- {id: 96, cat: Movies, desc: "Films: Remux"}
- {id: 75, cat: TV, desc: "Films: TVRiP"}
- {id: 98, cat: Movies, desc: "Films: VFSTFR"}
- {id: 89, cat: Movies, desc: "Films: VO"}
- {id: 55, cat: Movies, desc: "Films: VOSTFR"}
- {id: 58, cat: Movies/WEB-DL, desc: "Films: Web - DL"}
- {id: 57, cat: Movies/WEB-DL, desc: "Films: WebRip"}
- {id: 72, cat: Movies/HD, desc: "Films: x265"}
- {id: 1, cat: XXX, desc: "Films: XXX"}
- {id: 97, cat: Console, desc: "Jeux : Android"}
- {id: 81, cat: Console, desc: "Jeux : Consoles"}
- {id: 66, cat: PC/Games, desc: "Jeux: PC"}
- {id: 62, cat: PC/0day, desc: "Logiciels: Windows"}
- {id: 99, cat: Other, desc: "Logiciels: Graph / Wallpaper"}
- {id: 94, cat: TV/HD, desc: "Series: 4K HDR"}
- {id: 93, cat: TV/Anime, desc: "Series: Animés"}
- {id: 86, cat: TV/HD, desc: "Series: Episode HD"}
- {id: 101, cat: TV/HD, desc: "Series: Episode HD Vostfr"}
- {id: 85, cat: TV/SD, desc: "Series: Episode SD"}
- {id: 102, cat: TV/SD, desc: "Series: Episode SD Vostfr"}
- {id: 100, cat: TV/HD, desc: "Series: Tv - Pack HD"}
- {id: 103, cat: TV/HD, desc: "Series: Tv - Pack HD Vostfr"}
- {id: 59, cat: TV/SD, desc: "Series: Tv - Pack SD"}
- {id: 104, cat: TV/SD, desc: "Series: Tv - Pack SD Vostfr"}
- {id: 88, cat: TV, desc: "Spectacles: Tous"}
- {id: 83, cat: TV, desc: "TV: Emissions"}
- {id: 73, cat: TV/Documentary, desc: "TV: Documentaires"}
- {id: 74, cat: TV/Sport, desc: "TV: Sports"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
book-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: multilang
type: checkbox
label: Replace MULTI by another language in release name
default: false
- name: multilanguage
type: select
label: Replace MULTI by this language
default: FRENCH
options:
FRENCH: FRENCH
MULTI.FRENCH: MULTI.FRENCH
ENGLISH: ENGLISH
MULTI.ENGLISH: MULTI.ENGLISH
VOSTFR: VOSTFR
MULTI.VOSTFR: MULTI.VOSTFR
- name: vostfr
type: checkbox
label: Replace VOSTFR with ENGLISH
default: false
- name: sort
type: select
label: Sort requested from site
default: id
options:
id: created
seeders: seeders
size: size
name: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
login:
path: account-login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: p#msgError
test:
path: torrents-search.php
selector: a[href="account-logout.php"]
search:
paths:
- path: torrents-search.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 1
freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
keywordsfilters:
- name: re_replace
args: ["(\\w+)", " +$1"] # prepend + to each word
rows:
selector: table.ttable_headinner > tbody > tr.t-row
fields:
category:
selector: a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_phase1:
selector: a[href^="torrents-details.php?id="] b
title_multilang:
text: "{{ .Result.title_phase1 }}"
filters:
- name: re_replace
args: ["(?i)(\\smulti\\s)", " {{ .Config.multilanguage }} "]
title_phase2:
text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
title_vostfr:
text: "{{ .Result.title_phase2 }}"
filters:
- name: re_replace
args: ["(?i)(\\svostfr\\s)", " ENGLISH "]
- name: re_replace
args: ["(?i)(\\ssubfrench\\s)", " ENGLISH "]
title:
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
details:
selector: a[href^="torrents-details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
poster:
selector: img[src*="/uploads/images/"]
attribute: src
grabs:
selector: a[onmouseover][href^="torrents-details.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "Snatched: </b>(\\d+)<br"
size:
selector: td:nth-last-child(5)
seeders:
selector: td:nth-last-child(4)
leechers:
selector: td:nth-last-child(3)
date:
selector: a[onmouseover][href^="torrents-details.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "le: </b>(.*?)<br"
- name: append
args: " +01:00" # CET
- name: dateparse
args: "02-01-2006 -07:00"
downloadvolumefactor:
case:
img[src="images/free.gif"]: 0
"*": 1
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -5,6 +5,8 @@ description: "HDCity is a SPANISH site for HD content"
language: es-ES
type: private
encoding: ISO-8859-1
certificates:
- a10f2f7a863cd3fba9663185b0943cde01698451 # expired 25 October 2021
links:
- https://hdcity.li/

View File

@@ -132,13 +132,13 @@ search:
size:
selector: td:nth-child(4)
date:
# 19.Jul<br>2021<br>06:57
# 15.11.21<br>07:47
selector: td:nth-child(5)
filters:
- name: append
args: " +00:00" # auto adjusted by site account profile
- name: dateparse
args: "2.Jan200615:04 -07:00"
args: "2.01.0615:04 -07:00"
grabs:
selector: td:nth-child(7)
seeders:

View File

@@ -16,7 +16,7 @@ caps:
- {id: 5, cat: TV, desc: "Série"}
- {id: 6, cat: TV/Anime, desc: "Série anim"}
- {id: 7, cat: Movies/Other, desc: "Film d'animation"}
- {id: 7, cat: Audio/Video, desc: "Concert"}
- {id: 9, cat: Audio/Video, desc: "Concert"}
- {id: 11, cat: TV/Documentary, desc: "Documentaire"}
- {id: 13, cat: Movies/Other, desc: "Court-métrage"}
- {id: 14, cat: Movies/Other, desc: "Clip"}

View File

@@ -1,70 +1,33 @@
---
id: hidden-palace
name: Hidden-Palace
description: "Hidden-Palace is a Private torrent site for MOVIES / TV / GENERAL"
description: "Hidden-Palace is a Private torrent site for MOVIES / TV"
language: en-US
type: private
encoding: UTF-8
testlinktorrent: false
links:
- https://hidden-palace.net/
legacylinks:
- https://hidden-palace.xyz/
caps:
categorymappings:
- {id: 39, cat: Audio/Audiobook, desc: "Abook: Abook"}
- {id: 1, cat: PC/0day, desc: "Application: 0-Day"}
- {id: 2, cat: PC, desc: "Application: Pc"}
- {id: 3, cat: PC/Mac, desc: "Application: Mac"}
- {id: 38, cat: Books/EBook, desc: "Ebooks: Ebook"}
- {id: 32, cat: TV/Anime, desc: "Episodes: Anime"}
- {id: 33, cat: TV, desc: "Episodes: Classic"}
- {id: 34, cat: TV/Foreign, desc: "Episodes: Foreign"}
- {id: 35, cat: TV/HD, desc: "Episodes: TvHD"}
- {id: 36, cat: TV/SD, desc: "Episodes: TvSD"}
- {id: 37, cat: TV/Sport, desc: "Episodes: TVsports"}
- {id: 22, cat: PC/Games, desc: "Games: Pc"}
- {id: 23, cat: Console/PS4, desc: "Games: Ps4"}
- {id: 24, cat: Console/PS3, desc: "Games: Ps3"}
- {id: 25, cat: Console/PSP, desc: "Games: Ps1"}
- {id: 26, cat: Console/PSP, desc: "Games: Ps2"}
- {id: 27, cat: Console/PSP, desc: "Games: PsP"}
- {id: 28, cat: Console/XBox, desc: "Games: xbox"}
- {id: 29, cat: Console/Wii, desc: "Games: Wii"}
- {id: 30, cat: Console/NDS, desc: "Games: Nintendo"}
- {id: 31, cat: Console/Other, desc: "Games: Dreamcast"}
- {id: 4, cat: Movies/HD, desc: "Movies: 1080P"}
- {id: 5, cat: TV/Anime, desc: "Movies: Anime"}
- {id: 6, cat: Movies/DVD, desc: "Movies: DvdR"}
- {id: 7, cat: Movies/SD, desc: "Movies: Camer"}
- {id: 8, cat: Movies/3D, desc: "Movies: 3D"}
- {id: 9, cat: Movies/WEB-DL, desc: "Movies: WEBRip"}
- {id: 10, cat: XXX, desc: "Movies: XxX"}
- {id: 11, cat: Movies/UHD, desc: "Movies: Real-4K"}
- {id: 12, cat: Movies, desc: "Movies: Classic"}
- {id: 13, cat: Movies/Foreign, desc: "Movies: Foreign"}
- {id: 14, cat: Movies, desc: "Movies: Remux"}
- {id: 15, cat: Movies/HD, desc: "Movies: HD"}
- {id: 16, cat: Movies/SD, desc: "Movies: SD"}
- {id: 17, cat: Movies, desc: "Movies: Packs"}
- {id: 18, cat: Movies, desc: "Movies: Animation"}
- {id: 19, cat: Audio, desc: "Music: Audio"}
- {id: 20, cat: Audio, desc: "Music: Packs"}
- {id: 21, cat: Audio/Video, desc: "Music: Video"}
- {id: 1, cat: Movies, desc: "Movie"}
- {id: 2, cat: TV, desc: "TV"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
tv-search: [q, season, ep, imdbid, tvdbid]
movie-search: [q, imdbid, tmdbid]
settings:
- name: username
- name: apikey
type: text
label: Username
- name: password
type: password
label: Password
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://hidden-palace.net/\" target =_blank>Hidden-Palace</a> account <i>My Security</i> page and clicking on the <b>API Token</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
@@ -72,9 +35,9 @@ settings:
- name: sort
type: select
label: Sort requested from site
default: id
default: created_at
options:
id: created
created_at: created
seeders: seeders
size: size
name: title
@@ -87,102 +50,95 @@ settings:
asc: asc
login:
path: account-login.php
method: post
path: /api/torrents
method: get
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: /
api_token: "{{ .Config.apikey }}"
error:
- selector: div.my_block:contains("Access Denied")
test:
path: index.php
selector: a[href="account-logout.php"]
download:
before:
path: thanks.php
method: post
inputs:
torrent: "{{ .DownloadUri.Query.id }}"
selectors:
- selector: a[href^="download.php?id="]
attribute: href
- selector: a[href*="/login"]
message:
text: "The API key was not accepted by {{ .Config.sitelink }}."
search:
# https://hidden-palace.xyz/torrents.php?search=&cat=0&incldead=1&freeleech=0&lang=0
paths:
- path: torrents.php
# 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"
response:
type: json
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
cat: 0
# 0 active, 1 incldead, 2 onlydead
incldead: 1
# 0 all, 1 notfree, 2 onlyfree
freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
# 0 all, 1 English, 2 etc...
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
# does not support imdbid searching or display imdbid links.
# if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6
api_token: "{{ .Config.apikey }}"
name: "{{ .Keywords }}"
$raw: "{{ if .Query.Season }}&seasonNumber={{ .Query.Season }}{{ else }}{{ end }}{{ if .Query.Ep }}&episodeNumber={{ .Query.Ep }}{{ else }}{{ 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 }}{{ range .Categories }}&categories[]={{.}}{{end}}{{ if .Config.freeleech }}&free=1{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
page: 1
keywordsfilters:
- name: re_replace
args: ["(\\w+)", " +$1"] # prepend + to each word
args: ["\\.", " "]
rows:
selector: tr.t-row
selector: data
attribute: attributes
count:
selector: meta.total
fields:
category:
selector: td a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
categorydesc:
selector: category
title:
selector: td a[href^="torrents-details.php?id="]
selector: name
details:
selector: td a[href^="torrents-details.php?id="]
attribute: href
selector: details_link
download:
selector: td a[href^="torrents-details.php?id="]
attribute: href
selector: download_link
poster:
selector: td a[href^="torrents-details.php?id="]
attribute: onMouseover
selector: poster
filters:
- name: regexp
args: "img\\ssrc=\\\\'(http.+?)\\\\'"
- name: replace
args: ["themes/default/images/nocover.jpg", ""]
date:
selector: td a[href^="torrents-details.php?id="]
attribute: onmouseover
filters:
- name: regexp
args: "Date\\sAdded\\s:(\\d{2}-\\d{2}-\\d{4})"
- name: append
args: " +00:00" # auto adjusted by site account profile
- name: dateparse
args: "02-01-2006 -07:00"
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(8)
args: ["https://via.placeholder.com/90x135", ""]
imdbid:
selector: imdb_id
tmdbid:
selector: tmdb_id
tvdbid:
selector: tvdb_id
files:
selector: num_file
seeders:
selector: td:nth-child(6)
selector: seeders
leechers:
selector: td:nth-child(7)
selector: leechers
grabs:
selector: times_completed
date:
# 2021-10-18T00:34:50.000000Z"
selector: created_at
size:
selector: size
downloadvolumefactor:
text: 1
uploadvolumefactor:
# api returns 0%, 25%, 50%, 75%, 100%
selector: freeleech
case:
"font:contains(\"Doubleupload\")": 2
"*": 1
0%: 1 # not free
25%: 0.75
50%: 0.5
75%: 0.25
100%: 0 # freeleech
"*": 0 # catch errors
uploadvolumefactor:
# api returns 0=false, 1=true
selector: double_upload
case:
0: 1 # normal
1: 2 # double
minimumratio:
text: 1.0
minimumseedtime:
# 1 day (as seconds = 24 x 60 x 60)
# 1 day (as seconds = 1 x 24 x 60 x 60)
text: 86400
# FMEDition 3 (TorrentTrader)
# json UNIT3D 6.0.4

View File

@@ -116,6 +116,9 @@ search:
fields:
category:
text: 24
category|noappend:
optional: true
selector: a[href^="browse.php?cat="]
attribute: href
filters:

View File

@@ -9,6 +9,7 @@ links:
- https://tasmanit.es/
certificates:
- 23C30AC9655A8A7351A549538062B8C6B0D01A78 # expired 24 Jan 2022
- 4325e8f1f13f6074f2bed6a6186fe183791ab32d # expired 1 March 2022
caps:
categorymappings:

View File

@@ -0,0 +1,243 @@
---
id: teamctgame
name: Team CT Game
description: "Team CT Game (TCTG) is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: fr-FR
type: private
encoding: UTF-8
links:
- https://tctg.pm/
legacylinks:
- https://teamctgame.co/
- http://teamctgame.xyz/
- https://teamctgame.xyz/
- https://tctg.in/
caps:
categorymappings:
- {id: 409, cat: Books/Comics, desc: "BD"}
- {id: 410, cat: Books/Mags, desc: "Ebooks - Presse"}
- {id: 411, cat: Audio/Audiobook, desc: "Ebooks - Audiobooks"}
- {id: 412, cat: Books/EBook, desc: "Ebooks - Ebooks"}
- {id: 413, cat: Movies/3D, desc: "Films - 3D"}
- {id: 414, cat: Movies/HD, desc: "Films - 4K"}
- {id: 415, cat: Movies/UHD, desc: "Films - 4K HDR"}
- {id: 416, cat: Movies/UHD, desc: "Films - 4K Light"}
- {id: 417, cat: Movies/UHD, desc: "Films - 4K Remux"}
- {id: 418, cat: Movies, desc: "Films - Animation"}
- {id: 419, cat: Movies/BluRay, desc: "Films - BDRip / BRRip"}
- {id: 420, cat: Movies/DVD, desc: "Films - DVD-R"}
- {id: 421, cat: Movies/DVD, desc: "Films - DVDRip"}
- {id: 422, cat: Movies/BluRay, desc: "Films - Full Bluray"}
- {id: 423, cat: Movies/HD, desc: "Films - HDTV"}
- {id: 424, cat: Movies/HD, desc: "Films - HD 1080p"}
- {id: 425, cat: Movies/HD, desc: "Films - HD 720p"}
- {id: 426, cat: Movies/HD, desc: "Films - HDLiGHT / M-HD"}
- {id: 427, cat: Movies/HD, desc: "Films - HDRiP"}
- {id: 428, cat: Movies, desc: "Films - Pack"}
- {id: 429, cat: Movies, desc: "Films - Remux"}
- {id: 430, cat: TV, desc: "Films - TVRip"}
- {id: 431, cat: Movies, desc: "Films - VO"}
- {id: 432, cat: Movies, desc: "Films - VOSTFR"}
- {id: 433, cat: Movies/WEB-DL, desc: "Films - Web"}
- {id: 434, cat: Movies/HD, desc: "Films - x265"}
- {id: 436, cat: Console, desc: "Jeux - Consoles"}
- {id: 437, cat: PC/Games, desc: "Jeux - PC"}
- {id: 438, cat: PC/0day, desc: "Logiciels - Windows"}
- {id: 439, cat: Other, desc: "Logiciels - Graph / Wallpaper"}
- {id: 440, cat: TV/HD, desc: "Series - 4K HDR"}
- {id: 441, cat: TV/HD, desc: "Series TV - Pack HD"}
- {id: 442, cat: TV/HD, desc: "Series TV - Episode HD"}
- {id: 443, cat: TV/HD, desc: "Series TV - Pack HD VOSTFR"}
- {id: 444, cat: TV/HD, desc: "Series TV - Episode HD VOSTFR"}
- {id: 445, cat: TV/SD, desc: "Series TV - Pack SD"}
- {id: 446, cat: TV/SD, desc: "Series TV - Episode SD"}
- {id: 447, cat: TV/SD, desc: "Series TV - Pack SD VOSTFR"}
- {id: 448, cat: TV/SD, desc: "Series TV - Episode SD VOSTFR"}
- {id: 449, cat: TV/Anime, desc: "Series - Animés"}
- {id: 450, cat: TV, desc: "Spectacles - Tous"}
- {id: 451, cat: TV, desc: "TV - Emissions"}
- {id: 452, cat: TV/Documentary, desc: "TV - Documentaires"}
- {id: 453, cat: TV/Sport, desc: "TV - Sports"}
- {id: 435, cat: XXX, desc: "Films - XXX"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
book-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.
- name: multilang
type: checkbox
label: Replace MULTI by another language in release name
default: false
- name: multilanguage
type: select
label: Replace MULTI by this language
default: FRENCH
options:
FRENCH: FRENCH
MULTI.FRENCH: MULTI.FRENCH
ENGLISH: ENGLISH
MULTI.ENGLISH: MULTI.ENGLISH
VOSTFR: VOSTFR
MULTI.VOSTFR: MULTI.VOSTFR
- name: vostfr
type: checkbox
label: Replace VOSTFR with ENGLISH
default: false
- name: sort
type: select
label: Sort requested from site
default: 4
options:
4: created
7: seeders
5: size
1: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
logout: ""
securelogin: ""
error:
- selector: td.embedded:has(h2:contains("Erreur")) # invalid captcha
- selector: td.embedded:has(h2:contains("Échec")) # invalid uid or pwd
message:
selector: td.text
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
categories: ["!", 435]
- path: special.php
categories: [435]
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
# 0 incldead, 1 active, 2 dead
incldead: 0
# 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%
spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
inclbookmarked: 0
# 0 title, 1 descr, 3 uploader, 4 imdburl
search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}"
# 0 AND, 1 OR, 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table.torrents > tbody > tr:has(a[href^="download.php?id="])
fields:
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_phase1:
selector: a[href^="details.php?id="] b
title_multilang:
text: "{{ .Result.title_phase1 }}"
filters:
- name: re_replace
args: ["(?i)(\\smulti\\s)", " {{ .Config.multilanguage }} "]
title_phase2:
text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
title_vostfr:
text: "{{ .Result.title_phase2 }}"
filters:
- name: re_replace
args: ["(?i)(\\svostfr\\s)", " ENGLISH "]
- name: re_replace
args: ["(?i)(\\ssubfrench\\s)", " ENGLISH "]
title:
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
date_elapsed:
# time type: time elapsed (default)
selector: td:nth-child(4) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "2006-01-02 15:04:05 -07:00"
date_added:
# time added
selector: td:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
date:
text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}"
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: 0
img.pro_free2up: 0
img.pro_50pctdown: 0.5
img.pro_50pctdown2up: 0.5
img.pro_30pctdown: 0.3
"*": 1
uploadvolumefactor:
case:
img.pro_50pctdown2up: 2
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
minimumratio:
text: 1.0
# NexusPHP Standard v1.6 Beta 12

View File

@@ -1,118 +0,0 @@
---
id: toros
name: TOROS
description: "TOROS is a Public torrent index"
language: en-US
type: public
encoding: UTF-8
links:
- https://www.toros.co/
- https://toros.nocensor.biz/
legacylinks:
- https://toros.nocensor.space/
- https://toros.nocensor.work/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: Movies}
- {id: 2, cat: Audio, desc: Music}
- {id: 3, cat: TV, desc: Television}
- {id: 4, cat: PC/Games, desc: Games}
- {id: 5, cat: PC, desc: Software}
- {id: 6, cat: TV/Anime, desc: Anime}
- {id: 7, cat: XXX, desc: Adult}
- {id: 8, cat: Books, desc: Ebooks}
- {id: 9, cat: TV/Anime, desc: Animation}
- {id: 10, cat: Other, desc: Other}
- {id: 0, cat: Other, desc: TBC}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: sort
type: select
label: Sort requested from site
default: added
options:
added: created
seeds: seeders
size: size
name: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
download:
selectors:
- selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
# https://www.toros.co/all/torrents/capital-hill.html?v=&smi=&sma=&i=100&sort=added&o=desc
- path: "{{ if .Keywords }}all/torrents/{{ .Keywords }}.html?v=&smi=&sma=&i=100&sort={{ .Config.sort }}&o={{ .Config.type }}{{ else }}top100.html{{ end }}"
keywordsfilters:
- name: re_replace
args: ["[\\s]+", "-"]
- name: tolower
rows:
selector: table.table-responsive tr:has(a[href^="/torrent/"])
filters:
- name: andmatch
fields:
category:
selector: td:nth-child(1)
attribute: class
filters:
- name: regexp
args: (\d+)
title:
selector: a[href^="/torrent/"]
details:
selector: a[href^="/torrent/"]
attribute: href
download:
selector: a[href^="/torrent/"]
attribute: href
date_day:
selector: td:nth-child(2):contains("day")
optional: true
filters:
- name: fuzzytime
date_ago:
selector: td:nth-child(2):contains("ago")
optional: true
filters:
- name: timeago
date_year:
selector: td:nth-child(2):not(:contains("ago")):not(:contains("day"))
optional: true
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "2 Jan -07:00"
date:
text: "{{ if or .Result.date_year .Result.date_ago .Result.date_day }}{{ or .Result.date_year .Result.date_ago .Result.date_day }}{{ else }}now{{ end }}"
size:
selector: td:nth-child(3)
seeders:
selector: td:nth-child(4)
leechers:
selector: td:nth-child(5)
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -75,8 +75,8 @@ caps:
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
music-search: [q]
book-search: [q]
@@ -119,7 +119,7 @@ search:
path: torrents.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
@@ -157,6 +157,12 @@ search:
magnet:
selector: div a[href^="magnet:?"]
attribute: href
imdbid:
selector: a[href^="/torrents.php?search=tt"]
attribute: href
filters:
- name: regexp
args: tt(\d+)
size:
selector: div span[style^="border-radius"]
seeders:

View File

@@ -13,6 +13,7 @@ caps:
- {id: 92, cat: Books/EBook, desc: "e-Book (ENG)"}
- {id: 78, cat: Books/EBook, desc: "e-Book (HUN)"}
- {id: 80, cat: Other, desc: "Egyéb"}
- {id: 111, cat: Movies/SD, desc: "Film - Cam (HUN)"}
- {id: 85, cat: Movies/DVD, desc: "Film - DVD/9 (ENG)"}
- {id: 66, cat: Movies/DVD, desc: "Film - DVD/9 (HUN)"}
- {id: 84, cat: Movies/HD, desc: "Film - HD (ENG)"}
@@ -32,8 +33,8 @@ caps:
- {id: 97, cat: TV/HD, desc: "Sorozat - HD (HUN)"}
- {id: 86, cat: TV/SD, desc: "Sorozat - XviD (ENG)"}
- {id: 90, cat: TV/SD, desc: "Sorozat - XviD (HUN)"}
- {id: 98, cat: XXX/x264, desc: "XXX - HD"}
- {id: 99, cat: XXX/DVD, desc: "XXX - DVD"}
- {id: 98, cat: XXX/x264, desc: "XXX - HD"}
- {id: 76, cat: XXX/ImageSet, desc: "XXX - Képek"}
- {id: 69, cat: XXX/XviD, desc: "XXX - XviD"}
- {id: 70, cat: Audio, desc: "Zene - HUN"}

View File

@@ -7,9 +7,8 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq135.com/
- https://torrentqq136.com/
legacylinks:
- https://torrentqq119.com/
- https://torrentqq120.com/
- https://torrentqq121.com/
- https://torrentqq122.com/
@@ -24,6 +23,7 @@ legacylinks:
- https://torrentqq132.com/
- https://torrentqq133.com/
- https://torrentqq134.com/
- https://torrentqq135.com/
caps:
categorymappings:

View File

@@ -7,7 +7,7 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentsir51.com/
- https://torrentsir52.com/
legacylinks:
- https://torrentsir36.com/
- https://torrentsir37.com/
@@ -24,6 +24,7 @@ legacylinks:
- https://torrentsir48.com/
- https://torrentsir49.com/
- https://torrentsir50.com/
- https://torrentsir51.com/
caps:
categorymappings:

View File

@@ -27,7 +27,7 @@ caps:
- {id: 6300, cat: TV/Anime, desc: "Animations - Hentai"}
- {id: 6900, cat: TV/Anime, desc: "Animations - Other"}
- {id: 6120, cat: TV/Anime, desc: "Animations - Shoujo Ai"}
- {id: 6330, cat: TV/Anime, desc: "Animations - Shounen Ai"}
- {id: 6130, cat: TV/Anime, desc: "Animations - Shounen Ai"}
- {id: 6320, cat: TV/Anime, desc: "Animations - Yaoi"}
- {id: 6310, cat: TV/Anime, desc: "Animations - Yuri"}
- {id: 14000, cat: PC, desc: "Applications - All"}

View File

@@ -0,0 +1,192 @@
---
id: xthor-api
name: Xthor (API)
description: "General French Private Tracker"
language: fr-FR
type: private
encoding: windows-1252
requestDelay: 2.5
links:
- https://xthor.tk/
legacylinks:
- https://xthor.bz/
- https://xthor.to/
caps:
categorymappings:
# Movies / Films
- {id: 118, cat: Movies/BluRay, desc: "Films/2160p/Bluray"}
- {id: 119, cat: Movies/UHD, desc: "Films/2160p/Remux"}
- {id: 107, cat: Movies/UHD, desc: "Films/2160p/x265"}
- {id: 1, cat: Movies/BluRay, desc: "Films/1080p/BluRay"}
- {id: 2, cat: Movies/HD, desc: "Films/1080p/Remux"}
- {id: 100, cat: Movies/HD, desc: "Films/1080p/x265"}
- {id: 4, cat: Movies/HD, desc: "Films/1080p/x264"}
- {id: 5, cat: Movies/HD, desc: "Films/720p/x264"}
- {id: 7, cat: Movies/SD, desc: "Films/SD/x264"}
- {id: 3, cat: Movies/3D, desc: "Films/3D"}
- {id: 6, cat: Movies/SD, desc: "Films/XviD"}
- {id: 8, cat: Movies/DVD, desc: "Films/DVD"}
- {id: 122, cat: Movies/HD, desc: "Films/HDTV"}
- {id: 94, cat: Movies/WEB-DL, desc: "Films/WEBDL"}
- {id: 95, cat: Movies/WEB-DL, desc: "Films/WEBRiP"}
- {id: 12, cat: TV/Documentary, desc: "Films/Documentaire"}
- {id: 31, cat: Movies/Other, desc: "Films/Animation"}
- {id: 33, cat: Movies/Other, desc: "Films/Spectacle"}
- {id: 125, cat: TV/Sport, desc: "Films/Sports"}
- {id: 20, cat: Audio/Video, desc: "Films/Concerts, Clips"}
- {id: 9, cat: Movies/Other, desc: "Films/VOSTFR"}
# TV Series / Series TV
- {id: 104, cat: TV/Other, desc: "Series/BluRay"}
- {id: 13, cat: TV, desc: "Series/Pack VF"}
- {id: 15, cat: TV/HD, desc: "Series/HD VF"}
- {id: 14, cat: TV/SD, desc: "Series/SD VF"}
- {id: 98, cat: TV/Other, desc: "Series/Pack VOSTFR"}
- {id: 17, cat: TV/HD, desc: "Series/HD VOSTFR"}
- {id: 16, cat: TV/SD, desc: "Series/SD VOSTFR"}
- {id: 101, cat: TV/Anime, desc: "Series/Packs Anime"}
- {id: 32, cat: TV/Anime, desc: "Series/Animes"}
- {id: 110, cat: TV/Anime, desc: "Series/Anime VOSTFR"}
- {id: 123, cat: TV/Other, desc: "Series/Animation"}
- {id: 109, cat: TV/Documentary, desc: "Series/DOC"}
- {id: 34, cat: TV/Sport, desc: "Series/Sport"}
- {id: 30, cat: TV/Other, desc: "Series/Emission TV"}
# Porn / XxX
- {id: 36, cat: XXX, desc: "MISC/XxX/Films"}
- {id: 105, cat: XXX, desc: "MISC/XxX/Séries"}
- {id: 114, cat: XXX, desc: "MISC/XxX/Lesbiennes"}
- {id: 115, cat: XXX, desc: "MISC/XxX/Gays"}
- {id: 113, cat: XXX, desc: "MISC/XxX/Hentai"}
- {id: 120, cat: XXX, desc: "MISC/XxX/Magazines"}
# Books / Livres
- {id: 24, cat: Books/EBook, desc: "Livres/Romans"}
- {id: 124, cat: Audio/Audiobook, desc: "Livres/Audio Books"}
- {id: 96, cat: Books/Mags, desc: "Livres/Magazines"}
- {id: 99, cat: Books/Other, desc: "Livres/Bandes dessinées"}
- {id: 116, cat: Books/EBook, desc: "Livres/Romans Jeunesse"}
- {id: 102, cat: Books/Comics, desc: "Livres/Comics"}
- {id: 103, cat: Books/Other, desc: "Livres/Mangas"}
# Softwares / Logiciels
- {id: 25, cat: PC/Games, desc: "Logiciels/Jeux PC"}
- {id: 27, cat: Console/PS3, desc: "Logiciels/Playstation"}
- {id: 111, cat: PC/Mac, desc: "Logiciels/Jeux MAC"}
- {id: 26, cat: Console/XBox 360, desc: "Logiciels/XboX"}
- {id: 112, cat: PC, desc: "Logiciels/Jeux Linux"}
- {id: 28, cat: Console/Wii, desc: "Logiciels/Nintendo"}
- {id: 29, cat: Console/NDS, desc: "Logiciels/NDS"}
- {id: 117, cat: PC, desc: "Logiciels/ROM"}
- {id: 21, cat: PC, desc: "Logiciels/Applis PC"}
- {id: 22, cat: PC/Mac, desc: "Logiciels/Applis Mac"}
- {id: 23, cat: PC/Mobile-Android, desc: "Logiciels/Smartphone"}
modes:
search: [q]
movie-search: [q, tmdbid]
tv-search: [q, season, ep]
book-search: [q]
settings:
- name: passkey
type: text
label: Passkey
- name: info_key
type: info
label: About your Passkey
default: "Find your Passkey on <a href=\"https://xthor.tk/api_doc.php\" target =_blank>Xthor > API page</a>."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: multilanguage
type: text
label: Replace MULTI by
default: MULTI
- name: subfrench
type: text
label: Replace "VOSTFR/SUBFRENCH" by
default: ""
search:
paths:
# https://api.xthor.tk/?passkey=<redacted>&search=&category=&freeleech=&tmdbid=&size=&accent=&price=&page=
- path: "https://api.xthor.tk/"
inputs:
passkey: "{{ .Config.passkey }}"
category: "{{ if .Categories }}{{ range .Categories }}{{.}}+{{end}}{{ else }}{{ end }}"
search: "{{ if .Query.TMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
tmdbid: "{{ .Query.TMDBID }}"
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
response:
type: json
rows:
selector: torrents
# jackett yml json does not currently support andmatch #13083
# filters:
# - name: andmatch
fields:
id:
selector: id
category:
selector: category
title_original:
selector: name
title_multi:
text: "{{ .Result.title_original }}"
filters:
- name: re_replace
args: ["(?i)[\\.\\s\\[\\-]multi[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
title_multi_out:
text: "{{ if .Config.multilanguage }}{{ .Result.title_multi }}{{ else }}{{ .Result.title_original }}{{ end }}"
title_vostfr:
text: "{{ .Result.title_multi_out }}"
filters:
- name: re_replace
args: ["(?i)[\\.\\s\\[\\-]vostfr[\\.\\s\\]\\-]", ".{{ .Config.subfrench }}."]
- name: re_replace
args: ["(?i)[\\.\\s\\[\\-]subfrench[\\.\\s\\]\\-]", ".{{ .Config.subfrench }}."]
title:
text: "{{ if .Config.subfrench }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_multi_out }}{{ end }}"
details:
text: "{{ .Config.sitelink }}details.php?id={{ .Result.id }}"
download:
selector: download_link
poster:
selector: descr
filters:
- name: regexp
args: ["({{ .Config.sitelink }}info_images\\/allocine\\/covers\\/film\\/small_\\d+?\\.jpg)"]
tmdbid:
selector: tmdb_id
files:
selector: numfiles
date:
selector: added
size:
selector: size
seeders:
selector: seeders
leechers:
selector: leechers
grabs:
selector: times_completed
downloadvolumefactor:
# api returns 0=false, 1=true
selector: freeleech
case:
0: 1 # not free
1: 0 # freeleech
uploadvolumefactor:
text: 1
minimumseedtime:
# 24 hours (as seconds = 1 x 24 x 60 x 60)
text: 86400
minimumratio:
# minimum ratio per torrent is 0.8
text: 0.8
# json api

View File

@@ -120,7 +120,8 @@ search:
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 1
# blank = incldead
incldead: ""
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"

View File

@@ -6,7 +6,7 @@ language: fr-FR
type: public
encoding: UTF-8
links:
- https://www.zetorrents.bz/
- https://www.zetorrents.nl/
legacylinks:
- https://www.zetorrents.co/
- https://www.zetorrents.io/
@@ -18,6 +18,7 @@ legacylinks:
- https://wvw.zetorrents.org/
- https://www.zetorrents.cc/
- https://www.zetorrents.tv/
- https://www.zetorrents.bz/
caps:
categories:

View File

@@ -83,6 +83,10 @@ search:
title:
selector: td:nth-child(2) a
category:
text: other
category|noappend:
# cat may be missing
optional: true
selector: td:nth-child(2) > i
attribute: class
filters:

View File

@@ -252,7 +252,7 @@ namespace Jackett.Common.Indexers
var completed = torrent.QuerySelector("td:nth-of-type(3)").TextContent; // Completed
var seeders = torrent.QuerySelector("td.text-green").TextContent; // Seeders
var leechers = torrent.QuerySelector("td.text-red").TextContent; // Leechers
var size = torrent.QuerySelector("td:nth-of-type(5)").TextContent; // Size
var size = torrent.QuerySelector("td:nth-of-type(6)").TextContent; // Size
var release = new ReleaseInfo
{

View File

@@ -33,6 +33,7 @@ namespace Jackett.Common.Indexers
"https://cinecalidad.unbl0ck.xyz/",
"https://cinecalidad.u4m.club/",
"https://cinecalidad.mrunblock.icu/",
"https://www.cinecalidad.lat/",
"https://www.cine-calidad.com/"
};
@@ -41,7 +42,7 @@ namespace Jackett.Common.Indexers
: base(id: "cinecalidad",
name: "Cinecalidad",
description: "Películas Full HD en Latino Dual.",
link: "https://www.cinecalidad.lat/",
link: "https://cinecalidad3.com/",
caps: new TorznabCapabilities
{
MovieSearchParams = new List<MovieSearchParam> { MovieSearchParam.Q }

View File

@@ -39,7 +39,7 @@ namespace Jackett.Common.Indexers
private const string SearchUrl = "buscar/";
public override string[] AlternativeSiteLinks { get; protected set; } = {
"https://dontorrent.re/",
"https://dontorrent.wf/",
"https://todotorrents.net/",
"https://tomadivx.net/",
"https://seriesblanco.one/",
@@ -55,6 +55,7 @@ namespace Jackett.Common.Indexers
"https://dontorrent.li/",
"https://dontorrent.top/",
"https://dontorrent.pm/",
"https://dontorrent.re/",
"https://dontorrent.eu/"
};
@@ -73,7 +74,7 @@ namespace Jackett.Common.Indexers
: base(id: "dontorrent",
name: "DonTorrent",
description: "DonTorrent is a SPANISH public tracker for MOVIES / TV / GENERAL",
link: "https://dontorrent.re/",
link: "https://dontorrent.wf/",
caps: new TorznabCapabilities
{
TvSearchParams = new List<TvSearchParam>

View File

@@ -132,7 +132,7 @@ namespace Jackett.Common.Indexers
Language = "ru-RU";
Type = "semi-private";
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "25234600906DF82792DE9F4AA75A5AED2F226577"); // for *.run expired 07/Jun/21
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "98D43B6E740B42C02A9BD1A9D1A813E4350BE332"); // for *.win expired 26/Mar/22
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "34287FB53A58EC6AE590E7DD7E03C70C0263CADC"); // for *.tw expired 01/Apr/21
// TODO: review if there is only this category (movie search is enabled)

View File

@@ -1,659 +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 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;
using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebRequest = Jackett.Common.Utils.Clients.WebRequest;
namespace Jackett.Common.Indexers
{
[ExcludeFromCodeCoverage]
public class Xthor : BaseCachingWebIndexer
{
private static string ApiEndpoint => "https://api.xthor.tk/";
private int MaxPagesHardLimit => 4;
private string TorrentDetailsUrl => SiteLink + "details.php?id={id}";
private string WebRequestDelay => ((SingleSelectConfigurationItem)configData.GetDynamic("webRequestDelay")).Value;
private int MaxPages => Convert.ToInt32(((SingleSelectConfigurationItem)configData.GetDynamic("maxPages")).Value);
private bool MaxPagesBypassForTMDB => ((BoolConfigurationItem)configData.GetDynamic("maxPagesBypassForTMDB")).Value;
private int DropCategories => Convert.ToInt32(((SingleSelectConfigurationItem)configData.GetDynamic("dropCategories")).Value);
private string MultiReplacement => ((StringConfigurationItem)configData.GetDynamic("multiReplacement")).Value;
private bool SubReplacement => ((BoolConfigurationItem)configData.GetDynamic("subReplacement")).Value;
private bool EnhancedAnimeSearch => ((BoolConfigurationItem)configData.GetDynamic("enhancedAnimeSearch")).Value;
private string SpecificLanguageAccent => ((SingleSelectConfigurationItem)configData.GetDynamic("specificLanguageAccent")).Value;
private bool FreeleechOnly => ((BoolConfigurationItem)configData.GetDynamic("freeleechOnly")).Value;
public override string[] LegacySiteLinks { get; protected set; } = {
"https://xthor.bz/",
"https://xthor.to"
};
private ConfigurationDataPasskey ConfigData => (ConfigurationDataPasskey)configData;
public Xthor(IIndexerConfigurationService configService, Utils.Clients.WebClient w, Logger l,
IProtectionService ps, ICacheService cs)
: base(id: "xthor-api",
name: "Xthor API",
description: "General French Private Tracker",
link: "https://xthor.tk/",
caps: new TorznabCapabilities
{
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
},
MovieSearchParams = new List<MovieSearchParam>
{
MovieSearchParam.Q, MovieSearchParam.TmdbId
},
MusicSearchParams = new List<MusicSearchParam>
{
MusicSearchParam.Q
},
BookSearchParams = new List<BookSearchParam>
{
BookSearchParam.Q
}
},
configService: configService,
client: w,
logger: l,
p: ps,
cacheService: cs,
downloadBase: "https://xthor.tk/download.php?torrent=",
configData: new ConfigurationDataPasskey()
)
{
Encoding = Encoding.UTF8;
Language = "fr-FR";
Type = "private";
// Movies / Films
AddCategoryMapping(118, TorznabCatType.MoviesBluRay, "Films 2160p/Bluray");
AddCategoryMapping(119, TorznabCatType.MoviesBluRay, "Films 2160p/Remux");
AddCategoryMapping(107, TorznabCatType.MoviesUHD, "Films 2160p/x265");
AddCategoryMapping(1, TorznabCatType.MoviesBluRay, "Films 1080p/BluRay");
AddCategoryMapping(2, TorznabCatType.MoviesBluRay, "Films 1080p/Remux");
AddCategoryMapping(100, TorznabCatType.MoviesHD, "Films 1080p/x265");
AddCategoryMapping(4, TorznabCatType.MoviesHD, "Films 1080p/x264");
AddCategoryMapping(5, TorznabCatType.MoviesHD, "Films 720p/x264");
AddCategoryMapping(7, TorznabCatType.MoviesSD, "Films SD/x264");
AddCategoryMapping(3, TorznabCatType.Movies3D, "Films 3D");
AddCategoryMapping(6, TorznabCatType.MoviesSD, "Films XviD");
AddCategoryMapping(8, TorznabCatType.MoviesDVD, "Films DVD");
AddCategoryMapping(122, TorznabCatType.MoviesHD, "Films HDTV");
AddCategoryMapping(94, TorznabCatType.MoviesWEBDL, "Films WEBDL");
AddCategoryMapping(95, TorznabCatType.MoviesWEBDL, "Films WEBRiP");
AddCategoryMapping(12, TorznabCatType.TVDocumentary, "Films Documentaire");
AddCategoryMapping(31, TorznabCatType.MoviesOther, "Films Animation");
AddCategoryMapping(33, TorznabCatType.MoviesOther, "Films Spectacle");
AddCategoryMapping(125, TorznabCatType.TVSport, "Films Sports");
AddCategoryMapping(20, TorznabCatType.AudioVideo, "Films Concerts, Clips");
AddCategoryMapping(9, TorznabCatType.MoviesOther, "Films VOSTFR");
// TV / Series
AddCategoryMapping(104, TorznabCatType.TVOther, "Series BluRay");
AddCategoryMapping(13, TorznabCatType.TVOther, "Series Pack VF");
AddCategoryMapping(15, TorznabCatType.TVHD, "Series HD VF");
AddCategoryMapping(14, TorznabCatType.TVSD, "Series SD VF");
AddCategoryMapping(98, TorznabCatType.TVOther, "Series Pack VOSTFR");
AddCategoryMapping(17, TorznabCatType.TVHD, "Series HD VOSTFR");
AddCategoryMapping(16, TorznabCatType.TVSD, "Series SD VOSTFR");
AddCategoryMapping(101, TorznabCatType.TVAnime, "Series Packs Anime");
AddCategoryMapping(32, TorznabCatType.TVAnime, "Series Animes");
AddCategoryMapping(110, TorznabCatType.TVAnime, "Series Anime VOSTFR");
AddCategoryMapping(123, TorznabCatType.TVOther, "Series Animation");
AddCategoryMapping(109, TorznabCatType.TVDocumentary, "Series DOC");
AddCategoryMapping(34, TorznabCatType.TVOther, "Series Sport");
AddCategoryMapping(30, TorznabCatType.TVOther, "Series Emission TV");
// XxX / MISC
AddCategoryMapping(36, TorznabCatType.XXX, "MISC XxX/Films");
AddCategoryMapping(105, TorznabCatType.XXX, "MISC XxX/Séries");
AddCategoryMapping(114, TorznabCatType.XXX, "MISC XxX/Lesbiennes");
AddCategoryMapping(115, TorznabCatType.XXX, "MISC XxX/Gays");
AddCategoryMapping(113, TorznabCatType.XXX, "MISC XxX/Hentai");
AddCategoryMapping(120, TorznabCatType.XXX, "MISC XxX/Magazines");
// Books / Livres
AddCategoryMapping(24, TorznabCatType.BooksEBook, "Livres Romans");
AddCategoryMapping(124, TorznabCatType.AudioAudiobook, "Livres Audio Books");
AddCategoryMapping(96, TorznabCatType.BooksMags, "Livres Magazines");
AddCategoryMapping(99, TorznabCatType.BooksOther, "Livres Bandes dessinées");
AddCategoryMapping(116, TorznabCatType.BooksEBook, "Livres Romans Jeunesse");
AddCategoryMapping(102, TorznabCatType.BooksComics, "Livres Comics");
AddCategoryMapping(103, TorznabCatType.BooksOther, "Livres Mangas");
// SOFTWARE / Logiciels
AddCategoryMapping(25, TorznabCatType.PCGames, "Logiciels Jeux PC");
AddCategoryMapping(27, TorznabCatType.ConsolePS3, "Logiciels Playstation");
AddCategoryMapping(111, TorznabCatType.PCMac, "Logiciels Jeux MAC");
AddCategoryMapping(26, TorznabCatType.ConsoleXBox360, "Logiciels XboX");
AddCategoryMapping(112, TorznabCatType.PC, "Logiciels Jeux Linux");
AddCategoryMapping(28, TorznabCatType.ConsoleWii, "Logiciels Nintendo");
AddCategoryMapping(29, TorznabCatType.ConsoleNDS, "Logiciels NDS");
AddCategoryMapping(117, TorznabCatType.PC, "Logiciels ROM");
AddCategoryMapping(21, TorznabCatType.PC, "Logiciels Applis PC");
AddCategoryMapping(22, TorznabCatType.PCMac, "Logiciels Applis Mac");
AddCategoryMapping(23, TorznabCatType.PCMobileAndroid, "Logiciels Smartphone");
// Dynamic Configuration
ConfigData.AddDynamic("optionsConfigurationWarning", new DisplayInfoConfigurationItem(string.Empty, "<center><b>Available Options</b></center>,<br /><br /> <ul><li><b>Freeleech Only</b>: (<i>Restrictive</i>) If you want to discover only freeleech torrents to not impact your ratio, check the related box. So only torrents marked as freeleech will be returned instead of all.</li><br /><li><b>Specific Language</b>: (<i>Restrictive</i>) You can scope your searches with a specific language / accent.</li></ul>"));
var ConfigFreeleechOnly = new BoolConfigurationItem("Do you want to discover only freeleech tagged torrents ?");
ConfigData.AddDynamic("freeleechOnly", ConfigFreeleechOnly);
var ConfigSpecificLanguageAccent = new SingleSelectConfigurationItem("Do you want to scope your searches with a specific language ? (Accent)", new Dictionary<string, string>
{
{"0", "All Voices (default)"},
{"1", "Françaises"},
{"2", "Quebecoises"},
{"47", "Françaises et Québécoises"},
{"3", "Anglaises"},
{"4", "Japonaises"},
{"5", "Espagnoles"},
{"6", "Allemandes"},
{"7", "Chinoises"},
{"8", "Italiennes"},
{"9", "Coréennes"},
{"10", "Danoises"},
{"11", "Russes"},
{"12", "Portugaises"},
{"13", "Hindi"},
{"14", "Hollandaises"},
{"15", "Suédoises"},
{"16", "Norvégiennes"},
{"17", "Thaïlandaises"},
{"18", "Hébreu"},
{"19", "Persanes"},
{"20", "Arabes"},
{"21", "Turques"},
{"22", "Hongroises"},
{"23", "Polonaises"},
{"24", "Finnoises"},
{"25", "Indonésiennes"},
{"26", "Roumaines"},
{"27", "Malaisiennes"},
{"28", "Estoniennes"},
{"29", "Islandaises"},
{"30", "Grecques"},
{"31", "Serbes"},
{"32", "Norvégiennes"},
{"33", "Ukrainiennes"},
{"34", "Bulgares"},
{"35", "Tagalogues"},
{"36", "Xhosa"},
{"37", "Kurdes"},
{"38", "Bengali"},
{"39", "Amhariques"},
{"40", "Bosniaques"},
{"41", "Malayalam"},
{"42", "Télougou"},
{"43", "Bambara"},
{"44", "Catalanes"},
{"45", "Tchèques"},
{"46", "Afrikaans"}
})
{ Value = "0" };
ConfigData.AddDynamic("specificLanguageAccent", ConfigSpecificLanguageAccent);
ConfigData.AddDynamic("advancedConfigurationWarning", new DisplayInfoConfigurationItem(string.Empty, "<center><b>Advanced Configuration</b></center>,<br /><br /> <center><b><u>WARNING !</u></b> <i>Be sure to read instructions before editing options bellow, you can <b>drastically reduce performance</b> of queries or have <b>non-accurate results</b>.</i></center><br/><br/><ul><li><b>Delay betwwen Requests</b>: (<i>not recommended</i>) you can increase delay to requests made to the tracker, but a minimum of 2.1s is enforced as there is an anti-spam protection.</li><br /><li><b>Max Pages</b>: (<i>not recommended</i>) you can increase max pages to follow when making a request. But be aware that others apps can consider this indexer not working if jackett take too many times to return results. Another thing is that API is very buggy on tracker side, most of time, results of next pages are same ... as the first page. Even if we deduplicate rows, you will loose performance for the same results. You can check logs to see if an higher pages following is not benefical, you will see an error percentage (duplicates) with recommandations.</li><br /><li><b>Bypass for TMDB</b>: (<i>recommended</i>) this indexer is compatible with TMDB queries (<i>for movies only</i>), so when requesting content with an TMDB ID, we will search directly ID on API instead of name. Results will be more accurate, so you can enable a max pages bypass for this query type. You will be at least limited by the hard limit of 4 pages.</li><br /><li><b>Drop categories</b>: (<i>recommended</i>) this indexer has some problems when too many categories are requested for filtering, so you will have better results by dropping categories from TMDB queries or selecting fewer categories in 3rd apps.</li><br /><li><b>Enhanced Anime</b>: if you have \"Anime\", this will improve queries made to this tracker related to this type when making searches.</li><br /><li><b>Multi Replacement</b>: you can dynamically replace the word \"MULTI\" with another of your choice like \"MULTI.FRENCH\" for better analysis of 3rd party softwares.</li><br /><li><b>Sub Replacement</b>: you can dynamically replace the word \"VOSTFR\" or \"SUBFRENCH\" with the word \"ENGLISH\" for better analysis of 3rd party softwares.</li></ul>"));
var ConfigWebRequestDelay = new SingleSelectConfigurationItem("Which delay do you want to apply between each requests made to tracker ?", new Dictionary<string, string>
{
{"2.1", "2.1s (minimum)"},
{"2.2", "2.2s"},
{"2.3", "2.3s"},
{"2.4", "2.4s" },
{"2.5", "2.5s"},
{"2.6", "2.6s"}
})
{ Value = "2.1" };
ConfigData.AddDynamic("webRequestDelay", ConfigWebRequestDelay);
var ConfigMaxPages = new SingleSelectConfigurationItem("How many pages do you want to follow ?", new Dictionary<string, string>
{
{"1", "1 (32 results - default / best perf.)"},
{"2", "2 (64 results)"},
{"3", "3 (96 results)"},
{"4", "4 (128 results - hard limit max)" },
})
{ Value = "1" };
ConfigData.AddDynamic("maxPages", ConfigMaxPages);
var ConfigMaxPagesBypassForTMDB = new BoolConfigurationItem("Do you want to bypass max pages for TMDB searches ? (Radarr) - Hard limit of 4") { Value = true };
ConfigData.AddDynamic("maxPagesBypassForTMDB", ConfigMaxPagesBypassForTMDB);
var ConfigDropCategories = new SingleSelectConfigurationItem("Drop requested categories", new Dictionary<string, string>
{
{"0", "Disabled"},
{"1", "Yes, only for TMDB requests (default)"},
{"2", "Yes, for all requests"},
})
{ Value = "1" };
ConfigData.AddDynamic("dropCategories", ConfigDropCategories);
var ConfigEnhancedAnimeSearch = new BoolConfigurationItem("Do you want to use enhanced ANIME search ?") { Value = false };
ConfigData.AddDynamic("enhancedAnimeSearch", ConfigEnhancedAnimeSearch);
var ConfigMultiReplacement = new StringConfigurationItem("Do you want to replace \"MULTI\" keyword in release title by another word ?") { Value = "MULTI.FRENCH" };
ConfigData.AddDynamic("multiReplacement", ConfigMultiReplacement);
var ConfigSubReplacement = new BoolConfigurationItem("Do you want to replace \"VOSTFR\" and \"SUBFRENCH\" with \"ENGLISH\" word ?") { Value = false };
ConfigData.AddDynamic("subReplacement", ConfigSubReplacement);
// Api has 1req/2s limit (minimum)
webclient.requestDelay = Convert.ToDouble(WebRequestDelay);
}
/// <summary>
/// Configure our Provider
/// </summary>
/// <param name="configJson">Our params in Json</param>
/// <returns>Configuration state</returns>
// Warning 1998 is async method with no await calls inside
// TODO: Remove pragma by wrapping return in Task.FromResult and removing async
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
{
// Provider not yet configured
IsConfigured = false;
// Retrieve config values set by Jackett's user
LoadValuesFromJson(configJson);
logger.Debug("\nXthor - Validating Settings ... \n");
// Check Passkey Setting
if (string.IsNullOrEmpty(ConfigData.Passkey.Value))
{
throw new ExceptionWithConfigData("You must provide your passkey for this tracker to be allowed to use API !", ConfigData);
}
else
{
logger.Debug("Xthor - Validated Setting -- PassKey (auth) => " + ConfigData.Passkey.Value);
}
// Tracker is now configured
IsConfigured = true;
// Saving data
SaveConfig();
return IndexerConfigurationStatus.RequiresTesting;
}
/// <summary>
/// Execute our search query
/// </summary>
/// <param name="query">Query</param>
/// <returns>Releases</returns>
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
var releases = new List<ReleaseInfo>();
var searchTerm = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
if (EnhancedAnimeSearch && query.HasSpecifiedCategories && (query.Categories.Contains(TorznabCatType.TVAnime.ID) || query.Categories.Contains(100032) || query.Categories.Contains(100101) || query.Categories.Contains(100110)))
{
var regex = new Regex(" ([0-9]+)");
searchTerm = regex.Replace(searchTerm, " E$1");
}
searchTerm = searchTerm.Trim();
searchTerm = searchTerm.ToLower();
searchTerm = searchTerm.Replace(" ", ".");
// Multiple page support
var nextPage = 1;
var followingPages = true;
do
{
// Build our query
var request = BuildQuery(searchTerm, query, ApiEndpoint, nextPage);
// Getting results
logger.Info("\nXthor - Querying API page " + nextPage);
var results = await QueryTrackerAsync(request);
// Torrents Result Count
var torrentsCount = 0;
try
{
// Deserialize our Json Response
var xthorResponse = JsonConvert.DeserializeObject<XthorResponse>(results);
// Check Tracker's State
CheckApiState(xthorResponse.Error);
// If contains torrents
if (xthorResponse.Torrents != null)
{
// Store torrents rows count result
torrentsCount = xthorResponse.Torrents.Count();
logger.Info("\nXthor - Found " + torrentsCount + " torrents on current page.");
// Adding each torrent row to releases
// Exclude hidden torrents (category 106, example => search 'yoda' in the API) #10407
releases.AddRange(xthorResponse.Torrents
.Where(torrent => torrent.Category != 106).Select(torrent =>
{
//issue #3847 replace multi keyword
if (!string.IsNullOrEmpty(MultiReplacement))
{
var regex = new Regex("(?i)([\\.\\- ])MULTI([\\.\\- ])");
torrent.Name = regex.Replace(torrent.Name, "$1" + MultiReplacement + "$2");
}
// issue #8759 replace vostfr and subfrench with English
if (SubReplacement)
torrent.Name = torrent.Name.Replace("VOSTFR", "ENGLISH").Replace("SUBFRENCH", "ENGLISH");
var publishDate = DateTimeUtil.UnixTimestampToDateTime(torrent.Added);
//TODO replace with download link?
var guid = new Uri(TorrentDetailsUrl.Replace("{id}", torrent.Id.ToString()));
var details = new Uri(TorrentDetailsUrl.Replace("{id}", torrent.Id.ToString()));
var link = new Uri(torrent.Download_link);
var release = new ReleaseInfo
{
// Mapping data
Category = MapTrackerCatToNewznab(torrent.Category.ToString()),
Title = torrent.Name,
Seeders = torrent.Seeders,
Peers = torrent.Seeders + torrent.Leechers,
MinimumRatio = 1,
MinimumSeedTime = 345600,
PublishDate = publishDate,
Size = torrent.Size,
Grabs = torrent.Times_completed,
Files = torrent.Numfiles,
UploadVolumeFactor = 1,
DownloadVolumeFactor = (torrent.Freeleech == 1 ? 0 : 1),
Guid = guid,
Details = details,
Link = link,
TMDb = torrent.Tmdb_id
};
return release;
}));
nextPage++;
}
else
{
logger.Info("\nXthor - No results found on page " + nextPage + ", stopping follow of next page.");
// No results or no more results available
followingPages = false;
break;
}
}
catch (Exception ex)
{
OnParseError("Unable to parse result \n" + ex.StackTrace, ex);
}
// Stop ?
if (query.IsTmdbQuery && MaxPagesBypassForTMDB)
{
if (nextPage > MaxPagesHardLimit)
{
logger.Info("\nXthor - Stopping follow of next page " + nextPage + " due to page hard limit reached.");
break;
}
logger.Info("\nXthor - Continue to next page " + nextPage + " due to TMDB request and activated max page bypass for this type of query. Max page hard limit: 4.");
continue;
}
else
{
if (torrentsCount < 32)
{
logger.Info("\nXthor - Stopping follow of next page " + nextPage + " due max available results reached.");
break;
}
else if (nextPage > MaxPages)
{
logger.Info("\nXthor - Stopping follow of next page " + nextPage + " due to page limit reached.");
break;
}
else if (query.IsTest)
{
logger.Info("\nXthor - Stopping follow of next page " + nextPage + " due to index test query.");
break;
}
}
} while (followingPages);
// Check if there is duplicate and return unique rows - Xthor API can be very buggy !
var uniqReleases = releases.GroupBy(x => x.Guid).Select(x => x.First()).ToList();
var errorPercentage = 1 - ((double)uniqReleases.Count() / releases.Count());
if (errorPercentage >= 0.25)
{
logger.Warn("\nXthor - High percentage error detected: " + string.Format("{0:0.0%}", errorPercentage) + "\nWe strongly recommend that you lower max page to 1, as there is no benefit to grab additionnals.\nTracker API sent us duplicated pages with same results, even if we deduplicate returned rows, please consider to lower as it's unnecessary and increase time used for query for the same result.");
}
// Return found releases
return uniqReleases;
}
/// <summary>
/// Response from Tracker's API
/// </summary>
public class XthorResponse
{
public XthorError Error { get; set; }
public XthorUser User { get; set; }
public List<XthorTorrent> Torrents { get; set; }
}
/// <summary>
/// State of API
/// </summary>
public class XthorError
{
public int Code { get; set; }
public string Descr { get; set; }
}
/// <summary>
/// User Informations
/// </summary>
public class XthorUser
{
public int Id { get; set; }
public string Username { get; set; }
public long Uploaded { get; set; }
public long Downloaded { get; set; }
public int Uclass { get; set; } // Class is a reserved keyword.
public decimal Bonus_point { get; set; }
public int Hits_and_run { get; set; }
public string Avatar_url { get; set; }
}
/// <summary>
/// Torrent Informations
/// </summary>
public class XthorTorrent
{
public int Id { get; set; }
public int Category { get; set; }
public int Seeders { get; set; }
public int Leechers { get; set; }
public string Name { get; set; }
public int Times_completed { get; set; }
public long Size { get; set; }
public int Added { get; set; }
public int Freeleech { get; set; }
public int Numfiles { get; set; }
public string Release_group { get; set; }
public string Download_link { get; set; }
public int Tmdb_id { get; set; }
public override string ToString() => string.Format("[XthorTorrent: id={0}, category={1}, seeders={2}, leechers={3}, name={4}, times_completed={5}, size={6}, added={7}, freeleech={8}, numfiles={9}, release_group={10}, download_link={11}, tmdb_id={12}]", Id, Category, Seeders, Leechers, Name, Times_completed, Size, Added, Freeleech, Numfiles, Release_group, Download_link, Tmdb_id);
}
/// <summary>
/// Build query to process
/// </summary>
/// <param name="term">Term to search</param>
/// <param name="query">Torznab Query for categories mapping</param>
/// <param name="url">Search url for provider</param>
/// <returns>URL to query for parsing and processing results</returns>
private string BuildQuery(string term, TorznabQuery query, string url, int page = 1)
{
var parameters = new NameValueCollection();
var categoriesList = MapTorznabCapsToTrackers(query);
// Passkey
parameters.Add("passkey", ConfigData.Passkey.Value);
if (query.IsTmdbQuery)
{
logger.Info("\nXthor - Search requested for movie with TMDB ID n°" + query.TmdbID.ToString());
parameters.Add("tmdbid", query.TmdbID.ToString());
}
else
{
if (!string.IsNullOrWhiteSpace(term))
{
// Add search term
logger.Info("\nXthor - Search requested for movie with title \"" + term + "\"");
parameters.Add("search", WebUtility.UrlEncode(term));
}
}
// Loop on categories needed
if (categoriesList.Count > 0)
{
switch (DropCategories)
{
case 1:
// Drop categories for TMDB query only.
if (!query.IsTmdbQuery)
{ goto default; }
break;
case 2:
// Drop categories enabled for all requests
break;
default:
// Default or disabled state (0 value of config switch)
parameters.Add("category", string.Join("+", categoriesList));
break;
}
}
// If Only Freeleech Enabled
if (FreeleechOnly)
{
parameters.Add("freeleech", "1");
}
// If Specific Language Accent Requested
if (!string.IsNullOrEmpty(SpecificLanguageAccent) && SpecificLanguageAccent != "0")
{
parameters.Add("accent", SpecificLanguageAccent);
}
// Pages handling
if (page > 1 && !query.IsTest)
{
parameters.Add("page", page.ToString());
}
// Building our query -- Cannot use GetQueryString due to UrlEncode (generating wrong category param)
url += "?" + string.Join("&", parameters.AllKeys.Select(a => a + "=" + parameters[a]));
logger.Info("\nXthor - Builded query: " + url);
// Return our search url
return url;
}
/// <summary>
/// Get Torrents Page from Tracker by Query Provided
/// </summary>
/// <param name="request">URL created by Query Builder</param>
/// <returns>Results from query</returns>
private async Task<string> QueryTrackerAsync(string request)
{
// Cache mode not enabled or cached file didn't exist for our query
logger.Debug("\nQuerying tracker for results....");
// Build WebRequest for index
var myIndexRequest = new WebRequest
{
Type = RequestType.GET,
Url = request,
Encoding = Encoding
};
// Request our first page
var results = await webclient.GetResultAsync(myIndexRequest);
if (results.Status == HttpStatusCode.InternalServerError) // See issue #2110
throw new Exception("Internal Server Error (" + results.ContentString + "), probably you reached the API limits, please reduce the number of queries");
// Return results from tracker
return results.ContentString;
}
/// <summary>
/// Check API's state
/// </summary>
/// <param name="state">State of API</param>
private void CheckApiState(XthorError state)
{
// Switch on state
switch (state.Code)
{
case 0:
// Everything OK
logger.Debug("\nXthor - API State : Everything OK ... -> " + state.Descr);
break;
case 1:
// Passkey not found
logger.Error("\nXthor - API State : Error, Passkey not found in tracker's database, aborting... -> " + state.Descr);
throw new Exception("Passkey not found in tracker's database");
case 2:
// No results
logger.Info("\nXthor - API State : No results for query ... -> " + state.Descr);
break;
case 3:
// Power Saver
logger.Warn("\nXthor - API State : Power Saver mode, only cached query with no parameters available ... -> " + state.Descr);
break;
case 4:
// DDOS Attack, API disabled
logger.Error("\nXthor - API State : Tracker is under DDOS attack, API disabled, aborting ... -> " + state.Descr);
throw new Exception("Tracker is under DDOS attack, API disabled");
case 8:
// AntiSpam Protection
logger.Warn("\nXthor - API State : Triggered AntiSpam Protection -> " + state.Descr);
throw new Exception("Triggered AntiSpam Protection, please delay your requests !");
default:
// Unknown state
logger.Error("\nXthor - API State : Unknown state, aborting querying ... -> " + state.Descr);
throw new Exception("Unknown state, aborting querying");
}
}
}
}

View File

@@ -43,6 +43,7 @@ namespace Jackett.Common.Services
{"audiobooktorrents", "abtorrents"},
{"baibako", "rudub"},
{"broadcastthenet", "broadcasthenet"},
{"casatorrent", "teamctgame"},
{"icetorrent", "speedapp"},
{"kickasstorrent-kathow", "kickasstorrents-ws"},
{"leaguehd", "lemonhd"},

View File

@@ -297,6 +297,7 @@ namespace Jackett.Updater
"Definitions/btstornet.yml",
"Definitions/btworld.yml",
"Definitions/btxpress.yml",
"Definitions/casatorrent.yml", // renamed to teamctgame
"Definitions/casstudiotv.yml",
"Definitions/channelx.yml",
"Definitions/cili180.yml", // renamed to liaorencili
@@ -391,6 +392,7 @@ namespace Jackett.Updater
"Definitions/latinop2p.yml",
"Definitions/leaguehd.yml", // renamed to lemonhd
"Definitions/lechaudron.yml",
"Definitions/legacyhd.yml", // renamed realflix
"Definitions/lemencili.yml",
"Definitions/leparadisdunet.yml",
"Definitions/leporno.yml",
@@ -490,6 +492,7 @@ namespace Jackett.Updater
"Definitions/tntfork.yml",
"Definitions/tntvillage.yml",
"Definitions/topnow.yml",
"Definitions/toros.yml",
"Definitions/torrent-paradise-ml.yml",
"Definitions/torrent4you.yml",
"Definitions/torrentbomb.yml",