Compare commits

...

13 Commits

Author SHA1 Message Date
Garfield69
72c396f32c assorted unit3d 5.3.0 freeleech=1 -> free=1 resolves #11947 2021-06-21 18:18:21 +12:00
Garfield69
8f0f0c0b55 add obscure a private site. resolves #11911 2021-06-21 16:51:49 +12:00
seeyabye
542a905f0e core: fixed category mapping for searchPaths (#11922)
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2021-06-19 21:30:08 +01:00
Adelscott
64a05162c4 [abnormal] Correction size of the release (#11937) 2021-06-19 21:02:02 +02:00
ilike2burnthing
9e512fddcb torrentqq: update domain *92.com 2021-06-19 09:40:14 +01:00
JigSaw
f832337d85 abnormal: fix no results error (#11932)
* abnormal: fix no results error

* Update Abnormal.cs

Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2021-06-18 13:36:19 +02:00
JigSaw
0ac99cbe08 abnormal: revamped indexer for v2 - fix #11906 (#11930)
* abnormal: totally revamped index for v2

* Update Abnormal.cs

* Update Abnormal.cs

Co-authored-by: garfield69 <garfieldsixtynine@gmail.com>
2021-06-18 02:56:35 +02:00
ilike2burnthing
6aca3ff059 nyaasi: second search path strips 0 from start of episode number. resolves #11019 2021-06-16 07:07:18 +01:00
ilike2burnthing
494331b5fd gazelletracker: add PosterUrl for desitorrents (#11921) 2021-06-15 16:52:08 +01:00
ilike2burnthing
e347d38fc0 desitorrents: migrate to c#. resolves #11904 (#11909) 2021-06-15 03:29:50 +01:00
ilike2burnthing
3b5ae2c279 assorted: add fallback DL (#11920) 2021-06-14 18:14:38 +01:00
ilike2burnthing
77abcf2be7 1337x: typo 2021-06-14 17:18:33 +01:00
seeyabye
0b376faf2d core: modified filters for selectors (#11918) 2021-06-14 17:11:23 +01:00
34 changed files with 553 additions and 632 deletions

View File

@@ -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]](#)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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);
}
}
}
}

View File

@@ -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,

View File

@@ -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")
{

View 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;
}
}
}

View File

@@ -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" };
}
}
}

View File

@@ -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; }
}
}

View File

@@ -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",