Compare commits

..

31 Commits

Author SHA1 Message Date
ilike2burnthing
1b8dde49b6 bluraytracker: add Czech private tracker. resolves #15458 (#15459) 2024-07-03 02:38:25 +01:00
Garfield69
9ffdbede53 rudub: bump domain 2024-07-03 06:02:16 +12:00
Garfield69
8aec74aed1 amigoshare: rework cat detection 2024-07-02 07:13:15 +12:00
Garfield69
7f91629dc2 xider-torrent: new cat 2024-07-02 06:16:46 +12:00
Garfield69
71f68bf5e6 marinetracker: update cats 2024-07-02 05:27:20 +12:00
Garfield69
b9971794ba rudub: bump domain 2024-07-02 05:27:06 +12:00
Garfield69
59e45c382d plusteca: -> 8.1.3 2024-07-01 18:23:28 +12:00
Garfield69
43b73758b3 amigosshare: update cats 2024-07-01 18:07:33 +12:00
Bogdan
8d0d161c10 bump packages (#15456) 2024-07-01 08:57:45 +03:00
Bogdan
abf6ce7033 core: move native indexers to Definitions folder (#15455) 2024-07-01 08:18:08 +03:00
Bogdan
69c2c30176 broadcasthenet: pageable requests (#15442) 2024-07-01 07:51:28 +03:00
Bogdan
e1e5685bfa exttorrents: remove download block (#15454)
* exttorrents: remove download block

* Apply suggestions from code review

Co-authored-by: garfield69 <garfield69@outlook.com>

---------

Co-authored-by: garfield69 <garfield69@outlook.com>
2024-07-01 07:26:08 +03:00
Garfield69
d9562d57de postman: fix d9bea7342d 2024-07-01 13:04:59 +12:00
Garfield69
b3e4d94daa sharkpt: removed. resolves #13904 2024-07-01 13:00:00 +12:00
Garfield69
8183d81e1b torrentgalaxy: removed. #15358 2024-07-01 12:55:01 +12:00
Arthur Melton
d9bea7342d postman: fix root search path (#15452) 2024-07-01 12:00:53 +12:00
Garfield69
741521f154 assorted thx/3xt tidy ups 2024-07-01 06:08:27 +12:00
Garfield69
cbc5a98db0 dasunerwartete: new DL selector
and other tidy ups
2024-07-01 06:07:22 +12:00
Garfield69
7b657d3073 rudub: bump domain 2024-07-01 05:25:36 +12:00
Anton Fedosov
48ebd9634d lostfilm: fix extra '/' in captcha uri (#15451) 2024-06-30 16:59:42 +03:00
Garfield69
65bad18b5f asiancinema: update engine tag and add apikey comment 2024-06-30 14:35:19 +12:00
Garfield69
29ec33492b asiancinema: new domain 2024-06-30 14:30:27 +12:00
Garfield69
0a3ec0757a gamera: removed resolves #14589 2024-06-30 06:20:38 +12:00
Garfield69
90c5f73d55 polishtorrent: update cats 2024-06-30 06:03:49 +12:00
Garfield69
35861079f3 rudub: bump domain 2024-06-30 05:51:03 +12:00
ilike2burnthing
c0a6cabd91 bwtorrents: add flaresolverr info 2024-06-28 21:47:52 +01:00
Garfield69
c48e0e5e59 metalwrks: removed. resolves #15340 2024-06-29 06:59:59 +12:00
Garfield69
0f93f5b96a dontorrent: new domain 2024-06-29 06:06:14 +12:00
HDVinnie
2c1d5ef2fd Add malayabits a Private Malaysian site. resolves #15448 (#15447) 2024-06-29 05:59:33 +12:00
Garfield69
331ed5d052 rudub: bump domain 2024-06-29 05:52:59 +12:00
Garfield69
ff390a99bf Update README.md 2024-06-28 08:47:18 +12:00
119 changed files with 1132 additions and 1181 deletions

View File

@@ -124,7 +124,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Torrent9-tel
* TorrentFunk
* TorrentDownload
* TorrentGalaxy (TGx)
* TorrentKitty
* TorrentProject2
* TorrentQQ (토렌트큐큐)
@@ -272,6 +271,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* BiTTuRK
* BJ-Share (BJ) [![(invite needed)][inviteneeded]](#)
* BlueBird
* BlurayTracker
* Blutopia (BLU)
* Borgzelle [![(invite needed)][inviteneeded]](#)
* Boxing Torrents
@@ -345,9 +345,8 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* FSM
* FunFile (FF)
* FunkyTorrents (FT)
* FutureTorrent [![(invite needed)][inviteneeded]](#)
* FutureTorrent
* Fuzer (FZ)
* Gamera (駕瞑羅)
* Gay-Torrents.org
* GAYtorrent.ru
* GazelleGames (GGn)
@@ -445,10 +444,10 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* Majomparádé (TurkDepo)
* Making Off
* Mansão dos Animes (MDAN)
* Malayabits
* MegamixTracker
* MeseVilág (Fairytale World)
* MetalGuru [![(invite needed)][inviteneeded]](#)
* METALWRKS
* Milkie
* MMA-Torrents [![(invite needed)][inviteneeded]](#)
* MNV (Max-New-Vision)
@@ -533,7 +532,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
* SFP (Share Friends Projekt)
* Shadowflow (影) [![(invite needed)][inviteneeded]](#)
* Shareisland
* SharkPT
* Shazbat
* SiamBIT
* SkipTheCommercials

View File

@@ -14,81 +14,60 @@ legacylinks:
caps:
categorymappings:
- {id: 107, cat: XXX, desc: "Adultos: Gay"}
- {id: 75, cat: XXX, desc: "Adultos: Hentai"}
- {id: 107, cat: XXX, desc: "Adultos: Gay"}
- {id: 108, cat: XXX, desc: "Adultos: Transex/Female"}
- {id: 74, cat: XXX, desc: "Adultos: XXX"}
- {id: 146, cat: XXX, desc: "Adultos: OnlyFans"}
- {id: 69, cat: TV/Anime, desc: "Anime: Anime"}
- {id: 116, cat: TV/Anime, desc: "Anime: Filmes"}
- {id: 118, cat: TV/Anime, desc: "Anime: Séries"}
- {id: 23, cat: PC/Mobile-Android, desc: "Aplicativos: Android"}
- {id: 21, cat: PC/0day, desc: "Aplicativos: Windows"}
- {id: 28, cat: PC/Mobile-iOS, desc: "Aplicativos: iPod"}
- {id: 27, cat: PC/Mobile-iOS, desc: "Aplicativos: iPad"}
- {id: 26, cat: PC/Mobile-iOS, desc: "Aplicativos: iPhone"}
- {id: 28, cat: PC/Mobile-iOS, desc: "Aplicativos: iPod"}
- {id: 25, cat: PC, desc: "Aplicativos: Linux"}
- {id: 23, cat: PC/Mobile-Android, desc: "Aplicativos: Android"}
- {id: 22, cat: PC/Mac, desc: "Aplicativos: Mac"}
- {id: 21, cat: PC/0day, desc: "Aplicativos: Windows"}
- {id: 72, cat: Books, desc: "Apostila: Apostila"}
- {id: 71, cat: Books, desc: "Apostila: Cursos"}
- {id: 121, cat: Audio/Audiobook, desc: "Ebook: Audio-book"}
- {id: 112, cat: Books, desc: "Ebook: HQs"}
- {id: 73, cat: Books, desc: "Cursos: Video Aula"}
- {id: 72, cat: Books, desc: "Cursos: Apostila"}
- {id: 71, cat: Books, desc: "Cursos: Cursos"}
- {id: 67, cat: Books, desc: "Ebook: Livros"}
- {id: 112, cat: Books, desc: "Ebook: HQs"}
- {id: 147, cat: Books, desc: "Ebook: Mangas"}
- {id: 121, cat: Audio/Audiobook, desc: "Ebook: Audio-book"}
- {id: 68, cat: Books, desc: "Ebook: Revistas"}
- {id: 119, cat: Movies, desc: "Filmes:"}
- {id: 70, cat: XXX, desc: "Fotos: XXX"}
- {id: 57, cat: Console, desc: "Jogos: Android"}
- {id: 52, cat: Console, desc: "Jogos: Dreamcast"}
- {id: 109, cat: Console, desc: "Jogos: Emulação"}
- {id: 61, cat: Console, desc: "Jogos: Emuladores e Roms"}
- {id: 48, cat: PC/Mac, desc: "Jogos: Mac"}
- {id: 58, cat: Console/NDS, desc: "Jogos: Nintendo DS"}
- {id: 110, cat: Console, desc: "Jogos: Nintendo Switch"}
- {id: 47, cat: PC/Games, desc: "Jogos: Pc"}
- {id: 49, cat: Console, desc: "Jogos: Ps1"}
- {id: 50, cat: Console, desc: "Jogos: Ps2"}
- {id: 70, cat: XXX, desc: "Fotos: Revistas, Livros e Fotos"}
- {id: 51, cat: Console/PS3, desc: "Jogos: Ps3"}
- {id: 79, cat: Console/PS4, desc: "Jogos: Ps4"}
- {id: 82, cat: Console/PSP, desc: "Jogos: PSP"}
- {id: 55, cat: Console/Wii, desc: "Jogos: Wii"}
- {id: 54, cat: Console/XBox 360, desc: "Jogos: Xbox360"}
- {id: 109, cat: Console, desc: "Jogos: Emulação"}
- {id: 110, cat: Console, desc: "Jogos: Nintendo Switch"}
- {id: 52, cat: Console, desc: "Jogos: Dreamcast"}
- {id: 50, cat: Console, desc: "Jogos: Ps2"}
- {id: 49, cat: Console, desc: "Jogos: Ps1"}
- {id: 48, cat: PC/Mac, desc: "Jogos: Mac"}
- {id: 55, cat: Console/Wii, desc: "Jogos: Wii"}
- {id: 82, cat: Console/PSP, desc: "Jogos: PSP"}
- {id: 47, cat: PC/Games, desc: "Jogos: Pc"}
- {id: 61, cat: Console, desc: "Jogos: Emuladores e Roms"}
- {id: 58, cat: Console/NDS, desc: "Jogos: Nintendo DS"}
- {id: 57, cat: Console, desc: "Jogos: Android"}
- {id: 56, cat: Console/XBox, desc: "Jogos: Xbox"}
- {id: 78, cat: Console/XBox One, desc: "Jogos: Xbox One"}
- {id: 29, cat: Audio, desc: "Musica: Axé"}
- {id: 38, cat: Audio, desc: "Musica: Blues"}
- {id: 39, cat: Audio, desc: "Musica: Dance"}
- {id: 40, cat: Audio, desc: "Musica: Discografia"}
- {id: 43, cat: Audio, desc: "Musica: Dubstep"}
- {id: 30, cat: Audio, desc: "Musica: Eletronica"}
- {id: 41, cat: Audio, desc: "Musica: Erudita"}
- {id: 42, cat: Audio, desc: "Musica: Forró"}
- {id: 31, cat: Audio, desc: "Musica: Funk"}
- {id: 84, cat: Audio, desc: "Musica: Game (OST)"}
- {id: 83, cat: Audio, desc: "Musica: Gospel"}
- {id: 37, cat: Audio, desc: "Musica: Hard Rock"}
- {id: 33, cat: Audio, desc: "Musica: Hip-Hop"}
- {id: 114, cat: Audio, desc: "Musica: MPB"}
- {id: 77, cat: Audio, desc: "Musica: Outros"}
- {id: 32, cat: Audio, desc: "Musica: Pagode"}
- {id: 115, cat: Audio, desc: "Musica: POP"}
- {id: 34, cat: Audio, desc: "Musica: Rap"}
- {id: 76, cat: Audio, desc: "Musica: Reggae"}
- {id: 36, cat: Audio, desc: "Musica: Rock"}
- {id: 45, cat: Audio, desc: "Musica: Samba"}
- {id: 46, cat: Audio, desc: "Musica: Sertanejo"}
- {id: 120, cat: TV, desc: "Series:"}
- {id: 65, cat: TV, desc: "Shows: Show"}
- {id: 63, cat: TV, desc: "Tv: Aberta"}
- {id: 62, cat: TV/Sport, desc: "Tv: Esportes"}
- {id: 64, cat: TV, desc: "Tv: Fechada"}
- {id: 73, cat: TV, desc: "Video Aula: Video Aula"}
- {id: 127, cat: Other, desc: "Outros: Add-ons"}
- {id: 126, cat: Other, desc: "Outros: Extensões"}
- {id: 79, cat: Console/PS4, desc: "Jogos: Ps4"}
- {id: 129, cat: Other, desc: "Outros: Fonts"}
- {id: 128, cat: Other, desc: "Outros: Scripts"}
- {id: 127, cat: Other, desc: "Outros: Add-ons"}
- {id: 130, cat: Other, desc: "Outros: MOD"}
- {id: 125, cat: Other, desc: "Outros: Pack de Imagens"}
- {id: 122, cat: Other, desc: "Outros: Plug-ins"}
- {id: 128, cat: Other, desc: "Outros: Scripts"}
- {id: 124, cat: Other, desc: "Outros: Vetores"}
- {id: 122, cat: Other, desc: "Outros: Plug-ins"}
- {id: 126, cat: Other, desc: "Outros: Extensões"}
- {id: 120, cat: TV, desc: "Series:"}
- {id: 64, cat: TV, desc: "Tv: Fechada"}
- {id: 62, cat: TV/Sport, desc: "Tv: Esportes"}
- {id: 63, cat: TV, desc: "Tv: Aberta"}
modes:
search: [q]
@@ -179,6 +158,23 @@ search:
selector: "div#fancy-list-group ul.list-group li.list-group-item{{ if .Config.freeleech }}:has(span.badge-success:contains(\"FREE\")){{ else }}{{ end }}"
fields:
category_default:
# tv and movie just have an image :-b
selector: div.list-group-item-addon img
attribute: src
optional: true
case:
"[src$=\"/filmes2.fw.png\"]": 119
"[src$=\"/seriados.fw.png\"]": 120
category:
# while the rest have a href with a cat number \o/
selector: a[href*="cat="]
attribute: href
optional: true
default: "{{ .Result.category_default }}"
filters:
- name: querystring
args: cat
_quality:
selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k")
optional: true
@@ -194,10 +190,6 @@ search:
_language:
selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#b6249d;"]
optional: true
genre:
selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#1c38c2;"]
description:
text: "{{ .Result.genre }}"
title:
selector: a[href*="torrents-details.php?id="], a[href*="details-misc.php?id="]
filters:
@@ -224,86 +216,6 @@ search:
download:
selector: a[href*="download.php?id="]
attribute: href
category:
selector: div.list-group-item-addon img
attribute: src
case:
# unfortunately the site does not have category numbers on the results page, just a image which can apply to both movies and tv.
# therefore I've order the list to favour movies.
# also, not all images have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc.
"[src$=\"/Adultos.fw.png\"]": 74
"[src$=\"/Gay.jpeg\"]": 107
"[src$=\"/Trans.jpeg\"]": 108
"[src$=\"/Hentai.png\"]": 75
"[src$=\"/Anime2.fw.png\"]": 69
"[src$=\"/aplicativos.fw.png\"]": 21
"[src$=\"/Mac.png\"]": 22
"[src$=\"/Android.png\"]": 23
"[src$=\"/Linux.png\"]": 25
"[src$=\"/iPhone.png\"]": 26
"[src$=\"/iPad.png\"]": 27
"[src$=\"/iPod.png\"]": 28
"[src$=\"/Cursos.png\"]": 71
"[src$=\"/Apostila.png\"]": 72
"[src$=\"/E-books.png\"]": 67
"[src$=\"/Revista.png\"]": 68
"[src$=\"/HQ.png\"]": 112
"[src$=\"/filmes2.fw.png\"]": 119
"[src$=\"/Revistas-XXX.png\"]": 70
"[src$=\"/PS4.png\"]": 79
"[src$=\"/Jogos-PC.png\"]": 47
"[src$=\"/Emulador.png\"]": 61
"[src$=\"/Emulacao.png\"]": 109
"[src$=\"/Jogos-Mac.png\"]": 48
"[src$=\"/Jogos-PS1.png\"]": 49
"[src$=\"/Jogos-PS2.png\"]": 50
"[src$=\"/Jogos-PS3.png\"]": 51
"[src$=\"/Jogos-Dreamcast.png\"]": 52
"[src$=\"/Jogos-Xbox360.png\"]": 54
"[src$=\"/Jogos-Xbox.png\"]": 56
"[src$=\"/Jogos-Wii.png\"]": 55
"[src$=\"/Jogos-DS.png\"]": 58
"[src$=\"/jogosandroid.png\"]": 57
"[src$=\"/PSP.png\"]": 82
"[src$=\"/Jogos-NS.png\"]": 110
"[src$=\"/Jogos-XboxOne.png\"]": 78
"[src$=\"/Axe.png\"]": 29
"[src$=\"/Eletronica.png\"]": 30
"[src$=\"/Funk.png\"]": 31
"[src$=\"/Pagode.png\"]": 32
"[src$=\"/HIP_HOP.png\"]": 33
"[src$=\"/Rap.png\"]": 34
"[src$=\"/Rock.png\"]": 36
"[src$=\"/Hard-Rock.png\"]": 37
"[src$=\"/Blues.png\"]": 38
"[src$=\"/Dance.png\"]": 39
"[src$=\"/Discografia.png\"]": 40
"[src$=\"/Erudita.png\"]": 41
"[src$=\"/Forro.png\"]": 42
"[src$=\"/Dubstep.png\"]": 43
"[src$=\"/Sertanejo.png\"]": 46
"[src$=\"/Samba.png\"]": 45
"[src$=\"/Musica-Outros.png\"]": 77
"[src$=\"/Reggae.png\"]": 76
"[src$=\"/Gospel.png\"]": 83
"[src$=\"/POP.png\"]": 115
"[src$=\"/MPB.png\"]": 114
"[src$=\"/OST.png\"]": 84
"[src$=\"/seriados.fw.png\"]": 120
"[src$=\"/show.fw.png\"]": 65
"[src$=\"/Aberta.png\"]": 63
"[src$=\"/Esporte.png\"]": 62
"[src$=\"/Fechada.png\"]": 64
"[src$=\"/video aula4.fw.png\"]": 73
"[src$=\"/Add-ons.png\"]": 127
"[src$=\"/Extensões.png\"]": 126
"[src$=\"/Fonts.png\"]": 129
"[src$=\"/MOD.png\"]": 130
"[src$=\"/Imagens.png\"]": 125
"[src$=\"/Plug-ins.png\"]": 122
"[src$=\"/Scripts.png\"]": 128
"[src$=\"/Vetores.png\"]": 124
"[src$=\"/outros2.png\"]": 130
date:
selector: p:contains("Lançado:")
# auto adjusted by site account profile
@@ -324,6 +236,10 @@ search:
selector: div.list-group-item-controls a:nth-child(2)
grabs:
selector: div.list-group-item-controls a:nth-child(3)
genre:
selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#1c38c2;"]
description:
text: "{{ .Result.genre }}"
downloadvolumefactor:
case:
"span.badge-success:contains(\"FREE\")": 0

View File

@@ -6,6 +6,8 @@ language: en-US
type: private
encoding: UTF-8
links:
- https://eiga.moi/
legacylinks:
- https://asiancinema.me/
caps:
@@ -53,6 +55,7 @@ settings:
default: "Your account will be automatically deleted from the database after 90 days of inactivity. If you return or visit the site with your account before that amount of time passes, then the inactivity timer will reset and your account will be fine for another 90 days.<br>Keep in mind that 'activity' is considered a visit to any page and that torrent traffic is not counted as account activity. In order to reset the inactivity timer all you have to do is visit a single page while logged in with your account. If your account is deleted for inactivity, please do not ask the site staff to un-delete it for you. The deletion is performed automatically by the server and, as such, your account cannot be recovered after it has been deleted."
login:
# note APIKEY is broken on this 5.3.0 site
path: login
method: form
form: form[action$="/login"]
@@ -188,4 +191,4 @@ search:
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# UNIT3D 3.0.0
# UNIT3D 5.3.0

View File

@@ -0,0 +1,179 @@
---
id: bluraytracker
name: BlurayTracker
description: "BlurayTracker is a CZECH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: cs-CZ
type: private
encoding: UTF-8
links:
- https://bluraytracker.cz/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "-----Filmy-----"}
- {id: 34, cat: Movies, desc: " |- Filmy CZ/SK Dabing"}
- {id: 33, cat: Movies, desc: " |- Filmy CZ/SK Titulky"}
- {id: 49, cat: Movies/HD, desc: " |- HD/FHD Filmy"}
- {id: 17, cat: Movies/UHD, desc: " |- 4k/UHD Filmy "}
- {id: 31, cat: Movies/BluRay, desc: " |- Bluray DB/BD/DVD"}
- {id: 51, cat: Movies/3D, desc: " |- 3D Filmy"}
- {id: 14, cat: Movies/SD, desc: " |- DivX"}
- {id: 45, cat: Movies/Other, desc: " |- Kreslené/Anime"}
- {id: 16, cat: Movies/SD, desc: " |- CAM/Kino"}
- {id: 40, cat: TV, desc: "-----TV-----"}
- {id: 32, cat: TV, desc: " |- Serialy CZ/SK/EN"}
- {id: 47, cat: TV, desc: " |- Serialy"}
- {id: 38, cat: TV/Documentary, desc: " |- Dokumenty / TV Reality"}
- {id: 35, cat: TV/Sport, desc: " |- Sport"}
- {id: 6, cat: PC, desc: "Aplikace/Programy"}
- {id: 18, cat: PC/0day, desc: " |- Programy PC"}
- {id: 19, cat: PC/Mac, desc: " |- Programy MacOS"}
- {id: 7, cat: Audio, desc: "-----Hudba-----"}
- {id: 39, cat: Audio/Audiobook, desc: " |- Mluvene Slovo"}
- {id: 21, cat: Audio, desc: " |- MP3/FLAC"}
- {id: 43, cat: Audio/Other, desc: " |- SoundTrack"}
- {id: 2, cat: PC/Games, desc: "--Hry--"}
- {id: 3, cat: Console/PS3, desc: " |- Sony PS"}
- {id: 4, cat: Console/Wii, desc: " |- Wii"}
- {id: 26, cat: Console/XBox, desc: " |- XboX"}
- {id: 27, cat: PC/Games, desc: " |- PC"}
- {id: 28, cat: Console/NDS, desc: " |- Nintendo"}
- {id: 42, cat: Books, desc: "Knihy A Časopisy"}
- {id: 36, cat: Other, desc: "Ostatní"}
- {id: 46, cat: XXX, desc: "XXX (18+)"}
# not listed
- {id: 41, cat: Movies, desc: "VIP Torrent"}
- {id: 48, cat: Movies, desc: " |- RLS"}
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: freeleech
type: checkbox
label: Filter freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: added
options:
added: created
seeders: seeders
size: size
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
login:
path: ?p=home&pid=1
method: form
form: form#sls_form
submitpath: ajax/login.php
inputs:
action: login
loginbox_membername: "{{ .Config.username }}"
loginbox_password: "{{ .Config.password }}"
loginbox_remember: true
error:
- selector: div.error
test:
path: ?p=home&pid=1
selector: div#member_info_bar
search:
paths:
- path: /
inputs:
p: torrents
pid: 32
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
keywords: "{{ .Keywords }}"
# name, description, both, uploader
search_type: name
"sortOptions[sortBy]": "{{ .Config.sort }}"
"sortOptions[sortOrder]": "{{ .Config.type }}"
# does not support imdbid search but has imdbid links in results.
error:
- selector: div.error:not(:contains("There are no results found."))
rows:
selector: "div.torrent-box[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}"
fields:
category:
selector: a[href*="?p=torrents&pid=10&cid="]
attribute: href
filters:
- name: querystring
args: cid
title:
selector: a[href*="?p=torrents&pid=10&action=details&tid="]
details:
selector: a[href*="?p=torrents&pid=10&action=details&tid="]
attribute: href
download:
selector: a[href*="?p=torrents&pid=10&action=download&tid="]
attribute: href
magnet:
selector: a[href^="magnet:?xt="]
attribute: href
optional: true
poster:
selector: a[href*="data/torrents/torrent_images/"]
attribute: href
imdbid:
selector: a[href*="imdb.com/title/tt"]
attribute: href
size:
selector: a[rel="torrent_size"]
grabs:
selector: a[rel="times_completed"]
seeders:
selector: a[rel="torrent_seeders"]
leechers:
selector: a[rel="torrent_leechers"]
date_day:
selector: div.torrentOwner:contains("day")
# auto adjusted by site account profile
optional: true
filters:
- name: regexp
args: "Uploaded (.+?) by"
- name: fuzzytime
date_year:
selector: div.torrentOwner:contains("-")
# auto adjusted by site account profile
optional: true
filters:
- name: regexp
args: "Uploaded (.+?) by"
- name: dateparse
args: "dd-MM-yyyy HH:mm"
date_unix:
selector: div.torrentOwner abbr
optional: true
attribute: data-time
date:
text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}"
downloadvolumefactor:
case:
img[src$="/torrent_free.png"]: 0
"*": 1
uploadvolumefactor:
text: 1
# TSUE 2.2

View File

@@ -146,6 +146,8 @@ settings:
type: checkbox
label: Search freeleech only
default: false
- name: info_flaresolverr
type: info_flaresolverr
- name: info_activity
type: info
label: Account Inactivity

View File

@@ -148,19 +148,19 @@ search:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download_ssl.php?torrent="]
selector: a[href^="download.php?torrent="]
attribute: href
poster:
selector: img[src^="cloud-data/to_cover/"]
selector: img[src^="cloud-data/"]
attribute: src
size:
selector: div.selection_unter_ad
grabs:
selector: div.selection_unter_ae
seeders:
selector: div.selection_unter_aa > b
selector: div.selection_unter_aa
leechers:
selector: div.selection_unter_aaa > b
selector: div.selection_unter_aaa
date_day:
# Heute 03:27:27
# Gestern 21:00:59
@@ -171,7 +171,8 @@ search:
args: ["Heute ", "Today"]
- name: replace
args: ["Gestern ", "Yesterday"]
- name: fuzzytime
- name: append
args: " +01:00" # CET
date_year:
# 14.03.2024 um 20:43:07
selector: div.selection_unter_ab:not(:contains("Heute")):not(:contains("Gestern"))

View File

@@ -99,11 +99,6 @@ settings:
- name: info_flaresolverr
type: info_flaresolverr
download:
selectors:
- selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
- path: "{{ if .Keywords }}search/{{ .Keywords }}/?order={{ .Config.sort }}&sort={{ .Config.type }}{{ else }}latest/{{ end }}"
@@ -131,9 +126,12 @@ search:
details:
selector: td:nth-child(1) div a
attribute: href
download:
selector: td:nth-child(1) div a
infohash:
selector: a[href^="magnet:?xt="]
attribute: href
filters:
- name: regexp
args: ([A-F|a-f|0-9]{40})
size:
selector: td:nth-child(2)
files:

View File

@@ -1,174 +0,0 @@
---
id: gamera
name: Gamera (駕瞑羅)
description: "Gamera (駕瞑羅) is a CHINESE Private Torrent Tracker for Japanese Monster and Superhero MOVIES / TV"
language: zh-CN
type: private
encoding: UTF-8
links:
- https://gamerapt.link/
caps:
categorymappings:
- {id: 410, cat: Movies, desc: "Monster怪兽"}
- {id: 410, cat: TV, desc: "Monster怪兽"}
- {id: 411, cat: Movies, desc: "Kamen Rider假面骑士"}
- {id: 411, cat: TV, desc: "Kamen Rider假面骑士"}
- {id: 412, cat: Movies, desc: "Ultraman奥特曼"}
- {id: 412, cat: TV, desc: "Ultraman奥特曼"}
- {id: 413, cat: Movies, desc: "Team战队"}
- {id: 413, cat: TV, desc: "Team战队"}
- {id: 414, cat: Movies, desc: "Other其他特摄"}
- {id: 414, cat: TV, desc: "Other其他特摄"}
- {id: 415, cat: Movies, desc: "Musical特摄音乐"}
- {id: 415, cat: TV, desc: "Musical特摄音乐"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q, imdbid, doubanid]
settings:
- name: cookie
type: text
label: Cookie
- name: info_cookie
type: info_cookie
- name: freeleech
type: checkbox
label: Search freeleech only
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
- 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: info_activity
type: info
label: Account Inactivity
default: "Account retention rules:<ol><li>Veteran User or above will be retained forever</li><li>Elite User or above will not be deleted after parking (in the control panel)</li><li>Users with a non-parked account will be deleted if they have not logged in for more than 365 consecutive days.</li></ol>"
login:
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ 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 }}"
# 0 title, 1 descr, 3 uploader
search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}"
# 0 AND, 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
notnewword: 1
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)
fields:
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_default:
selector: a[href^="details.php?id="]
title:
selector: a[title][href^="details.php?id="]
attribute: title
optional: true
default: "{{ .Result.title_default }}"
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
poster:
selector: img[data-src]
attribute: data-src
imdbid:
# site currently only has a badge and rating, the id is not present. just in case a future update.
selector: a[href*="imdb.com/title/tt"]
attribute: href
doubanid:
# site currently only has a badge and rating, the id is not present. just in case a future update.
selector: a[href*="movie.douban.com/subject/"]
attribute: href
date_elapsed:
# time type: time elapsed (default)
selector: td.rowfollow:nth-last-of-type(5) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +08:00"
- name: dateparse
args: "yyyy-MM-dd HH:mm:ss zzz"
date_added:
# time added
selector: td.rowfollow:nth-last-of-type(5):not(:has(span))
optional: true
filters:
- name: append
args: " +08:00" # CST
- name: dateparse
args: "yyyy-MM-ddHH:mm:ss zzz"
date:
text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}"
size:
selector: td.rowfollow:nth-last-of-type(4)
seeders:
selector: td.rowfollow:nth-last-of-type(3)
leechers:
selector: td.rowfollow:nth-last-of-type(2)
grabs:
selector: td.rowfollow:nth-last-of-type(1)
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
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
minimumratio:
text: 0.2
# NexusPHP KEMURIKUSA 2019-01-09

View File

@@ -1,20 +1,18 @@
---
id: metalwrks
name: METALWRKS
description: "METALWRKS is an AUSTRALIAN Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en-AU
id: malayabits-api
name: Malayabits (API)
description: "Malayabits is a MALAYSIAN Private Torrent Tracker for MOVIES / TV / MUSIC"
language: en-US
type: private
encoding: UTF-8
links:
- https://metalworks.lol/
- https://malayabits.cc/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 1, cat: Movies, desc: "Movie"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 4, cat: Audio, desc: "Music"}
- {id: 3, cat: Console, desc: "Games"}
- {id: 5, cat: PC, desc: "Software"}
- {id: 3, cat: Audio, desc: "Musik"}
modes:
search: [q]
@@ -29,7 +27,7 @@ settings:
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://metalworks.lol/\" target=\"_blank\">METALWRKS</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
default: "Find or Generate a new API Token by accessing your <a href=\"https://malayabits.cc/\" target=\"_blank\">Malayabits</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
@@ -57,7 +55,7 @@ settings:
- name: info_activity
type: info
label: Account Inactivity
default: "Accounts that are inactive for more than 60 days may be disabled."
default: "You must log in to the Malayabits web site with your browser once every 90 days to prevent your account from getting disabled."
login:
path: /api/torrents
@@ -132,8 +130,6 @@ search:
genre:
selector: meta.genres
filters:
- name: re_replace
args: ["(?i)(Science Fiction)", "Science_Fiction"]
- name: replace
args: [" & ", "_&_"]
description:
@@ -170,9 +166,10 @@ search:
case:
False: 1 # normal
True: 2 # double
minimumratio:
text: 1.0
# global MR is 0.4 but torrents must be seeded for 5 days regardless of ratio
# minimumratio:
# text: 0.4
minimumseedtime:
# 2 days (as seconds = 2 x 24 x 60 x 60)
text: 172800
# 1 day (as seconds = 1 x 24 x 60 x 60)
text: 86400
# json UNIT3D 8.1.3

View File

@@ -121,9 +121,12 @@ caps:
- {id: 340, cat: Books, desc: "Examinations-Text books"}
- {id: 339, cat: Books, desc: "Examinations-Miscellaneous"}
- {id: 99, cat: Audio, desc: "Audio"}
- {id: 288, cat: Audio, desc: "Audio-♬ Music"}
- {id: 375, cat: Audio, desc: "Audio-Documentary"}
- {id: 374, cat: Audio, desc: "Audio-Historical literature"}
- {id: 286, cat: Audio, desc: "Audio-Fantastic"}
- {id: 373, cat: Audio, desc: "Audio-Fiction"}
- {id: 287, cat: Audio, desc: "Audio-Non-Fiction"}
- {id: 286, cat: Audio, desc: "Audio-Fiction"}
- {id: 288, cat: Audio, desc: "Audio-♬ Music"}
- {id: 111, cat: Books, desc: "Yachting, sailing, boating"}
- {id: 345, cat: Books, desc: "Yachting, sailing, boating-Solar boats"}
- {id: 318, cat: Books, desc: "Yachting, sailing, boating-Sailing life"}
@@ -174,8 +177,8 @@ caps:
- {id: 261, cat: Books, desc: "Wars at Sea-War at sea (World War II)"}
- {id: 363, cat: Books, desc: "Wars at Sea-Russo-Japanese War"}
- {id: 362, cat: Books, desc: "History of Naval Shipbuilding"}
- {id: 280, cat: Books, desc: "History of Naval Shipbuilding-Historic ships"}
- {id: 279, cat: Books, desc: "History of Naval Shipbuilding-Marine vessels"}
- {id: 280, cat: Books, desc: "History of Naval Shipbuilding-Historic ships"}
- {id: 278, cat: Books, desc: "History of Naval Shipbuilding-Warships"}
- {id: 351, cat: Books, desc: "History of Naval Shipbuilding-Battleships"}
- {id: 353, cat: Books, desc: "History of Naval Shipbuilding-Cruisers"}

View File

@@ -33,11 +33,15 @@ settings:
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://plusteca.com/\" target=\"_blank\">Plusteca</a> account <i>My Security</i> page and clicking on the <b>API Token</b> tab."
default: "Find or Generate a new API Token by accessing your <a href=\"https://plusteca.com/\" target=\"_blank\">Plusteca</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: single_file_release_use_filename
type: checkbox
label: Use filename as title for single file releases
default: true
- name: sort
type: select
label: Sort requested from site
@@ -83,7 +87,7 @@ search:
imdbId: "{{ .Query.IMDBIDShort }}"
tmdbId: "{{ .Query.TMDBID }}"
tvdbId: "{{ .Query.TVDBID }}"
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
"free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
@@ -99,8 +103,15 @@ search:
fields:
category:
selector: category_id
title:
title_optional:
selector: name
title_filename:
selector: "files[0].name"
optional: true
files:
selector: num_file
title:
text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
details:
selector: details_link
download:
@@ -108,7 +119,7 @@ search:
infohash:
selector: info_hash
poster:
selector: poster
selector: meta.poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
@@ -118,8 +129,17 @@ search:
selector: tmdb_id
tvdbid:
selector: tvdb_id
files:
selector: num_file
genre:
selector: meta.genres
filters:
- name: re_replace
args: ["(?i)(Cinema TV)", "Cinema_TV"]
- name: re_replace
args: ["(?i)(Ficção científica)", "Ficção_científica"]
- name: replace
args: [" & ", "_&_"]
description:
text: "{{ .Result.genre }}"
seeders:
selector: seeders
leechers:
@@ -147,12 +167,12 @@ search:
100%: 0 # freeleech
"*": 0 # catch errors
uploadvolumefactor:
# api returns 0=false, 1=true
# api returns False, True
selector: double_upload
case:
0: 1 # normal
1: 2 # double
False: 1 # normal
True: 2 # double
minimumseedtime:
# 5 days (as seconds = 5 x 24 x 60 x 60)
text: 432000
# json UNIT3D 6.3.0
# json UNIT3D 8.1.3

View File

@@ -11,7 +11,6 @@ links:
caps:
categorymappings:
- {id: 6, cat: PC/0day, desc: "Aplikacje/Programy"}
- {id: 26, cat: Movies, desc: "iNTERNAL"}
- {id: 4, cat: TV/Anime, desc: "Bajki/Anime"}
- {id: 1, cat: Movies/HD, desc: "Filmy HD"}
- {id: 13, cat: Movies/DVD, desc: "DVD5/9"}
@@ -27,13 +26,15 @@ caps:
- {id: 19, cat: Other, desc: "Inne"}
- {id: 8, cat: Audio, desc: "Muzyka"}
- {id: 11, cat: Movies, desc: "Paczki"}
- {id: 20, cat: Books, desc: "Book"}
- {id: 25, cat: Audio/Audiobook, desc: "Audiobook"}
- {id: 20, cat: Books, desc: "Book"}
- {id: 27, cat: TV/Other, desc: "Teatr Telewizyjny"}
- {id: 21, cat: TV/Sport, desc: "Sport"}
- {id: 9, cat: TV/HD, desc: "Seriale HD"}
- {id: 22, cat: TV/SD, desc: "Seriale SD"}
- {id: 23, cat: Movies/UHD, desc: "Filmy 4K"}
- {id: 2, cat: TV/UHD, desc: "TV 4K"}
- {id: 28, cat: TV/Documentary, desc: "TV Dokument"}
- {id: 7, cat: XXX, desc: "XXX 18+"}
modes:

View File

@@ -52,7 +52,7 @@ settings:
search:
paths:
- path: /
- path: index.php
allowEmptyInputs: true
inputs:
view: Main

View File

@@ -9,15 +9,9 @@ type: semi-private
encoding: windows-1251
followredirect: true
links:
- https://28june.rudub.online/
- https://03july.rudub.online/
legacylinks:
- https://rudub.online/
- https://29may.rudub.online/
- https://30may.rudub.online/
- https://31may.rudub.online/
- https://01june.rudub.online/
- https://02june.rudub.online/
- https://03june.rudub.online/
- https://04june.rudub.online/
- https://05june.rudub.online/
- https://06june.rudub.online/
@@ -42,6 +36,11 @@ legacylinks:
- https://25june.rudub.online/
- https://26june.rudub.online/
- https://27june.rudub.online/
- https://28june.rudub.online/
- https://29june.rudub.online/
- https://30june.rudub.online/
- https://01july.rudub.online/
- https://02july.rudub.online/
caps:
categorymappings:

View File

@@ -1,179 +0,0 @@
---
id: sharkpt
name: SharkPT
description: "SharkPT is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
language: zh-CN
type: private
encoding: UTF-8
links:
- https://sharkpt.net/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies/电影"}
- {id: 402, cat: TV, desc: "TV Series/电视连续剧"}
- {id: 403, cat: TV, desc: "TV Shows/综艺"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
- {id: 405, cat: TV/Anime, desc: "Animations/动漫"}
- {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐视频"}
- {id: 407, cat: TV/Sport, desc: "Sports/体育"}
- {id: 408, cat: Audio, desc: "Music/HQ Audio"}
- {id: 409, cat: Other, desc: "Misc/其他"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, doubanid]
movie-search: [q, imdbid, doubanid]
music-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: 2facode
type: text
label: 2FA code
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the 1ptbar Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only
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
- 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: info_activity
type: info
label: Account Inactivity
default: "Account retention rules:<ol><li>Extreme User and above will be retained forever</li><li>Users with a parked account will be banned if they do not log in for 365 consecutive days</li><li>Users with a non-parked account will be banned if they do not log in for 180 consecutive days</li><li>Users with no traffic (that is, upload/download data are both 0) will be banned if they do not log in for 10 consecutive days.</li></ol>"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
secret: ""
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
two_step_code: "{{ .Config.2facode }}"
logout: ""
securelogin: ""
ssl: yes
trackerssl: yes
error:
- selector: td.embedded:has(h2:contains("失败"))
test:
path: index.php
selector: shark-icon-button[onclick*="logout.php"]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ 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 }}"
# 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work)
search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}"
# 0 AND, 1 OR, 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
notnewword: 1
rows:
selector: div.torrent-item
fields:
category:
selector: div.torrent-category
case:
img[src$="movies64.png"]: 401
img[src$="tvseries64.png"]: 402
img[src$="tvshows64.png"]: 403
img[src$="doc64.png"]: 404
img[src$="anime64.png"]: 405
img[src$="mv64.png"]: 406
img[src$="sports64.png"]: 407
img[src$="hqaudio64.png"]: 408
img[src$="misc64.png"]: 409
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
_id:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: querystring
args: id
download:
text: "download.php?id={{ .Result._id }}"
imdbid:
selector: shark-tag-group[onClick*="imdb.com/title/tt"]
attribute: onClick
doubanid:
selector: shark-tag-group[onClick*="movie.douban.com/subject/"]
attribute: onClick
description:
selector: div.torrent-subtitle
date:
selector: div.torrent-when > span
attribute: title
filters:
- name: append
args: " +08:00" # CST
- name: dateparse
args: "yyyy-MM-dd HH:mm:ss zzz"
size:
selector: div.torrent-size
seeders:
selector: div.torrent-seeders
leechers:
selector: div.torrent-leechers
grabs:
selector: div.torrent-snatches
downloadvolumefactor:
case:
"span.s-tag:contains(\"FREE\")": 0
"span.s-tag:contains(\"50%\")": 0.5
"span.s-tag:contains(\"30%\")": 0.3
"*": 1
uploadvolumefactor:
case:
"span.s-tag:contains(\"2X\")": 2
"*": 1
minimumseedtime:
# 7 day (as seconds = 7 x 24 x 60 x 60)
text: 604800
# NexusPHP Standard v1.5 Beta 4 2010-09-19

View File

@@ -183,9 +183,9 @@ search:
grabs:
selector: div.selection_unter_ae
seeders:
selector: div.selection_unter_aa > b
selector: div.selection_unter_aa
leechers:
selector: div.selection_unter_aaa > b
selector: div.selection_unter_aaa
date_day:
# Heute 03:27:27
# Gestern 21:00:59
@@ -196,7 +196,8 @@ search:
args: ["Heute ", "Today"]
- name: replace
args: ["Gestern ", "Yesterday"]
- name: fuzzytime
- name: append
args: " +01:00" # CET
date_year:
# 03.03.2020 um 23:31:52
selector: div.selection_unter_ab:not(:contains("Heute")):not(:contains("Gestern"))

View File

@@ -149,13 +149,10 @@ search:
selector: div.selection_unter_ad
grabs:
selector: div.selection_unter_ae
filters:
- name: replace
args: [" x", ""]
seeders:
selector: div.selection_unter_aa > b
selector: div.selection_unter_aa
leechers:
selector: div.selection_unter_aaa > b
selector: div.selection_unter_aaa
date_day:
# Heute 03:27:27
# Gestern 21:00:59
@@ -166,7 +163,8 @@ search:
args: ["Heute ", "Today"]
- name: replace
args: ["Gestern ", "Yesterday"]
- name: fuzzytime
- name: append
args: " +01:00" # CET
date_year:
# 03.03.2020 um 23:31:52
selector: div.selection_unter_ab:not(:contains("Heute")):not(:contains("Gestern"))

View File

@@ -186,6 +186,8 @@ search:
args: ["Heute", "Today"]
- name: replace
args: ["Gestern", "Yesterday"]
- name: append
args: " +01:00" # CET
date_year:
# 30.02.2018 um 23:12:50
selector: div.selection_unter_ab:contains(".")

View File

@@ -1,193 +0,0 @@
---
id: torrentgalaxy
replaces:
- torrentgalaxyorg
name: TorrentGalaxy
description: "TorrentGalaxy (TGx) is a Public site for TV / MOVIES / GENERAL"
language: en-US
type: public
encoding: UTF-8
links:
- https://torrentgalaxy.to/
- https://torrentgalaxy.mx/
- https://tgx.rs/
- https://tgx.sb/
legacylinks:
- https://torrentgalaxy.org/ # redirects to *.to
- https://torrentgalaxy.pw/ # proxy list only
- https://tgx.unblocked.monster/
- https://torrentgalaxy.su/
- https://torrentgalaxy.unblockit.asia/
- https://torrentgalaxy.unblockit.mov/
- https://torrentgalaxy.unblockit.rsvp/
- https://torrentgalaxy.unblockit.vegas/
- https://torrentgalaxy.unblockit.esq/
- https://torrentgalaxy.unblockit.zip/
- https://torrentgalaxy.unblockit.foo/
- https://torrentgalaxy.unblockit.ing/
- https://torrentgalaxy.unblockninja.com/ # breaks on checkpoint
- https://tgx.proxyninja.org/ # breaks on checkpoint
caps:
categorymappings:
- {id: 28, cat: TV/Anime, desc: "Anime - All"}
- {id: 20, cat: PC/Mobile-Other, desc: "Apps - Mobile"}
- {id: 21, cat: PC, desc: "Apps - Other"}
- {id: 18, cat: PC/0day, desc: "Apps - Windows"}
- {id: 13, cat: Audio/Audiobook, desc: "Books - Audiobooks"}
- {id: 19, cat: Books/Comics, desc: "Books - Comics"}
- {id: 12, cat: Books/EBook, desc: "Books - Ebooks"}
- {id: 14, cat: Books/Technical, desc: "Books - Education"}
- {id: 15, cat: Books/Mags, desc: "Books - Magazine"}
- {id: 9, cat: TV/Documentary, desc: "Documentaries - All"}
- {id: 43, cat: PC/Mobile-Other, desc: "Games - Mobile"}
- {id: 10, cat: PC/Games, desc: "Games - Windows"}
- {id: 3, cat: Movies/UHD, desc: "Movies - 4K UHD"}
- {id: 46, cat: Movies/Foreign, desc: "Movies - Bollywood"}
- {id: 45, cat: Movies/Other, desc: "Movies - CAM/TS"}
- {id: 42, cat: Movies/HD, desc: "Movies - HD"}
- {id: 4, cat: Movies, desc: "Movies - Packs"}
- {id: 1, cat: Movies/SD, desc: "Movies - SD"}
- {id: 22, cat: Audio, desc: "Music - Albums"}
- {id: 26, cat: Audio, desc: "Music - Discography"}
- {id: 23, cat: Audio/Lossless, desc: "Music - Lossless"}
- {id: 25, cat: Audio/Video, desc: "Music - Musicvideo"}
- {id: 24, cat: Audio, desc: "Music - Singles"}
- {id: 17, cat: Audio/Other, desc: "Audio - Other"}
- {id: 40, cat: Other/Misc, desc: "Other - Other"}
- {id: 37, cat: Other, desc: "Other - Pictures"}
- {id: 33, cat: Other, desc: "Other - Training"}
- {id: 41, cat: TV/HD, desc: "TV - Episodes HD"}
- {id: 5, cat: TV/SD, desc: "TV - Episodes SD"}
- {id: 11, cat: TV/UHD, desc: "TV - Episodes 4K UHD"}
- {id: 6, cat: TV/Other, desc: "TV - Packs"}
- {id: 7, cat: TV/Sport, desc: "TV - Sports"}
- {id: 35, cat: XXX/x264, desc: "XXX - HD"}
- {id: 47, cat: XXX/Other, desc: "XXX - Misc"}
- {id: 34, cat: XXX/SD, desc: "XXX - SD"}
- {id: 48, cat: XXX/UHD, desc: "XXX - 4K UHD"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
music-search: [q]
book-search: [q]
settings:
- name: excludeads
type: checkbox
label: Exclude results which include advertisements
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:
# https://torrentgalaxy.to/galaxyfence.php?f&dropoff=%2Ftorrents.php%3Fsearch%3DHarry%2BPotter
path: galaxyfence.php?f
method: form
form: form[action="/galaxyfence.php"]
inputs:
dropoff: /torrents.php
captcha:
type: image
selector: img#captcha
input: captcha
error:
- selector: span:contains("Captcha incorrect")
test:
path: /
selector: a[href="/account-login.php"]
search:
# https://torrentgalaxy.org/torrents.php?c41=1&search=mercedes+s02e04&lang=0&sort=id&order=desc
path: torrents.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
lang: 0
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"
rows:
selector: "div.tgxtable > div:has(div[class^=\"tgxtablecell shrink\"]){{ if .Config.excludeads }}:not(:has(i.fab.fa-adversal)){{ else }}{{ end }}"
fields:
_ads:
optional: true
selector: i.fab.fa-adversal
attribute: title
category:
selector: div a[href^="/torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_full:
selector: div a[href^="/torrent/"]
attribute: title
# this title text is abbreviated but may be needed when quotes in full title cause empty title #8585
title_text:
selector: div a[href^="/torrent/"]
# fall back title, use href and clean it up
title_href:
selector: div a[href^="/torrent/"]
attribute: href
filters:
- name: re_replace
args: ["-quot-", " "]
- name: re_replace
args: ["-", " "]
title:
text: "{{ if or .Result.title_full .Result.title_text }}{{ or .Result.title_full .Result.title_text }}{{ else }}{{ .Result.href }}{{ end }}{{ if .Result._ads }} (Ads included!){{ else }}{{ end }}"
details:
selector: div a[href^="/torrent/"]
attribute: href
magnet:
selector: div a[href^="magnet:?"]
attribute: href
imdbid:
selector: a[href^="/torrents.php?search=tt"]
attribute: href
size:
selector: div span[style^="border-radius"]
seeders:
selector: div span[title="Seeders/Leechers"] font b
leechers:
selector: div span[title="Seeders/Leechers"] font:nth-child(2) b
date_ago:
# 20Mins ago
optional: true
selector: div td:last-of-type:contains("ago")
filters:
- name: timeago
date_year:
# 24/12/18 13:55
optional: true
selector: div td:last-of-type small:contains(":")
filters:
- name: append
args: " -07:00" # PDT
- name: dateparse
args: "dd/MM/yy HH:mm zzz"
date:
text: "{{ if or .Result.date_year .Result.date_ago }}{{ or .Result.date_year .Result.date_ago }}{{ else }}now{{ end }}"
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -22,6 +22,7 @@ caps:
- {id: 11, cat: Movies/HD, desc: "Film/HD/Hun"}
- {id: 2, cat: Movies/SD, desc: "Film/SD/Eng"}
- {id: 1, cat: Movies/SD, desc: "Film/SD/Hun"}
- {id: 38, cat: Audio/Audiobook, desc: "Hangoskönyv"}
- {id: 18, cat: PC/Games, desc: "Játék/ISO"}
- {id: 19, cat: PC/Games, desc: "Játék/Rip"}
- {id: 24, cat: Other, desc: "Képek"}

View File

@@ -39,6 +39,8 @@ namespace Jackett.Common.Indexers
public virtual bool SupportsPagination => false;
public virtual int PageSize => 0;
public virtual bool IsConfigured { get; protected set; }
public virtual string[] Tags { get; protected set; }
@@ -388,6 +390,9 @@ namespace Jackett.Common.Indexers
}
}
public abstract IIndexerRequestGenerator GetRequestGenerator();
public abstract IParseIndexerResponse GetParser();
protected abstract Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query);
}
@@ -601,6 +606,25 @@ namespace Jackett.Common.Indexers
return result;
}
protected async Task<WebResult> RequestWithCookiesAndRetryAsync(WebRequest request)
{
return await RetryStrategy
.ExecuteAsync(async _ => await RequestWithCookiesAsync(request))
.ConfigureAwait(false);
}
protected virtual async Task<WebResult> RequestWithCookiesAsync(WebRequest request)
{
request.Encoding = Encoding;
var result = await webclient.GetResultAsync(request);
CheckSiteDown(result);
UpdateCookieHeader(result.Cookies);
return result;
}
protected async Task<WebResult> RequestLoginAndFollowRedirect(string url, IEnumerable<KeyValuePair<string, string>> data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null, bool accumulateCookies = false, Dictionary<string, string> headers = null)
{
var request = new WebRequest
@@ -808,6 +832,99 @@ namespace Jackett.Common.Indexers
protected WebClient webclient;
protected readonly string downloadUrlBase = "";
public override IIndexerRequestGenerator GetRequestGenerator() => throw new NotImplementedException();
public override IParseIndexerResponse GetParser() => throw new NotImplementedException();
protected override Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
return FetchReleasesAsync(g => g.GetSearchRequests(query), query);
}
protected virtual async Task<IEnumerable<ReleaseInfo>> FetchReleasesAsync(Func<IIndexerRequestGenerator, IndexerPageableRequestChain> pageableRequestChainSelector, TorznabQuery query)
{
var releases = new List<ReleaseInfo>();
var generator = GetRequestGenerator();
var parser = GetParser();
var pageableRequestChain = pageableRequestChainSelector(generator);
for (var i = 0; i < pageableRequestChain.Tiers; i++)
{
var pageableRequests = pageableRequestChain.GetTier(i).ToList();
foreach (var pageableRequest in pageableRequests)
{
var pagedReleases = new List<ReleaseInfo>();
var pageSize = PageSize;
foreach (var request in pageableRequest)
{
var page = await FetchPageAsync(request, parser);
pageSize = pageSize == 1 ? page.Releases.Count : pageSize;
pagedReleases.AddRange(page.Releases);
if (!IsFullPage(page.Releases, pageSize))
{
break;
}
}
releases.AddRange(pagedReleases.Where(r => IsValidRelease(r, query.InteractiveSearch)));
}
if (releases.Any())
{
break;
}
}
return releases;
}
protected virtual bool IsFullPage(IList<ReleaseInfo> page, int pageSize)
{
return pageSize != 0 && page.Count >= pageSize;
}
protected virtual async Task<IndexerQueryResult> FetchPageAsync(IndexerRequest request, IParseIndexerResponse parser)
{
var response = await FetchIndexerResponseAsync(request);
try
{
var releases = parser.ParseResponse(response).ToList();
if (releases.Count == 0)
{
logger.Trace("No releases found. Response: {0}", response.Content);
}
return new IndexerQueryResult
{
Releases = releases,
Response = response.WebResponse
};
}
catch (Exception ex)
{
logger.Trace("Unexpected response content ({0} bytes): {1}", response.WebResponse.ContentString.Length, response.WebResponse.ContentString);
OnParseError(response.Content, ex);
throw;
}
}
protected virtual async Task<IndexerResponse> FetchIndexerResponseAsync(IndexerRequest request)
{
var response = await RequestWithCookiesAndRetryAsync(request.WebRequest);
return new IndexerResponse(request, response);
}
}
public abstract class BaseCachingWebIndexer : BaseWebIndexer

View File

@@ -1,323 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Extensions;
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;
namespace Jackett.Common.Indexers
{
[ExcludeFromCodeCoverage]
public class BroadcasTheNet : IndexerBase
{
public override string Id => "broadcasthenet";
public override string[] Replaces => new[] { "broadcastthenet" };
public override string Name => "BroadcasTheNet";
public override string Description => "BroadcasTheNet (BTN) is an invite-only torrent tracker focused on TV shows";
// Status: https://btn.trackerstatus.info/
public override string SiteLink { get; protected set; } = "https://broadcasthe.net/";
public override string Language => "en-US";
public override string Type => "private";
public override bool SupportsPagination => true;
public override TorznabCapabilities TorznabCaps => SetCapabilities();
// based on https://github.com/Prowlarr/Prowlarr/tree/develop/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet
private readonly string APIBASE = "https://api.broadcasthe.net";
// TODO: remove ConfigurationDataAPIKey class and use ConfigurationDataPasskey instead
private new ConfigurationDataAPIKey configData
{
get => (ConfigurationDataAPIKey)base.configData;
set => base.configData = value;
}
public BroadcasTheNet(IIndexerConfigurationService configService, WebClient wc, Logger l,
IProtectionService ps, ICacheService cs)
: base(configService: configService,
client: wc,
logger: l,
p: ps,
cacheService: cs,
configData: new ConfigurationDataAPIKey())
{
webclient.requestDelay = 4;
}
private TorznabCapabilities SetCapabilities()
{
var caps = new TorznabCapabilities
{
LimitsDefault = 100,
LimitsMax = 1000,
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.TvdbId
}
};
caps.Categories.AddCategoryMapping("SD", TorznabCatType.TVSD, "SD");
caps.Categories.AddCategoryMapping("720p", TorznabCatType.TVHD, "720p");
caps.Categories.AddCategoryMapping("1080p", TorznabCatType.TVHD, "1080p");
caps.Categories.AddCategoryMapping("1080i", TorznabCatType.TVHD, "1080i");
caps.Categories.AddCategoryMapping("2160p", TorznabCatType.TVUHD, "2160p");
caps.Categories.AddCategoryMapping("Portable Device", TorznabCatType.TVSD, "Portable Device");
return caps;
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
IsConfigured = false;
try
{
var results = await PerformQuery(new TorznabQuery());
if (!results.Any())
{
throw new Exception("Testing returned no results!");
}
IsConfigured = true;
SaveConfig();
}
catch (Exception e)
{
throw new ExceptionWithConfigData(e.Message, configData);
}
return IndexerConfigurationStatus.Completed;
}
private string JsonRPCRequest(string method, JArray parameters)
{
dynamic request = new JObject();
request["jsonrpc"] = "2.0";
request["method"] = method;
request["params"] = parameters;
request["id"] = Guid.NewGuid().ToString().Substring(0, 8);
return request.ToString();
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
var searchTerm = query.SearchTerm ?? string.Empty;
var btnResults = query.Limit;
if (btnResults == 0)
{
btnResults = (int)TorznabCaps.LimitsDefault;
}
var btnOffset = query.Offset;
var releases = new List<ReleaseInfo>();
var parameters = new Dictionary<string, object>();
if (query.IsTvdbQuery)
{
parameters["tvdb"] = query.TvdbID;
}
if (searchTerm.IsNotNullOrWhiteSpace())
{
parameters["search"] = searchTerm.Replace(" ", "%");
}
// If only the season/episode is searched for then change format to match expected format
if (query.Season > 0 && query.Episode.IsNullOrWhiteSpace())
{
parameters["category"] = "Episode";
parameters["name"] = $"S{query.Season:00}E%";
}
else if (DateTime.TryParseExact($"{query.Season} {query.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate))
{
// Daily Episode
parameters["name"] = showDate.ToString("yyyy.MM.dd");
parameters["category"] = "Episode";
}
else if (query.Season > 0 && int.TryParse(query.Episode, out var episode) && episode > 0)
{
// Standard (S/E) Episode
parameters["name"] = $"S{query.Season:00}E{episode:00}%";
parameters["category"] = "Episode";
}
else if (searchTerm.IsNotNullOrWhiteSpace() && int.TryParse(searchTerm, out _) && query.TvdbID > 0)
{
// Disable ID-based searches for episodes with absolute episode number
return releases;
}
var requestPayload = new JArray
{
new JValue(configData.Key.Value),
JObject.FromObject(parameters),
new JValue(btnResults),
new JValue(btnOffset)
};
var response = await RequestWithCookiesAndRetryAsync(
APIBASE, method: RequestType.POST,
headers: new Dictionary<string, string>
{
{"Accept", "application/json-rpc, application/json"},
{"Content-Type", "application/json-rpc"}
}, rawbody: JsonRPCRequest("getTorrents", requestPayload), emulateBrowser: false);
try
{
var btnResponse = JsonConvert.DeserializeObject<BTNRPCResponse>(response.ContentString);
if (btnResponse?.Result?.Torrents == null)
{
return releases;
}
foreach (var itemKey in btnResponse.Result.Torrents)
{
var btnResult = itemKey.Value;
var descriptions = new List<string>();
if (!string.IsNullOrWhiteSpace(btnResult.Series))
{
descriptions.Add("Series: " + btnResult.Series);
}
if (!string.IsNullOrWhiteSpace(btnResult.GroupName))
{
descriptions.Add("Group Name: " + btnResult.GroupName);
}
if (!string.IsNullOrWhiteSpace(btnResult.Source))
{
descriptions.Add("Source: " + btnResult.Source);
}
if (!string.IsNullOrWhiteSpace(btnResult.Container))
{
descriptions.Add("Container: " + btnResult.Container);
}
if (!string.IsNullOrWhiteSpace(btnResult.Codec))
{
descriptions.Add("Codec: " + btnResult.Codec);
}
if (!string.IsNullOrWhiteSpace(btnResult.Resolution))
{
descriptions.Add("Resolution: " + btnResult.Resolution);
}
if (!string.IsNullOrWhiteSpace(btnResult.Origin))
{
descriptions.Add("Origin: " + btnResult.Origin);
}
if (!string.IsNullOrWhiteSpace(btnResult.YoutubeTrailer))
{
descriptions.Add(
"Youtube Trailer: <a href=\"" + btnResult.YoutubeTrailer + "\">" + btnResult.YoutubeTrailer +
"</a>");
}
var imdb = ParseUtil.GetImdbId(btnResult.ImdbID);
var link = new Uri(btnResult.DownloadURL);
var details = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}");
var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time);
var release = new ReleaseInfo
{
Guid = link,
Details = details,
Link = link,
Title = btnResult.ReleaseName,
Description = string.Join("<br />\n", descriptions),
Category = MapTrackerCatToNewznab(btnResult.Resolution),
InfoHash = btnResult.InfoHash,
Size = btnResult.Size,
Grabs = btnResult.Snatched,
Seeders = btnResult.Seeders,
Peers = btnResult.Seeders + btnResult.Leechers,
PublishDate = publishDate,
TVDBId = btnResult.TvdbID,
RageID = btnResult.TvrageID,
Imdb = imdb,
DownloadVolumeFactor = 0, // ratioless
UploadVolumeFactor = 1,
MinimumRatio = 1,
MinimumSeedTime = btnResult.Category.ToUpperInvariant() == "SEASON" ? 432000 : 86400 // 120 hours for seasons and 24 hours for episodes
};
if (!string.IsNullOrEmpty(btnResult.SeriesBanner))
{
release.Poster = new Uri(btnResult.SeriesBanner);
}
if (!release.Category.Any()) // default to TV
{
release.Category.Add(TorznabCatType.TV.ID);
}
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(response.ContentString, ex);
}
return releases;
}
public class BTNRPCResponse
{
public string Id { get; set; }
public BTNResultPage Result { get; set; }
}
public class BTNResultPage
{
public Dictionary<int, BTNResultItem> Torrents { get; set; }
}
public class BTNResultItem
{
public int TorrentID { get; set; }
public string DownloadURL { get; set; }
public string GroupName { get; set; }
public int GroupID { get; set; }
public int SeriesID { get; set; }
public string Series { get; set; }
public string SeriesBanner { get; set; }
public string SeriesPoster { get; set; }
public string YoutubeTrailer { get; set; }
public string Category { get; set; }
public int? Snatched { get; set; }
public int? Seeders { get; set; }
public int? Leechers { get; set; }
public string Source { get; set; }
public string Container { get; set; }
public string Codec { get; set; }
public string Resolution { get; set; }
public string Origin { get; set; }
public string ReleaseName { get; set; }
public long Size { get; set; }
public long Time { get; set; }
public int? TvdbID { get; set; }
public int? TvrageID { get; set; }
public string ImdbID { get; set; }
public string InfoHash { get; set; }
}
}
}

View File

@@ -15,7 +15,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers.Abstract
namespace Jackett.Common.Indexers.Definitions.Abstract
{
[ExcludeFromCodeCoverage]
public abstract class AvistazTracker : IndexerBase

View File

@@ -11,7 +11,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers.Abstract
namespace Jackett.Common.Indexers.Definitions.Abstract
{
[ExcludeFromCodeCoverage]
public abstract class CouchPotatoTracker : IndexerBase

View File

@@ -18,7 +18,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers.Abstract
namespace Jackett.Common.Indexers.Definitions.Abstract
{
[ExcludeFromCodeCoverage]
public abstract class GazelleTracker : IndexerBase

View File

@@ -16,7 +16,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers.Abstract
namespace Jackett.Common.Indexers.Definitions.Abstract
{
[ExcludeFromCodeCoverage]
public abstract class SpeedAppTracker : IndexerBase

View File

@@ -1,14 +1,14 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AlphaRatio : GazelleTracker

View File

@@ -17,7 +17,7 @@ using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AniDUB : IndexerBase

View File

@@ -17,7 +17,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Anidex : IndexerBase

View File

@@ -17,7 +17,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AnimeBytes : BaseCachingWebIndexer

View File

@@ -17,7 +17,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AnimeTorrents : IndexerBase

View File

@@ -20,7 +20,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AudioBookBay : IndexerBase

View File

@@ -1,13 +1,13 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Extensions;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class AvistaZ : AvistazTracker

View File

@@ -17,7 +17,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BJShare : IndexerBase

View File

@@ -17,7 +17,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BakaBT : IndexerBase

View File

@@ -13,7 +13,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BeyondHDAPI : IndexerBase

View File

@@ -17,7 +17,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BitHDTV : IndexerBase

View File

@@ -15,7 +15,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BrasilTracker : IndexerBase

View File

@@ -0,0 +1,414 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Extensions;
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;
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BroadcasTheNet : IndexerBase
{
public override string Id => "broadcasthenet";
public override string[] Replaces => new[] { "broadcastthenet" };
public override string Name => "BroadcasTheNet";
public override string Description => "BroadcasTheNet (BTN) is an invite-only torrent tracker focused on TV shows";
// Status: https://btn.trackerstatus.info/
public override string SiteLink { get; protected set; } = "https://broadcasthe.net/";
public override string Language => "en-US";
public override string Type => "private";
public override bool SupportsPagination => true;
public override int PageSize => 100;
public override TorznabCapabilities TorznabCaps => SetCapabilities();
// TODO: remove ConfigurationDataAPIKey class and use ConfigurationDataPasskey instead
private new ConfigurationDataAPIKey configData
{
get => (ConfigurationDataAPIKey)base.configData;
set => base.configData = value;
}
public BroadcasTheNet(IIndexerConfigurationService configService, WebClient wc, Logger l,
IProtectionService ps, ICacheService cs)
: base(configService: configService,
client: wc,
logger: l,
p: ps,
cacheService: cs,
configData: new ConfigurationDataAPIKey())
{
webclient.requestDelay = 5;
}
private TorznabCapabilities SetCapabilities()
{
var caps = new TorznabCapabilities
{
LimitsDefault = 100,
LimitsMax = 1000,
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.TvdbId
}
};
caps.Categories.AddCategoryMapping("SD", TorznabCatType.TVSD, "SD");
caps.Categories.AddCategoryMapping("720p", TorznabCatType.TVHD, "720p");
caps.Categories.AddCategoryMapping("1080p", TorznabCatType.TVHD, "1080p");
caps.Categories.AddCategoryMapping("1080i", TorznabCatType.TVHD, "1080i");
caps.Categories.AddCategoryMapping("2160p", TorznabCatType.TVUHD, "2160p");
caps.Categories.AddCategoryMapping("Portable Device", TorznabCatType.TVSD, "Portable Device");
return caps;
}
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new BroadcastheNetRequestGenerator(configData, TorznabCaps);
}
public override IParseIndexerResponse GetParser()
{
return new BroadcastheNetParser(SiteLink, TorznabCaps.Categories);
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
IsConfigured = false;
try
{
var results = await PerformQuery(new TorznabQuery());
if (!results.Any())
{
throw new Exception("Testing returned no results!");
}
IsConfigured = true;
SaveConfig();
}
catch (Exception e)
{
throw new ExceptionWithConfigData(e.Message, configData);
}
return IndexerConfigurationStatus.Completed;
}
}
public class BroadcastheNetRequestGenerator : IIndexerRequestGenerator
{
private readonly ConfigurationDataAPIKey _configData;
private readonly TorznabCapabilities _torznabCaps;
// based on https://github.com/Prowlarr/Prowlarr/tree/develop/src/NzbDrone.Core/Indexers/Definitions/BroadcastheNet
private const string ApiBase = "https://api.broadcasthe.net";
public BroadcastheNetRequestGenerator(ConfigurationDataAPIKey configData, TorznabCapabilities torznabCaps)
{
_configData = configData;
_torznabCaps = torznabCaps;
}
public IndexerPageableRequestChain GetSearchRequests(TorznabQuery query)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = query.SearchTerm ?? string.Empty;
var btnResults = query.Limit;
if (btnResults == 0)
{
btnResults = _torznabCaps.LimitsDefault.GetValueOrDefault(100);
}
var btnOffset = query.Offset;
var parameters = new BroadcastheNetSearchQuery();
if (query.IsTvdbQuery)
{
parameters.Tvdb = query.TvdbID.ToString();
}
if (searchTerm.IsNotNullOrWhiteSpace())
{
parameters.Search = searchTerm.Replace(" ", "%");
}
// If only the season/episode is searched for then change format to match expected format
if (query.Season > 0 && query.Episode.IsNullOrWhiteSpace())
{
// Search Season
parameters.Category = "Season";
parameters.Name = $"Season {query.Season}%";
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
parameters = parameters.Clone();
// Search Episode
parameters.Category = "Episode";
parameters.Name = $"S{query.Season:00}E%";
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
}
else if (DateTime.TryParseExact($"{query.Season} {query.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate))
{
// Daily Episode
parameters.Name = showDate.ToString("yyyy.MM.dd");
parameters.Category = "Episode";
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
}
else if (query.Season > 0 && int.TryParse(query.Episode, out var episode) && episode > 0)
{
// Standard (S/E) Episode
parameters.Name = $"S{query.Season:00}E{episode:00}%";
parameters.Category = "Episode";
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
}
else if (searchTerm.IsNotNullOrWhiteSpace() && int.TryParse(searchTerm, out _) && query.TvdbID > 0)
{
// Disable ID-based searches for episodes with absolute episode number
return new IndexerPageableRequestChain();
}
else
{
// Neither a season only search nor daily nor standard, fall back to query
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
}
return pageableRequests;
}
private IEnumerable<IndexerRequest> GetPagedRequests(BroadcastheNetSearchQuery parameters, int results, int offset)
{
var webRequest = new WebRequest
{
Url = ApiBase,
Type = RequestType.POST,
Headers = new Dictionary<string, string>
{
{ "Accept", "application/json-rpc, application/json" },
{ "Content-Type", "application/json-rpc" }
},
RawBody = JsonRpcRequest("getTorrents", new JArray
{
new JValue(_configData.Key.Value),
JObject.FromObject(parameters),
new JValue(results),
new JValue(offset)
}),
EmulateBrowser = false
};
yield return new IndexerRequest(webRequest);
}
private string JsonRpcRequest(string method, JArray parameters)
{
dynamic request = new JObject();
request["jsonrpc"] = "2.0";
request["method"] = method;
request["params"] = parameters;
request["id"] = Guid.NewGuid().ToString().Substring(0, 8);
return request.ToString();
}
}
public class BroadcastheNetParser : IParseIndexerResponse
{
private readonly string _siteLink;
private readonly TorznabCapabilitiesCategories _categories;
public BroadcastheNetParser(string siteLink, TorznabCapabilitiesCategories categories)
{
_siteLink = siteLink;
_categories = categories;
}
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
{
var releases = new List<ReleaseInfo>();
var jsonResponse = JsonConvert.DeserializeObject<BroadcastheNetResponse>(indexerResponse.Content);
if (jsonResponse?.Result?.Torrents == null)
{
return releases;
}
foreach (var itemKey in jsonResponse.Result.Torrents)
{
var btnResult = itemKey.Value;
var descriptions = new List<string>();
if (btnResult.Series.IsNotNullOrWhiteSpace())
{
descriptions.Add("Series: " + btnResult.Series);
}
if (btnResult.GroupName.IsNotNullOrWhiteSpace())
{
descriptions.Add("Group Name: " + btnResult.GroupName);
}
if (btnResult.Source.IsNotNullOrWhiteSpace())
{
descriptions.Add("Source: " + btnResult.Source);
}
if (btnResult.Container.IsNotNullOrWhiteSpace())
{
descriptions.Add("Container: " + btnResult.Container);
}
if (btnResult.Codec.IsNotNullOrWhiteSpace())
{
descriptions.Add("Codec: " + btnResult.Codec);
}
if (btnResult.Resolution.IsNotNullOrWhiteSpace())
{
descriptions.Add("Resolution: " + btnResult.Resolution);
}
if (btnResult.Origin.IsNotNullOrWhiteSpace())
{
descriptions.Add("Origin: " + btnResult.Origin);
}
if (btnResult.YoutubeTrailer.IsNotNullOrWhiteSpace())
{
descriptions.Add(
"Youtube Trailer: <a href=\"" + btnResult.YoutubeTrailer + "\">" + btnResult.YoutubeTrailer +
"</a>");
}
var imdb = ParseUtil.GetImdbId(btnResult.ImdbID);
var link = new Uri(btnResult.DownloadURL);
var details = new Uri($"{_siteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}");
var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time);
var release = new ReleaseInfo
{
Guid = link,
Details = details,
Link = link,
Title = btnResult.ReleaseName,
Description = string.Join("<br />\n", descriptions),
Category = _categories.MapTrackerCatToNewznab(btnResult.Resolution),
InfoHash = btnResult.InfoHash,
Size = btnResult.Size,
Grabs = btnResult.Snatched,
Seeders = btnResult.Seeders,
Peers = btnResult.Seeders + btnResult.Leechers,
PublishDate = publishDate,
TVDBId = btnResult.TvdbID,
RageID = btnResult.TvrageID,
Imdb = imdb,
DownloadVolumeFactor = 0, // ratioless
UploadVolumeFactor = 1,
MinimumRatio = 1,
MinimumSeedTime = btnResult.Category.ToUpperInvariant() == "SEASON" ? 432000 : 86400 // 120 hours for seasons and 24 hours for episodes
};
if (btnResult.SeriesBanner.IsNotNullOrWhiteSpace())
{
var posterUrl = btnResult.SeriesBanner;
if (posterUrl.StartsWith("//"))
{
posterUrl = "https:" + posterUrl;
}
release.Poster = new Uri(posterUrl);
}
if (!release.Category.Any()) // default to TV
{
release.Category.Add(TorznabCatType.TV.ID);
}
releases.Add(release);
}
return releases;
}
}
public class BroadcastheNetSearchQuery
{
[JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Category { get; set; }
[JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty("search", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Search { get; set; }
[JsonProperty("tvdb", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Tvdb { get; set; }
[JsonProperty("tvrage", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Tvrage { get; set; }
public BroadcastheNetSearchQuery Clone()
{
return MemberwiseClone() as BroadcastheNetSearchQuery;
}
}
public class BroadcastheNetResponse
{
public string Id { get; set; }
public BroadcastheNetResult Result { get; set; }
}
public class BroadcastheNetResult
{
public Dictionary<int, BroadcastheNetTorrent> Torrents { get; set; }
}
public class BroadcastheNetTorrent
{
public int TorrentID { get; set; }
public string DownloadURL { get; set; }
public string GroupName { get; set; }
public int GroupID { get; set; }
public int SeriesID { get; set; }
public string Series { get; set; }
public string SeriesBanner { get; set; }
public string SeriesPoster { get; set; }
public string YoutubeTrailer { get; set; }
public string Category { get; set; }
public int? Snatched { get; set; }
public int? Seeders { get; set; }
public int? Leechers { get; set; }
public string Source { get; set; }
public string Container { get; set; }
public string Codec { get; set; }
public string Resolution { get; set; }
public string Origin { get; set; }
public string ReleaseName { get; set; }
public long Size { get; set; }
public long Time { get; set; }
public int? TvdbID { get; set; }
public int? TvrageID { get; set; }
public string ImdbID { get; set; }
public string InfoHash { get; set; }
}
}

View File

@@ -1,11 +1,11 @@
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class BrokenStones : GazelleTracker

View File

@@ -1,11 +1,11 @@
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class CGPeers : GazelleTracker

View File

@@ -27,7 +27,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
public class CardigannIndexer : BaseWebIndexer
{

View File

@@ -17,7 +17,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Cinecalidad : IndexerBase

View File

@@ -1,12 +1,12 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class CinemaZ : AvistazTracker

View File

@@ -2,13 +2,13 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class DICMusic : GazelleTracker

View File

@@ -20,7 +20,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class DivxTotal : IndexerBase

View File

@@ -18,7 +18,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class DonTorrent : IndexerBase
@@ -28,10 +28,10 @@ namespace Jackett.Common.Indexers
public override string Name => "DonTorrent";
public override string Description => "DonTorrent is a SPANISH public tracker for MOVIES / TV / GENERAL";
// in the event the redirect is inactive https://t.me/s/dontorrent should have the latest working domain
public override string SiteLink { get; protected set; } = "https://dontorrent.esq/";
public override string SiteLink { get; protected set; } = "https://dontorrent.city/";
public override string[] AlternativeSiteLinks => new[]
{
"https://dontorrent.esq/",
"https://dontorrent.city/",
"https://todotorrents.org/",
"https://tomadivx.net/",
"https://seriesblanco.one/",
@@ -40,7 +40,6 @@ namespace Jackett.Common.Indexers
};
public override string[] LegacySiteLinks => new[]
{
"https://dontorrent.makeup/",
"https://dontorrent.band/",
"https://dontorrent.center/",
"https://dontorrent.cooking/",
@@ -56,6 +55,7 @@ namespace Jackett.Common.Indexers
"https://dontorrent.fyi/",
"https://dontorrent.sbs/",
"https://dontorrent.cc/",
"https://dontorrent.esq/",
};
public override string Language => "es-ES";
public override string Type => "public";

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class EpubLibre : IndexerBase

View File

@@ -12,7 +12,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
public class EraiRaws : IndexerBase
{

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Services.Interfaces;
@@ -10,7 +10,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class ExoticaZ : AvistazTracker

View File

@@ -4,13 +4,14 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;
using Jackett.Common.Indexers.Feeds;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers.Feeds
namespace Jackett.Common.Indexers.Definitions.Feeds
{
[ExcludeFromCodeCoverage]
public class AnimeTosho : BaseNewznabIndexer

View File

@@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;
using Jackett.Common.Indexers.Feeds;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -14,7 +15,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers.Feeds
namespace Jackett.Common.Indexers.Definitions.Feeds
{
[ExcludeFromCodeCoverage]
public class MoreThanTVAPI : BaseNewznabIndexer

View File

@@ -20,7 +20,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class FileList : IndexerBase

View File

@@ -15,7 +15,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class FunFile : IndexerBase

View File

@@ -7,7 +7,7 @@ using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Jackett.Common.Extensions;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Services.Interfaces;
@@ -17,7 +17,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class GazelleGamesApi : GazelleTracker

View File

@@ -7,7 +7,7 @@ using System.Net;
using System.Text;
using System.Threading.Tasks;
using Jackett.Common.Extensions;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
@@ -16,7 +16,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class GreatPosterWall : GazelleTracker

View File

@@ -14,7 +14,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class HDBitsApi : IndexerBase

View File

@@ -16,7 +16,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class HDTorrents : IndexerBase

View File

@@ -16,7 +16,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class IPTorrents : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class ImmortalSeed : IndexerBase

View File

@@ -17,7 +17,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Libble : IndexerBase

View File

@@ -16,7 +16,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class LostFilm : IndexerBase
@@ -164,7 +164,7 @@ namespace Jackett.Common.Indexers
var qCaptchaImg = document.QuerySelector("img#captcha_pictcha");
if (qCaptchaImg != null)
{
var captchaUrl = SiteLink + qCaptchaImg.GetAttribute("src");
var captchaUrl = SiteLink + qCaptchaImg.GetAttribute("src").TrimStart('/');
var captchaImage = await RequestWithCookiesAsync(captchaUrl, loginPage.Cookies);
configData.CaptchaImage.Value = captchaImage.ContentBytes;
}

View File

@@ -19,7 +19,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class MTeamTp : IndexerBase

View File

@@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Magnetico : IndexerBase

View File

@@ -19,7 +19,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class MejorTorrent : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class MyAnonamouse : IndexerBase

View File

@@ -16,7 +16,7 @@ using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class NCore : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class NebulanceAPI : IndexerBase

View File

@@ -19,7 +19,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class NorBits : BaseCachingWebIndexer

View File

@@ -3,14 +3,14 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Orpheus : GazelleTracker

View File

@@ -15,7 +15,7 @@ using Jackett.Common.Utils;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class PassThePopcorn : IndexerBase

View File

@@ -13,7 +13,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class PixelHD : IndexerBase

View File

@@ -15,7 +15,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class PreToMe : IndexerBase

View File

@@ -1,13 +1,13 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class PrivateHD : AvistazTracker

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Newtonsoft.Json.Linq;
@@ -11,7 +11,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Redacted : GazelleTracker

View File

@@ -1,13 +1,13 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class RetroFlix : SpeedAppTracker

View File

@@ -14,7 +14,7 @@ using Jackett.Common.Utils;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class RevolutionTT : IndexerBase

View File

@@ -18,7 +18,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class RuTracker : IndexerBase

View File

@@ -13,7 +13,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SceneHD : IndexerBase

View File

@@ -15,7 +15,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SceneTime : IndexerBase

View File

@@ -2,14 +2,14 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SecretCinema : GazelleTracker

View File

@@ -17,7 +17,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class ShareWood : IndexerBase

View File

@@ -14,7 +14,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Shazbat : IndexerBase

View File

@@ -1,12 +1,12 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SpeedApp : SpeedAppTracker

View File

@@ -15,7 +15,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SpeedCD : IndexerBase

View File

@@ -16,7 +16,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class SubsPlease : IndexerBase

View File

@@ -16,7 +16,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TVStore : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Toloka : IndexerBase

View File

@@ -14,7 +14,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentBytes : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentDay : IndexerBase

View File

@@ -15,7 +15,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentHeaven : IndexerBase

View File

@@ -14,7 +14,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentNetwork : IndexerBase

View File

@@ -15,7 +15,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentSyndikat : IndexerBase

View File

@@ -15,7 +15,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class TorrentsCSV : IndexerBase

View File

@@ -12,7 +12,7 @@ using Jackett.Common.Utils;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Uniotaku : IndexerBase

View File

@@ -20,7 +20,7 @@ using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class Wolfmax4K : IndexerBase

View File

@@ -16,7 +16,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class XSpeeds : IndexerBase

View File

@@ -19,7 +19,7 @@ using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class ZonaQ : IndexerBase

View File

@@ -1,14 +1,14 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using NLog;
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class iAnon : GazelleTracker

View File

@@ -0,0 +1,9 @@
using Jackett.Common.Models;
namespace Jackett.Common.Indexers
{
public interface IIndexerRequestGenerator
{
IndexerPageableRequestChain GetSearchRequests(TorznabQuery query);
}
}

Some files were not shown because too many files have changed in this diff Show More