mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-10 05:43:17 +02:00
Compare commits
77 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a2eb4dbdbd | ||
![]() |
504573e5f5 | ||
![]() |
81035a002a | ||
![]() |
0e16d8da74 | ||
![]() |
6b460917ef | ||
![]() |
9bd65ceaa2 | ||
![]() |
7b5508d333 | ||
![]() |
4ba9569a08 | ||
![]() |
ac1fa68260 | ||
![]() |
864eb6f1cd | ||
![]() |
cb7acddd61 | ||
![]() |
383d9ff4f8 | ||
![]() |
5eb4dbe550 | ||
![]() |
10473c6bd3 | ||
![]() |
2ac29148af | ||
![]() |
e5682fc48e | ||
![]() |
f332369b53 | ||
![]() |
8a8a114723 | ||
![]() |
583d17dd36 | ||
![]() |
751d3e8b96 | ||
![]() |
60a9008480 | ||
![]() |
e606363ee7 | ||
![]() |
fd0c92f439 | ||
![]() |
10b6b08127 | ||
![]() |
0b9a0dab5a | ||
![]() |
1c4a2cf563 | ||
![]() |
a93c347672 | ||
![]() |
683ebca006 | ||
![]() |
000c57b9c1 | ||
![]() |
4c6b946cf9 | ||
![]() |
b3cf51172f | ||
![]() |
56b8a81248 | ||
![]() |
f7107bf37d | ||
![]() |
c545a49755 | ||
![]() |
19ec3e2aff | ||
![]() |
4846ea000a | ||
![]() |
a29d63e6dc | ||
![]() |
bd177cbf26 | ||
![]() |
93d5acd355 | ||
![]() |
7cc19212f5 | ||
![]() |
ba36c9bdff | ||
![]() |
734fc31d8e | ||
![]() |
6c6d55eb63 | ||
![]() |
17cabb2921 | ||
![]() |
b0250deee1 | ||
![]() |
de8adf382b | ||
![]() |
c31b9d84f0 | ||
![]() |
2bdf899927 | ||
![]() |
2101ebb2de | ||
![]() |
a92e0bef37 | ||
![]() |
090ee7b093 | ||
![]() |
4cd184ae72 | ||
![]() |
642f990862 | ||
![]() |
829347cba2 | ||
![]() |
ca39b85cc2 | ||
![]() |
7a57e2d302 | ||
![]() |
49de2b0a93 | ||
![]() |
a2bd2615c1 | ||
![]() |
71d368689c | ||
![]() |
e1515b468c | ||
![]() |
398f0993f4 | ||
![]() |
c846eb4330 | ||
![]() |
cae6d4ed73 | ||
![]() |
b286dc1c7f | ||
![]() |
61a69472c5 | ||
![]() |
a04fc6f123 | ||
![]() |
86964e1cc6 | ||
![]() |
2d7c30dbde | ||
![]() |
5b6d1ccc7b | ||
![]() |
b9b826c34c | ||
![]() |
b33018563b | ||
![]() |
033070d9a9 | ||
![]() |
8d67d1bf37 | ||
![]() |
f9143d14e5 | ||
![]() |
a601a25652 | ||
![]() |
6451525eb1 | ||
![]() |
acd1902734 |
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,7 +1,11 @@
|
||||
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue. Duplicating issues makes it more difficult for everyone to follow. Your issue may have already been solved in the past as well.
|
||||
|
||||
Provide a description of the feature request or bug, the more details the better.
|
||||
If you are experiencing an issue with a tracker, a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
|
||||
If you are experiencing an issue with a tracker, then:
|
||||
1. Use your browser to check you can access the site directly, and if a login is required, check you can login and that you do not have any outstanding account issues.
|
||||
2. If you haven't already, try upgrading to the latest version of Jackett, your issue may have already been resolved.
|
||||
3. If it is still not working for you, then a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
|
||||
**Jackett version**:
|
||||
**Mono version** (if not using Windows):
|
||||
|
76
README.md
76
README.md
@@ -100,23 +100,23 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* 720pier
|
||||
* Abnormal
|
||||
* Acid-Lounge
|
||||
* AlphaRatio
|
||||
* AlphaRatio (AR)
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AnimeTorrents (AnT)
|
||||
* Anthelion (was TehConnection.me)
|
||||
* AOX
|
||||
* Apollo (XANAX)
|
||||
* ArabaFenice
|
||||
* Arche Torrent
|
||||
* AsianDVDClub
|
||||
* AST4u
|
||||
* Audiobook Torrents
|
||||
* Awesome-HD
|
||||
* Avistaz
|
||||
* Awesome-HD (AHD)
|
||||
* Avistaz (AsiaTorrents)
|
||||
* B2S-Share
|
||||
* Back-ups
|
||||
* BakaBT [![(invite needed)][inviteneeded]](#)
|
||||
* bB
|
||||
* BeyondHD
|
||||
* BeyondHD (BHD)
|
||||
* BIGTorrent
|
||||
* BigTower
|
||||
* Bit-City Reloaded
|
||||
@@ -130,20 +130,20 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* BitTorrentFiles [![(invite needed)][inviteneeded]](#)
|
||||
* BJ-Share
|
||||
* BlueBird
|
||||
* Blutopia
|
||||
* Blutopia (BLU)
|
||||
* Brasil Tracker
|
||||
* BroadcastTheNet
|
||||
* BroadcastTheNet (BTN)
|
||||
* BrokenStones
|
||||
* BTGigs
|
||||
* BTNext
|
||||
* BTXpress
|
||||
* BTNext (BTNT)
|
||||
* BTXpress (BTX)
|
||||
* Carpathians
|
||||
* CCFBits
|
||||
* CGPeers
|
||||
* CHDBits
|
||||
* Cinematik
|
||||
* Cinemageddon
|
||||
* CinemaZ
|
||||
* CinemaZ (EuTorrents)
|
||||
* Classix
|
||||
* DanishBits
|
||||
* DataScene
|
||||
@@ -153,42 +153,43 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Downloadville
|
||||
* Dragonworld Reloaded
|
||||
* Dream Team
|
||||
* DXDHD
|
||||
* EliteHD [![(invite needed)][inviteneeded]](#)
|
||||
* Elit Tracker
|
||||
* Elite-Tracker
|
||||
* Empornium
|
||||
* Empornium (EMP)
|
||||
* eStone
|
||||
* Ethor.net (Thor's Land)
|
||||
* FANO.IN
|
||||
* FileList
|
||||
* FileList (FL)
|
||||
* Femdomcult
|
||||
* Freedom-HD
|
||||
* FullMixMusic
|
||||
* FunFile
|
||||
* FunkyTorrents
|
||||
* FunkyTorrents (FT)
|
||||
* Fuzer
|
||||
* GAYtorrent.ru
|
||||
* GazelleGames
|
||||
* GazelleGames (GGn)
|
||||
* Gfxnews
|
||||
* GFXPeers
|
||||
* GigaTorrents
|
||||
* GimmePeers <!-- maintained by jamesb2147 -->
|
||||
* Girotottent
|
||||
* GODS [![(invite needed)][inviteneeded]](#)
|
||||
* GODS
|
||||
* Greek Team
|
||||
* HacheDe
|
||||
* Hardbay
|
||||
* HD4Free (HD4)
|
||||
* HD-Forever
|
||||
* HD-Only
|
||||
* HD-Space
|
||||
* HD-Forever (HDF)
|
||||
* HD-Only (HDO)
|
||||
* HD-Space (HDS)
|
||||
* HD-Spain
|
||||
* HD-Torrents
|
||||
* HD-Torrents (HDT)
|
||||
* HD-Bits.com
|
||||
* HDBits
|
||||
* HDChina
|
||||
* HDCity
|
||||
* HDHome
|
||||
* HDHome (HDBigger)
|
||||
* HDME
|
||||
* HDSky
|
||||
* HDTorrents.it
|
||||
@@ -201,36 +202,37 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Immortalseed
|
||||
* inPeril
|
||||
* Insane Tracker
|
||||
* IPTorrents
|
||||
* IPTorrents (IPT)
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* LinkoManija
|
||||
* LosslessClub
|
||||
* M-Team - TP
|
||||
* Magico
|
||||
* M-Team (TP)
|
||||
* Magico (Trellas)
|
||||
* Majomparádé
|
||||
* Manicomio Share
|
||||
* Mononoké-BT
|
||||
* MoreThanTV
|
||||
* MoreThanTV (MTV)
|
||||
* MyAnonamouse
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* NCore
|
||||
* Nebulance
|
||||
* Nebulance (NBL)
|
||||
* New Real World
|
||||
* NordicBits
|
||||
* Norbits <!-- added by DiseaseNO but no longer maintained? -->
|
||||
* NordicBits (NB)
|
||||
* Norbits
|
||||
* notwhat.cd
|
||||
* Orpheus
|
||||
* Ourbits
|
||||
* Passione Torrent <!-- maintained by bonny1992 -->
|
||||
* PassThePopcorn
|
||||
* PassThePopcorn (PTP)
|
||||
* PirateTheNet
|
||||
* PiXELHD
|
||||
* PolishSource
|
||||
* PolishTracker
|
||||
* Pretome
|
||||
* PrivateHD
|
||||
* PrivateHD (PHD)
|
||||
* Psytorrents
|
||||
* PTFiles
|
||||
* PuntoTorrent
|
||||
@@ -244,6 +246,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* RoDVD
|
||||
* Romanian Metal Torrent
|
||||
* SceneFZ
|
||||
* SceneHD
|
||||
* SceneReactor
|
||||
* SceneTime
|
||||
* SDBits
|
||||
@@ -260,15 +263,14 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Superbits
|
||||
* Tasmanit
|
||||
* TBPlus
|
||||
* TehConnection.me
|
||||
* TenYardTracker
|
||||
* The Empire
|
||||
* The Geeks
|
||||
* The Horror Charnel
|
||||
* The Horror Charnel (THC)
|
||||
* The Occult
|
||||
* The New Retro
|
||||
* The Place
|
||||
* The Shinning
|
||||
* The Shinning (TsH)
|
||||
* The Show
|
||||
* The Vault
|
||||
* The-Torrents
|
||||
@@ -284,9 +286,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TorrentHR
|
||||
* Torrenting
|
||||
* Torrentland
|
||||
* TorrentLeech
|
||||
* TorrentLeech (TL)
|
||||
* Torrents.Md
|
||||
* TorrentSeeds
|
||||
* TorrentSeeds (TS)
|
||||
* Torrent-Syndikat
|
||||
* TOrrent-tuRK (TORK)
|
||||
* TorViet
|
||||
@@ -300,8 +302,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Ultimate Gamer Club
|
||||
* Waffles
|
||||
* World-In-HD
|
||||
* WorldOfP2P
|
||||
* x-ite.me
|
||||
* WorldOfP2P (WOP)
|
||||
* x-ite.me (XM)
|
||||
* x264
|
||||
* xBytesV2
|
||||
* XSpeeds
|
||||
|
@@ -120,6 +120,10 @@
|
||||
paths:
|
||||
# present trending results if there are no search parms supplied
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/1/{{else}}/trending{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/2/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/3/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/4/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/5/{{else}}{{end}}"
|
||||
keywordsfilters:
|
||||
- name: replace # use this as a workaround till #893 is implemented
|
||||
args: ["Greys Anatomy", "Grey's Anatomy"]
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.2f4y.me/
|
||||
legacylinks:
|
||||
- http://www.2f4y.me/
|
||||
|
||||
caps:
|
||||
|
@@ -101,6 +101,13 @@
|
||||
search:
|
||||
paths:
|
||||
- path: index.php
|
||||
keywordsfilters:
|
||||
- name: diacritics
|
||||
args: replace
|
||||
- name: re_replace # S01 to 1
|
||||
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
|
||||
- name: re_replace # S01E01 to 1 1
|
||||
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
|
||||
inputs:
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{ .Keywords }}{{end}}"
|
||||
page: "torrents"
|
||||
@@ -115,6 +122,21 @@
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
filters:
|
||||
- name: re_replace # S01 E01 to S01E01
|
||||
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
|
||||
- name: re_replace # 01x01 to S01E01
|
||||
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
|
||||
- name: re_replace # 1x01 to S01E01
|
||||
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
|
||||
- name: re_replace # Stagione X --> S0X
|
||||
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
|
||||
- name: re_replace # Stagione XX --> SXX
|
||||
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
|
||||
- name: re_replace # Episodio 4 to E4
|
||||
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
|
||||
- name: re_replace # Episodi 4 5 to E04-05
|
||||
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bigtower
|
||||
name: BigTower
|
||||
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||
@@ -108,6 +108,9 @@
|
||||
args: ["index.php?page=torrent-details&id=", "download.php?id="]
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
filters:
|
||||
- name: re_replace # rimozioni varie
|
||||
args: ["(?i)(\\[Richiesta\\])", ""]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
|
@@ -39,7 +39,7 @@
|
||||
- name: re_replace
|
||||
args: [" ", "+"]
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}q/{{ .Keywords }}/date/{{else}}/{{end}}"
|
||||
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}test{{end}}/date/"
|
||||
rows:
|
||||
selector: table.tor > tbody > tr[class$="_tr"]
|
||||
filters:
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.cpabien.io/
|
||||
- https://wvw.cpabien.cm/
|
||||
legacylinks:
|
||||
- http://www.cpasbiens.cc/
|
||||
- http://www.cpabien.cm/
|
||||
@@ -23,6 +23,8 @@
|
||||
- http://cpabien.club/
|
||||
- http://www.cpabien.io/
|
||||
- https://ww1.cpabien.io/
|
||||
- https://www.cpabien.io/
|
||||
- https://www.cpasbien.blue/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
116
src/Jackett.Common/Definitions/dxdhd.yml
Normal file
116
src/Jackett.Common/Definitions/dxdhd.yml
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
site: dxdhd
|
||||
name: DXDHD
|
||||
description: "General Tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://dxdhd.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
- {id: 4, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 5, cat: PC/0day, desc: "Apps"}
|
||||
- {id: 6, cat: Books, desc: "Books"}
|
||||
- {id: 7, cat: PC/Games, desc: "Games"}
|
||||
- {id: 8, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 9, cat: Other, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
login:
|
||||
path: /login
|
||||
method: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.main:contains("Login Failed!")
|
||||
test:
|
||||
path: /torrents
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /filterTorrents
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
||||
uploader: ""
|
||||
imdb: "{{ .Query.IMDBIDShort }}"
|
||||
tvdb: ""
|
||||
tmdb: ""
|
||||
mal: ""
|
||||
sorting: created_at
|
||||
direction: desc
|
||||
qty: 100
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
fields:
|
||||
category:
|
||||
selector: a[href*="/categories/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "/categories/.*?\\.(\\d+)"
|
||||
title:
|
||||
selector: a.view-torrent
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
attribute: href
|
||||
details:
|
||||
selector: a.view-torrent
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d\.]+)
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
|
||||
- name: re_replace
|
||||
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"100% Free\"]": "0" # Single Torrent Freeleech
|
||||
"i[data-original-title=\"Global FreeLeech\"]": "0" # Global Freeleech
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
|
||||
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
|
||||
"*": "1"
|
@@ -40,6 +40,26 @@
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: multilang
|
||||
type: checkbox
|
||||
label: Replace VFQ/MULTI by another language in release name
|
||||
default: false
|
||||
- name: multilanguage
|
||||
type: select
|
||||
label: Replace MULTI by this language
|
||||
default: MULTI.FRENCH
|
||||
options:
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
|
||||
login:
|
||||
path: login3.php
|
||||
method: form
|
||||
@@ -81,17 +101,28 @@
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/details.php", "/download.php"]
|
||||
title:
|
||||
_title_original:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
_title_original: # long titles (shortened with ...)
|
||||
selector: a[href^="/details.php"][title]
|
||||
attribute: title
|
||||
optional: true
|
||||
_title_normalized:
|
||||
text: "{{ .Result._title_original }}"
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["VFQ", "FRENCH"]
|
||||
- name: replace
|
||||
args: ["vfq", "FRENCH"]
|
||||
- name: re_replace
|
||||
args: ["S(\\d{2}) E(\\d{2})", "S$1E$2"]
|
||||
- name: re_replace
|
||||
args: ["S(\\d{1}) E(\\d{2})", "S0$1E$2"]
|
||||
_title_multilang:
|
||||
text: "{{ .Result._title_normalized }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]MULTI[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]VFQ[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title:
|
||||
text: "{{if .Config.multilang }}{{ .Result._title_multilang }}{{else}}{{ .Result._title_normalized }}{{end}}"
|
||||
category:
|
||||
selector: a[href^="/browse.php?cat="]
|
||||
attribute: href
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://eztv.re/
|
||||
legacylinks:
|
||||
- https://eztv.ag/
|
||||
|
||||
caps:
|
||||
|
@@ -80,3 +80,10 @@
|
||||
selector: td:nth-child(8)
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"strong.tl_free": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
|
@@ -162,21 +162,21 @@
|
||||
- name: regexp
|
||||
args: "src=(.+?) "
|
||||
size:
|
||||
selector: td:nth-child(11)
|
||||
selector: td:nth-last-child(3)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
selector: td:nth-last-child(8)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
selector: td:nth-last-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
selector: td:nth-last-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
selector: td:nth-last-child(6)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Free Leech"]: "0"
|
||||
|
94
src/Jackett.Common/Definitions/hdcenter.yml
Normal file
94
src/Jackett.Common/Definitions/hdcenter.yml
Normal file
@@ -0,0 +1,94 @@
|
||||
---
|
||||
site: hdcenter
|
||||
name: HDCenter
|
||||
description: "An German HD tracker"
|
||||
language: de-de
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://hdcenter.cc/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies/HD, desc: "Movies"}
|
||||
- {id: 2, cat: Movies/3D, desc: "3D"}
|
||||
- {id: 3, cat: TV/HD, desc: "Series"}
|
||||
- {id: 4, cat: TV/Documentary, desc: "Documentary"}
|
||||
- {id: 5, cat: TV/Sport, desc: "Sport"}
|
||||
- {id: 6, cat: XXX, desc: "XXX"}
|
||||
- {id: 7, cat: Audio/Lossless, desc: "Audio"}
|
||||
- {id: 8, cat: PC/0day, desc: "Appz"}
|
||||
- {id: 9, cat: Movies/HD, desc: "HDC"}
|
||||
- {id: 10, cat: Movies/HD, desc: "TvR"}
|
||||
- {id: 11, cat: Movies/HD, desc: "10Bit"}
|
||||
- {id: 12, cat: Movies/HD, desc: "jTV"}
|
||||
- {id: 13, cat: TV/HD, desc: "NERDS"}
|
||||
- {id: 14, cat: Audio/Lossless, desc: "dOWnb3At"}
|
||||
- {id: 15, cat: Movies/Other, desc: "Anime"}
|
||||
- {id: 16, cat: Audio/Video, desc: "Live"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
timeout: "1"
|
||||
error:
|
||||
- selector: div#error-text
|
||||
test:
|
||||
path: /torrents.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
searchstr: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.torrent
|
||||
fields:
|
||||
download:
|
||||
selector: a[title="download"]
|
||||
attribute: href
|
||||
optional: true
|
||||
details:
|
||||
selector: a.torrent_link_title
|
||||
attribute: href
|
||||
title:
|
||||
selector: a.torrent_link_title
|
||||
category:
|
||||
selector: td.cats_col > a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: strdump
|
||||
- name: regexp
|
||||
args: "\\[(\\d+?)\\]"
|
||||
- name: strdump
|
||||
date:
|
||||
selector: td.time_col > .time
|
||||
filters:
|
||||
- name: append
|
||||
args: " +00:00"
|
||||
- name: dateparse
|
||||
args: "Jan 02 2006, 15:04 -07:00"
|
||||
size:
|
||||
selector: td.size_col
|
||||
grabs:
|
||||
selector: td.snatcher_col
|
||||
seeders:
|
||||
selector: td.seeder_col
|
||||
leechers:
|
||||
selector: td.leecher_col
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"span.freeleech": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
@@ -168,7 +168,10 @@
|
||||
leechers:
|
||||
selector: td:nth-child(7) a
|
||||
grabs:
|
||||
selector: td:nth-child(8) a
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
|
@@ -70,7 +70,6 @@
|
||||
selector: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
inputs:
|
||||
logintype: "username"
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://hdtorrents.xyz/
|
||||
legacylinks:
|
||||
- http://hdtorrents.it/
|
||||
|
||||
caps:
|
||||
|
@@ -6,99 +6,86 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.idope.site/
|
||||
legacylinks:
|
||||
- https://idope.top/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 0, cat: Other, desc: "Others"}
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: Other, desc: "Videos"}
|
||||
- {id: 3, cat: TV, desc: "TV"}
|
||||
- {id: 4, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 5, cat: XXX, desc: "XXX"}
|
||||
- {id: 6, cat: Audio, desc: "Music"}
|
||||
- {id: 7, cat: PC/Games, desc: "Games"}
|
||||
- {id: 8, cat: PC, desc: "Apps"}
|
||||
- {id: 9, cat: Books, desc: "Books"}
|
||||
- {id: other, cat: Other, desc: "Others"}
|
||||
- {id: movies, cat: Movies, desc: "Movies"}
|
||||
- {id: videos, cat: Other, desc: "Videos"}
|
||||
- {id: tv, cat: TV, desc: "TV"}
|
||||
- {id: anime, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: xxx, cat: XXX, desc: "XXX"}
|
||||
- {id: adult, cat: XXX, desc: "XXX"}
|
||||
- {id: music, cat: Audio, desc: "Music"}
|
||||
- {id: games, cat: PC/Games, desc: "Games"}
|
||||
- {id: apps, cat: PC/0day, desc: "Apps"}
|
||||
- {id: applications, cat: PC/0day, desc: "Apps"}
|
||||
- {id: android, cat: PC/Phone-Android, desc: "Android"}
|
||||
- {id: software, cat: PC/0day, desc: "Apps"}
|
||||
- {id: books, cat: Books, desc: "Books"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: itorrents-links
|
||||
type: checkbox
|
||||
label: Add download links via itorrents.org
|
||||
- name: info
|
||||
type: info
|
||||
label: ITorrents Note
|
||||
default: Without the itorrents option only magnet links will be provided.
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}search/{{ .Keywords}}/{{else}}recent-torrents/{{end}}"
|
||||
- path: "{{if .Keywords}}search/{{ .Keywords}}/{{else}}recent/{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/2{{else}}recent/2{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/3{{else}}recent/3{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/4{{else}}recent/4{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/5{{else}}recent/5{{end}}"
|
||||
rows:
|
||||
selector: div[class="resultdiv"]
|
||||
selector: li:has(div.opt-text-w3layouts)
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: div[class="resultdivtop"] div[class="resultdivtopname"]
|
||||
selector: div.opt-text-w3layouts a
|
||||
details:
|
||||
selector: div[class="resultdivbotton"] div[class="magneticdiv"] a
|
||||
selector: div.opt-text-w3layouts a
|
||||
attribute: href
|
||||
category:
|
||||
optional: true
|
||||
selector: div[class="resultdivbotton"] div[class="resultdivbottoncategory"]
|
||||
case:
|
||||
":contains(\"Other\")": 0
|
||||
":contains(\"Movies\")": 1
|
||||
":contains(\"Video\")": 2
|
||||
":contains(\"TV\")": 3
|
||||
":contains(\"Anime\")": 4
|
||||
":contains(\"xxx\")": 5
|
||||
":contains(\"XXX\")": 5
|
||||
":contains(\"Adult\")": 5
|
||||
":contains(\"Music\")": 6
|
||||
":contains(\"Games\")": 7
|
||||
":contains(\"Apps\")": 8
|
||||
":contains(\"Software\")": 8
|
||||
":contains(\"Books\")": 9
|
||||
download-itorrents:
|
||||
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
|
||||
selector: a[href^="/browse/"]
|
||||
filters:
|
||||
- name: toupper
|
||||
- name: prepend
|
||||
args: http://itorrents.org/torrent/
|
||||
- name: append
|
||||
args: ".torrent"
|
||||
download:
|
||||
text: "{{if .Config.itorrents-links}}{{ .Result.download-itorrents }}{{else}}{{end}}"
|
||||
magfile:
|
||||
text: "{{ .Result.title }}"
|
||||
filters:
|
||||
- name: validfilename
|
||||
- name: urlencode
|
||||
- name: replace
|
||||
args: ["/browse/", ""]
|
||||
magnet:
|
||||
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&dn={{ .Result.magfile }}.torrent"
|
||||
- name: append
|
||||
args: "&tr=http://182.176.139.129:6969/announce&tr=http://explodie.org:6969/announce&tr=http://tracker.mgtracker.org:2710/announce&tr=udp://tracker.coppersurfer.tk:6969/announce&tr=udp://tracker.leechers-paradise.org:6969/announce&tr=udp://tracker.pirateparty.gr:6969/announce&tr=udp://tracker.sktorrent.net:6969/announce&tr=udp://tracker.zer0day.to:1337/announce"
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
date:
|
||||
selector: div[class="resultdivbotton"] div[class="resulttime"] div[class="resultdivbottontime"]
|
||||
selector: div.seedbar span:nth-child(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Age: ", ""]
|
||||
- name: timeago
|
||||
files:
|
||||
selector: div.seedbar span:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Files: ", ""]
|
||||
size:
|
||||
selector: div[class="resultdivbotton"] div[class="resultlength"] div[class="resultdivbottonlength"]
|
||||
selector: div.seedbar span:nth-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Size: ", ""]
|
||||
seeders:
|
||||
text: "1"
|
||||
selector: div.seedbar span:nth-child(1)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Seed: ", ""]
|
||||
leechers:
|
||||
text: "1"
|
||||
selector: div.seedbar span:nth-child(2)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Leech: ", ""]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
@@ -144,21 +144,27 @@
|
||||
# - name: regexp
|
||||
# args: "src=(.+?) "
|
||||
size:
|
||||
selector: td:nth-last-child(3)
|
||||
selector: td:nth-last-child(2)
|
||||
date:
|
||||
selector: td:nth-last-child(7)
|
||||
selector: td:nth-last-child(6):contains('ago')
|
||||
optional: true
|
||||
filters:
|
||||
- name: timeago
|
||||
date:
|
||||
selector: td:nth-last-child(6):contains('/')
|
||||
optional: true
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
grabs:
|
||||
selector: td:nth-last-child(4)
|
||||
selector: td:nth-last-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-last-child(6)
|
||||
leechers:
|
||||
selector: td:nth-last-child(5)
|
||||
leechers:
|
||||
selector: td:nth-last-child(4)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
@@ -6,10 +6,12 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://kickassextratorrent.xyz/
|
||||
- https://kickassextratorrent.club/
|
||||
legacylinks:
|
||||
- https://kickasskatcr.website/
|
||||
- https://kickasskatcr.stream/
|
||||
- https://kickassextratorrent.xyz/
|
||||
- https://kickassextratorrent.website/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -137,26 +137,26 @@
|
||||
error:
|
||||
- selector: div#show_error font
|
||||
rows:
|
||||
selector: div#content > div.torrent-box[id^="torrent_"], tr:has(a[href*="?p=torrents&pid=10&action=details"])
|
||||
selector: div#content > div.torrent-box[id^="torrent_"], tr:has(a[href*="?p=torrents"][href*="&action=details"])
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: a[href*="?p=torrents&pid=10&action=details"]
|
||||
selector: a[href*="?p=torrents"][href*="&action=details"]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Grey's Anatomy", "Greys Anatomy"]
|
||||
category:
|
||||
selector: a[href*="?p=torrents&pid=10&cid="]
|
||||
selector: a[href*="?p=torrents"][href*="&cid="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cid
|
||||
details:
|
||||
selector: a[href*="?p=torrents&pid=10&action=details"]
|
||||
selector: a[href*="?p=torrents"][href*="&action=details"]
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href*="?p=torrents&pid=10&action=download"]
|
||||
selector: a[href*="?p=torrents"][href*="&action=download"]
|
||||
attribute: href
|
||||
imdb:
|
||||
optional: true
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://metal.iplay.ro/
|
||||
legacylinks:
|
||||
- https://metal.stream.bike/
|
||||
|
||||
caps:
|
||||
@@ -55,7 +57,7 @@
|
||||
inputs:
|
||||
"search": "{{if .Query.Artist}}{{ .Query.Artist }}{{else}}{{ .Keywords }}{{end}}"
|
||||
rows:
|
||||
selector: table.torrents_table tbody tr
|
||||
selector: table.torrents_table tbody tr:has(a[href^="download2.php?id="])
|
||||
fields:
|
||||
title:
|
||||
selector: td a[href^="details.php?id="]
|
||||
@@ -88,12 +90,12 @@
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: '([\d]+) seeders'
|
||||
args: '([\d]+) seeders?'
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: '([\d]+) leechers'
|
||||
args: '([\d]+) leechers?'
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
|
@@ -124,15 +124,15 @@
|
||||
- name: replace
|
||||
args: ["pic/nopic.jpg", ""]
|
||||
size:
|
||||
selector: td.rowfollow:nth-child(5)
|
||||
selector: td.rowfollow:nth-last-child(6)
|
||||
grabs:
|
||||
selector: td.rowfollow:nth-child(8)
|
||||
selector: td.rowfollow:nth-last-child(3)
|
||||
seeders:
|
||||
selector: td.rowfollow:nth-child(6)
|
||||
selector: td.rowfollow:nth-last-child(5)
|
||||
leechers:
|
||||
selector: td.rowfollow:nth-child(7)
|
||||
selector: td.rowfollow:nth-last-child(4)
|
||||
date:
|
||||
selector: td.rowfollow:nth-child(4):not(:has(span))
|
||||
selector: td.rowfollow:nth-last-child(7):not(:has(span))
|
||||
optional: true
|
||||
filters:
|
||||
- name: append
|
||||
@@ -140,7 +140,7 @@
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -07:00"
|
||||
date:
|
||||
selector: td.rowfollow:nth-child(4) > span[title]
|
||||
selector: td.rowfollow:nth-last-child(7) > span[title]
|
||||
optional: true
|
||||
attribute: title
|
||||
filters:
|
||||
|
@@ -12,6 +12,18 @@
|
||||
certificates:
|
||||
- 7877113458e90f3643dd28424657a29469f5dc55
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: striprussian
|
||||
type: checkbox
|
||||
label: Strip Russian Letters
|
||||
default: true
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# TV
|
||||
@@ -726,7 +738,7 @@
|
||||
- name: re_replace
|
||||
args: ["(\\([Сс]езон\\s+(\\d+).+[Сс]ери[ия]\\s+(?:(\\d+-*\\d*).*\\d+)*\\))", "(S$2E$3) RUS"]
|
||||
- name: re_replace
|
||||
args: ["(\\([А-Яа-я\\W]+\\))|(^[А-Яа-я\\W\\d]+\\/ )|([а-яА-Я \\-]+,+)|([а-яА-Я]+)", ""]
|
||||
args: ["(\\([А-Яа-я\\W]+\\))|(^[А-Яа-я\\W\\d]+\\/ )|([а-яА-Я \\-]+,+)|([а-яА-Я]+)", "{{ if .Config.striprussian }}{{ else }}$1$2$3$4{{ end }}"]
|
||||
- name: replace
|
||||
args: ["WEBDLRip", "WEBDL"]
|
||||
- name: replace
|
||||
|
@@ -38,28 +38,40 @@
|
||||
inputs:
|
||||
search: "{{if .Query.Artist}}{{ .Query.Artist }}{{else}}{{ .Keywords }}{{end}}"
|
||||
rows:
|
||||
selector: body:nth-child(2) tbody tr td:nth-child(2) table.lista tbody tr:nth-child(2) table.lista tbody tr
|
||||
selector: body:nth-child(2) tbody tr td:nth-child(2) table.lista tbody tr:nth-child(2) table.lista tbody tr:has(a[href^="download.php?id="])
|
||||
fields:
|
||||
title:
|
||||
selector: td a[href^="details.php?id="]
|
||||
details:
|
||||
selector: td a[href^="details.php?id="]
|
||||
attribute: href
|
||||
comments: # link to the comments of the torrent
|
||||
comments:
|
||||
selector: td a[href^="details.php?id="]
|
||||
attribute: href
|
||||
download:
|
||||
selector: td a[href^="download.php?id="]
|
||||
attribute: href
|
||||
# dates come in two flavours:
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
size: # size of the torrent (units are handled automatically)
|
||||
# 13/10/2018
|
||||
selector: td:nth-child(6):contains("/")
|
||||
optional: true
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
date:
|
||||
# 1 hour ago, 2 days ago, 3 weeks ago etc
|
||||
selector: td:nth-child(6):not(:contains("/"))
|
||||
optional: true
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
grabs: # number of downloads
|
||||
grabs:
|
||||
selector: td:nth-child(11)
|
||||
category:
|
||||
text: "Music"
|
||||
|
111
src/Jackett.Common/Definitions/scenehd.yml
Normal file
111
src/Jackett.Common/Definitions/scenehd.yml
Normal file
@@ -0,0 +1,111 @@
|
||||
---
|
||||
site: scenehd
|
||||
name: SceneHD
|
||||
description: "SceneHD is Private site for HD TV / MOVIES"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://scenehd.org/
|
||||
certificates:
|
||||
- 81cc4e41b6f8ff656ca0e2396ee6d63383198bf1 # self signed
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 2, cat: Movies/UHD, desc: "Movie/2160"}
|
||||
- {id: 1, cat: Movies/HD, desc: "Movie/1080"}
|
||||
- {id: 4, cat: Movies/HD, desc: "Movie/720"}
|
||||
- {id: 8, cat: Movies/Bluray, desc: "Movie/BD5/9"}
|
||||
- {id: 6, cat: TV/UHD, desc: "TV/2160"}
|
||||
- {id: 5, cat: TV/HD, desc: "TV/1080"}
|
||||
- {id: 7, cat: TV/HD, desc: "TV/720"}
|
||||
- {id: 22, cat: Movies/Bluray, desc: "Bluray/Complete"}
|
||||
- {id: 10, cat: XXX, desc: "XXX"}
|
||||
- {id: 16, cat: Movies/Other, desc: "Subpacks"}
|
||||
- {id: 13, cat: Audio/Video, desc: "MVID"}
|
||||
- {id: 9, cat: Other, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
movie-search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form#loginform
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: body:contains("Your username or password was incorrect.")
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[{{.}}]=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
||||
imdb: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{end}}"
|
||||
rows:
|
||||
selector: table.browse > tbody > tr
|
||||
fields:
|
||||
download:
|
||||
selector: td.browse_dl > a
|
||||
attribute: href
|
||||
title:
|
||||
selector: td.browse_name > a[href^="details.php?id="]
|
||||
category:
|
||||
selector: td.browse_cat a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
imdb:
|
||||
selector: td.browse_imdb > a.catlink
|
||||
optional: true
|
||||
attribute: href
|
||||
details:
|
||||
selector: td.browse_name > a[href^="details.php?id="]
|
||||
attribute: href
|
||||
files:
|
||||
selector: a[href*="&filelist"]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Files", ""]
|
||||
size:
|
||||
selector: td.browse_centernowrap:has(a[href*="&filelist"])
|
||||
remove: small
|
||||
date:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +0200"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -0700"
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
seeders:
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["/", 0]
|
||||
leechers: # some torrents have extra partial seeders: 18 / 0 (3)
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["/", 1]
|
||||
- name: split
|
||||
args: [" ", 0]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
a.freetorrent: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
@@ -71,6 +71,8 @@
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: div.error
|
||||
- selector: body:has(h1:contains("403 Forbidden")) # for banned IP notices
|
||||
- selector: td.lista > span[style="color:#FF0000;"] # Nome Utente non corretto
|
||||
test:
|
||||
path: /index.php
|
||||
selector: a[href="logout.php"]
|
||||
@@ -99,7 +101,7 @@
|
||||
selector: a[href^="download.php?id="]
|
||||
attribute: href
|
||||
title: # shortened title?
|
||||
selector: a[href^="index.php?page=torrent-details"]
|
||||
selector: td:nth-child(2)
|
||||
filters:
|
||||
- name: re_replace # replace special characters with " " (space)
|
||||
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
|
||||
@@ -124,7 +126,7 @@
|
||||
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
|
||||
title: # long titles?
|
||||
optional: true
|
||||
selector: a[title][href^="index.php?page=torrent-details"]
|
||||
selector: td:nth-child(2)
|
||||
attribute: title
|
||||
filters:
|
||||
- name: re_replace # replace special characters with " " (space)
|
||||
@@ -149,7 +151,7 @@
|
||||
- name: re_replace # rimozioni varie
|
||||
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
selector: td:nth-child(1) a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
@@ -165,21 +167,21 @@
|
||||
- name: regexp
|
||||
args: "src=(.+?) "
|
||||
size:
|
||||
selector: td:nth-child(10)
|
||||
selector: td:nth-last-child(3)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
selector: td:nth-last-child(7)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
selector: td:nth-last-child(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
selector: td:nth-last-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
selector: td:nth-last-child(5)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Free Leech"]: "0"
|
||||
|
@@ -45,7 +45,7 @@
|
||||
- {id: 399, cat: PC, desc: "Other OS", default: true}
|
||||
|
||||
#Games
|
||||
- {id: 401, cat: Console, desc: "Games", default: true}
|
||||
- {id: 400, cat: Console, desc: "Games", default: true}
|
||||
- {id: 401, cat: PC/Games, desc: "PC", default: true}
|
||||
- {id: 402, cat: PC/Mac, desc: "Mac", default: true}
|
||||
- {id: 403, cat: Console/PS4, desc: "PSx", default: true}
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.torrent9.ph/
|
||||
- https://ww1.torrent9.ph/
|
||||
legacylinks:
|
||||
- http://www.torrent9.ec/
|
||||
- http://www.torrent9.red/
|
||||
@@ -18,6 +18,7 @@
|
||||
- https://www.torrent9.blue/
|
||||
- https://ww2.torrent9.blue/
|
||||
- https://www.torrent9.rip/
|
||||
- https://www.torrent9.ph/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -102,9 +102,6 @@
|
||||
download:
|
||||
selector: a.dl_a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "^(/download.php/\\d+/).*" # cut off download url after ID to avoid bad request errors with curl
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
size:
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www3.yggtorrent.to/
|
||||
- https://www9.yggtorrent.to/
|
||||
legacylinks:
|
||||
- https://yggtorrent.is/
|
||||
- https://yggtorrent.com/
|
||||
@@ -17,6 +17,8 @@
|
||||
- https://ww3.yggtorrent.is/
|
||||
- https://ww4.yggtorrent.is/
|
||||
- https://yggtorrent.to/
|
||||
- https://www3.yggtorrent.to/
|
||||
- https://www6.yggtorrent.to/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -116,6 +118,12 @@
|
||||
MULTI.FRENCH: "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
MULTI.ENGLISH: "MULTI.ENGLISH"
|
||||
VOSTFR: "VOSTFR"
|
||||
MULTI.VOSTFR: "MULTI.VOSTFR"
|
||||
- name: vostfr
|
||||
type: checkbox
|
||||
label: Replace VOSTFR with ENGLISH
|
||||
default: false
|
||||
login:
|
||||
method: form
|
||||
path: /
|
||||
@@ -166,8 +174,15 @@
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title:
|
||||
title_phase2:
|
||||
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
|
||||
title_vostfr:
|
||||
text: "{{ .Result.title_phase2 }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[\\.\\s\\[\\-][Vv][Oo][Ss][Tt][Ff][Rr][\\.\\s\\]\\-]", ".ENGLISH."]
|
||||
title:
|
||||
text: "{{if .Config.vostfr }}{{ .Result.title_vostfr }}{{else}}{{ .Result.title_phase2 }}{{end}}"
|
||||
details:
|
||||
selector: ":nth-child(2) > a"
|
||||
attribute: href
|
||||
|
@@ -193,7 +193,7 @@ namespace Jackett.Common.Indexers
|
||||
var DetailsResultDocument = ResultParser.Parse(detailsResult.Content);
|
||||
var qDownloadLink = DetailsResultDocument.QuerySelector("table.table2 > tbody > tr > td > a[href^=\"/download/torrent.php?id\"]");
|
||||
|
||||
release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href"));
|
||||
release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").TrimStart('/'));
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(Row.QuerySelector("span.seed").TextContent);
|
||||
release.Peers = ParseUtil.CoerceInt(Row.QuerySelector("span.leech").TextContent) + release.Seeders;
|
||||
@@ -214,6 +214,10 @@ namespace Jackett.Common.Indexers
|
||||
size = size.Replace("MiB", "MB");
|
||||
size = size.Replace("KiB", "KB");
|
||||
|
||||
size = size.Replace("ГБ", "GB");
|
||||
size = size.Replace("МБ", "MB");
|
||||
size = size.Replace("КБ", "KB");
|
||||
|
||||
release.Size = ReleaseInfo.GetBytes(size);
|
||||
|
||||
release.DownloadVolumeFactor = 1;
|
||||
|
@@ -14,7 +14,7 @@ namespace Jackett.Common.Indexers
|
||||
};
|
||||
|
||||
public TehConnectionMe(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "TehConnection.me",
|
||||
: base(name: "Anthelion (TehConnection.me)",
|
||||
desc: "A movies tracker",
|
||||
link: "https://anthelion.me/",
|
||||
configService: configService,
|
@@ -133,6 +133,18 @@ namespace Jackett.Common.Indexers
|
||||
CQ dom = results.Content;
|
||||
ReleaseInfo release;
|
||||
|
||||
CQ userInfo = dom[".mainmenu > table > tbody > tr:has(td[title=\"Active-Torrents\"])"][0].Cq();
|
||||
string rank = userInfo.Find("td:nth-child(2)").Text().Substring(6);
|
||||
|
||||
HashSet<string> freeleechRanks = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
freeleechRanks.Add("VIP");
|
||||
freeleechRanks.Add("Uploader");
|
||||
freeleechRanks.Add("HD Internal");
|
||||
freeleechRanks.Add("Moderator");
|
||||
freeleechRanks.Add("Administrator");
|
||||
freeleechRanks.Add("Owner");
|
||||
bool hasFreeleech = freeleechRanks.Contains(rank);
|
||||
|
||||
var rows = dom[".mainblockcontenttt > tbody > tr:has(a[href^=\"details.php?id=\"])"];
|
||||
foreach (var row in rows)
|
||||
{
|
||||
@@ -193,6 +205,8 @@ namespace Jackett.Common.Indexers
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 0;
|
||||
}
|
||||
else if(hasFreeleech)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else if (qRow.Find("img[alt=\"Silver Torrent\"]").Length >= 1)
|
||||
release.DownloadVolumeFactor = 0.5;
|
||||
else if (qRow.Find("img[alt=\"Bronze Torrent\"]").Length >= 1)
|
||||
|
@@ -69,8 +69,8 @@ namespace Jackett.Common.Indexers
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("OK"), () =>
|
||||
{
|
||||
CQ dom = result.Content;
|
||||
var messageEl = dom["#errorMsg"].Last();
|
||||
var errorMessage = messageEl.Text().Trim();
|
||||
var errorMessage = dom.Text().Trim();
|
||||
errorMessage += " attempts left. Please check your credentials.";
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
|
@@ -34,6 +34,13 @@ namespace Jackett.Common.Indexers
|
||||
"http://ghost.cable-modem.org/",
|
||||
"http://logan.unusualperson.com/",
|
||||
"http://baywatch.workisboring.com/",
|
||||
"https://ipt.getcrazy.me",
|
||||
"https://ipt.findnemo.net",
|
||||
"https://ipt.beelyrics.net",
|
||||
"https://ipt.venom.global",
|
||||
"https://ipt.workisboring.net",
|
||||
"https://ipt.lol",
|
||||
|
||||
};
|
||||
|
||||
private new ConfigurationDataRecaptchaLogin configData
|
||||
@@ -202,7 +209,7 @@ namespace Jackett.Common.Indexers
|
||||
// Redirect to ? then to /t
|
||||
await FollowIfRedirect(response, request.Url, null, firstCallCookies);
|
||||
|
||||
await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () =>
|
||||
await ConfigureIfOK(firstCallCookies, response.Content.Contains("/lout.php"), () =>
|
||||
{
|
||||
CQ dom = response.Content;
|
||||
var messageEl = dom["body > div"].First();
|
||||
|
@@ -124,7 +124,7 @@ namespace Jackett.Common.Indexers
|
||||
CQ dom = results.Content;
|
||||
|
||||
var rows = dom["#sortabletable tr:has(a[href*=\"details.php?id=\"])"];
|
||||
foreach (var row in rows.Skip(1))
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var qRow = row.Cq();
|
||||
|
@@ -45,7 +45,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
public async Task<IEnumerable<TorznabQuery>> FallbackQueries()
|
||||
{
|
||||
if (titles == null)
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
return titles.Select(t => query.CreateFallback(t));
|
||||
}
|
||||
|
||||
|
@@ -49,7 +49,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
|
||||
var remainingResults = results.Except(wrongResults).Except(perfectResults);
|
||||
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
var strippedTitles = titles.Select(t => RemoveSpecialChars(t));
|
||||
var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t));
|
||||
|
||||
|
@@ -1,10 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using CsQuery;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
@@ -18,11 +19,11 @@ namespace Jackett.Common.Indexers
|
||||
public class Myanonamouse : BaseWebIndexer
|
||||
{
|
||||
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
private string SearchUrl { get { return SiteLink + "tor/js/loadSearch2.php"; } }
|
||||
private string SearchUrl { get { return SiteLink + "tor/js/loadSearchJSONbasic.php"; } }
|
||||
|
||||
private new ConfigurationDataBasicLogin configData
|
||||
private new ConfigurationDataMyAnonamouse configData
|
||||
{
|
||||
get { return (ConfigurationDataBasicLogin)base.configData; }
|
||||
get { return (ConfigurationDataMyAnonamouse)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
@@ -30,122 +31,137 @@ namespace Jackett.Common.Indexers
|
||||
: base(name: "MyAnonamouse",
|
||||
description: "Friendliness, Warmth and Sharing",
|
||||
link: "https://www.myanonamouse.net/",
|
||||
caps: new TorznabCapabilities(TorznabCatType.Books,
|
||||
TorznabCatType.AudioAudiobook,
|
||||
TorznabCatType.BooksComics,
|
||||
TorznabCatType.BooksEbook,
|
||||
TorznabCatType.BooksMagazines,
|
||||
TorznabCatType.BooksTechnical),
|
||||
configService: configService,
|
||||
caps: new TorznabCapabilities(),
|
||||
client: c,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataBasicLogin())
|
||||
configData: new ConfigurationDataMyAnonamouse())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
webclient.EmulateBrowser = false;
|
||||
|
||||
AddCategoryMapping("61", TorznabCatType.BooksComics);
|
||||
AddCategoryMapping("91", TorznabCatType.BooksTechnical);
|
||||
AddCategoryMapping("80", TorznabCatType.BooksTechnical);
|
||||
AddCategoryMapping("79", TorznabCatType.BooksMagazines);
|
||||
AddCategoryMapping("39", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("49", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("50", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("83", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("51", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("97", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("40", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("41", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("106", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("42", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("52", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("98", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("54", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("55", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("43", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("99", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("84", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("44", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("56", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("137", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("45", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("57", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("85", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("87", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("119", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("88", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("58", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("59", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("46", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("47", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("53", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("89", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("100", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("108", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("48", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("111", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("60", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("71", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("72", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("90", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("73", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("101", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("62", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("63", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("107", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("64", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("74", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("102", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("76", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("77", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("65", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("103", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("115", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("66", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("78", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("138", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("67", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("92", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("118", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("94", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("120", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("95", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("81", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("82", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("68", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("69", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("75", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("96", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("104", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("109", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("70", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("112", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("13", TorznabCatType.AudioAudiobook, "AudioBooks");
|
||||
AddCategoryMapping("14", TorznabCatType.BooksEbook, "E-Books");
|
||||
AddCategoryMapping("15", TorznabCatType.AudioAudiobook, "Musicology");
|
||||
AddCategoryMapping("16", TorznabCatType.AudioAudiobook, "Radio");
|
||||
AddCategoryMapping("39", TorznabCatType.AudioAudiobook, "Audiobooks - Action/Adventure");
|
||||
AddCategoryMapping("49", TorznabCatType.AudioAudiobook, "Audiobooks - Art");
|
||||
AddCategoryMapping("50", TorznabCatType.AudioAudiobook, "Audiobooks - Biographical");
|
||||
AddCategoryMapping("83", TorznabCatType.AudioAudiobook, "Audiobooks - Business");
|
||||
AddCategoryMapping("51", TorznabCatType.AudioAudiobook, "Audiobooks - Computer/Internet");
|
||||
AddCategoryMapping("97", TorznabCatType.AudioAudiobook, "Audiobooks - Crafts");
|
||||
AddCategoryMapping("40", TorznabCatType.AudioAudiobook, "Audiobooks - Crime/Thriller");
|
||||
AddCategoryMapping("41", TorznabCatType.AudioAudiobook, "Audiobooks - Fantasy");
|
||||
AddCategoryMapping("106", TorznabCatType.AudioAudiobook, "Audiobooks - Food");
|
||||
AddCategoryMapping("42", TorznabCatType.AudioAudiobook, "Audiobooks - General Fiction");
|
||||
AddCategoryMapping("52", TorznabCatType.AudioAudiobook, "Audiobooks - General Non-Fic");
|
||||
AddCategoryMapping("98", TorznabCatType.AudioAudiobook, "Audiobooks - Historical Fiction");
|
||||
AddCategoryMapping("54", TorznabCatType.AudioAudiobook, "Audiobooks - History");
|
||||
AddCategoryMapping("55", TorznabCatType.AudioAudiobook, "Audiobooks - Home/Garden");
|
||||
AddCategoryMapping("43", TorznabCatType.AudioAudiobook, "Audiobooks - Horror");
|
||||
AddCategoryMapping("99", TorznabCatType.AudioAudiobook, "Audiobooks - Humor");
|
||||
AddCategoryMapping("84", TorznabCatType.AudioAudiobook, "Audiobooks - Instructional");
|
||||
AddCategoryMapping("44", TorznabCatType.AudioAudiobook, "Audiobooks - Juvenile");
|
||||
AddCategoryMapping("56", TorznabCatType.AudioAudiobook, "Audiobooks - Language");
|
||||
AddCategoryMapping("45", TorznabCatType.AudioAudiobook, "Audiobooks - Literary Classics");
|
||||
AddCategoryMapping("57", TorznabCatType.AudioAudiobook, "Audiobooks - Math/Science/Tech");
|
||||
AddCategoryMapping("85", TorznabCatType.AudioAudiobook, "Audiobooks - Medical");
|
||||
AddCategoryMapping("87", TorznabCatType.AudioAudiobook, "Audiobooks - Mystery");
|
||||
AddCategoryMapping("119", TorznabCatType.AudioAudiobook, "Audiobooks - Nature");
|
||||
AddCategoryMapping("88", TorznabCatType.AudioAudiobook, "Audiobooks - Philosophy");
|
||||
AddCategoryMapping("58", TorznabCatType.AudioAudiobook, "Audiobooks - Pol/Soc/Relig");
|
||||
AddCategoryMapping("59", TorznabCatType.AudioAudiobook, "Audiobooks - Recreation");
|
||||
AddCategoryMapping("46", TorznabCatType.AudioAudiobook, "Audiobooks - Romance");
|
||||
AddCategoryMapping("47", TorznabCatType.AudioAudiobook, "Audiobooks - Science Fiction");
|
||||
AddCategoryMapping("53", TorznabCatType.AudioAudiobook, "Audiobooks - Self-Help");
|
||||
AddCategoryMapping("89", TorznabCatType.AudioAudiobook, "Audiobooks - Travel/Adventure");
|
||||
AddCategoryMapping("100", TorznabCatType.AudioAudiobook, "Audiobooks - True Crime");
|
||||
AddCategoryMapping("108", TorznabCatType.AudioAudiobook, "Audiobooks - Urban Fantasy");
|
||||
AddCategoryMapping("48", TorznabCatType.AudioAudiobook, "Audiobooks - Western");
|
||||
AddCategoryMapping("111", TorznabCatType.AudioAudiobook, "Audiobooks - Young Adult");
|
||||
AddCategoryMapping("60", TorznabCatType.BooksEbook, "Ebooks - Action/Adventure");
|
||||
AddCategoryMapping("71", TorznabCatType.BooksEbook, "Ebooks - Art");
|
||||
AddCategoryMapping("72", TorznabCatType.BooksEbook, "Ebooks - Biographical");
|
||||
AddCategoryMapping("90", TorznabCatType.BooksEbook, "Ebooks - Business");
|
||||
AddCategoryMapping("61", TorznabCatType.BooksComics, "Ebooks - Comics/Graphic novels");
|
||||
AddCategoryMapping("73", TorznabCatType.BooksEbook, "Ebooks - Computer/Internet");
|
||||
AddCategoryMapping("101", TorznabCatType.BooksEbook, "Ebooks - Crafts");
|
||||
AddCategoryMapping("62", TorznabCatType.BooksEbook, "Ebooks - Crime/Thriller");
|
||||
AddCategoryMapping("63", TorznabCatType.BooksEbook, "Ebooks - Fantasy");
|
||||
AddCategoryMapping("107", TorznabCatType.BooksEbook, "Ebooks - Food");
|
||||
AddCategoryMapping("64", TorznabCatType.BooksEbook, "Ebooks - General Fiction");
|
||||
AddCategoryMapping("74", TorznabCatType.BooksEbook, "Ebooks - General Non-Fiction");
|
||||
AddCategoryMapping("102", TorznabCatType.BooksEbook, "Ebooks - Historical Fiction");
|
||||
AddCategoryMapping("76", TorznabCatType.BooksEbook, "Ebooks - History");
|
||||
AddCategoryMapping("77", TorznabCatType.BooksEbook, "Ebooks - Home/Garden");
|
||||
AddCategoryMapping("65", TorznabCatType.BooksEbook, "Ebooks - Horror");
|
||||
AddCategoryMapping("103", TorznabCatType.BooksEbook, "Ebooks - Humor");
|
||||
AddCategoryMapping("115", TorznabCatType.BooksEbook, "Ebooks - Illusion/Magic");
|
||||
AddCategoryMapping("91", TorznabCatType.BooksEbook, "Ebooks - Instructional");
|
||||
AddCategoryMapping("66", TorznabCatType.BooksEbook, "Ebooks - Juvenile");
|
||||
AddCategoryMapping("78", TorznabCatType.BooksEbook, "Ebooks - Language");
|
||||
AddCategoryMapping("67", TorznabCatType.BooksEbook, "Ebooks - Literary Classics");
|
||||
AddCategoryMapping("79", TorznabCatType.BooksMagazines, "Ebooks - Magazines/Newspapers");
|
||||
AddCategoryMapping("80", TorznabCatType.BooksTechnical, "Ebooks - Math/Science/Tech");
|
||||
AddCategoryMapping("92", TorznabCatType.BooksEbook, "Ebooks - Medical");
|
||||
AddCategoryMapping("118", TorznabCatType.BooksEbook, "Ebooks - Mixed Collections");
|
||||
AddCategoryMapping("94", TorznabCatType.BooksEbook, "Ebooks - Mystery");
|
||||
AddCategoryMapping("120", TorznabCatType.BooksEbook, "Ebooks - Nature");
|
||||
AddCategoryMapping("95", TorznabCatType.BooksEbook, "Ebooks - Philosophy");
|
||||
AddCategoryMapping("81", TorznabCatType.BooksEbook, "Ebooks - Pol/Soc/Relig");
|
||||
AddCategoryMapping("82", TorznabCatType.BooksEbook, "Ebooks - Recreation");
|
||||
AddCategoryMapping("68", TorznabCatType.BooksEbook, "Ebooks - Romance");
|
||||
AddCategoryMapping("69", TorznabCatType.BooksEbook, "Ebooks - Science Fiction");
|
||||
AddCategoryMapping("75", TorznabCatType.BooksEbook, "Ebooks - Self-Help");
|
||||
AddCategoryMapping("96", TorznabCatType.BooksEbook, "Ebooks - Travel/Adventure");
|
||||
AddCategoryMapping("104", TorznabCatType.BooksEbook, "Ebooks - True Crime");
|
||||
AddCategoryMapping("109", TorznabCatType.BooksEbook, "Ebooks - Urban Fantasy");
|
||||
AddCategoryMapping("70", TorznabCatType.BooksEbook, "Ebooks - Western");
|
||||
AddCategoryMapping("112", TorznabCatType.BooksEbook, "Ebooks - Young Adult");
|
||||
AddCategoryMapping("19", TorznabCatType.AudioAudiobook, "Guitar/Bass Tabs");
|
||||
AddCategoryMapping("20", TorznabCatType.AudioAudiobook, "Individual Sheet");
|
||||
AddCategoryMapping("24", TorznabCatType.AudioAudiobook, "Individual Sheet MP3");
|
||||
AddCategoryMapping("126", TorznabCatType.AudioAudiobook, "Instructional Book with Video");
|
||||
AddCategoryMapping("22", TorznabCatType.AudioAudiobook, "Instructional Media - Music");
|
||||
AddCategoryMapping("113", TorznabCatType.AudioAudiobook, "Lick Library - LTP/Jam With");
|
||||
AddCategoryMapping("114", TorznabCatType.AudioAudiobook, "Lick Library - Techniques/QL");
|
||||
AddCategoryMapping("17", TorznabCatType.AudioAudiobook, "Music - Complete Editions");
|
||||
AddCategoryMapping("26", TorznabCatType.AudioAudiobook, "Music Book");
|
||||
AddCategoryMapping("27", TorznabCatType.AudioAudiobook, "Music Book MP3");
|
||||
AddCategoryMapping("30", TorznabCatType.AudioAudiobook, "Sheet Collection");
|
||||
AddCategoryMapping("31", TorznabCatType.AudioAudiobook, "Sheet Collection MP3");
|
||||
AddCategoryMapping("127", TorznabCatType.AudioAudiobook, "Radio - Comedy");
|
||||
AddCategoryMapping("130", TorznabCatType.AudioAudiobook, "Radio - Drama");
|
||||
AddCategoryMapping("128", TorznabCatType.AudioAudiobook, "Radio - Factual/Documentary");
|
||||
AddCategoryMapping("132", TorznabCatType.AudioAudiobook, "Radio - Reading");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "email", configData.Username.Value },
|
||||
{ "password", configData.Password.Value },
|
||||
{ "returnto", "/" }
|
||||
};
|
||||
|
||||
configData.CookieHeader.Cookie = ""; // cookie reset needed in order to relogin
|
||||
|
||||
var preRequest = await RequestStringWithCookiesAndRetry(LoginUrl);
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, preRequest.Cookies, true, SearchUrl, SiteLink);
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("Search Results"), () =>
|
||||
// TODO: implement captcha
|
||||
CookieHeader = "mam_id=" + configData.MamId.Value;
|
||||
try
|
||||
{
|
||||
CQ dom = result.Content;
|
||||
var errorMessage = dom["table.main table td.text"].Text().Trim().Replace("\n\t", " ");
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
var results = await PerformQuery(new TorznabQuery());
|
||||
if (results.Count() == 0)
|
||||
{
|
||||
throw new Exception("Your man_id did not work");
|
||||
}
|
||||
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
IsConfigured = false;
|
||||
throw new Exception("Your man_id did not work: " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
@@ -162,12 +178,20 @@ namespace Jackett.Common.Indexers
|
||||
qParams.Add("tor[sortType]", "default");
|
||||
qParams.Add("tor[startNumber]", "0");
|
||||
|
||||
qParams.Add("thumbnails", "1"); // gives links for thumbnail sized versions of their posters
|
||||
//qParams.Add("posterLink", "1"); // gives links for a full sized poster
|
||||
//qParams.Add("dlLink", "1"); // include the url to download the torrent
|
||||
qParams.Add("description", "1"); // include the description
|
||||
//qParams.Add("bookmarks", "0"); // include if the item is bookmarked or not
|
||||
|
||||
List<string> catList = MapTorznabCapsToTrackers(query);
|
||||
if (catList.Any())
|
||||
{
|
||||
int index = 0;
|
||||
foreach (string cat in catList)
|
||||
{
|
||||
qParams.Add("tor[cat][]", cat);
|
||||
qParams.Add("tor[cat]["+index+"]", cat);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -182,65 +206,79 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
|
||||
var response = await RequestStringWithCookiesAndRetry(urlSearch);
|
||||
if (response.Status == System.Net.HttpStatusCode.Forbidden || CookieHeader.Contains("pass=deleted") || response.Content.Contains("Access limits exceeded."))
|
||||
if (response.Content.StartsWith("Error"))
|
||||
{
|
||||
// re-login
|
||||
await ApplyConfiguration(null);
|
||||
response = await RequestStringWithCookiesAndRetry(urlSearch);
|
||||
throw new Exception(response.Content);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = response.Content;
|
||||
var rows = dom["table[class='newTorTable'] > tbody > tr[id^=\"tdr\"]"];
|
||||
var jsonContent = JObject.Parse(response.Content);
|
||||
var sitelink = new Uri(SiteLink);
|
||||
|
||||
foreach (IDomObject row in rows)
|
||||
var error = jsonContent.Value<string>("error");
|
||||
if(error != null)
|
||||
{
|
||||
CQ torrentData = row.OuterHTML;
|
||||
CQ cells = row.Cq().Find("td");
|
||||
|
||||
string tid = torrentData.Attr("id").Substring(4);
|
||||
var qTitle = torrentData.Find("a[class='title']").First();
|
||||
string title = qTitle.Text().Trim();
|
||||
var details = new Uri(SiteLink + qTitle.Attr("href"));
|
||||
string author = torrentData.Find("a[class='author']").First().Text().Trim();
|
||||
Uri link = new Uri(SiteLink + "tor/download.php?tid=" + tid); // DL Link is no long available directly, build it ourself
|
||||
long files = ParseUtil.CoerceLong(cells.Elements.ElementAt(4).Cq().Find("a").Text());
|
||||
long size = ReleaseInfo.GetBytes(cells.Elements.ElementAt(4).Cq().Text().Split('[')[1].TrimEnd(']'));
|
||||
int seeders = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(0).Cq().Text());
|
||||
int leechers = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(1).Cq().Text());
|
||||
long grabs = ParseUtil.CoerceLong(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(2).Cq().Text());
|
||||
bool freeleech = torrentData.Find("img[alt=\"freeleech\"]").Any();
|
||||
|
||||
string pubDateStr = cells.Elements.ElementAt(5).Cq().Text().Split('[')[0];
|
||||
DateTime publishDate = DateTime.Parse(pubDateStr).ToLocalTime();
|
||||
|
||||
long category = 0;
|
||||
string cat = torrentData.Find("a[class='newCatLink']").First().Attr("href").Remove(0, "/tor/browse.php?tor[cat][]]=".Length);
|
||||
long.TryParse(cat, out category);
|
||||
if (error == "Nothing returned, out of 0")
|
||||
return releases;
|
||||
}
|
||||
|
||||
foreach (var item in jsonContent.Value<JArray>("data"))
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
|
||||
var id = item.Value<long>("id");
|
||||
release.Title = item.Value<string>("title");
|
||||
|
||||
release.Title = String.IsNullOrEmpty(author) ? title : String.Format("{0} by {1}", title, author);
|
||||
release.Guid = link;
|
||||
release.Link = link;
|
||||
release.PublishDate = publishDate;
|
||||
release.Files = files;
|
||||
release.Size = size;
|
||||
release.Description = release.Title;
|
||||
release.Seeders = seeders;
|
||||
release.Peers = seeders + leechers;
|
||||
release.Grabs = grabs;
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.Category = MapTrackerCatToNewznab(category.ToString());
|
||||
release.Comments = details;
|
||||
release.Description = item.Value<string>("description");
|
||||
|
||||
if (freeleech)
|
||||
var author_info = item.Value<string>("author_info");
|
||||
string author = null;
|
||||
if (!string.IsNullOrWhiteSpace(author_info))
|
||||
{
|
||||
author_info = Regex.Unescape(author_info);
|
||||
var author_info_json = JObject.Parse(author_info);
|
||||
author = author_info_json.First.Last.Value<string>();
|
||||
}
|
||||
if (author != null)
|
||||
release.Title += " by " + author;
|
||||
|
||||
var flags = new List<string>();
|
||||
|
||||
var lang_code = item.Value<string>("lang_code");
|
||||
if (!string.IsNullOrEmpty(lang_code))
|
||||
flags.Add(lang_code);
|
||||
|
||||
var filetype = item.Value<string>("filetype");
|
||||
if (!string.IsNullOrEmpty(filetype))
|
||||
flags.Add(filetype);
|
||||
|
||||
if (flags.Count > 0)
|
||||
release.Title += " [" + string.Join(" / ", flags) + "]";
|
||||
|
||||
var category = item.Value<string>("category");
|
||||
release.Category = MapTrackerCatToNewznab(category);
|
||||
|
||||
release.Link = new Uri(sitelink, "/tor/download.php?tid=" + id);
|
||||
release.Comments = new Uri(sitelink, "/t/" + id);
|
||||
release.Guid = release.Comments;
|
||||
|
||||
var dateStr = item.Value<string>("added");
|
||||
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
|
||||
release.PublishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
|
||||
release.Grabs = item.Value<long>("times_completed");
|
||||
release.Files = item.Value<long>("numfiles");
|
||||
release.Seeders = item.Value<int>("seeders");
|
||||
release.Peers = item.Value<int>("leechers") + release.Seeders;
|
||||
var size = item.Value<string>("size");
|
||||
release.Size = ReleaseInfo.GetBytes(size);
|
||||
var free = item.Value<int>("free");
|
||||
|
||||
if (free == 1)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else
|
||||
release.DownloadVolumeFactor = 1;
|
||||
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
|
@@ -117,7 +117,7 @@ namespace Jackett.Common.Indexers
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
List<ReleaseInfo> parseTorrents(WebClientStringResult results, String seasonep, TorznabQuery query, int already_founded)
|
||||
List<ReleaseInfo> parseTorrents(WebClientStringResult results, String seasonep, TorznabQuery query, int already_founded, int limit)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
try
|
||||
@@ -128,91 +128,97 @@ namespace Jackett.Common.Indexers
|
||||
var rows = dom[".box_torrent_all"].Find(".box_torrent");
|
||||
|
||||
// Check torrents only till we reach the query Limit
|
||||
for(int i=0; (i<rows.Length && (already_founded + releases.Count) < query.Limit); i++)
|
||||
{
|
||||
CQ qRow = rows[i].Cq();
|
||||
|
||||
var key = dom["link[rel=alternate]"].First().Attr("href").Split('=').Last();
|
||||
|
||||
release = new ReleaseInfo();
|
||||
var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
|
||||
//if (torrentTxt == null) continue;
|
||||
release.Title = torrentTxt.GetAttribute("title");
|
||||
release.Description = qRow.Find("span").Get(0).GetAttribute("title") + " " + qRow.Find("a.infolink").Text();
|
||||
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
|
||||
string downloadId = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);
|
||||
|
||||
release.Link = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
|
||||
release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
|
||||
release.Guid = new Uri(release.Comments.ToString() + "#comments"); ;
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
|
||||
var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdblink);
|
||||
var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
|
||||
if (banner != null)
|
||||
for(int i=0; (i<rows.Length && ((already_founded + releases.Count) < limit )); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
|
||||
var BannerMatch = BannerRegEx.Match(banner);
|
||||
var bannerurl = BannerMatch.Groups[1].Value;
|
||||
release.BannerUrl = new Uri(bannerurl);
|
||||
}
|
||||
release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
|
||||
string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
|
||||
release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
|
||||
string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
|
||||
string cat = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
|
||||
release.Category = MapTrackerCatToNewznab(cat);
|
||||
CQ qRow = rows[i].Cq();
|
||||
var key = dom["link[rel=alternate]"].First().Attr("href").Split('=').Last();
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !release.Title.Contains("hun"))
|
||||
release.Title += ".hun";
|
||||
release = new ReleaseInfo();
|
||||
var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
|
||||
//if (torrentTxt == null) continue;
|
||||
release.Title = torrentTxt.GetAttribute("title");
|
||||
release.Description = qRow.Find("span").Get(0).GetAttribute("title") + " " + qRow.Find("a.infolink").Text();
|
||||
|
||||
if (seasonep == null)
|
||||
releases.Add(release);
|
||||
|
||||
else
|
||||
{
|
||||
if (query.MatchQueryStringAND(release.Title, null, seasonep))
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
|
||||
string downloadId = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);
|
||||
|
||||
release.Link = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
|
||||
release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
|
||||
release.Guid = new Uri(release.Comments.ToString() + "#comments"); ;
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
|
||||
var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdblink);
|
||||
var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
|
||||
if (banner != null)
|
||||
{
|
||||
/* For sonnar if the search querry was english the title must be english also so we need to change the Description and Title */
|
||||
var temp = release.Title;
|
||||
|
||||
// releasedata everithing after Name.S0Xe0X
|
||||
String releasedata =release.Title.Split(new[] { seasonep }, StringSplitOptions.None)[1].Trim();
|
||||
Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
|
||||
var BannerMatch = BannerRegEx.Match(banner);
|
||||
var bannerurl = BannerMatch.Groups[1].Value;
|
||||
release.BannerUrl = new Uri(bannerurl);
|
||||
}
|
||||
release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
|
||||
string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
|
||||
release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
|
||||
string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
|
||||
string cat = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
|
||||
release.Category = MapTrackerCatToNewznab(cat);
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !releasedata.Contains("hun"))
|
||||
releasedata += ".hun";
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !release.Title.Contains("hun"))
|
||||
release.Title += ".hun";
|
||||
|
||||
// release description contains [imdb: ****] but we only need the data before it for title
|
||||
String[] description = {release.Description, ""};
|
||||
if (release.Description.Contains("[imdb:"))
|
||||
{
|
||||
description = release.Description.Split('[');
|
||||
description[1] = "[" + description[1];
|
||||
}
|
||||
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + "." + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// if search is done for S0X than we dont want to put . between S0X and E0X
|
||||
Match match = Regex.Match(releasedata, @"^E\d\d?");
|
||||
if (seasonep.Length==3 && match.Success)
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// add back imdb points to the description [imdb: 8.7]
|
||||
release.Description = temp+" "+ description[1];
|
||||
release.Description = release.Description.Trim();
|
||||
if (seasonep == null)
|
||||
releases.Add(release);
|
||||
|
||||
else
|
||||
{
|
||||
if (query.MatchQueryStringAND(release.Title, null, seasonep))
|
||||
{
|
||||
/* For sonnar if the search querry was english the title must be english also so we need to change the Description and Title */
|
||||
var temp = release.Title;
|
||||
|
||||
// releasedata everithing after Name.S0Xe0X
|
||||
String releasedata = release.Title.Split(new[] { seasonep }, StringSplitOptions.None)[1].Trim();
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !releasedata.Contains("hun"))
|
||||
releasedata += ".hun";
|
||||
|
||||
// release description contains [imdb: ****] but we only need the data before it for title
|
||||
String[] description = { release.Description, "" };
|
||||
if (release.Description.Contains("[imdb:"))
|
||||
{
|
||||
description = release.Description.Split('[');
|
||||
description[1] = "[" + description[1];
|
||||
}
|
||||
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + "." + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// if search is done for S0X than we dont want to put . between S0X and E0X
|
||||
Match match = Regex.Match(releasedata, @"^E\d\d?");
|
||||
if (seasonep.Length == 3 && match.Success)
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// add back imdb points to the description [imdb: 8.7]
|
||||
release.Description = temp + " " + description[1];
|
||||
release.Description = release.Description.Trim();
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
catch (FormatException ex)
|
||||
{
|
||||
logger.Error("Problem of parsing Torrent:" + rows[i].InnerHTML);
|
||||
logger.Error("Exception was the following:" + ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -276,17 +282,21 @@ namespace Jackett.Common.Indexers
|
||||
// find out the number of the last page from the link
|
||||
Match match = Regex.Match(last_page_link, @"(?<=[\?,&]oldal=)(\d+)(?=&)");
|
||||
numVal = Int32.Parse(match.Value);
|
||||
}
|
||||
}
|
||||
|
||||
releases = parseTorrents(results, seasonep, query, releases.Count);
|
||||
var limit = query.Limit;
|
||||
if (limit == 0)
|
||||
limit = 100;
|
||||
|
||||
releases = parseTorrents(results, seasonep, query, releases.Count, limit);
|
||||
|
||||
// Check all the pages for the torrents.
|
||||
// The starting index is 2. (the first one is the original where we parse out the pages.)
|
||||
for (int i=2; (i<= numVal && releases.Count < query.Limit); i++ )
|
||||
for (int i=2; (i<= numVal && releases.Count < limit); i++ )
|
||||
{
|
||||
pairs.Add(new KeyValuePair<string, string>("oldal", i.ToString()));
|
||||
results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);
|
||||
releases.AddRange(parseTorrents(results, seasonep, query, releases.Count));
|
||||
releases.AddRange(parseTorrents(results, seasonep, query, releases.Count, limit));
|
||||
pairs.Remove(new KeyValuePair<string, string>("oldal", i.ToString()));
|
||||
}
|
||||
|
||||
|
@@ -38,7 +38,7 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
}
|
||||
|
||||
public NewpctRelease(NewpctRelease copyFrom):
|
||||
public NewpctRelease(NewpctRelease copyFrom):
|
||||
base(copyFrom)
|
||||
{
|
||||
NewpctReleaseType = copyFrom.NewpctReleaseType;
|
||||
@@ -65,6 +65,7 @@ namespace Jackett.Common.Indexers
|
||||
private int _maxEpisodesListPages = 100;
|
||||
private int[] _allTvCategories = TorznabCatType.TV.SubCategories.Select(c => c.ID).ToArray();
|
||||
|
||||
private bool _includeVo;
|
||||
private DateTime _dailyNow;
|
||||
private int _dailyResultIdx;
|
||||
|
||||
@@ -72,6 +73,7 @@ namespace Jackett.Common.Indexers
|
||||
private string[] _seriesLetterUrls = new string[] { "/series/letter/{0}", "/series-hd/letter/{0}" };
|
||||
private string[] _seriesVOLetterUrls = new string[] { "/series-vo/letter/{0}" };
|
||||
private string _seriesUrl = "{0}/pg/{1}";
|
||||
private string[] _voUrls = new string[] { "serie-vo", "serievo" };
|
||||
|
||||
public Newpct(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "Newpct",
|
||||
@@ -138,6 +140,7 @@ namespace Jackett.Common.Indexers
|
||||
CleanCache();
|
||||
}
|
||||
|
||||
_includeVo = ((BoolItem)configData.GetDynamic("IncludeVo")).Value;
|
||||
_dailyNow = DateTime.Now;
|
||||
_dailyResultIdx = 0;
|
||||
bool rssMode = string.IsNullOrEmpty(query.SanitizedSearchTerm);
|
||||
@@ -183,7 +186,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> TvSearch(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> newpctReleases = null;
|
||||
List<ReleaseInfo> newpctReleases = null;
|
||||
|
||||
string seriesName = query.SanitizedSearchTerm;
|
||||
int? season = query.Season > 0 ? (int?)query.Season : null;
|
||||
@@ -242,7 +245,8 @@ namespace Jackett.Common.Indexers
|
||||
return newpctReleases.Where(r =>
|
||||
{
|
||||
NewpctRelease nr = r as NewpctRelease;
|
||||
return nr.Season.HasValue != season.HasValue || //Can't determine if same season
|
||||
return (
|
||||
nr.Season.HasValue != season.HasValue || //Can't determine if same season
|
||||
nr.Season.HasValue && season.Value == nr.Season.Value && //Same season and ...
|
||||
(
|
||||
nr.Episode.HasValue != episode.HasValue || //Can't determine if same episode
|
||||
@@ -251,7 +255,8 @@ namespace Jackett.Common.Indexers
|
||||
nr.Episode.Value == episode.Value || //Same episode
|
||||
nr.EpisodeTo.HasValue && episode.Value >= nr.Episode.Value && episode.Value <= nr.EpisodeTo.Value //Episode in interval
|
||||
)
|
||||
);
|
||||
)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -285,7 +290,7 @@ namespace Jackett.Common.Indexers
|
||||
private IEnumerable<Uri> SeriesListUris(string seriesName)
|
||||
{
|
||||
IEnumerable<string> lettersUrl;
|
||||
if (!((BoolItem)configData.GetDynamic("IncludeVo")).Value)
|
||||
if (!_includeVo)
|
||||
{
|
||||
lettersUrl = _seriesLetterUrls;
|
||||
}
|
||||
@@ -319,6 +324,8 @@ namespace Jackett.Common.Indexers
|
||||
title = title2;
|
||||
|
||||
var detailsUrl = anchor.GetAttribute("href");
|
||||
if (!_includeVo && _voUrls.Any(vo => detailsUrl.ToLower().Contains(vo.ToLower())))
|
||||
continue;
|
||||
|
||||
var span = row.QuerySelector("span");
|
||||
var quality = span.ChildNodes[0].TextContent.Trim();
|
||||
@@ -331,12 +338,12 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
NewpctRelease newpctRelease;
|
||||
if (releaseType == ReleaseType.TV)
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
string.Format("Serie {0} - {1} Calidad [{2}]", title, language, quality),
|
||||
detailsUrl, quality, language, ReleaseInfo.GetBytes(sizeText), _dailyNow - TimeSpan.FromMilliseconds(_dailyResultIdx));
|
||||
else
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
string.Format("{0} [{1}][{2}]", title, quality, language),
|
||||
string.Format("{0} [{1}][{2}]", title, quality, language),
|
||||
detailsUrl, quality, language, ReleaseInfo.GetBytes(sizeText), _dailyNow - TimeSpan.FromMilliseconds(_dailyResultIdx));
|
||||
|
||||
releases.Add(newpctRelease);
|
||||
@@ -434,6 +441,8 @@ namespace Jackett.Common.Indexers
|
||||
result.Episode = int.Parse(match.Groups[8].Value.Trim().PadLeft(2, '0'));
|
||||
result.EpisodeTo = match.Groups[11].Success ? (int?)int.Parse(match.Groups[11].Value.Trim()) : null;
|
||||
string audioQuality = match.Groups[13].Value.Trim(' ', '[', ']');
|
||||
if (string.IsNullOrEmpty(language))
|
||||
language = audioQuality;
|
||||
quality = match.Groups[14].Value.Trim(' ', '[', ']');
|
||||
|
||||
string seasonText = result.Season.ToString();
|
||||
@@ -448,11 +457,11 @@ namespace Jackett.Common.Indexers
|
||||
Match matchClassic = _titleClassicRegex.Match(title);
|
||||
if (matchClassic.Success)
|
||||
{
|
||||
result.Season = matchClassic.Groups[3].Success ? (int?)int.Parse(matchClassic.Groups[3].Value) : null;
|
||||
result.Episode = matchClassic.Groups[4].Success ? (int?)int.Parse(matchClassic.Groups[4].Value) : null;
|
||||
result.EpisodeTo = matchClassic.Groups[7].Success ? (int?)int.Parse(matchClassic.Groups[7].Value) : null;
|
||||
if (matchClassic.Groups[2].Success)
|
||||
quality = matchClassic.Groups[2].Value;
|
||||
result.Season = matchClassic.Groups[2].Success ? (int?)int.Parse(matchClassic.Groups[2].Value) : null;
|
||||
result.Episode = matchClassic.Groups[3].Success ? (int?)int.Parse(matchClassic.Groups[3].Value) : null;
|
||||
result.EpisodeTo = matchClassic.Groups[6].Success ? (int?)int.Parse(matchClassic.Groups[6].Value) : null;
|
||||
if (matchClassic.Groups[1].Success)
|
||||
quality = matchClassic.Groups[1].Value;
|
||||
}
|
||||
|
||||
result.Title = title;
|
||||
@@ -478,12 +487,12 @@ namespace Jackett.Common.Indexers
|
||||
result.Seeders = 1;
|
||||
result.Peers = 1;
|
||||
|
||||
result.Title = FixedTitle(result, quality);
|
||||
result.Title = FixedTitle(result, quality, language);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private string FixedTitle(NewpctRelease release, string quality)
|
||||
private string FixedTitle(NewpctRelease release, string quality, string language)
|
||||
{
|
||||
if (String.IsNullOrEmpty(release.SeriesName))
|
||||
{
|
||||
@@ -493,12 +502,16 @@ namespace Jackett.Common.Indexers
|
||||
release.SeriesName = release.Title.Substring(0, release.Title.IndexOf('-') - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(quality))
|
||||
{
|
||||
quality = "HDTV";
|
||||
}
|
||||
|
||||
var titleParts = new List<string>();
|
||||
|
||||
titleParts.Add(release.SeriesName);
|
||||
|
||||
if (release.NewpctReleaseType == ReleaseType.TV)
|
||||
{
|
||||
var seasonAndEpisode = "S" + release.Season.ToString().PadLeft(2, '0');
|
||||
@@ -509,12 +522,27 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
titleParts.Add(seasonAndEpisode);
|
||||
}
|
||||
titleParts.Add(quality.Replace("[", "").Replace("]", ""));
|
||||
if (release.Title.ToLower().Contains("esp") || release.Title.ToLower().Contains("cast"))
|
||||
|
||||
if (!release.SeriesName.Contains(quality))
|
||||
{
|
||||
titleParts.Add(quality);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(language) && !release.SeriesName.Contains(language))
|
||||
{
|
||||
titleParts.Add(language);
|
||||
}
|
||||
|
||||
if (release.Title.ToLower().Contains("espa\u00F1ol") || release.Title.ToLower().Contains("castellano"))
|
||||
{
|
||||
titleParts.Add("Spanish");
|
||||
}
|
||||
return String.Join(".", titleParts);
|
||||
|
||||
string result = String.Join(".", titleParts);
|
||||
|
||||
result = Regex.Replace(result, @"[\[\]]+", ".");
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -348,7 +348,7 @@ namespace Jackett.Common.Indexers
|
||||
// Category
|
||||
string categoryID = tRow.Find("td:eq(0) > a:eq(0)").Attr("href").Split('?').Last();
|
||||
var newznab = MapTrackerCatToNewznab(categoryID);
|
||||
Output("Category: " + MapTrackerCatToNewznab(categoryID).First().ToString() + " (" + categoryID + ")");
|
||||
Output("Category: " + (newznab.Count > 0 ? newznab.First().ToString() : "unknown category") + " (" + categoryID + ")");
|
||||
|
||||
// Seeders
|
||||
int seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(9)").Text(), @"\d+").Value);
|
||||
@@ -397,7 +397,7 @@ namespace Jackett.Common.Indexers
|
||||
// Building release infos
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
Category = MapTrackerCatToNewznab(categoryID.ToString()),
|
||||
Category = newznab,
|
||||
Title = name,
|
||||
Seeders = seeders,
|
||||
Peers = seeders + leechers,
|
||||
@@ -680,7 +680,15 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
var defaultTheme = new[] { "/templates/1/", "/templates/2/", "/templates/3/", "/templates/4/", "/templates/5/", "/templates/6/", "/templates/11/", "/templates/12/" };
|
||||
var oldV2 = new[] { "/templates/7/", "/templates/8/", "/templates/9/", "/templates/10/", "/templates/14/" };
|
||||
|
||||
|
||||
// template 7 contains a reference to template 2 (logout button), so check for oldV2 first
|
||||
if (oldV2.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody')
|
||||
return _fDom["# base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)"];
|
||||
}
|
||||
|
||||
if (defaultTheme.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
@@ -688,12 +696,6 @@ namespace Jackett.Common.Indexers
|
||||
return _fDom["# base_content2 > div.article > table > tbody:not(:first) > tr"];
|
||||
}
|
||||
|
||||
if (oldV2.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody')
|
||||
return _fDom["# base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)"];
|
||||
}
|
||||
return _fDom;
|
||||
}
|
||||
|
||||
|
@@ -7,12 +7,12 @@ using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class Apollo : GazelleTracker
|
||||
public class Orpheus : GazelleTracker
|
||||
{
|
||||
public Apollo(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Apollo",
|
||||
public Orpheus(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Orpheus",
|
||||
desc: "A music tracker",
|
||||
link: "https://apollo.rip/",
|
||||
link: "https://orpheus.network/",
|
||||
configService: configService,
|
||||
logger: logger,
|
||||
protectionService: protectionService,
|
||||
@@ -33,4 +33,4 @@ namespace Jackett.Common.Indexers
|
||||
AddCategoryMapping(7, TorznabCatType.Books, "Comics");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -164,11 +164,11 @@ namespace Jackett.Common.Indexers
|
||||
queryCollection.Add("mode", "list");
|
||||
}
|
||||
|
||||
var cats = string.Join(";", MapTorznabCapsToTrackers(query));
|
||||
if (!string.IsNullOrEmpty(cats))
|
||||
{
|
||||
queryCollection.Add("category", cats);
|
||||
}
|
||||
var querycats = MapTorznabCapsToTrackers(query);
|
||||
if (querycats.Count == 0)
|
||||
querycats = GetAllTrackerCategories(); // default to all, without specifing it some categories are missing (e.g. games), see #4146
|
||||
var cats = string.Join(";", querycats);
|
||||
queryCollection.Add("category", cats);
|
||||
|
||||
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
|
||||
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
|
||||
@@ -217,6 +217,7 @@ namespace Jackett.Common.Indexers
|
||||
release.InfoHash = release.MagnetUri.ToString().Split(':')[3].Split('&')[0];
|
||||
|
||||
release.Comments = new Uri(item.Value<string>("info_page"));
|
||||
release.Link = release.Comments; // in case of a torrent download we grab the link from the details page in Download()
|
||||
release.Guid = release.MagnetUri;
|
||||
|
||||
var episode_info = item.Value<JToken>("episode_info");
|
||||
@@ -251,5 +252,27 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
{
|
||||
// build download link from info redirect link
|
||||
var slink = link.ToString();
|
||||
var response = await RequestStringWithCookies(slink);
|
||||
if (!response.IsRedirect && response.Content.Contains("Invalid token."))
|
||||
{
|
||||
// get new token
|
||||
token = null;
|
||||
await CheckToken();
|
||||
slink += "&token=" + token;
|
||||
response = await RequestStringWithCookies(slink);
|
||||
}
|
||||
if (!response.IsRedirect)
|
||||
throw new Exception("Downlaod Failed, expected redirect");
|
||||
|
||||
var targeturi = new Uri(response.RedirectingTo);
|
||||
var id = targeturi.Segments.Last();
|
||||
var dluri = new Uri(targeturi, "/download.php?id=" + id + "&f=jackett.torrent");
|
||||
return await base.Download(dluri, RequestType.GET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -187,7 +187,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
var qRow = row.Cq();
|
||||
|
||||
var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1];
|
||||
var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1].Split('&')[0];
|
||||
release.Category = MapTrackerCatToNewznab(catStr);
|
||||
|
||||
var qLink = row.ChildElements.ElementAt(2).FirstElementChild.Cq();
|
||||
@@ -221,8 +221,9 @@ namespace Jackett.Common.Indexers
|
||||
if (imdbLink.Any())
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdbLink.Attr("href"));
|
||||
|
||||
var sizeStr = row.ChildElements.ElementAt(5).Cq().Text();
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
var sizeFileCountRowChilds = row.ChildElements.ElementAt(5).ChildElements;
|
||||
release.Size = ReleaseInfo.GetBytes(sizeFileCountRowChilds.ElementAt(0).Cq().Text());
|
||||
release.Files = ParseUtil.CoerceInt(sizeFileCountRowChilds.ElementAt(2).Cq().Text());
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()) + release.Seeders;
|
||||
|
@@ -78,6 +78,10 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
var queryCollection = new NameValueCollection();
|
||||
|
||||
// without this the API sometimes returns nothing
|
||||
queryCollection.Add("sort", "date_added");
|
||||
queryCollection.Add("limit", "50");
|
||||
|
||||
if (query.ImdbID != null)
|
||||
{
|
||||
queryCollection.Add("query_term", query.ImdbID);
|
||||
@@ -131,7 +135,11 @@ namespace Jackett.Common.Indexers
|
||||
return releases.ToArray();
|
||||
}
|
||||
|
||||
foreach (var movie_item in data_items.Value<JToken>("movies"))
|
||||
var movies = data_items.Value<JToken>("movies");
|
||||
if (movies == null)
|
||||
throw new Exception("API error, movies missing");
|
||||
|
||||
foreach (var movie_item in movies)
|
||||
{
|
||||
var torrents = movie_item.Value<JArray>("torrents");
|
||||
if (torrents == null)
|
||||
|
@@ -211,4 +211,11 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Save the compiled date so that we know if the user is running an old version of Jackett -->
|
||||
<ItemGroup>
|
||||
<AssemblyAttribute Include="Jackett.Common.Utils.BuildDateAttribute">
|
||||
<_Parameter1>$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</_Parameter1>
|
||||
</AssemblyAttribute>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -0,0 +1,20 @@
|
||||
namespace Jackett.Common.Models.IndexerConfig
|
||||
{
|
||||
|
||||
public class ConfigurationDataMyAnonamouse : ConfigurationData
|
||||
{
|
||||
public StringItem MamId { get; private set; }
|
||||
public DisplayItem MamIdHint { get; private set; }
|
||||
|
||||
public ConfigurationDataMyAnonamouse()
|
||||
{
|
||||
MamId = new StringItem { Name = "mam_id" };
|
||||
MamIdHint = new DisplayItem(
|
||||
"Go to your <a href=\"https://www.myanonamouse.net/preferences/index.php?view=security\" target=\"_blank\">security preferences</a> and create a new session for the IP used by the Jackett server. Then paste the resulting mam_id value into the mam_id field here.")
|
||||
{
|
||||
Name = "mam_id instructions"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -11,11 +11,11 @@ namespace Jackett.Common.Utils
|
||||
// When updating these make sure they are not detected by the incapsula bot detection engine (e.g. kickasstorrent indexer)
|
||||
if (System.Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
return "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
|
||||
return "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 63.0.3239.132 Safari/537.36";
|
||||
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
src/Jackett.Common/Utils/BuildDate.cs
Normal file
27
src/Jackett.Common/Utils/BuildDate.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Jackett.Common.Utils
|
||||
{
|
||||
public static class BuildDate
|
||||
{
|
||||
public static DateTime GetBuildDateTime()
|
||||
{
|
||||
Assembly commonAssembly = Assembly.GetExecutingAssembly();
|
||||
var attribute = commonAssembly.GetCustomAttribute<BuildDateAttribute>();
|
||||
return attribute?.DateTime ?? default(DateTime);
|
||||
}
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Assembly)]
|
||||
public class BuildDateAttribute : Attribute
|
||||
{
|
||||
public BuildDateAttribute(string value)
|
||||
{
|
||||
DateTime = DateTime.ParseExact(value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
||||
}
|
||||
|
||||
public DateTime DateTime { get; }
|
||||
}
|
||||
}
|
@@ -258,6 +258,24 @@ namespace Jackett.Server.Services
|
||||
logger.Error(e, "Error while checking the username");
|
||||
}
|
||||
|
||||
//Warn user that they are using an old version of Jackett
|
||||
try
|
||||
{
|
||||
DateTime compiledData = BuildDate.GetBuildDateTime();
|
||||
|
||||
if (compiledData < DateTime.Now.AddMonths(-3))
|
||||
{
|
||||
string version = configService.GetVersion();
|
||||
string notice = $"Your version of Jackett v{version} is very old. Multiple indexers are likely to fail when using an old version. Update to the latest version of Jackett.";
|
||||
_notices.Add(notice);
|
||||
logger.Error(notice);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.Error(e, "Error while checking build date of Jackett.Common");
|
||||
}
|
||||
|
||||
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
|
||||
// Load indexers
|
||||
indexerService.InitIndexers(configService.GetCardigannDefinitionsFolders());
|
||||
|
@@ -79,10 +79,10 @@ namespace Jackett.Server
|
||||
|
||||
builder.Populate(services);
|
||||
builder.RegisterModule(new JackettModule(runtimeSettings));
|
||||
builder.RegisterType<SecuityService>().As<ISecuityService>();
|
||||
builder.RegisterType<ServerService>().As<IServerService>();
|
||||
builder.RegisterType<ProtectionService>().As<IProtectionService>();
|
||||
builder.RegisterType<ServiceConfigService>().As<IServiceConfigService>();
|
||||
builder.RegisterType<SecuityService>().As<ISecuityService>().SingleInstance();
|
||||
builder.RegisterType<ServerService>().As<IServerService>().SingleInstance();
|
||||
builder.RegisterType<ProtectionService>().As<IProtectionService>().SingleInstance();
|
||||
builder.RegisterType<ServiceConfigService>().As<IServiceConfigService>().SingleInstance();
|
||||
|
||||
IContainer container = builder.Build();
|
||||
Helper.ApplicationContainer = container;
|
||||
|
Reference in New Issue
Block a user