mirror of
https://github.com/Jackett/Jackett.git
synced 2025-12-24 23:04:33 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72c396f32c | ||
|
|
8f0f0c0b55 | ||
|
|
542a905f0e | ||
|
|
64a05162c4 | ||
|
|
9e512fddcb | ||
|
|
f832337d85 | ||
|
|
0ac99cbe08 | ||
|
|
6aca3ff059 | ||
|
|
494331b5fd | ||
|
|
e347d38fc0 | ||
|
|
3b5ae2c279 | ||
|
|
77abcf2be7 | ||
|
|
0b376faf2d |
@@ -422,6 +422,7 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht
|
||||
* NorBits
|
||||
* Nordic+
|
||||
* Oasis
|
||||
* Obscure
|
||||
* oMg[WtF]trackr
|
||||
* OpenCD
|
||||
* Oppaitime [![(invite needed)][inviteneeded]](#)
|
||||
|
||||
@@ -158,7 +158,7 @@ settings:
|
||||
- name: info_download
|
||||
type: info
|
||||
label: About the Download links
|
||||
default: As the .torrent download links on this site are know to fail from time to time, you can optionally set as a fallback an automatic alternate link. We suggest using the magnet link as a fallback.
|
||||
default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link. We suggest using the magnet link as a fallback.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
|
||||
@@ -96,7 +96,7 @@ search:
|
||||
sortDirection: "{{ .Config.type }}"
|
||||
perPage: 100
|
||||
page: 1
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
@@ -96,7 +96,7 @@ search:
|
||||
sortDirection: "{{ .Config.type }}"
|
||||
perPage: 100
|
||||
page: 1
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
@@ -92,6 +92,17 @@ settings:
|
||||
options:
|
||||
"/en/torrents/download/?key=": ".torrent"
|
||||
"magnet:?xt=": "magnet"
|
||||
- name: downloadlink2
|
||||
type: select
|
||||
label: Download link (fallback)
|
||||
default: "/en/torrents/download/?key="
|
||||
options:
|
||||
"/en/torrents/download/?key=": ".torrent"
|
||||
"magnet:?xt=": "magnet"
|
||||
- name: info_download
|
||||
type: info
|
||||
label: About the Download links
|
||||
default: You can optionally set as a fallback an automatic alternate link, so if the .torrent download link fails your download will still be successful.
|
||||
|
||||
login:
|
||||
path: en/users/signin/
|
||||
@@ -114,6 +125,8 @@ download:
|
||||
selectors:
|
||||
- selector: a[href^="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
- selector: a[href^="{{ .Config.downloadlink2 }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -91,11 +91,11 @@ settings: []
|
||||
download:
|
||||
selectors:
|
||||
- selector: td:contains("Info Hash:") ~ td
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -34,6 +34,17 @@ settings:
|
||||
options:
|
||||
"/download/": ".torrent"
|
||||
"magnet:?xt=": "magnet"
|
||||
- name: downloadlink2
|
||||
type: select
|
||||
label: Download link (fallback)
|
||||
default: "/download/"
|
||||
options:
|
||||
"/download/": ".torrent"
|
||||
"magnet:?xt=": "magnet"
|
||||
- name: info_download
|
||||
type: info
|
||||
label: About the Download links
|
||||
default: You can optionally set as a fallback an automatic alternate link, so if the .torrent download link fails your download will still be successful.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
@@ -55,6 +66,8 @@ download:
|
||||
selectors:
|
||||
- selector: a[href*="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
- selector: a[href*="{{ .Config.downloadlink2 }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -88,7 +88,7 @@ search:
|
||||
sortDirection: "{{ .Config.type }}"
|
||||
perPage: 100
|
||||
page: 1
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
@@ -1,274 +0,0 @@
|
||||
---
|
||||
id: desitorrents
|
||||
name: DesiTorrents
|
||||
description: "Desitorrents is a Private Torrent Tracker for BOLLYWOOD / TOLLYWOOD / GENERAL"
|
||||
language: en-US
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://desitorrents.tv/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# movies
|
||||
- {id: 47, cat: Movies, desc: "Movies/Bollywood"}
|
||||
- {id: 48, cat: Movies, desc: "Movies/Bengali"}
|
||||
- {id: 49, cat: Movies, desc: "Movies/Tamil"}
|
||||
- {id: 51, cat: Movies, desc: "Movies/Punjabi"}
|
||||
- {id: 52, cat: Movies, desc: "Movies/Marathi"}
|
||||
- {id: 53, cat: Movies, desc: "Movies/Malayalam"}
|
||||
- {id: 54, cat: Movies, desc: "Movies/Kannada"}
|
||||
- {id: 55, cat: Movies, desc: "Movies/Gujarati"}
|
||||
- {id: 56, cat: Movies, desc: "Movies/Foreign"}
|
||||
- {id: 57, cat: Movies, desc: "Movies/Lollywood"}
|
||||
- {id: 58, cat: Movies, desc: "Movies/Hollywood"}
|
||||
- {id: 103, cat: Movies, desc: "Movies/Telugu"}
|
||||
- {id: 104, cat: Movies, desc: "Movies/South Dubbed"}
|
||||
- {id: 110, cat: Movies, desc: "Movies/Documentary"}
|
||||
- {id: 117, cat: Movies, desc: "Movies/Bhojpuri"}
|
||||
- {id: 124, cat: Movies, desc: "Movies/Movie Packs"}
|
||||
- {id: 128, cat: Movies, desc: "Movies/Dubbed Audio"}
|
||||
- {id: 129, cat: Movies, desc: "Movies/Animated"}
|
||||
- {id: 140, cat: Movies, desc: "Movies/Short Films"}
|
||||
# tv shows
|
||||
- {id: 59, cat: TV, desc: "TV/Colors"}
|
||||
- {id: 60, cat: TV, desc: "TV/Sony"}
|
||||
- {id: 61, cat: TV, desc: "TV/&TV"}
|
||||
- {id: 62, cat: TV, desc: "TV/StarPlus"}
|
||||
- {id: 63, cat: TV, desc: "TV/ZEE TV"}
|
||||
- {id: 97, cat: TV, desc: "TV/Life OK"}
|
||||
- {id: 98, cat: TV, desc: "TV/Documentary"}
|
||||
- {id: 101, cat: TV/Sport, desc: "TV/Sports"}
|
||||
- {id: 102, cat: TV/Other, desc: "TV/Others"}
|
||||
- {id: 113, cat: TV, desc: "TV/Pak Drama"}
|
||||
- {id: 125, cat: TV, desc: "TV/TV Packs"}
|
||||
- {id: 130, cat: TV, desc: "TV/Star Bharat"}
|
||||
- {id: 132, cat: TV, desc: "TV/Sab TV"}
|
||||
- {id: 139, cat: TV, desc: "TV/Hollywood"}
|
||||
# music
|
||||
- {id: 67, cat: Audio/Video, desc: "Music/Video"}
|
||||
- {id: 68, cat: Audio, desc: "Music/Hindi Soundtrack"}
|
||||
- {id: 70, cat: Audio, desc: "Music/Remix"}
|
||||
- {id: 71, cat: Audio, desc: "Music/Ghazal"}
|
||||
- {id: 72, cat: Audio, desc: "Music/Instrumental"}
|
||||
- {id: 105, cat: Audio, desc: "Music/Telugu"}
|
||||
- {id: 106, cat: Audio, desc: "Music/Tamil"}
|
||||
- {id: 107, cat: Audio, desc: "Music/Punjabi"}
|
||||
- {id: 108, cat: Audio, desc: "Music/Gujarati"}
|
||||
- {id: 109, cat: Audio, desc: "Music/Compilations"}
|
||||
- {id: 118, cat: Audio, desc: "Music/Kannada"}
|
||||
- {id: 126, cat: Audio, desc: "Music/Marathi"}
|
||||
- {id: 127, cat: Audio, desc: "Music/Lollywood"}
|
||||
- {id: 131, cat: Audio, desc: "Music/Classical"}
|
||||
- {id: 134, cat: Audio, desc: "Music/Desi Pop"}
|
||||
- {id: 136, cat: Audio, desc: "Music/Bengali"}
|
||||
- {id: 137, cat: Audio, desc: "Music/Malayalam"}
|
||||
# games
|
||||
- {id: 78, cat: PC/Games, desc: "Games/PC"}
|
||||
- {id: 79, cat: PC/Games, desc: "Games/Mac"}
|
||||
- {id: 80, cat: PC/Games, desc: "Games/IOS"}
|
||||
- {id: 81, cat: PC/Games, desc: "Games/Android"}
|
||||
- {id: 83, cat: PC/Games, desc: "Games/XBOX"}
|
||||
- {id: 86, cat: PC/Games, desc: "Games/Playstation"}
|
||||
# books
|
||||
- {id: 92, cat: Books/Mags, desc: "Books/Magazine"}
|
||||
- {id: 93, cat: Books/EBook, desc: "Books/Novels"}
|
||||
- {id: 95, cat: Books, desc: "Books/Newspapers"}
|
||||
- {id: 133, cat: Audio/Audiobook, desc: "Books/Audiobooks"}
|
||||
# Sport
|
||||
- {id: 114, cat: TV/Sport, desc: "Sport/WWE"}
|
||||
- {id: 115, cat: TV/Sport, desc: "Sport/Cricket"}
|
||||
- {id: 116, cat: TV/Sport, desc: "Sport/Football"}
|
||||
# XXX
|
||||
- {id: 89, cat: XXX, desc: "Adult Videos"}
|
||||
- {id: 90, cat: XXX, desc: "Adult Pics"}
|
||||
# WEB
|
||||
- {id: 135, cat: TV, desc: "Web Series"}
|
||||
# Legact
|
||||
- {id: 30, cat: Other, desc: "Legacy"}
|
||||
|
||||
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: twofa
|
||||
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 Desitorrents Web Site. Otherwise just leave it empty."
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
# while the grabs and date columns are merged due (see #9849), the time sort on the website fails with: "selected sorting wrong: time".
|
||||
# default: time
|
||||
default: relevance
|
||||
options:
|
||||
# time: created
|
||||
seeders: seeders
|
||||
size: size
|
||||
relevance: title
|
||||
|
||||
login:
|
||||
path: login.php?from=index1
|
||||
method: post
|
||||
inputs:
|
||||
action: login
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
twofa: "{{ .Config.twofa }}"
|
||||
error:
|
||||
- selector: form#loginform:has(span.warning)
|
||||
test:
|
||||
path: ajax.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: ajax.php?action=search_torrent_cats
|
||||
method: post
|
||||
inputs:
|
||||
# replace spaces with wildcard (percent symbol) as site's default search is exact string.
|
||||
search_string: "{{ re_replace .Keywords \"[\\s]+\" \"%\" }}"
|
||||
selected_sorting: "{{ .Config.sort }}"
|
||||
selected_group: ""
|
||||
search_username: ""
|
||||
selected_sub[]: "{{ join .Categories \",\" }}"
|
||||
error:
|
||||
- selector: ":contains(\"Something was wrong with your request\")"
|
||||
preprocessingfilters:
|
||||
- name: replace
|
||||
args: ["{\"torrent_html\":\"", ""]
|
||||
- name: replace
|
||||
args: ["\\", ""]
|
||||
- name: re_replace
|
||||
args: ["\",\"paging.*", ""]
|
||||
- name: re_replace
|
||||
args: ["</th<th>", "</th><th>"] # fix for #9849
|
||||
- name: prepend
|
||||
args: "<table>"
|
||||
- name: append
|
||||
args: "</table>"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: th:first-child
|
||||
case:
|
||||
img[src*="Bollywood Movies.png"]: 47
|
||||
img[src*="Bengali Movies.png"]: 48
|
||||
img[src*="Tamil Films.png"]: 49
|
||||
img[src*="Punjabi Movies.png"]: 51
|
||||
img[src*="Marathi Movies.png"]: 52
|
||||
img[src*="Malayalam Movies.png"]: 53
|
||||
img[src*="Kannada Movies.png"]: 54
|
||||
img[src*="Gujarati Movies.png"]: 55
|
||||
img[src*="Foreign Movies.png"]: 56
|
||||
img[src*="Pakistani Movies.png"]: 57
|
||||
img[src*="Hollywood Movies.png"]: 58
|
||||
img[src*="Telugu Movies.png"]: 103
|
||||
img[src*="south-dubbed.png"]: 104
|
||||
img[src*="docmentary.png"]: 110
|
||||
img[src*="Bhojpuri Movies.png"]: 117
|
||||
img[src*="Movie Packs.png"]: 124
|
||||
img[src*="Dubbed Movies.png"]: 128
|
||||
img[src*="Animated Movies.png"]: 129
|
||||
img[src*="Short Films.png"]: 140
|
||||
img[src*="Colors TV.png"]: 59
|
||||
img[src*="Sony TV.png"]: 60
|
||||
img[src*="AndTV.png"]: 61
|
||||
img[src*="Star Plus.png"]: 62
|
||||
img[src*="Zee TV.png"]: 63
|
||||
img[src*="Life OK.png"]: 97
|
||||
img[src*="Documentaries.png"]: 98
|
||||
img[src*="sports.png"]: 101
|
||||
img[src*="Others-png.png"]: 102
|
||||
img[src*="Pak-Drama.png"]: 113
|
||||
img[src*="TV Packs.png"]: 125
|
||||
img[src*="Star Bharat.png"]: 130
|
||||
img[src*="Sab TV.png"]: 132
|
||||
img[src*="Hollywood TV.png"]: 139
|
||||
img[src*="Music Videos.png"]: 67
|
||||
img[src*="Hindi Soundtracks.png"]: 68
|
||||
img[src*="Remix Music.png"]: 70
|
||||
img[src*="Ghazal Music.png"]: 71
|
||||
img[src*="Instrumental Music.png"]: 72
|
||||
img[src*="Telugu Music.png"]: 105
|
||||
img[src*="Tamil Music.png"]: 106
|
||||
img[src*="Punjabi Music.png"]: 107
|
||||
img[src*="Gujarati Music.png"]: 108
|
||||
img[src*="Music Compilations.png"]: 109
|
||||
img[src*="Kannada Music.png"]: 118
|
||||
img[src*="Marathi Gaane.png"]: 126
|
||||
img[src*="Lollywood Music.png"]: 127
|
||||
img[src*="Classical Music.png"]: 131
|
||||
img[src*="Desi Pop Music.png"]: 134
|
||||
img[src*="Bengali Music.png"]: 136
|
||||
img[src*="Malayalam Music.png"]: 137
|
||||
img[src*="PC Games.png"]: 78
|
||||
img[src*="Mac Games.png"]: 79 # unverified
|
||||
img[src*="IOS Games.png"]: 80 # unverified
|
||||
img[src*="Android Games.png"]: 81
|
||||
img[src*="XBOX Games.png"]: 83 # unverified
|
||||
img[src*="Playstation Games.png"]: 86 # unverified
|
||||
img[src*="Magazines.png"]: 92
|
||||
img[src*="Novels.png"]: 93
|
||||
img[src*="Newspapers.png"]: 95
|
||||
img[src*="AudioBooks.png"]: 133
|
||||
img[src*="WWE.png"]: 114
|
||||
img[src*="Cricket.png"]: 115
|
||||
img[src*="Football.png"]: 116
|
||||
img[src*="Adult Videos.png"]: 89 # unverified
|
||||
img[src*="Adult Pics.png"]: 90 # unverified
|
||||
img[src*="Web Series.png"]: 135
|
||||
img[src*="no.png"]: 30
|
||||
title:
|
||||
selector: a[href^="/torrents.php?id="]
|
||||
details:
|
||||
selector: a[href^="/torrents.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="/torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "{{ .Config.sitelink }}"
|
||||
size:
|
||||
selector: th:nth-child(7)
|
||||
files:
|
||||
selector: th:nth-child(8)
|
||||
seeders:
|
||||
selector: th:nth-child(9)
|
||||
leechers:
|
||||
selector: th:nth-child(10)
|
||||
grabs:
|
||||
selector: th:nth-child(11)
|
||||
date:
|
||||
selector: th:nth-child(12)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00" # GMT
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
downloadvolumefactor:
|
||||
text: 0
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
minimumseedtime:
|
||||
# 3 days (as seconds = 3 x 24 x 60 x 60)
|
||||
text: 259200
|
||||
# engine n/a
|
||||
@@ -51,15 +51,15 @@ settings:
|
||||
download:
|
||||
selectors:
|
||||
- selector: script:contains("magnet:?xt=")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "play\\('(.+?)'"
|
||||
- name: re_replace
|
||||
args: ["X-X", ""]
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&dn={{ re_replace .DownloadUri.PathAndQuery \"\\/torrent\\/(.+?)\\/\" \"$1\"}}&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "play\\('(.+?)'"
|
||||
- name: re_replace
|
||||
args: ["X-X", ""]
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&dn={{ re_replace .DownloadUri.PathAndQuery \"\\/torrent\\/(.+?)\\/\" \"$1\"}}&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -61,9 +61,10 @@ download:
|
||||
selectors:
|
||||
- selector: a.btn-magnet
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: url
|
||||
filters:
|
||||
- name: querystring
|
||||
args: url
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents
|
||||
|
||||
@@ -68,6 +68,17 @@ settings:
|
||||
options:
|
||||
"http://itorrents.org/": iTorrents.org
|
||||
"magnet:": magnet
|
||||
- name: downloadlink2
|
||||
type: select
|
||||
label: Download link (fallback)
|
||||
default: "http://itorrents.org/"
|
||||
options:
|
||||
"http://itorrents.org/": iTorrents.org
|
||||
"magnet:": magnet
|
||||
- name: info_download
|
||||
type: info
|
||||
label: About the Download links
|
||||
default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link.
|
||||
- name: sort
|
||||
type: select
|
||||
label: Sort requested from site
|
||||
@@ -86,6 +97,8 @@ download:
|
||||
selectors:
|
||||
- selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
- selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink2 }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -57,9 +57,9 @@ download:
|
||||
selectors:
|
||||
- selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -27,9 +27,9 @@ download:
|
||||
selectors:
|
||||
- selector: a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["\\s+", " "]
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["\\s+", " "]
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -51,11 +51,11 @@ settings:
|
||||
download:
|
||||
selectors:
|
||||
- selector: script:contains("magnet:")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(magnet:[^\"]+)\""
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(magnet:[^\"]+)\""
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -117,16 +117,14 @@ caps:
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /
|
||||
inputs:
|
||||
q: "{{ .Keywords }}"
|
||||
f: "{{ .Config.filter-id }}"
|
||||
c: "{{ .Config.cat-id }}"
|
||||
s: "{{ .Config.sort }}"
|
||||
o: "{{ .Config.type }}"
|
||||
- path: "?q={{ .Keywords }}&f={{ .Config.filter-id }}&c={{ .Config.cat-id }}&s={{ .Config.sort }}&o={{ .Config.type }}"
|
||||
# strip 0 from start of episode number - #11019
|
||||
- path: "?q={{ if .Keywords }}{{ re_replace .Keywords \" 0(\\d{1})\" \" $1\" }}{{ else }}&p=2{{ end }}&f={{ .Config.filter-id }}&c={{ .Config.cat-id }}&s={{ .Config.sort }}&o={{ .Config.type }}"
|
||||
|
||||
rows:
|
||||
selector: tr.default,tr.danger,tr.success
|
||||
filters:
|
||||
- name: andmatch
|
||||
|
||||
fields:
|
||||
category:
|
||||
|
||||
96
src/Jackett.Common/Definitions/obscure.yml
Normal file
96
src/Jackett.Common/Definitions/obscure.yml
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
id: obscure
|
||||
name: Obscure
|
||||
description: "Obscure is a Private Torrent Tracker for Obscure Stuff."
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.obscure.wtf/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: movies, cat: Movies, desc: "Movies"}
|
||||
- {id: tv, cat: TV, desc: "TV Shows"}
|
||||
- {id: music, cat: Audio, desc: "Music"}
|
||||
- {id: books, cat: Books, desc: "Books"}
|
||||
- {id: miscellaneous, cat: Other, desc: "Misc"}
|
||||
- {id: packs, cat: Movies/Other, desc: "Packs"}
|
||||
|
||||
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
|
||||
|
||||
login:
|
||||
path: login/login
|
||||
method: post
|
||||
inputs:
|
||||
login: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
remember: 1
|
||||
error:
|
||||
- selector: div.blockMessage--error
|
||||
test:
|
||||
path: /
|
||||
selector: a[href^="/logout/?t="]
|
||||
|
||||
search:
|
||||
paths:
|
||||
# 20 results per page
|
||||
- path: "tracker/?filename={{ .Keywords }}&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: tr.dataList-row:has(td.download)
|
||||
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="/forums/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "\\/(\\w+)\\/$"
|
||||
title:
|
||||
selector: a[href^="/threads/"]
|
||||
details:
|
||||
selector: a[href^="/threads/"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: td.download a
|
||||
attribute: href
|
||||
poster:
|
||||
selector: td:nth-child(2) img
|
||||
attribute: src
|
||||
date:
|
||||
text: now
|
||||
size:
|
||||
selector: td:nth-last-child(4)
|
||||
grabs:
|
||||
selector: td:nth-last-child(3)
|
||||
seeders:
|
||||
selector: td:nth-last-child(2)
|
||||
leechers:
|
||||
selector: td:nth-last-child(1)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
i.fa-star: 0
|
||||
"*": 1
|
||||
uploadvolumefactor:
|
||||
text: 1
|
||||
minimumratio:
|
||||
text: 1.0
|
||||
# engine n/a
|
||||
@@ -97,7 +97,7 @@ search:
|
||||
sortDirection: "{{ .Config.type }}"
|
||||
perPage: 100
|
||||
page: 1
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
keywordsfilters:
|
||||
- name: diacritics
|
||||
args: replace
|
||||
|
||||
@@ -96,7 +96,7 @@ search:
|
||||
sortDirection: "{{ .Config.type }}"
|
||||
perPage: 100
|
||||
page: 1
|
||||
freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
|
||||
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
|
||||
@@ -71,6 +71,29 @@ settings:
|
||||
search:
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}/all/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{ else }}/fresh.html{{ end }}"
|
||||
categories: ["!", TELEVISION, MOVIES, MUSIC, GAMES, SOFTWARE, ANIME, EBOOKS, OTHER, ADULT, AUDIOBOOK, IMAGES]
|
||||
- path: "{{ if .Keywords }}/television/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/television/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [TELEVISION]
|
||||
- path: "{{ if .Keywords }}/movie/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/movies/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [MOVIES]
|
||||
- path: "{{ if .Keywords }}/music/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/music/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [MUSIC]
|
||||
- path: "{{ if .Keywords }}/game/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/games/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [GAMES]
|
||||
- path: "{{ if .Keywords }}/software/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/software/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [SOFTWARE]
|
||||
- path: "{{ if .Keywords }}/anime/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/anime/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [ANIME]
|
||||
- path: "{{ if .Keywords }}/ebook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/ebooks/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [EBOOKS]
|
||||
- path: "{{ if .Keywords }}/unknown/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/unknown.html{{end}}" # sorting is broken for unknown
|
||||
categories: [OTHER]
|
||||
- path: "{{ if .Keywords }}/adult/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/adult/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [ADULT]
|
||||
- path: "{{ if .Keywords }}/audiobook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/audiobook/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [AUDIOBOOK]
|
||||
- path: "{{ if .Keywords }}/image/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/images/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}"
|
||||
categories: [IMAGES]
|
||||
keywordsfilters:
|
||||
- name: tolower
|
||||
- name: re_replace
|
||||
|
||||
@@ -66,11 +66,24 @@ settings:
|
||||
options:
|
||||
"http://itorrents.org/": "iTorrents.org"
|
||||
"magnet:": "magnet"
|
||||
- name: downloadlink2
|
||||
type: select
|
||||
label: Download link (fallback)
|
||||
default: "http://itorrents.org/"
|
||||
options:
|
||||
"http://itorrents.org/": "iTorrents.org"
|
||||
"magnet:": "magnet"
|
||||
- name: info_download
|
||||
type: info
|
||||
label: About the Download links
|
||||
default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link.
|
||||
|
||||
download:
|
||||
selectors:
|
||||
- selector: a[href^="{{ .Config.downloadlink }}"]
|
||||
attribute: href
|
||||
- selector: a[href^="{{ .Config.downloadlink2 }}"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -48,9 +48,9 @@ download:
|
||||
selectors:
|
||||
- selector: a[href*="magnet:?xt="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -54,12 +54,12 @@ download:
|
||||
selectors:
|
||||
- selector: "#download > div:nth-child(2) > div:nth-child(1) > a"
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["https://mylink.me.uk/?url=", ""]
|
||||
- name: replace
|
||||
args: ["https://mylink.cx/?url=", ""]
|
||||
- name: urldecode
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["https://mylink.me.uk/?url=", ""]
|
||||
- name: replace
|
||||
args: ["https://mylink.cx/?url=", ""]
|
||||
- name: urldecode
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -7,7 +7,7 @@ type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://torrentqq91.com/
|
||||
- https://torrentqq92.com/
|
||||
legacylinks:
|
||||
- https://torrentqq76.com/
|
||||
- https://torrentqq77.com/
|
||||
@@ -24,6 +24,7 @@ legacylinks:
|
||||
- https://torrentqq88.com/
|
||||
- https://torrentqq89.com/
|
||||
- https://torrentqq90.com/
|
||||
- https://torrentqq91.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
||||
@@ -41,9 +41,9 @@ download:
|
||||
selectors:
|
||||
- selector: a[href*="magnet:?xt="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -40,9 +40,9 @@ download:
|
||||
selectors:
|
||||
- selector: a[href*="magnet:?xt="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
filters:
|
||||
- name: append
|
||||
args: "&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969&tr=udp%3A%2F%2Fp4p.arenabg.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.tiny-vps.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.si%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker.pirateparty.gr%3A6969%2Fannounce&tr=udp%3A%2F%2Fipv4.tracker.harry.lu%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.cyberia.is%3A6969%2Fannounce&tr=udp%3A%2F%2F9.rarbg.to%3A2710%2Fannounce&tr=udp%3A%2F%2Fdenis.stalker.upeer.me%3A6969%2Fannounce"
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -107,11 +107,11 @@ download:
|
||||
selectors:
|
||||
- selector: a[href^="d.php?keyalert1="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["d.php?keyalert1=", "/dI.php/"]
|
||||
- name: replace
|
||||
args: ["&keyalert2=", "/"]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["d.php?keyalert1=", "/dI.php/"]
|
||||
- name: replace
|
||||
args: ["&keyalert2=", "/"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
||||
@@ -2,21 +2,20 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using AngleSharp.Dom;
|
||||
using AngleSharp.Html.Dom;
|
||||
using AngleSharp.Html.Parser;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig.Bespoke;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
|
||||
using WebClient = Jackett.Common.Utils.Clients.WebClient;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
@@ -28,23 +27,27 @@ namespace Jackett.Common.Indexers
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class Abnormal : BaseCachingWebIndexer
|
||||
{
|
||||
private string LoginUrl => SiteLink + "login.php";
|
||||
private string SearchUrl => SiteLink + "torrents.php";
|
||||
private string DetailsUrl => SiteLink + "torrents.php?id=";
|
||||
private string ReplaceMulti => ConfigData.ReplaceMulti.Value;
|
||||
private string TorrentDetailsUrl => SiteLink + "Torrent/Details?ReleaseId={id}";
|
||||
private string TorrentDownloadUrl => SiteLink + "Torrent/Download?ReleaseId={id}";
|
||||
private string LoginUrl => SiteLink + "Home/Login";
|
||||
private string SearchUrl => SiteLink + "Torrent";
|
||||
private string WebRequestDelay => ((SingleSelectConfigurationItem)configData.GetDynamic("webRequestDelay")).Value;
|
||||
private int MaxPages => Convert.ToInt32(((SingleSelectConfigurationItem)configData.GetDynamic("maxPages")).Value);
|
||||
private string MultiReplacement => ((StringConfigurationItem)configData.GetDynamic("multiReplacement")).Value;
|
||||
private bool SubReplacement => ((BoolConfigurationItem)configData.GetDynamic("subReplacement")).Value;
|
||||
private bool EnhancedAnimeSearch => ((BoolConfigurationItem)configData.GetDynamic("enhancedAnimeSearch")).Value;
|
||||
|
||||
private ConfigurationDataAbnormal ConfigData
|
||||
{
|
||||
get => (ConfigurationDataAbnormal)configData;
|
||||
set => configData = value;
|
||||
}
|
||||
public override string[] LegacySiteLinks { get; protected set; } = {
|
||||
"https://abnormal.ws"
|
||||
};
|
||||
private ConfigurationDataBasicLogin ConfigData => (ConfigurationDataBasicLogin)configData;
|
||||
|
||||
public Abnormal(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps,
|
||||
ICacheService cs)
|
||||
: base(id: "abnormal",
|
||||
name: "Abnormal",
|
||||
description: "General French Private Tracker",
|
||||
link: "https://abnormal.ws/",
|
||||
link: "https://abn.lol/",
|
||||
caps: new TorznabCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
@@ -54,6 +57,10 @@ namespace Jackett.Common.Indexers
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
},
|
||||
configService: configService,
|
||||
@@ -61,80 +68,132 @@ namespace Jackett.Common.Indexers
|
||||
logger: l,
|
||||
p: ps,
|
||||
cacheService: cs,
|
||||
downloadBase: "https://abnormal.ws/torrents.php?action=download&id=",
|
||||
configData: new ConfigurationDataAbnormal())
|
||||
downloadBase: "https://abn.lol/Torrent/Download?ReleaseId=",
|
||||
configData: new ConfigurationDataBasicLogin()
|
||||
)
|
||||
{
|
||||
Language = "fr-fr";
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "fr-fr";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping("MOVIE|DVDR", TorznabCatType.MoviesDVD, "DVDR");
|
||||
AddCategoryMapping("MOVIE|DVDRIP", TorznabCatType.MoviesSD, "DVDRIP");
|
||||
AddCategoryMapping("MOVIE|BDRIP", TorznabCatType.MoviesSD, "BDRIP");
|
||||
AddCategoryMapping("MOVIE|VOSTFR", TorznabCatType.MoviesOther, "VOSTFR");
|
||||
AddCategoryMapping("MOVIE|HD|720p", TorznabCatType.MoviesHD, "HD 720P");
|
||||
AddCategoryMapping("MOVIE|HD|1080p", TorznabCatType.MoviesHD, "HD 1080P");
|
||||
AddCategoryMapping("MOVIE|REMUXBR", TorznabCatType.MoviesBluRay, "REMUX BLURAY");
|
||||
AddCategoryMapping("MOVIE|FULLBR", TorznabCatType.MoviesBluRay, "FULL BLURAY");
|
||||
AddCategoryMapping("TV|SD|VOSTFR", TorznabCatType.TV, "TV SD VOSTFR");
|
||||
AddCategoryMapping("TV|HD|VOSTFR", TorznabCatType.TVHD, "TV HD VOSTFR");
|
||||
AddCategoryMapping("TV|SD|VF", TorznabCatType.TVSD, "TV SD VF");
|
||||
AddCategoryMapping("TV|HD|VF", TorznabCatType.TVHD, "TV HD VF");
|
||||
AddCategoryMapping("TV|PACK|FR", TorznabCatType.TVOther, "TV PACK FR");
|
||||
AddCategoryMapping("TV|PACK|VOSTFR", TorznabCatType.TVOther, "TV PACK VOSTFR");
|
||||
AddCategoryMapping("TV|EMISSIONS", TorznabCatType.TVOther, "TV EMISSIONS");
|
||||
AddCategoryMapping("ANIME", TorznabCatType.TVAnime, "ANIME");
|
||||
AddCategoryMapping("DOCS", TorznabCatType.TVDocumentary, "TV DOCS");
|
||||
AddCategoryMapping("MUSIC|FLAC", TorznabCatType.AudioLossless, "FLAC");
|
||||
AddCategoryMapping("MUSIC|MP3", TorznabCatType.AudioMP3, "MP3");
|
||||
AddCategoryMapping("MUSIC|CONCERT", TorznabCatType.AudioVideo, "CONCERT");
|
||||
AddCategoryMapping("PC|APP", TorznabCatType.PC, "PC");
|
||||
AddCategoryMapping("PC|GAMES", TorznabCatType.PCGames, "GAMES");
|
||||
AddCategoryMapping("EBOOKS", TorznabCatType.BooksEBook, "EBOOKS");
|
||||
AddCategoryMapping(1, TorznabCatType.TV, "Series");
|
||||
AddCategoryMapping(2, TorznabCatType.Movies, "Movies");
|
||||
AddCategoryMapping(3, TorznabCatType.TVDocumentary, "Documentaries");
|
||||
AddCategoryMapping(4, TorznabCatType.TVAnime, "Anime");
|
||||
AddCategoryMapping(5, TorznabCatType.PCGames, "Games");
|
||||
AddCategoryMapping(6, TorznabCatType.PC, "Applications");
|
||||
AddCategoryMapping(7, TorznabCatType.BooksEBook, "Ebooks");
|
||||
AddCategoryMapping(9, TorznabCatType.TV, "Emissions");
|
||||
|
||||
// Dynamic Configuration
|
||||
ConfigData.AddDynamic("advancedConfigurationWarning", new DisplayInfoConfigurationItem(string.Empty, "<center><b>Advanced Configuration</b></center>,<br /><br /> <center><b><u>WARNING !</u></b> <i>Be sure to read instructions before editing options bellow, you can <b>drastically reduce performance</b> of queries or have <b>non-accurate results</b>.</i></center><br/><br/><ul><li><b>Delay between Requests</b>: (<i>not recommended</i>) you can increase delay to requests made to the tracker, but a minimum of 2.1s is enforced as there is an anti-spam protection.</li><br /><li><b>Max Pages</b>: (<i>not recommended</i>) you can increase max pages to follow when making a request. But be aware that others apps can consider this indexer not working if jackett take too many times to return results. </li><br /><li><b>Enhanced Anime</b>: if you have \"Anime\", this will improve queries made to this tracker related to this type when making searches.</li><br /><li><b>Multi Replacement</b>: you can dynamically replace the word \"MULTI\" with another of your choice like \"MULTI.FRENCH\" for better analysis of 3rd party softwares.</li><br /><li><b>Sub Replacement</b>: you can dynamically replace the word \"VOSTFR\" or \"SUBFRENCH\" with the word \"ENGLISH\" for better analysis of 3rd party softwares.</li></ul>"));
|
||||
|
||||
var ConfigWebRequestDelay = new SingleSelectConfigurationItem("Which delay do you want to apply between each requests made to tracker ?", new Dictionary<string, string>
|
||||
{
|
||||
{"0", "0s (disabled)"},
|
||||
{"0.1", "0.1s"},
|
||||
{"0.3", "0.3s"},
|
||||
{"0.5", "0.5s (default)" },
|
||||
{"0.7", "0.7s" },
|
||||
{"1.0", "1.0s"},
|
||||
{"1.25", "1.25s"},
|
||||
{"1.50", "1.50s"}
|
||||
})
|
||||
{ Value = "0.5" };
|
||||
ConfigData.AddDynamic("webRequestDelay", ConfigWebRequestDelay);
|
||||
|
||||
var ConfigMaxPages = new SingleSelectConfigurationItem("How many pages do you want to follow ?", new Dictionary<string, string>
|
||||
{
|
||||
{"1", "1 (50 results - default / best perf.)"},
|
||||
{"2", "2 (100 results)"},
|
||||
{"3", "3 (150 results)"},
|
||||
{"4", "4 (200 results - hard limit max)" },
|
||||
})
|
||||
{ Value = "1" };
|
||||
ConfigData.AddDynamic("maxPages", ConfigMaxPages);
|
||||
|
||||
var ConfigEnhancedAnimeSearch = new BoolConfigurationItem("Do you want to use enhanced ANIME search ?") { Value = false };
|
||||
ConfigData.AddDynamic("enhancedAnimeSearch", ConfigEnhancedAnimeSearch);
|
||||
|
||||
var ConfigMultiReplacement = new StringConfigurationItem("Do you want to replace \"MULTI\" keyword in release title by another word ?") { Value = "MULTI.FRENCH" };
|
||||
ConfigData.AddDynamic("multiReplacement", ConfigMultiReplacement);
|
||||
|
||||
var ConfigSubReplacement = new BoolConfigurationItem("Do you want to replace \"VOSTFR\" and \"SUBFRENCH\" with \"ENGLISH\" word ?") { Value = false };
|
||||
ConfigData.AddDynamic("subReplacement", ConfigSubReplacement);
|
||||
|
||||
webclient.requestDelay = Convert.ToDouble(WebRequestDelay);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configure our WiHD Provider
|
||||
/// Configure our Provider
|
||||
/// </summary>
|
||||
/// <param name="configJson">Our params in Json</param>
|
||||
/// <returns>Configuration state</returns>
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
// Provider not yet configured
|
||||
IsConfigured = false;
|
||||
|
||||
// Retrieve config values set by Jackett's user
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
// Check & Validate Config
|
||||
ValidateConfig();
|
||||
logger.Debug("\nAbnormal - Validating Settings ...");
|
||||
|
||||
// Check Username Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Username.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Debug("\nAbnormal - Validated Setting -- Username (auth) => " + ConfigData.Username.Value.ToString());
|
||||
}
|
||||
|
||||
// Check Password Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Password.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a password with your username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Debug("\nAbnormal - Validated Setting -- Password (auth) => " + ConfigData.Password.Value.ToString());
|
||||
}
|
||||
|
||||
// Building login form data
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "username", ConfigData.Username.Value },
|
||||
{ "password", ConfigData.Password.Value },
|
||||
{ "keeplogged", "1" },
|
||||
{ "login", "Connexion" }
|
||||
{ "Username", ConfigData.Username.Value },
|
||||
{ "Password", ConfigData.Password.Value },
|
||||
{ "RememberMe", "true" },
|
||||
};
|
||||
|
||||
// Get CSRF Token
|
||||
logger.Debug("\nAbnormal - Getting CSRF token for " + LoginUrl);
|
||||
var response = await RequestWithCookiesAsync(LoginUrl);
|
||||
|
||||
var loginResultParser = new HtmlParser();
|
||||
var loginResultDocument = loginResultParser.ParseDocument(response.ContentString);
|
||||
var csrfToken = loginResultDocument.QuerySelector("input[name=\"__RequestVerificationToken\"]").GetAttribute("value");
|
||||
pairs.Add("__RequestVerificationToken", csrfToken);
|
||||
|
||||
// Perform loggin
|
||||
logger.Info("\nAbnormal - Perform loggin.. with " + LoginUrl);
|
||||
var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
|
||||
logger.Debug("\nAbnormal - Perform loggin.. with " + LoginUrl);
|
||||
response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true);
|
||||
|
||||
// Test if we are logged in
|
||||
await ConfigureIfOK(response.Cookies, response.Cookies.Contains("session="), () =>
|
||||
await ConfigureIfOK(response.Cookies, response.Cookies.Contains(".AspNetCore.Identity.Application="), () =>
|
||||
{
|
||||
// Parse error page
|
||||
var parser = new HtmlParser();
|
||||
var dom = parser.ParseDocument(response.ContentString);
|
||||
var message = dom.QuerySelector(".warning").TextContent.Split('.').Reverse().Skip(1).First();
|
||||
|
||||
// Try left
|
||||
var left = dom.QuerySelector(".info").TextContent.Trim();
|
||||
var message = dom.QuerySelector(".validation-summary-errors").TextContent.Split('.').Reverse().Skip(1).First();
|
||||
|
||||
// Oops, unable to login
|
||||
logger.Info("Abnormal - Login failed: \"" + message + "\" and " + left + " tries left before being banned for 6 hours !", "error");
|
||||
throw new ExceptionWithConfigData("Abnormal - Login failed: " + message, configData);
|
||||
logger.Debug("Abnormal - Login failed: \"" + message, "error");
|
||||
throw new ExceptionWithConfigData("\nAbnormal - Login failed: " + message, configData);
|
||||
});
|
||||
|
||||
logger.Info("-> Login Success");
|
||||
logger.Debug("\nAbnormal - Login Success");
|
||||
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
@@ -146,165 +205,133 @@ namespace Jackett.Common.Indexers
|
||||
/// <returns>Releases</returns>
|
||||
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 FranceTz = 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 qRowList = new List<IElement>();
|
||||
var searchTerm = query.GetQueryString();
|
||||
var searchUrl = SearchUrl;
|
||||
var searchTerm = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString();
|
||||
|
||||
// Build our query
|
||||
var request = BuildQuery(searchTerm, query, searchUrl);
|
||||
|
||||
// Getting results & Store content
|
||||
var parser = new HtmlParser();
|
||||
var dom = parser.ParseDocument(await QueryExecAsync(request));
|
||||
|
||||
try
|
||||
if (EnhancedAnimeSearch && query.HasSpecifiedCategories && (query.Categories.Contains(TorznabCatType.TVAnime.ID) || query.Categories.Contains(100032) || query.Categories.Contains(100101) || query.Categories.Contains(100110)))
|
||||
{
|
||||
// Find torrent rows
|
||||
var firstPageRows = FindTorrentRows(dom);
|
||||
var regex = new Regex(" ([0-9]+)");
|
||||
searchTerm = regex.Replace(searchTerm, " E$1");
|
||||
}
|
||||
|
||||
// Add them to torrents list
|
||||
qRowList.AddRange(firstPageRows);
|
||||
searchTerm = searchTerm.Trim();
|
||||
searchTerm = searchTerm.ToLower();
|
||||
searchTerm = searchTerm.Replace(" ", ".");
|
||||
|
||||
// Check if there are pagination links at bottom
|
||||
var qPagination = dom.QuerySelectorAll(".linkbox > a");
|
||||
int pageLinkCount;
|
||||
int nbResults;
|
||||
if (qPagination.Length > 0)
|
||||
// Multiple page support
|
||||
var nextPage = 1;
|
||||
var followingPages = true;
|
||||
do
|
||||
{
|
||||
|
||||
// Build our query
|
||||
var request = BuildQuery(searchTerm, query, SearchUrl, nextPage);
|
||||
|
||||
// Getting results
|
||||
logger.Info("\nAbnormal - Querying API page " + nextPage);
|
||||
var dom = new HtmlParser().ParseDocument(await QueryExecAsync(request));
|
||||
var results = dom.QuerySelectorAll(".table-rows > tbody > tr:not(.mvc-grid-empty-row)");
|
||||
|
||||
// Torrents Result Count
|
||||
var torrentsCount = results.Length;
|
||||
|
||||
try
|
||||
{
|
||||
// Calculate numbers of pages available for this search query (Based on number results and number of torrents on first page)
|
||||
pageLinkCount = ParseUtil.CoerceInt(Regex.Match(qPagination.Last().GetAttribute("href").ToString(), @"\d+").Value);
|
||||
|
||||
// Calculate average number of results (based on torrents rows lenght on first page)
|
||||
nbResults = firstPageRows.Length * pageLinkCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if we have a minimum of one result
|
||||
if (firstPageRows.Length >= 1)
|
||||
// If contains torrents
|
||||
if (torrentsCount > 0)
|
||||
{
|
||||
// Retrieve total count on our alone page
|
||||
nbResults = firstPageRows.Length;
|
||||
pageLinkCount = 1;
|
||||
logger.Info("\nAbnormal - Found " + torrentsCount + " torrents on current page.");
|
||||
|
||||
// Adding each torrent row to releases
|
||||
releases.AddRange(results.Select(torrent =>
|
||||
{
|
||||
// Selectors
|
||||
var id = torrent.QuerySelector("td.grid-release-column > a").GetAttribute("href"); // ID
|
||||
var name = torrent.QuerySelector("td.grid-release-column > a").TextContent; // Release Name
|
||||
var categoryId = torrent.QuerySelector("td.grid-cat-column > a").GetAttribute("href"); // Category
|
||||
var completed = torrent.QuerySelector("td:nth-of-type(3)").TextContent; // Completed
|
||||
var seeders = torrent.QuerySelector("td.text-green").TextContent; // Seeders
|
||||
var leechers = torrent.QuerySelector("td.text-red").TextContent; // Leechers
|
||||
var size = torrent.QuerySelector("td:nth-of-type(5)").TextContent; // Size
|
||||
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
// Mapping data
|
||||
Category = MapTrackerCatToNewznab(Regex.Match(categoryId, @"\d+").Value),
|
||||
Title = name,
|
||||
Seeders = int.Parse(Regex.Match(seeders, @"\d+").Value),
|
||||
Peers = int.Parse(Regex.Match(seeders, @"\d+").Value) + int.Parse(Regex.Match(leechers, @"\d+").Value),
|
||||
Grabs = int.Parse(Regex.Match(completed, @"\d+").Value) + int.Parse(Regex.Match(leechers, @"\d+").Value),
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800,
|
||||
Size = ReleaseInfo.GetBytes(size.Replace(",", ".").Replace("Go", "gb").Replace("Mo", "mb").Replace("Ko", "kb")),
|
||||
UploadVolumeFactor = 1,
|
||||
DownloadVolumeFactor = 1,
|
||||
PublishDate = DateTime.Now,
|
||||
Guid = new Uri(TorrentDetailsUrl.Replace("{id}", Regex.Match(id, @"\d+").Value)),
|
||||
Details = new Uri(TorrentDetailsUrl.Replace("{id}", Regex.Match(id, @"\d+").Value)),
|
||||
Link = new Uri(TorrentDownloadUrl.Replace("{id}", Regex.Match(id, @"\d+").Value))
|
||||
};
|
||||
|
||||
// Multi Replacement
|
||||
if (!string.IsNullOrEmpty(MultiReplacement))
|
||||
{
|
||||
var regex = new Regex("(?i)([\\.\\- ])MULTI([\\.\\- ])");
|
||||
release.Title = regex.Replace(release.Title, "$1" + MultiReplacement + "$2");
|
||||
}
|
||||
|
||||
// Sub Replacement
|
||||
if (SubReplacement)
|
||||
release.Title = release.Title.Replace("VOSTFR", "ENGLISH").Replace("SUBFRENCH", "ENGLISH");
|
||||
|
||||
// Freeleech
|
||||
if (torrent.QuerySelector("img[alt=\"Freeleech\"]") != null)
|
||||
{
|
||||
release.DownloadVolumeFactor = 0;
|
||||
}
|
||||
|
||||
return release;
|
||||
}));
|
||||
if (torrentsCount == 50)
|
||||
{
|
||||
// Is there more pages to follow ?
|
||||
var morePages = dom.QuerySelectorAll("div.mvc-grid-pager > button").Last().GetAttribute("tabindex");
|
||||
if (morePages == "-1")
|
||||
followingPages = false;
|
||||
}
|
||||
nextPage++;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Info("\nAbnormal - No result found for your query, please try another search term ...\n", "info");
|
||||
// No result found for this query
|
||||
return releases;
|
||||
logger.Info("\nAbnormal - No results found on page " + nextPage + ", stopping follow of next page.");
|
||||
// No results or no more results available
|
||||
followingPages = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
logger.Info("\nAbnormal - Found " + nbResults + " result(s) (+/- " + firstPageRows.Length + ") in " + pageLinkCount + " page(s) for this query !");
|
||||
logger.Info("\nAbnormal - There are " + firstPageRows.Length + " results on the first page !");
|
||||
|
||||
// If we have a term used for search and pagination result superior to one
|
||||
if (!string.IsNullOrWhiteSpace(query.GetQueryString()) && pageLinkCount > 1)
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Starting with page #2
|
||||
for (var i = 2; i <= Math.Min(int.Parse(ConfigData.Pages.Value), pageLinkCount); i++)
|
||||
{
|
||||
logger.Info("\nAbnormal - Processing page #" + i);
|
||||
|
||||
// Build our query
|
||||
var pageRequest = BuildQuery(searchTerm, query, searchUrl, i);
|
||||
|
||||
// Getting results & Store content
|
||||
parser = new HtmlParser();
|
||||
dom = parser.ParseDocument(await QueryExecAsync(pageRequest));
|
||||
|
||||
// Process page results
|
||||
var additionalPageRows = FindTorrentRows(dom);
|
||||
|
||||
// Add them to torrents list
|
||||
qRowList.AddRange(additionalPageRows);
|
||||
}
|
||||
OnParseError("Unable to parse result \n" + ex.StackTrace, ex);
|
||||
}
|
||||
|
||||
// Loop on results
|
||||
foreach (var row in qRowList)
|
||||
// Stop ?
|
||||
if (torrentsCount < int.Parse(dom.QuerySelector(".mvc-grid-pager-rows").GetAttribute("value")))
|
||||
{
|
||||
// ID
|
||||
var id = ParseUtil.CoerceInt(Regex.Match(row.QuerySelector("td:nth-of-type(2) > a").GetAttribute("href"), @"\d+").Value);
|
||||
|
||||
// Release Name
|
||||
var name = row.QuerySelector("td:nth-of-type(2) > a").TextContent;
|
||||
//issue #3847 replace multi keyword
|
||||
if (!string.IsNullOrEmpty(ReplaceMulti))
|
||||
{
|
||||
var regex = new Regex("(?i)([\\.\\- ])MULTI([\\.\\- ])");
|
||||
name = regex.Replace(name, "$1" + ReplaceMulti + "$2");
|
||||
}
|
||||
|
||||
var categoryId = row.QuerySelector("td:nth-of-type(1) > a").GetAttribute("href").Replace("torrents.php?cat[]=", string.Empty); // Category
|
||||
var newznab = MapTrackerCatToNewznab(categoryId); // Newznab Category
|
||||
var seeders = ParseUtil.CoerceInt(Regex.Match(row.QuerySelector("td:nth-of-type(6)").TextContent, @"\d+").Value); // Seeders
|
||||
var leechers = ParseUtil.CoerceInt(Regex.Match(row.QuerySelector("td:nth-of-type(7)").TextContent, @"\d+").Value); // Leechers
|
||||
var completed = ParseUtil.CoerceInt(Regex.Match(row.QuerySelector("td:nth-of-type(6)").TextContent, @"\d+").Value); // Completed
|
||||
var sizeStr = row.QuerySelector("td:nth-of-type(5)").TextContent.Replace("Go", "gb").Replace("Mo", "mb").Replace("Ko", "kb"); // Size
|
||||
var size = ReleaseInfo.GetBytes(sizeStr); // Size in bytes
|
||||
|
||||
// Publish DateToString
|
||||
var datestr = row.QuerySelector("span.time").GetAttribute("title");
|
||||
var dateLocal = DateTime.SpecifyKind(DateTime.ParseExact(datestr, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Unspecified);
|
||||
var date = TimeZoneInfo.ConvertTimeToUtc(dateLocal, FranceTz);
|
||||
|
||||
// Torrent Details URL
|
||||
var details = new Uri(DetailsUrl + id);
|
||||
|
||||
// Torrent Download URL
|
||||
Uri downloadLink = null;
|
||||
var link = row.QuerySelector("td:nth-of-type(4) > a").GetAttribute("href");
|
||||
if (!string.IsNullOrEmpty(link))
|
||||
{
|
||||
// Download link available
|
||||
downloadLink = new Uri(SiteLink + link);
|
||||
}
|
||||
else
|
||||
{
|
||||
// No download link available -- Must be on pending ( can't be downloaded now...)
|
||||
logger.Info("Abnormal - Download Link: Not available, torrent pending ? Skipping ...");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Freeleech
|
||||
var downloadVolumeFactor = 1;
|
||||
if (row.QuerySelector("img[alt=\"Freeleech\"]") != null)
|
||||
{
|
||||
downloadVolumeFactor = 0;
|
||||
}
|
||||
|
||||
// Building release infos
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
Category = MapTrackerCatToNewznab(categoryId),
|
||||
Title = name,
|
||||
Seeders = seeders,
|
||||
Peers = seeders + leechers,
|
||||
PublishDate = date,
|
||||
Size = size,
|
||||
Guid = details,
|
||||
Details = details,
|
||||
Link = downloadLink,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800, // 48 hours
|
||||
UploadVolumeFactor = 1,
|
||||
DownloadVolumeFactor = downloadVolumeFactor
|
||||
};
|
||||
releases.Add(release);
|
||||
logger.Info("Abnormal - Found Release: " + release.Title + "(" + id + ")");
|
||||
logger.Info("\nAbnormal - Stopping follow of next page " + nextPage + " due max available results reached.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError("Error, unable to parse result \n" + ex.StackTrace, ex);
|
||||
}
|
||||
else if (nextPage > MaxPages)
|
||||
{
|
||||
logger.Info("\nAbnormal - Stopping follow of next page " + nextPage + " due to page limit reached.");
|
||||
break;
|
||||
}
|
||||
else if (query.IsTest)
|
||||
{
|
||||
logger.Info("\nAbnormal - Stopping follow of next page " + nextPage + " due to index test query.");
|
||||
break;
|
||||
}
|
||||
|
||||
} while (followingPages);
|
||||
|
||||
// Return found releases
|
||||
return releases;
|
||||
@@ -324,10 +351,9 @@ namespace Jackett.Common.Indexers
|
||||
var categoriesList = MapTorznabCapsToTrackers(query);
|
||||
string categories = null;
|
||||
|
||||
// Check if we are processing a new page
|
||||
if (page > 0)
|
||||
// Pages handling
|
||||
if (page > 1 && !query.IsTest)
|
||||
{
|
||||
// Adding page number to query
|
||||
parameters.Add("page", page.ToString());
|
||||
}
|
||||
|
||||
@@ -338,12 +364,12 @@ namespace Jackett.Common.Indexers
|
||||
if (categoriesList.Last() == category)
|
||||
{
|
||||
// Adding previous categories to URL with latest category
|
||||
parameters.Add(Uri.EscapeDataString("cat[]"), WebUtility.UrlEncode(category) + categories);
|
||||
parameters.Add(Uri.EscapeDataString("SelectedCats="), WebUtility.UrlEncode(category) + categories);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Build categories parameter
|
||||
categories += "&" + Uri.EscapeDataString("cat[]") + "=" + WebUtility.UrlEncode(category);
|
||||
categories += "&" + Uri.EscapeDataString("SelectedCats=") + "=" + WebUtility.UrlEncode(category);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -351,18 +377,15 @@ namespace Jackett.Common.Indexers
|
||||
if (!string.IsNullOrWhiteSpace(term))
|
||||
{
|
||||
// Add search term
|
||||
parameters.Add("search", WebUtility.UrlEncode(term));
|
||||
parameters.Add("Search", WebUtility.UrlEncode(term));
|
||||
url += "?" + string.Join("&", parameters.AllKeys.Select(a => a + "=" + parameters[a]));
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add("search", WebUtility.UrlEncode("%"));
|
||||
// Showing all torrents (just for output function)
|
||||
term = "all";
|
||||
}
|
||||
|
||||
// Building our query -- Cannot use GetQueryString due to UrlEncode (generating wrong cat[] param)
|
||||
url += "?" + string.Join("&", parameters.AllKeys.Select(a => a + "=" + parameters[a]));
|
||||
|
||||
logger.Info("\nAbnormal - Builded query for \"" + term + "\"... " + url);
|
||||
|
||||
// Return our search url
|
||||
@@ -376,10 +399,9 @@ namespace Jackett.Common.Indexers
|
||||
/// <returns>Results from query</returns>
|
||||
private async Task<string> QueryExecAsync(string request)
|
||||
{
|
||||
string results = null;
|
||||
|
||||
// Querying tracker directly
|
||||
results = await QueryTrackerAsync(request);
|
||||
var results = await QueryTrackerAsync(request);
|
||||
|
||||
return results;
|
||||
}
|
||||
@@ -400,57 +422,5 @@ namespace Jackett.Common.Indexers
|
||||
// Return results from tracker
|
||||
return results.ContentString;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find torrent rows in search pages
|
||||
/// </summary>
|
||||
/// <returns>List of rows</returns>
|
||||
private IHtmlCollection<IElement> FindTorrentRows(IHtmlDocument dom) =>
|
||||
dom.QuerySelectorAll(".torrent_table > tbody > tr:not(.colhead)");
|
||||
|
||||
/// <summary>
|
||||
/// Validate Config entered by user on Jackett
|
||||
/// </summary>
|
||||
private void ValidateConfig()
|
||||
{
|
||||
logger.Info("\nAbnormal - Validating Settings ... \n");
|
||||
|
||||
// Check Username Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Username.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Info("Abnormal - Validated Setting -- Username (auth) => " + ConfigData.Username.Value.ToString());
|
||||
}
|
||||
|
||||
// Check Password Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Password.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a password with your username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Info("Abnormal - Validated Setting -- Password (auth) => " + ConfigData.Password.Value.ToString());
|
||||
}
|
||||
|
||||
// Check Max Page Setting
|
||||
if (!string.IsNullOrEmpty(ConfigData.Pages.Value))
|
||||
{
|
||||
try
|
||||
{
|
||||
logger.Info("Abnormal - Validated Setting -- Max Pages => " + Convert.ToInt32(ConfigData.Pages.Value));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a numeric maximum number of pages to crawl !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a maximum number of pages to crawl !", ConfigData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace Jackett.Common.Indexers.Abstract
|
||||
protected virtual string APIUrl => SiteLink + "ajax.php";
|
||||
protected virtual string DownloadUrl => SiteLink + "torrents.php?action=download&usetoken=" + (useTokens ? "1" : "0") + (usePassKey ? "&torrent_pass=" + configData.PassKey.Value : "") + "&id=";
|
||||
protected virtual string DetailsUrl => SiteLink + "torrents.php?torrentid=";
|
||||
protected virtual string PosterUrl => SiteLink;
|
||||
protected virtual string AuthorizationFormat => "{0}";
|
||||
protected virtual int ApiKeyLength => 41;
|
||||
|
||||
@@ -229,7 +230,7 @@ namespace Jackett.Common.Indexers.Abstract
|
||||
: null;
|
||||
Uri poster = null;
|
||||
if (!string.IsNullOrEmpty(cover))
|
||||
poster = new Uri(cover);
|
||||
poster = (cover.StartsWith("http")) ? new Uri(cover) : new Uri(PosterUrl + cover);
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
PublishDate = groupTime,
|
||||
|
||||
@@ -1262,7 +1262,7 @@ namespace Jackett.Common.Indexers
|
||||
foreach (var SearchPath in SearchPaths)
|
||||
{
|
||||
// skip path if categories don't match
|
||||
if (SearchPath.Categories != null && mappedCategories.Count > 0)
|
||||
if (SearchPath.Categories.Count > 0)
|
||||
{
|
||||
var invertMatch = (SearchPath.Categories[0] == "!");
|
||||
var hasIntersect = mappedCategories.Intersect(SearchPath.Categories).Any();
|
||||
@@ -1797,7 +1797,7 @@ namespace Jackett.Common.Indexers
|
||||
href = downloadElement.TextContent;
|
||||
}
|
||||
|
||||
href = applyFilters(href, Download.Filters, variables);
|
||||
href = applyFilters(href, selector.Filters, variables);
|
||||
var torrentLink = resolvePath(href, link);
|
||||
if (torrentLink.Scheme != "magnet")
|
||||
{
|
||||
|
||||
81
src/Jackett.Common/Indexers/DesiTorrents.cs
Normal file
81
src/Jackett.Common/Indexers/DesiTorrents.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Common.Indexers.Abstract;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class DesiTorrents : GazelleTracker
|
||||
{
|
||||
protected override string PosterUrl => SiteLink + "static/media/posters/";
|
||||
public DesiTorrents(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,
|
||||
ICacheService cs)
|
||||
: base(id: "desitorrents",
|
||||
name: "DesiTorrents",
|
||||
description: "Desitorrents is a Private Torrent Tracker for BOLLYWOOD / TOLLYWOOD / GENERAL",
|
||||
link: "https://desitorrents.tv/",
|
||||
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,
|
||||
cs: cs,
|
||||
supportsFreeleechTokens: false,
|
||||
has2Fa: true
|
||||
)
|
||||
{
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.Movies, "Movies");
|
||||
AddCategoryMapping(2, TorznabCatType.TV, "Tv shows");
|
||||
AddCategoryMapping(3, TorznabCatType.Audio, "Music");
|
||||
AddCategoryMapping(4, TorznabCatType.BooksEBook, "ebooks");
|
||||
AddCategoryMapping(5, TorznabCatType.TVSport, "Sports");
|
||||
AddCategoryMapping(6, TorznabCatType.PCGames, "Games");
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = await base.PerformQuery(query);
|
||||
foreach (var release in releases)
|
||||
{
|
||||
release.MinimumRatio = 0.6;
|
||||
release.MinimumSeedTime = 259200;
|
||||
}
|
||||
return releases;
|
||||
}
|
||||
|
||||
protected override bool ReleaseInfoPostParse(ReleaseInfo release, JObject torrent, JObject result)
|
||||
{
|
||||
// Add missing category information
|
||||
var category = (string)result["category"];
|
||||
release.Category = MapTrackerCatToNewznab(category);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace Jackett.Common.Models.IndexerConfig.Bespoke
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
internal class ConfigurationDataAbnormal : ConfigurationData
|
||||
{
|
||||
public HiddenStringConfigurationItem AuthKey { get; set; }
|
||||
public HiddenStringConfigurationItem TorrentPass { get; set; }
|
||||
public DisplayInfoConfigurationItem CredentialsWarning { get; private set; }
|
||||
public StringConfigurationItem Username { get; private set; }
|
||||
public StringConfigurationItem Password { get; private set; }
|
||||
public DisplayInfoConfigurationItem PagesWarning { get; private set; }
|
||||
public StringConfigurationItem ReplaceMulti { get; private set; }
|
||||
public StringConfigurationItem Pages { get; private set; }
|
||||
|
||||
public ConfigurationDataAbnormal()
|
||||
: base()
|
||||
{
|
||||
AuthKey = new HiddenStringConfigurationItem("AuthKey") { Value = "" };
|
||||
TorrentPass = new HiddenStringConfigurationItem("TorrentPass") { Value = "" };
|
||||
CredentialsWarning = new DisplayInfoConfigurationItem("Credentials", "<b>Credentials Configuration</b> (<i>Private Tracker</i>),<br /><br /> <ul><li><b>Username</b> is your account name on this tracker.</li><li><b>Password</b> is your password associated to your account name.</li></ul>");
|
||||
Username = new StringConfigurationItem("Username") { Value = "" };
|
||||
Password = new StringConfigurationItem("Password") { Value = "" };
|
||||
PagesWarning = new DisplayInfoConfigurationItem("Preferences", "<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Replace MULTI</b>, replace multi keyword in the resultset (leave empty to deactivate)</li><li><b>Max Pages to Process</b> let you specify how many page (max) Jackett can process when doing a search. Setting a value <b>higher than 4 is dangerous</b> for you account ! (<b>Result of too many requests to tracker...that <u>will be suspect</u></b>).</li></ul>");
|
||||
Pages = new StringConfigurationItem("Max Pages to Process (Required)") { Value = "4" };
|
||||
ReplaceMulti = new StringConfigurationItem("Replace MULTI") { Value = "MULTI.FRENCH" };
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,7 +152,7 @@ namespace Jackett.Common.Models
|
||||
|
||||
public class searchPathBlock : requestBlock
|
||||
{
|
||||
public List<string> Categories { get; set; }
|
||||
public List<string> Categories { get; set; } = new List<string>();
|
||||
public bool Inheritinputs { get; set; } = true;
|
||||
public bool Followredirect { get; set; } = false;
|
||||
}
|
||||
@@ -168,7 +168,6 @@ namespace Jackett.Common.Models
|
||||
public class downloadBlock
|
||||
{
|
||||
public List<downloadsField> Selectors { get; set; }
|
||||
public List<filterBlock> Filters { get; set; }
|
||||
public string Method { get; set; }
|
||||
public requestBlock Before { get; set; }
|
||||
}
|
||||
@@ -177,5 +176,6 @@ namespace Jackett.Common.Models
|
||||
{
|
||||
public string Selector { get; set; }
|
||||
public string Attribute { get; set; }
|
||||
public List<filterBlock> Filters { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,6 +293,7 @@ namespace Jackett.Updater
|
||||
"Definitions/cztorrent.yml",
|
||||
"Definitions/darmowetorenty.yml", // migrated to C#
|
||||
"Definitions/demonsite.yml",
|
||||
"Definitions/desitorrents.yml", // migrated to C#
|
||||
"Definitions/digbt.yml",
|
||||
"Definitions/documentarytorrents.yml",
|
||||
"Definitions/downloadville.yml",
|
||||
|
||||
Reference in New Issue
Block a user