mirror of
https://github.com/Jackett/Jackett.git
synced 2025-12-19 12:58:04 +01:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b8dde49b6 | ||
|
|
9ffdbede53 | ||
|
|
8aec74aed1 | ||
|
|
7f91629dc2 | ||
|
|
71f68bf5e6 | ||
|
|
b9971794ba | ||
|
|
59e45c382d | ||
|
|
43b73758b3 | ||
|
|
8d0d161c10 | ||
|
|
abf6ce7033 | ||
|
|
69c2c30176 | ||
|
|
e1e5685bfa | ||
|
|
d9562d57de | ||
|
|
b3e4d94daa | ||
|
|
8183d81e1b | ||
|
|
d9bea7342d | ||
|
|
741521f154 | ||
|
|
cbc5a98db0 | ||
|
|
7b657d3073 | ||
|
|
48ebd9634d | ||
|
|
65bad18b5f | ||
|
|
29ec33492b | ||
|
|
0a3ec0757a | ||
|
|
90c5f73d55 | ||
|
|
35861079f3 | ||
|
|
c0a6cabd91 | ||
|
|
c48e0e5e59 | ||
|
|
0f93f5b96a | ||
|
|
2c1d5ef2fd | ||
|
|
331ed5d052 | ||
|
|
ff390a99bf |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
179
src/Jackett.Common/Definitions/bluraytracker.yml
Normal file
179
src/Jackett.Common/Definitions/bluraytracker.yml
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -52,7 +52,7 @@ settings:
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /
|
||||
- path: index.php
|
||||
allowEmptyInputs: true
|
||||
inputs:
|
||||
view: Main
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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"))
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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(".")
|
||||
|
||||
@@ -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
|
||||
@@ -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"}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
414
src/Jackett.Common/Indexers/Definitions/BroadcasTheNet.cs
Normal file
414
src/Jackett.Common/Indexers/Definitions/BroadcasTheNet.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
{
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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";
|
||||
@@ -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
|
||||
@@ -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
|
||||
{
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
9
src/Jackett.Common/Indexers/IIndexerRequestGenerator.cs
Normal file
9
src/Jackett.Common/Indexers/IIndexerRequestGenerator.cs
Normal 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
Reference in New Issue
Block a user