Compare commits

...

194 Commits

Author SHA1 Message Date
Joel Calado
fca85e6cae scenerush: update rows selector (#4277)
* Add SceneRush tracker

* Add SceneRush tracker to supported list

* rows need to have details.php link
2018-12-05 17:16:39 +01:00
Valentin Olaru
fa093778c5 Update xtremezone.yml (#4276)
New category id
2018-12-05 10:00:20 +13:00
Garfield69
e39451974c wwt new domain 2018-12-05 09:55:13 +13:00
kaso17
488e793a22 TOrrent-tuRK: add layout note. 2018-12-03 11:06:45 +01:00
kaso17
eb5875b820 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-12-03 09:49:34 +01:00
kaso17
b8f5856bac MoreThanTV: improve missing quality tag error 2018-12-03 09:49:26 +01:00
Jorman
0c9acc990d Added a possibility to show donor/vip torrent (#4265) 2018-12-03 12:15:49 +13:00
Joel Calado
723eae7792 Add SceneRush tracker (#4266)
* Add SceneRush tracker

* Add SceneRush tracker to supported list
2018-12-03 11:20:48 +13:00
Lucas
201703ecbc YggTorrent URL update (#4260) 2018-12-02 13:38:08 +01:00
kaso17
bdd62c2572 IPtorrents: improve no torrents found error 2018-12-02 10:35:26 +01:00
kaso17
74e8518060 IPTorrents: add no torrents found check 2018-12-02 10:33:18 +01:00
kaso17
bcfccd83d4 GimmePeers: add relogin 2018-12-02 09:06:40 +01:00
kaso17
c0b9bb64f8 torznab: add jackettindexer element to items 2018-12-01 21:58:06 +01:00
Diego de las Heras
7c4695604a Add Systemd install script (run as service in Linux) (#4258)
* Add Systemd install script (run as service in Linux)

* Add User and WorkingDirectory
2018-12-01 21:31:14 +01:00
Garfield69
4ef83ad215 ArenaBG: Bulgaran semi-private 0day/general tracker. resolves #3989 2018-12-02 08:29:14 +13:00
kaso17
537e25df3b The Pirate Bay: add unofficial proxy note 2018-12-01 15:58:49 +01:00
kaso17
fe4a5f82b1 Cardigann: add followredirect option to search paths 2018-12-01 14:19:50 +01:00
kaso17
a4053d914a README: add qBittorrent note 2018-12-01 13:45:17 +01:00
kaso17
c86d3fb2f3 cpasbien: update URL 2018-12-01 12:49:32 +01:00
kaso17
c3749253b7 TorrentHeaven: custom certificates no longer needed 2018-12-01 12:49:15 +01:00
kaso17
d61bda4f8b Psytorrents: add expired certificate 2018-12-01 12:48:54 +01:00
kaso17
0f839682e1 BJShare: enable IMDB search 2018-12-01 12:37:41 +01:00
kaso17
0a60686023 Cardigann: enable template system for rows selector 2018-12-01 12:12:27 +01:00
kaso17
802ddfe6ee ICE Torrent: fix date again 2018-12-01 12:11:57 +01:00
kaso17
798a6df506 YGG: update legacy URLs 2018-11-30 03:12:36 +01:00
kaso17
09cf5ee06a ICE Torrent: fix date 2018-11-29 19:32:49 +01:00
kaso17
9a4092d7a2 SpeedCD: fix login 2018-11-29 19:20:51 +01:00
kaso17
a466c87d34 Waffles: fix whitespaces in title 2018-11-29 18:55:58 +01:00
Lucas
45327e642e Update tracker's URL (#4222) 2018-11-28 09:03:58 +13:00
Garfield69
4a393cb244 ilcorsaronero: new domain and CA 2018-11-28 08:34:46 +13:00
Garfield69
13c7f18024 magnetdl: forcing https 2018-11-27 08:28:24 +13:00
morpheus133
89eeee5939 Correction for #4199 (#4206)
After the last page a new link was appeared for premium action.
Now it will not parsed as page link
2018-11-23 12:01:39 +13:00
Garfield69
e7d52575ad eztv: follow redirect plus new domain 2018-11-23 07:42:42 +13:00
Garfield69
80371f7666 gktorrent: follow redirect plus new domain 2018-11-23 07:40:04 +13:00
baberone
cff056c71b torrent9 clone (torrrent9.ch): add indexer (#4196)
* Alternative for torrent9.ph

* Update README.md

Added torrent 9 .ch alternative

* torrent9.ch: cleanup

* rename

* Update README.md
2018-11-21 15:02:45 +01:00
lilp
54663f51dd cpabien: add .net domain to legacy URLs (#4193) 2018-11-20 15:04:27 +01:00
kaso17
1a31c23602 YGGtorrent: enable followredirect 2018-11-19 14:10:12 +01:00
kaso17
1e5a6c16e5 torrent9: enable followredirect 2018-11-19 14:09:58 +01:00
kaso17
1dbb4ccea4 cpasbien: update site link and enable follow redirect 2018-11-19 14:09:34 +01:00
kaso17
84d3ebbc87 Cardigann: introduce follow redirect option 2018-11-19 14:05:46 +01:00
kaso17
6489dd99a5 Redtopia: improve error detection 2018-11-19 12:09:48 +01:00
kaso17
7868798857 Blutopia: improve error detection 2018-11-19 12:09:36 +01:00
snamds
03e9ffc9ac Newpct: Movies search added (#4186)
* Make ReleaseInflo class derivation friendly

* Sitelink was not correctly updated

* Preparation

* Movies search added
2018-11-19 11:50:24 +01:00
Garfield69
3858604b79 gktorrent: domain changed 2018-11-19 07:23:05 +13:00
Garfield69
cc2d607ce6 demonoid: gone 2018-11-18 16:29:11 +13:00
Garfield69
9f56be5500 extratorrentclone: gone. 2018-11-18 16:23:48 +13:00
Garfield69
b3d40d1f6f cpabien: domain change 2018-11-17 06:24:47 +13:00
kaso17
9f44ab5d8f HDC: insert GERMAN tag for TvR releases 2018-11-16 17:30:47 +01:00
kaso17
b02a1d01a9 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-11-16 16:51:58 +01:00
kaso17
de114b55b3 HDC: inject german tag for HDC releases 2018-11-16 16:51:42 +01:00
kaso17
487d746f66 WiHD: rewrite/fix indexer
fix #3085, #1698, #2814
2018-11-16 16:51:00 +01:00
Garfield69
4febfc04a9 cpabien: back to https://www.cpabien.io/ domain!! 2018-11-16 07:59:17 +13:00
kaso17
9b867c5949 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-11-15 16:20:49 +01:00
kaso17
50bf9acb4e x264: removed (dead)
https://www.reddit.com/r/trackers/comments/9op98w/x264_is_officially_gone/
2018-11-15 16:20:39 +01:00
Garfield69
dabf592acb yggtorrent: domain chaned. resolves #4164 2018-11-15 12:59:17 +13:00
Garfield69
3f2c2c59b1 katcrs: new domain 2018-11-15 07:33:00 +13:00
kaso17
0212d2f4f4 HDC: cleanup 2018-11-14 18:05:01 +01:00
aurelien
6c1dcd1a7d manage Microsoft logs by NLog (#4080)
* now Microsoft log (Microsoft.*) are correctly supported by Nlog

* Microsoft log are now not logged under level info if tracing is not enabled.

* remove unused prefix NLog.

* Revert "Microsoft log are now not logged under level info if tracing is not enabled."

This reverts commit 00e94204e0.

* microsoft logs in console are preserved.
Only service log is clean of microsoft logs when tracing is not enabled.

* change loglevel min to debug

* Microsoft logs can be reactivate when Enhanced logging is set to true.

* adjust min & max level of serviceMicrosoftRule

* clean Microsoft logs in all NLog targets
2018-11-14 17:52:56 +01:00
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
Garfield69
9d68ca86da ilcorsaronero: domain change and fix for invalid CA. #3968 2018-10-14 20:07:08 +13:00
Garfield69
5b9165cd2f nnm-club: bypass invalid CA 2018-10-14 12:44:01 +13:00
LuisMi
8a48874b42 Add definition for EliteTorrent.biz (#3990) resolves #1293 2018-10-14 10:17:12 +13:00
Garfield69
b0132da030 ilcorsaroblu: adjustments for their recent changes 2018-10-14 08:23:08 +13:00
3744111
175d7f5379 hdtorrent-uploader-support (#3985)
Adds support for higher user classes like uploader
2018-10-13 18:10:46 +13:00
Garfield69
dc8023afe1 prostylex: public 0day and general tracker. resolves #3966 2018-10-12 21:15:08 +13:00
xfouloux
d956872d95 Rockbox: back to semi-private (#3975) 2018-10-12 17:15:19 +13:00
Garfield69
35defc04e0 katcrs: domain change. resolves #3965 2018-10-12 17:01:57 +13:00
garfield69
a2f5e5a5aa rockbox is semi-private 2018-10-12 16:56:09 +13:00
garfield69
ec5a8e6e33 Romanian Metal Torrent 2018-10-12 16:44:17 +13:00
xfouloux
f00aa5faca metaliplayro: Romanian Metal Torrent, a private music tracker (#3963) resolves #2587 2018-10-12 16:43:16 +13:00
Garfield69
51ece1726c ilcorsaroblu: #3970
they have been playing with the search page, and appear to have dropped the size field.
now defaulting to 500MB unless it pops up again
2018-10-12 11:43:22 +13:00
Garfield69
579190b4bd RockBox: public heavy metal music tracker. resolves #3009 2018-10-12 10:31:18 +13:00
xfouloux
fd4d8d490a Create rockbox.yml (#3964)
#3009
2018-10-12 10:08:33 +13:00
Garfield69
e2fe43b3a7 horriblesubs: cleanup plus ensure guid is always created 2018-10-12 09:47:07 +13:00
Gerdus van Zyl
bedde1a3db Fix for #3957 (#3967)
* Initial Version

* Episode number filtering

* fix for issue #3957
handle case where result has no torrent file link
2018-10-12 06:55:30 +13:00
xfouloux
da638ad712 Update yts.cs (#3962) resolves #3182
add [YTS] in front of movie name
2018-10-11 15:40:59 +13:00
CodeMonkey
10ae5e9d5d Make sure release title contains "[HorribleSubs]" (#3947)
* This is needed for things like configuring tag restrictions in Sonarr
2018-10-10 08:01:25 +13:00
Garfield69
71749ba8db Merge branch 'master' of https://github.com/Jackett/Jackett 2018-10-10 07:59:54 +13:00
Garfield69
4373c38869 yts: yes, the domain changed back to .am again. resolves #3948 2018-10-10 07:59:47 +13:00
morpheus133
2a17783a9c - Add pagination support for ncore (#3943)
- Correct handling of Descriptions
- Add hun tag to torrent title if it contains hungarian audio but not visible in title
2018-10-10 06:30:00 +13:00
Jorman
a184ad4d7c Fix some rows for ilcorsaroblu (#3942) 2018-10-10 06:29:08 +13:00
Garfield69
acc1e7e65a gktorremt: they are forcing to https 2018-10-09 15:22:37 +13:00
Garfield69
95ffd0caa3 btdb: fix test #3851 2018-10-09 15:19:39 +13:00
Garfield69
b0e788788f cpabien: domain changed again 2018-10-09 15:14:16 +13:00
Garfield69
80f0c1b7da yggtorrent: domain change. resolves #3935 2018-10-08 20:59:52 +13:00
Garfield69
7abdd0d817 resolve #3914
sites that don't provide seeders now default to 1 instead of 999
2018-10-08 15:37:25 +13:00
Garfield69
736330bea3 torrentcouch: new domain. resolves #3924 2018-10-07 07:09:55 +13:00
Garfield69
accd06d291 YTS: domain back to yts.ag. resolves #3908 2018-10-06 10:16:49 +13:00
Garfield69
fed8294ae0 gktorrent: domain changed. resolves #3912 2018-10-06 06:17:54 +13:00
Garfield69
1093355e77 Revert "mteamtp: selector mods. possible solve for #3907"
This reverts commit 4f96f437ad.
2018-10-05 11:05:07 +13:00
Garfield69
aae73741e8 Revert "mteamtp: selector order out by one. possible resolve for #3907"
This reverts commit 17002a6ede.
2018-10-05 11:04:55 +13:00
Garfield69
17002a6ede mteamtp: selector order out by one. possible resolve for #3907 2018-10-05 10:00:39 +13:00
Garfield69
4f96f437ad mteamtp: selector mods. possible solve for #3907 2018-10-05 09:10:28 +13:00
Garfield69
335ea77e9e tehconnectionme: new domain. resolves #3904 2018-10-05 06:54:39 +13:00
Garfield69
41a4dc2922 audiobookbay: fix details and add banner #3160 2018-10-04 15:20:21 +13:00
Garfield69
ee1d7a7625 audiobookbay: add size, category, date, and try to grap 35 results. #3160 2018-10-04 09:33:23 +13:00
Jorman
e9aa0edc37 Update certificate key (#3895) resolves #3892 2018-10-04 06:53:54 +13:00
Garfield69
e64d7ea947 katcrs: domain change. 2018-10-03 11:43:20 +13:00
Garfield69
8eb0415aaf gktorrent: domain changed. fix #3888 2018-10-03 06:51:04 +13:00
HDVinnie
ef20198a4f (Update) racing4everyone.yml (#3883)
- add Global Double Upload
- add translations
- all credit to @garfield69
2018-09-30 06:47:33 +13:00
HDVinnie
6c6d379002 (Update) btxpress.yml (#3882)
- add Global Double Upload
- add translations
- all credit to @garfield69
2018-09-30 06:47:02 +13:00
HDVinnie
7c2a343629 (Update) redtopia.yml (#3881)
- add translations
- all credit to @garfield69
2018-09-30 06:46:35 +13:00
HDVinnie
ea2e88d6bb (Update) blutopia.yml (#3880)
* (Update) blutopia.yml

- add translations
- all credit to @garfield69

* (Fix) Typo
2018-09-30 06:45:43 +13:00
HDVinnie
abaf909ef1 (Update) blutopia.yml (#3879)
- add Global Double Upload
2018-09-30 06:44:30 +13:00
Garfield69
74054523c5 torrentheaven: domain change. resolves #3870 #3867 2018-09-29 21:22:37 +12:00
Garfield69
37daacf9fa hd4free: translations for date field. resolves #3878 2018-09-29 20:58:20 +12:00
eybox
b58dc51f8d Adding Audio/Music support to the tracker Zamunda.net (#3875)
* Adding Audio/Music support to the tracker

So far it has had only Movies and TV shows, but now I'm also adding Audio/Music support for this tracker

* Update zamundanet.yml
2018-09-27 22:27:58 +12:00
Garfield69
6c661a4974 rarbg: bump delay between http requests from 2.0 to 2.1
to satisfy the api 1req/2s limit.
2018-09-27 15:12:33 +12:00
xfouloux
7a49ddda3a Update yggtorrent.yml to ADD MULTI.ENGLISH (#3874)
* Update yggtorrent.yml to ADD MULTI.ENGLISH

Add the MULTI.ENGLISH option in rewrite MULTI

* fix

removed the comma
2018-09-27 13:24:03 +12:00
Garfield69
5e4cb3581d bt-scene: gone.
if it shows up again we can always add it back.
2018-09-26 20:08:47 +12:00
Garfield69
968c2ca3a6 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-26 07:57:44 +12:00
Garfield69
af4fb5c6a0 katcrs: andmatch 2018-09-26 07:57:42 +12:00
Justin Kromlinger
fc7d5a0e35 Update definition for bittorrentfiles.me (#3864) 2018-09-26 07:25:21 +12:00
Garfield69
2a7c693917 possible solve for #3846 part2
make category selector more generic
2018-09-26 07:22:19 +12:00
Garfield69
838ad77d7f magico: possible solve for #3846 2018-09-25 18:27:13 +12:00
Garfield69
3978ba6c04 zooqle: add a missing category 2018-09-25 16:42:29 +12:00
Garfield69
60554c25d9 Merge branch 'master' of https://github.com/Jackett/Jackett 2018-09-25 14:09:31 +12:00
Garfield69
bd03c903d0 horriblesubs: fix #3841 generate a Guid. 2018-09-25 14:09:27 +12:00
100 changed files with 2920 additions and 3150 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

@@ -9,7 +9,7 @@
This project is a new fork and is recruiting development help. If you are able to help out please contact us.
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Jackett works as a proxy server: it translates queries from apps ([Sonarr](https://github.com/Sonarr/Sonarr), [Radarr](https://github.com/Radarr/Radarr), [SickRage](https://sickrage.github.io/), [CouchPotato](https://couchpota.to/), [Mylar](https://github.com/evilhero/mylar), [DuckieTV](https://github.com/SchizoDuckie/DuckieTV), [qBittorrent](https://www.qbittorrent.org/), etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.
Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs.
@@ -28,11 +28,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* BTstor.net
* btbit
* BTDB
* BT-Scene
* cpasbien
* ETTV
* EliteTorrent.biz
* ExtraTorrent.ag
* ExtraTorrentClone
* EZTV
* Frozen Layer
* GkTorrent
@@ -51,6 +50,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Nyaa.si
* Nyaa-Pantsu
* Nyoo
* ProStyleX
* RARBG
* RuTor
* ShowRSS
@@ -65,6 +65,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torrent Downloads
* TorrentGalaxy.org
* Torrent9
* Torernt9 clone (torrents9.ch)
* Torrentz2
* World Wide Torrents
* YTS.ag
@@ -72,6 +73,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
### Supported Semi-Private Trackers
* 7tor
* ArenaBG
* CzTorrent
* Deildu
* Gay-Torrents.net
@@ -85,6 +87,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Newstudio
* NetHD
* NoName Club
* RockBox
* RuTracker
* SkTorrent
* Union Fansub
@@ -98,23 +101,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
@@ -128,65 +131,65 @@ 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
* Demonoid
* Diablo Torrent
* DigitalHive
* 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
@@ -199,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
@@ -240,8 +244,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* RevolutionTT
* RGU
* RoDVD
* Romanian Metal Torrent
* SceneFZ
* SceneHD
* SceneReactor
* SceneRush
* SceneTime
* SDBits
* Secret Cinema
@@ -257,15 +264,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
@@ -281,9 +287,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
@@ -297,9 +303,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Ultimate Gamer Club
* Waffles
* World-In-HD
* WorldOfP2P
* x-ite.me
* x264
* WorldOfP2P (WOP)
* x-ite.me (XM)
* xBytesV2
* XSpeeds
* Xthor
@@ -349,6 +354,14 @@ If you want to run it with a user without a /home directory you need to add `Env
Mono must be compiled with the Roslyn compiler (default), using MCS will cause "An error has occurred." errors (See https://github.com/Jackett/Jackett/issues/2704).
### Install as service
1. Install Jackett with the steps from above.
2. Open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service.
2. If the installation was a success, you can close the Terminal window.
The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`.
Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
### Installation on Linux via Ansible
On a RHEL/Centos 7 system: [linuxhq.jackett](https://galaxy.ansible.com/linuxhq/jackett)

0
install_service_macos Normal file → Executable file
View File

79
install_service_systemd.sh Executable file
View File

@@ -0,0 +1,79 @@
#!/bin/bash
#Setting up colors
BOLDRED="$(printf '\033[1;31m')"
BOLDGREEN="$(printf '\033[1;32m')"
NC="$(printf '\033[0m')" # No Color
# Stop and unload the service if it's running
jackettservice="jackett.service"
systemctl stop ${jackettservice}
# Move working directory to Jackett's
cd "$(dirname "$0")"
# Check if we're running from Jackett's directory
if [ ! -f ./JackettConsole.exe ]; then
echo "${BOLDRED}ERROR${NC}: Couldn't locate JackettConsole.exe. Is the script in the right directory?"
exit 1
fi
jackettdir="$(pwd)"
# Check if Jackett's owner is root
jackettuser="$(stat -c "%U" ./JackettConsole.exe)"
if [ "${jackettuser}" == "root" ]; then
echo "${BOLDRED}ERROR${NC}: Jackett shouldn't run as root. Please, change the owner of the Jackett directory."
exit 1
fi
# Check if mono is installed
command -v mono >/dev/null 2>&1 || { echo >&2 "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed. Aborting."; exit 1; }
monodir="$(dirname $(command -v mono))"
# Check that no other service called Jackett is already running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
exit 1
fi
# Write the systemd service descriptor
cat >"/etc/systemd/system/${jackettservice}" <<EOL
[Unit]
Description=Jackett Daemon
After=network.target
[Service]
SyslogIdentifier=jackett
Restart=always
RestartSec=5
Type=simple
User=${jackettuser}
Group=${jackettuser}
WorkingDirectory=${jackettdir}
ExecStart=${monodir}/mono --debug ${jackettdir}/JackettConsole.exe --NoRestart
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target
EOL
# Reload systemd daemon
systemctl daemon-reload
# Run the service
systemctl start ${jackettservice}
# Check that it's running
if [[ $(systemctl status ${jackettservice} | grep "active (running)") ]]; then
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
else
cat << EOL
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
Mono directory: \`${monodir}\`
Jackett directory: \`${jackettdir}\`
Jackett user: \`${jackettuser}\`
EOL
fi

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

@@ -135,22 +135,22 @@
selector: a[href^="/download.php"]
attribute: href
files:
selector: td:nth-child(7)
selector: td:nth-child(5)
grabs:
selector: td:nth-child(6)
selector: td:nth-child(4)
size:
selector: td:nth-child(8)
selector: td:nth-child(6)
filters:
- name: replace
args: [".", ""]
- name: replace
args: [",", "."]
seeders:
selector: td:nth-child(3) > a
selector: td:nth-child(2) > a
leechers:
selector: td:nth-child(4)
selector: td:nth-child(3)
date:
selector: td:nth-child(9)
selector: td:nth-child(10)
filters:
- name: split
args: ["by", 0]

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

@@ -0,0 +1,163 @@
---
site: arenabg
name: ArenaBG
description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL"
language: bg-BG
type: semi-private
encoding: UTF-8
links:
- https://arenabg.com/
caps:
categorymappings:
- {id: "movies", cat: Movies, desc: "Movies"}
- {id: "arenabgtv", cat: Movies, desc: "Movies / ArenaBG.TV"}
- {id: "xvid", cat: Movies, desc: "Movies / XviD"}
- {id: "dvd-r", cat: Movies, desc: "Movies / DVD-R"}
- {id: "x264", cat: Movies, desc: "Movies / x264"}
- {id: "animemanga", cat: Movies, desc: "Movies / Anime &amp; Manga"}
- {id: "documentaries", cat: Movies, desc: "Movies / Documentaries"}
- {id: "blu-ray", cat: Movies, desc: "Movies / Blu-ray"}
- {id: "boxset", cat: Movies, desc: "Movies / Boxset"}
- {id: "x264boxset", cat: Movies, desc: "Movies / x264 Boxset"}
- {id: "tvepisodeshd", cat: Movies, desc: "Movies / HDTV"}
- {id: "3d", cat: Movies, desc: "Movies / 3D"}
- {id: "movies-hd", cat: Movies, desc: "Movies / Movies HD"}
- {id: "x265", cat: Movies, desc: "Movies / x265"}
- {id: "series", cat: TV, desc: "Series"}
- {id: "hdtv", cat: TV, desc: "Series / TV Episodes HD"}
- {id: "tvepisodes", cat: TV, desc: "Series / TV Episodes"}
- {id: "tvboxset", cat: TV, desc: "Series / TV Boxset"}
- {id: "tvboxsethd", cat: TV, desc: "Series / TV Boxset HD"}
- {id: "music", cat: Audio, desc: "Music"}
- {id: "mp3", cat: Audio, desc: "Music / MP3"}
- {id: "music-video", cat: Audio, desc: "Music / Video"}
- {id: "flac", cat: Audio, desc: "Music / FLAC"}
- {id: "music-dvd", cat: Audio, desc: "Music / DVD"}
- {id: "music-ape", cat: Audio, desc: "Music / APE"}
- {id: "music-dts", cat: Audio, desc: "Music / DTS"}
- {id: "musicwavpack", cat: Audio, desc: "Music / WavePack"}
- {id: "musicost", cat: Audio, desc: "Music / OST"}
- {id: "games", cat: PC, desc: "Games"}
- {id: "games-iso", cat: PC, desc: "Games / PC ISO"}
- {id: "pc-rip", cat: PC, desc: "Games / PC RIP"}
- {id: "ps2", cat: Console, desc: "Games / PS2"}
- {id: "psp", cat: Console, desc: "Games / PSP"}
- {id: "xbox", cat: Console, desc: "Games / XBOX"}
- {id: "xbox-360", cat: Console, desc: "Games / XBOX-360"}
- {id: "ps3", cat: Console, desc: "Games / PS3"}
- {id: "wii", cat: Console, desc: "Games / WII"}
- {id: "PS4", cat: Console, desc: "Games / PS4"}
- {id: "software", cat: PC, desc: "Software"}
- {id: "pc-iso", cat: PC, desc: "Software / PC ISO"}
- {id: "pdasmartphone", cat: PC, desc: "Software / Smartphone"}
- {id: "tutorial", cat: PC, desc: "Software / Tutorial"}
- {id: "android", cat: PC, desc: "Software / Android"}
- {id: "ios", cat: PC, desc: "Software / iOS"}
- {id: "misc", cat: Other, desc: "Misc"}
- {id: "other", cat: Other, desc: "Misc / Other"}
- {id: "e-books", cat: Other, desc: "Misc / e-Books"}
- {id: "sports", cat: Other, desc: "Misc / Sports"}
- {id: "0-day", cat: Other, desc: "Misc / 0-Day"}
- {id: "xxx", cat: XXX, desc: "XXX"}
- {id: "porn", cat: XXX, desc: "XXX / Porn"}
- {id: "xxx-hd", cat: XXX, desc: "XXX / XXX HD"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: /
method: form
form: form[action="/users/"]
inputs:
email: "{{ .Config.username }}"
password: "{{ .Config.password }}"
action: login
error:
- selector: div.row div div.alert i.fa-warning
message:
selector: div.row div div.alert
test:
path: /
selector: a[href="/users/logout/"]
download:
selector: a[href^="magnet:?"]
search:
paths:
- path: /torrents/
method: post
followredirect: true
inputs:
text: "{{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}"
"text_mobile": ""
type: 0
audio: 0
subtitles: 0
action: search
rows:
selector: tr:has(td.category)
fields:
title:
# use the second div for full title
selector: td.filename div:nth-child(2) a
details:
selector: td.filename div a
attribute: href
category:
selector: td.category a
attribute: href
filters:
- name: re_replace
args: ["/torrents/type:(.+?)/", "$1"]
download:
selector: td.filename div a
attribute: href
size:
selector: td:nth-child(4)
date:
# 08:49:09
selector: td:nth-child(3):has(":")
optional: true
filters:
- name: dateparse
args: "15:04:05"
date:
# 2018-10-19
selector: td:nth-child(3):has("-")
optional: true
filters:
- name: dateparse
args: "2006-01-02"
seeders:
selector: td:nth-child(6)
filters:
- name: replace
args: ["-", "0"]
- name: replace
args: ["DHT", "0"] # torrent can only be downloaded via DHT
leechers:
selector: td:nth-child(7)
filters:
- name: replace
args: ["-", "0"]
grabs:
selector: td:nth-child(8)
filters:
- name: replace
args: ["-", "0"]
banner:
selector: td.filename div:nth-child(2) a
attribute: onmouseover
filters:
- name: regexp
args: src=\\'([^\s\\]+)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -12,23 +12,23 @@
caps:
categorymappings:
- {id: Children, cat: Audio/Audiobook, desc: "Children"}
- {id: Teen & Young Adult, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
- {id: Teen, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
- {id: Adults, cat: Audio/Audiobook, desc: "Adults"}
- {id: The Undead, cat: Audio/Audiobook, desc: "The Undead"}
- {id: The, cat: Audio/Audiobook, desc: "The Undead"}
- {id: Action, cat: Audio/Audiobook, desc: "Action"}
- {id: Adventure, cat: Audio/Audiobook, desc: "Adventure"}
- {id: Art, cat: Audio/Audiobook, desc: "Art"}
- {id: Autobiography & Biographies, cat: Audio/Audiobook, desc: "Autobiography & Biographies"}
- {id: Autobiography, cat: Audio/Audiobook, desc: "Autobiography & Biographies"}
- {id: Business, cat: Audio/Audiobook, desc: "Business"}
- {id: Computer, cat: Audio/Audiobook, desc: "Computer"}
- {id: Contemporary, cat: Audio/Audiobook, desc: "Contemporary"}
- {id: Crime, cat: Audio/Audiobook, desc: "Crime"}
- {id: Detective, cat: Audio/Audiobook, desc: "Detective"}
- {id: Doctor Who, cat: Audio/Audiobook, desc: "Doctor Who"}
- {id: Doctor, cat: Audio/Audiobook, desc: "Doctor Who"}
- {id: Education, cat: Audio/Audiobook, desc: "Education"}
- {id: Fantasy, cat: Audio/Audiobook, desc: "Fantasy"}
- {id: General Fiction, cat: Audio/Audiobook, desc: "General Fiction"}
- {id: Historical Fiction, cat: Audio/Audiobook, desc: "Historical Fiction"}
- {id: General, cat: Audio/Audiobook, desc: "General Fiction"}
- {id: Historical, cat: Audio/Audiobook, desc: "Historical Fiction"}
- {id: History, cat: Audio/Audiobook, desc: "History"}
- {id: Horror, cat: Audio/Audiobook, desc: "Horror"}
- {id: Humor, cat: Audio/Audiobook, desc: "Humor"}
@@ -36,39 +36,39 @@
- {id: LGBT, cat: Audio/Audiobook, desc: "LGBT"}
- {id: Literature, cat: Audio/Audiobook, desc: "Literature"}
- {id: LitRPG, cat: Audio/Audiobook, desc: "LitRPG"}
- {id: Misc. Non-fiction, cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
- {id: Misc., cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
- {id: Mystery, cat: Audio/Audiobook, desc: "Mystery"}
- {id: Myth Hunting, cat: Audio/Audiobook, desc: "Myth Hunting"}
- {id: Myth, cat: Audio/Audiobook, desc: "Myth Hunting"}
- {id: Paranormal, cat: Audio/Audiobook, desc: "Paranormal"}
- {id: Plays & Theater, cat: Audio/Audiobook, desc: "Plays & Theater"}
- {id: Plays, cat: Audio/Audiobook, desc: "Plays & Theater"}
- {id: Poetry, cat: Audio/Audiobook, desc: "Poetry"}
- {id: Political, cat: Audio/Audiobook, desc: "Political"}
- {id: Postapocalyptic, cat: Audio/Audiobook, desc: "Postapocalyptic"}
- {id: Radio Productions, cat: Audio/Audiobook, desc: "Radio Productions"}
- {id: Radio, cat: Audio/Audiobook, desc: "Radio Productions"}
- {id: Romance, cat: Audio/Audiobook, desc: "Romance"}
- {id: Sci-Fi, cat: Audio/Audiobook, desc: "Sci-Fi"}
- {id: Science, cat: Audio/Audiobook, desc: "Science"}
- {id: Self-help, cat: Audio/Audiobook, desc: "Self-help"}
- {id: SHTF, cat: Audio/Audiobook, desc: "SHTF"}
- {id: Spiritual & Religious, cat: Audio/Audiobook, desc: "Spiritual & Religious"}
- {id: Spiritual, cat: Audio/Audiobook, desc: "Spiritual & Religious"}
- {id: Sports, cat: Audio/Audiobook, desc: "Sports"}
- {id: Suspense, cat: Audio/Audiobook, desc: "Suspense"}
- {id: Thriller, cat: Audio/Audiobook, desc: "Thriller"}
- {id: True Crime, cat: Audio/Audiobook, desc: "True Crime"}
- {id: True, cat: Audio/Audiobook, desc: "True Crime"}
- {id: Tutorial, cat: Audio/Audiobook, desc: "Tutorial"}
- {id: Westerns, cat: Audio/Audiobook, desc: "Westerns"}
- {id: Anthology, cat: Audio/Audiobook, desc: "Anthology"}
- {id: Bestsellers, cat: Audio/Audiobook, desc: "Bestsellers"}
- {id: Classic, cat: Audio/Audiobook, desc: "Classic"}
- {id: Documentary, cat: Audio/Audiobook, desc: "Documentary"}
- {id: Full Cast, cat: Audio/Audiobook, desc: "Full Cast"}
- {id: Full, cat: Audio/Audiobook, desc: "Full Cast"}
- {id: Libertarian, cat: Audio/Audiobook, desc: "Libertarian"}
- {id: Military, cat: Audio/Audiobook, desc: "Military"}
- {id: Novel, cat: Audio/Audiobook, desc: "Novel"}
- {id: Short Story, cat: Audio/Audiobook, desc: "Short Story"}
- {id: Short, cat: Audio/Audiobook, desc: "Short Story"}
modes:
search: [s]
search: [q]
login:
path: https://audiobookbay.nl/member/login.php
@@ -90,17 +90,43 @@
search:
paths:
# show members page if no search parameters
- path: /
inputs:
"s": "{{ .Keywords }}"
# with just 7 results per page, try to grab up to 35 results
# http://audiobookbay.nl/?s=teeth
# http://audiobookbay.nl/page/2/?s=teeth
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/5/?s={{ .Keywords}}{{else}}{{end}}"
rows:
selector: div.post
selector: div.post:has(div[class="postTitle"])
fields:
title:
selector: div.postTitle
details:
selector: div.postTitle
selector: div.postTitle h2 a
attribute: href
download:
selector: a[href^="/audio-books/"]
attribute: href
banner:
optional: true
selector: img
attribute: src
category:
selector: div.postInfo
filters:
- name: regexp
args: "Category: (.+?)\\s"
date:
selector: div.postContent p:contains("Posted:")
filters:
- name: regexp
args: "Posted: (.+?)Format:"
- name: dateparse
args: "2 Jan 2006"
size:
selector: div.postContent p:contains("File Size:")
filters:
- name: regexp
args: "File Size: (.+?)s"

View File

@@ -1,4 +1,4 @@
---
---
site: bigtower
name: BigTower
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
@@ -70,12 +70,23 @@
- {id: 74, cat: Books/Comics, desc: "Manga"}
- {id: 87, cat: Books, desc: "Giornali"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: donor
type: checkbox
label: Show donor torrent? (Enable if you're a donor)
default: false
login:
path: index.php?page=login
method: post
@@ -98,7 +109,7 @@
options: "0"
active: "0"
rows:
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]){{if .Config.donor }}{{else}}:not(:has(img[src*="keditbookmarks.png"])){{end}}
fields:
download:
selector: a[href^="index.php?page=torrent-details&id="]
@@ -108,6 +119,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

@@ -26,7 +26,7 @@
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Login Failed!")
- selector: form[action*="/login"] .text-red
test:
path: /torrents
@@ -74,12 +74,37 @@
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"
"i[data-original-title=\"Global FreeLeech\"]": "0"
"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"
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"

View File

@@ -1,94 +0,0 @@
---
site: bt-scene
name: BT-Scene
description: "BT-Scene (BTS) is a Public site for MOVIES / TV / GENERAL"
language: us-en
type: public
encoding: UTF-8
links:
- https://bt-scene.cc/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "Series"}
- {id: 3, cat: Audio, desc: "Music"}
- {id: 4, cat: PC/Games, desc: "Games"}
- {id: 5, cat: PC/0day, desc: "Software"}
- {id: 6, cat: TV/Anime, desc: "Anime"}
- {id: 7, cat: Books, desc: "Ebooks"}
- {id: 8, cat: Other, desc: "Misc"}
- {id: 9, cat: XXX, desc: "Porn"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: category
type: select
label: Category
default: "0"
options:
"0" : "All"
"1": "Movies"
"2": "Series"
"3": "Music"
"4": "Games"
"5": "Software"
"6": "Anime"
"7": "Ebooks"
"8": "Misc"
"9": "Porn"
search:
# https://bt-scene.cc/cat/id/1/
# https://bt-scene.cc/results_.php?q=midnight+texas+s01e10&advcat=2
keywordsfilters:
# replace space between keywords with +
- name: re_replace
args: [" ", "+"]
paths:
- path: "{{ if .Keywords }}results_.php?q={{ .Keywords }}&advcat={{ .Config.category }}{{else}}indexfull/{{end}}"
rows:
selector: table.tor > tbody > tr[id^="_"]
filters:
- name: andmatch
fields:
title:
selector: td[class^="tname"] > a
details:
selector: td[class^="tname"] > a
attribute: href
category:
selector: td[class^="tname"] > div.subinfo > a[href^="/cat/id"]
optional: true
attribute: href
filters:
- name: re_replace
args: ["[^\\d+]", ""]
download:
# build "/torrentget.php?id=5730447" from "_5730447"
selector: tr
attribute: id
filters:
- name: replace
args: ["_", ""]
- name: prepend
args: "/torrentget.php?id="
size:
selector: td[class^="tsize"]
seeders:
selector: td[class^="tseeds"]
leechers:
selector: td[class^="tpeers"]
date:
selector: td[class^="ttime"]
filters:
- name: append
args: " ago"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -54,9 +54,9 @@
grabs:
selector: .sbar span:nth-of-type(6) b
seeders:
text: "999"
text: "1"
leechers:
text: "999"
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -25,7 +25,7 @@
search:
paths:
- path: "{{if .Keywords}}q/{{ .Keywords}}/?sort=time{{else}}recent{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/?sort=time{{else}}q/test/{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/2?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/3?sort=time{{else}}{{end}}"
- path: "{{if .Keywords}}q/{{ .Keywords}}/4?sort=time{{else}}{{end}}"

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

@@ -73,12 +73,37 @@
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"
"i[data-original-title=\"Global FreeLeech\"]": "0"
"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"
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"

View File

@@ -5,8 +5,9 @@
language: fr-fr
type: public
encoding: UTF-8
followredirect: true
links:
- https://ww1.cpabien.io/
- https://www.cpasbien.blue/
legacylinks:
- http://www.cpasbiens.cc/
- http://www.cpabien.cm/
@@ -22,6 +23,12 @@
- http://cpabien.la/
- http://cpabien.club/
- http://www.cpabien.io/
- https://ww1.cpabien.io/
- https://wvw.cpabien.cm/
- https://www.cpabien.io/
- https://www.cpabien.cx/
- https://www.cpabien9.net/
- https://wwv.cpabien.cm/
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

@@ -0,0 +1,75 @@
---
site: elitetorrent-biz
name: EliteTorrent.biz
description: "EliteTorrent.biz is a Public torrent site for TV, movies and documentaries"
language: es-es
type: public
encoding: UTF-8
links:
- https://www.elitetorrent.biz/
caps:
categories:
"series": TV
"peliculas": Movies
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
download:
selector: a[href^="magnet:?"]
attribute: href
search:
path: index.php
keywordsfilters:
# most ES/ITA TV torrents are in XXxYY format, so we search without S/E prefixes and filter later
- name: re_replace
args: ["S0?(\\d{1,2})", " $1 "]
- name: re_replace
args: ["E(\\d{2,3})", " $1 "]
inputs:
s: "{{ .Keywords }}"
$raw: "&x=0&y=0"
rows:
selector: "#principal .miniboxs-ficha li"
fields:
title:
selector: .meta a
# normalize to SXXEYY format
filters:
- name: re_replace
args: ["(\\d{2})×(\\d{2})", "S$1E$2"]
- name: re_replace
args: ["(\\d{1})×(\\d{2})", "S0$1E$2"]
details:
selector: .meta a
attribute: href
download:
selector: .meta a
attribute: href
category:
selector: .meta a
attribute: href
filters:
- name: split
args: ["/", 3]
size:
selector: .voto1
filters:
- name: replace
args: ["s", ""]
date:
text: now
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "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

@@ -1,981 +0,0 @@
---
site: extratorrentclone
name: ExtraTorrentClone
description: "ExtraTorrentClone is a Public tracker, a popular alternative to the original ET site, providing Movie / TV / General magnets"
language: en-us
type: public
encoding: UTF-8
links:
- https://geetorrent.com/
legacylinks:
- https://eltorrents.com/
caps:
categorymappings:
#Anime
- {id: 1, cat: TV/Anime, desc: "Anime"}
- {id: 963, cat: TV/Anime, desc: "Anime - Absolute Duo"}
- {id: 951, cat: TV/Anime, desc: "Anime - Akame ga Kill"}
- {id: 959, cat: TV/Anime, desc: "Anime - Aldnoah Zero"}
- {id: 99, cat: TV/Anime, desc: "Anime - Anime - Other"}
- {id: 86, cat: TV/Anime, desc: "Anime - Battle Programer Shirase"}
- {id: 87, cat: TV/Anime, desc: "Anime - Big O"}
- {id: 960, cat: TV/Anime, desc: "Anime - Binan Koukou Chikyuu Bouei-bu Love"}
- {id: 267, cat: TV/Anime, desc: "Anime - Bleach"}
- {id: 88, cat: TV/Anime, desc: "Anime - Cardcaptor Sakura"}
- {id: 89, cat: TV/Anime, desc: "Anime - Chobits"}
- {id: 142, cat: TV/Anime, desc: "Anime - Comics"}
- {id: 962, cat: TV/Anime, desc: "Anime - Death Parade"}
- {id: 151, cat: TV/Anime, desc: "Anime - Dragon ball"}
- {id: 90, cat: TV/Anime, desc: "Anime - Dragonball GT"}
- {id: 91, cat: TV/Anime, desc: "Anime - Dragonball Z"}
- {id: 156, cat: TV/Anime, desc: "Anime - DVD-R"}
- {id: 950, cat: TV/Anime, desc: "Anime - Fairy Tail"}
- {id: 92, cat: TV/Anime, desc: "Anime - Flame of Recca"}
- {id: 93, cat: TV/Anime, desc: "Anime - Full Metal Alchemist"}
- {id: 95, cat: TV/Anime, desc: "Anime - Ghost In The Shell SAC"}
- {id: 94, cat: TV/Anime, desc: "Anime - Gundam"}
- {id: 620, cat: TV/Anime, desc: "Anime - Hentai"}
- {id: 145, cat: TV/Anime, desc: "Anime - Hunter X Hunter"}
- {id: 949, cat: TV/Anime, desc: "Anime - Inou Battle wa Nichijou-kei no Naka de"}
- {id: 96, cat: TV/Anime, desc: "Anime - InuYasha"}
- {id: 524, cat: TV/Anime, desc: "Anime - Kiba"}
- {id: 97, cat: TV/Anime, desc: "Anime - Konkiki No Gash Bell"}
- {id: 961, cat: TV/Anime, desc: "Anime - Kuroko No Basuke"}
- {id: 98, cat: TV/Anime, desc: "Anime - Last Exile"}
- {id: 964, cat: TV/Anime, desc: "Anime - Log Horizon"}
- {id: 952, cat: TV/Anime, desc: "Anime - Nanatsu no Taizai"}
- {id: 101, cat: TV/Anime, desc: "Anime - Naruto"}
- {id: 508, cat: TV/Anime, desc: "Anime - One Piece"}
- {id: 100, cat: TV/Anime, desc: "Anime - Onegai Twins"}
- {id: 523, cat: TV/Anime, desc: "Anime - Ouran High School Host Club"}
- {id: 102, cat: TV/Anime, desc: "Anime - PlanetES"}
- {id: 146, cat: TV/Anime, desc: "Anime - Prince of Tennis"}
- {id: 103, cat: TV/Anime, desc: "Anime - Ranma 1/2"}
- {id: 104, cat: TV/Anime, desc: "Anime - Ruroni Kenshin"}
- {id: 105, cat: TV/Anime, desc: "Anime - Samurai Champloo"}
- {id: 107, cat: TV/Anime, desc: "Anime - Scrapped Princess"}
- {id: 997, cat: TV/Anime, desc: "Anime - Spider-man"}
- {id: 106, cat: TV/Anime, desc: "Anime - Stellvia of the Universe"}
- {id: 525, cat: TV/Anime, desc: "Anime - Strawberry Panic"}
- {id: 953, cat: TV/Anime, desc: "Anime - Sword Art Online II"}
- {id: 958, cat: TV/Anime, desc: "Anime - Tokyo Ghoul"}
#Audio
- {id: 5, cat: Audio, desc: "Music"}
- {id: 54, cat: Audio, desc: "Music - Alternative"}
- {id: 990, cat: Audio, desc: "Music - Ambient"}
- {id: 160, cat: Audio, desc: "Music - Anime"}
- {id: 55, cat: Audio, desc: "Music - Asian"}
- {id: 56, cat: Audio, desc: "Music - Blues"}
- {id: 809, cat: Audio, desc: "Music - Bollywood"}
- {id: 57, cat: Audio, desc: "Music - Christian"}
- {id: 58, cat: Audio, desc: "Music - Classic"}
- {id: 515, cat: Audio, desc: "Music - Compilation/Various Artists (VA)"}
- {id: 59, cat: Audio, desc: "Music - Country/Western"}
- {id: 971, cat: Audio, desc: "Music - Discography"}
- {id: 60, cat: Audio, desc: "Music - Drum N Bass"}
- {id: 61, cat: Audio, desc: "Music - Electronic"}
- {id: 850, cat: Audio, desc: "Music - FLAC"}
- {id: 519, cat: Audio, desc: "Music - Folk"}
- {id: 62, cat: Audio, desc: "Music - Game Music"}
- {id: 233, cat: Audio, desc: "Music - Gothic"}
- {id: 63, cat: Audio, desc: "Music - Hardcore"}
- {id: 78, cat: Audio, desc: "Music - HardHouse/Old School Radio Mixes"}
- {id: 512, cat: Audio, desc: "Music - Hardrock"}
- {id: 724, cat: Audio, desc: "Music - Hardstyle"}
- {id: 306, cat: Audio, desc: "Music - Heavy/Death Metal"}
- {id: 64, cat: Audio, desc: "Music - Hip Hop"}
- {id: 511, cat: Audio, desc: "Music - Indie/Britpop"}
- {id: 65, cat: Audio, desc: "Music - Industrial"}
- {id: 66, cat: Audio, desc: "Music - Jazz"}
- {id: 67, cat: Audio, desc: "Music - Karaoke"}
- {id: 521, cat: Audio, desc: "Music - Latin"}
- {id: 68, cat: Audio, desc: "Music - Metal"}
- {id: 526, cat: Audio, desc: "Music - Motown"}
- {id: 79, cat: Audio, desc: "Music - Music - Other"}
- {id: 69, cat: Audio, desc: "Music - Music Videos"}
- {id: 522, cat: Audio, desc: "Music - Non-English"}
- {id: 507, cat: Audio, desc: "Music - Now That's What I Call Music"}
- {id: 70, cat: Audio, desc: "Music - Pop"}
- {id: 852, cat: Audio, desc: "Music - Progressive"}
- {id: 71, cat: Audio, desc: "Music - Punk"}
- {id: 72, cat: Audio, desc: "Music - R&B"}
- {id: 851, cat: Audio, desc: "Music - Rai"}
- {id: 73, cat: Audio, desc: "Music - Rap"}
- {id: 74, cat: Audio, desc: "Music - Reggae"}
- {id: 75, cat: Audio, desc: "Music - Rock"}
- {id: 527, cat: Audio, desc: "Music - Rock 'n' Roll"}
- {id: 514, cat: Audio, desc: "Music - Singer Songwriter"}
- {id: 230, cat: Audio, desc: "Music - Ska"}
- {id: 505, cat: Audio, desc: "Music - Soul"}
- {id: 77, cat: Audio, desc: "Music - Soundtracks"}
- {id: 161, cat: Audio, desc: "Music - Techno"}
- {id: 420, cat: Audio, desc: "Music - Trance/House/Dance"}
- {id: 76, cat: Audio, desc: "Music - Unsigned/Amateur"}
- {id: 1002, cat: Audio, desc: "Music - AAC"}
- {id: 1003, cat: Audio, desc: "Music - Album"}
- {id: 1004, cat: Audio, desc: "Music - Box Set"}
- {id: 1005, cat: Audio, desc: "Music - Concerts"}
- {id: 1006, cat: Audio, desc: "Music - Discography"}
- {id: 1007, cat: Audio, desc: "Music - DVD"}
- {id: 1008, cat: Audio/Lossless, desc: "Music - Lossless"}
- {id: 1009, cat: Audio/MP3, desc: "Music - MP3"}
- {id: 1011, cat: Audio, desc: "Music - Radio"}
- {id: 1012, cat: Audio, desc: "Music - Single"}
#Movies
- {id: 4, cat: Movies, desc: "Movies"}
- {id: 419, cat: Movies, desc: "Movies - Action"}
- {id: 28, cat: Movies, desc: "Movies - Adventure"}
- {id: 29, cat: Movies, desc: "Movies - Animation"}
- {id: 30, cat: Movies, desc: "Movies - Asian"}
- {id: 32, cat: Movies, desc: "Movies - Automotive/Cars"}
- {id: 628, cat: Movies, desc: "Movies - Biography"}
- {id: 977, cat: Movies, desc: "Movies - Black and White"}
- {id: 558, cat: Movies, desc: "Movies - Bollywood/Desi"}
- {id: 976, cat: Movies, desc: "Movies - Classic"}
- {id: 33, cat: Movies, desc: "Movies - Comedy"}
- {id: 34, cat: Movies, desc: "Movies - Concerts"}
- {id: 600, cat: Movies, desc: "Movies - Crime"}
- {id: 35, cat: Movies, desc: "Movies - Documentary"}
- {id: 37, cat: Movies, desc: "Movies - Drama"}
- {id: 742, cat: Movies, desc: "Movies - Dubbed/Dual Audio"}
- {id: 36, cat: Movies, desc: "Movies - DVD/Film Extras"}
- {id: 149, cat: Movies, desc: "Movies - Family"}
- {id: 38, cat: Movies, desc: "Movies - Fantasy"}
- {id: 39, cat: Movies, desc: "Movies - Gore Flicks"}
- {id: 602, cat: Movies, desc: "Movies - History"}
- {id: 40, cat: Movies, desc: "Movies - Horror"}
- {id: 41, cat: Movies, desc: "Movies - Kids"}
- {id: 150, cat: Movies, desc: "Movies - KVCD"}
- {id: 974, cat: Movies, desc: "Movies - Lollywood"}
- {id: 42, cat: Movies, desc: "Movies - Martial Arts"}
- {id: 44, cat: Movies/Other, desc: "Movies - Other"}
- {id: 805, cat: Movies/3D, desc: "Movies - 3D"}
- {id: 975, cat: Movies/UHD, desc: "Movies - 4K"}
- {id: 947, cat: Movies, desc: "Movies - Musical"}
- {id: 43, cat: Movies, desc: "Movies - Mystery"}
- {id: 603, cat: Movies/Foreign, desc: "Movies - non English"}
- {id: 978, cat: Movies, desc: "Movies - Rarities"}
- {id: 45, cat: Movies, desc: "Movies - Romance"}
- {id: 46, cat: Movies, desc: "Movies - Samples/Trailers"}
- {id: 47, cat: Movies, desc: "Movies - Sci-Fi"}
- {id: 48, cat: Movies, desc: "Movies - Sports related"}
- {id: 779, cat: Movies, desc: "Movies - Stand-up comedy"}
- {id: 49, cat: Movies, desc: "Movies - Thriller"}
- {id: 671, cat: Movies, desc: "Movies - Travel"}
- {id: 307, cat: Movies, desc: "Movies - War"}
- {id: 601, cat: Movies, desc: "Movies - Western"}
- {id: 1024, cat: Movies, desc: "Movies - HEVC/x265"}
- {id: 1030, cat: Movies, desc: "Movies - Divx/Xvid"}
- {id: 1031, cat: Movies, desc: "Movies - h.264/x264"}
- {id: 1032, cat: Movies/HD, desc: "Movies - HD"}
- {id: 1033, cat: Movies, desc: "Movies - MP4"}
- {id: 1034, cat: Movies, desc: "Movies - SVCD/VCD"}
- {id: 1035, cat: Movies, desc: "Movies - YIFY"}
#TV
- {id: 8, cat: TV, desc: "TV"}
- {id: 986, cat: TV, desc: "TV - 12 Monkeys"}
- {id: 598, cat: TV, desc: "TV - 19-2"}
- {id: 795, cat: TV, desc: "TV - 2 Broke Girls"}
- {id: 435, cat: TV, desc: "TV - 24"}
- {id: 169, cat: TV, desc: "TV - 30 Days"}
- {id: 561, cat: TV, desc: "TV - 30 Rock"}
- {id: 274, cat: TV, desc: "TV - 60 Minutes"}
- {id: 862, cat: TV, desc: "TV - 666 Park Avenue"}
- {id: 273, cat: TV, desc: "TV - 'Allo 'Allo!"}
- {id: 310, cat: TV, desc: "TV - A-Team"}
- {id: 797, cat: TV, desc: "TV - About a Boy"}
- {id: 998, cat: TV, desc: "TV - Above Suspicion"}
- {id: 966, cat: TV, desc: "TV - Adam - E.V.A"}
- {id: 573, cat: TV, desc: "TV - Alaska State Troopers"}
- {id: 821, cat: TV, desc: "TV - Alcatraz"}
- {id: 118, cat: TV, desc: "TV - Alias"}
- {id: 810, cat: TV, desc: "TV - Almost Human"}
- {id: 771, cat: TV, desc: "TV - Alphas"}
- {id: 818, cat: TV, desc: "TV - American Chopper"}
- {id: 234, cat: TV, desc: "TV - American Dad"}
- {id: 194, cat: TV, desc: "TV - American Horror Story"}
- {id: 634, cat: TV, desc: "TV - American Idol"}
- {id: 674, cat: TV, desc: "TV - Americas Got Talent"}
- {id: 675, cat: TV, desc: "TV - Americas Next Top Model"}
- {id: 894, cat: TV, desc: "TV - Ancient Aliens"}
- {id: 170, cat: TV, desc: "TV - Angel"}
- {id: 911, cat: TV, desc: "TV - Anger Management"}
- {id: 659, cat: TV, desc: "TV - Archer"}
- {id: 275, cat: TV, desc: "TV - Arrested Development"}
- {id: 872, cat: TV, desc: "TV - Arrow"}
- {id: 984, cat: TV, desc: "TV - Ash vs Evil Dead"}
- {id: 171, cat: TV, desc: "TV - Attack Of The Show"}
- {id: 837, cat: TV, desc: "TV - Awake"}
- {id: 902, cat: TV, desc: "TV - Awkward"}
- {id: 916, cat: TV, desc: "TV - Baby Daddy"}
- {id: 165, cat: TV, desc: "TV - Babylon 5"}
- {id: 309, cat: TV, desc: "TV - Back In The Game"}
- {id: 460, cat: TV, desc: "TV - Band Of Brothers"}
- {id: 329, cat: TV, desc: "TV - Banshee"}
- {id: 891, cat: TV, desc: "TV - Bates Motel"}
- {id: 802, cat: TV, desc: "TV - Batman The Brave and The Bold"}
- {id: 163, cat: TV, desc: "TV - Battlestar Galactica"}
- {id: 794, cat: TV, desc: "TV - BBC"}
- {id: 886, cat: TV, desc: "TV - Beauty and the Beast"}
- {id: 172, cat: TV, desc: "TV - Beauty And The Geek"}
- {id: 782, cat: TV, desc: "TV - Beavis and Butt-Head"}
- {id: 584, cat: TV, desc: "TV - Being Erica"}
- {id: 669, cat: TV, desc: "TV - Being Human"}
- {id: 683, cat: TV, desc: "TV - Believe"}
- {id: 335, cat: TV, desc: "TV - Bellator FC"}
- {id: 979, cat: TV, desc: "TV - Better Call Saul"}
- {id: 173, cat: TV, desc: "TV - Big Brother"}
- {id: 666, cat: TV, desc: "TV - Big Love"}
- {id: 774, cat: TV, desc: "TV - Bigg Boss"}
- {id: 989, cat: TV, desc: "TV - Billions"}
- {id: 174, cat: TV, desc: "TV - Bitten"}
- {id: 396, cat: TV, desc: "TV - Black Sails"}
- {id: 981, cat: TV, desc: "TV - Blindspot"}
- {id: 717, cat: TV, desc: "TV - Blue Bloods"}
- {id: 754, cat: TV, desc: "TV - Boardwalk Empire"}
- {id: 709, cat: TV, desc: "TV - Bobs Burgers"}
- {id: 767, cat: TV, desc: "TV - Body of Proof"}
- {id: 175, cat: TV, desc: "TV - Bold and the beautiful"}
- {id: 969, cat: TV, desc: "TV - Bollywood TV Shows"}
- {id: 269, cat: TV, desc: "TV - Bones"}
- {id: 235, cat: TV, desc: "TV - Boston Legal"}
- {id: 676, cat: TV, desc: "TV - Breaking Bad"}
- {id: 707, cat: TV, desc: "TV - Breakout Kings"}
- {id: 409, cat: TV, desc: "TV - Brickleberry"}
- {id: 680, cat: TV, desc: "TV - Brooklyn Nine-Nine"}
- {id: 560, cat: TV, desc: "TV - Brothers And Sisters"}
- {id: 147, cat: TV, desc: "TV - Buffy"}
- {id: 677, cat: TV, desc: "TV - Burn Notice"}
- {id: 619, cat: TV, desc: "TV - Californication"}
- {id: 883, cat: TV, desc: "TV - Call of the Wildman"}
- {id: 719, cat: TV, desc: "TV - Camelot"}
- {id: 921, cat: TV, desc: "TV - Camp"}
- {id: 661, cat: TV, desc: "TV - Caprica"}
- {id: 928, cat: TV, desc: "TV - Capture"}
- {id: 128, cat: TV, desc: "TV - Carnivale"}
- {id: 736, cat: TV, desc: "TV - Cartoon"}
- {id: 658, cat: TV, desc: "TV - Castle"}
- {id: 941, cat: TV, desc: "TV - Cedar Cove"}
- {id: 846, cat: TV, desc: "TV - Celebrity Juice"}
- {id: 141, cat: TV, desc: "TV - Charmed"}
- {id: 900, cat: TV, desc: "TV - Chicago Fire"}
- {id: 324, cat: TV, desc: "TV - Chicago PD"}
- {id: 315, cat: TV, desc: "TV - Chopped"}
- {id: 184, cat: TV, desc: "TV - Chozen"}
- {id: 657, cat: TV, desc: "TV - Chuck"}
- {id: 133, cat: TV, desc: "TV - Cold Case"}
- {id: 629, cat: TV, desc: "TV - Community"}
- {id: 178, cat: TV, desc: "TV - Conan O'Brien"}
- {id: 946, cat: TV, desc: "TV - Constantine"}
- {id: 879, cat: TV, desc: "TV - Continuum"}
- {id: 861, cat: TV, desc: "TV - Copper"}
- {id: 322, cat: TV, desc: "TV - Cops"}
- {id: 186, cat: TV, desc: "TV - Cosmos A Space Time Odyssey"}
- {id: 670, cat: TV, desc: "TV - Cougar Town"}
- {id: 729, cat: TV, desc: "TV - Covert Affairs"}
- {id: 651, cat: TV, desc: "TV - Craig Ferguson"}
- {id: 280, cat: TV, desc: "TV - Criminal Minds"}
- {id: 788, cat: TV, desc: "TV - Crisis"}
- {id: 279, cat: TV, desc: "TV - Criss Angel BeLIEve"}
- {id: 323, cat: TV, desc: "TV - Crossing Jordan"}
- {id: 926, cat: TV, desc: "TV - Crossing Lines"}
- {id: 108, cat: TV, desc: "TV - CSI"}
- {id: 325, cat: TV, desc: "TV - Curb Your Enthusiasm"}
- {id: 882, cat: TV, desc: "TV - Da Vincis Demons"}
- {id: 282, cat: TV, desc: "TV - Dallas"}
- {id: 678, cat: TV, desc: "TV - Damages"}
- {id: 798, cat: TV, desc: "TV - Dancing with the Stars US"}
- {id: 652, cat: TV, desc: "TV - David Letterman"}
- {id: 994, cat: TV, desc: "TV - Days of Our Lives"}
- {id: 985, cat: TV, desc: "TV - DCs Legends of Tomorrow"}
- {id: 181, cat: TV, desc: "TV - Dead Like Me"}
- {id: 679, cat: TV, desc: "TV - Deadliest Catch"}
- {id: 182, cat: TV, desc: "TV - Deadwood"}
- {id: 890, cat: TV, desc: "TV - Defiance"}
- {id: 281, cat: TV, desc: "TV - Democracy Now!"}
- {id: 183, cat: TV, desc: "TV - Desperate Housewives"}
- {id: 939, cat: TV, desc: "TV - Devious Maids"}
- {id: 585, cat: TV, desc: "TV - Dexter"}
- {id: 644, cat: TV, desc: "TV - Dirty Jobs"}
- {id: 122, cat: TV, desc: "TV - Discovery Channel"}
- {id: 167, cat: TV, desc: "TV - Doctor Who"}
- {id: 968, cat: TV, desc: "TV - Documentary"}
- {id: 606, cat: TV, desc: "TV - Dollhouse"}
- {id: 839, cat: TV, desc: "TV - Dont Trust the Bitch in Apartment"}
- {id: 326, cat: TV, desc: "TV - Dr Who"}
- {id: 925, cat: TV, desc: "TV - Dracula"}
- {id: 328, cat: TV, desc: "TV - Drawn Together"}
- {id: 732, cat: TV, desc: "TV - Drop Dead"}
- {id: 820, cat: TV, desc: "TV - Eastbound and Down"}
- {id: 875, cat: TV, desc: "TV - Elementary"}
- {id: 283, cat: TV, desc: "TV - Ellen DeGeneres"}
- {id: 330, cat: TV, desc: "TV - Enlisted"}
- {id: 187, cat: TV, desc: "TV - Entourage"}
- {id: 270, cat: TV, desc: "TV - ER"}
- {id: 765, cat: TV, desc: "TV - Eureka"}
- {id: 238, cat: TV, desc: "TV - Everybody Loves Raymond"}
- {id: 571, cat: TV, desc: "TV - Extant"}
- {id: 840, cat: TV, desc: "TV - Fact or Faked Paranormal Files"}
- {id: 828, cat: TV, desc: "TV - Fairly Legeal"}
- {id: 876, cat: TV, desc: "TV - Faking It"}
- {id: 917, cat: TV, desc: "TV - Falling Skies"}
- {id: 188, cat: TV, desc: "TV - Family Guy"}
- {id: 855, cat: TV, desc: "TV - Family Tools"}
- {id: 411, cat: TV, desc: "TV - Fargo"}
- {id: 331, cat: TV, desc: "TV - Farscape"}
- {id: 983, cat: TV, desc: "TV - Fear the Walking Dead"}
- {id: 332, cat: TV, desc: "TV - Fifth Gear"}
- {id: 672, cat: TV, desc: "TV - Flashforward"}
- {id: 753, cat: TV, desc: "TV - Flashpoint"}
- {id: 831, cat: TV, desc: "TV - Foreign Series/Non English"}
- {id: 266, cat: TV, desc: "TV - Forever"}
- {id: 922, cat: TV, desc: "TV - Franklin and Bash"}
- {id: 140, cat: TV, desc: "TV - Friends"}
- {id: 612, cat: TV, desc: "TV - Fringe"}
- {id: 277, cat: TV, desc: "TV - From Dusk Till Dawn"}
- {id: 681, cat: TV, desc: "TV - Futurama"}
- {id: 728, cat: TV, desc: "TV - Game of Thrones"}
- {id: 334, cat: TV, desc: "TV - Gang Related"}
- {id: 996, cat: TV, desc: "TV - General Hospital"}
- {id: 954, cat: TV, desc: "TV - Geordie Shore"}
- {id: 574, cat: TV, desc: "TV - Ghost Adventures"}
- {id: 704, cat: TV, desc: "TV - Ghost Hunters"}
- {id: 642, cat: TV, desc: "TV - Ghost Mine"}
- {id: 338, cat: TV, desc: "TV - Ghost Whisperer"}
- {id: 284, cat: TV, desc: "TV - Gilmore Girls"}
- {id: 682, cat: TV, desc: "TV - Glee"}
- {id: 865, cat: TV, desc: "TV - Go On"}
- {id: 276, cat: TV, desc: "TV - Gold Rush"}
- {id: 339, cat: TV, desc: "TV - Good Eats"}
- {id: 599, cat: TV, desc: "TV - Gossip Girl"}
- {id: 580, cat: TV, desc: "TV - Gotham"}
- {id: 919, cat: TV, desc: "TV - Graceland"}
- {id: 955, cat: TV, desc: "TV - Gracepoint"}
- {id: 285, cat: TV, desc: "TV - Greys Anatomy"}
- {id: 819, cat: TV, desc: "TV - Grimm"}
- {id: 237, cat: TV, desc: "TV - Growing Up Fisher"}
- {id: 340, cat: TV, desc: "TV - Guiding Light"}
- {id: 866, cat: TV, desc: "TV - Guys With Kids"}
- {id: 880, cat: TV, desc: "TV - Hannibal"}
- {id: 813, cat: TV, desc: "TV - Happily Divorced"}
- {id: 769, cat: TV, desc: "TV - Happy Endings"}
- {id: 190, cat: TV, desc: "TV - Harald Schmidt"}
- {id: 713, cat: TV, desc: "TV - Harrys Law"}
- {id: 832, cat: TV, desc: "TV - Hart of Dixie"}
- {id: 341, cat: TV, desc: "TV - Haunted"}
- {id: 773, cat: TV, desc: "TV - Haven"}
- {id: 712, cat: TV, desc: "TV - Hawaii Five-0"}
- {id: 781, cat: TV, desc: "TV - Helix"}
- {id: 853, cat: TV, desc: "TV - Hell on Wheels"}
- {id: 191, cat: TV, desc: "TV - Hells Kitchen"}
- {id: 884, cat: TV, desc: "TV - Hemlock Grove"}
- {id: 342, cat: TV, desc: "TV - Hercules"}
- {id: 556, cat: TV, desc: "TV - Heroes"}
- {id: 343, cat: TV, desc: "TV - Hex"}
- {id: 192, cat: TV, desc: "TV - Hogans Heroes"}
- {id: 588, cat: TV, desc: "TV - Hollands Hoop"}
- {id: 755, cat: TV, desc: "TV - Homeland"}
- {id: 812, cat: TV, desc: "TV - Hostages"}
- {id: 684, cat: TV, desc: "TV - Hot in Cleveland"}
- {id: 286, cat: TV, desc: "TV - House"}
- {id: 913, cat: TV, desc: "TV - House Of Cards"}
- {id: 287, cat: TV, desc: "TV - How I Met Your Mother"}
- {id: 568, cat: TV, desc: "TV - How Its Made"}
- {id: 893, cat: TV, desc: "TV - How to Live with Your Parents"}
- {id: 288, cat: TV, desc: "TV - Howard Stern"}
- {id: 132, cat: TV, desc: "TV - Huff"}
- {id: 345, cat: TV, desc: "TV - Humor Amarillo"}
- {id: 756, cat: TV, desc: "TV - Hung"}
- {id: 637, cat: TV, desc: "TV - Hustle"}
- {id: 346, cat: TV, desc: "TV - In Justice"}
- {id: 685, cat: TV, desc: "TV - In Plain Sight"}
- {id: 582, cat: TV, desc: "TV - Ink Master"}
- {id: 347, cat: TV, desc: "TV - Inked"}
- {id: 965, cat: TV, desc: "TV - Inside MMA"}
- {id: 873, cat: TV, desc: "TV - Intelligence US"}
- {id: 240, cat: TV, desc: "TV - Into the West"}
- {id: 166, cat: TV, desc: "TV - Iron Chef"}
- {id: 289, cat: TV, desc: "TV - Invasion"}
- {id: 817, cat: TV, desc: "TV - Ironside"}
- {id: 772, cat: TV, desc: "TV - Its Always Sunny in Philadelphia"}
- {id: 988, cat: TV, desc: "TV - iZombie"}
- {id: 991, cat: TV, desc: "TV - Jane the Virgin"}
- {id: 290, cat: TV, desc: "TV - Jay Leno"}
- {id: 763, cat: TV, desc: "TV - Jersey Shore"}
- {id: 177, cat: TV, desc: "TV - Joe Rogan Questions Everything"}
- {id: 110, cat: TV, desc: "TV - Joey"}
- {id: 196, cat: TV, desc: "TV - Justice League Unlimited"}
- {id: 686, cat: TV, desc: "TV - Justified"}
- {id: 412, cat: TV, desc: "TV - kabachitare!"}
- {id: 738, cat: TV, desc: "TV - Killer Contact"}
- {id: 349, cat: TV, desc: "TV - Killer Instinct"}
- {id: 197, cat: TV, desc: "TV - Kim Possible"}
- {id: 741, cat: TV, desc: "TV - King"}
- {id: 933, cat: TV, desc: "TV - King and Maxwel"}
- {id: 350, cat: TV, desc: "TV - King Of The Hill"}
- {id: 351, cat: TV, desc: "TV - Kitchen Confidential"}
- {id: 790, cat: TV, desc: "TV - Kitchen Nightmares US"}
- {id: 348, cat: TV, desc: "TV - Kolchak The Night Stalker"}
- {id: 241, cat: TV, desc: "TV - Koot en Bie"}
- {id: 198, cat: TV, desc: "TV - Kung Fu"}
- {id: 199, cat: TV, desc: "TV - La Femme Nikita"}
- {id: 570, cat: TV, desc: "TV - LA Ink"}
- {id: 242, cat: TV, desc: "TV - Laguna Beach"}
- {id: 130, cat: TV, desc: "TV - Las Vegas"}
- {id: 843, cat: TV, desc: "TV - Last Man Standing"}
- {id: 867, cat: TV, desc: "TV - Last Resort"}
- {id: 200, cat: TV, desc: "TV - Late Night with Conan O'Brien"}
- {id: 115, cat: TV, desc: "TV - Law And Order"}
- {id: 591, cat: TV, desc: "TV - Law and Order UK"}
- {id: 243, cat: TV, desc: "TV - Le Cameleon"}
- {id: 578, cat: TV, desc: "TV - Legend of the Seeker"}
- {id: 590, cat: TV, desc: "TV - Legends"}
- {id: 898, cat: TV, desc: "TV - Legit"}
- {id: 638, cat: TV, desc: "TV - Level3"}
- {id: 656, cat: TV, desc: "TV - Leverage"}
- {id: 618, cat: TV, desc: "TV - Lie To Me"}
- {id: 650, cat: TV, desc: "TV - Life"}
- {id: 353, cat: TV, desc: "TV - Life on Mars"}
- {id: 716, cat: TV, desc: "TV - Lights Out"}
- {id: 244, cat: TV, desc: "TV - Line Of Fire"}
- {id: 504, cat: TV, desc: "TV - Little Britain"}
- {id: 665, cat: TV, desc: "TV - Little Mosque on the Prairie"}
- {id: 148, cat: TV, desc: "TV - Long Island Medium"}
- {id: 914, cat: TV, desc: "TV - Longmire"}
- {id: 354, cat: TV, desc: "TV - Los Serrano"}
- {id: 111, cat: TV, desc: "TV - Lost"}
- {id: 314, cat: TV, desc: "TV - Lost Girl"}
- {id: 858, cat: TV, desc: "TV - Louie"}
- {id: 726, cat: TV, desc: "TV - Love Bites"}
- {id: 937, cat: TV, desc: "TV - Low Winter Sun"}
- {id: 956, cat: TV, desc: "TV - Lucha Underground"}
- {id: 980, cat: TV, desc: "TV - Lucifer"}
- {id: 503, cat: TV, desc: "TV - Lucky Louie"}
- {id: 687, cat: TV, desc: "TV - Luther"}
- {id: 157, cat: TV, desc: "TV - MacGyver"}
- {id: 705, cat: TV, desc: "TV - Mad Love"}
- {id: 826, cat: TV, desc: "TV - Mad Men"}
- {id: 869, cat: TV, desc: "TV - Made in Jersey"}
- {id: 355, cat: TV, desc: "TV - MADtv"}
- {id: 871, cat: TV, desc: "TV - Major Crimes"}
- {id: 667, cat: TV, desc: "TV - Make It or Break It"}
- {id: 357, cat: TV, desc: "TV - Malcolm In The Middle"}
- {id: 662, cat: TV, desc: "TV - Man vs Wild"}
- {id: 759, cat: TV, desc: "TV - Marvels Agents of S.H.I.E.L.D"}
- {id: 910, cat: TV, desc: "TV - MasterChef US"}
- {id: 358, cat: TV, desc: "TV - Masters Of Horror"}
- {id: 824, cat: TV, desc: "TV - Masters of Sex"}
- {id: 291, cat: TV, desc: "TV - Medium"}
- {id: 617, cat: TV, desc: "TV - Melrose Place"}
- {id: 688, cat: TV, desc: "TV - Memphis Beat"}
- {id: 905, cat: TV, desc: "TV - Men at Work"}
- {id: 645, cat: TV, desc: "TV - Men of a Certain Age"}
- {id: 633, cat: TV, desc: "TV - Mercy"}
- {id: 579, cat: TV, desc: "TV - Merlin"}
- {id: 359, cat: TV, desc: "TV - Miami Ink"}
- {id: 825, cat: TV, desc: "TV - Midsomer Murders"}
- {id: 783, cat: TV, desc: "TV - Mike and Molly"}
- {id: 823, cat: TV, desc: "TV - Mind Games"}
- {id: 246, cat: TV, desc: "TV - Mind of Mencia"}
- {id: 313, cat: TV, desc: "TV - Misfits"}
- {id: 842, cat: TV, desc: "TV - Missing"}
- {id: 647, cat: TV, desc: "TV - Mistresses US"}
- {id: 179, cat: TV, desc: "TV - Mixology"}
- {id: 632, cat: TV, desc: "TV - Modern Family"}
- {id: 245, cat: TV, desc: "TV - Modern Marvels"}
- {id: 398, cat: TV, desc: "TV - Mom"}
- {id: 201, cat: TV, desc: "TV - Monk"}
- {id: 361, cat: TV, desc: "TV - Monty Pythons Flying Circus"}
- {id: 907, cat: TV, desc: "TV - Motive"}
- {id: 247, cat: TV, desc: "TV - Mr Bean"}
- {id: 992, cat: TV, desc: "TV - Mr. Robot"}
- {id: 356, cat: TV, desc: "TV - MST3K"}
- {id: 292, cat: TV, desc: "TV - My Favorite Martian"}
- {id: 792, cat: TV, desc: "TV - My Ghost Story"}
- {id: 999, cat: TV, desc: "TV - My Little Pony - Friendship is Magic"}
- {id: 362, cat: TV, desc: "TV - My Name Is Earl"}
- {id: 202, cat: TV, desc: "TV - My Restaurant Rules"}
- {id: 193, cat: TV, desc: "TV - Mythbusters"}
- {id: 940, cat: TV, desc: "TV - Naked And Afraid"}
- {id: 203, cat: TV, desc: "TV - NASA 50 Years Of Space Exploration"}
- {id: 899, cat: TV, desc: "TV - Nashville"}
- {id: 636, cat: TV, desc: "TV - National Geographic"}
- {id: 120, cat: TV, desc: "TV - NCIS"}
- {id: 920, cat: TV, desc: "TV - Necessary Roughness"}
- {id: 841, cat: TV, desc: "TV - New Girl"}
- {id: 957, cat: TV, desc: "TV - New Japan Pro Wrestling"}
- {id: 311, cat: TV, desc: "TV - NewGamePlus"}
- {id: 363, cat: TV, desc: "TV - Night Stalker"}
- {id: 722, cat: TV, desc: "TV - Nikita"}
- {id: 293, cat: TV, desc: "TV - Nip Tuck"}
- {id: 710, cat: TV, desc: "TV - No Ordinary Family"}
- {id: 294, cat: TV, desc: "TV - Numb3rs"}
- {id: 689, cat: TV, desc: "TV - Nurse Jackie"}
- {id: 703, cat: TV, desc: "TV - Off the Map"}
- {id: 833, cat: TV, desc: "TV - Once Upon a Time Once"}
- {id: 364, cat: TV, desc: "TV - One Tree Hill"}
- {id: 424, cat: TV, desc: "TV - Only Fools And Horses"}
- {id: 935, cat: TV, desc: "TV - Orange Is The New Black"}
- {id: 881, cat: TV, desc: "TV - Orphan Black"}
- {id: 113, cat: TV, desc: "TV - Other"}
- {id: 365, cat: TV, desc: "TV - Out of Practice S01E"}
- {id: 248, cat: TV, desc: "TV - Outer Limits"}
- {id: 646, cat: TV, desc: "TV - Outer Space Astronauts"}
- {id: 336, cat: TV, desc: "TV - Outlander"}
- {id: 723, cat: TV, desc: "TV - Outsourced"}
- {id: 249, cat: TV, desc: "TV - Over There"}
- {id: 757, cat: TV, desc: "TV - Pan Am"}
- {id: 640, cat: TV, desc: "TV - Paradox"}
- {id: 778, cat: TV, desc: "TV - Parenthood"}
- {id: 613, cat: TV, desc: "TV - Parks and Recreation"}
- {id: 250, cat: TV, desc: "TV - Passions"}
- {id: 414, cat: TV, desc: "TV - PBS NOW"}
- {id: 690, cat: TV, desc: "TV - Penn and Teller Bullshit"}
- {id: 945, cat: TV, desc: "TV - Penny Dreadful"}
- {id: 927, cat: TV, desc: "TV - Perception"}
- {id: 785, cat: TV, desc: "TV - Person of Interest"}
- {id: 366, cat: TV, desc: "TV - Phil of the Future"}
- {id: 204, cat: TV, desc: "TV - Pimp My Ride"}
- {id: 967, cat: TV, desc: "TV - Player Attack"}
- {id: 427, cat: TV, desc: "TV - Poker"}
- {id: 691, cat: TV, desc: "TV - Pretty Little Liars"}
- {id: 784, cat: TV, desc: "TV - Prime Suspect US"}
- {id: 734, cat: TV, desc: "TV - Primeval"}
- {id: 229, cat: TV, desc: "TV - Prison Break"}
- {id: 692, cat: TV, desc: "TV - Private Practice"}
- {id: 368, cat: TV, desc: "TV - Project Runway"}
- {id: 663, cat: TV, desc: "TV - Psych"}
- {id: 205, cat: TV, desc: "TV - Punkd"}
- {id: 803, cat: TV, desc: "TV - QI"}
- {id: 982, cat: TV, desc: "TV - Quantico"}
- {id: 251, cat: TV, desc: "TV - Quantum Leap"}
- {id: 993, cat: TV, desc: "TV - Queen of the South"}
- {id: 252, cat: TV, desc: "TV - Queer as Folk"}
- {id: 714, cat: TV, desc: "TV - Raising Hope"}
- {id: 317, cat: TV, desc: "TV - Ravenswood"}
- {id: 936, cat: TV, desc: "TV - Ray Donovan"}
- {id: 594, cat: TV, desc: "TV - Ray Mears Northern Wilderness"}
- {id: 822, cat: TV, desc: "TV - Real Time with Bill Maher"}
- {id: 369, cat: TV, desc: "TV - Reba"}
- {id: 885, cat: TV, desc: "TV - Rectify"}
- {id: 206, cat: TV, desc: "TV - Red Dwarf"}
- {id: 906, cat: TV, desc: "TV - Red Widow"}
- {id: 117, cat: TV, desc: "TV - ReGenesis"}
- {id: 854, cat: TV, desc: "TV - Reign"}
- {id: 370, cat: TV, desc: "TV - Related"}
- {id: 327, cat: TV, desc: "TV - Remedy"}
- {id: 253, cat: TV, desc: "TV - Remington Steele"}
- {id: 254, cat: TV, desc: "TV - Reno 911"}
- {id: 207, cat: TV, desc: "TV - Rescue Me"}
- {id: 576, cat: TV, desc: "TV - Resurrection"}
- {id: 295, cat: TV, desc: "TV - Reunion"}
- {id: 208, cat: TV, desc: "TV - Revelations"}
- {id: 760, cat: TV, desc: "TV - Revenge"}
- {id: 859, cat: TV, desc: "TV - Revolution"}
- {id: 312, cat: TV, desc: "TV - Rewind"}
- {id: 768, cat: TV, desc: "TV - Ringer"}
- {id: 604, cat: TV, desc: "TV - Rip Off Britain"}
- {id: 693, cat: TV, desc: "TV - River Monsters"}
- {id: 929, cat: TV, desc: "TV - Rizzoli and Isles"}
- {id: 209, cat: TV, desc: "TV - Robot Chicken"}
- {id: 888, cat: TV, desc: "TV - Rogue"}
- {id: 944, cat: TV, desc: "TV - ROH-Wrestling"}
- {id: 255, cat: TV, desc: "TV - Rome"}
- {id: 849, cat: TV, desc: "TV - Rookie Blue"}
- {id: 694, cat: TV, desc: "TV - Royal Pains"}
- {id: 695, cat: TV, desc: "TV - Rubicon"}
- {id: 807, cat: TV, desc: "TV - Rules of Engagement"}
- {id: 372, cat: TV, desc: "TV - Ruri no Shima"}
- {id: 892, cat: TV, desc: "TV - Rush"}
- {id: 555, cat: TV, desc: "TV - Russian TV programs"}
- {id: 789, cat: TV, desc: "TV - Salem"}
- {id: 605, cat: TV, desc: "TV - Sanctuary"}
- {id: 776, cat: TV, desc: "TV - Satisfaction US"}
- {id: 373, cat: TV, desc: "TV - Saturday Night Live"}
- {id: 915, cat: TV, desc: "TV - Save Me"}
- {id: 696, cat: TV, desc: "TV - Saving Grace"}
- {id: 931, cat: TV, desc: "TV - Saving Hope"}
- {id: 844, cat: TV, desc: "TV - Scandal"}
- {id: 344, cat: TV, desc: "TV - Scorpion"}
- {id: 987, cat: TV, desc: "TV - Scream"}
- {id: 138, cat: TV, desc: "TV - Scrubs"}
- {id: 304, cat: TV, desc: "TV - Sean Saves The World"}
- {id: 715, cat: TV, desc: "TV - Secret Diary Of A Call Girl"}
- {id: 210, cat: TV, desc: "TV - Seinfeld"}
- {id: 296, cat: TV, desc: "TV - Sex and The City"}
- {id: 708, cat: TV, desc: "TV - Shameless"}
- {id: 375, cat: TV, desc: "TV - Sin Rastro"}
- {id: 737, cat: TV, desc: "TV - Single Ladies"}
- {id: 211, cat: TV, desc: "TV - Six Feet Under"}
- {id: 697, cat: TV, desc: "TV - Skins"}
- {id: 376, cat: TV, desc: "TV - Sleeper Cell"}
- {id: 112, cat: TV, desc: "TV - Sleepy Hollow"}
- {id: 256, cat: TV, desc: "TV - Sliders"}
- {id: 137, cat: TV, desc: "TV - Smallville"}
- {id: 830, cat: TV, desc: "TV - Smash"}
- {id: 649, cat: TV, desc: "TV - So You Think You Can Dance"}
- {id: 569, cat: TV, desc: "TV - Sons of Anarchy"}
- {id: 815, cat: TV, desc: "TV - Sons of Guns"}
- {id: 212, cat: TV, desc: "TV - South Park"}
- {id: 718, cat: TV, desc: "TV - Southland"}
- {id: 257, cat: TV, desc: "TV - Space 1999"}
- {id: 297, cat: TV, desc: "TV - Space Above and Beyond"}
- {id: 631, cat: TV, desc: "TV - Spartacus"}
- {id: 845, cat: TV, desc: "TV - Spike TV"}
- {id: 607, cat: TV, desc: "TV - Spooks"}
- {id: 131, cat: TV, desc: "TV - Sports Illustrated"}
- {id: 159, cat: TV, desc: "TV - Sports related"}
- {id: 378, cat: TV, desc: "TV - Stacked"}
- {id: 379, cat: TV, desc: "TV - Star Trek"}
- {id: 563, cat: TV, desc: "TV - Star Wars The Clone Wars"}
- {id: 615, cat: TV, desc: "TV - Star-Crossed"}
- {id: 139, cat: TV, desc: "TV - Star-Trek Enterprise"}
- {id: 144, cat: TV, desc: "TV - Star-Trek The Next Generation"}
- {id: 380, cat: TV, desc: "TV - Stargate"}
- {id: 123, cat: TV, desc: "TV - Stargate Atlantis"}
- {id: 124, cat: TV, desc: "TV - StarGate SG1"}
- {id: 562, cat: TV, desc: "TV - Stargate Universe"}
- {id: 258, cat: TV, desc: "TV - Starved"}
- {id: 213, cat: TV, desc: "TV - Stella"}
- {id: 614, cat: TV, desc: "TV - Steven Seagal Lawman"}
- {id: 381, cat: TV, desc: "TV - Still Standing"}
- {id: 857, cat: TV, desc: "TV - Strike Back"}
- {id: 528, cat: TV, desc: "TV - Studio 60 on the Sunset Strip"}
- {id: 838, cat: TV, desc: "TV - Suburgatory"}
- {id: 761, cat: TV, desc: "TV - Suits"}
- {id: 214, cat: TV, desc: "TV - Summerland"}
- {id: 400, cat: TV, desc: "TV - Super Fun Night"}
- {id: 298, cat: TV, desc: "TV - Supernatural"}
- {id: 299, cat: TV, desc: "TV - Surface"}
- {id: 382, cat: TV, desc: "TV - Survivor"}
- {id: 215, cat: TV, desc: "TV - Survivors"}
- {id: 847, cat: TV, desc: "TV - Swamp People"}
- {id: 863, cat: TV, desc: "TV - Switched at Birth"}
- {id: 153, cat: TV, desc: "TV - Tattoo Nightmares"}
- {id: 217, cat: TV, desc: "TV - Teen Titans"}
- {id: 731, cat: TV, desc: "TV - Teen Wolf"}
- {id: 764, cat: TV, desc: "TV - Terra Nova"}
- {id: 119, cat: TV, desc: "TV - That 70s Show"}
- {id: 316, cat: TV, desc: "TV - The 100"}
- {id: 168, cat: TV, desc: "TV - The 4400"}
- {id: 300, cat: TV, desc: "TV - The Adventures of Sherlock Holmes"}
- {id: 185, cat: TV, desc: "TV - The After"}
- {id: 383, cat: TV, desc: "TV - The Amazing Race"}
- {id: 887, cat: TV, desc: "TV - The Americans"}
- {id: 301, cat: TV, desc: "TV - The Apprentice"}
- {id: 384, cat: TV, desc: "TV - The Bernie Mac Show"}
- {id: 583, cat: TV, desc: "TV - The Big Bang Theory"}
- {id: 829, cat: TV, desc: "TV - The Big C"}
- {id: 572, cat: TV, desc: "TV - The Biggest Loser"}
- {id: 581, cat: TV, desc: "TV - The Blacklist"}
- {id: 410, cat: TV, desc: "TV - The Boondocks"}
- {id: 608, cat: TV, desc: "TV - The Border"}
- {id: 775, cat: TV, desc: "TV - The Borgias"}
- {id: 923, cat: TV, desc: "TV - The Bridge US"}
- {id: 711, cat: TV, desc: "TV - The Cape"}
- {id: 730, cat: TV, desc: "TV - The Carrie Diaries"}
- {id: 586, cat: TV, desc: "TV - The Cleveland Show"}
- {id: 896, cat: TV, desc: "TV - The Client List"}
- {id: 218, cat: TV, desc: "TV - The Closer"}
- {id: 272, cat: TV, desc: "TV - The Colbert Report"}
- {id: 219, cat: TV, desc: "TV - The Comeback"}
- {id: 510, cat: TV, desc: "TV - The Contender"}
- {id: 758, cat: TV, desc: "TV - The Crazy Ones"}
- {id: 114, cat: TV, desc: "TV - The Daily Show"}
- {id: 856, cat: TV, desc: "TV - The Dead Files"}
- {id: 220, cat: TV, desc: "TV - The Dead Zone"}
- {id: 189, cat: TV, desc: "TV - The Divide"}
- {id: 386, cat: TV, desc: "TV - The Dog Whisperer"}
- {id: 702, cat: TV, desc: "TV - The Event"}
- {id: 610, cat: TV, desc: "TV - The F Word"}
- {id: 639, cat: TV, desc: "TV - The Family"}
- {id: 835, cat: TV, desc: "TV - The Finder"}
- {id: 834, cat: TV, desc: "TV - The Firm"}
- {id: 973, cat: TV, desc: "TV - The Flash"}
- {id: 877, cat: TV, desc: "TV - The Following"}
- {id: 635, cat: TV, desc: "TV - The Forgotten"}
- {id: 932, cat: TV, desc: "TV - The Fosters"}
- {id: 816, cat: TV, desc: "TV - The Game"}
- {id: 766, cat: TV, desc: "TV - The Gates"}
- {id: 259, cat: TV, desc: "TV - The Girls Next Door"}
- {id: 740, cat: TV, desc: "TV - The Glades"}
- {id: 587, cat: TV, desc: "TV - The Goldbergs"}
- {id: 648, cat: TV, desc: "TV - The Good Wife"}
- {id: 912, cat: TV, desc: "TV - The Goodwin Games"}
- {id: 278, cat: TV, desc: "TV - The Haunting Of"}
- {id: 903, cat: TV, desc: "TV - The Hero"}
- {id: 655, cat: TV, desc: "TV - The Hills"}
- {id: 221, cat: TV, desc: "TV - The Inside"}
- {id: 595, cat: TV, desc: "TV - The Jeff Dunham Show"}
- {id: 387, cat: TV, desc: "TV - The Jetsons"}
- {id: 827, cat: TV, desc: "TV - The Killing"}
- {id: 388, cat: TV, desc: "TV - The King Of Queens"}
- {id: 321, cat: TV, desc: "TV - The Knick"}
- {id: 271, cat: TV, desc: "TV - The L Word"}
- {id: 609, cat: TV, desc: "TV - The League"}
- {id: 897, cat: TV, desc: "TV - The Leftovers"}
- {id: 808, cat: TV, desc: "TV - The Life and Times of Tim"}
- {id: 924, cat: TV, desc: "TV - The Listener"}
- {id: 222, cat: TV, desc: "TV - The Lone Gunmen"}
- {id: 152, cat: TV, desc: "TV - The Lost World"}
- {id: 643, cat: TV, desc: "TV - The Mentalist"}
- {id: 878, cat: TV, desc: "TV - The Michael J Fox"}
- {id: 630, cat: TV, desc: "TV - The Middle"}
- {id: 405, cat: TV, desc: "TV - The Millers"}
- {id: 901, cat: TV, desc: "TV - The Mindy Project"}
- {id: 860, cat: TV, desc: "TV - The Mob Doctor"}
- {id: 870, cat: TV, desc: "TV - The Musketeers"}
- {id: 239, cat: TV, desc: "TV - The Mysteries Of Laura"}
- {id: 938, cat: TV, desc: "TV - The Newsroom"}
- {id: 109, cat: TV, desc: "TV - The O.C."}
- {id: 308, cat: TV, desc: "TV - The Office"}
- {id: 319, cat: TV, desc: "TV - The Originals"}
- {id: 392, cat: TV, desc: "TV - The Others"}
- {id: 390, cat: TV, desc: "TV - The O`Reilly Factor"}
- {id: 698, cat: TV, desc: "TV - The Pacific"}
- {id: 302, cat: TV, desc: "TV - The PJs"}
- {id: 567, cat: TV, desc: "TV - The Practice"}
- {id: 260, cat: TV, desc: "TV - The Real World"}
- {id: 176, cat: TV, desc: "TV - The Red Road"}
- {id: 597, cat: TV, desc: "TV - The Replacements"}
- {id: 664, cat: TV, desc: "TV - The Sci Fi Guys"}
- {id: 393, cat: TV, desc: "TV - The Secret Adventures of Jules Verne"}
- {id: 786, cat: TV, desc: "TV - The Secret Circle"}
- {id: 668, cat: TV, desc: "TV - The Secret Life of the American Teenager"}
- {id: 735, cat: TV, desc: "TV - The Shadow Line"}
- {id: 223, cat: TV, desc: "TV - The Shield"}
- {id: 125, cat: TV, desc: "TV - The Simpsons"}
- {id: 423, cat: TV, desc: "TV - The Sopranos"}
- {id: 333, cat: TV, desc: "TV - The Strain"}
- {id: 236, cat: TV, desc: "TV - The Tomorrow People US"}
- {id: 699, cat: TV, desc: "TV - The Tudors"}
- {id: 611, cat: TV, desc: "TV - The Ultimate Fighter"}
- {id: 320, cat: TV, desc: "TV - The Unexplained Files"}
- {id: 721, cat: TV, desc: "TV - The Vampire Diaries"}
- {id: 654, cat: TV, desc: "TV - The Venture Bros"}
- {id: 725, cat: TV, desc: "TV - The Voice"}
- {id: 720, cat: TV, desc: "TV - The Walking Dead"}
- {id: 394, cat: TV, desc: "TV - The War At Home"}
- {id: 116, cat: TV, desc: "TV - The West Wing"}
- {id: 577, cat: TV, desc: "TV - The X Factor"}
- {id: 425, cat: TV, desc: "TV - Thief"}
- {id: 268, cat: TV, desc: "TV - Threshold"}
- {id: 796, cat: TV, desc: "TV - Thundercats"}
- {id: 216, cat: TV, desc: "TV - TLC Connections"}
- {id: 904, cat: TV, desc: "TV - TNA-Wrestling"}
- {id: 399, cat: TV, desc: "TV - Tonight Show With Jay Leno"}
- {id: 616, cat: TV, desc: "TV - Top Chef"}
- {id: 224, cat: TV, desc: "TV - Top Gear"}
- {id: 942, cat: TV, desc: "TV - Top Shot"}
- {id: 762, cat: TV, desc: "TV - Torchwood"}
- {id: 836, cat: TV, desc: "TV - Touch"}
- {id: 225, cat: TV, desc: "TV - Trailer Park Boys"}
- {id: 1001, cat: TV, desc: "TV - Transformers Prime"}
- {id: 733, cat: TV, desc: "TV - Treme"}
- {id: 303, cat: TV, desc: "TV - Tripping the Rift"}
- {id: 787, cat: TV, desc: "TV - Trophy Wife"}
- {id: 565, cat: TV, desc: "TV - True Blood"}
- {id: 180, cat: TV, desc: "TV - True Detective"}
- {id: 727, cat: TV, desc: "TV - Turn"}
- {id: 261, cat: TV, desc: "TV - Twin Peaks"}
- {id: 930, cat: TV, desc: "TV - Twisted"}
- {id: 401, cat: TV, desc: "TV - Two And A Half Men"}
- {id: 337, cat: TV, desc: "TV - Tyrant"}
- {id: 793, cat: TV, desc: "TV - UFC"}
- {id: 814, cat: TV, desc: "TV - Ugly Americans"}
- {id: 559, cat: TV, desc: "TV - Ugly Betty"}
- {id: 155, cat: TV, desc: "TV - UK"}
- {id: 934, cat: TV, desc: "TV - Under the Dome"}
- {id: 791, cat: TV, desc: "TV - Underbelly"}
- {id: 706, cat: TV, desc: "TV - Undercover Boss"}
- {id: 777, cat: TV, desc: "TV - Unforgettable"}
- {id: 129, cat: TV, desc: "TV - Unscripted"}
- {id: 739, cat: TV, desc: "TV - Unsealed Alien Files"}
- {id: 226, cat: TV, desc: "TV - Unsolved Mysteries"}
- {id: 868, cat: TV, desc: "TV - Up All Night"}
- {id: 262, cat: TV, desc: "TV - Urgences"}
- {id: 566, cat: TV, desc: "TV - V"}
- {id: 895, cat: TV, desc: "TV - Veep"}
- {id: 864, cat: TV, desc: "TV - Vegas"}
- {id: 121, cat: TV, desc: "TV - Veronica Mars"}
- {id: 908, cat: TV, desc: "TV - Vice"}
- {id: 402, cat: TV, desc: "TV - Viewtiful Joe"}
- {id: 799, cat: TV, desc: "TV - Vikings"}
- {id: 227, cat: TV, desc: "TV - Viva La Bam"}
- {id: 263, cat: TV, desc: "TV - Wanted"}
- {id: 593, cat: TV, desc: "TV - Warehouse 13"}
- {id: 995, cat: TV, desc: "TV - Wayward Pines"}
- {id: 264, cat: TV, desc: "TV - Weeds"}
- {id: 404, cat: TV, desc: "TV - Weird U S"}
- {id: 909, cat: TV, desc: "TV - Wentworth"}
- {id: 596, cat: TV, desc: "TV - When Ghosts Attack"}
- {id: 575, cat: TV, desc: "TV - White Collar"}
- {id: 406, cat: TV, desc: "TV - Whose Line Is It Anyway"}
- {id: 918, cat: TV, desc: "TV - Wilfred US"}
- {id: 135, cat: TV, desc: "TV - Will And Grace"}
- {id: 673, cat: TV, desc: "TV - Witches of East End"}
- {id: 408, cat: TV, desc: "TV - Without A Trace"}
- {id: 800, cat: TV, desc: "TV - Workaholics"}
- {id: 127, cat: TV, desc: "TV - WWE - Wrestling"}
- {id: 228, cat: TV, desc: "TV - X Files"}
- {id: 770, cat: TV, desc: "TV - X-Men"}
- {id: 265, cat: TV, desc: "TV - Young and the Restless"}
- {id: 801, cat: TV, desc: "TV - Young Justice"}
- {id: 889, cat: TV, desc: "TV - Zero Hour US"}
- {id: 1025, cat: TV, desc: "TV - HEVC/x265"}
- {id: 1026, cat: TV, desc: "TV - Divx/Xvid"}
- {id: 1027, cat: TV, desc: "TV - DVD"}
- {id: 1028, cat: TV, desc: "TV/HD - HD"}
- {id: 1029, cat: TV, desc: "TV - SVCD/VCD"}
#Apps
- {id: 7, cat: PC, desc: "Software"}
- {id: 416, cat: PC/Phone-Other, desc: "Software - Mobile"}
- {id: 532, cat: PC, desc: "Software - KeyGen / Tools"}
- {id: 17, cat: PC, desc: "Software - Linux"}
- {id: 27, cat: PC/Mac, desc: "Software - Mac"}
- {id: 232, cat: PC/Phone-Other, desc: "Software - Mobile phones"}
- {id: 18, cat: PC, desc: "Software - Other operating systems"}
- {id: 19, cat: PC, desc: "Software - Palm, PocketPC and IPAQ"}
- {id: 20, cat: PC, desc: "Software - Windows - CD/DVD Tools"}
- {id: 25, cat: PC, desc: "Software - Windows - Other"}
- {id: 21, cat: PC, desc: "Software - Windows - Photo Editing"}
- {id: 22, cat: PC, desc: "Software - Windows - Security"}
- {id: 23, cat: PC, desc: "Software - Windows - Sound Editing"}
- {id: 24, cat: PC, desc: "Software - Windows - Video Apps"}
#Games
- {id: 3, cat: PC/Games, desc: "Games"}
- {id: 136, cat: PC/Games, desc: "Games - fixes/patches"}
- {id: 422, cat: PC/Games, desc: "Games - Other"}
- {id: 26, cat: PC/Games, desc: "Games - Mac"}
- {id: 231, cat: Console, desc: "Games - Mobile phones"}
- {id: 627, cat: Console/NDS, desc: "Games - Nintendo DS"}
- {id: 11, cat: Console, desc: "Games - PS 2"}
- {id: 700, cat: Console/PS3, desc: "Games - PS 3"}
- {id: 12, cat: Console, desc: "Games - PS X"}
- {id: 158, cat: Console/PSP, desc: "Games - PSP"}
- {id: 13, cat: Console, desc: "Games - ROMS/Retro"}
- {id: 15, cat: Console, desc: "Games - Sega Saturn"}
- {id: 14, cat: PC/Games, desc: "Games - Video Demonstrations"}
- {id: 701, cat: Console/Wii, desc: "Games -Wii"}
- {id: 421, cat: PC/Games, desc: "Games - Windows"}
- {id: 10, cat: PC/Games, desc: "Games - Windows Kids Games"}
- {id: 16, cat: Console/Xbox, desc: "Games - XBox"}
- {id: 1017, cat: Console, desc: "Games - PS 1"}
- {id: 1018, cat: Console/Xbox 360, desc: "Games - Xbox 360"}
- {id: 1014, cat: Console/3DS, desc: "Games - Nintendo 3DS"}
- {id: 1015, cat: Console, desc: "Games - Dreamcast"}
- {id: 1016, cat: Console, desc: "Games - GameCube"}
#XXX
- {id: 533, cat: XXX, desc: "XXX"}
- {id: 943, cat: XXX, desc: "XXX - Animation/Hentai"}
- {id: 553, cat: XXX/DVD, desc: "XXX - DVD"}
- {id: 536, cat: XXX, desc: "XXX - Games"}
- {id: 948, cat: XXX/x264, desc: "XXX - HD Video"}
- {id: 535, cat: XXX/Imageset, desc: "XXX - Pictures"}
- {id: 552, cat: XXX, desc: "XXX - Video"}
- {id: 804, cat: XXX, desc: "XXX - Video 3D"}
- {id: 970, cat: XXX, desc: "XXX - Virtual Reality"}
- {id: 806, cat: XXX, desc: "XXX - Wallpapers"}
#Books
- {id: 2, cat: Books, desc: "Books"}
- {id: 625, cat: Books, desc: "Books - Adventure"}
- {id: 51, cat: Books, desc: "Books - Audio books"}
- {id: 848, cat: Books/Comics, desc: "Books - Comics"}
- {id: 624, cat: Books, desc: "Books - Crime"}
- {id: 623, cat: Books, desc: "Books - Drama"}
- {id: 50, cat: Books/Ebook, desc: "Books - Ebooks"}
- {id: 621, cat: Books, desc: "Books - Educational"}
- {id: 622, cat: Books, desc: "Books - Horror"}
- {id: 465, cat: Books/Magazines, desc: "Books - Magazines"}
- {id: 1000, cat: Books, desc: "Books - Sexual Fitness and Education"}
- {id: 626, cat: Books, desc: "Books - True Stories"}
#Other
- {id: 6, cat: Other, desc: "Pictures"}
- {id: 9, cat: Other, desc: "Other"}
- {id: 53, cat: Other, desc: "Pictures - Other"}
- {id: 52, cat: Other, desc: "Wallpapers"}
- {id: 80, cat: Other, desc: "Other - Articles"}
- {id: 143, cat: Other, desc: "Other - Comics"}
- {id: 85, cat: Other, desc: "Other - Funny clips"}
- {id: 81, cat: Other, desc: "Other - Manuals"}
- {id: 83, cat: Other, desc: "Other - Other"}
- {id: 413, cat: Other, desc: "Other - Radio shows"}
- {id: 82, cat: Other, desc: "Other - Religion"}
- {id: 874, cat: Other, desc: "Other - Subtitles"}
- {id: 557, cat: Other, desc: "Other - Training "}
- {id: 1021, cat: Other, desc: "Other - Tutorials"}
- {id: 1022, cat: Other, desc: "Other - Sounds"}
- {id: 1023, cat: Other, desc: "Other - Nulled Scripts"}
#Mobile
- {id: 752, cat: PC/Phone-Other, desc: "Mobile - Games for Android"}
- {id: 746, cat: PC/Phone-Other, desc: "Mobile - Games for Apple iPod, iPod Touch, iPad, iPhone"}
- {id: 745, cat: PC/Phone-Other, desc: "Mobile - Games for Java"}
- {id: 744, cat: PC/Phone-Other, desc: "Mobile - Games for Symbian"}
- {id: 743, cat: PC/Phone-Other, desc: "Mobile - Games for Windows Mobile"}
- {id: 517, cat: PC/Phone-Other, desc: "Mobile - Music"}
- {id: 554, cat: PC/Phone-Other, desc: "Mobile - Other"}
- {id: 748, cat: PC/Phone-Other, desc: "Mobile - Software - Other"}
- {id: 972, cat: PC/Phone-Other, desc: "Mobile - Software for Android"}
- {id: 749, cat: PC/Phone-Other, desc: "Mobile - Software for Apple iPad, iPhone, iPod Touch"}
- {id: 747, cat: PC/Phone-Other, desc: "Mobile - Software for Windows Mobile"}
- {id: 428, cat: PC/Phone-Other, desc: "Mobile - Tv"}
- {id: 417, cat: PC/Phone-Other, desc: "Mobile - Video"}
- {id: 750, cat: PC/Phone-Other, desc: "Mobile - Video for Apple iPad, iPhone, iPod Touch"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
search:
paths:
- path: "{{if .Keywords}}search/?search={{ .Keywords}}{{else}}{{end}}"
rows:
selector: tr[class^="tlr"]
fields:
title:
selector: td.tli a
category:
selector: td a[href^="/category/"]
attribute: href
filters:
- name: split
args: ["/", 2]
details:
selector: td.tli a
attribute: href
download:
selector: td a[href^="magnet:?xt="]
attribute: href
date:
selector: td:nth-last-of-type(5)
filters:
- name: timeago
size:
selector: td:nth-last-of-type(4)
seeders:
text: 0
leechers:
text: 0
seeders:
optional: true
selector: td.sy
leechers:
optional: true
selector: td.ly
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -5,8 +5,12 @@
language: en-us
type: public
encoding: UTF-8
followredirect: true
links:
- https://eztv.io/
legacylinks:
- https://eztv.ag/
- https://eztv.re/
caps:
categories:

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

@@ -5,15 +5,20 @@
language: fr-fr
type: public
encoding: UTF-8
followredirect: true
links:
- https://ww2.gktorrent.com/
- https://www.gktorrent.me/
legacylinks:
- https://www.gktorrent.org/
- http://www.gktorrent.net/
- https://www.gktorrent.com/ # they're forcing http
- https://www.gktorrent.com/
- http://www.gktorrent.com/
- http://ww1.gktorrent.com/
- http://ww2.gktorrent.com/ # they're forcing https
- http://ww2.gktorrent.com/
- https://ww2.gktorrent.com/
- https://ww3.gktorrent.com/
- http://www.gktorrent.net/
- https://www.gktorrent.net/
- https://ww4.gktorrent.com/
caps:
categorymappings:

View File

@@ -79,6 +79,30 @@
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"
@@ -87,4 +111,5 @@
uploadvolumefactor:
case:
"i[data-original-title=\"Double upload\"]": "2"
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"

View File

@@ -0,0 +1,104 @@
---
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
title: # special selector which only matches HDC releases not containing "English" and "only" tags and doesn't contain English in the title
selector: td.cats_col:has(a[href*="filter_cat[9]=1"]) + td.title_col:not(:has(span.tags_inner:contains("English"):contains("only"))):not(:has(span.tags_inner:contains("English"):contains("Only"))):not(:has(span.tags_inner:contains("english"):contains("only"))) a.torrent_link_title:not(:contains("English"))
optional: true
filters:
- name: replace # add GERMAN tag
args: ["-HDC", ".GERMAN-HDC"]
title: # special selector which only matches TvR releases not containing "GERMAN" already
selector: td.cats_col:has(a[href*="filter_cat[10]=1"]) + td.title_col a.torrent_link_title:not(:contains("GERMAN"))
optional: true
filters:
- name: replace # add GERMAN tag
args: [".DL", ".GERMAN.DL"]
category:
selector: td.cats_col > a
attribute: href
filters:
- name: regexp
args: "\\[(\\d+?)\\]"
date:
selector: td.time_col > .time
filters:
- name: append
args: " +01: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

@@ -114,7 +114,7 @@
selector: td:has(a[href$="filelist=1#filelist"])
remove: a
date:
selector: td > font:has(i.fa-clock-o)
selector: td > span:has(i.fa-clock)
remove: b
filters:
- name: replace

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: "999"
selector: div.seedbar span:nth-child(1)
filters:
- name: replace
args: ["Seed: ", ""]
leechers:
text: "999"
selector: div.seedbar span:nth-child(2)
filters:
- name: replace
args: ["Leech: ", ""]
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -136,26 +136,36 @@
details:
selector: td:nth-child(2) > a
attribute: href
banner:
optional: true
selector: td:nth-child(2) > a
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) "
# banner:
# optional: true
# selector: td:nth-child(2) > a
# attribute: onmouseover
# filters:
# - name: regexp
# args: "src=(.+?) "
size:
selector: td:nth-child(10)
selector: td:nth-last-child(2)
date:
selector: td:nth-child(6)
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-child(9)
selector: td:nth-last-child(3)
filters:
- name: replace
args: ["---", "0"]
seeders:
selector: td:nth-child(7)
selector: td:nth-last-child(5)
leechers:
selector: td:nth-child(8)
selector: td:nth-last-child(4)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -6,11 +6,17 @@
type: public
encoding: UTF-8
links:
- https://ilcorsaronero.cc/
legacylinks:
- https://ilcorsaronero.info/
- https://ilcorsaronero.ch/
certificates:
- 89c12d4a080b5aeec00acbb269dc9b44584b1b3f # incomplete CA chain
- aa7c40aa360a1cec8a9687312fd50402b912e618 # incomplete CA chain
- 83174ec1f92fa13cdef9d51888ea1dfba2166e17 # incomplete CA chain
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
- 3a402766ce22fd1aa24bfc1a4fd47e9309eb8c98 # incomplete CA chain
- 160f832730737a70264768ceddf3cd94bc51ffb7 # incomplete CA chain
caps:
categorymappings:

View File

@@ -6,7 +6,13 @@
type: public
encoding: UTF-8
links:
- https://kickasstvshow.xyz/
legacylinks:
- https://kickasskatcr.website/
- https://kickasskatcr.stream/
- https://kickassextratorrent.xyz/
- https://kickassextratorrent.website/
- https://kickassextratorrent.club/
caps:
categories:
@@ -35,6 +41,8 @@
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}new/{{end}}"
rows:
selector: table.data tr.odd
filters:
- name: andmatch
fields:
category:
selector: span.uploader_block strong a

View File

@@ -11,89 +11,91 @@
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 84, cat: Movies, desc: "N ees (2016, 2017)"}
- {id: 14, cat: Movies/SD, desc: "DVDRip-BDRip-BRRip (e?? 2015) FREE"}
- {id: 16, cat: Movies/SD, desc: "In Avouri (CAM) FREE"}
- {id: 17, cat: Movies/BluRay, desc: "B LU-RAY"}
- {id: 44, cat: Movies, desc: "E English Movies"}
- {id: 76, cat: Movies, desc: "N tokimanter"}
- {id: 82, cat: Movies, desc: "I EATP"}
- {id: 84, cat: Movies, desc: "Movies New (2017, 2018)"}
- {id: 14, cat: Movies/SD, desc: "Movies DVDRip-BDRip-BRRip (up to 2016) FREE"}
- {id: 16, cat: Movies/SD, desc: "Movies (CAM) FREE"}
- {id: 17, cat: Movies/BluRay, desc: "Movies BLU-RAY"}
- {id: 44, cat: Movies, desc: "Movies Greek"}
- {id: 76, cat: Movies, desc: "Movies Documentaries"}
- {id: 82, cat: Movies, desc: "Movies Theater"}
- {id: 52, cat: TV, desc: "series"}
- {id: 53, cat: TV/SD, desc: ", O Enes"}
- {id: 70, cat: TV/HD, desc: "O Enes (720p)"}
- {id: 54, cat: TV, desc: "E English"}
- {id: 86, cat: TV, desc: "O Enes Complete Seasons"}
- {id: 92, cat: TV, desc: "O Enes Complete Seasons (720p)"}
- {id: 87, cat: TV, desc: "E English Complete Seasons"}
- {id: 63, cat: TV, desc: "Y ychagogikes Emissions"}
- {id: 52, cat: TV, desc: "TV Series"}
- {id: 53, cat: TV/SD, desc: "TV Series Foreign"}
- {id: 70, cat: TV/HD, desc: "TV Series Foreign (720p)"}
- {id: 54, cat: TV, desc: "TV Series Greek"}
- {id: 86, cat: TV, desc: "TV Series Foreign Complete Seasons"}
- {id: 92, cat: TV, desc: "TV Series Foreign Complete Seasons (720p)"}
- {id: 87, cat: TV, desc: "TV Series Greek Complete Seasons"}
- {id: 63, cat: TV, desc: "TV Series Recreational"}
- {id: 83, cat: TV/Sport, desc: "TV Sports"}
- {id: 55, cat: Movies, desc: "Children"}
- {id: 38, cat: Movies, desc: "M etaglotismena (Movies)"}
- {id: 39, cat: Movies, desc: "M e Subtitled (Movies)"}
- {id: 93, cat: Movies, desc: "M etaglotismena (Series)"}
- {id: 94, cat: Movies, desc: "M e Subtitled (Series)"}
- {id: 45, cat: Movies, desc: "I absent Anime"}
- {id: 98, cat: Movies, desc: "M etaglotismena 3D"}
- {id: 64, cat: Movies, desc: "M music for Children"}
- {id: 38, cat: Movies, desc: "Children (Movies)"}
- {id: 39, cat: Movies, desc: "Children Subtitled (Movies)"}
- {id: 93, cat: Movies, desc: "Children (TV Series)"}
- {id: 94, cat: Movies, desc: "Children Subtitled (TV Series)"}
- {id: 45, cat: Movies, desc: "Children Anime"}
- {id: 98, cat: Movies, desc: "Children 3D"}
- {id: 64, cat: Movies, desc: "Children Music"}
- {id: 7, cat: Audio, desc: "Foreign music"}
- {id: 21, cat: Audio, desc: "N ees Releases"}
- {id: 46, cat: Audio, desc: "P. Alai Releases"}
- {id: 32, cat: Audio, desc: "D. iskografies"}
- {id: 20, cat: Audio, desc: "In ylloges"}
- {id: 102, cat: Audio, desc: "M AGICO Radio"}
- {id: 81, cat: Audio, desc: "K araoke"}
- {id: 95, cat: Audio, desc: "Soundtrack"}
- {id: 7, cat: Audio, desc: "Music Foreign"}
- {id: 21, cat: Audio, desc: "Music Foreign New Releases"}
- {id: 46, cat: Audio, desc: "Music Foreign Old Releases"}
- {id: 32, cat: Audio, desc: "Music Foreign Discographies"}
- {id: 20, cat: Audio, desc: "Music Foreign Collections"}
- {id: 102, cat: Audio, desc: "Music Foreign MAGICO Radio"}
- {id: 81, cat: Audio, desc: "Music Foreign Karaoke"}
- {id: 95, cat: Audio, desc: "Music Foreign Soundtrack"}
- {id: 47, cat: Audio, desc: "Greek music"}
- {id: 48, cat: Audio, desc: "N ees Releases"}
- {id: 49, cat: Audio, desc: "P. Alai Releases"}
- {id: 51, cat: Audio, desc: "D. iskografies"}
- {id: 50, cat: Audio, desc: "In ylloges"}
- {id: 101, cat: Audio, desc: "M AGICO Radio"}
- {id: 97, cat: Audio, desc: "Live Cd 's"}
- {id: 57, cat: Audio, desc: "P empetika"}
- {id: 58, cat: Audio, desc: "D. imotika"}
- {id: 59, cat: Audio, desc: "K exception of preservatives"}
- {id: 60, cat: Audio, desc: "N isiotika"}
- {id: 62, cat: Audio, desc: "P. ontiaka"}
- {id: 80, cat: Audio, desc: "K araoke"}
- {id: 96, cat: Audio, desc: "Soundtracks"}
- {id: 47, cat: Audio, desc: "Music Greek"}
- {id: 48, cat: Audio, desc: "Music Greek New Releases"}
- {id: 49, cat: Audio, desc: "Music Greek Old Releases"}
- {id: 51, cat: Audio, desc: "Music Greek Discographies"}
- {id: 50, cat: Audio, desc: "Music Greek Collections"}
- {id: 101, cat: Audio, desc: "Music Greek MAGICO Radio"}
- {id: 97, cat: Audio, desc: "Music Greek Live Cd's"}
- {id: 57, cat: Audio, desc: "Music Greek Rebetika"}
- {id: 58, cat: Audio, desc: "Music Greek Primary"}
- {id: 59, cat: Audio, desc: "Music Greek Cretan"}
- {id: 60, cat: Audio, desc: "Music Greek Island"}
- {id: 62, cat: Audio, desc: "Music Greek Pontian"}
- {id: 80, cat: Audio, desc: "Music Greek Karaoke"}
- {id: 96, cat: Audio, desc: "Music Greek Soundtracks"}
- {id: 73, cat: Audio, desc: "seasonal Music"}
- {id: 74, cat: Audio, desc: "X ristougenna"}
- {id: 79, cat: Audio, desc: "P. ascha"}
- {id: 75, cat: Audio, desc: "A pokriatika"}
- {id: 78, cat: Audio, desc: "A Tariff Valentine"}
- {id: 73, cat: Audio, desc: "Music Seasonal"}
- {id: 74, cat: Audio, desc: "Music Seasonal Xmas"}
- {id: 79, cat: Audio, desc: "Music Seasonal Easter"}
- {id: 75, cat: Audio, desc: "Music Seasonal Halloween"}
- {id: 78, cat: Audio, desc: "Music Seasonal Valentines"}
- {id: 33, cat: Books, desc: "Books"}
- {id: 41, cat: Books, desc: "E nglis"}
- {id: 65, cat: Books, desc: "K omix"}
- {id: 43, cat: Books, desc: "P. periods"}
- {id: 72, cat: Books, desc: "P. aidika"}
- {id: 66, cat: Books, desc: "L. exika - Educational"}
- {id: 42, cat: Books, desc: "O enoglossa"}
- {id: 67, cat: Books, desc: "E. Konya-Photos"}
- {id: 41, cat: Books, desc: "Books Greek"}
- {id: 65, cat: Books, desc: "Books Comics"}
- {id: 43, cat: Books, desc: "Books Periodicals"}
- {id: 105, cat: Books, desc: "Books Audio"}
- {id: 72, cat: Books, desc: "Books Children"}
- {id: 66, cat: Books, desc: "Books Educational"}
- {id: 42, cat: Books, desc: "Books Foreign"}
- {id: 67, cat: Books, desc: "Books Photos"}
- {id: 6, cat: PC, desc: "programs"}
- {id: 18, cat: PC/0day, desc: "PC"}
- {id: 40, cat: PC/Phone-Android, desc: "Android"}
- {id: 19, cat: PC/Mac, desc: "Mac"}
- {id: 6, cat: PC, desc: "Programs"}
- {id: 18, cat: PC/0day, desc: "Programs PC"}
- {id: 40, cat: PC/Phone-Android, desc: "Programs Android"}
- {id: 19, cat: PC/Mac, desc: "Programs Mac"}
- {id: 2, cat: PC/Games, desc: "Games"}
- {id: 27, cat: PC/Games, desc: "PC"}
- {id: 68, cat: PC/Phone-Android, desc: "Android"}
- {id: 27, cat: PC/Games, desc: "Games PC"}
- {id: 68, cat: PC/Phone-Android, desc: "Games Android"}
- {id: 88, cat: Other, desc: "Design / Tutorials / Accessories"}
- {id: 89, cat: Other, desc: "Photoshop Tutorials"}
- {id: 91, cat: Other, desc: "Illustrator Tutorials"}
- {id: 90, cat: Other, desc: "After Effects Tutorials"}
- {id: 88, cat: Other, desc: "Tutorials / Design / Accessories"}
- {id: 89, cat: Other, desc: "Tutorials Photoshop"}
- {id: 91, cat: Other, desc: "Tutorials Illustrator"}
- {id: 90, cat: Other, desc: "Tutorials After Effects"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: /?p=home&pid=1
@@ -135,28 +137,29 @@
error:
- selector: div#show_error font
rows:
selector: div#content > div.torrent-box[id^="torrent_"]
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: div.categoryImage > a
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
selector: a[href^="http://www.imdb.com/title/tt"]
attribute: href
size:
@@ -172,6 +175,7 @@
selector: a[rel="fancybox"]
attribute: href
description:
optional: true
selector: div.torrentDetails > div:has(span.floatright)
downloadvolumefactor:
case:
@@ -217,5 +221,17 @@
args: ["Κυριακή", "Sunday"]
- name: dateparse
args: "02-01-2006 15:04"
date:
# <br /> Uploaded Saturday at 21:09 by
optional: true
selector: td.torrent_name
remove: div, a, span
filters:
- name: replace
args: ["Uploaded ", ""]
- name: replace
args: [" by", ""]
- name: replace
args: ["at ", ""]
- name: dateparse
args: "02-01-2006 15:04"

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://www.magnetdl.com/
legacylinks:
- http://www.magnetdl.com/
caps:

View File

@@ -0,0 +1,114 @@
---
site: metaliplayro
name: Romanian Metal Torrent
description: "Romanian Metal Torrent is a Private site dedicated to METAL MUSIC. This definition is for the English site."
language: en-us
type: private
encoding: UTF-8
links:
- https://metal.iplay.ro/
legacylinks:
- https://metal.stream.bike/
caps:
categories:
"Music": Audio
modes:
search: [q]
music-search: [q, album, artist, label, year]
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img
input: vImageCodP
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: div.errorSummary
message:
selector: div.errorSummary ul li
test:
path: browse.php
selector: a[href="logout.php"]
ratio:
path: browse.php
selector: img:contains("Ratio =") > img
download:
method: get
before:
path: "login.php"
method: "post"
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
search:
paths:
- path: browse.php
method: get
inputs:
"search": "{{if .Query.Artist}}{{ .Query.Artist }}{{else}}{{ .Keywords }}{{end}}"
rows:
selector: table.torrents_table tbody tr:has(a[href^="download2.php?id="])
fields:
title:
selector: td a[href^="details.php?id="]
details:
selector: td a[href^="details.php?id="]
attribute: href
download:
selector: td a[href^="download2.php?id="]
attribute: href
filters:
- name: replace
args: ["download2.php?id=", "download.php/"]
- name: append
args: "/{{ .Result.title }}.torrent"
banner:
optional: true
selector: td:nth-child(2) a
attribute: onmouseover
filters:
- name: regexp
args: 'img src=(.+?) >'
- name: replace
args: ["./pic/noposter.jpg", ""]
date:
selector: td:nth-child(8) > span
attribute: title
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
filters:
- name: regexp
args: '([\d]+) seeders?'
leechers:
selector: td:nth-child(7)
filters:
- name: regexp
args: '([\d]+) leechers?'
grabs:
selector: td:nth-child(6)
filters:
- name: regexp
args: '([\d]+) times'
category:
text: "Music"
downloadvolumefactor:
case:
img[src$="pic/freedownload.gif"]: "0"
img[src$="pic/half.gif"]: "0.5"
"*": "1"
uploadvolumefactor:
case:
img[src$="pic/sticky2.gif"]: "1.5"
"*": "1"

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

@@ -9,6 +9,20 @@
- https://nnm-club.me/
legacylinks:
- https://nnm-club.name/
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:
@@ -724,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

@@ -0,0 +1,107 @@
---
site: prostylex
name: ProStyleX
description: "ProStyleX is a Public torrent site for 0Day and General"
language: en-us
type: public
encoding: UTF-8
links:
- http://prostylex.com/
caps:
categorymappings:
- {id: 1, cat: Movies/SD, desc: "Movies - Divx/Xvid"}
- {id: 2, cat: Movies/WEBDL, desc: "Movies - h.264/x264"}
- {id: 3, cat: Movies/HD, desc: "Movies - HD"}
- {id: 4, cat: Movies/DVD, desc: "Movies - DVD"}
- {id: 5, cat: Movies/Other, desc: "Movies - Cam/TS"}
- {id: 6, cat: Movies/Foreign, desc: "Movies - Non-English"}
- {id: 7, cat: Movies/3D, desc: "Movies - 3D"}
- {id: 8, cat: Movies/UHD, desc: "Movies - 4K"}
- {id: 9, cat: Movies/Other, desc: "Movies - Dubs/Dual Audio"}
- {id: 12, cat: TV/WEB-DL, desc: "TV - x264"}
- {id: 13, cat: TV/SD, desc: "TV - Xvid"}
- {id: 14, cat: TV/HD, desc: "TV - HD"}
- {id: 15, cat: TV/OTHER, desc: "TV - Packs"}
- {id: 20, cat: Audio/MP3, desc: "Music - Audio"}
- {id: 21, cat: Audio/Video, desc: "Music - Video"}
- {id: 22, cat: Audio/Other, desc: "Music - Other"}
- {id: 40, cat: XXX, desc: "XXX - Video"}
- {id: 42, cat: XXX, desc: "XXX - HD Video"}
- {id: 43, cat: XXX, desc: "XXX - Movie"}
- {id: 44, cat: XXX, desc: "XXX - Anime/Hentai"}
- {id: 45, cat: XXX, desc: "XXX - Pics/Comix/Book"}
- {id: 46, cat: XXX, desc: "XXX - Games"}
- {id: 53, cat: Audio/Audiobook, desc: "Books - Audio books"}
- {id: 54, cat: Books/Comics, desc: "Books - Comics"}
- {id: 55, cat: Books/Ebook, desc: "Books - Ebooks"}
- {id: 56, cat: Books/Magazines, desc: "Books - Magazines"}
- {id: 57, cat: Books/Other, desc: "Books - Other"}
- {id: 58, cat: Other, desc: "Pictures - Other"}
- {id: 59, cat: Other, desc: "Pictures - Wallpapers"}
- {id: 65, cat: TV/Anime, desc: "Anime - All"}
- {id: 90, cat: PC/ISO, desc: "Games - PC-ISO"}
- {id: 91, cat: Console, desc: "Games - PS2"}
- {id: 92, cat: Console/PSP, desc: "Games - PSP"}
- {id: 93, cat: Console/PS3, desc: "Games - PS3"}
- {id: 94, cat: PC/Games, desc: "Games - PC-RIP"}
- {id: 95, cat: Console/Xbox 360, desc: "Games - Xbox360"}
- {id: 96, cat: Console/Other, desc: "Games - Other"}
- {id: 97, cat: Console/Wii, desc: "Games - Wii"}
- {id: 98, cat: Console/NDS, desc: "Games - Nintendo DS"}
- {id: 99, cat: PC/Phone-Android, desc: "Games - Android"}
- {id: 120, cat: PC/0day, desc: "Apps - Windows"}
- {id: 121, cat: PC, desc: "Apps - Linux"}
- {id: 122, cat: PC/Phone-Android, desc: "Apps - Android"}
- {id: 123, cat: PC/Mac, desc: "Apps - Mac"}
- {id: 124, cat: PC, desc: "Apps - Other"}
- {id: 130, cat: Other, desc: "Other - Other"}
- {id: 134, cat: Other, desc: "Other - Tutorials"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
download:
selector: a[href^="magnet:?"]
search:
paths:
# http://prostylex.com/torrents-search.php?search=
# http://prostylex.com/torrents-search.php?c1=1&c2=1&c3=1&search=expanse&cat=0&incldead=0&freeleech=0&inclexternal=0&lang=0
- path: "torrents-search.php?{{range .Categories}}c{{.}}=1&{{end}}{{if .Keywords}}&search={{ .Keywords}}&cat=0&incldead=0&freeleech=0&inclexternal=0&lang=0{{else}}search={{end}}"
rows:
# selector: tr:has(a[href^="/torrent/"])
selector: tr.t-row
fields:
title:
selector: td a[href^="torrents-details.php?id="]
category:
selector: td a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: td a[href^="torrents-details.php?id="]
attribute: href
download:
selector: td a[href^="torrents-details.php?id="]
attribute: href
date:
selector: th:nth-child(5)
filters:
- name: timeago
size:
selector: th:nth-child(4)
seeders:
selector: th:nth-child(6)
leechers:
selector: th:nth-child(7)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -84,12 +84,37 @@
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"
"i[data-original-title=\"Global FreeLeech\"]": "0"
"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"
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
"*": "1"

View File

@@ -33,7 +33,7 @@
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Login Failed!")
- selector: form[action*="/login"] .text-red
test:
path: /torrents
@@ -77,6 +77,30 @@
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"

View File

@@ -0,0 +1,81 @@
---
site: RockBox
name: RockBox Rock/Metal Tracker
description: "RockBox Semi-Private site dedicated to HEAVY METAL/ROCK MUSIC. This definition is for the English site."
language: en-us
type: semi-private
encoding: UTF-8
links:
- https://rawkbawx.rocks/
caps:
categories:
"Music": Audio
modes:
search: [q]
music-search: [q, album, artist, label, year]
login:
path: login.php
method: form
form: form[action="login.php?returnto=index.php"]
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: div.errorSummary
message:
selector: div.errorSummary ul li
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
method: get
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: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:
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:
# 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:
selector: td:nth-child(11)
category:
text: "Music"
downloadvolumefactor:
text: "1"
uploadvolumefactor:
text: "1"

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

@@ -0,0 +1,103 @@
---
site: scenerush
name: SceneRush
description: "SceneRush is a Portuguese general tracker."
language: pt-PT
type: private
encoding: UTF-8
links:
- http://www.scene-rush.pt
caps:
categorymappings:
- {id: 1, cat: PC, desc: "Apps"}
- {id: 5, cat: PC/Games, desc: "PC Games"}
- {id: 6, cat: Movies/HD, desc: "HD"}
- {id: 7, cat: XXX, desc: "XXX"}
- {id: 8, cat: TV/Anime, desc: "ANIME"}
- {id: 9, cat: Audio, desc: "Audio"}
- {id: 11, cat: Console/Xbox 360, desc: "XBOX 360"}
- {id: 12, cat: Console/PSP, desc: "PSP"}
- {id: 13, cat: TV/Documentary, desc: "DOC"}
- {id: 17, cat: TV/HD, desc: "TV-X264"}
- {id: 19, cat: XXX/DVD, desc: "XXX DVD"}
- {id: 20, cat: Movies/DVD, desc: "A.DVD"}
- {id: 21, cat: PC/Mac, desc: "MAC"}
- {id: 32, cat: Movies/BluRay, desc: "BluRay"}
- {id: 33, cat: Console/Wii, desc: "WII"}
- {id: 34, cat: Console/PS3, desc: "PS3"}
- {id: 35, cat: Movies/HD, desc: "A.HD"}
- {id: 36, cat: PC/Phone-Android, desc: "Android"}
- {id: 37, cat: Movies/DVD, desc: "C.DVDR"}
- {id: 38, cat: Movies/Other, desc: "CAM TS"}
- {id: 40, cat: Console/PS4, desc: "PS4"}
- {id: 41, cat: Movies/SD, desc: "BDRIP"}
- {id: 42, cat: Movies/WEBDL, desc: "WEB DL"}
- {id: 43, cat: Books, desc: "EBOOK"}
- {id: 44, cat: TV/Sport, desc: "SPORTS"}
modes:
search: [q]
tv-search: [q]
login:
path: /takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("failed")+table)
test:
path: /browse.php
ratio:
path: /browse.php
selector: td[width='60'][style=['text-align:center;'] > span > font
search:
paths:
- path: /browse.php
method: post
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "1"
blah: "0"
rows:
selector: table[cellpadding='5'][width='96%'] > tbody > tr:has(a[href*="details.php?id="])
fields:
title:
selector: td:nth-child(2) > a > b
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
size:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(10)
seeders:
selector: td:nth-child(11)
leechers:
selector: td:nth-child(12)
date:
selector: td:nth-child(7)
filters:
- name: re_replace
args: ["(\\d{4}-\\d{2}-\\d{2})(\\d{2}:\\d{2}:\\d{2})","$1 $2"]
- name: dateparse
args: "2018-12-30 22:30:31"
downloadvolumefactor:
case:
"i.fg-gold": "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}
@@ -87,6 +87,10 @@
"99": "Default"
"8": "Seeders"
"3": "Time"
- name: info
type: info
label: Proxies
default: The Pirate Bay is currently only reachable via TOR. But you can try to use an unofficial proxy from <a href="https://piratebayproxy.info/" target="_blank">piratebayproxy.info</a>.
search:
paths:

View File

@@ -32,6 +32,18 @@
tv-search: [q]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: info
type: info
label: Layout
default: Only the classic profile is supported. Make sure to set the "Torrent listesi" option in your profile to "Klasik".
login:
path: /?p=home&pid=1
method: form

View File

@@ -5,8 +5,9 @@
language: fr-fr
type: public
encoding: UTF-8
followredirect: true
links:
- https://www.torrent9.ph/
- https://ww1.torrent9.ph/
legacylinks:
- http://www.torrent9.ec/
- http://www.torrent9.red/
@@ -18,6 +19,7 @@
- https://www.torrent9.blue/
- https://ww2.torrent9.blue/
- https://www.torrent9.rip/
- https://www.torrent9.ph/
caps:
categorymappings:

View File

@@ -0,0 +1,129 @@
---
site: torrent9clone
name: Torrent9 clone (torrents9.ch)
description: "Torrent9 is a FRENCH Public site for TV / MOVIES / GENERAL"
language: fr-fr
type: public
encoding: UTF-8
links:
- https://www.torrent9.ch/
caps:
categorymappings:
- {id: films, cat: Movies, desc: "Movies"}
- {id: series, cat: TV, desc: "TV"}
- {id: musique, cat: Audio, desc: "Music"}
- {id: ebook, cat: Books, desc: "Books"}
- {id: logiciels, cat: PC, desc: "Software"}
- {id: jeux-pc, cat: PC/Games, desc: "PC Games"}
- {id: jeux-consoles, cat: Console/Xbox360, desc: "Console Games"}
modes:
search: [q]
tv-search: [q, season, ep]
settings:
- name: category
type: select
label: Category Filter
default: "/"
options:
"/" : "All"
"/films/": "Movies"
"/films-french/": "Movies/French"
"/films-vostfr/": "Movies/VOSTFR"
"/films-dvdrip-x264/": "Movies/DVDRIP .x264"
"/720p/": "Movies/BluRay 720p"
"/1080p/": "Movies/BluRay 1080p"
"/series/": "TV/Series"
"/series-vostfr/": "TV/VOSTFR"
"/series-francaise/": "TV/French"
"/series-dvdrip/": "TV/DVDRIP"
"/spectacles/": "Shows"
"/musique/": "Music"
"/ebook/": "Ebooks"
"/logiciels/": "Software"
"/jeux-pc/": "PC Games"
"/jeux-consoles/": "Console Games"
download:
selector: a[href^="magnet:?"]
attribute: href
search:
paths:
- path: "{{ if .Keywords }}/recherche/{{ .Keywords }}{{else}}/top{{end}}"
rows:
selector: div.table-responsive > table tbody tr
fields:
site_date:
selector: td:nth-child(1) a
filters:
# date is at the end of the title, so we get it and name it site_date
- name: regexp
args: "(\\w+)$"
title:
selector: td:nth-child(1) a
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace
args: ["VOSTFR", "{{ .Result.site_date }} VOSTFR"]
# and we delete it at the end
- name: re_replace
args: ["(\\w+)$", ""]
details:
selector: td:nth-child(1) a
attribute: href
category:
selector: td:nth-child(1) i
case:
i[class="Films"]: films
i[class="Séries"]: series
i[class="Musique"]: musique
i[class=""Jeux-PC"]: jeux-pc
i[class="Logiciels"]: logiciels
i[class="Ebook"]: ebook
download:
selector: td:nth-child(1) a
attribute: href
date:
text: "now"
size:
selector: td:nth-child(2)
filters:
- name: re_replace
args: [ "\\.(\\d) Ko", "$1X00"]
- name: re_replace
args: [ " Ko", "000"]
- name: re_replace
args: [ "\\.(\\d) Mo", "$1X00000"]
- name: re_replace
args: [ " Mo", "000000"]
- name: re_replace
args: [ "\\.(\\d) Go", "$1X00000000"]
- name: re_replace
args: [ " Go", "000000000"]
- name: re_replace
args: [ "\\.(\\d) To", "$1X00000000000"]
- name: re_replace
args: [ " To", "000000000000"]
- name: replace
args: [ "X", "" ]
seeders:
text: 0
seeders:
selector: td:nth-child(3) span.seed_ok
optional: true
leechers:
text: 0
leechers:
selector: td:nth-child(4)
optional: true
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://torrentcouch.net/
legacylinks:
- https://torrentcouch.com/
caps:
@@ -23,10 +25,12 @@
search:
# https://torrentcouch.com/?s=expanse
# https://torrentcouch.net/page/3/?s=expanse
paths:
- path: /
inputs:
s: "{{.Keywords}}"
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
rows:
selector: article
fields:
@@ -45,9 +49,9 @@
size:
text: "500 MB"
seeders:
text: "999"
text: "1"
leechers:
text: "999"
text: "1"
date:
text: now
downloadvolumefactor:

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

@@ -127,6 +127,9 @@
args: c
title:
selector: td:nth-child(2)
filters:
- name: re_replace
args: ["\\s+", " "] # strip redundant whitespaces/newlines
download:
selector: a[href^="/download.php/"]
attribute: href

View File

@@ -0,0 +1,185 @@
---
site: wihd
name: World-In-HD
description: "Your world in HD"
language: fr-fr
type: private
encoding: UTF-8
links:
- https://world-in-hd.net/
caps:
categorymappings:
- {id: 565af82b1fd35761568b4572, cat: Movies/HD, desc: "1080p"}
- {id: 565af82b1fd35761568b4574, cat: Movies/HD, desc: "720p"}
- {id: 565af82b1fd35761568b4576, cat: Movies/HD, desc: "HDTV"}
- {id: 565af82b1fd35761568b4578, cat: Movies/HD, desc: "Bluray"}
- {id: 565af82b1fd35761568b457a, cat: Movies/HD, desc: "Bluray Remux"}
- {id: 565af82b1fd35761568b457c, cat: Movies/HD, desc: "Bluray 3D"}
- {id: 565af82d1fd35761568b4587, cat: TV/HD, desc: "1080p"}
- {id: 565af82d1fd35761568b4589, cat: TV/HD, desc: "720p"}
- {id: 565af82d1fd35761568b458b, cat: TV/HD, desc: "HDTV"}
- {id: 565af82d1fd35761568b458d, cat: TV/HD, desc: "Bluray"}
- {id: 565af82d1fd35761568b458f, cat: TV/HD, desc: "Bluray Remux"}
- {id: 565af82d1fd35761568b4591, cat: TV/HD, desc: "Bluray 3D"}
- {id: 565af82d1fd35761568b459c, cat: TV/Anime, desc: "1080p"}
- {id: 565af82d1fd35761568b459e, cat: TV/Anime, desc: "720p"}
- {id: 565af82d1fd35761568b45a0, cat: TV/Anime, desc: "HDTV"}
- {id: 565af82d1fd35761568b45a2, cat: TV/Anime, desc: "Bluray"}
- {id: 565af82d1fd35761568b45a4, cat: TV/Anime, desc: "Bluray Remux"}
- {id: 565af82d1fd35761568b45a6, cat: TV/Anime, desc: "Bluray 3D"}
- {id: 565af82d1fd35761568b45af, cat: PC/0day, desc: "software"}
- {id: 565af82d1fd35761568b45b1, cat: Audio/Video, desc: "clips"}
- {id: 565af82d1fd35761568b45b3, cat: Audio/Other, desc: "Audio tracks"}
- {id: 565af82d1fd35761568b45b5, cat: TV/Documentary, desc: "documentaries"}
- {id: 565af82d1fd35761568b45b7, cat: Movies/HD, desc: "Bluray"}
- {id: 59591f0807fd301b6eaa7a8f, cat: Movies/HD, desc: "1080p"}
- {id: 595cd82e07fd301b6eaa7a90, cat: Movies/HD, desc: "720p"}
- {id: 59e67c0ed5b6a3e689dd1e1f, cat: Movies/UHD, desc: "Bluray 4K"}
- {id: 59e488174a23a800358b4567, cat: Movies/UHD, desc: "Bluray Remux 4K"}
- {id: 5a64af02ee30983a7e596aed, cat: Movies/HD, desc: "WEB-DL"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: /login
method: form
form: form#login-form
inputs:
_username: "{{ .Config.username }}"
_password: "{{ .Config.password }}"
_remember_me: "on"
error:
- selector: :contains("\"success\":false")
test:
path: /torrents
search:
paths:
- path: /torrent/ajaxfiltertorrent/{{ .Keywords }}
keywordsfilters:
- name: re_replace
args: ["^$", "null"]
inputs:
$raw: "{{range .Categories}}subcat[]={{.}}&{{end}}"
exclu: "0"
freeleech: "0"
reseed: "0"
rows:
selector: div.torrent-item
filters:
- name: andmatch
fields:
title:
selector: a.torrentlink
attribute: title
filters:
- name: re_replace
args: ["(?i)(SEASON|SAISON) (\\d\\d)", "S$2"]
- name: re_replace
args: ["(?i)(SEASON|SAISON) (\\d)", "S0$2"]
- name: re_replace
args: ["(?i) (MULTI) ", " $1 FRENCH "]
banner:
selector: a.torrentlink > img.img-responsive
attribute: src
details:
selector: a.torrentlink
attribute: href
category:
selector: div.category
case:
":contains(\"Films\"):contains(\"1080p\")": "565af82b1fd35761568b4572"
":contains(\"Films\"):contains(\"720p\")": "565af82b1fd35761568b4574"
":contains(\"Films\"):contains(\"HDTV\")": "565af82b1fd35761568b4576"
":contains(\"Films\"):contains(\"Bluray Remux\")": "565af82b1fd35761568b457a"
":contains(\"Films\"):contains(\"Bluray 3D\")": "565af82b1fd35761568b457c"
":contains(\"Films\"):contains(\"Bluray Remux 4K\")": "59e488174a23a800358b4567"
":contains(\"Films\"):contains(\"Bluray 4K\")": "59e67c0ed5b6a3e689dd1e1f"
":contains(\"Films\"):contains(\"Bluray\")": "565af82b1fd35761568b4578"
":contains(\"Films\"):contains(\"WEB-DL\")": "5a64af02ee30983a7e596aed"
":contains(\"Séries\"):contains(\"1080p\")": "565af82d1fd35761568b4587"
":contains(\"Séries\"):contains(\"720p\")": "565af82d1fd35761568b4589"
":contains(\"Séries\"):contains(\"HDTV\")": "565af82d1fd35761568b458b"
":contains(\"Séries\"):contains(\"Bluray Remux\")": "565af82d1fd35761568b458f"
":contains(\"Séries\"):contains(\"Bluray 3D\")": "565af82d1fd35761568b4591"
":contains(\"Séries\"):contains(\"Bluray\")": "565af82d1fd35761568b458d"
":contains(\"Animations\"):contains(\"1080p\")": "565af82d1fd35761568b459c"
":contains(\"Animations\"):contains(\"720p\")": "565af82d1fd35761568b459e"
":contains(\"Animations\"):contains(\"HDTV\")": "565af82d1fd35761568b45a0"
":contains(\"Animations\"):contains(\"Bluray Remux\")": "565af82d1fd35761568b45a4"
":contains(\"Animations\"):contains(\"Bluray 3D\")": "565af82d1fd35761568b45a6"
":contains(\"Animations\"):contains(\"Bluray\")": "565af82d1fd35761568b45a2"
":contains(\"Divers\"):contains(\"Logiciels\")": "565af82d1fd35761568b45af"
":contains(\"Divers\"):contains(\"Clips\")": "565af82d1fd35761568b45b1"
":contains(\"Divers\"):contains(\"Pistes audios\")": "565af82d1fd35761568b45b3"
":contains(\"Divers\"):contains(\"Documentaires\")": "565af82d1fd35761568b45b5"
":contains(\"Divers\"):contains(\"Bluray\")": "565af82d1fd35761568b45b7"
":contains(\"Divers\"):contains(\"1080p\")": "59591f0807fd301b6eaa7a8f"
":contains(\"Divers\"):contains(\"720p\")": "595cd82e07fd301b6eaa7a90"
"*": ""
size: # actuall size is not provided, use some default values to make clients happy
selector: div.category
case:
":contains(\"Films\"):contains(\"1080p\")": "5GB"
":contains(\"Films\"):contains(\"720p\")": "4GB"
":contains(\"Films\"):contains(\"HDTV\")": "3GB"
":contains(\"Films\"):contains(\"Bluray Remux\")": "20GB"
":contains(\"Films\"):contains(\"Bluray 3D\")": "20GB"
":contains(\"Films\"):contains(\"Bluray Remux 4K\")": "40GB"
":contains(\"Films\"):contains(\"Bluray 4K\")": "40GB"
":contains(\"Films\"):contains(\"Bluray\")": "20GB"
":contains(\"Films\"):contains(\"WEB-DL\")": "5GB"
":contains(\"Séries\"):contains(\"1080p\")": "3GB"
":contains(\"Séries\"):contains(\"720p\")": "2GB"
":contains(\"Séries\"):contains(\"HDTV\")": "1GB"
":contains(\"Séries\"):contains(\"Bluray Remux\")": "20GB"
":contains(\"Séries\"):contains(\"Bluray 3D\")": "20GB"
":contains(\"Séries\"):contains(\"Bluray\")": "20GB"
":contains(\"Animations\"):contains(\"1080p\")": "3GB"
":contains(\"Animations\"):contains(\"720p\")": "2GB"
":contains(\"Animations\"):contains(\"HDTV\")": "1GB"
":contains(\"Animations\"):contains(\"Bluray Remux\")": "20GB"
":contains(\"Animations\"):contains(\"Bluray 3D\")": "20GB"
":contains(\"Animations\"):contains(\"Bluray\")": "20GB"
":contains(\"Divers\"):contains(\"Logiciels\")": "0"
":contains(\"Divers\"):contains(\"Clips\")": "1GB"
":contains(\"Divers\"):contains(\"Pistes audios\")": "1GB"
":contains(\"Divers\"):contains(\"Documentaires\")": "1GB"
":contains(\"Divers\"):contains(\"Bluray\")": "20GB"
":contains(\"Divers\"):contains(\"1080p\")": "5GB"
":contains(\"Divers\"):contains(\"720p\")": "4GB"
"*": ""
download:
selector: div.download-item > a
attribute: href
seeders:
selector: div.seeders
filters:
- name: re_replace
args: ["^$", "999"]
leechers:
selector: div.leechers
filters:
- name: re_replace
args: ["^$", "999"]
grabs:
selector: div.completed
downloadvolumefactor:
case:
div.fl-label: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"
date:
text: "now"

View File

@@ -7,10 +7,11 @@
encoding: UTF-8
links:
- https://worldwidetorrents.me/
- https://worldwidetorrents.to/
legacylinks:
- https://worldwidetorrents.eu/
- https://worldwidetorrents.me/
caps:
categorymappings:

View File

@@ -45,6 +45,7 @@
- {id: 49, cat: XXX/Imageset, desc: "XXX-IMGSet"}
- {id: 50, cat: XXX, desc: "XXX-Packs"}
- {id: 51, cat: XXX, desc: "XXX-SD"}
- {id: 60, cat: TV/HD, desc: "TV-RO"}
modes:
search: [q]

View File

@@ -5,17 +5,25 @@
language: fr-fr
type: semi-private
encoding: UTF-8
followredirect: true
links:
- https://yggtorrent.to/
- https://ww3.yggtorrent.gg/
legacylinks:
- https://yggtorrent.is/
- https://yggtorrent.com/
- https://ww1.yggtorrent.com/
- https://yggtorrent.is/
- https://www.yggtorrent.is/
- https://ww1.yggtorrent.is/
- https://ww2.yggtorrent.is/
- https://ww3.yggtorrent.is/
- https://ww4.yggtorrent.is/
- https://yggtorrent.to/
- https://www3.yggtorrent.to/
- https://www6.yggtorrent.to/
- https://www8.yggtorrent.to/
- https://www9.yggtorrent.to/
- https://ygg.to/
- https://www.ygg.to/
caps:
categorymappings:
@@ -114,6 +122,13 @@
FRENCH : "FRENCH"
MULTI.FRENCH: "MULTI.FRENCH"
ENGLISH: "ENGLISH"
MULTI.ENGLISH: "MULTI.ENGLISH"
VOSTFR: "VOSTFR"
MULTI.VOSTFR: "MULTI.VOSTFR"
- name: vostfr
type: checkbox
label: Replace VOSTFR with ENGLISH
default: false
login:
method: form
path: /
@@ -164,8 +179,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

@@ -20,6 +20,11 @@
20: Movies/DVD
9: XXX
49: XXX/Other
6: Audio
30: Audio/Other
29: Audio/Other
51: Audio/Other
34: Audio/Lossless
modes:
search: [q]

View File

@@ -13,10 +13,11 @@
"anime": TV/Anime
"app": PC
"book": Books
"files": Other/Misc
"game": PC/Games
"movies": Movies
"music": Audio
"other": Other/Misc
"other": Other
"tv": TV
modes:

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

@@ -9,10 +9,14 @@ namespace Jackett.Common.Indexers
{
public class TehConnectionMe : GazelleTracker
{
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
"https://tehconnection.me/",
};
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://tehconnection.me/",
link: "https://anthelion.me/",
configService: configService,
logger: logger,
protectionService: protectionService,

View File

@@ -54,6 +54,8 @@ namespace Jackett.Common.Indexers
Language = "pt-br";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
AddCategoryMapping(14, TorznabCatType.TVAnime, "Anime");
AddCategoryMapping(3, TorznabCatType.PC0day, "Aplicativos");
AddCategoryMapping(8, TorznabCatType.Other, "Apostilas/Tutoriais");
@@ -127,7 +129,7 @@ namespace Jackett.Common.Indexers
var releases = new List<ReleaseInfo>();
// if the search string is empty use the "last 24h torrents" view
if (string.IsNullOrWhiteSpace(query.SearchTerm))
if (string.IsNullOrWhiteSpace(query.SearchTerm) && !query.IsImdbQuery)
{
var results = await RequestStringWithCookies(TodayUrl);
try
@@ -230,12 +232,20 @@ namespace Jackett.Common.Indexers
var searchUrl = BrowseUrl;
var isSearchAnime = query.Categories.Any(s => s == TorznabCatType.TVAnime.ID);
foreach (var searchTerm in _commonSearchTerms)
if (!query.IsImdbQuery)
{
query.SearchTerm = query.SearchTerm.ToLower().Replace(searchTerm.Key.ToLower(), searchTerm.Value);
foreach (var searchTerm in _commonSearchTerms)
{
query.SearchTerm = query.SearchTerm.ToLower().Replace(searchTerm.Key.ToLower(), searchTerm.Value);
}
}
var searchString = query.GetQueryString();
if (query.IsImdbQuery)
{
searchString = query.ImdbID;
}
var queryCollection = new NameValueCollection
{
{"searchstr", StripSearchString(searchString, isSearchAnime)},
@@ -365,7 +375,7 @@ namespace Jackett.Common.Indexers
release.PublishDate = DateTime.Today;
// check for previously stripped search terms
if (!query.MatchQueryStringAND(release.Title))
if (!query.IsImdbQuery && !query.MatchQueryStringAND(release.Title))
continue;
var size = qSize.TextContent;

View File

@@ -703,7 +703,16 @@ namespace Jackett.Common.Indexers
var errormessage = "Login Failed, got redirected.";
var DomainHint = getRedirectDomainHint(testResult);
if (DomainHint != null)
{
errormessage += " Try changing the indexer URL to " + DomainHint + ".";
if (Definition.Followredirect)
{
configData.SiteLink.Value = DomainHint;
SiteLink = configData.SiteLink.Value;
SaveConfig();
errormessage += " Updated site link, please try again.";
}
}
throw new ExceptionWithConfigData(errormessage, configData);
}
@@ -728,6 +737,13 @@ namespace Jackett.Common.Indexers
if (DomainHint != null)
{
var errormessage = "Got redirected to another domain. Try changing the indexer URL to " + DomainHint + ".";
if (Definition.Followredirect)
{
configData.SiteLink.Value = DomainHint;
SiteLink = configData.SiteLink.Value;
SaveConfig();
errormessage += " Updated site link, please try again.";
}
throw new ExceptionWithConfigData(errormessage, configData);
}
@@ -1211,8 +1227,13 @@ namespace Jackett.Common.Indexers
response = await PostDataWithCookies(searchUrl, queryCollection, null, null, headers);
else
response = await RequestStringWithCookies(searchUrl, null, null, headers);
if (response.IsRedirect && SearchPath.Followredirect)
await FollowIfRedirect(response);
var results = response.Content;
try
{
var SearchResultParser = new HtmlParser();
@@ -1231,6 +1252,10 @@ namespace Jackett.Common.Indexers
response = await PostDataWithCookies(searchUrl, queryCollection);
else
response = await RequestStringWithCookies(searchUrl);
if (response.IsRedirect && SearchPath.Followredirect)
await FollowIfRedirect(response);
results = response.Content;
SearchResultDocument = SearchResultParser.Parse(results);
}
@@ -1244,7 +1269,8 @@ namespace Jackett.Common.Indexers
logger.Debug(string.Format("CardigannIndexer ({0}): result after preprocessingfilters: {1}", ID, results));
}
var RowsDom = SearchResultDocument.QuerySelectorAll(Search.Rows.Selector);
var rowsSelector = applyGoTemplateText(Search.Rows.Selector, variables);
var RowsDom = SearchResultDocument.QuerySelectorAll(rowsSelector);
List<IElement> Rows = new List<IElement>();
foreach (var RowDom in RowsDom)
{

View File

@@ -1,245 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
{
public class Demonoid : BaseWebIndexer
{
private string LoginUrl { get { return SiteLink + "account_handler.php"; } }
private string SearchUrl { get { return SiteLink + "files/?category={0}&subcategory=All&quality=All&seeded=2&to=1&query={1}&external=2"; } }
private new ConfigurationDataRecaptchaLogin configData
{
get { return (ConfigurationDataRecaptchaLogin)base.configData; }
set { base.configData = value; }
}
public Demonoid(IIndexerConfigurationService configService, Utils.Clients.WebClient wc, Logger l, IProtectionService ps)
: base(name: "Demonoid",
description: "Demonoid is a Private torrent tracker for 0DAY / TV / MOVIES / GENERAL",
link: "https://www.demonoid.pw/",
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
configService: configService,
client: wc,
logger: l,
p: ps,
configData: new ConfigurationDataRecaptchaLogin())
{
Encoding = Encoding.UTF8;
Language = "en-us";
Type = "public";
AddCategoryMapping(5, TorznabCatType.PC0day, "Applications");
AddCategoryMapping(17, TorznabCatType.AudioAudiobook, "Audio Books");
AddCategoryMapping(11, TorznabCatType.Books, "Books");
AddCategoryMapping(10, TorznabCatType.BooksComics, "Comics");
AddCategoryMapping(4, TorznabCatType.PCGames, "Games");
AddCategoryMapping(9, TorznabCatType.TVAnime, "Japanese Anime");
AddCategoryMapping(6, TorznabCatType.Other, "Miscellaneous");
AddCategoryMapping(1, TorznabCatType.Movies, "Movies");
AddCategoryMapping(2, TorznabCatType.Audio, "Music");
AddCategoryMapping(13, TorznabCatType.AudioVideo, "Music Videos");
AddCategoryMapping(8, TorznabCatType.Other, "Pictures");
AddCategoryMapping(3, TorznabCatType.TV, "TV");
}
public override async Task<ConfigurationData> GetConfigurationForSetup()
{
var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty);
CQ cq = loginPage.Content;
var captcha = cq.Find(".g-recaptcha");
if (captcha.Any())
{
var result = this.configData;
result.CookieHeader.Value = loginPage.Cookies;
result.Captcha.SiteKey = captcha.Attr("data-sitekey");
result.Captcha.Version = "2";
return result;
}
else
{
var result = new ConfigurationDataBasicLogin();
result.SiteLink.Value = configData.SiteLink.Value;
result.Instructions.Value = configData.Instructions.Value;
result.Username.Value = configData.Username.Value;
result.Password.Value = configData.Password.Value;
result.CookieHeader.Value = loginPage.Cookies;
return result;
}
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
var pairs = new Dictionary<string, string> {
{ "nickname", configData.Username.Value },
{ "password", configData.Password.Value },
{ "rcaptcha", configData.Captcha.Value },
{ "returnpath", "/" },
{ "withq", "0" },
{ "re_ch", "" },
{ "validation", "" },
{ "Submit", "Submit" }
};
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
{
CookieHeader = configData.Captcha.Cookie;
try
{
var results = await PerformQuery(new TorznabQuery());
if (results.Count() == 0)
{
throw new Exception("Your cookie did not work");
}
IsConfigured = true;
SaveConfig();
return IndexerConfigurationStatus.Completed;
}
catch (Exception e)
{
IsConfigured = false;
throw new Exception("Your cookie did not work: " + e.Message);
}
}
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, SiteLink, SiteLink);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Cookies.Contains("uid="), () =>
{
CQ dom = result.Content;
string errorMessage = dom["form[id='bb_code_form']"].Parent().Find("font[class='red']").Text();
throw new ExceptionWithConfigData(errorMessage, configData);
});
return IndexerConfigurationStatus.RequiresTesting;
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
var releases = new List<ReleaseInfo>();
var trackerCats = MapTorznabCapsToTrackers(query);
var cat = (trackerCats.Count == 1 ? trackerCats.ElementAt(0) : "0");
var episodeSearchUrl = string.Format(SearchUrl, cat, WebUtility.UrlEncode(query.GetQueryString()));
var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
if (results.IsRedirect)
{
throw new ExceptionWithConfigData("Unexpected redirect to " + results.RedirectingTo + ". Check your credentials.", configData);
}
if (results.Content.Contains("No torrents found"))
{
return releases;
}
try
{
CQ dom = results.Content;
var rows = dom[".ctable_content_no_pad > table > tbody > tr"].ToArray();
DateTime lastDateTime = default(DateTime);
for (var i = 0; i < rows.Length; i++)
{
var rowA = rows[i];
var rAlign = rowA.Attributes["align"];
if (rAlign == "right" || rAlign == "center")
continue;
if (rAlign == "left")
{
// ex: "Monday, Jun 01, 2015", "Monday, Aug 03, 2015"
var dateStr = rowA.Cq().Text().Trim().Replace("Added on ", "");
if (string.IsNullOrWhiteSpace(dateStr) ||
dateStr == "Sponsored links" ||
dateStr.StartsWith("!function") ||
dateStr.StartsWith("atOptions"))
{
continue; // ignore ads
}
if (dateStr.ToLowerInvariant().Contains("today"))
lastDateTime = DateTime.Now;
else
lastDateTime = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dddd, MMM dd, yyyy", CultureInfo.InvariantCulture), DateTimeKind.Utc).ToLocalTime();
continue;
}
if (rowA.ChildElements.Count() < 2)
continue;
var rowB = rows[++i];
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 172800;
release.PublishDate = lastDateTime;
var catUrl = rowA.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href");
var catId = QueryHelpers.ParseQuery(catUrl)["category"].First();
release.Category = MapTrackerCatToNewznab(catId);
var qLink = rowA.ChildElements.ElementAt(1).FirstElementChild.Cq();
release.Title = qLink.Text().Trim();
release.Description = rowB.ChildElements.ElementAt(0).Cq().Text();
if (release.Category != null && release.Category.Contains(TorznabCatType.Audio.ID))
{
if (release.Description.Contains("Lossless"))
release.Category = new List<int> { TorznabCatType.AudioLossless.ID };
else if (release.Description.Contains("MP3"))
release.Category = new List<int> { TorznabCatType.AudioMP3.ID };
else
release.Category = new List<int> { TorznabCatType.AudioOther.ID };
}
release.Comments = new Uri(new Uri(SiteLink), qLink.Attr("href"));
release.Guid = release.Comments;
release.Link = release.Comments; // indirect download see Download() method
var sizeStr = rowB.ChildElements.ElementAt(2).Cq().Text();
release.Size = ReleaseInfo.GetBytes(sizeStr);
release.Seeders = ParseUtil.CoerceInt(rowB.ChildElements.ElementAt(5).Cq().Text());
release.Peers = ParseUtil.CoerceInt(rowB.ChildElements.ElementAt(6).Cq().Text()) + release.Seeders;
var grabs = rowB.Cq().Find("td:nth-child(5)").Text();
release.Grabs = ParseUtil.CoerceInt(grabs);
release.DownloadVolumeFactor = 0; // ratioless
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(results.Content, ex);
}
return releases;
}
public override async Task<byte[]> Download(Uri link)
{
var results = await RequestStringWithCookies(link.AbsoluteUri);
//await FollowIfRedirect(results); // manual follow for better debugging (string)
if (results.IsRedirect)
results = await RequestStringWithCookies(results.RedirectingTo);
CQ dom = results.Content;
var dl = dom.Find("a:has(font:contains(\"Download torrent file\"))");
link = new Uri(dl.Attr("href"));
return await base.Download(link);
}
}
}

View File

@@ -131,6 +131,13 @@ namespace Jackett.Common.Indexers
private async Task ProcessPage(List<ReleaseInfo> releases, string searchUrl)
{
var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl);
if (response.IsRedirect)
{
// re login
await ApplyConfiguration(null);
response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl);
}
var results = response.Content;
try
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
@@ -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)
{
@@ -155,19 +167,22 @@ namespace Jackett.Common.Indexers
release.MinimumRatio = 1;
release.MinimumSeedTime = 172800;
int tdIndex = 0;
if(qRow.Find("td:nth-last-child(1)").Text() == "Edit") tdIndex = 1;
// Sometimes the uploader column is missing
int seeders, peers;
if (ParseUtil.TryCoerceInt(qRow.Find("td:nth-last-child(3)").Text(), out seeders))
if (ParseUtil.TryCoerceInt(qRow.Find($"td:nth-last-child({tdIndex + 3})").Text(), out seeders))
{
release.Seeders = seeders;
if (ParseUtil.TryCoerceInt(qRow.Find("td:nth-last-child(2)").Text(), out peers))
if (ParseUtil.TryCoerceInt(qRow.Find($"td:nth-last-child({tdIndex + 2})").Text(), out peers))
{
release.Peers = peers + release.Seeders;
}
}
release.Grabs = ParseUtil.CoerceLong(qRow.Find("td:nth-last-child(1)").Text());
release.Grabs = ParseUtil.CoerceLong(qRow.Find($"td:nth-last-child({tdIndex + 1})").Text());
string fullSize = qRow.Find("td.mainblockcontent").Get(6).InnerText;
release.Size = ReleaseInfo.GetBytes(fullSize);
@@ -190,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

@@ -135,6 +135,13 @@ namespace Jackett.Common.Indexers
continue;
}
// Ensure fansub group name is present in the title
// This is needed for things like configuring tag restrictions in Sonarr
if (title.Contains("[HorribleSubs]") == false)
{
title = "[HorribleSubs] " + title;
}
DateTime releasedate;
if (dateStr == "Today")
{
@@ -148,23 +155,33 @@ namespace Jackett.Common.Indexers
{
releasedate = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MM/dd/yy", CultureInfo.InvariantCulture), DateTimeKind.Utc).ToLocalTime();
}
var p480 = releaserow.QuerySelector(".link-480p");
if (p480 != null)
{
var release = new ReleaseInfo();
var release = new ReleaseInfo
{
PublishDate = releasedate,
Files = 1,
Category = new List<int> { TorznabCatType.TVAnime.ID },
Size = 524288000,
Seeders = 1,
Peers = 2,
DownloadVolumeFactor = 0,
UploadVolumeFactor = 1
};
release.Title = string.Format("{0} [480p]", title);
release.PublishDate = releasedate;
release.Link = new Uri(p480.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.MagnetUri = new Uri(p480.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Files = 1;
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
release.Size = 524288000;
release.Seeders = 999;
release.Peers = 1998;
release.DownloadVolumeFactor = 0;
release.UploadVolumeFactor = 1;
if (p480.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p480.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Guid = release.Link;
}
if (p480.QuerySelector(".hs-magnet-link > a") != null)
{
release.MagnetUri = new Uri(p480.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Guid = release.MagnetUri;
}
releases.Add(release);
}
@@ -172,18 +189,28 @@ namespace Jackett.Common.Indexers
if (p720 != null)
{
var release = new ReleaseInfo();
var release = new ReleaseInfo
{
PublishDate = releasedate,
Files = 1,
Category = new List<int> { TorznabCatType.TVAnime.ID },
Size = 524288000,
Seeders = 1,
Peers = 2,
DownloadVolumeFactor = 0,
UploadVolumeFactor = 1
};
release.Title = string.Format("{0} [720p]", title);
release.PublishDate = releasedate;
release.Link = new Uri(p720.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.MagnetUri = new Uri(p720.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Files = 1;
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
release.Size = 524288000;
release.Seeders = 999;
release.Peers = 1998;
release.DownloadVolumeFactor = 0;
release.UploadVolumeFactor = 1;
if (p720.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p720.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Guid = release.Link;
}
if (p720.QuerySelector(".hs-magnet-link > a") != null)
{
release.MagnetUri = new Uri(p720.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Guid = release.MagnetUri;
}
releases.Add(release);
}
@@ -191,21 +218,30 @@ namespace Jackett.Common.Indexers
if (p1080 != null)
{
var release = new ReleaseInfo();
var release = new ReleaseInfo
{
PublishDate = releasedate,
Files = 1,
Category = new List<int> { TorznabCatType.TVAnime.ID },
Size = 524288000,
Seeders = 1,
Peers = 2,
DownloadVolumeFactor = 0,
UploadVolumeFactor = 1
};
release.Title = string.Format("{0} [1080p]", title);
release.PublishDate = releasedate;
release.Link = new Uri(p1080.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.MagnetUri = new Uri(p1080.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Files = 1;
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
release.Size = 524288000;
release.Seeders = 999;
release.Peers = 1998;
release.DownloadVolumeFactor = 0;
release.UploadVolumeFactor = 1;
if (p1080.QuerySelector(".hs-torrent-link > a") != null)
{
release.Link = new Uri(p1080.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
release.Guid = release.Link;
}
if (p1080.QuerySelector(".hs-magnet-link > a") != null)
{
release.MagnetUri = new Uri(p1080.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
release.Guid = release.MagnetUri;
}
releases.Add(release);
}
}
}
catch (Exception ex)

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();
@@ -241,6 +248,10 @@ namespace Jackett.Common.Indexers
var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl);
var results = response.Content;
if (string.IsNullOrWhiteSpace(query.SearchTerm) && results.Contains("No Torrents Found!"))
throw new Exception("Got No Torrents Found! Make sure your IPTorrents profile config contain proper default category settings.");
try
{
CQ dom = results;

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

@@ -158,9 +158,9 @@ namespace Jackett.Common.Indexers
// Parse required data
var downloadAnchor = groupItem.QuerySelectorAll("td a").Last();
var qualityData = downloadAnchor.InnerHtml.Split('/');
if (qualityData.Length < 2)
throw new Exception($"We expected 2 or more quality datas, instead we have {qualityData.Length}.");
throw new Exception($"We expected 2 or more quality datas, instead we have {qualityData.Length} for {season}.");
// Build title
var title = string.Join(".", new List<string>

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,6 +117,118 @@ namespace Jackett.Common.Indexers
return IndexerConfigurationStatus.RequiresTesting;
}
List<ReleaseInfo> parseTorrents(WebClientStringResult results, String seasonep, TorznabQuery query, int already_founded, int limit)
{
var releases = new List<ReleaseInfo>();
try
{
CQ dom = results.Content;
ReleaseInfo release;
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) < limit )); i++)
{
try
{
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)
{
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") && !release.Title.Contains("hun"))
release.Title += ".hun";
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)
{
OnParseError(results.Content, ex);
}
return releases;
}
protected async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, String seasonep)
{
var releases = new List<ReleaseInfo>();
@@ -155,98 +267,42 @@ namespace Jackett.Common.Indexers
}
var results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);
try
CQ dom = results.Content;
int numVal = 0;
// find pagelinks in the bottom
var pagelinks = dom["div[id=pager_bottom]"].Find("a");
if (pagelinks.Length > 0)
{
CQ dom = results.Content;
ReleaseInfo release;
var rows = dom[".box_torrent_all"].Find(".box_torrent");
foreach (var row in rows)
// If there are several pages find the link for the latest one
for (int i= pagelinks.Length - 1; i > 0; i--)
{
CQ qRow = row.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("div.siterank").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)
var last_page_link = (pagelinks[i].Cq().Attr("href")).Trim();
if (last_page_link.Contains("oldal"))
{
Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
var BannerMatch = BannerRegEx.Match(banner);
var bannerurl = BannerMatch.Groups[1].Value;
release.BannerUrl = new Uri(bannerurl);
Match match = Regex.Match(last_page_link, @"(?<=[\?,&]oldal=)(\d+)(?=&)");
numVal = Int32.Parse(match.Value);
break;
}
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 (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 (Exception ex)
}
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 < limit); i++ )
{
OnParseError(results.Content, ex);
pairs.Add(new KeyValuePair<string, string>("oldal", i.ToString()));
results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);
releases.AddRange(parseTorrents(results, seasonep, query, releases.Count, limit));
pairs.Remove(new KeyValuePair<string, string>("oldal", i.ToString()));
}
return releases;

View File

@@ -33,12 +33,13 @@ namespace Jackett.Common.Indexers
public int? Season;
public int? Episode;
public int? EpisodeTo;
public int Score;
public NewpctRelease()
{
}
public NewpctRelease(NewpctRelease copyFrom):
public NewpctRelease(NewpctRelease copyFrom) :
base(copyFrom)
{
NewpctReleaseType = copyFrom.NewpctReleaseType;
@@ -46,6 +47,7 @@ namespace Jackett.Common.Indexers
Season = copyFrom.Season;
Episode = copyFrom.Episode;
EpisodeTo = copyFrom.EpisodeTo;
Score = copyFrom.Score;
}
public override object Clone()
@@ -54,29 +56,38 @@ namespace Jackett.Common.Indexers
}
}
private static Uri SiteLinkUri = new Uri("http://www.tvsinpagar.com/");
private static Uri DefaultSiteLinkUri = new Uri("http://descargas2020.com/");
private Uri _siteUri;
private NewpctRelease _mostRecentRelease;
private char[] _wordSeparators = new char[] { ' ', '.', ',', ';', '(', ')', '-', '_' };
private int _wordNotFoundScore = 100000;
private Regex _searchStringRegex = new Regex(@"(.+?)S0?(\d+)(E0?(\d+))?$", RegexOptions.IgnoreCase);
private Regex _titleListRegex = new Regex(@"Serie( *Descargar)?(.+?)(Temporada(.+?)(\d+)(.+?))?Capitulos?(.+?)(\d+)((.+?)(\d+))?(.+?)-(.+?)Calidad(.*)", RegexOptions.IgnoreCase);
private Regex _titleClassicRegex = new Regex(@"(\[[^\]]*\])?\[Cap\.(\d{1,2})(\d{2})([_-](\d{1,2})(\d{2}))?\]", RegexOptions.IgnoreCase);
private Regex _titleClassicTvQualityRegex = new Regex(@"\[([^\]]*HDTV[^\]]*)", RegexOptions.IgnoreCase);
private int _maxDailyPages = 7;
private int _maxMoviesPages = 20;
private int _maxEpisodesListPages = 100;
private int[] _allTvCategories = TorznabCatType.TV.SubCategories.Select(c => c.ID).ToArray();
private int[] _allMoviesCategories = TorznabCatType.Movies.SubCategories.Select(c => c.ID).ToArray();
private bool _includeVo;
private bool _filterMovies;
private DateTime _dailyNow;
private int _dailyResultIdx;
private string _searchUrl = "/buscar";
private string _dailyUrl = "/ultimas-descargas/pg/{0}";
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",
description: "Newpct - descargar torrent peliculas, series",
link: SiteLinkUri.AbsoluteUri,
link: DefaultSiteLinkUri.AbsoluteUri,
caps: new TorznabCapabilities(TorznabCatType.TV,
TorznabCatType.TVSD,
TorznabCatType.TVHD,
@@ -93,13 +104,15 @@ namespace Jackett.Common.Indexers
var voItem = new BoolItem() { Name = "Include original versions in search results", Value = false };
configData.AddDynamic("IncludeVo", voItem);
var filterMoviesItem = new BoolItem() { Name = "Only full match movies", Value = true };
configData.AddDynamic("FilterMovies", filterMoviesItem);
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
configData.LoadValuesFromJson(configJson);
var releases = await PerformQuery(new TorznabQuery());
SiteLinkUri = new Uri(configData.SiteLink.Value);
await ConfigureIfOK(string.Empty, releases.Count() > 0, () =>
{
@@ -138,6 +151,9 @@ namespace Jackett.Common.Indexers
CleanCache();
}
_siteUri = new Uri(configData.SiteLink.Value);
_includeVo = ((BoolItem)configData.GetDynamic("IncludeVo")).Value;
_filterMovies = ((BoolItem)configData.GetDynamic("FilterMovies")).Value;
_dailyNow = DateTime.Now;
_dailyResultIdx = 0;
bool rssMode = string.IsNullOrEmpty(query.SanitizedSearchTerm);
@@ -147,7 +163,7 @@ namespace Jackett.Common.Indexers
int pg = 1;
while (pg <= _maxDailyPages)
{
Uri url = new Uri(SiteLinkUri, string.Format(_dailyUrl, pg));
Uri url = new Uri(_siteUri, string.Format(_dailyUrl, pg));
var results = await RequestStringWithCookies(url.AbsoluteUri);
var items = ParseDailyContent(results.Content);
@@ -169,12 +185,18 @@ namespace Jackett.Common.Indexers
}
else
{
//Only tv search supported. (newpct web search is useless)
bool isTvSearch = query.Categories == null || query.Categories.Length == 0 ||
query.Categories.Any(c => _allTvCategories.Contains(c));
if (isTvSearch)
{
return await TvSearch(query);
releases.AddRange(await TvSearch(query));
}
bool isMovieSearch = query.Categories == null || query.Categories.Length == 0 ||
query.Categories.Any(c => _allMoviesCategories.Contains(c));
if (isMovieSearch)
{
releases.AddRange(await MovieSearch(query));
}
}
@@ -183,7 +205,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 +264,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 +274,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 +309,7 @@ namespace Jackett.Common.Indexers
private IEnumerable<Uri> SeriesListUris(string seriesName)
{
IEnumerable<string> lettersUrl;
if (!((BoolItem)configData.GetDynamic("IncludeVo")).Value)
if (!_includeVo)
{
lettersUrl = _seriesLetterUrls;
}
@@ -296,7 +320,7 @@ namespace Jackett.Common.Indexers
string seriesLetter = !char.IsDigit(seriesName[0]) ? seriesName[0].ToString() : "0-9";
return lettersUrl.Select(urlFormat =>
{
return new Uri(SiteLinkUri, string.Format(urlFormat, seriesLetter.ToLower()));
return new Uri(_siteUri, string.Format(urlFormat, seriesLetter.ToLower()));
});
}
@@ -319,6 +343,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 +357,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);
@@ -410,6 +436,113 @@ namespace Jackett.Common.Indexers
return releases;
}
private async Task<IEnumerable<ReleaseInfo>> MovieSearch(TorznabQuery query)
{
var releases = new List<NewpctRelease>();
string searchStr = query.SanitizedSearchTerm;
int pg = 1;
while (pg <= _maxMoviesPages)
{
var queryCollection = new Dictionary<string, string>();
queryCollection.Add("q", searchStr);
queryCollection.Add("pg", pg.ToString());
Uri url = new Uri(_siteUri, string.Format(_searchUrl, pg));
var results = await PostDataWithCookies(url.AbsoluteUri, queryCollection);
var items = ParseSearchContent(results.Content);
if (items == null || !items.Any())
break;
releases.AddRange(items);
pg++;
}
ScoreReleases(releases, searchStr);
if (_filterMovies)
releases = releases.Where(r => r.Score < _wordNotFoundScore).ToList();
return releases;
}
private IEnumerable<NewpctRelease> ParseSearchContent(string content)
{
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(content);
List<NewpctRelease> releases = new List<NewpctRelease>();
try
{
var rows = doc.QuerySelectorAll(".content .info");
foreach (var row in rows)
{
var anchor = row.QuerySelector("a");
var h2 = anchor.QuerySelector("h2");
var title = Regex.Replace(h2.TextContent, @"\s+", " ").Trim();
var detailsUrl = anchor.GetAttribute("href");
bool isSeries = h2.QuerySelector("span") != null && h2.TextContent.ToLower().Contains("calidad");
bool isGame = title.ToLower().Contains("pcdvd");
if (isSeries || isGame)
continue;
var span = row.QuerySelectorAll("span");
var pubDateText = span[1].TextContent.Trim();
var sizeText = span[2].TextContent.Trim();
long size = ReleaseInfo.GetBytes(sizeText);
DateTime publishDate = DateTime.ParseExact(pubDateText, "dd-MM-yyyy", null);
var div = row.QuerySelector("div");
NewpctRelease newpctRelease;
newpctRelease = GetReleaseFromData(ReleaseType.Movie, title, detailsUrl, null, null, size, publishDate);
releases.Add(newpctRelease);
}
}
catch (Exception ex)
{
OnParseError(content, ex);
}
return releases;
}
private void ScoreReleases(IEnumerable<NewpctRelease> releases, string searchTerm)
{
string[] searchWords = searchTerm.ToLower().Split(_wordSeparators, StringSplitOptions.None).
Select(s => s.Trim()).
Where(s => !string.IsNullOrEmpty(s)).ToArray();
foreach (NewpctRelease release in releases)
{
release.Score = 0;
string[] releaseWords = release.Title.ToLower().Split(_wordSeparators, StringSplitOptions.None).
Select(s => s.Trim()).
Where(s => !string.IsNullOrEmpty(s)).ToArray();
foreach (string search in searchWords)
{
int index = Array.IndexOf(releaseWords, search);
if (index >= 0)
{
release.Score += index;
releaseWords[index] = null;
}
else
{
release.Score += _wordNotFoundScore;
}
}
}
}
ReleaseType ReleaseTypeFromQuality(string quality)
{
if (quality.Trim().ToLower().StartsWith("hdtv"))
@@ -434,6 +567,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 +583,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,29 +613,29 @@ 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))
{
release.SeriesName = release.Title;
if (release.Title.Contains("-"))
{
release.SeriesName = release.Title.Substring(0, release.Title.IndexOf('-') - 1);
}
}
if (String.IsNullOrEmpty(quality))
{
quality = "HDTV";
if (release.NewpctReleaseType == ReleaseType.TV && release.SeriesName.Contains("-"))
release.SeriesName = release.Title.Substring(0, release.SeriesName.IndexOf('-') - 1);
}
var titleParts = new List<string>();
titleParts.Add(release.SeriesName);
if (release.NewpctReleaseType == ReleaseType.TV)
{
if (String.IsNullOrEmpty(quality))
quality = "HDTV";
var seasonAndEpisode = "S" + release.Season.ToString().PadLeft(2, '0');
seasonAndEpisode += "E" + release.Episode.ToString().PadLeft(2, '0');
if (release.EpisodeTo != release.Episode && release.EpisodeTo != null && release.EpisodeTo != 0)
@@ -509,12 +644,31 @@ namespace Jackett.Common.Indexers
}
titleParts.Add(seasonAndEpisode);
}
titleParts.Add(quality.Replace("[", "").Replace("]", ""));
if (release.Title.ToLower().Contains("esp") || release.Title.ToLower().Contains("cast"))
if (!string.IsNullOrEmpty(quality) && !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("espanol") ||
release.Title.ToLower().Contains("castellano") ||
release.Title.ToLower().EndsWith("espa"))
{
titleParts.Add("Spanish");
}
return String.Join(".", titleParts);
string result = String.Join(".", titleParts);
result = Regex.Replace(result, @"[\[\]]+", ".");
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

@@ -3,11 +3,16 @@ using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
using System;
namespace Jackett.Common.Indexers
{
public class Psytorrents : GazelleTracker
{
private static readonly string[] certificateHashs = new string[] {
"455333CC651C249E1A91DFF8EFC2A5F8044FE956", // expired
};
public Psytorrents(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
: base(name: "Psytorrents",
desc: "Psytorrents (PSY) is a Private Torrent Tracker for ELECTRONIC MUSIC",
@@ -22,9 +27,13 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
AddCategoryMapping(1, TorznabCatType.Audio, "Music");
AddCategoryMapping(2, TorznabCatType.Movies, "Movies");
AddCategoryMapping(3, TorznabCatType.PC0day, "App");
foreach (var certificateHash in certificateHashs)
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
}
}
}

View File

@@ -59,7 +59,7 @@ namespace Jackett.Common.Indexers
TorznabCaps.SupportsImdbSearch = true;
webclient.requestDelay = 2.0; // 0.5 requests per second (2 causes problems)
webclient.requestDelay = 2.1; // The api has a 1req/2s limit.
AddCategoryMapping(4, TorznabCatType.XXX, "XXX (18+)");
AddCategoryMapping(14, TorznabCatType.MoviesSD, "Movies/XVID");
@@ -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

@@ -18,7 +18,7 @@ namespace Jackett.Common.Indexers
{
public class SpeedCD : BaseWebIndexer
{
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
private string LoginUrl { get { return SiteLink + "take.login.php"; } }
private string SearchUrl { get { return SiteLink + "browse.php"; } }
private new ConfigurationDataBasicLogin configData

View File

@@ -19,9 +19,11 @@ namespace Jackett.Common.Indexers
{
public class TorrentHeaven : BaseWebIndexer
{
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
"https://torrentheaven.myfqdn.info/",
};
private string IndexUrl { get { return SiteLink + "index.php"; } }
private string LoginCompleteUrl { get { return SiteLink + "index.php?strWebValue=account&strWebAction=login_complete&ancestry=verify"; } }
private static readonly string certificateHash = "6F5CE30D578C2A7AECFB919D0D013976D395055F";
private new ConfigurationDataCaptchaLogin configData
{
@@ -32,7 +34,7 @@ namespace Jackett.Common.Indexers
public TorrentHeaven(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
: base(name: "TorrentHeaven",
description: "A German general tracker.",
link: "https://torrentheaven.myfqdn.info/",
link: "https://newheaven.nl/",
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
configService: configService,
client: wc,
@@ -91,8 +93,6 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(30, TorznabCatType.PC, "APPLICATIONS/Sonstige");
AddCategoryMapping(70, TorznabCatType.PC, "APPLICATIONS/Linux");
AddCategoryMapping(71, TorznabCatType.PCMac, "APPLICATIONS/Mac");
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
}
public override async Task<ConfigurationData> GetConfigurationForSetup()

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

@@ -1,979 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
{
/// <summary>
/// Provider for WiHD Private French Tracker
/// </summary>
public class WiHD : BaseCachingWebIndexer
{
private string LoginUrl { get { return SiteLink + "login"; } }
private string LoginCheckUrl { get { return SiteLink + "login_check"; } }
private string SearchUrl { get { return SiteLink + "torrent/ajaxfiltertorrent/"; } }
private bool Latency { get { return ConfigData.Latency.Value; } }
private bool DevMode { get { return ConfigData.DevMode.Value; } }
private bool CacheMode { get { return ConfigData.HardDriveCache.Value; } }
private static string Directory => Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name.ToLower(), MethodBase.GetCurrentMethod().DeclaringType?.Name.ToLower());
private Dictionary<string, string> emulatedBrowserHeaders = new Dictionary<string, string>();
private CQ fDom = null;
private ConfigurationDataWiHD ConfigData
{
get { return (ConfigurationDataWiHD)configData; }
set { base.configData = value; }
}
public WiHD(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
: base(
name: "WiHD",
description: "Your World in High Definition",
link: "https://world-in-hd.net/",
caps: new TorznabCapabilities(),
configService: configService,
client: w,
logger: l,
p: ps,
downloadBase: "https://world-in-hd.net/torrents/download/",
configData: new ConfigurationDataWiHD())
{
Encoding = Encoding.UTF8;
Language = "fr-fr";
Type = "private";
// Clean capabilities
TorznabCaps.Categories.Clear();
// Movies
AddCategoryMapping("565af82b1fd35761568b4572", TorznabCatType.MoviesHD); // 1080P
AddCategoryMapping("565af82b1fd35761568b4574", TorznabCatType.MoviesHD); // 720P
AddCategoryMapping("565af82b1fd35761568b4576", TorznabCatType.MoviesHD); // HDTV
AddCategoryMapping("565af82b1fd35761568b4578", TorznabCatType.MoviesBluRay); // Bluray
AddCategoryMapping("565af82b1fd35761568b457a", TorznabCatType.MoviesBluRay); // Bluray Remux
AddCategoryMapping("565af82b1fd35761568b457c", TorznabCatType.Movies3D); // Bluray 3D
// TV
AddCategoryMapping("565af82d1fd35761568b4587", TorznabCatType.TVHD); // 1080P
AddCategoryMapping("565af82d1fd35761568b4589", TorznabCatType.TVHD); // 720P
AddCategoryMapping("565af82d1fd35761568b458b", TorznabCatType.TVHD); // HDTV
AddCategoryMapping("565af82d1fd35761568b458d", TorznabCatType.TVHD); // Bluray
AddCategoryMapping("565af82d1fd35761568b458f", TorznabCatType.TVHD); // Bluray Remux
AddCategoryMapping("565af82d1fd35761568b4591", TorznabCatType.TVHD); // Bluray 3D
// Anime
AddCategoryMapping("565af82d1fd35761568b459c", TorznabCatType.TVAnime); // 1080P
AddCategoryMapping("565af82d1fd35761568b459e", TorznabCatType.TVAnime); // 720P
AddCategoryMapping("565af82d1fd35761568b45a0", TorznabCatType.TVAnime); // HDTV
AddCategoryMapping("565af82d1fd35761568b45a2", TorznabCatType.TVAnime); // Bluray
AddCategoryMapping("565af82d1fd35761568b45a4", TorznabCatType.TVAnime); // Bluray Remux
AddCategoryMapping("565af82d1fd35761568b45a6", TorznabCatType.TVAnime); // Bluray 3D
// Other
AddCategoryMapping("565af82d1fd35761568b45af", TorznabCatType.PC); // Apps
AddCategoryMapping("565af82d1fd35761568b45b1", TorznabCatType.AudioVideo); // Clips
AddCategoryMapping("565af82d1fd35761568b45b3", TorznabCatType.AudioOther); // Audios Tracks of Movies/TV/Anime
AddCategoryMapping("565af82d1fd35761568b45b5", TorznabCatType.TVDocumentary); // Documentary
AddCategoryMapping("565af82d1fd35761568b45b7", TorznabCatType.MoviesBluRay); // Bluray (ALL)
}
/// <summary>
/// Configure our WiHD Provider
/// </summary>
/// <param name="configJson">Our params in Json</param>
/// <returns>Configuration state</returns>
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
// Retrieve config values set by Jackett's user
LoadValuesFromJson(configJson);
// Check & Validate Config
validateConfig();
// Setting our data for a better emulated browser (maximum security)
// TODO: Encoded Content not supported by Jackett at this time
// emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");
// If we want to simulate a browser
if (ConfigData.Browser.Value)
{
// Clean headers
emulatedBrowserHeaders.Clear();
// Inject headers
emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
}
// Getting login form to retrieve CSRF token
var myRequest = new Utils.Clients.WebRequest()
{
Url = LoginUrl
};
// Add our headers to request
myRequest.Headers = emulatedBrowserHeaders;
// Get login page
var loginPage = await webclient.GetString(myRequest);
// Retrieving our CSRF token
CQ loginPageDom = loginPage.Content;
var csrfToken = loginPageDom["input[name=\"_csrf_token\"]"].Last();
// Building login form data
var pairs = new Dictionary<string, string> {
{ "_csrf_token", csrfToken.Attr("value") },
{ "_username", ConfigData.Username.Value },
{ "_password", ConfigData.Password.Value },
{ "_remember_me", "on" },
{ "_submit", "" }
};
// Do the login
var request = new Utils.Clients.WebRequest()
{
Cookies = loginPage.Cookies,
PostData = pairs,
Referer = LoginUrl,
Type = RequestType.POST,
Url = LoginUrl,
Headers = emulatedBrowserHeaders
};
// Perform loggin
latencyNow();
output("\nPerform loggin.. with " + LoginCheckUrl);
var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null);
// Test if we are logged in
await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () =>
{
// Oops, unable to login
output("-> Login failed", "error");
throw new ExceptionWithConfigData("Failed to login", configData);
});
output("-> Login Success");
return IndexerConfigurationStatus.RequiresTesting;
}
/// <summary>
/// Execute our search query
/// </summary>
/// <param name="query">Query</param>
/// <returns>Releases</returns>
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
var releases = new List<ReleaseInfo>();
var torrentRowList = new List<CQ>();
var searchTerm = query.GetQueryString();
var searchUrl = SearchUrl;
int nbResults = 0;
int pageLinkCount = 0;
// Check cache first so we don't query the server (if search term used or not in dev mode)
if (!DevMode && !string.IsNullOrEmpty(searchTerm))
{
lock (cache)
{
// Remove old cache items
CleanCache();
// Search in cache
var cachedResult = cache.Where(i => i.Query == searchTerm).FirstOrDefault();
if (cachedResult != null)
return cachedResult.Results.Select(s => (ReleaseInfo)s.Clone()).ToArray();
}
}
// Add emulated XHR request
emulatedBrowserHeaders.Add("X-Requested-With", "XMLHttpRequest");
// Build our query
var request = buildQuery(searchTerm, query, searchUrl);
// Getting results & Store content
fDom = await queryExec(request);
try
{
// Find number of results
nbResults = ParseUtil.CoerceInt(Regex.Match(fDom["div.ajaxtotaltorrentcount"].Text(), @"\d+").Value);
// Find torrent rows
var firstPageRows = findTorrentRows();
// Add them to torrents list
torrentRowList.AddRange(firstPageRows.Select(fRow => fRow.Cq()));
// Check if there are pagination links at bottom
Boolean pagination = (nbResults != 0);
// If pagination available
if (pagination)
{
// Calculate numbers of pages available for this search query (Based on number results and number of torrents on first page)
pageLinkCount = (int)Math.Ceiling((double)nbResults / firstPageRows.Length);
}
else
{
// Check if we have a minimum of one result
if (firstPageRows.Length >= 1)
{
// Set page count arbitrary to one
pageLinkCount = 1;
}
else
{
output("\nNo result found for your query, please try another search term ...\n", "info");
// No result found for this query
return releases;
}
}
output("\nFound " + nbResults + " result(s) in " + pageLinkCount + " page(s) for this query !");
output("\nThere are " + firstPageRows.Length + " results on the first page !");
// If we have a term used for search and pagination result superior to one
if (!string.IsNullOrWhiteSpace(query.GetQueryString()) && pageLinkCount > 1)
{
// Starting with page #2
for (int i = 2; i <= Math.Min(Int32.Parse(ConfigData.Pages.Value), pageLinkCount); i++)
{
output("\nProcessing page #" + i);
// Request our page
latencyNow();
// Build our query
var pageRequest = buildQuery(searchTerm, query, searchUrl, i);
// Getting results & Store content
fDom = await queryExec(pageRequest);
// Process page results
var additionalPageRows = findTorrentRows();
// Add them to torrents list
torrentRowList.AddRange(additionalPageRows.Select(fRow => fRow.Cq()));
}
}
// Loop on results
foreach (CQ tRow in torrentRowList)
{
output("\n=>> Torrent #" + (releases.Count + 1));
// Release Name
string name = tRow.Find(".torrent-h3 > h3 > a").Attr("title").ToString();
output("Release: " + name);
// Category
string categoryID = tRow.Find(".category > img").Attr("src").Split('/').Last().ToString();
string categoryName = tRow.Find(".category > img").Attr("title").ToString();
output("Category: " + MapTrackerCatToNewznab(mediaToCategory(categoryID, categoryName)).First().ToString() + " (" + categoryName + ")");
// Uploader
string uploader = tRow.Find(".uploader > span > a").Attr("title").ToString();
output("Uploader: " + uploader);
// Seeders
int seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".seeders")[0].LastChild.ToString(), @"\d+").Value);
output("Seeders: " + seeders);
// Leechers
int leechers = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".leechers")[0].LastChild.ToString(), @"\d+").Value);
output("Leechers: " + leechers);
// Completed
int completed = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".completed")[0].LastChild.ToString(), @"\d+").Value);
output("Completed: " + completed);
// Comments
int comments = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".comments")[0].LastChild.ToString(), @"\d+").Value);
output("Comments: " + comments);
// Size & Publish Date
string infosData = tRow.Find(".torrent-h3 > span")[0].LastChild.ToString().Trim();
IList<string> infosList = infosData.Split('-').Select(s => s.Trim()).Where(s => s != String.Empty).ToList();
// --> Size
var size = ReleaseInfo.GetBytes(infosList[1].Replace("Go", "gb").Replace("Mo", "mb").Replace("Ko", "kb"));
output("Size: " + infosList[1] + " (" + size + " bytes)");
// --> Publish Date
IList<string> clockList = infosList[0].Replace("Il y a", "").Split(',').Select(s => s.Trim()).Where(s => s != String.Empty).ToList();
var clock = agoToDate(clockList);
output("Released on: " + clock.ToString());
// Torrent Details URL
string details = tRow.Find(".torrent-h3 > h3 > a").Attr("href").ToString().TrimStart('/');
Uri detailsLink = new Uri(SiteLink + details);
output("Details: " + detailsLink.AbsoluteUri);
// Torrent Comments URL
Uri commentsLink = new Uri(SiteLink + details + "#tab_2");
output("Comments Link: " + commentsLink.AbsoluteUri);
// Torrent Download URL
string download = tRow.Find(".download-item > a").Attr("href").ToString().TrimStart('/');
Uri downloadLink = new Uri(SiteLink + download);
output("Download Link: " + downloadLink.AbsoluteUri);
// Freeleech
int downloadVolumeFactor = 1;
if (tRow.Find(".fl-item").Length >= 1)
{
downloadVolumeFactor = 0;
output("FreeLeech =)");
}
// Building release infos
var release = new ReleaseInfo()
{
Category = MapTrackerCatToNewznab(mediaToCategory(categoryID, categoryName)),
Title = name,
Seeders = seeders,
Peers = seeders + leechers,
MinimumRatio = 1,
MinimumSeedTime = 345600,
PublishDate = clock,
Size = size,
Guid = detailsLink,
Comments = commentsLink,
Link = downloadLink,
UploadVolumeFactor = 1,
DownloadVolumeFactor = downloadVolumeFactor
};
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError("Error, unable to parse result \n" + ex.StackTrace, ex);
}
finally
{
// Remove our XHR request header
emulatedBrowserHeaders.Remove("X-Requested-With");
}
// Return found releases
return releases;
}
/// <summary>
/// Build query to process
/// </summary>
/// <param name="term">Term to search</param>
/// <param name="query">Torznab Query for categories mapping</param>
/// <param name="url">Search url for provider</param>
/// <param name="page">Page number to request</param>
/// <returns>URL to query for parsing and processing results</returns>
private string buildQuery(string term, TorznabQuery query, string url, int page = 1)
{
var parameters = new NameValueCollection();
List<string> categoriesList = MapTorznabCapsToTrackers(query);
string categories = null;
// If search term not provided
if (string.IsNullOrWhiteSpace(term))
{
// Showing all torrents (just for output function)
term = "null";
}
// Encode & Add search term to URL
url += Uri.EscapeDataString(term);
// Check if we are processing a new page
if (page > 1)
{
// Adding page number to query
url += "/" + page.ToString();
}
// Adding interrogation point
url += "?";
// Building our tracker query
parameters.Add("exclu", Convert.ToInt32(ConfigData.Exclusive.Value).ToString());
parameters.Add("freeleech", Convert.ToInt32(ConfigData.Freeleech.Value).ToString());
parameters.Add("reseed", Convert.ToInt32(ConfigData.Reseed.Value).ToString());
// Loop on Categories needed
foreach (string category in categoriesList)
{
// If last, build !
if (categoriesList.Last() == category)
{
// Adding previous categories to URL with latest category
parameters.Add(Uri.EscapeDataString("subcat[]"), category + categories);
}
else
{
// Build categories parameter
categories += "&" + Uri.EscapeDataString("subcat[]") + "=" + category;
}
}
// Add timestamp as a query param (for no caching)
parameters.Add("_", UnixTimeNow().ToString());
// Building our query -- Cannot use GetQueryString due to UrlEncode (generating wrong subcat[] param)
url += string.Join("&", parameters.AllKeys.Select(a => a + "=" + parameters[a]));
output("\nBuilded query for \"" + term + "\"... " + url);
// Return our search url
return url;
}
/// <summary>
/// Switch Method for Querying
/// </summary>
/// <param name="request">URL created by Query Builder</param>
/// <returns>Results from query</returns>
private async Task<String> queryExec(string request)
{
String results = null;
// Switch in we are in DEV mode with Hard Drive Cache or not
if (DevMode && CacheMode)
{
// Check Cache before querying and load previous results if available
results = await queryCache(request);
}
else
{
// Querying tracker directly
results = await queryTracker(request);
}
return results;
}
/// <summary>
/// Get Torrents Page from Cache by Query Provided
/// </summary>
/// <param name="request">URL created by Query Builder</param>
/// <returns>Results from query</returns>
private async Task<String> queryCache(string request)
{
String results;
// Create Directory if not exist
System.IO.Directory.CreateDirectory(Directory);
// Clean Storage Provider Directory from outdated cached queries
cleanCacheStorage();
// File Name
string fileName = StringUtil.HashSHA1(request) + ".json";
// Create fingerprint for request
string file = Path.Combine(Directory, fileName);
// Checking modes states
if (File.Exists(file))
{
// File exist... loading it right now !
output("Loading results from hard drive cache ..." + fileName);
try
{
using (StreamReader fileReader = File.OpenText(file))
{
JsonSerializer serializer = new JsonSerializer();
results = (String)serializer.Deserialize(fileReader, typeof(String));
}
}
catch (Exception e)
{
output("Error loading cached results ! " + e.Message, "error");
results = null;
}
}
else
{
// No cached file found, querying tracker directly
results = await queryTracker(request);
// Cached file didn't exist for our query, writing it right now !
output("Writing results to hard drive cache ..." + fileName);
using (StreamWriter fileWriter = File.CreateText(file))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(fileWriter, results);
}
}
return results;
}
/// <summary>
/// Get Torrents Page from Tracker by Query Provided
/// </summary>
/// <param name="request">URL created by Query Builder</param>
/// <returns>Results from query</returns>
private async Task<String> queryTracker(string request)
{
WebClientStringResult results = null;
// Cache mode not enabled or cached file didn't exist for our query
output("\nQuerying tracker for results....");
// Request our first page
latencyNow();
results = await RequestStringWithCookiesAndRetry(request, null, null, emulatedBrowserHeaders);
// Return results from tracker
return results.Content;
}
/// <summary>
/// Clean Hard Drive Cache Storage
/// </summary>
/// <param name="force">Force Provider Folder deletion</param>
private void cleanCacheStorage(bool force = false)
{
// Check cleaning method
if (force)
{
// Deleting Provider Storage folder and all files recursively
output("\nDeleting Provider Storage folder and all files recursively ...");
// Check if directory exist
if (System.IO.Directory.Exists(Directory))
{
// Delete storage directory of provider
System.IO.Directory.Delete(Directory, true);
output("-> Storage folder deleted successfully.");
}
else
{
// No directory, so nothing to do
output("-> No Storage folder found for this provider !");
}
}
else
{
var i = 0;
// Check if there is file older than ... and delete them
output("\nCleaning Provider Storage folder... in progress.");
System.IO.Directory.GetFiles(Directory)
.Select(f => new FileInfo(f))
.Where(f => f.LastAccessTime < DateTime.Now.AddMilliseconds(-Convert.ToInt32(ConfigData.HardDriveCacheKeepTime.Value)))
.ToList()
.ForEach(f =>
{
output("Deleting cached file << " + f.Name + " >> ... done.");
f.Delete();
i++;
});
// Inform on what was cleaned during process
if (i > 0)
{
output("-> Deleted " + i + " cached files during cleaning.");
}
else
{
output("-> Nothing deleted during cleaning.");
}
}
}
/// <summary>
/// Generate a random fake latency to avoid detection on tracker side
/// </summary>
private void latencyNow()
{
// Need latency ?
if (Latency)
{
// Generate a random value in our range
var random = new Random(DateTime.Now.Millisecond);
int waiting = random.Next(Convert.ToInt32(ConfigData.LatencyStart.Value), Convert.ToInt32(ConfigData.LatencyEnd.Value));
output("\nLatency Faker => Sleeping for " + waiting + " ms...");
// Sleep now...
System.Threading.Thread.Sleep(waiting);
}
}
/// <summary>
/// Generate an UTC Unix TimeStamp
/// </summary>
/// <returns>Unix TimeStamp</returns>
private long UnixTimeNow()
{
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
return (long)timeSpan.TotalSeconds;
}
/// <summary>
/// Find torrent rows in search pages
/// </summary>
/// <returns>JQuery Object</returns>
private CQ findTorrentRows()
{
// Return all occurencis of torrents found
return fDom[".torrent-item"];
}
/// <summary>
/// Convert Ago date to DateTime
/// </summary>
/// <param name="clockList"></param>
/// <returns>A DateTime</returns>
private DateTime agoToDate(IList<string> clockList)
{
DateTime release = DateTime.Now;
foreach (var ago in clockList)
{
// Check for years
if (ago.Contains("Années") || ago.Contains("Année"))
{
// Number of years to remove
int years = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddYears(-years);
continue;
}
// Check for months
else if (ago.Contains("Mois"))
{
// Number of months to remove
int months = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddMonths(-months);
continue;
}
// Check for days
else if (ago.Contains("Jours") || ago.Contains("Jour"))
{
// Number of days to remove
int days = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddDays(-days);
continue;
}
// Check for hours
else if (ago.Contains("Heures") || ago.Contains("Heure"))
{
// Number of hours to remove
int hours = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddHours(-hours);
continue;
}
// Check for minutes
else if (ago.Contains("Minutes") || ago.Contains("Minute"))
{
// Number of minutes to remove
int minutes = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddMinutes(-minutes);
continue;
}
// Check for seconds
else if (ago.Contains("Secondes") || ago.Contains("Seconde"))
{
// Number of seconds to remove
int seconds = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
// Removing
release = release.AddSeconds(-seconds);
continue;
}
else
{
output("Unable to detect release date of torrent", "error");
//throw new Exception("Unable to detect release date of torrent");
}
}
return release;
}
/// <summary>
/// Retrieve category ID from media ID
/// </summary>
/// <param name="media">Media ID</param>
/// <returns>Category ID</returns>
private string mediaToCategory(string media, string name)
{
// Declare our Dictionnary -- Media ID (key) <-> Category ID (value)
Dictionary<string, string> dictionary = new Dictionary<string, string>();
// Movies
dictionary.Add("565af82b1fd35761568b4573", "565af82b1fd35761568b4572"); // 1080P
dictionary.Add("565af82b1fd35761568b4575", "565af82b1fd35761568b4574"); // 720P
dictionary.Add("565af82b1fd35761568b4577", "565af82b1fd35761568b4576"); // HDTV
dictionary.Add("565af82b1fd35761568b4579", "565af82b1fd35761568b4578"); // Bluray
dictionary.Add("565af82b1fd35761568b457b", "565af82b1fd35761568b457a"); // Bluray Remux
dictionary.Add("565af82b1fd35761568b457d", "565af82b1fd35761568b457c"); // Bluray 3D
// TV
dictionary.Add("565af82d1fd35761568b4588", "565af82d1fd35761568b4587"); // 1080P
dictionary.Add("565af82d1fd35761568b458a", "565af82d1fd35761568b4589"); // 720P
dictionary.Add("565af82d1fd35761568b458c", "565af82d1fd35761568b458b"); // HDTV
dictionary.Add("565af82d1fd35761568b458e", "565af82d1fd35761568b458d"); // Bluray
dictionary.Add("565af82d1fd35761568b4590", "565af82d1fd35761568b458f"); // Bluray Remux
dictionary.Add("565af82d1fd35761568b4592", "565af82d1fd35761568b4591"); // Bluray 3D
// Anime
dictionary.Add("565af82d1fd35761568b459d", "565af82d1fd35761568b459c"); // 1080P
dictionary.Add("565af82d1fd35761568b459f", "565af82d1fd35761568b459e"); // 720P
dictionary.Add("565af82d1fd35761568b45a1", "565af82d1fd35761568b45a0"); // HDTV
dictionary.Add("565af82d1fd35761568b45a3", "565af82d1fd35761568b45a2"); // Bluray
dictionary.Add("565af82d1fd35761568b45a5", "565af82d1fd35761568b45a4"); // Bluray Remux
// BUG ~~ Media ID for Anime BR 3D is same as TV BR 3D ~~
//dictionary.Add("565af82d1fd35761568b4592", "565af82d1fd35761568b45a6"); // Bluray 3D
// Other
dictionary.Add("565af82d1fd35761568b45b0", "565af82d1fd35761568b45af"); // Apps
dictionary.Add("565af82d1fd35761568b45b2", "565af82d1fd35761568b45b1"); // Clips
dictionary.Add("565af82d1fd35761568b45b4", "565af82d1fd35761568b45b3"); // Audios Tracks of Movies/TV/Anime
dictionary.Add("565af82d1fd35761568b45b6", "565af82d1fd35761568b45b5"); // Documentary
dictionary.Add("565af82d1fd35761568b45b8", "565af82d1fd35761568b45b7"); // Bluray (ALL)
// Check if we know this media ID
if (dictionary.ContainsKey(media))
{
// Due to a bug on tracker side, check for a specific id/name as image is same for TV/Anime BR 3D
if (media == "565af82d1fd35761568b4592" && name == "Animations - Bluray 3D")
{
// If it's an Anime BR 3D
return "565af82d1fd35761568b45a6";
}
else
{
// Return category ID for media ID
return dictionary[media];
}
}
else
{
// Media ID unknown
throw new Exception("Media ID Unknow !");
}
}
/// <summary>
/// Output message for logging or developpment (console)
/// </summary>
/// <param name="message">Message to output</param>
/// <param name="level">Level for Logger</param>
private void output(string message, string level = "debug")
{
// Check if we are in dev mode
if (DevMode)
{
// Output message to console
Console.WriteLine(message);
}
else
{
// Send message to logger with level
switch (level)
{
default:
goto case "debug";
case "debug":
// Only if Debug Level Enabled on Jackett
if (logger.IsDebugEnabled)
{
logger.Debug(message);
}
break;
case "info":
logger.Info(message);
break;
case "error":
logger.Error(message);
break;
}
}
}
/// <summary>
/// Validate Config entered by user on Jackett
/// </summary>
private void validateConfig()
{
output("\nValidating Settings ... \n");
// Check Username Setting
if (string.IsNullOrEmpty(ConfigData.Username.Value))
{
throw new ExceptionWithConfigData("You must provide a username for this tracker to login !", ConfigData);
}
else
{
output("Validated Setting -- Username (auth) => " + ConfigData.Username.Value.ToString());
}
// Check Password Setting
if (string.IsNullOrEmpty(ConfigData.Password.Value))
{
throw new ExceptionWithConfigData("You must provide a password with your username for this tracker to login !", ConfigData);
}
else
{
output("Validated Setting -- Password (auth) => " + ConfigData.Password.Value.ToString());
}
// Check Max Page Setting
if (!string.IsNullOrEmpty(ConfigData.Pages.Value))
{
try
{
output("Validated Setting -- Max Pages => " + Convert.ToInt32(ConfigData.Pages.Value));
}
catch (Exception)
{
throw new ExceptionWithConfigData("Please enter a numeric maximum number of pages to crawl !", ConfigData);
}
}
else
{
throw new ExceptionWithConfigData("Please enter a maximum number of pages to crawl !", ConfigData);
}
// Check Latency Setting
if (ConfigData.Latency.Value)
{
output("\nValidated Setting -- Latency Simulation enabled");
// Check Latency Start Setting
if (!string.IsNullOrEmpty(ConfigData.LatencyStart.Value))
{
try
{
output("Validated Setting -- Latency Start => " + Convert.ToInt32(ConfigData.LatencyStart.Value));
}
catch (Exception)
{
throw new ExceptionWithConfigData("Please enter a numeric latency start in ms !", ConfigData);
}
}
else
{
throw new ExceptionWithConfigData("Latency Simulation enabled, Please enter a start latency !", ConfigData);
}
// Check Latency End Setting
if (!string.IsNullOrEmpty(ConfigData.LatencyEnd.Value))
{
try
{
output("Validated Setting -- Latency End => " + Convert.ToInt32(ConfigData.LatencyEnd.Value));
}
catch (Exception)
{
throw new ExceptionWithConfigData("Please enter a numeric latency end in ms !", ConfigData);
}
}
else
{
throw new ExceptionWithConfigData("Latency Simulation enabled, Please enter a end latency !", ConfigData);
}
}
// Check Browser Setting
if (ConfigData.Browser.Value)
{
output("\nValidated Setting -- Browser Simulation enabled");
// Check ACCEPT header Setting
if (string.IsNullOrEmpty(ConfigData.HeaderAccept.Value))
{
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an ACCEPT header !", ConfigData);
}
else
{
output("Validated Setting -- ACCEPT (header) => " + ConfigData.HeaderAccept.Value.ToString());
}
// Check ACCEPT-LANG header Setting
if (string.IsNullOrEmpty(ConfigData.HeaderAcceptLang.Value))
{
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an ACCEPT-LANG header !", ConfigData);
}
else
{
output("Validated Setting -- ACCEPT-LANG (header) => " + ConfigData.HeaderAcceptLang.Value.ToString());
}
// Check USER-AGENT header Setting
if (string.IsNullOrEmpty(ConfigData.HeaderUserAgent.Value))
{
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an USER-AGENT header !", ConfigData);
}
else
{
output("Validated Setting -- USER-AGENT (header) => " + ConfigData.HeaderUserAgent.Value.ToString());
}
}
// Check Dev Cache Settings
if (ConfigData.HardDriveCache.Value == true)
{
output("\nValidated Setting -- DEV Hard Drive Cache enabled");
// Check if Dev Mode enabled !
if (!ConfigData.DevMode.Value)
{
throw new ExceptionWithConfigData("Hard Drive is enabled but not in DEV MODE, Please enable DEV MODE !", ConfigData);
}
// Check Cache Keep Time Setting
if (!string.IsNullOrEmpty(ConfigData.HardDriveCacheKeepTime.Value))
{
try
{
output("Validated Setting -- Cache Keep Time (ms) => " + Convert.ToInt32(ConfigData.HardDriveCacheKeepTime.Value));
}
catch (Exception)
{
throw new ExceptionWithConfigData("Please enter a numeric hard drive keep time in ms !", ConfigData);
}
}
else
{
throw new ExceptionWithConfigData("Hard Drive Cache enabled, Please enter a maximum keep time for cache !", ConfigData);
}
}
else
{
// Delete cache if previously existed
cleanCacheStorage(true);
}
}
}
}

View File

@@ -1,207 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
{
public class x264 : BaseWebIndexer
{
private string SearchUrl { get { return SiteLink + "browse.php"; } }
private string LoginUrl { get { return SiteLink + "login.php"; } }
private string SubmitLoginUrl { get { return SiteLink + "takelogin.php"; } }
private new ConfigurationDataRecaptchaLogin configData
{
get { return (ConfigurationDataRecaptchaLogin)base.configData; }
set { base.configData = value; }
}
public x264(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
: base(name: "x264",
description: "A movie/TV tracker",
link: "https://x264.me/",
caps: new TorznabCapabilities(),
configService: configService,
client: w,
logger: l,
p: ps,
configData: new ConfigurationDataRecaptchaLogin())
{
Encoding = Encoding.GetEncoding("iso-8859-1");
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
AddCategoryMapping(20, TorznabCatType.Movies); // Movies&TV/Sources
AddCategoryMapping(53, TorznabCatType.MoviesHD); // Movies/1080p
AddCategoryMapping(30, TorznabCatType.MoviesHD); // Movies/576p
AddCategoryMapping(50, TorznabCatType.MoviesHD); // Movies/720p
AddCategoryMapping(33, TorznabCatType.MoviesSD); // Movies/SD
AddCategoryMapping(54, TorznabCatType.TVHD); // TV/1080p
AddCategoryMapping(31, TorznabCatType.TVHD); // TV/576p
AddCategoryMapping(51, TorznabCatType.TVHD); // TV/720p
AddCategoryMapping(25, TorznabCatType.TVSD); // TV/SD
}
public override async Task<ConfigurationData> GetConfigurationForSetup()
{
var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty);
CQ dom = loginPage.Content;
var result = this.configData;
var captcha = dom.Find(".g-recaptcha");
result.CookieHeader.Value = loginPage.Cookies;
result.Captcha.SiteKey = captcha.Attr("data-sitekey");
result.Captcha.Version = "2";
return result;
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
var pairs = new Dictionary<string, string> {
{ "username", configData.Username.Value },
{ "password", configData.Password.Value },
{ "g-recaptcha-response", configData.Captcha.Value }
};
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
{
// Cookie was manually supplied
CookieHeader = configData.Captcha.Cookie;
try
{
var results = await PerformQuery(new TorznabQuery());
if (!results.Any())
{
throw new Exception("Your cookie did not work. You might have to change the \"Login Type\" to \"Normal\" in the x264 profile settings.");
}
IsConfigured = true;
SaveConfig();
return IndexerConfigurationStatus.Completed;
}
catch (Exception e)
{
IsConfigured = false;
throw new Exception("Your cookie did not work: " + e.Message);
}
}
var result = await RequestLoginAndFollowRedirect(SubmitLoginUrl, pairs, configData.CookieHeader.Value, true, null, LoginUrl);
await ConfigureIfOK(result.Cookies, result.Content.Contains("logout.php"), () =>
{
var errorMessage = result.Content;
throw new ExceptionWithConfigData(errorMessage, configData);
});
return IndexerConfigurationStatus.RequiresTesting;
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
List<ReleaseInfo> releases = new List<ReleaseInfo>();
var searchString = query.GetQueryString();
var searchUrl = SearchUrl;
var queryCollection = new NameValueCollection();
queryCollection.Add("incldead", "1");
queryCollection.Add("xtype", "0");
queryCollection.Add("stype", "0");
if (query.ImdbID != null)
{
queryCollection.Add("search", query.ImdbID);
}
else if (!string.IsNullOrWhiteSpace(searchString))
{
queryCollection.Add("search", searchString);
}
foreach (var cat in MapTorznabCapsToTrackers(query))
{
queryCollection.Add("c" + cat, "1");
}
searchUrl += "?" + queryCollection.GetQueryString();
var results = await RequestStringWithCookiesAndRetry(searchUrl);
try
{
CQ dom = results.Content;
var sideWideFreeLeech = false;
if (dom.Find("td > b > font[color=\"white\"]:contains(Free Leech)").Length >= 1)
sideWideFreeLeech = true;
var rows = dom["table > tbody > tr[height=36]"];
foreach (var row in rows)
{
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 7 * 24 * 60 * 60;
var qRow = row.Cq();
var qCatLink = qRow.Find("a[href^=?cat]").First();
var qDetailsLink = qRow.Find("a[href^=details.php]").First();
var qSeeders = qRow.Find("td:eq(8)");
var qLeechers = qRow.Find("td:eq(9)");
var qDownloadLink = qRow.Find("a[href^=\"download.php\"]").First();
var qImdbLink = qRow.Find("a[href^=/redir.php?url=http://www.imdb.com]");
var qSize = qRow.Find("td:eq(6)");
var catStr = qCatLink.Attr("href").Split('=')[1];
release.Category = MapTrackerCatToNewznab(catStr);
release.Link = new Uri(SiteLink + qDownloadLink.Attr("href"));
release.Title = qDetailsLink.Text().Trim();
release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href"));
release.Guid = release.Link;
var sizeStr = qSize.Text();
release.Size = ReleaseInfo.GetBytes(sizeStr);
if (qImdbLink.Length == 1)
{
var ImdbId = qImdbLink.Attr("href").Split('/').Last().Substring(2);
release.Imdb = ParseUtil.CoerceLong(ImdbId);
}
release.Seeders = ParseUtil.CoerceInt(qSeeders.Text());
release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders;
var files = qRow.Find("td:nth-child(3)").Text();
release.Files = ParseUtil.CoerceInt(files);
var grabs = qRow.Find("td:nth-child(8)").Get(0).FirstChild.ToString();
release.Grabs = ParseUtil.CoerceInt(grabs);
if (sideWideFreeLeech || qRow.Find("font[color=\"red\"]:contains(FREE)").Length >= 1)
release.DownloadVolumeFactor = 0;
else
release.DownloadVolumeFactor = 1;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(results.Content, ex);
}
return releases;
}
}
}

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)
@@ -142,7 +150,7 @@ namespace Jackett.Common.Indexers
// Append the quality to the title because thats how radarr seems to be determining the quality?
// All releases are BRRips, see issue #2200
release.Title = movie_item.Value<string>("title_long") + " " + torrent_info.Value<string>("quality") + " BRRip";
release.Title = "[YTS] " + movie_item.Value<string>("title_long") + " " + torrent_info.Value<string>("quality") + " BRRip";
var imdb = movie_item.Value<string>("imdb_code");
release.Imdb = ParseUtil.GetImdbID(imdb);

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

@@ -68,6 +68,7 @@ namespace Jackett.Common.Models
public string Encoding { get; set; }
public List<string> Links { get; set; }
public List<string> Legacylinks { get; set; }
public bool Followredirect { get; set; } = false;
public List<string> Certificates { get; set; }
public capabilitiesBlock Caps { get; set; }
public loginBlock Login { get; set; }
@@ -183,6 +184,7 @@ namespace Jackett.Common.Models
{
public List<string> Categories { get; set; }
public bool Inheritinputs { get; set; } = true;
public bool Followredirect { get; set; } = false;
}
public class requestBlock

View File

@@ -63,6 +63,7 @@ namespace Jackett.Common.Models
select new XElement("item",
new XElement("title", r.Title),
new XElement("guid", r.Guid),
new XElement("jackettindexer", new XAttribute("id", r.Origin.ID), r.Origin.DisplayName),
r.Comments == null ? null : new XElement("comments", r.Comments.ToString()),
r.PublishDate == DateTime.MinValue ? new XElement("pubDate", xmlDateFormat(DateTime.Now)) : new XElement("pubDate", xmlDateFormat(r.PublishDate)),
r.Size == null ? null : new XElement("size", r.Size),

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

@@ -20,8 +20,8 @@ namespace Jackett.Common.Utils
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("simpledatetime", typeof(SimpleDateTimeRenderer));
var logConfig = new LoggingConfiguration();
var logFile = new FileTarget();
logConfig.AddTarget("file", logFile);
logFile.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}";
logFile.FileName = Path.Combine(settings.DataFolder, logFileName);
logFile.ArchiveFileName = Path.Combine(settings.DataFolder, logFileName + ".{#####}.txt");
@@ -29,24 +29,54 @@ namespace Jackett.Common.Utils
logFile.MaxArchiveFiles = 5;
logFile.KeepFileOpen = false;
logFile.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
logConfig.AddTarget("file", logFile);
var microsoftRule = new LoggingRule();
microsoftRule.LoggerNamePattern = "Microsoft.*";
microsoftRule.SetLoggingLevels(LogLevel.Warn, LogLevel.Fatal);
microsoftRule.Final = true;
microsoftRule.Targets.Add(logFile);
var microsoftDebugRule = new LoggingRule();
microsoftDebugRule.LoggerNamePattern = "Microsoft.*";
microsoftDebugRule.SetLoggingLevels(LogLevel.Debug, LogLevel.Info);
microsoftDebugRule.Final = true;
if (settings.TracingEnabled)
{
microsoftDebugRule.Targets.Add(logFile);
}
logConfig.LoggingRules.Add(microsoftDebugRule);
var logFileRule = new LoggingRule("*", logLevel, logFile);
logConfig.LoggingRules.Add(logFileRule);
if (!fileOnly)
{
var logConsole = new ColoredConsoleTarget();
logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}";
logConfig.AddTarget("console", logConsole);
logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}";
var logConsoleRule = new LoggingRule("*", logLevel, logConsole);
logConfig.LoggingRules.Add(logConsoleRule);
var logService = new LogCacheService();
logConfig.AddTarget("service", logService);
var serviceRule = new LoggingRule("*", logLevel, logService);
logConfig.LoggingRules.Add(serviceRule);
microsoftRule.Targets.Add(logConsole);
microsoftRule.Targets.Add(logService);
if (settings.TracingEnabled)
{
microsoftDebugRule.Targets.Add(logConsole);
microsoftDebugRule.Targets.Add(logService);
}
}
logConfig.LoggingRules.Add(microsoftRule);
return logConfig;
}

View File

@@ -140,6 +140,32 @@ namespace Jackett.Server
{
foreach (var rule in LogManager.Configuration.LoggingRules)
{
if (rule.LoggerNamePattern == "Microsoft.*")
{
if (!rule.Levels.Contains(LogLevel.Debug))
{
//don't change the first microsoftRule
continue;
}
var targets = LogManager.Configuration.ConfiguredNamedTargets;
if (level == LogLevel.Debug)
{
foreach (var target in targets)
{
rule.Targets.Add(target);
}
}
else
{
foreach (var target in targets)
{
rule.Targets.Remove(target);
}
}
continue;
}
if (level == LogLevel.Debug)
{
if (!rule.Levels.Contains(LogLevel.Debug))

View File

@@ -7,6 +7,7 @@ using Jackett.Common.Utils;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Web;
using System;
@@ -184,6 +185,11 @@ namespace Jackett.Server
.PreferHostingUrls(true)
.UseConfiguration(Configuration)
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog();
}
}

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;

View File

@@ -275,6 +275,8 @@ namespace Jackett.Updater
"Definitions/torrentkim.yml",
"Definitions/horriblesubs.yml",
"Definitions/idope.yml",
"Definitions/bt-scene.yml",
"Definitions/extratorrentclone.yml",
};
foreach (var oldFile in oldFiles)