mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-12 23:14:08 +02:00
Compare commits
51 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e05570f360 | ||
![]() |
6a1319c308 | ||
![]() |
6d453e9bf3 | ||
![]() |
ceee2d6873 | ||
![]() |
2aa782498f | ||
![]() |
42f0f9a58c | ||
![]() |
7da865ea07 | ||
![]() |
b01a72c393 | ||
![]() |
b7541191c2 | ||
![]() |
1ead9bb3f0 | ||
![]() |
f0c19c39dd | ||
![]() |
b0a782d8ac | ||
![]() |
ca585c58ed | ||
![]() |
b2de0cab9c | ||
![]() |
eada579da0 | ||
![]() |
dfe6d355c6 | ||
![]() |
3f4e88bcbe | ||
![]() |
878f3a92aa | ||
![]() |
4f9b0b0c81 | ||
![]() |
df4fcbd6a0 | ||
![]() |
8b6c5b532b | ||
![]() |
456338399b | ||
![]() |
ee279dffac | ||
![]() |
31a7145954 | ||
![]() |
998d991cd6 | ||
![]() |
cc5ad5001a | ||
![]() |
fd35241d15 | ||
![]() |
b28def09d6 | ||
![]() |
0b4a1f8f71 | ||
![]() |
d616ab5717 | ||
![]() |
3a0f670845 | ||
![]() |
010b0d8c1b | ||
![]() |
9a2ab09f16 | ||
![]() |
e9c4d15bff | ||
![]() |
f15b45d6bd | ||
![]() |
86cdecf418 | ||
![]() |
20cb8d1d5e | ||
![]() |
f5c23e77f9 | ||
![]() |
9674ddd4cc | ||
![]() |
d605cc87a4 | ||
![]() |
64fb434d0f | ||
![]() |
fb9d2fc77c | ||
![]() |
c9feefd087 | ||
![]() |
341d761758 | ||
![]() |
13a8aea9bd | ||
![]() |
13c94b4b45 | ||
![]() |
663aa93d72 | ||
![]() |
234e9cc246 | ||
![]() |
f72468463c | ||
![]() |
eb538ce6ef | ||
![]() |
8a51a26df5 |
12
README.md
12
README.md
@@ -83,6 +83,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* MejorTorrent
|
||||
* MixTapeTorrent
|
||||
* Monova
|
||||
* Montorrent
|
||||
* MovCr
|
||||
* MoviesDVDR
|
||||
* MyPornClub
|
||||
@@ -122,6 +123,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* SkyTorrentsClone2 (*.to)
|
||||
* Solid Torrents
|
||||
* sosulki
|
||||
* SubsPlease
|
||||
* sukebei-Pantsu
|
||||
* sukebei.Nyaa.si
|
||||
* The Pirate Bay (TPB)
|
||||
@@ -220,7 +222,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* 2 Fast 4 You
|
||||
* 3ChangTrai (3CT) [![(invite needed)][inviteneeded]](#)
|
||||
* 3D Torrents (3DT) [![(invite needed)][inviteneeded]](#)
|
||||
* 3evils
|
||||
* 4thD (4th Dimension)
|
||||
* 52PT
|
||||
* 720pier
|
||||
@@ -251,7 +252,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* BeyondHD (BHD)
|
||||
* Bibliotik
|
||||
* BIGTorrent
|
||||
* BigTower
|
||||
* Bit-City Reloaded [![(invite needed)][inviteneeded]](#)
|
||||
* BIT-HDTV
|
||||
* BiT-TiTAN
|
||||
@@ -291,6 +291,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* CrazyHD
|
||||
* CrazySpirits
|
||||
* CrnaBerza
|
||||
* DANISH BYTES
|
||||
* Darius Tracker
|
||||
* Dark-Shadow
|
||||
* Dark Tracker
|
||||
@@ -326,7 +327,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* FocusX
|
||||
* Fou-Du-Cinema
|
||||
* FreeTorrent
|
||||
* FullMixMusic
|
||||
* FunFile (FF)
|
||||
* FunkyTorrents (FT) [![(invite needed)][inviteneeded]](#)
|
||||
* FunReleases [![(invite needed)][inviteneeded]](#)
|
||||
@@ -363,7 +363,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* HDME
|
||||
* HDRoute [![(invite needed)][inviteneeded]](#)
|
||||
* HDSky
|
||||
* HDStreet
|
||||
* HDTime
|
||||
* HDTorrents.it
|
||||
* HDTurk [![(invite needed)][inviteneeded]](#)
|
||||
@@ -414,12 +413,10 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* Nebulance (NBL) (TransmiTheNet)
|
||||
* NetCosmo
|
||||
* NetLab
|
||||
* New Real World [![(invite needed)][inviteneeded]](#)
|
||||
* NorBits
|
||||
* notwhat.cd
|
||||
* oMg[WtF]trackr
|
||||
* OnlineSelfEducation
|
||||
* ONLYscene
|
||||
* Orpheus
|
||||
* OshenPT
|
||||
* Ourbits (HDPter)
|
||||
@@ -440,7 +437,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* Pretome
|
||||
* PrivateHD (PHD)
|
||||
* ProAudioTorrents (PAT)
|
||||
* Psytorrents [![(invite needed)][inviteneeded]](#)
|
||||
* PTerClub
|
||||
* PTFiles (PTF)
|
||||
* PThome
|
||||
@@ -481,6 +477,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* SportHD [![(invite needed)][inviteneeded]](#)
|
||||
* SportsCult
|
||||
* SpringSunday
|
||||
* SugoiMusic
|
||||
* Superbits (SBS)
|
||||
* Tapochek
|
||||
* Tasmanit [![(invite needed)][inviteneeded]](#)
|
||||
@@ -523,6 +520,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* Torrenting (TT) [![(invite needed)][inviteneeded]](#)
|
||||
* Torrentland
|
||||
* TotallyKids (TK)
|
||||
* Trackeros
|
||||
* TranceTraffic [![(invite needed)][inviteneeded]](#)
|
||||
* Trezzor
|
||||
* TTsWEB
|
||||
|
@@ -25,7 +25,7 @@
|
||||
<script type="text/javascript" src="../libs/jquery.dataTables.min.js?changed=2017083001" charset="utf8"></script>
|
||||
<script type="text/javascript" src="../libs/handlebars.min.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../libs/moment.min.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../libs/handlebarsmoment.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../libs/handlebarsmoment.js?changed=20210117"></script>
|
||||
<script type="text/javascript" src="../libs/handlebarsextend.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../bootstrap/bootstrap.min.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../libs/bootstrap-notify.js?changed=2017083001"></script>
|
||||
|
@@ -33,5 +33,5 @@ Handlebars.registerHelper('jacketTimespan', function (context, block) {
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('jacketSize', function (context, block) {
|
||||
return filesize(context, { round: 1 });
|
||||
return filesize(context, { round: 2 });
|
||||
});
|
||||
|
@@ -14,7 +14,7 @@ links:
|
||||
- https://x1337x.ws/
|
||||
- https://x1337x.eu/
|
||||
- https://x1337x.se/
|
||||
- https://1337x.unblockit.dev/
|
||||
- https://1337x.unblockit.ltd/
|
||||
- https://1337x.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://1337x.unblocked.earth/
|
||||
@@ -36,8 +36,9 @@ legacylinks:
|
||||
- https://1337x.unblockit.top/
|
||||
- https://1337x.unblockit.lat/
|
||||
- https://1337x.unblockit.app/
|
||||
- https://1337x.unblocked.rest/
|
||||
- https://1337.root.yt/
|
||||
- https://1337x.unblocked.rest/
|
||||
- https://1337x.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -1,188 +0,0 @@
|
||||
---
|
||||
id: 3evils
|
||||
name: 3evils
|
||||
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: en
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.3evils.net/
|
||||
legacylinks:
|
||||
- https://www.3evils.com/
|
||||
- https://the-unknown.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 73, cat: PC, desc: "Appz/Linux"}
|
||||
- {id: 42, cat: PC/Mac, desc: "Appz/Mac"}
|
||||
- {id: 43, cat: PC/0day, desc: "Appz/Windows"}
|
||||
- {id: 65, cat: Books/EBook, desc: "Books"}
|
||||
- {id: 80, cat: Console/NDS, desc: "Games/Nintendo"}
|
||||
- {id: 78, cat: Console/PS4, desc: "Games/PS4"}
|
||||
- {id: 77, cat: PC/Games, desc: "Games/Windows"}
|
||||
- {id: 79, cat: Console/XBox, desc: "Games/XBOX"}
|
||||
- {id: 13, cat: Movies/3D, desc: "Movies/3D"}
|
||||
- {id: 71, cat: Movies/UHD, desc: "Movies/4K"}
|
||||
- {id: 72, cat: Movies/BluRay, desc: "Movies/Blu-Ray"}
|
||||
- {id: 12, cat: Movies/DVD, desc: "Movies/DVD-R"}
|
||||
- {id: 14, cat: Movies, desc: "Movies/Packs"}
|
||||
- {id: 70, cat: Movies/SD, desc: "Movies/Screeners & Cams"}
|
||||
- {id: 16, cat: Movies/HD, desc: "Movies/x264"}
|
||||
- {id: 17, cat: Movies/HD, desc: "Movies/X265"}
|
||||
- {id: 11, cat: Movies/SD, desc: "Movies/XVID"}
|
||||
- {id: 74, cat: Audio/Lossless, desc: "Music/FLAC"}
|
||||
- {id: 33, cat: Audio/MP3, desc: "Music/MP3"}
|
||||
- {id: 32, cat: Audio, desc: "Music/Packs"}
|
||||
- {id: 75, cat: Audio/Video, desc: "Music/Videos"}
|
||||
- {id: 6, cat: TV, desc: "TV/Packs"}
|
||||
- {id: 3, cat: TV/HD, desc: "TV/x264"}
|
||||
- {id: 4, cat: TV/HD, desc: "TV/x265"}
|
||||
- {id: 8, cat: TV/SD, desc: "TV/Xvid"}
|
||||
|
||||
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: 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. The default is <i>15</i>.
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
use_ssl: 1
|
||||
perm_ssl: ""
|
||||
error:
|
||||
- selector: div.callout:contains("Login failed!")
|
||||
test:
|
||||
path: /
|
||||
selector: a[href*="/logout.php?hash_please="]
|
||||
|
||||
search:
|
||||
paths:
|
||||
# https://www.3evils.net/browse.php?c16=1&c17=1&c3=1&c4=1&search=&searchin=title&incldead=0&only_free=1
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
# title, descr, genre, all
|
||||
searchin: title
|
||||
# 0 active, 1 incldead, 2 onlydead
|
||||
incldead: 1
|
||||
only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.unstriped tbody tr:has(a[href^="download.php?torrent="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Tip\\('<b>(.*?)</b>"
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?torrent="]
|
||||
attribute: href
|
||||
poster:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
# onmouseover="Tip('<b>blahblah /><img src=\'img.php/tvmaze/80.jpg\' blahblah />');"
|
||||
# <img src=\'./pic/noposter.png\'
|
||||
- name: regexp
|
||||
args: "src=\\\\'(.+?)\\\\'"
|
||||
- name: replace
|
||||
args: ["./pic/noposter.png", ""]
|
||||
files:
|
||||
selector: td[data-label="Files"]
|
||||
# 2 flavours of dates
|
||||
date:
|
||||
# Today<br> 10:20 AM
|
||||
# Yesterday<br> 08:03 PM
|
||||
optional: true
|
||||
selector: td[data-label="Added"]:contains("day")
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00" # auto adjusted by site account profile
|
||||
date:
|
||||
# Feb 14 2019<br> 10:20 AM
|
||||
optional: true
|
||||
selector: td[data-label="Added"]:not(:contains("day"))
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00" # auto adjusted by site account profile
|
||||
- name: dateparse
|
||||
args: "Jan 2 2006 03:04 PM -07:00"
|
||||
size:
|
||||
selector: td[data-label="Size"]
|
||||
grabs:
|
||||
selector: td[data-label="Snatched"]
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
seeders:
|
||||
selector: td[data-label="Seeders"]
|
||||
leechers:
|
||||
selector: td[data-label="Leechers"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"a.info:contains(\"[FREE]\")": 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
minimumseedtime:
|
||||
# 2 days (as seconds = 2 x 24 x 60 x 60)
|
||||
text: 172800
|
||||
# U-232 V5 (customised)
|
@@ -61,6 +61,9 @@ settings:
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: pin
|
||||
type: text
|
||||
label: Pin
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
@@ -69,8 +72,9 @@ login:
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
pin: "{{ .Config.pin }}"
|
||||
error:
|
||||
- selector: .tablea:contains("Benutzername oder Passwort ungültig")
|
||||
- selector: .tablea:contains("Benutzername, Passwort oder Pin ungültig")
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
|
@@ -7,11 +7,12 @@ type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://audiobookbay.nl/ # site forces http, does not support https
|
||||
- https://audiobookbay.unblockit.dev/
|
||||
- https://audiobookbay.unblockit.ltd/
|
||||
legacylinks:
|
||||
- https://audiobookbay.la/
|
||||
- https://audiobookbay.unblockit.lat/
|
||||
- https://audiobookbay.unblockit.app/
|
||||
- https://audiobookbay.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -1,141 +0,0 @@
|
||||
---
|
||||
id: bigtower
|
||||
name: BigTower
|
||||
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||
language: it-it
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://bigtower.info/ # site does not support https NET::ERR_CERT_DATE_INVALID
|
||||
legacylinks:
|
||||
- https://bigtower.info/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
||||
- {id: 11, cat: Movies/HD, desc: "DSS"}
|
||||
- {id: 1, cat: Movies, desc: "Screener"}
|
||||
- {id: 2, cat: Movies, desc: "DVDRip & BDRip"}
|
||||
- {id: 3, cat: Movies/BluRay, desc: "Bluray 1080p & 720p"}
|
||||
- {id: 5, cat: Movies/UHD, desc: "Ultra HD 4K"}
|
||||
- {id: 6, cat: TV, desc: "Serie TV"}
|
||||
- {id: 4, cat: TV/Anime, desc: "Cartoni"}
|
||||
- {id: 7, cat: PC/Games, desc: "Giochi"}
|
||||
- {id: 8, cat: Audio, desc: "Musica"}
|
||||
- {id: 9, cat: PC/0day, desc: "Software"}
|
||||
- {id: 12, cat: PC/Mobile-Other, desc: "Applicazioni"}
|
||||
- {id: 14, cat: Other, desc: "Varie & Altro"}
|
||||
- {id: 13, cat: Books, desc: "Libri & Edicola"}
|
||||
|
||||
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: donor
|
||||
type: checkbox
|
||||
label: Show donor torrent? (Enable if you're a donor)
|
||||
default: false
|
||||
- name: info
|
||||
type: info
|
||||
label: Results Per Page
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: span:contains("Nome Utente non corretto")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: index.php
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
page: torrents
|
||||
category: "{{ range .Categories }}{{.}};{{end}}"
|
||||
options: 0
|
||||
active: 0
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]){{ if .Config.donor }}{{ else }}:not(:has(img[src*="keditbookmarks.png"])){{ end }}
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
filters:
|
||||
- name: re_replace # rimozioni varie
|
||||
args: ["(?i)(\\[Richiesta\\])", ""]
|
||||
details:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["index.php?page=torrent-details&id=", "download.php?id="]
|
||||
poster:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.*?) "
|
||||
size:
|
||||
selector: td:nth-last-child(2)
|
||||
date:
|
||||
selector: td:nth-last-child(8)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +01:00" # CET
|
||||
- name: dateparse
|
||||
args: "02/01/2006 -07:00"
|
||||
grabs:
|
||||
selector: td:nth-last-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-last-child(7)
|
||||
leechers:
|
||||
selector: td:nth-last-child(6)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Gold 100% Free"]: 0
|
||||
img[alt="Silver 50% Free"]: 0.5
|
||||
img[alt="Bronze 25% Free"]: 0.75
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: 2
|
||||
img[alt="3x Upload Multiplier"]: 3
|
||||
img[alt="4x Upload Multiplier"]: 4
|
||||
img[alt="5x Upload Multiplier"]: 5
|
||||
img[alt="6x Upload Multiplier"]: 6
|
||||
img[alt="7x Upload Multiplier"]: 7
|
||||
img[alt="8x Upload Multiplier"]: 8
|
||||
img[alt="9x Upload Multiplier"]: 9
|
||||
img[alt="10x Upload Multiplier"]: 10
|
||||
"*": 1
|
||||
# xbtitFM v3.0.00
|
@@ -6,9 +6,9 @@ language: tr-TR
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://broadcity.in/ # site is forcing to http
|
||||
- https://broadcity.in/ # site is forcing to https
|
||||
legacylinks:
|
||||
- https://broadcity.in/
|
||||
- http://broadcity.in/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -8,7 +8,7 @@ encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://btdb.eu/
|
||||
- https://btdb.unblockit.dev/
|
||||
- https://btdb.unblockit.ltd/
|
||||
legacylinks:
|
||||
- https://btdb.to/
|
||||
- https://btdb.unblocked.app/
|
||||
@@ -30,6 +30,7 @@ legacylinks:
|
||||
- https://btdb.unblockit.top/
|
||||
- https://btdb.unblockit.lat/
|
||||
- https://btdb.unblockit.app/
|
||||
- https://btdb.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
@@ -43,6 +44,10 @@ caps:
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: flaresolverr
|
||||
type: info
|
||||
label: FlareSolverr
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
- name: info_8000
|
||||
type: info
|
||||
label: About BTDB Categories
|
||||
|
195
src/Jackett.Common/Definitions/danishbytes.yml
Normal file
195
src/Jackett.Common/Definitions/danishbytes.yml
Normal file
@@ -0,0 +1,195 @@
|
||||
---
|
||||
id: danishbytes
|
||||
name: DANISH BYTES
|
||||
description: "DANISH BYTES is a Private Danish Tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://danishbytes.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 7, cat: TV, desc: "Dansk / TV & Serier"}
|
||||
- {id: 6, cat: Movies, desc: "Dansk / Film"}
|
||||
- {id: 2, cat: TV, desc: "TV & Serier"}
|
||||
- {id: 1, cat: Movies, desc: "Film"}
|
||||
- {id: 10, cat: Movies, desc: "Film Boxset"}
|
||||
- {id: 13, cat: TV/Anime, desc: "Cartoon & Anime / TV & Serier"}
|
||||
- {id: 12, cat: TV/Anime, desc: "Cartoon & Anime / Film"}
|
||||
- {id: 5, cat: PC/0day, desc: "Applikationer"}
|
||||
- {id: 4, cat: PC/Games, desc: "Spil"}
|
||||
- {id: 3, cat: Audio, desc: "Musik"}
|
||||
- {id: 14, cat: Audio/Video, desc: "Musik / Videoer"}
|
||||
- {id: 9, cat: Audio/Audiobook, desc: "Lydbøger"}
|
||||
- {id: 8, cat: Books, desc: "E -Books, Magasiner, osv."}
|
||||
- {id: 11, cat: XXX, desc: "XXX"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid, tvdbid]
|
||||
movie-search: [q, imdbid, tmdbid]
|
||||
music-search: [q]
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: freeleech
|
||||
type: checkbox
|
||||
label: Search freeleech only
|
||||
default: false
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: "created_at"
|
||||
options:
|
||||
created_at: created
|
||||
seeders: seeders
|
||||
size: size
|
||||
name: title
|
||||
- name: type
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: desc
|
||||
options:
|
||||
desc: desc
|
||||
asc: asc
|
||||
|
||||
login:
|
||||
path: login
|
||||
method: form
|
||||
form: form[action$="/login"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
remember: on
|
||||
selectorinputs:
|
||||
_token:
|
||||
selector: input[name="_token"]
|
||||
attribute: value
|
||||
error:
|
||||
- selector: div#ERROR_COPY
|
||||
# test:
|
||||
# path: /
|
||||
# selector: a[href$="/logout"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents/filter
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}categories[]={{.}}&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search
|
||||
description: ""
|
||||
uploader: ""
|
||||
imdb: "{{ .Query.IMDBIDShort }}"
|
||||
tvdb: "{{ .Query.TVDBID }}"
|
||||
tmdb: "{{ .Query.TMDBID }}"
|
||||
mal: ""
|
||||
igdb: ""
|
||||
start_year: ""
|
||||
end_year: ""
|
||||
sorting: "{{ .Config.sort }}"
|
||||
direction: "{{ .Config.type }}"
|
||||
qty: 100
|
||||
page: 0
|
||||
view: list
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href*="/categories/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "/categories/(\\d+)"
|
||||
title:
|
||||
selector: a.view-torrent
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet"]
|
||||
attribute: href
|
||||
details:
|
||||
selector: a.view-torrent
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-last-child(4)
|
||||
seeders:
|
||||
selector: td:nth-last-child(3)
|
||||
leechers:
|
||||
selector: td:nth-last-child(2)
|
||||
grabs:
|
||||
selector: td:nth-last-child(1)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish
|
||||
- name: re_replace
|
||||
args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (ay)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"]
|
||||
- name: re_replace
|
||||
args: ["(?i) (an)", "year"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(För |und)", ""] # Misc removals
|
||||
- name: timeago
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From PARA Store
|
||||
i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups
|
||||
i[class*="fa-star text-bold"]: 0 # Freeleech From Token
|
||||
i[class*="fa-coins text-bold"]: 0 # Freeleech From Token
|
||||
i[class*="fa-globe text-blue"]: 0 # Global Freeleech
|
||||
i[class*="fa-star text-gold"]: 0 # Freeleech
|
||||
i[class*="fa-certificate text-pink"]: 0 # Featured Torrent
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload
|
||||
i[class*="fa-globe text-green"]: 2 # Global Double Upload
|
||||
i[class*="fa-certificate text-pink"]: 2 # Featured Torrent
|
||||
"*": 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
minimumseedtime:
|
||||
# 2 days (as seconds = 2 x 24 x 60 x 60)
|
||||
text: 172800
|
||||
# UNIT3D 3.1.0 DB-edition
|
@@ -64,8 +64,8 @@ caps:
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
music-search: [q]
|
||||
book-search: [q]
|
||||
|
||||
@@ -136,9 +136,9 @@ search:
|
||||
- path: selection.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
# 0 name, 1 descr, 2 both, 4 imdb
|
||||
blah: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}"
|
||||
search: "{{ .Keywords }}}"
|
||||
# 0 name, 1 descr, 2 both
|
||||
blah: "0"
|
||||
orderby: "{{ .Config.sort }}"
|
||||
sort: "{{ .Config.type }}"
|
||||
|
||||
|
@@ -10,7 +10,7 @@ links:
|
||||
- https://www.demonoid.is/
|
||||
- https://www.dnoid.to/
|
||||
- https://www.dnoid.pw/
|
||||
- https://demonoid.unblockit.dev/
|
||||
- https://demonoid.unblockit.ltd/
|
||||
- https://demonoid.torrentbay.to/
|
||||
legacylinks:
|
||||
- https://demonoid.unblockit.pro/
|
||||
@@ -27,6 +27,7 @@ legacylinks:
|
||||
- https://demonoid.unblockit.top/
|
||||
- https://demonoid.unblockit.lat/
|
||||
- https://demonoid.unblockit.app/
|
||||
- https://demonoid.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -12,18 +12,18 @@ caps:
|
||||
categorymappings:
|
||||
- {id: 60, cat: Movies/HD, desc: "MicroHD 720p"}
|
||||
- {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"}
|
||||
- {id: 78, cat: Movies/HD, desc: "MicroHD 4K"}
|
||||
- {id: 78, cat: Movies/UHD, desc: "MicroHD 4K"}
|
||||
- {id: 64, cat: TV/HD, desc: "Pack Series"}
|
||||
- {id: 65, cat: TV/HD, desc: "Pack Series VOSE"}
|
||||
- {id: 80, cat: Movies/BluRay, desc: "BDRip X265 1080p"}
|
||||
- {id: 80, cat: Movies/HD, desc: "BDRip X265 1080p"}
|
||||
- {id: 81, cat: Movies/UHD, desc: "UHDRip x265 4K"}
|
||||
- {id: 82, cat: Movies/WEB-DL, desc: "Pelis Web-DL 1080"}
|
||||
- {id: 83, cat: Movies/WEB-DL, desc: "Pelis Web-DL 720"}
|
||||
- {id: 84, cat: Movies/UHD, desc: "UHD Remux x265"}
|
||||
- {id: 91, cat: Movies/HD, desc: "BDRip x264"}
|
||||
- {id: 89, cat: Movies/HD, desc: "BDRemux"}
|
||||
- {id: 88, cat: Movies/HD, desc: "Full HD"}
|
||||
- {id: 90, cat: Movies/UHD, desc: "UHD Full"}
|
||||
- {id: 88, cat: Movies/BluRay, desc: "Full HD"}
|
||||
- {id: 90, cat: Movies/BluRay, desc: "UHD Full"}
|
||||
- {id: 23, cat: TV/Sport, desc: "Deportes"}
|
||||
- {id: 20, cat: TV/HD, desc: "Series"}
|
||||
- {id: 31, cat: TV/HD, desc: "Series VOSE"}
|
||||
@@ -38,11 +38,11 @@ caps:
|
||||
- {id: 76, cat: Movies, desc: "x-men saga"}
|
||||
- {id: 85, cat: Movies, desc: "Sean Connery"}
|
||||
- {id: 6, cat: Books/EBook, desc: "EBooks"}
|
||||
- {id: 58, cat: Books/EBook, desc: "Kiosko"}
|
||||
- {id: 58, cat: Books/Mags, desc: "Kiosko"}
|
||||
- {id: 24, cat: TV/Documentary, desc: "Documentales"}
|
||||
- {id: 32, cat: TV/Documentary, desc: "Documentales VOSE"}
|
||||
- {id: 49, cat: Books/EBook, desc: "eLearning"}
|
||||
- {id: 68, cat: Books/EBook, desc: "eLearning Multimedia"}
|
||||
- {id: 49, cat: Books/Technical, desc: "eLearning"}
|
||||
- {id: 68, cat: Books/Technical, desc: "eLearning Multimedia"}
|
||||
- {id: 87, cat: Audio/Audiobook, desc: "Audiolibros"}
|
||||
|
||||
modes:
|
||||
@@ -125,16 +125,16 @@ search:
|
||||
selector: a[href^="index.php?page=torrent-details"][onmouseover]:not(:contains("VOSE"))
|
||||
optional: true
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["\\W", "."] # Spaces and other characters -> .
|
||||
- name: append
|
||||
args: ".Spanish-DivTeam"
|
||||
args: " MULTi/SPANiSH" # DivTeam doesn't bring languages. Usually Original + Spanish.
|
||||
- name: re_replace
|
||||
args: ["\\.+", "."] # More than 1 dot -> .
|
||||
- name: re_replace
|
||||
args: ["^\\.", ""] # Delete first dot
|
||||
- name: re_replace
|
||||
args: ["UHDRip", "BDRip"] # Fix for Radarr
|
||||
- name: replace
|
||||
args: ["UHDRip", "Bluray-2160p"] # Fix for Radarr
|
||||
- name: replace
|
||||
args: ["2160p BDRip", "Bluray-2160p"] # Fix for Radarr
|
||||
poster:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details"]
|
||||
attribute: onmouseover
|
||||
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://www.ettvcentral.com/
|
||||
- https://ettv.unblockninja.com/
|
||||
- https://ettv.unblockit.dev/
|
||||
- https://ettv.unblockit.ltd/
|
||||
- https://ettv.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://www.ettv.tv/
|
||||
@@ -35,6 +35,7 @@ legacylinks:
|
||||
- https://ettv.unblockit.lat/
|
||||
- https://ettv.unblockit.app/
|
||||
- https://ettv.unblocked.rest/
|
||||
- https://ettv.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -7,11 +7,12 @@ type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://extratorrents.it/
|
||||
- https://extratorrent.unblockit.dev/
|
||||
- https://extratorrent.unblockit.ltd/
|
||||
- https://extratorrent2.unblockninja.com/
|
||||
legacylinks:
|
||||
- https://extratorrent.ag/
|
||||
- https://extratorrent.unblockit.app/
|
||||
- https://extratorrent.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -12,7 +12,7 @@ links:
|
||||
- https://eztv.tf/
|
||||
- https://eztv.yt/
|
||||
- https://eztv.unblockninja.com/
|
||||
- https://eztv.unblockit.dev/
|
||||
- https://eztv.unblockit.ltd/
|
||||
- https://eztv.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://eztv.ag/ # redirects to .re
|
||||
@@ -38,6 +38,7 @@ legacylinks:
|
||||
- https://eztv.unblockit.app/
|
||||
- https://eztv.root.yt/
|
||||
- https://eztv.unblocked.rest/
|
||||
- https://eztv.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -1,89 +0,0 @@
|
||||
---
|
||||
id: fullmixmusic
|
||||
name: FullMixMusic
|
||||
description: "FullMixMusic is a HUNGARIAN Private Torrent Tracker for MUSIC"
|
||||
language: hu-hu
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://fullmixmusic.org/
|
||||
legacylinks:
|
||||
- http://fullmixmusic.org/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: Audio
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
music-search: [q, artist]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.main:contains("Művelet!")
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
showsearch: 1
|
||||
incldead: 1
|
||||
|
||||
rows:
|
||||
selector: table.tablak > tbody > tr:has(a[href^="details.php?id="])
|
||||
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
selector: a[href^="details.php?id="][title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ^(.*?)<br />
|
||||
details:
|
||||
selector: a[href^="details.php?id="][title]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
poster:
|
||||
selector: a[href^="details.php?id="][title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=\"(.*?)\">"
|
||||
description:
|
||||
selector: td:nth-child(2) > i > font
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +01:00" # CET
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(8)
|
||||
leechers:
|
||||
selector: td:nth-child(9)
|
||||
grabs:
|
||||
selector: td:nth-child(10)
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
font[title^="Dupla feltöltésű torrent!"]: 2
|
||||
font[title^="x3 feltöltésű torrent!"]: 3
|
||||
font[title^="x4 feltöltésű torrent!"]: 4
|
||||
"*": 1
|
||||
# engine tbd
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://www.gtdb.to/
|
||||
- https://glodls.to/
|
||||
- https://glotorrents.unblockit.dev/
|
||||
- https://glotorrents.unblockit.ltd/
|
||||
- https://glodls.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://glodls.rocks/
|
||||
@@ -32,6 +32,7 @@ legacylinks:
|
||||
- https://glotorrents.unblockit.lat/
|
||||
- https://glotorrents.unblockit.app/
|
||||
- https://glodls.unblocked.rest/
|
||||
- https://glotorrents.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -104,19 +104,51 @@ search:
|
||||
selector: a.view-torrent
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)full", "BRDISK."] # FULL(BR/UHD) -> BRDISK
|
||||
args: ["\\[", " "]
|
||||
- name: re_replace
|
||||
args: ["\\]", " "]
|
||||
- name: re_replace
|
||||
args: ["(?i)(full(bluray)?)", "BRDISK"] # FULL(BR/UHD) -> BRDISK
|
||||
- name: replace
|
||||
args: ["HDOlimpo", ""] # Delete HDOlimpo
|
||||
- name: re_replace
|
||||
- name: replace
|
||||
args: ["HD-Olimpo", ""] # Delete HD-Olimpo
|
||||
- name: re_replace
|
||||
args: ["\\W", "."] # Spaces and other characters -> .
|
||||
- name: append
|
||||
args: ".Spanish-HDOlimpo"
|
||||
args: ["[ -](?i)español[ -]", " SPANiSH "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)castellano[ -]", " SPANiSH "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)spa[ -]", " SPANiSH "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)esp[ -]", " SPANiSH "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)ingl[eé]s[ -]", " English "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)[ei]ng[ -]", " English "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)cat[ -]", " Catalan "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)vas[ -]", " Basque "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)fr[ae][ -]", " French "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)jap[ -]", " Japanese "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)ita[ -]", " Italian "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)rus[ -]", " Russian "]
|
||||
- name: re_replace
|
||||
args: ["[ -](?i)ger[ -]", " German "]
|
||||
- name: re_replace
|
||||
args: ["(?i)(triaudio)", "MULTi/SPANiSH/English"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(dual)", " MULTi/SPANiSH "]
|
||||
- name: re_replace
|
||||
args: ["\\.+", "."] # More than 1 dot -> .
|
||||
- name: re_replace
|
||||
args: ["^\\.", ""] # Delete first dot
|
||||
- name: re_replace
|
||||
args: ["\\s+", " "] # More than 1 space to 1 space
|
||||
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
|
@@ -6,11 +6,11 @@ language: ru-ru
|
||||
type: public
|
||||
encoding: windows-1251
|
||||
links:
|
||||
- https://hdreactor.net/
|
||||
- https://hdreactor.club/
|
||||
- https://hdreactor.su/
|
||||
legacylinks:
|
||||
- https://hdreactor.guru/
|
||||
- https://hdreactor.net/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -1,171 +0,0 @@
|
||||
---
|
||||
id: hdstreet
|
||||
name: HDStreet
|
||||
description: "HDStreet is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
|
||||
language: zh-cn
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://hdstreet.club/
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies(D)/华语电影", default: true}
|
||||
- {id: 403, cat: Movies, desc: "Movies(F)/外语电影", default: true}
|
||||
- {id: 402, cat: TV, desc: "TV Series(D)/华语电视剧", default: true}
|
||||
- {id: 404, cat: TV, desc: "TV Series(F)/外语电视剧", default: true}
|
||||
- {id: 406, cat: TV, desc: "TV Shows(D)/华语综艺", default: true}
|
||||
- {id: 405, cat: TV, desc: "TV Shows(F)/外语综艺", default: true}
|
||||
- {id: 408, cat: TV/Anime, desc: "TV Anime(D)/华语动漫", default: true}
|
||||
- {id: 411, cat: TV/Anime, desc: "TV Anime(F)/外语动漫", default: true}
|
||||
- {id: 409, cat: Audio/Video, desc: "MusicVideo(D)/华语音乐MV", default: true}
|
||||
- {id: 412, cat: Audio/Video, desc: "MusicVideo(F)/外语音乐MV", default: true}
|
||||
- {id: 407, cat: TV/Documentary, desc: "Documentaries(D)/华语纪录片", default: true}
|
||||
- {id: 413, cat: TV/Documentary, desc: "Documentaries(F)/外语纪录片", default: true}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
music-search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: freeleech
|
||||
type: checkbox
|
||||
label: Search freeleech only
|
||||
default: false
|
||||
- name: 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.
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
inputs:
|
||||
logintype: username
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
logout: ""
|
||||
thispagewidth: yes
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("姿势不正确"))
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
categories: [401, 402, 406, 408, 409, 407]
|
||||
- path: torrentsasia.php
|
||||
categories: [403, 404, 405, 411, 412, 413]
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
# 0 incldead, 1 active, 2 dead, 3 noimdb, 4 onlydead
|
||||
incldead: 0
|
||||
# 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%, 8 all promotions
|
||||
spstate: "{{ if .Config.freeleech }}8{{ else }}0{{ end }}"
|
||||
# 0 all, 1 popular, 2 classic, 3 recommended, 4 normal
|
||||
picktype: 0
|
||||
# 0 title, 3 uploader, 4 movie info, 5 imdbid, 6 torrent hash, 7 activity seed
|
||||
search_area: "{{ if .Query.IMDBID }}5{{ else }}0{{ end }}"
|
||||
# 0 AND, 1 OR, 2 exact
|
||||
search_mode: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
# can search for imdbid but does not show imdb link in search results.
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]), table.torrents > tbody > tr:has(a[href^="comment.php?"])
|
||||
after: 1
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title:
|
||||
optional: true
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
# downloads can be missing but we can exclude them due to after:1
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
optional: true
|
||||
seeders:
|
||||
selector: td:nth-child(3)
|
||||
leechers:
|
||||
selector: td:nth-child(4)
|
||||
grabs:
|
||||
selector: td:nth-child(5)
|
||||
date:
|
||||
# time type: time elapsed (default)
|
||||
selector: td:nth-child(9) > span[title]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00" # CST
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
date:
|
||||
# time added
|
||||
selector: td:nth-child(9):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +08:00" # CST
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(10)
|
||||
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, img
|
||||
# NexusPHP V1.5.β5
|
@@ -59,6 +59,10 @@ settings:
|
||||
3: "created asc"
|
||||
1: "seeders asc"
|
||||
2: "size asc"
|
||||
- name: flaresolverr
|
||||
type: info
|
||||
label: FlareSolverr
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
@@ -72,6 +72,10 @@ settings:
|
||||
type: checkbox
|
||||
label: Search freeleech only
|
||||
default: false
|
||||
- name: flaresolverr
|
||||
type: info
|
||||
label: FlareSolverr
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
|
@@ -26,13 +26,12 @@ caps:
|
||||
- {id: 414, cat: Movies/DVD, desc: "Movies DVD"}
|
||||
- {id: 402, cat: TV, desc: "TV Series(电视剧)"}
|
||||
- {id: 403, cat: TV, desc: "TV Shows(综艺)"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)"}
|
||||
- {id: 405, cat: TV/Anime, desc: "Animations(动画片)"}
|
||||
- {id: 406, cat: Audio/Video, desc: "Music Videos(MV)"}
|
||||
- {id: 407, cat: TV/Sport, desc: "Sports(体育)"}
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio(音乐)"}
|
||||
- {id: 421, cat: Books, desc: "Book(学习资料)"}
|
||||
- {id: 422, cat: Console, desc: "Game(游戏)"}
|
||||
- {id: 409, cat: Other, desc: "Misc(其他)"}
|
||||
- {id: 500, cat: Audio, desc: "Music(无损)"}
|
||||
- {id: 409, cat: Other, desc: "Video Portray(写真视频)"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
@@ -42,13 +41,12 @@ caps:
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
- name: username
|
||||
type: text
|
||||
label: Cookie
|
||||
- name: info
|
||||
type: info
|
||||
label: How to get the Cookie
|
||||
default: "<ol><li>Login to this tracker with your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button (Chrome Browser) or <b>HTML</b> button (FireFox)<li>Refresh the page by pressing <b>F5</b><li>Click on the first row entry<li>Select the <b>Headers</b> tab on the Right panel<li>Find <b>'cookie:'</b> in the <b>Request Headers</b> section<li><b>Select</b> and <b>Copy</b> the whole cookie string <i>(everything after 'cookie: ')</i> and <b>Paste</b> here.</ol>"
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: freeleech
|
||||
type: checkbox
|
||||
label: Search freeleech only
|
||||
@@ -75,9 +73,18 @@ settings:
|
||||
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="takelogin.php"]
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
selector: img[src^="image.php?"]
|
||||
input: imagestring
|
||||
error:
|
||||
- selector: table:has(a[href="login.php"])
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
@@ -85,7 +92,6 @@ search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
# 0 incldead, 1 active, 2 dead
|
||||
incldead: 0
|
||||
@@ -103,19 +109,19 @@ search:
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
selector: a[href*="?cat_"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
- name: regexp
|
||||
args: "cat_(\\d{3})"
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
selector: a[href^="details_"] > b
|
||||
title:
|
||||
optional: true
|
||||
selector: a[title][href^="details.php?id="]
|
||||
selector: a[title][href^="details_"] > b
|
||||
attribute: title
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
selector: a[href^="details_"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?"]
|
||||
|
@@ -13,6 +13,7 @@ caps:
|
||||
- {id: 1, cat: XXX/XviD, desc: "Videos SD"}
|
||||
- {id: 2, cat: XXX/x264, desc: "Videos HD"}
|
||||
- {id: 3, cat: XXX/WMV, desc: "Movies"}
|
||||
- {id: 17, cat: XXX/ImageSet, desc: "SiteRip's Picture Packs"}
|
||||
- {id: 6, cat: XXX/Other, desc: "Porn (Other)"}
|
||||
- {id: 4, cat: XXX, desc: "AV CENSORED (JAV)"}
|
||||
- {id: 5, cat: XXX, desc: "AV UNCENSORED (JAV)"}
|
||||
@@ -26,6 +27,7 @@ caps:
|
||||
- {id: 15, cat: XXX, desc: "Pregnant"}
|
||||
- {id: 16, cat: XXX, desc: "Fetish"}
|
||||
- {id: 9, cat: XXX, desc: "Gay Forum"}
|
||||
- {id: 18, cat: XXX, desc: "Incest and Taboo"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
@@ -120,7 +120,7 @@ login:
|
||||
# https://lesaloonv2-0.net/yupy_login.php
|
||||
path: yupy_login.php
|
||||
method: form
|
||||
form: form[action^="index.php?page=login"]
|
||||
form: form[action^="login"]
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
|
@@ -12,7 +12,7 @@ links:
|
||||
- https://www.limetorrents.co/
|
||||
- https://limetor.com/
|
||||
- https://www.limetor.pro/
|
||||
- https://limetorrents.unblockit.dev/
|
||||
- https://limetorrents.unblockit.ltd/
|
||||
- https://limetorrents.unblockninja.com/
|
||||
legacylinks:
|
||||
- https://www.limetorrents.io/
|
||||
@@ -36,6 +36,7 @@ legacylinks:
|
||||
- https://limetorrents.unblockit.top/
|
||||
- https://limetorrents.unblockit.lat/
|
||||
- https://limetorrents.unblockit.app/
|
||||
- https://limetorrents.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -6,11 +6,12 @@ language: el-gr
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://magico.fun/
|
||||
- https://trellas.info/
|
||||
legacylinks:
|
||||
- https://magico.info/
|
||||
- https://magico.one/
|
||||
- https://magico.club/
|
||||
- https://magico.fun/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -16,6 +16,18 @@ caps:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: vostfr
|
||||
type: checkbox
|
||||
label: Add VOSTFR to titles
|
||||
default: false
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
@@ -40,8 +52,12 @@ search:
|
||||
fields:
|
||||
category:
|
||||
text: 1
|
||||
title:
|
||||
title_normal:
|
||||
selector: a[href^="details.php?id="]
|
||||
title_vostfr:
|
||||
text: "{{ .Result.title_normal }} VOSTFR"
|
||||
title:
|
||||
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_normal }}{{ end }}"
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://monova.org/
|
||||
- https://monova.to/
|
||||
- https://monova.unblockit.dev/
|
||||
- https://monova.unblockit.ltd/
|
||||
- https://monova.unblocked.monster/
|
||||
- https://monova.unblockninja.com/
|
||||
legacylinks:
|
||||
@@ -29,6 +29,7 @@ legacylinks:
|
||||
- https://monova.unblockit.lat/
|
||||
- https://monova.unblockit.app/
|
||||
- https://monova.unblocked.rest/
|
||||
- https://monova.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
183
src/Jackett.Common/Definitions/montorrent.yml
Normal file
183
src/Jackett.Common/Definitions/montorrent.yml
Normal file
@@ -0,0 +1,183 @@
|
||||
---
|
||||
id: montorrent
|
||||
name: MonTorrent
|
||||
description: "MonTorrent is a FRENCH Public Indexer"
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://www.montorrent.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: "vo", cat: Movies, desc: "Films VO"}
|
||||
- {id: "vostfr", cat: Movies, desc: "Films VOSTFR"}
|
||||
- {id: "dvdrip", cat: Movies, desc: "Films DVDRIP"}
|
||||
- {id: "bdrip", cat: Movies, desc: "Films BDRIP"}
|
||||
- {id: "webrip", cat: Movies, desc: "Films WEBRIP"}
|
||||
- {id: "hdrip", cat: Movies, desc: "Films HDRIP"}
|
||||
- {id: "dvdscreener", cat: Movies, desc: "Films DVD Screener"}
|
||||
- {id: "screener", cat: Movies, desc: "Films Screener"}
|
||||
- {id: "hd2160p", cat: Movies, desc: "Films 2160p"}
|
||||
- {id: "hd1080p", cat: Movies, desc: "Films 1080p"}
|
||||
- {id: "hd720p", cat: Movies, desc: "Films 720p"}
|
||||
- {id: "hd2160p-hdlight", cat: Movies, desc: "Films 2160p HD Light"}
|
||||
- {id: "hd1080p-hdlight", cat: Movies, desc: "Films 1080p HD Light"}
|
||||
- {id: "hd720p-hdlight", cat: Movies, desc: "Films 720p HD Light"}
|
||||
- {id: "hd3d", cat: Movies, desc: "Films 3D"}
|
||||
- {id: "serie-vostfr", cat: TV, desc: "Emission TV VOSTFR"}
|
||||
- {id: "serie-vf", cat: TV, desc: "Emission TV VF"}
|
||||
- {id: "pack-vf", cat: TV, desc: "Emission TV Pack VF"}
|
||||
- {id: "pack-vostfr", cat: TV, desc: "Emission TV Pack VOSTFR"}
|
||||
- {id: "pack-vo", cat: TV, desc: "Emission TV VO"}
|
||||
- {id: "albums", cat: Audio, desc: "Audio"}
|
||||
- {id: "jeux", cat: PC/Games, desc: "Jeu vidéo"}
|
||||
- {id: "jeux-pc", cat: PC/Games, desc: "Jeu vidéo PC"}
|
||||
- {id: "jeux-console", cat: PC/Games, desc: "Jeu vidéo Consoles"}
|
||||
- {id: "logiciels", cat: PC, desc: "Application"}
|
||||
- {id: "ebooks", cat: Books, desc: "eBook"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
music-search: [q]
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: filter_title
|
||||
type: checkbox
|
||||
label: Try to normalize releases names by moving year after the title
|
||||
default: false
|
||||
- name: langfilter
|
||||
type: select
|
||||
label: Lang Filter / Filtre Langue
|
||||
default: on
|
||||
options:
|
||||
on: Tous
|
||||
french: French
|
||||
truefrench: TrueFrench
|
||||
vostfr: VOSTFR
|
||||
vo: VO
|
||||
- name: multilang
|
||||
type: checkbox
|
||||
label: Replace MULTI by another language in release name
|
||||
default: false
|
||||
- name: multilanguage
|
||||
type: select
|
||||
label: Replace MULTI by this language
|
||||
default: FRENCH
|
||||
options:
|
||||
FRENCH: FRENCH
|
||||
MULTI.FRENCH: MULTI.FRENCH
|
||||
ENGLISH: ENGLISH
|
||||
MULTI.ENGLISH: MULTI.ENGLISH
|
||||
VOSTFR: VOSTFR
|
||||
MULTI.VOSTFR: MULTI.VOSTFR
|
||||
- name: vostfr
|
||||
type: checkbox
|
||||
label: Replace VOSTFR with ENGLISH
|
||||
default: false
|
||||
- name: enhancedAnime
|
||||
type: checkbox
|
||||
label: Enhance sonarr compatibility with anime by renaming episode (xxx to exxx). Works only if episode is at the end of the query. Can disturb movies search. (back to the future 3 -> back to the future e3)
|
||||
default: false
|
||||
- name: order
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
default: id
|
||||
options:
|
||||
id: id
|
||||
seeders: seeders
|
||||
size: taille
|
||||
rls: name
|
||||
- name: orderby
|
||||
type: select
|
||||
label: Order requested from site
|
||||
default: desc
|
||||
options:
|
||||
desc: desc
|
||||
asc: asc
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}/recherche/?query={{ .Keywords }}&{{ else }}/torrents/?{{ end }}langue={{ .Config.langfilter }}&order={{ .Config.order }}&orderby={{ .Config.orderby }}"
|
||||
- path: "{{ if .Keywords }}/recherche/?query={{ .Keywords }}&{{ else }}/torrents/?{{ end }}langue={{ .Config.langfilter }}&order={{ .Config.order }}&orderby={{ .Config.orderby }}&page=2"
|
||||
|
||||
rows:
|
||||
selector: div.t-details
|
||||
|
||||
fields:
|
||||
category:
|
||||
optional: true
|
||||
selector: a[href*="id_cat"]
|
||||
attribute: class
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["liste-categorie-couleur ", ""]
|
||||
title_normal:
|
||||
selector: a[href^="/torrent/"]
|
||||
title_filtered:
|
||||
text: "{{ .Result.title_normal }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)^(?:(.+?)((?:[\\.\\-\\s_\\[]+(?:imax|(?:dvd|bd|tv)(?:rip|scr)|bluray(?:\\-?rip)?|720\\s*p?|1080\\s*p?|vof?|vost(?:fr)?|multi|vf(?:f|q)?[1-3]?|(?:true)?french|eng?)[\\.\\-\\s_\\]]*)*)([\\(\\[]?(?:20|1[7-9])\\d{2}[\\)\\]]?)(.*)$|(.*))$", "$1 $3 $2 $4 $5"]
|
||||
- name: replace
|
||||
args: [".", " "]
|
||||
- name: trim
|
||||
- name: re_replace
|
||||
args: ["(?i)\\s(mkv|avi|divx|xvid|mp4)$", ""]
|
||||
- name: re_replace
|
||||
args: ["(\\s{2,5})", " "]
|
||||
- name: trim
|
||||
title_phase1:
|
||||
text: "{{ if .Config.filter_title }}{{ .Result.title_filtered }}{{ else }}{{ .Result.title_normal }}{{ end }}"
|
||||
title_multilang:
|
||||
text: "{{ .Result.title_phase1 }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]multi[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title_phase2:
|
||||
text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
|
||||
title_vostfr:
|
||||
text: "{{ .Result.title_phase2 }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]vostfr[\\.\\s\\]\\-]", ".ENGLISH."]
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]subfrench[\\.\\s\\]\\-]", ".ENGLISH."]
|
||||
title_phase3:
|
||||
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
|
||||
title_anime:
|
||||
text: "{{ .Result.title_phase3 }}"
|
||||
filters:
|
||||
# Sonarr need E in front of 3 digit number or else it thinks it is episode
|
||||
# S01E10 for number 110 for example ==> enhancedAnime
|
||||
- name: re_replace
|
||||
args: ["(.*)(\\.| |\\-)(\\d{2,3})(\\.| |\\-)(.*)", "$1 E$3 $5"]
|
||||
title:
|
||||
text: "{{ if .Config.enhancedAnime }}{{ .Result.title_anime }}{{ else }}{{ .Result.title_phase3 }}{{ end }}"
|
||||
details:
|
||||
selector: a[href^="/torrent/"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="/telechargement/"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: div.t-taille
|
||||
seeders:
|
||||
text: 0
|
||||
seeders:
|
||||
selector: div.t-sources
|
||||
optional: true
|
||||
leechers:
|
||||
text: 0
|
||||
leechers:
|
||||
selector: div.t-clients
|
||||
optional: true
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
# engine n/a
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://pirateiro.com/
|
||||
- https://pirateiro.eu/
|
||||
- https://pirateiro.unblockit.dev/
|
||||
- https://pirateiro.unblockit.ltd/
|
||||
legacylinks:
|
||||
- http://pirateiro.com/
|
||||
- https://pirateiro.unblockit.pro/
|
||||
@@ -21,6 +21,7 @@ legacylinks:
|
||||
- https://pirateiro.unblockit.top/
|
||||
- https://pirateiro.unblockit.lat/
|
||||
- https://pirateiro.unblockit.app/
|
||||
- https://pirateiro.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -1,181 +0,0 @@
|
||||
---
|
||||
id: retroflix
|
||||
name: RetroFlix
|
||||
description: "Private Torrent Tracker for Classic Movies / TV / General Releases."
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://retroflix.club/
|
||||
legacylinks:
|
||||
- https://retroflix.net/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies"}
|
||||
- {id: 402, cat: TV, desc: "TV Series"}
|
||||
- {id: 406, cat: Audio/Video, desc: "Music Videos"}
|
||||
- {id: 407, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 409, cat: Books, desc: "Books"}
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
music-search: [q]
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Cookie
|
||||
- name: info
|
||||
type: info
|
||||
label: How to get the Cookie
|
||||
default: "<ol><li>Login to this tracker with your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button (Chrome Browser) or <b>HTML</b> button (FireFox)<li>Refresh the page by pressing <b>F5</b><li>Click on the first row entry<li>Select the <b>Headers</b> tab on the Right panel<li>Find <b>'cookie:'</b> in the <b>Request Headers</b> section<li><b>Select</b> and <b>Copy</b> the whole cookie string <i>(everything after 'cookie: ')</i> and <b>Paste</b> here.</ol>"
|
||||
- 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.
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: torrents.php
|
||||
selector: a[href*="/logout?"]
|
||||
|
||||
search:
|
||||
# https://retroflix.club/torrents.php?incldead=0&spstate=0&inclbookmarked=0&search=tt0055254&search_area=4&search_mode=0
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
# 0 incldead, 1 active, 2 dead
|
||||
incldead: 0
|
||||
# 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%
|
||||
spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
|
||||
# 0 title, 1 descr, 3 uploader, 4 imdburl
|
||||
search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}"
|
||||
# 0 AND, 1 OR, 2 Exact
|
||||
search_mode: 0
|
||||
sort: "{{ .Config.sort }}"
|
||||
type: "{{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
release_year:
|
||||
selector: a[href^="/torrents.php?processing="]
|
||||
optional: true
|
||||
quality:
|
||||
selector: a[href^="/torrents.php?standard="]
|
||||
optional: true
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
filters:
|
||||
- name: append
|
||||
args: " {{ .Result.release_year }}"
|
||||
- name: append
|
||||
args: " {{ .Result.quality }}"
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " {{ .Result.release_year }}"
|
||||
- name: append
|
||||
args: " {{ .Result.quality }}"
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
poster:
|
||||
selector: tr[onmouseover]
|
||||
attribute: onmouseover
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.+?) "
|
||||
imdb:
|
||||
selector: a[href*="imdb.com/title/tt"]
|
||||
attribute: href
|
||||
date:
|
||||
# time type: time elapsed (default)
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00" # auto adjusted by site account profile
|
||||
- name: dateparse
|
||||
args: "02-01-2006 15:04:05 -07:00"
|
||||
date:
|
||||
# time added
|
||||
selector: td:nth-child(4):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00" # auto adjusted by site account profile
|
||||
- name: dateparse
|
||||
args: "02-01-200615:04:05 -07:00"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: 0
|
||||
img.pro_free2up: 0
|
||||
img.pro_50pctdown: 0.5
|
||||
img.pro_50pctdown2up: 0.5
|
||||
img.pro_30pctdown: 0.3
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: 2
|
||||
img.pro_free2up: 2
|
||||
img.pro_2up: 2
|
||||
"*": 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
minimumseedtime:
|
||||
# 3 days (as seconds = 3 x 24 x 60 x 60)
|
||||
text: 259200
|
||||
# NexusPHP
|
@@ -17,6 +17,7 @@ caps:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 4, cat: Audio, desc: "Music"}
|
||||
- {id: 5, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 7, cat: TV/Other, desc: "Stand-up Comedy"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
|
||||
modes:
|
||||
@@ -41,7 +42,6 @@ login:
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
method: post
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
|
@@ -93,20 +93,98 @@ search:
|
||||
selector: a[href^="details.php?name="]
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: [".*? / ", ""]
|
||||
args: ["^VA\\s*\\|", "VA -"]
|
||||
- name: re_replace
|
||||
args: ["^.*? \\/\\s*|^.*? \\|\\s*", ""]
|
||||
- name: diacritics
|
||||
args: replace
|
||||
- name: re_replace
|
||||
args: ["( = CSFD \\d+\\%)", ""]
|
||||
args: ["\\|\\s*\\d+\\% CSFD\\.cz\\/|\\s*=*\\s*CSFD\\s*\\d+\\%|\\s*CSFD\\s*=*\\s*\\d+\\%|\\s*CSFD", ""]
|
||||
- name: re_replace
|
||||
args: ["(?i)serie", ""]
|
||||
args: ["(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{2,})\\s*\\.*\\s(?i)serie\\.*", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(\\d{2})\\.", "S$1"]
|
||||
args: ["(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{1})\\s*\\.*\\s(?i)serie\\.*", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(\\d{1})\\.", "S0$1"]
|
||||
args: ["(?i)serie\\s*(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{2,})\\s*\\.*", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)serie\\s*(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{1})\\s*\\.*", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\,*\\s*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\,*\\s*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})", "S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\s*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\s*\\.*", "S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\s*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\s*\\.*", "S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["^GRID\\:*\\s(?i)season", "GRID Seasson"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\s*(\\d{2,})\\.*", "S$1"]
|
||||
- name: re_replace
|
||||
args: ["(?i)season\\s*(\\d{1})\\.*", "S0$1"]
|
||||
- name: re_replace
|
||||
args: ["GRID Seasson", "GRID Season"]
|
||||
- name: re_replace
|
||||
args: ["\\sPES\\s(\\d{4})\\s(?i)season", " PES $1 Seasson"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)season\\)*", " S$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)season\\)*", " S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)season\\)*", " S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)season\\)*", " S0$1"]
|
||||
- name: re_replace
|
||||
args: [" PES (\\d{4}) Seasson", " PES $1 Season"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})\\,*\\s*(?i)serie\\)*", " S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})\\,*\\s*(?i)serie\\)*", " S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)serie\\)*", " S$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)serie\\)*", " S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)serie\\)*", " S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)serie\\)*", " S0$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})\\,*\\s*(?i)seria\\)*", " S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})\\,*\\s*(?i)seria\\)*", " S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\d{2,}\\.*\\s*(?i)seria\\s\\((?i)s(\\d{2,})", " (S$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)seria\\)*", " S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)seria\\)*", " S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)seria\\)*", " S$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)seria\\)*", " S0$1"]
|
||||
- name: re_replace
|
||||
args: ["\\s\\d{1}\\.*\\s*(?i)seria\\s*\\((?i)s(\\d{1})", " (S0$1"]
|
||||
- name: re_replace
|
||||
args: ["(\\d{2,})\\.*\\s*(?i)serii\\)*", "S01-S$1"]
|
||||
- name: re_replace
|
||||
args: ["(\\d{1})\\.*\\s*(?i)serii\\)*", "S01-S0$1"]
|
||||
- name: re_replace
|
||||
args: ["(?i)pouze (\\d{1})\\-(\\d{2,})", "pouze S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)pouze (\\d{1})\\-(\\d{1})", "pouze S0$1-S0$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)komplet (\\d{1})\\-(\\d{2,})", "komplet S0$1-S$2"]
|
||||
- name: re_replace
|
||||
args: ["(?i)komplet (\\d{1})\\-(\\d{1})", "komplet S0$1-S0$2"]
|
||||
details:
|
||||
selector: a[href^="details.php?name="]
|
||||
attribute: href
|
||||
poster:
|
||||
selector: img[class="lozad"]
|
||||
attribute: data-src
|
||||
poster:
|
||||
selector: img[src="//cdn.sktorrent.eu/obrazky/xXx.jpg"]
|
||||
attribute: src
|
||||
download:
|
||||
selector: a[href^="details.php?name="]
|
||||
attribute: href
|
||||
|
@@ -50,6 +50,10 @@ settings:
|
||||
options:
|
||||
created: created
|
||||
seeders: seeders
|
||||
- name: flaresolverr
|
||||
type: info
|
||||
label: FlareSolverr
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
|
||||
search:
|
||||
# https://skytorrents.to/?search=mr+mercedes+s02e05&sort=created
|
||||
|
@@ -71,8 +71,8 @@ caps:
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
music-search: [q]
|
||||
book-search: [q]
|
||||
|
||||
@@ -129,9 +129,9 @@ search:
|
||||
- path: selection.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
|
||||
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBIDShort }}{{ else }}{{ .Keywords }}{{ end }}"
|
||||
# 0 name, 1 descr, 2 both, 3 imdb
|
||||
blah: "{{ if .Query.IMDBID }}3{{ else }}0{{ end }}"
|
||||
search: "{{ .Keywords }}"
|
||||
# 0 name, 1 descr, 2 both
|
||||
blah: "0"
|
||||
orderby: "{{ .Config.sort }}"
|
||||
sort: "{{ .Config.type }}"
|
||||
|
||||
|
178
src/Jackett.Common/Definitions/sugoimusic.yml
Normal file
178
src/Jackett.Common/Definitions/sugoimusic.yml
Normal file
@@ -0,0 +1,178 @@
|
||||
---
|
||||
id: sugoimusic
|
||||
name: SugoiMusic
|
||||
description: "SugoiMusic is a Private Torrent Tracker for Asian MUSIC / TV"
|
||||
language: en
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://sugoimusic.me/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Audio, desc: Album}
|
||||
- {id: 2, cat: Audio, desc: EP}
|
||||
- {id: 3, cat: Audio, desc: Single}
|
||||
- {id: 4, cat: Audio/Video, desc: Bluray}
|
||||
- {id: 5, cat: Audio/Video, desc: DVD}
|
||||
- {id: 6, cat: Audio/Video, desc: PV}
|
||||
- {id: 7, cat: Audio/Video, desc: "Music Performance"}
|
||||
- {id: 8, cat: Audio/Video, desc: "TV Music"}
|
||||
- {id: 9, cat: TV, desc: "TV Variety"}
|
||||
- {id: 10, cat: TV, desc: "TV Drama"}
|
||||
- {id: 11, cat: Other, desc: Pictures}
|
||||
- {id: 12, cat: Other/Misc, desc: Misc}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
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 SugoiMusic 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: time
|
||||
options:
|
||||
time: created
|
||||
seeders: seeders
|
||||
size: size
|
||||
- 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>Covers per page:</b> setting to <b>100</b> on your account profile.
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form[action="login.php"]
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
twofa: "{{ .Config.2facode }}"
|
||||
login: ""
|
||||
error:
|
||||
- selector: span.warning
|
||||
message:
|
||||
selector: #text
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href^="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
searchstr: "{{ .Keywords }}"
|
||||
# we can only grab the first release if group_results=1
|
||||
group_results: 0
|
||||
action: basic
|
||||
order_by: "{{ .Config.sort }}"
|
||||
order_way: "{{ .Config.type }}"
|
||||
# 0 normal, 1 freeleech, 2 neutral leech, 3 either
|
||||
freetorrent: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}"
|
||||
searchsubmit: 1
|
||||
|
||||
rows:
|
||||
selector: tr.torrent
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: div:nth-child(1)
|
||||
case:
|
||||
"div[title=\"Album\"]": 1
|
||||
"div[title=\"EP\"]": 2
|
||||
"div[title=\"Single\"]": 3
|
||||
"div[title=\"Bluray\"]": 4
|
||||
"div[title=\"DVD\"]": 5
|
||||
"div[title=\"PV\"]": 6
|
||||
"div[title=\"Music Performance\"]": 7
|
||||
"div[title=\"TV Music\"]": 8
|
||||
"div[title=\"TV Variety\"]": 9
|
||||
"div[title=\"TV Drama\"]": 10
|
||||
"div[title=\"Pictures\"]": 11
|
||||
"div[title=\"Misc\"]": 12
|
||||
_title_artist:
|
||||
selector: div.torrent_artists > a
|
||||
_title_name:
|
||||
selector: a.torrent_name
|
||||
_title_date:
|
||||
selector: div.group_info.clear
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(\\[.+?\\])"
|
||||
title:
|
||||
text: "{{ .Result._title_artist }} - {{ .Result._title_name }} {{ .Result._title_date }}"
|
||||
details:
|
||||
selector: a.torrent_name[href^="torrents.php?id="]
|
||||
attribute: href
|
||||
poster:
|
||||
selector: img
|
||||
attribute: src
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/static/common/noartwork/nocover.png", ""]
|
||||
download:
|
||||
selector: span > a[href^="torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
magnet:
|
||||
# magnet links can be enabled/disabled in account settings
|
||||
optional: true
|
||||
selector: span > a[href^="magnet:?dn="]
|
||||
attribute: href
|
||||
date:
|
||||
selector: span.time.tooltip
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: td.number_column.nobr
|
||||
files:
|
||||
selector: td:nth-last-child(6)
|
||||
seeders:
|
||||
selector: td:nth-last-child(2)
|
||||
leechers:
|
||||
selector: td:nth-last-child(1)
|
||||
grabs:
|
||||
selector: td:nth-last-child(3)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
div.torrent_info:contains("Freeleech"): 0
|
||||
div.torrent_info:contains("Neutral Leech"): 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
div.torrent_info:contains("Neutral Leech"): 0
|
||||
"*": 1
|
||||
minimumratio:
|
||||
text: 0.95
|
||||
minimumseedtime:
|
||||
# 3 days (as seconds = 3 x 24 x 60 x 60)
|
||||
text: 259200
|
||||
description:
|
||||
selector: div.torrent_info
|
||||
# NexusPHP Standard v1.5 Beta 4
|
@@ -72,10 +72,12 @@ search:
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
|
@@ -115,6 +115,9 @@ search:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
incldead: 1
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
|
@@ -89,6 +89,9 @@ search:
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
|
@@ -70,11 +70,12 @@ search:
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
|
@@ -89,6 +89,9 @@ search:
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
|
@@ -88,6 +88,9 @@ search:
|
||||
inputs:
|
||||
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
titleonly: 1
|
||||
# 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used
|
||||
nonboolean: 0
|
||||
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
|
@@ -10,7 +10,7 @@ links:
|
||||
- https://www.torlock.com/
|
||||
- https://www.torlock2.com/
|
||||
- https://www.torlock.icu/
|
||||
- https://torlock.unblockit.dev/
|
||||
- https://torlock.unblockit.ltd/
|
||||
legacylinks:
|
||||
- https://torlock.com/
|
||||
- https://torlock.unblockit.pro/
|
||||
@@ -22,6 +22,7 @@ legacylinks:
|
||||
- https://torlock.unblockit.top/
|
||||
- https://torlock.unblockit.lat/
|
||||
- https://torlock.unblockit.app/
|
||||
- https://torlock.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -8,7 +8,7 @@ encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://www.torrentdownload.info/
|
||||
- https://torrentdownload.unblockit.dev/
|
||||
- https://torrentdownload.unblockit.ltd/
|
||||
- https://torrentdownload.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://torrentdownload.unblockit.pro/
|
||||
@@ -29,6 +29,7 @@ legacylinks:
|
||||
- https://torrentdownload.unblockit.lat/
|
||||
- https://torrentdownload.unblockit.app/
|
||||
- https://torrentdownload.unblocked.rest/
|
||||
- https://torrentdownload.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://www.torrentdownloads.info/
|
||||
- https://www.torrentdownloads.me/
|
||||
- https://torrentdownloads.unblockit.dev/
|
||||
- https://torrentdownloads.unblockit.ltd/
|
||||
- https://torrentdownloads.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://torrentdownloads.unblockit.pro/
|
||||
@@ -30,6 +30,7 @@ legacylinks:
|
||||
- https://torrentdownloads.unblockit.lat/
|
||||
- https://torrentdownloads.unblockit.app/
|
||||
- https://torrentdownloads.unblocked.rest/
|
||||
- https://torrentdownloads.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://www.torrentfunk.com/
|
||||
- https://www.torrentfunk2.com/
|
||||
- https://torrentfunk.unblockit.dev/
|
||||
- https://torrentfunk.unblockit.ltd/
|
||||
legacylinks:
|
||||
- https://torrentfunk.unblockit.pro/
|
||||
- https://torrentfunk.unblockit.one/
|
||||
@@ -20,6 +20,7 @@ legacylinks:
|
||||
- https://torrentfunk.unblockit.top/
|
||||
- https://torrentfunk.unblockit.lat/
|
||||
- https://torrentfunk.unblockit.app/
|
||||
- https://torrentfunk.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -11,7 +11,7 @@ links:
|
||||
- https://torrentgalaxy.mx/
|
||||
- https://torrentgalaxy.su/
|
||||
- https://torrentgalaxy.unblockninja.com/
|
||||
- https://torrentgalaxy.unblockit.dev/
|
||||
- https://torrentgalaxy.unblockit.ltd/
|
||||
- https://tgx.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://torrentgalaxy.org/ # redirects to *.to
|
||||
@@ -35,6 +35,7 @@ legacylinks:
|
||||
- https://torrentgalaxy.unblockit.app/
|
||||
- https://torrentgalaxy.root.yt/
|
||||
- https://tgx.unblocked.rest/
|
||||
- https://torrentgalaxy.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -36,6 +36,7 @@ caps:
|
||||
- {id: 60, cat: TV/Sport, desc: "Sport"}
|
||||
- {id: 53, cat: TV, desc: "TV Seriale"}
|
||||
- {id: 56, cat: XXX, desc: "XXX"}
|
||||
- {id: 70, cat: TV/Anime, desc: "Anime"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
@@ -6,12 +6,12 @@ language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentparadise.la/
|
||||
- https://torrentparadise.cl/
|
||||
legacylinks:
|
||||
- https://torrentparadise.org/
|
||||
- https://torrentparadise.cl/
|
||||
- https://torrentparadise.to/
|
||||
- https://torrentparadise.cc/
|
||||
- https://torrentparadise.la/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -7,7 +7,7 @@ type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://torrentview28.com/
|
||||
- https://torrentview29.com/
|
||||
legacylinks:
|
||||
- https://torrentview.net/
|
||||
- https://torrentview3.net/
|
||||
@@ -35,6 +35,7 @@ legacylinks:
|
||||
- https://torrentview25.com/
|
||||
- https://torrentview26.com/
|
||||
- https://torrentview27.com/
|
||||
- https://torrentview28.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -8,7 +8,8 @@ encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://torrentzwealmisr.onion.ly/
|
||||
- https://torrentz.unblockit.dev/
|
||||
- https://torrentz.unblockit.ltd/
|
||||
- https://torrentz2.unblockninja.com/
|
||||
legacylinks:
|
||||
- https://torrentz.unblockit.pro/
|
||||
- https://torrentz.unblockit.one/
|
||||
@@ -30,9 +31,9 @@ legacylinks:
|
||||
- https://torrentz2.is/ # Error: 503 Service Unavailable
|
||||
- https://torrentsmirror.com/ # Error: 503 Service Unavailable
|
||||
- https://torrentz.pl/ # Error: 503 Service Unavailable
|
||||
- https://torrentz2.unblockninja.com/ # Error: 503 Service Unavailable
|
||||
- https://torrentz.unblockit.app/ # -> *.dev
|
||||
- https://torrentz2.unblocked.rest/ # Error: 503 Service Unavailable
|
||||
- https://torrentz.unblockit.app/
|
||||
- https://torrentz2.unblocked.rest/
|
||||
- https://torrentz.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -6,15 +6,15 @@ language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentz2k.xyz/
|
||||
legacylinks:
|
||||
- https://torrentz2k.pw/
|
||||
legacylinks:
|
||||
- https://torrentz2k.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: book, cat: Books, desc: Books}
|
||||
- {id: film, cat: Movies, desc: Movies}
|
||||
- {id: gamepad, cat: Console, desc: Games}
|
||||
- {id: gamepad, cat: PC/Games, desc: Games}
|
||||
- {id: list, cat: Other, desc: Other}
|
||||
- {id: male, cat: XXX, desc: XXX}
|
||||
- {id: music, cat: Audio, desc: "Music MP3"}
|
||||
@@ -22,7 +22,7 @@ caps:
|
||||
- {id: play-circle, cat: TV, desc: WEBTV}
|
||||
- {id: smile-o, cat: TV/Anime, desc: Anime}
|
||||
- {id: television, cat: TV, desc: TV}
|
||||
- {id: wrench, cat: PC, desc: Software}
|
||||
- {id: wrench, cat: PC, desc: Apps}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
@@ -38,7 +38,7 @@ settings:
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
|
||||
search:
|
||||
# https://torrentz2k.xyz/search/
|
||||
# https://torrentz2k.pw/search/
|
||||
paths:
|
||||
- path: search/
|
||||
method: post
|
||||
@@ -49,8 +49,6 @@ search:
|
||||
inputs:
|
||||
q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}:latest:{{ end }}"
|
||||
category: all
|
||||
x: 0
|
||||
y: 0
|
||||
keywordsfilters:
|
||||
# the site uses % for wildcard
|
||||
- name: re_replace
|
||||
@@ -78,11 +76,14 @@ search:
|
||||
selector: span.btntitle
|
||||
attribute: title
|
||||
details:
|
||||
# details page is only accessible via form and post which Cardigann does not support.
|
||||
text: "{{ .Config.sitelink }}"
|
||||
download:
|
||||
selector: a[href^="magnet:?xt="]
|
||||
selector: a
|
||||
attribute: href
|
||||
infohash:
|
||||
selector: a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: trim
|
||||
args: "/"
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
|
@@ -1,30 +1,22 @@
|
||||
---
|
||||
id: onlyscene
|
||||
name: ONLYscene
|
||||
description: "ONLYscene is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
|
||||
language: fr-fr
|
||||
id: trackeros
|
||||
name: Trackeros
|
||||
description: "Trackeros is a Private SPANISH Tracker for HD MOVIES / TV / GENERAL"
|
||||
language: es-es
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.onlyscene.org/
|
||||
- https://trackeros.tk
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
- {id: 5, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 9, cat: TV/Anime, desc: "TV Anime"}
|
||||
- {id: 10, cat: TV/Documentary, desc: "DOC"}
|
||||
- {id: 12, cat: Other, desc: "Attente-Classement"}
|
||||
- {id: 13, cat: PC/Games, desc: "jeux"}
|
||||
- {id: 14, cat: Other, desc: "Dox"}
|
||||
- {id: 15, cat: PC/0day, desc: "APPS"}
|
||||
- {id: 16, cat: Books/Mags, desc: "Journaux-Mags"}
|
||||
- {id: 17, cat: Books/EBook, desc: "Ebooks"}
|
||||
- {id: 18, cat: TV, desc: "Spectacles"}
|
||||
- {id: 19, cat: TV, desc: "TV Spectacles"}
|
||||
- {id: 20, cat: TV/Documentary, desc: "TV DOC"}
|
||||
- {id: 1, cat: Movies, desc: "Películas"}
|
||||
- {id: 2, cat: TV, desc: "Series"}
|
||||
- {id: 3, cat: Audio, desc: "Música"}
|
||||
- {id: 4, cat: Console, desc: "Juegos"}
|
||||
- {id: 7, cat: Audio/Video, desc: "Conciertos"}
|
||||
- {id: 5, cat: PC, desc: "Aplicaciones"}
|
||||
- {id: 6, cat: Other, desc: "Otros"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
@@ -44,25 +36,6 @@ settings:
|
||||
type: checkbox
|
||||
label: Search freeleech only
|
||||
default: false
|
||||
- name: multilang
|
||||
type: checkbox
|
||||
label: Replace MULTI by another language in release name
|
||||
default: false
|
||||
- name: multilanguage
|
||||
type: select
|
||||
label: Replace MULTI by this language
|
||||
default: FRENCH
|
||||
options:
|
||||
FRENCH: FRENCH
|
||||
MULTI.FRENCH: MULTI.FRENCH
|
||||
ENGLISH: ENGLISH
|
||||
MULTI.ENGLISH: MULTI.ENGLISH
|
||||
VOSTFR: VOSTFR
|
||||
MULTI.VOSTFR: MULTI.VOSTFR
|
||||
- name: vostfr
|
||||
type: checkbox
|
||||
label: Replace VOSTFR with ENGLISH
|
||||
default: false
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
@@ -130,43 +103,29 @@ search:
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "/categories/(\\d+)"
|
||||
title_phase1:
|
||||
title:
|
||||
selector: a.view-torrent
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["([\\.]+)", " "]
|
||||
title_multilang:
|
||||
text: "{{ .Result.title_phase1 }}"
|
||||
filters:
|
||||
args: ["[\\[\\]]", " "] # remove [ and ]
|
||||
- name: re_replace
|
||||
args: ["(?i)(\\smulti\\s)", " {{ .Config.multilanguage }} "]
|
||||
title_phase2:
|
||||
text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
|
||||
title_vostfr:
|
||||
text: "{{ .Result.title_phase2 }}"
|
||||
filters:
|
||||
args: [" +", " "] # remove duplicate spaces
|
||||
- name: re_replace
|
||||
args: ["(?i)(\\svostfr\\s)", " ENGLISH "]
|
||||
args: ["(?i)microhd", "BDRip MicroHD"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(\\ssubfrench\\s)", " ENGLISH "]
|
||||
title:
|
||||
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
|
||||
args: ["(?i)(m1080p|mhd1080p)", "1080p MicroHD"]
|
||||
- name: re_replace
|
||||
args: ["(?i)(m720p|mhd720p)", "720p MicroHD"]
|
||||
- name: re_replace
|
||||
args: ["(?i)brrip", "BDRip"]
|
||||
- name: append
|
||||
args: " MULTi/SPANiSH" # Add language for Sonarr/Radarr
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
attribute: href
|
||||
details:
|
||||
selector: a.view-torrent
|
||||
attribute: href
|
||||
poster:
|
||||
selector: div.torrent-poster img
|
||||
attribute: src
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "https://images.weserv.nl/?url=" # for display on dashboard
|
||||
- name: append
|
||||
args: "&w=180&h=270" # for display on dashboard
|
||||
- name: replace
|
||||
args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""]
|
||||
size:
|
||||
selector: td:nth-last-child(4)
|
||||
seeders:
|
||||
@@ -178,12 +137,6 @@ search:
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d+)
|
||||
imdb:
|
||||
selector: a[href*="imdb.com/title/tt"]
|
||||
attribute: href
|
||||
tmdbid:
|
||||
selector: a[href*="themoviedb.org/movie/"]
|
||||
attribute: href
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
@@ -240,8 +193,8 @@ search:
|
||||
i[class*="fa-certificate text-pink"]: 2 # Featured Torrent
|
||||
"*": 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
text: 0.4
|
||||
minimumseedtime:
|
||||
# 3 days (as seconds = 3 x 24 x 60 x 60)
|
||||
text: 259200
|
||||
# UNIT3D 2.3.0
|
||||
# 32 hours => 32 * 60 * 60 seconds
|
||||
text: 115200
|
||||
# UNIT3D 4.x.x
|
@@ -139,12 +139,14 @@ search:
|
||||
- name: re_replace # eg Supergirl 2018 S04E01 ...
|
||||
args: ["20[0-2][0-9] (S[0-9][0-9])", "$1"]
|
||||
- name: replace
|
||||
args: ["ESP", "Spanish"]
|
||||
args: ["SPA", "SPANiSH"]
|
||||
- name: replace
|
||||
args: ["ESP", "SPANiSH"]
|
||||
- name: re_replace
|
||||
args: ["[EI]NG", "English"]
|
||||
- name: replace
|
||||
args: ["CAT", "Catalan"]
|
||||
- name: replace
|
||||
- name: re_replace
|
||||
args: ["FR[AE]", "French"]
|
||||
- name: replace
|
||||
args: ["JAP", "Japanese"]
|
||||
@@ -153,15 +155,17 @@ search:
|
||||
- name: replace
|
||||
args: ["RUS", "Russian"]
|
||||
- name: replace
|
||||
args: ["DUAL", "Spanish English"]
|
||||
args: ["DUAL", "MULTi/SPANiSH"]
|
||||
- name: replace
|
||||
args: ["BDRIP 2160P", "Bluray-2160P"] # Fix for Radarr
|
||||
- name: re_replace
|
||||
args: ["MHD", "MHD.BDRip"] # Fix for Radarr
|
||||
args: ["MHD", "MHD BDRIP"] # Fix for Radarr
|
||||
- name: re_replace
|
||||
args: ["WEB.DL", "WEBDL"] # Fix for Radarr
|
||||
args: ["WEB DL", "WEBDL"] # Fix for Radarr
|
||||
- name: re_replace
|
||||
args: ["WEBDL.MHD.BDRip", "WEBDL"] # Fix for Radarr
|
||||
args: ["WEBDL MHD BDRIP", "WEBDL"] # Fix for Radarr
|
||||
- name: re_replace
|
||||
args: ["WEBRIP.MHD.BDRip", "WEBRIP"] # Fix for Radarr
|
||||
args: ["WEBRIP MHD BDRIP", "WEBRIP"] # Fix for Radarr
|
||||
details:
|
||||
selector: td[valign="middle"] a
|
||||
attribute: href
|
||||
@@ -196,6 +200,7 @@ search:
|
||||
case:
|
||||
img[src$="gold.png"]: 0
|
||||
img[src$="silver.png"]: 0.5
|
||||
img[src$="bronze.png"]: 0.25
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
|
@@ -7,8 +7,7 @@ type: semi-private
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://www.yggtorrent.si/
|
||||
# don't forget to also change below in settings !
|
||||
- https://www2.yggtorrent.si/
|
||||
legacylinks:
|
||||
- https://yggtorrent.com/
|
||||
- https://ww1.yggtorrent.com/
|
||||
@@ -34,6 +33,7 @@ legacylinks:
|
||||
- https://www5.yggtorrent.pe/
|
||||
- https://yggtorrent.ws/
|
||||
- https://yggtorrent.se/
|
||||
- https://www.yggtorrent.si/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -113,10 +113,6 @@ settings:
|
||||
type: info
|
||||
label: How to get the User-Agent
|
||||
default: "<ol><li>From the same place you fetched the cookie,<li>Find <b>'user-agent:'</b> in the <b>Request Headers</b> section<li><b>Select</b> and <b>Copy</b> the whole user-agent string <i>(everything after 'user-agent: ')</i> and <b>Paste</b> here.</ol>"
|
||||
- name: searchanddlurl
|
||||
label: Search and download URL
|
||||
type: text
|
||||
default: www2.yggtorrent.si
|
||||
- name: category
|
||||
type: select
|
||||
label: Catégorie
|
||||
@@ -214,11 +210,9 @@ search:
|
||||
args: [" ", " "]
|
||||
- name: trim
|
||||
paths:
|
||||
- path: "https://{{ .Config.searchanddlurl }}/{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Config.betasearchengine }}{{ .Keywords }}{{ else }}{{ re_replace .Keywords \"\\b[^\\s]+\\b\" \"\"$&\"\"}}{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
followredirect: true
|
||||
- path: "{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Config.betasearchengine }}{{ .Keywords }}{{ else }}{{ re_replace .Keywords \"\\b[^\\s]+\\b\" \"\"$&\"\"}}{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
# Saison Word
|
||||
- path: "https://{{ .Config.searchanddlurl }}/{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Keywords }}{{ re_replace .Keywords \"[sS]0(\\d{1,2})\" \"Saison.$1\"}}{{ else }}&page=50{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
followredirect: true
|
||||
- path: "{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Keywords }}{{ re_replace .Keywords \"[sS]0(\\d{1,2})\" \"Saison.$1\"}}{{ else }}&page=50{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
|
||||
rows:
|
||||
selector: table.table > tbody > tr
|
||||
@@ -299,7 +293,7 @@ search:
|
||||
# changed the catid into and hidden div as of last tracker problem
|
||||
selector: ":nth-child(1) > div.hidden"
|
||||
download:
|
||||
text: "https://{{ .Config.searchanddlurl }}/engine/download_torrent?id={{ .Result._id }}"
|
||||
text: "{{ .Config.sitelink }}engine/download_torrent?id={{ .Result._id }}"
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
|
@@ -7,8 +7,7 @@ type: semi-private
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://www.yggtorrent.si/
|
||||
# don't forget to also change below in settings !
|
||||
- https://www2.yggtorrent.si/
|
||||
legacylinks:
|
||||
- https://yggtorrent.com/
|
||||
- https://ww1.yggtorrent.com/
|
||||
@@ -34,6 +33,7 @@ legacylinks:
|
||||
- https://www5.yggtorrent.pe/
|
||||
- https://yggtorrent.ws/
|
||||
- https://yggtorrent.se/
|
||||
- https://www.yggtorrent.si/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -98,10 +98,6 @@ caps:
|
||||
book-search: [q]
|
||||
|
||||
settings:
|
||||
- name: searchanddlurl
|
||||
label: Search and download URL
|
||||
type: text
|
||||
default: www2.yggtorrent.si
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
@@ -175,13 +171,11 @@ settings:
|
||||
default: This site may use Cloudflare DDoS Protection, therefore Jackett requires <a href="https://github.com/Jackett/Jackett#configuring-flaresolverr" target="_blank">FlareSolver</a> to access it.
|
||||
|
||||
login:
|
||||
method: form
|
||||
path: /
|
||||
form: "#user-login"
|
||||
method: post
|
||||
path: "/user/login"
|
||||
inputs:
|
||||
id: "{{ .Config.username }}"
|
||||
pass: "{{ .Config.password }}"
|
||||
submit: ""
|
||||
error:
|
||||
- selector: "#login_msg_pass[style=\"\"][style] > center"
|
||||
- selector: "#ban_msg_login[style=\"\"][style] > center"
|
||||
@@ -222,11 +216,9 @@ search:
|
||||
args: [" ", " "]
|
||||
- name: trim
|
||||
paths:
|
||||
- path: "https://{{ .Config.searchanddlurl }}/{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Config.betasearchengine }}{{ .Keywords }}{{ else }}{{ re_replace .Keywords \"\\b[^\\s]+\\b\" \"\"$&\"\"}}{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
followredirect: true
|
||||
- path: "{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Config.betasearchengine }}{{ .Keywords }}{{ else }}{{ re_replace .Keywords \"\\b[^\\s]+\\b\" \"\"$&\"\"}}{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
# Saison Word
|
||||
- path: "https://{{ .Config.searchanddlurl }}/{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Keywords }}{{ re_replace .Keywords \"[sS]0(\\d{1,2})\" \"Saison.$1\"}}{{ else }}&page=50{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
followredirect: true
|
||||
- path: "{{ if .Config.betasearchengine }}new_search{{ else }}engine{{ end }}/search?category={{ .Config.category }}&name={{ if .Keywords }}{{ re_replace .Keywords \"[sS]0(\\d{1,2})\" \"Saison.$1\"}}{{ else }}&page=50{{ end }}&description=&file=&uploader=&sub_category=&do=search&order={{ .Config.type }}&sort={{ .Config.sort }}"
|
||||
|
||||
rows:
|
||||
selector: table.table > tbody > tr
|
||||
@@ -307,7 +299,7 @@ search:
|
||||
# changed the catid into and hidden div as of last tracker problem
|
||||
selector: ":nth-child(1) > div.hidden"
|
||||
download:
|
||||
text: "https://{{ .Config.searchanddlurl }}/engine/download_torrent?id={{ .Result._id }}"
|
||||
text: "{{ .Config.sitelink }}engine/download_torrent?id={{ .Result._id }}"
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
|
@@ -48,7 +48,7 @@ search:
|
||||
- name: tolower
|
||||
|
||||
rows:
|
||||
selector: tr.table-default
|
||||
selector: tr.table-default:has(a[href^="/torrent/"])
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
|
@@ -9,7 +9,7 @@ followredirect: true
|
||||
links:
|
||||
- https://zooqle.com/
|
||||
- https://zooqle.unblockninja.com/
|
||||
- https://zooqle.unblockit.dev/
|
||||
- https://zooqle.unblockit.ltd/
|
||||
- https://zooqle.unblocked.monster/
|
||||
legacylinks:
|
||||
- https://zooqle.unblockit.pro/
|
||||
@@ -30,6 +30,7 @@ legacylinks:
|
||||
- https://zooqle.unblockit.lat/
|
||||
- https://zooqle.unblockit.app/
|
||||
- https://zooqle.unblocked.rest/
|
||||
- https://zooqle.unblockit.dev/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
184
src/Jackett.Common/Indexers/Abstract/SpeedAppTracker.cs
Normal file
184
src/Jackett.Common/Indexers/Abstract/SpeedAppTracker.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using WebClient = Jackett.Common.Utils.Clients.WebClient;
|
||||
|
||||
namespace Jackett.Common.Indexers.Abstract
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public abstract class SpeedAppTracker : BaseWebIndexer
|
||||
{
|
||||
private readonly Dictionary<string, string> _apiHeaders = new Dictionary<string, string>
|
||||
{
|
||||
{"Accept", "application/json"},
|
||||
{"Content-Type", "application/json"}
|
||||
};
|
||||
// API DOC: https://speedapp.io/api/doc
|
||||
private string LoginUrl => SiteLink + "api/login";
|
||||
private string SearchUrl => SiteLink + "api/torrent";
|
||||
private string _token;
|
||||
|
||||
private new ConfigurationDataBasicLoginWithEmail configData => (ConfigurationDataBasicLoginWithEmail)base.configData;
|
||||
|
||||
protected SpeedAppTracker(string link, string id, string name, string description,
|
||||
IIndexerConfigurationService configService, WebClient client, Logger logger,
|
||||
IProtectionService p, ICacheService cs, TorznabCapabilities caps)
|
||||
: base(id: id,
|
||||
name: name,
|
||||
description: description,
|
||||
link: link,
|
||||
caps: caps,
|
||||
configService: configService,
|
||||
client: client,
|
||||
logger: logger,
|
||||
p: p,
|
||||
cacheService: cs,
|
||||
configData: new ConfigurationDataBasicLoginWithEmail())
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
await RenewalTokenAsync();
|
||||
|
||||
var releases = await PerformQuery(new TorznabQuery());
|
||||
await ConfigureIfOK(string.Empty, releases.Any(),
|
||||
() => throw new Exception("Could not find releases."));
|
||||
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
|
||||
private async Task RenewalTokenAsync()
|
||||
{
|
||||
if (configData.Email.Value == null || configData.Password.Value == null)
|
||||
throw new Exception("Please, check the indexer configuration.");
|
||||
var body = new Dictionary<string, string>
|
||||
{
|
||||
{ "username", configData.Email.Value.Trim() },
|
||||
{ "password", configData.Password.Value.Trim() }
|
||||
};
|
||||
var jsonData = JsonConvert.SerializeObject(body);
|
||||
var result = await RequestWithCookiesAsync(
|
||||
LoginUrl, method: RequestType.POST, headers: _apiHeaders, rawbody: jsonData);
|
||||
var json = JObject.Parse(result.ContentString);
|
||||
_token = json.Value<string>("token");
|
||||
if (_token == null)
|
||||
throw new Exception(json.Value<string>("message"));
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
|
||||
//var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList();
|
||||
var qc = new List<KeyValuePair<string, string>> // NameValueCollection don't support cat[]=19&cat[]=6
|
||||
{
|
||||
{"itemsPerPage", "100"},
|
||||
{"sort", "torrent.createdAt"},
|
||||
{"direction", "desc"}
|
||||
};
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
qc.Add("categories[]", cat);
|
||||
|
||||
if (query.IsImdbQuery)
|
||||
qc.Add("imdbId", query.ImdbID);
|
||||
else
|
||||
qc.Add("search", query.GetQueryString());
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_token)) // fist time login
|
||||
await RenewalTokenAsync();
|
||||
|
||||
var searchUrl = SearchUrl + "?" + qc.GetQueryString();
|
||||
var response = await RequestWithCookiesAsync(searchUrl, headers: GetSearchHeaders());
|
||||
if (response.Status == HttpStatusCode.Unauthorized)
|
||||
{
|
||||
await RenewalTokenAsync(); // re-login
|
||||
response = await RequestWithCookiesAsync(searchUrl, headers: GetSearchHeaders());
|
||||
}
|
||||
else if (response.Status != HttpStatusCode.OK)
|
||||
throw new Exception($"Unknown error in search: {response.ContentString}");
|
||||
|
||||
try
|
||||
{
|
||||
var rows = JArray.Parse(response.ContentString);
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var id = row.Value<string>("id");
|
||||
var details = new Uri($"{SiteLink}browse/{id}");
|
||||
var link = new Uri($"{SiteLink}api/torrent/{id}/download");
|
||||
var publishDate = DateTime.Parse(row.Value<string>("created_at"), CultureInfo.InvariantCulture);
|
||||
var cat = row.Value<JToken>("category").Value<string>("id");
|
||||
|
||||
// "description" field in API has too much HTML code
|
||||
var description = row.Value<string>("short_description");
|
||||
|
||||
var posterStr = row.Value<string>("poster");
|
||||
var poster = Uri.TryCreate(posterStr, UriKind.Absolute, out var posterUri) ? posterUri : null;
|
||||
|
||||
var dlVolumeFactor = row.Value<double>("download_volume_factor");
|
||||
var ulVolumeFactor = row.Value<double>("upload_volume_factor");
|
||||
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
Title = row.Value<string>("name"),
|
||||
Link = link,
|
||||
Details = details,
|
||||
Guid = details,
|
||||
Category = MapTrackerCatToNewznab(cat),
|
||||
PublishDate = publishDate,
|
||||
Description = description,
|
||||
Poster = poster,
|
||||
Size = row.Value<long>("size"),
|
||||
Grabs = row.Value<long>("times_completed"),
|
||||
Seeders = row.Value<int>("seeders"),
|
||||
Peers = row.Value<int>("leechers") + row.Value<int>("seeders"),
|
||||
DownloadVolumeFactor = dlVolumeFactor,
|
||||
UploadVolumeFactor = ulVolumeFactor,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800 // 48 hours
|
||||
};
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(response.ContentString, ex);
|
||||
}
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
{
|
||||
var response = await RequestWithCookiesAsync(link.ToString(), headers: GetSearchHeaders());
|
||||
if (response.Status == HttpStatusCode.Unauthorized)
|
||||
{
|
||||
await RenewalTokenAsync();
|
||||
response = await RequestWithCookiesAsync(link.ToString(), headers: GetSearchHeaders());
|
||||
}
|
||||
else if (response.Status != HttpStatusCode.OK)
|
||||
throw new Exception($"Unknown error in download: {response.ContentBytes}");
|
||||
return response.ContentBytes;
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GetSearchHeaders() => new Dictionary<string, string>
|
||||
{
|
||||
{"Authorization", $"Bearer {_token}"}
|
||||
};
|
||||
}
|
||||
}
|
@@ -45,12 +45,13 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
public override string[] AlternativeSiteLinks { get; protected set; } = {
|
||||
"https://epublibre.org/",
|
||||
"https://epublibre.unblockit.dev/"
|
||||
"https://epublibre.unblockit.ltd/"
|
||||
};
|
||||
|
||||
public override string[] LegacySiteLinks { get; protected set; } = {
|
||||
"https://epublibre.unblockit.lat/",
|
||||
"https://epublibre.unblockit.app/"
|
||||
"https://epublibre.unblockit.app/",
|
||||
"https://epublibre.unblockit.dev/"
|
||||
};
|
||||
|
||||
public EpubLibre(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||
|
@@ -24,7 +24,7 @@ namespace Jackett.Common.Indexers
|
||||
public override string[] AlternativeSiteLinks { get; protected set; } = {
|
||||
"https://iptorrents.com/",
|
||||
"https://www.iptorrents.com/",
|
||||
"https://iptorrents.eu/",
|
||||
"https://iptorrents.me/",
|
||||
"https://nemo.iptorrents.com/",
|
||||
"https://ipt.getcrazy.me/",
|
||||
"https://ipt.findnemo.net/",
|
||||
@@ -44,7 +44,8 @@ namespace Jackett.Common.Indexers
|
||||
"http://ghost.cable-modem.org/",
|
||||
"http://logan.unusualperson.com/",
|
||||
"https://ipt.rocks/",
|
||||
"http://baywatch.workisboring.com/"
|
||||
"http://baywatch.workisboring.com/",
|
||||
"https://iptorrents.eu/"
|
||||
};
|
||||
|
||||
private new ConfigurationDataCookie configData => (ConfigurationDataCookie)base.configData;
|
||||
|
@@ -41,7 +41,8 @@ namespace Jackett.Common.Indexers
|
||||
"http://www.mejortorrent.tv/",
|
||||
"http://www.mejortorrentt.com/",
|
||||
"https://www.mejortorrentt.org/",
|
||||
"http://www.mejortorrentt.org/"
|
||||
"http://www.mejortorrentt.org/",
|
||||
"https://www.mejortorrents.net/"
|
||||
};
|
||||
|
||||
public MejorTorrent(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps,
|
||||
@@ -49,7 +50,7 @@ namespace Jackett.Common.Indexers
|
||||
: base(id: "mejortorrent",
|
||||
name: "MejorTorrent",
|
||||
description: "MejorTorrent - Hay veces que un torrent viene mejor! :)",
|
||||
link: "https://www.mejortorrents.net/",
|
||||
link: "https://www.mejortorrents1.com/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
|
@@ -1,248 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using AngleSharp.Dom;
|
||||
using AngleSharp.Html.Parser;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class NewRealWorld : BaseWebIndexer
|
||||
{
|
||||
private string LoginUrl => SiteLink + "login.php";
|
||||
private string BrowseUrl => SiteLink + "browse.php";
|
||||
|
||||
private new ConfigurationDataBasicLoginWithRSSAndDisplay configData
|
||||
{
|
||||
get => (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData;
|
||||
set => base.configData = value;
|
||||
}
|
||||
|
||||
public NewRealWorld(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||
ICacheService cs)
|
||||
: base(id: "newrealworld",
|
||||
name: "New Real World",
|
||||
description: "A German general tracker.",
|
||||
link: "https://nrw-tracker.eu/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
},
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
cacheService: cs,
|
||||
configData: new ConfigurationDataBasicLoginWithRSSAndDisplay())
|
||||
{
|
||||
Encoding = Encoding.GetEncoding("iso-8859-1");
|
||||
Language = "de-de";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(39, TorznabCatType.TVAnime, "Anime: HD|1080p");
|
||||
AddCategoryMapping(38, TorznabCatType.TVAnime, "Anime: HD|720p");
|
||||
AddCategoryMapping(1, TorznabCatType.TVAnime, "Anime: SD");
|
||||
AddCategoryMapping(7, TorznabCatType.PCMobileOther, "Appz: Handy-PDA");
|
||||
AddCategoryMapping(36, TorznabCatType.PCMac, "Appz: Mac");
|
||||
AddCategoryMapping(18, TorznabCatType.PC, "Appz: Sonstiges");
|
||||
AddCategoryMapping(17, TorznabCatType.PC, "Appz: Win");
|
||||
AddCategoryMapping(15, TorznabCatType.Audio, "Audio: DVD-R");
|
||||
AddCategoryMapping(49, TorznabCatType.AudioLossless, "Audio: Flac");
|
||||
AddCategoryMapping(30, TorznabCatType.AudioAudiobook, "Audio: Hörspiele");
|
||||
AddCategoryMapping(14, TorznabCatType.AudioMP3, "Audio: MP3");
|
||||
AddCategoryMapping(22, TorznabCatType.AudioVideo, "Audio: Videoclip");
|
||||
AddCategoryMapping(19, TorznabCatType.Other, "Diverses: Sonstiges");
|
||||
AddCategoryMapping(43, TorznabCatType.TVDocumentary, "Dokus: HD");
|
||||
AddCategoryMapping(2, TorznabCatType.TVDocumentary, "Dokus: SD");
|
||||
AddCategoryMapping(3, TorznabCatType.Books, "Ebooks: Bücher");
|
||||
AddCategoryMapping(52, TorznabCatType.BooksComics, "Ebooks: Comics");
|
||||
AddCategoryMapping(53, TorznabCatType.BooksMags, "Ebooks: Magazine");
|
||||
AddCategoryMapping(55, TorznabCatType.BooksOther, "Ebooks: XXX");
|
||||
AddCategoryMapping(54, TorznabCatType.BooksOther, "Ebooks: Zeitungen");
|
||||
AddCategoryMapping(47, TorznabCatType.PCMobileOther, "Games: Andere");
|
||||
AddCategoryMapping(32, TorznabCatType.PCMac, "Games: Mac");
|
||||
AddCategoryMapping(41, TorznabCatType.ConsoleNDS, "Games: NDS/3DS");
|
||||
AddCategoryMapping(4, TorznabCatType.PCGames, "Games: PC");
|
||||
AddCategoryMapping(5, TorznabCatType.ConsolePS3, "Games: PS2");
|
||||
AddCategoryMapping(9, TorznabCatType.ConsolePS3, "Games: PS3");
|
||||
AddCategoryMapping(6, TorznabCatType.ConsolePSP, "Games: PSP");
|
||||
AddCategoryMapping(28, TorznabCatType.ConsoleWii, "Games: Wii");
|
||||
AddCategoryMapping(31, TorznabCatType.ConsoleXBox, "Games: XboX");
|
||||
AddCategoryMapping(51, TorznabCatType.Movies3D, "Movies: 3D");
|
||||
AddCategoryMapping(37, TorznabCatType.MoviesBluRay, "Movies: BluRay");
|
||||
AddCategoryMapping(25, TorznabCatType.MoviesHD, "Movies: HD|1080p");
|
||||
AddCategoryMapping(29, TorznabCatType.MoviesHD, "Movies: HD|720p");
|
||||
AddCategoryMapping(11, TorznabCatType.MoviesDVD, "Movies: SD|DVD-R");
|
||||
AddCategoryMapping(8, TorznabCatType.MoviesSD, "Movies: SD|x264");
|
||||
AddCategoryMapping(13, TorznabCatType.MoviesSD, "Movies: SD|XviD");
|
||||
AddCategoryMapping(40, TorznabCatType.MoviesForeign, "Movies: US Movies");
|
||||
AddCategoryMapping(33, TorznabCatType.TV, "Serien: DVD-R");
|
||||
AddCategoryMapping(34, TorznabCatType.TVHD, "Serien: HD");
|
||||
AddCategoryMapping(56, TorznabCatType.TVHD, "Serien: Packs|HD");
|
||||
AddCategoryMapping(44, TorznabCatType.TVSD, "Serien: Packs|SD");
|
||||
AddCategoryMapping(16, TorznabCatType.TVSD, "Serien: SD");
|
||||
AddCategoryMapping(10, TorznabCatType.TVOther, "Serien: TV/Shows");
|
||||
AddCategoryMapping(21, TorznabCatType.TVForeign, "Serien: US TV");
|
||||
AddCategoryMapping(24, TorznabCatType.TVSport, "Sport: Diverses");
|
||||
AddCategoryMapping(23, TorznabCatType.TVSport, "Sport: Wrestling");
|
||||
AddCategoryMapping(57, TorznabCatType.Movies, "Tracker - Crew: pmHD");
|
||||
AddCategoryMapping(58, TorznabCatType.MoviesHD, "Ultra-HD: 4K");
|
||||
AddCategoryMapping(46, TorznabCatType.XXXOther, "XXX: Diverses");
|
||||
AddCategoryMapping(50, TorznabCatType.XXX, "XXX: HD");
|
||||
AddCategoryMapping(45, TorznabCatType.XXXPack, "XXX: Packs");
|
||||
AddCategoryMapping(27, TorznabCatType.XXX, "XXX: SD");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
var pairs = new Dictionary<string, string>
|
||||
{
|
||||
{ "username", configData.Username.Value },
|
||||
{ "password", configData.Password.Value },
|
||||
{ "submit", "Log+in!" }
|
||||
};
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
|
||||
await ConfigureIfOK(result.Cookies, result.ContentString != null && result.ContentString.Contains("logout.php"), () =>
|
||||
{
|
||||
var parser = new HtmlParser();
|
||||
var dom = parser.ParseDocument(result.ContentString);
|
||||
var errorMessage = dom.QuerySelector("table.tableinborder").InnerHtml;
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 3, 5, DayOfWeek.Sunday);
|
||||
var endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 10, 5, DayOfWeek.Sunday);
|
||||
var delta = new TimeSpan(1, 0, 0);
|
||||
var adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
|
||||
TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };
|
||||
var germanyTz = TimeZoneInfo.CreateCustomTimeZone("W. Europe Standard Time", new TimeSpan(1, 0, 0), "(GMT+01:00) W. Europe Standard Time", "W. Europe Standard Time", "W. Europe DST Time", adjustments);
|
||||
|
||||
var releases = new List<ReleaseInfo>();
|
||||
|
||||
var searchString = query.GetQueryString();
|
||||
var searchUrl = BrowseUrl;
|
||||
var queryCollection = new NameValueCollection
|
||||
{
|
||||
{"showsearch", "1"},
|
||||
{"incldead", "1"},
|
||||
{"orderby", "added"},
|
||||
{"sort", "desc"},
|
||||
{"cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")}
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
queryCollection.Add("search", searchString);
|
||||
}
|
||||
|
||||
searchUrl += "?" + queryCollection.GetQueryString();
|
||||
|
||||
var response = await RequestWithCookiesAsync(searchUrl);
|
||||
if (response.IsRedirect)
|
||||
{
|
||||
// re-login
|
||||
await ApplyConfiguration(null);
|
||||
response = await RequestWithCookiesAsync(searchUrl);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var parser = new HtmlParser();
|
||||
var dom = parser.ParseDocument(response.ContentString);
|
||||
var rows = dom.QuerySelectorAll("table.testtable> tbody > tr:has(td.tableb)");
|
||||
|
||||
foreach (var row in rows)
|
||||
{
|
||||
|
||||
var qDetailsLink = row.QuerySelector("a[href^=\"details.php?id=\"]");
|
||||
var title = qDetailsLink.TextContent;
|
||||
if (!query.MatchQueryStringAND(title))
|
||||
continue;
|
||||
|
||||
var qCatLink = row.QuerySelector("a[href^=\"browse.php?cat=\"]");
|
||||
var qSeeders = row.QuerySelector("td > table.testtable2 > tbody > tr > td:nth-of-type(2) > strong:nth-of-type(1)");
|
||||
var qLeechers = row.QuerySelector("td > table.testtable2 > tbody > tr > td:nth-of-type(2) > strong:nth-of-type(2)");
|
||||
var qDateStr = row.QuerySelector("td > table.testtable2 > tbody > tr > td:nth-of-type(5)");
|
||||
var qSize = row.QuerySelector("td > table.testtable2 > tbody > tr > td:nth-of-type(1) > strong:nth-of-type(1)");
|
||||
var qDownloadLink = row.QuerySelector("a[href*=\"download\"]");
|
||||
|
||||
var catStr = qCatLink.GetAttribute("href").Split('=')[1];
|
||||
|
||||
var dlLink = qDownloadLink.GetAttribute("href");
|
||||
if (dlLink.Contains("javascript")) // depending on the user agent the DL link is a javascript call
|
||||
{
|
||||
var dlLinkParts = dlLink.Split(new[] { '\'', ',' });
|
||||
dlLink = SiteLink + "download/" + dlLinkParts[3] + "/" + dlLinkParts[5];
|
||||
}
|
||||
var link = new Uri(dlLink);
|
||||
var seeders = ParseUtil.CoerceInt(qSeeders.Text());
|
||||
var dateStr = qDateStr.TextContent.Replace('\xA0', ' ');
|
||||
var dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Unspecified);
|
||||
var pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz);
|
||||
var files = ParseUtil.CoerceInt(row.QuerySelector("td:contains(Datei) > strong ~ strong").TextContent);
|
||||
var details = new Uri(SiteLink + qDetailsLink.GetAttribute("href"));
|
||||
var leechers = ParseUtil.CoerceInt(qLeechers.Text());
|
||||
var size = ReleaseInfo.GetBytes(qSize.TextContent.Replace(".", "").Replace(",", "."));
|
||||
var downloadVolumeFactor = row.QuerySelector("img[title=\"OnlyUpload\"]") != null ? 0 : 1;
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
MinimumRatio = 0.75,
|
||||
MinimumSeedTime = 0,
|
||||
Title = title,
|
||||
Category = MapTrackerCatToNewznab(catStr),
|
||||
Link = link,
|
||||
Details = details,
|
||||
Guid = link,
|
||||
Size = size,
|
||||
Seeders = seeders,
|
||||
Peers = leechers + seeders,
|
||||
PublishDate = pubDateUtc,
|
||||
Files = files,
|
||||
DownloadVolumeFactor = downloadVolumeFactor,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(response.ContentString, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,50 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Jackett.Common.Indexers.Abstract;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class PsyTorrents : GazelleTracker
|
||||
{
|
||||
public PsyTorrents(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||
ICacheService cs)
|
||||
: base(id: "psytorrents",
|
||||
name: "Psytorrents",
|
||||
description: "Psytorrents (PSY) is a Private Torrent Tracker for ELECTRONIC MUSIC",
|
||||
link: "https://psytorrents.info/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
}
|
||||
},
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
cs: cs,
|
||||
supportsFreeleechTokens: true)
|
||||
{
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "B52C043ABDE7AFB2231E162B1DD468758AEEE307");
|
||||
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "AAA3E062739F3733FE659BA4A89E55E4EB48063B");
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.Audio, "Music");
|
||||
AddCategoryMapping(2, TorznabCatType.Movies, "Movies");
|
||||
AddCategoryMapping(3, TorznabCatType.PC0day, "App");
|
||||
}
|
||||
}
|
||||
}
|
66
src/Jackett.Common/Indexers/RetroFlix.cs
Normal file
66
src/Jackett.Common/Indexers/RetroFlix.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Text;
|
||||
using Jackett.Common.Indexers.Abstract;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using NLog;
|
||||
using WebClient = Jackett.Common.Utils.Clients.WebClient;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class RetroFlix : SpeedAppTracker
|
||||
{
|
||||
public override string[] LegacySiteLinks { get; protected set; } = {
|
||||
"https://retroflix.net/"
|
||||
};
|
||||
|
||||
public RetroFlix(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||
ICacheService cs)
|
||||
: base(
|
||||
id: "retroflix",
|
||||
name: "RetroFlix",
|
||||
description: "Private Torrent Tracker for Classic Movies / TV / General Releases",
|
||||
link: "https://retroflix.club/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
},
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
cs: cs)
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
// requestDelay for API Limit (1 request per 2 seconds)
|
||||
webclient.requestDelay = 2.1;
|
||||
|
||||
AddCategoryMapping(401, TorznabCatType.Movies, "Movies");
|
||||
AddCategoryMapping(402, TorznabCatType.TV, "TV Series");
|
||||
AddCategoryMapping(406, TorznabCatType.AudioVideo, "Music Videos");
|
||||
AddCategoryMapping(407, TorznabCatType.TVSport, "Sports");
|
||||
AddCategoryMapping(409, TorznabCatType.Books, "Books");
|
||||
AddCategoryMapping(408, TorznabCatType.Audio, "HQ Audio");
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,38 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Common.Indexers.Abstract;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using WebClient = Jackett.Common.Utils.Clients.WebClient;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class SpeedApp : BaseWebIndexer
|
||||
public class SpeedApp : SpeedAppTracker
|
||||
{
|
||||
private readonly Dictionary<string, string> _apiHeaders = new Dictionary<string, string>
|
||||
{
|
||||
{"Accept", "application/json"},
|
||||
{"Content-Type", "application/json"}
|
||||
};
|
||||
// API DOC: https://speedapp.io/api/doc
|
||||
private string LoginUrl => SiteLink + "api/login";
|
||||
private string SearchUrl => SiteLink + "api/torrent";
|
||||
private string _token;
|
||||
|
||||
private new ConfigurationDataBasicLoginWithEmail configData => (ConfigurationDataBasicLoginWithEmail)base.configData;
|
||||
|
||||
public override string[] LegacySiteLinks { get; protected set; } = {
|
||||
"https://www.icetorrent.org/",
|
||||
"https://icetorrent.org/",
|
||||
@@ -74,8 +53,7 @@ namespace Jackett.Common.Indexers
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
cacheService: cs,
|
||||
configData: new ConfigurationDataBasicLoginWithEmail())
|
||||
cs: cs)
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "ro-ro";
|
||||
@@ -128,136 +106,5 @@ namespace Jackett.Common.Indexers
|
||||
AddCategoryMapping(50, TorznabCatType.XXX, "XXX Packs");
|
||||
AddCategoryMapping(51, TorznabCatType.XXX, "XXX SD");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
await RenewalTokenAsync();
|
||||
|
||||
var releases = await PerformQuery(new TorznabQuery());
|
||||
await ConfigureIfOK(string.Empty, releases.Any(),
|
||||
() => throw new Exception("Could not find releases."));
|
||||
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
|
||||
private async Task RenewalTokenAsync()
|
||||
{
|
||||
var body = new Dictionary<string, string>
|
||||
{
|
||||
{ "username", configData.Email.Value.Trim() },
|
||||
{ "password", configData.Password.Value.Trim() }
|
||||
};
|
||||
var jsonData = JsonConvert.SerializeObject(body);
|
||||
var result = await RequestWithCookiesAsync(
|
||||
LoginUrl, method: RequestType.POST, headers: _apiHeaders, rawbody: jsonData);
|
||||
var json = JObject.Parse(result.ContentString);
|
||||
_token = json.Value<string>("token");
|
||||
if (_token == null)
|
||||
throw new Exception(json.Value<string>("message"));
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
|
||||
//var categoryMapping = MapTorznabCapsToTrackers(query).Distinct().ToList();
|
||||
var qc = new List<KeyValuePair<string, string>> // NameValueCollection don't support cat[]=19&cat[]=6
|
||||
{
|
||||
{"itemsPerPage", "100"},
|
||||
{"sort", "torrent.createdAt"},
|
||||
{"direction", "desc"}
|
||||
};
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
qc.Add("categories[]", cat);
|
||||
|
||||
if (query.IsImdbQuery)
|
||||
qc.Add("imdbId", query.ImdbID);
|
||||
else
|
||||
qc.Add("search", query.GetQueryString());
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_token)) // fist time login
|
||||
await RenewalTokenAsync();
|
||||
|
||||
var searchUrl = SearchUrl + "?" + qc.GetQueryString();
|
||||
var response = await RequestWithCookiesAsync(searchUrl, headers: GetSearchHeaders());
|
||||
if (response.Status == HttpStatusCode.Unauthorized)
|
||||
{
|
||||
await RenewalTokenAsync(); // re-login
|
||||
response = await RequestWithCookiesAsync(searchUrl, headers: GetSearchHeaders());
|
||||
}
|
||||
else if (response.Status != HttpStatusCode.OK)
|
||||
throw new Exception($"Unknown error in search: {response.ContentString}");
|
||||
|
||||
try
|
||||
{
|
||||
var rows = JArray.Parse(response.ContentString);
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var id = row.Value<string>("id");
|
||||
var details = new Uri($"{SiteLink}browse/{id}");
|
||||
var link = new Uri($"{SiteLink}api/torrent/{id}/download");
|
||||
var publishDate = DateTime.Parse(row.Value<string>("created_at"), CultureInfo.InvariantCulture);
|
||||
var cat = row.Value<JToken>("category").Value<string>("id");
|
||||
|
||||
// "description" field in API has too much HTML code
|
||||
var description = row.Value<string>("short_description");
|
||||
|
||||
var posterStr = row.Value<string>("poster");
|
||||
var poster = Uri.TryCreate(posterStr, UriKind.Absolute, out var posterUri) ? posterUri : null;
|
||||
|
||||
var dlVolumeFactor = row.Value<bool>("is_half_download") ? 0.5: 1.0;
|
||||
dlVolumeFactor = row.Value<bool>("is_freeleech") ? 0.0 : dlVolumeFactor;
|
||||
var ulVolumeFactor = row.Value<bool>("is_double_upload") ? 2.0: 1.0;
|
||||
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
Title = row.Value<string>("name"),
|
||||
Link = link,
|
||||
Details = details,
|
||||
Guid = details,
|
||||
Category = MapTrackerCatToNewznab(cat),
|
||||
PublishDate = publishDate,
|
||||
Description = description,
|
||||
Poster = poster,
|
||||
Size = row.Value<long>("size"),
|
||||
Grabs = row.Value<long>("times_completed"),
|
||||
Seeders = row.Value<int>("seeders"),
|
||||
Peers = row.Value<int>("leechers") + row.Value<int>("seeders"),
|
||||
DownloadVolumeFactor = dlVolumeFactor,
|
||||
UploadVolumeFactor = ulVolumeFactor,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800 // 48 hours
|
||||
};
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(response.ContentString, ex);
|
||||
}
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
{
|
||||
var response = await RequestWithCookiesAsync(link.ToString(), headers: GetSearchHeaders());
|
||||
if (response.Status == HttpStatusCode.Unauthorized)
|
||||
{
|
||||
await RenewalTokenAsync();
|
||||
response = await RequestWithCookiesAsync(link.ToString(), headers: GetSearchHeaders());
|
||||
}
|
||||
else if (response.Status != HttpStatusCode.OK)
|
||||
throw new Exception($"Unknown error in download: {response.ContentBytes}");
|
||||
return response.ContentBytes;
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GetSearchHeaders() => new Dictionary<string, string>
|
||||
{
|
||||
{"Authorization", $"Bearer {_token}"}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -27,7 +27,8 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
public override string[] AlternativeSiteLinks { get; protected set; } = {
|
||||
"https://speed.cd/",
|
||||
"https://speed.click/"
|
||||
"https://speed.click/",
|
||||
"https://speeders.me/"
|
||||
};
|
||||
|
||||
private new ConfigurationDataBasicLogin configData => (ConfigurationDataBasicLogin)base.configData;
|
||||
|
182
src/Jackett.Common/Indexers/SubsPlease.cs
Normal file
182
src/Jackett.Common/Indexers/SubsPlease.cs
Normal file
@@ -0,0 +1,182 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class SubsPlease : BaseWebIndexer
|
||||
{
|
||||
private string ApiEndpoint => SiteLink + "/api/?";
|
||||
|
||||
public SubsPlease(IIndexerConfigurationService configService, Utils.Clients.WebClient wc, Logger l, IProtectionService ps, ICacheService cs)
|
||||
: base(id: "subsplease",
|
||||
name: "SubsPlease",
|
||||
description: "SubsPlease - A better HorribleSubs/Erai replacement",
|
||||
link: "https://subsplease.org/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
|
||||
}
|
||||
},
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
cacheService: cs,
|
||||
configData: new ConfigurationData())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "public";
|
||||
|
||||
// Configure the category mappings
|
||||
AddCategoryMapping(1, TorznabCatType.TVAnime, "Anime");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
var releases = await PerformQuery(new TorznabQuery());
|
||||
|
||||
await ConfigureIfOK(string.Empty, releases.Any(), () =>
|
||||
throw new Exception("Could not find releases from this URL"));
|
||||
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
|
||||
// If the search string is empty use the latest releases
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
=> query.IsTest || string.IsNullOrWhiteSpace(query.SearchTerm)
|
||||
? await FetchNewReleases()
|
||||
: await PerformSearch(query);
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> PerformSearch(TorznabQuery query)
|
||||
{
|
||||
// If the search terms contain [SubsPlease] or SubsPlease, remove them from the query sent to the API
|
||||
string searchTerm = Regex.Replace(query.SearchTerm, "\\[?SubsPlease\\]?\\s*", string.Empty, RegexOptions.IgnoreCase).Trim();
|
||||
|
||||
// If the search terms contain a resolution, remove it from the query sent to the API
|
||||
Match resMatch = Regex.Match(searchTerm, "\\d{3,4}[p|P]");
|
||||
if (resMatch.Success)
|
||||
searchTerm = searchTerm.Replace(resMatch.Value, string.Empty);
|
||||
|
||||
var queryParameters = new NameValueCollection
|
||||
{
|
||||
{ "f", "search" },
|
||||
{ "tz", "America/New_York" },
|
||||
{ "s", searchTerm }
|
||||
};
|
||||
var response = await RequestWithCookiesAndRetryAsync(ApiEndpoint + queryParameters.GetQueryString());
|
||||
if (response.Status != HttpStatusCode.OK)
|
||||
throw new WebException($"SubsPlease search returned unexpected result. Expected 200 OK but got {response.Status}.", WebExceptionStatus.ProtocolError);
|
||||
|
||||
var results = ParseApiResults(response.ContentString);
|
||||
var filteredResults = results.Where(release => query.MatchQueryStringAND(release.Title));
|
||||
|
||||
// If we detected a resolution in the search terms earlier, filter by it
|
||||
if (resMatch.Success)
|
||||
filteredResults = filteredResults.Where(release => release.Title.IndexOf(resMatch.Value, StringComparison.OrdinalIgnoreCase) >= 0);
|
||||
|
||||
return filteredResults;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> FetchNewReleases()
|
||||
{
|
||||
var queryParameters = new NameValueCollection
|
||||
{
|
||||
{ "f", "latest" },
|
||||
{ "tz", "America/New_York" }
|
||||
};
|
||||
var response = await RequestWithCookiesAndRetryAsync(ApiEndpoint + queryParameters.GetQueryString());
|
||||
if (response.Status != HttpStatusCode.OK)
|
||||
throw new WebException($"SubsPlease search returned unexpected result. Expected 200 OK but got {response.Status}.", WebExceptionStatus.ProtocolError);
|
||||
|
||||
return ParseApiResults(response.ContentString);
|
||||
}
|
||||
|
||||
private List<ReleaseInfo> ParseApiResults(string json)
|
||||
{
|
||||
var releaseInfo = new List<ReleaseInfo>();
|
||||
|
||||
// When there are no results, the API returns an empty array or empty response instead of an object
|
||||
if (string.IsNullOrWhiteSpace(json) || json == "[]")
|
||||
return releaseInfo;
|
||||
|
||||
var releases = JsonConvert.DeserializeObject<Dictionary<string, Release>>(json);
|
||||
foreach (var keyValue in releases)
|
||||
{
|
||||
Release r = keyValue.Value;
|
||||
var baseRelease = new ReleaseInfo
|
||||
{
|
||||
Details = new Uri(SiteLink + $"shows/{r.Page}/"),
|
||||
PublishDate = r.Release_Date.DateTime,
|
||||
Files = 1,
|
||||
Category = new List<int> { TorznabCatType.TVAnime.ID },
|
||||
Seeders = 1,
|
||||
Peers = 2,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800, // 48 hours
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
foreach (var d in r.Downloads)
|
||||
{
|
||||
var release = (ReleaseInfo)baseRelease.Clone();
|
||||
// Ex: [SubsPlease] Shingeki no Kyojin (The Final Season) - 64 (1080p)
|
||||
release.Title += $"[SubsPlease] {r.Show} - {r.Episode} ({d.Res}p)";
|
||||
release.MagnetUri = new Uri(d.Magnet);
|
||||
release.Link = null;
|
||||
release.Guid = new Uri(d.Magnet);
|
||||
|
||||
// The API doesn't tell us file size, so give an estimate based on resolution
|
||||
if(string.Equals(d.Res, "1080"))
|
||||
release.Size = 1395864371; // 1.3GB
|
||||
else if (string.Equals(d.Res, "720"))
|
||||
release.Size = 734003200; // 700MB
|
||||
else if (string.Equals(d.Res, "480"))
|
||||
release.Size = 367001600; // 350MB
|
||||
else
|
||||
release.Size = 1073741824; // 1GB
|
||||
|
||||
releaseInfo.Add(release);
|
||||
}
|
||||
}
|
||||
|
||||
return releaseInfo;
|
||||
}
|
||||
|
||||
public class Release
|
||||
{
|
||||
public string Time { get; set; }
|
||||
public DateTimeOffset Release_Date { get; set; }
|
||||
public string Show { get; set; }
|
||||
public string Episode { get; set; }
|
||||
public DownloadInfo[] Downloads { get; set; }
|
||||
public string Xdcc { get; set; }
|
||||
public string ImageUrl { get; set; }
|
||||
public string Page { get; set; }
|
||||
}
|
||||
|
||||
public class DownloadInfo
|
||||
{
|
||||
public string Res { get; set; }
|
||||
public string Magnet { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
@@ -22,7 +22,6 @@ namespace Jackett.Common.Indexers
|
||||
private string SearchUrl => SiteLink + "t.json";
|
||||
|
||||
public override string[] AlternativeSiteLinks { get; protected set; } = {
|
||||
"https://tday.love/",
|
||||
"https://torrentday.cool/",
|
||||
"https://secure.torrentday.com/",
|
||||
"https://classic.torrentday.com/",
|
||||
@@ -41,7 +40,8 @@ namespace Jackett.Common.Indexers
|
||||
"https://td-update.com/", // redirect to https://www.torrentday.com/
|
||||
"https://www.torrentday.me/",
|
||||
"https://www.torrentday.ru/",
|
||||
"https://www.td.af/"
|
||||
"https://www.td.af/",
|
||||
"https://tday.love/"
|
||||
};
|
||||
|
||||
private new ConfigurationDataCookie configData => (ConfigurationDataCookie)base.configData;
|
||||
@@ -51,7 +51,7 @@ namespace Jackett.Common.Indexers
|
||||
: base(id: "torrentday",
|
||||
name: "TorrentDay",
|
||||
description: "TorrentDay (TD) is a Private site for TV / MOVIES / GENERAL",
|
||||
link: "https://tday.love/",
|
||||
link: "https://torrentday.cool/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
|
@@ -22,7 +22,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
public override string[] AlternativeSiteLinks { get; protected set; } = {
|
||||
"https://yts.mx/",
|
||||
"https://yts.unblockit.dev/",
|
||||
"https://yts.unblockit.ltd/",
|
||||
"https://yts.unblockninja.com/"
|
||||
};
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace Jackett.Common.Indexers
|
||||
"https://yts.ag/",
|
||||
"https://yts.am/",
|
||||
"https://yts.lt/",
|
||||
"https://yts.unblockit.dev/",
|
||||
"https://yts.root.yt/"
|
||||
};
|
||||
|
||||
|
@@ -9,10 +9,6 @@ namespace Jackett.Common.Models
|
||||
public Uri Link { get; set; }
|
||||
public string Language { get; set; }
|
||||
public string Category { get; set; }
|
||||
public Uri ImageUrl { get; set; }
|
||||
public string ImageTitle { get; set; }
|
||||
public Uri ImageLink { get; set; }
|
||||
public string ImageDescription { get; set; }
|
||||
|
||||
public ChannelInfo()
|
||||
{
|
||||
|
@@ -73,12 +73,6 @@ namespace Jackett.Common.Models
|
||||
new XElement("link", ChannelInfo.Link.AbsoluteUri),
|
||||
new XElement("language", ChannelInfo.Language),
|
||||
new XElement("category", ChannelInfo.Category),
|
||||
new XElement("image",
|
||||
new XElement("url", ChannelInfo.ImageUrl.AbsoluteUri),
|
||||
new XElement("title", ChannelInfo.ImageTitle),
|
||||
new XElement("link", ChannelInfo.ImageLink.AbsoluteUri),
|
||||
new XElement("description", ChannelInfo.ImageDescription)
|
||||
),
|
||||
from r in Releases
|
||||
select new XElement("item",
|
||||
new XElement("title", RemoveInvalidXMLChars(r.Title)),
|
||||
|
@@ -403,11 +403,7 @@ namespace Jackett.Server.Controllers
|
||||
{
|
||||
Title = CurrentIndexer.DisplayName,
|
||||
Description = CurrentIndexer.DisplayDescription,
|
||||
Link = new Uri(CurrentIndexer.SiteLink),
|
||||
ImageUrl = new Uri(serverUrl + "logos/" + CurrentIndexer.Id + ".png"),
|
||||
ImageTitle = CurrentIndexer.DisplayName,
|
||||
ImageLink = new Uri(CurrentIndexer.SiteLink),
|
||||
ImageDescription = CurrentIndexer.DisplayName
|
||||
Link = new Uri(CurrentIndexer.SiteLink)
|
||||
});
|
||||
|
||||
var proxiedReleases = result.Releases.Select(r => AutoMapper.Mapper.Map<ReleaseInfo>(r)).Select(r =>
|
||||
|
@@ -48,9 +48,7 @@ namespace Jackett.Test.Common.Models
|
||||
var resultPage = new ResultPage(
|
||||
new ChannelInfo // characters in channel info are safe because are provided by us
|
||||
{
|
||||
Link = link,
|
||||
ImageUrl = link,
|
||||
ImageLink = link
|
||||
Link = link
|
||||
})
|
||||
{
|
||||
Releases = new List<ReleaseInfo>
|
||||
@@ -75,7 +73,7 @@ namespace Jackett.Test.Common.Models
|
||||
var xml = resultPage.ToXml(link);
|
||||
|
||||
Assert.AreEqual(5, Regex.Matches(xml, validText).Count);
|
||||
Assert.AreEqual(10, Regex.Matches(xml, validLink).Count);
|
||||
Assert.AreEqual(8, Regex.Matches(xml, validLink).Count);
|
||||
|
||||
// this should be in another test but it's here to avoid creating the whole object again
|
||||
Assert.True(xml.Contains("Tue, 22 Sep 2020 00:00:00 "));
|
||||
|
@@ -255,6 +255,7 @@ namespace Jackett.Updater
|
||||
"CurlSharp.dll",
|
||||
"CurlSharp.pdb",
|
||||
"Definitions/32pages.yml",
|
||||
"Definitions/3evils.yml",
|
||||
"Definitions/420files.yml",
|
||||
"Definitions/academictorrents.yml",
|
||||
"Definitions/alein.yml",
|
||||
@@ -271,6 +272,7 @@ namespace Jackett.Updater
|
||||
"Definitions/b2s-share.yml",
|
||||
"Definitions/badasstorrents.yml", // to be migrated to c#
|
||||
"Definitions/bithq.yml",
|
||||
"Definitions/bigtower.yml",
|
||||
"Definitions/bitme.yml",
|
||||
"Definitions/bittorrentam.yml",
|
||||
"Definitions/blubits.yml",
|
||||
@@ -310,6 +312,7 @@ namespace Jackett.Updater
|
||||
"Definitions/filmsclub.yml",
|
||||
"Definitions/freakstrackingsystem.yml",
|
||||
"Definitions/freedomhd.yml",
|
||||
"Definitions/fullmixmusic.yml",
|
||||
"Definitions/gdf76.yml",
|
||||
"Definitions/gfxnews.yml",
|
||||
"Definitions/gods.yml",
|
||||
@@ -322,6 +325,7 @@ namespace Jackett.Updater
|
||||
"Definitions/hdclub.yml",
|
||||
"Definitions/hddisk.yml",
|
||||
"Definitions/hdplus.yml",
|
||||
"Definitions/hdstreet.yml",
|
||||
"Definitions/hon3yhd-net.yml",
|
||||
"Definitions/horriblesubs.yml",
|
||||
"Definitions/hyperay.yml",
|
||||
@@ -358,6 +362,7 @@ namespace Jackett.Updater
|
||||
"Definitions/nostalgic.yml", // renamed to vhstapes
|
||||
"Definitions/nyaa.yml",
|
||||
"Definitions/nyoo.yml",
|
||||
"Definitions/onlyscene.yml",
|
||||
"Definitions/passionetorrent.yml",
|
||||
"Definitions/polishtracker.yml",
|
||||
"Definitions/pt99.yml",
|
||||
@@ -366,6 +371,7 @@ namespace Jackett.Updater
|
||||
"Definitions/rapidetracker.yml",
|
||||
"Definitions/rarbg.yml", // migrated to C#
|
||||
"Definitions/redtopia.yml",
|
||||
"Definitions/retroflix.yml", // migrated to C#
|
||||
"Definitions/rgu.yml",
|
||||
"Definitions/rns.yml", // site merged with audiobooktorrents
|
||||
"Definitions/rockethd.yml",
|
||||
|
Reference in New Issue
Block a user