Compare commits

...

77 Commits

Author SHA1 Message Date
kaso17
a2eb4dbdbd HDC: add indexer 2018-11-14 17:35:26 +01:00
kaso17
504573e5f5 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-11-14 16:19:32 +01:00
kaso17
81035a002a Myanonamouse: fix empty search results 2018-11-14 16:19:10 +01:00
Garfield69
0e16d8da74 cpabien: new domain 2018-11-14 08:43:07 +13:00
kaso17
6b460917ef GFXPeers: add freeleech detection 2018-11-13 12:27:18 +01:00
kaso17
9bd65ceaa2 ImmortalSeed: fix skipped first release 2018-11-13 10:28:18 +01:00
kaso17
7b5508d333 Ethor.net: make MULTI replacement configurable 2018-11-13 10:18:40 +01:00
kaso17
4ba9569a08 MyAnonamouse: fix category handling 2018-11-12 18:46:35 +01:00
kaso17
ac1fa68260 Myanonamouse: use API 2018-11-12 18:24:02 +01:00
Senan Kelly
864eb6f1cd move from apollo to orpheus (#4149)
* move from apollo to orpheus

apollo is now https://orpheus.network/
this is not tested, but I imagine the catergories are the same

* fix constructor

* Update README.md
2018-11-12 15:39:05 +01:00
kaso17
cb7acddd61 RARBG: default to all categories
fix #4146
2018-11-12 15:05:22 +01:00
kaso17
383d9ff4f8 Nordicbits: category mapping and template 7 related fixes 2018-11-12 14:45:30 +01:00
kaso17
5eb4dbe550 Anthelion: renamed from TehConnection.me 2018-11-09 17:32:31 +01:00
kaso17
10473c6bd3 SceneHD: add indexer 2018-11-09 16:29:31 +01:00
Garfield69
2ac29148af torrent9: new domain 2018-11-05 11:03:51 +13:00
Garfield69
e5682fc48e yggtorrent: new domain 2018-11-04 09:04:07 +13:00
Garfield69
f332369b53 cpabien: new domain 2018-11-04 08:51:45 +13:00
Garfield69
8a8a114723 1337x: attempt to fetch up to 100 results. resolves #4112 2018-11-03 14:56:14 +13:00
Garfield69
583d17dd36 btstornet: fix for test 2018-11-03 09:24:32 +13:00
Albvadi
751d3e8b96 hdcity: Correct torrents with no grabs yet (#4108) 2018-11-02 17:59:43 +01:00
HDVinnie
60a9008480 README: add known acronyms (#3886) 2018-11-01 16:55:00 +01:00
kaso17
e606363ee7 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-11-01 16:47:55 +01:00
kaso17
fd0c92f439 RARBG: add token renewal to download logic 2018-11-01 16:47:23 +01:00
Garfield69
10b6b08127 ilcorsaroblu: html changes 2018-11-01 13:56:44 +13:00
Garfield69
0b9a0dab5a idopeclone: new results html 2018-10-31 14:45:53 +13:00
kaso17
1c4a2cf563 Hebits: improve failed login error message 2018-10-30 15:56:22 +01:00
kaso17
a93c347672 ToTheGlory: update download selector
link changed and curl is no longer supported
2018-10-30 14:53:32 +01:00
kaso17
683ebca006 Rarbg: add torrent file download option 2018-10-30 12:26:27 +01:00
kaso17
000c57b9c1 Revert "rarbg: optional .torrent from itorrents.org resolves #4063"
This reverts commit 56b8a81248.
2018-10-30 12:08:38 +01:00
kaso17
4c6b946cf9 Shareisland: improve login error detection 2018-10-30 11:45:55 +01:00
kaso17
b3cf51172f IPTorrents: fix login 2018-10-30 11:04:41 +01:00
Garfield69
56b8a81248 rarbg: optional .torrent from itorrents.org resolves #4063 2018-10-30 19:55:12 +13:00
Garfield69
f7107bf37d Revert "rarbg: add .torrent resolves #4063"
This reverts commit ba36c9bdff.
2018-10-30 12:59:17 +13:00
Romain Lecat
c545a49755 Replace MULTI with VOSTFR added (#4093) 2018-10-30 09:14:21 +13:00
Garfield69
19ec3e2aff girotorrent: possible fix for #4092 2018-10-29 08:58:55 +13:00
Garfield69
4846ea000a katcrs: domain update 2018-10-29 08:23:42 +13:00
Alessio Gogna
a29d63e6dc Fix OMDB Key with request limit reached generates a NullReferenceException (#4058) 2018-10-28 18:34:14 +11:00
flightlevel
bd177cbf26 Make Jackett.Server services single instance 2018-10-28 18:30:26 +11:00
flightlevel
93d5acd355 Store the date a build is created 2018-10-28 18:27:10 +11:00
Jorman
7cc19212f5 Update eztv.yml (#4070)
changed domain
2018-10-26 10:10:00 +13:00
Garfield69
ba36c9bdff rarbg: add .torrent resolves #4063
via itorrents.org
2018-10-26 10:07:43 +13:00
Eric Gosselin
734fc31d8e ethor: add MULTI for multi-language torrent (#4062)
add MULTI keyword support for multi-language torrent that include French language
2018-10-25 11:27:55 +13:00
koper89
6c6d55eb63 Feature/fix for720pier (#4061)
* - Fix for 720pier.

* - Fix for size in russian.
2018-10-25 11:26:01 +13:00
Garfield69
17cabb2921 katcrs: new domain. resolves #4057 2018-10-24 09:02:33 +13:00
Jorman
b0250deee1 BigTower: remove Richiesta tag (#4048)
Some rel are request and this tag was appended to the rel name, this mod remove that tag
2018-10-22 16:28:48 +02:00
Jorman
de8adf382b more specific td selection for shareisland (#4034)
* more specific td selection for shareisland
2018-10-22 13:22:42 +13:00
Tom Dowden
c31b9d84f0 Update IPTorrents.cd (#4044)
adding extra failover URLs due to more blocking in the UK
2018-10-22 06:17:22 +13:00
kaso17
2bdf899927 HDHome: try to fix login 2018-10-21 16:07:11 +02:00
kaso17
2101ebb2de M-Team - TP: add support for disabled comments column 2018-10-21 16:02:11 +02:00
Justin Kromlinger
a92e0bef37 Update TorrentSyndikat indexer (#4042)
* TorrentSyndikat: Fix cat id retrieval
* TorrentSyndikat: Add ability to read file count, fix size retrieval
2018-10-21 07:46:27 +13:00
3744111
090ee7b093 hdtorrents-rank-freeleech (#4038)
* hdtorrents-rank-freeleech

Sets DownloadVolumeFactor based on user rank

* Update HDTorrents.cs

* Update HDTorrents.cs

* Update HDTorrents.cs

* Update HDTorrents.cs
2018-10-21 07:45:19 +13:00
flightlevel
4cd184ae72 Dxdhd: Fix invalid category 2018-10-20 21:13:44 +11:00
flightlevel
642f990862 Warn user that they are using an old version of Jackett 2018-10-20 21:09:29 +11:00
flightlevel
829347cba2 Update User-Agent 2018-10-20 20:47:18 +11:00
snamds
ca39b85cc2 Newpct - language (#4037)
* Make ReleaseInflo class derivation friendly

* -Bugfix. Language info was lost
-Classic match repaired.
2018-10-20 18:48:53 +13:00
HDVinnie
7a57e2d302 (Add) dxdhd.yml (#4039) resolves #4035
* (Add) dxdhd.yml
2018-10-20 17:53:26 +13:00
Garfield69
49de2b0a93 yggtorrent: new domain, resolves #4029 2018-10-20 06:34:38 +13:00
Garfield69
a2bd2615c1 idopeclone: new domain with improved results
.top redirects to .site
now returns seeds, files, full magnet (we used to have to build our own from the hashkey)
also added fetching 5 pages to bump results from 10 to 50
2018-10-19 16:13:14 +13:00
Garfield69
71d368689c yggtorrent: optional replace VOSTFR with ENGLISH. resolves #4023 2018-10-19 08:37:52 +13:00
Garfield69
e1515b468c TPB: fix cat 400 2018-10-18 08:12:42 +13:00
Garfield69
398f0993f4 hdtorrentsit: domain change resolves #4020 2018-10-18 06:16:09 +13:00
morpheus133
c846eb4330 Second part of correction #3997 (#4017)
- try/catch block for torrent parsing
Sonarr test button was failed because an invalid torrent.
2018-10-17 19:09:33 +13:00
Garfield69
cae6d4ed73 issue_template: self help suggestions 2018-10-17 08:06:04 +13:00
xfouloux
b286dc1c7f Update metal-iplay-ro.yml (#4012) 2018-10-16 15:46:56 +13:00
xfouloux
61a69472c5 Update metal-iplay-ro.yml (#4011)
Selector update, else it would also take the table header, leading in HTML errors too, like rockbox.

I don't get why if i use 
```
selector: tr:has(a[href^="download2.php?id="])
```

it won't work fine either
2018-10-16 15:23:45 +13:00
xfouloux
a04fc6f123 Update metal-iplay-ro.yml (#4009) domain change 2018-10-16 14:55:32 +13:00
xfouloux
86964e1cc6 Update rockbox.yml (#4010)
Need to fix the row selector by indicating the right table and the tr:has else there is still a lot of errors with the HTML because it selects the header of the table too. It was working still, but better like that.

I'm not having any html parse errors now.
2018-10-16 14:54:22 +13:00
garfield69
2d7c30dbde issue_template: suggest upgrading Jackett. 2018-10-16 10:12:41 +13:00
kaso17
5b6d1ccc7b NCore: fix test (limit=0) 2018-10-15 17:17:42 +02:00
kaso17
b9b826c34c Magico: fix selectors 2018-10-15 17:00:35 +02:00
kaso17
b33018563b YTS: fix API 2018-10-15 17:00:19 +02:00
kaso17
033070d9a9 Shareisland: add forbidden error selector 2018-10-15 16:32:11 +02:00
kaso17
8d67d1bf37 2 Fast 4 You: update URL 2018-10-15 16:31:54 +02:00
Garfield69
f9143d14e5 rockbox: fix dateparse.
see https://github.com/Jackett/Jackett/wiki/Definition-format#dateparse
2018-10-15 20:46:58 +13:00
xfouloux
a601a25652 Update rockbox.yml (#3981)
date fix and selector change on rows
2018-10-15 16:21:52 +13:00
bonny1992
6451525eb1 Normalized tv series listing for ArabaFenice (#4001)
* normalized tv series listing for ArabaFenice

* added keywordsfilter
2018-10-15 12:08:48 +13:00
Garfield69
acd1902734 nnm-club: optionally strip russian letters. #3279
was hardcoded to strip russian letters.
now optional.
default is to strip.
2018-10-15 09:14:18 +13:00
53 changed files with 1088 additions and 441 deletions

View File

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

View File

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

View File

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

View File

@@ -6,6 +6,8 @@
type: private
encoding: UTF-8
links:
- https://www.2f4y.me/
legacylinks:
- http://www.2f4y.me/
caps:

View File

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

View File

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

View File

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

View File

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

View 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"

View File

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

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://eztv.re/
legacylinks:
- https://eztv.ag/
caps:

View File

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

View File

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

View 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"

View File

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

View File

@@ -70,7 +70,6 @@
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
logintype: "username"
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:

View File

@@ -6,6 +6,8 @@
type: private
encoding: UTF-8
links:
- http://hdtorrents.xyz/
legacylinks:
- http://hdtorrents.it/
caps:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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