mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-12 06:57:05 +02:00
Compare commits
313 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4cf798b4b4 | ||
![]() |
806ed2d44e | ||
![]() |
cf77ec8932 | ||
![]() |
a1113c0ef0 | ||
![]() |
0138638825 | ||
![]() |
8af7944832 | ||
![]() |
5d0b33c003 | ||
![]() |
1c1664e8cb | ||
![]() |
3339375a26 | ||
![]() |
887d5d9f59 | ||
![]() |
ed86046377 | ||
![]() |
5887774640 | ||
![]() |
12cf07375e | ||
![]() |
11f4abbb46 | ||
![]() |
1a30a7e02d | ||
![]() |
0614ed1871 | ||
![]() |
fca85e6cae | ||
![]() |
fa093778c5 | ||
![]() |
e39451974c | ||
![]() |
488e793a22 | ||
![]() |
eb5875b820 | ||
![]() |
b8f5856bac | ||
![]() |
0c9acc990d | ||
![]() |
723eae7792 | ||
![]() |
201703ecbc | ||
![]() |
bdd62c2572 | ||
![]() |
74e8518060 | ||
![]() |
bcfccd83d4 | ||
![]() |
c0b9bb64f8 | ||
![]() |
7c4695604a | ||
![]() |
4ef83ad215 | ||
![]() |
537e25df3b | ||
![]() |
fe4a5f82b1 | ||
![]() |
a4053d914a | ||
![]() |
c86d3fb2f3 | ||
![]() |
c3749253b7 | ||
![]() |
d61bda4f8b | ||
![]() |
0f839682e1 | ||
![]() |
0a60686023 | ||
![]() |
802ddfe6ee | ||
![]() |
798a6df506 | ||
![]() |
09cf5ee06a | ||
![]() |
9a4092d7a2 | ||
![]() |
a466c87d34 | ||
![]() |
45327e642e | ||
![]() |
4a393cb244 | ||
![]() |
13c7f18024 | ||
![]() |
89eeee5939 | ||
![]() |
e7d52575ad | ||
![]() |
80371f7666 | ||
![]() |
cff056c71b | ||
![]() |
54663f51dd | ||
![]() |
1a31c23602 | ||
![]() |
1e5a6c16e5 | ||
![]() |
1dbb4ccea4 | ||
![]() |
84d3ebbc87 | ||
![]() |
6489dd99a5 | ||
![]() |
7868798857 | ||
![]() |
03e9ffc9ac | ||
![]() |
3858604b79 | ||
![]() |
cc2d607ce6 | ||
![]() |
9f56be5500 | ||
![]() |
b3d40d1f6f | ||
![]() |
9f44ab5d8f | ||
![]() |
b02a1d01a9 | ||
![]() |
de114b55b3 | ||
![]() |
487d746f66 | ||
![]() |
4febfc04a9 | ||
![]() |
9b867c5949 | ||
![]() |
50bf9acb4e | ||
![]() |
dabf592acb | ||
![]() |
3f2c2c59b1 | ||
![]() |
0212d2f4f4 | ||
![]() |
6c1dcd1a7d | ||
![]() |
a2eb4dbdbd | ||
![]() |
504573e5f5 | ||
![]() |
81035a002a | ||
![]() |
0e16d8da74 | ||
![]() |
6b460917ef | ||
![]() |
9bd65ceaa2 | ||
![]() |
7b5508d333 | ||
![]() |
4ba9569a08 | ||
![]() |
ac1fa68260 | ||
![]() |
864eb6f1cd | ||
![]() |
cb7acddd61 | ||
![]() |
383d9ff4f8 | ||
![]() |
5eb4dbe550 | ||
![]() |
10473c6bd3 | ||
![]() |
2ac29148af | ||
![]() |
e5682fc48e | ||
![]() |
f332369b53 | ||
![]() |
8a8a114723 | ||
![]() |
583d17dd36 | ||
![]() |
751d3e8b96 | ||
![]() |
60a9008480 | ||
![]() |
e606363ee7 | ||
![]() |
fd0c92f439 | ||
![]() |
10b6b08127 | ||
![]() |
0b9a0dab5a | ||
![]() |
1c4a2cf563 | ||
![]() |
a93c347672 | ||
![]() |
683ebca006 | ||
![]() |
000c57b9c1 | ||
![]() |
4c6b946cf9 | ||
![]() |
b3cf51172f | ||
![]() |
56b8a81248 | ||
![]() |
f7107bf37d | ||
![]() |
c545a49755 | ||
![]() |
19ec3e2aff | ||
![]() |
4846ea000a | ||
![]() |
a29d63e6dc | ||
![]() |
bd177cbf26 | ||
![]() |
93d5acd355 | ||
![]() |
7cc19212f5 | ||
![]() |
ba36c9bdff | ||
![]() |
734fc31d8e | ||
![]() |
6c6d55eb63 | ||
![]() |
17cabb2921 | ||
![]() |
b0250deee1 | ||
![]() |
de8adf382b | ||
![]() |
c31b9d84f0 | ||
![]() |
2bdf899927 | ||
![]() |
2101ebb2de | ||
![]() |
a92e0bef37 | ||
![]() |
090ee7b093 | ||
![]() |
4cd184ae72 | ||
![]() |
642f990862 | ||
![]() |
829347cba2 | ||
![]() |
ca39b85cc2 | ||
![]() |
7a57e2d302 | ||
![]() |
49de2b0a93 | ||
![]() |
a2bd2615c1 | ||
![]() |
71d368689c | ||
![]() |
e1515b468c | ||
![]() |
398f0993f4 | ||
![]() |
c846eb4330 | ||
![]() |
cae6d4ed73 | ||
![]() |
b286dc1c7f | ||
![]() |
61a69472c5 | ||
![]() |
a04fc6f123 | ||
![]() |
86964e1cc6 | ||
![]() |
2d7c30dbde | ||
![]() |
5b6d1ccc7b | ||
![]() |
b9b826c34c | ||
![]() |
b33018563b | ||
![]() |
033070d9a9 | ||
![]() |
8d67d1bf37 | ||
![]() |
f9143d14e5 | ||
![]() |
a601a25652 | ||
![]() |
6451525eb1 | ||
![]() |
acd1902734 | ||
![]() |
9d68ca86da | ||
![]() |
5b9165cd2f | ||
![]() |
8a48874b42 | ||
![]() |
b0132da030 | ||
![]() |
175d7f5379 | ||
![]() |
dc8023afe1 | ||
![]() |
d956872d95 | ||
![]() |
35defc04e0 | ||
![]() |
a2f5e5a5aa | ||
![]() |
ec5a8e6e33 | ||
![]() |
f00aa5faca | ||
![]() |
51ece1726c | ||
![]() |
579190b4bd | ||
![]() |
fd4d8d490a | ||
![]() |
e2fe43b3a7 | ||
![]() |
bedde1a3db | ||
![]() |
da638ad712 | ||
![]() |
10ae5e9d5d | ||
![]() |
71749ba8db | ||
![]() |
4373c38869 | ||
![]() |
2a17783a9c | ||
![]() |
a184ad4d7c | ||
![]() |
acc1e7e65a | ||
![]() |
95ffd0caa3 | ||
![]() |
b0e788788f | ||
![]() |
80f0c1b7da | ||
![]() |
7abdd0d817 | ||
![]() |
736330bea3 | ||
![]() |
accd06d291 | ||
![]() |
fed8294ae0 | ||
![]() |
1093355e77 | ||
![]() |
aae73741e8 | ||
![]() |
17002a6ede | ||
![]() |
4f96f437ad | ||
![]() |
335ea77e9e | ||
![]() |
41a4dc2922 | ||
![]() |
ee1d7a7625 | ||
![]() |
e9aa0edc37 | ||
![]() |
e64d7ea947 | ||
![]() |
8eb0415aaf | ||
![]() |
ef20198a4f | ||
![]() |
6c6d379002 | ||
![]() |
7c2a343629 | ||
![]() |
ea2e88d6bb | ||
![]() |
abaf909ef1 | ||
![]() |
74054523c5 | ||
![]() |
37daacf9fa | ||
![]() |
b58dc51f8d | ||
![]() |
6c661a4974 | ||
![]() |
7a49ddda3a | ||
![]() |
5e4cb3581d | ||
![]() |
968c2ca3a6 | ||
![]() |
af4fb5c6a0 | ||
![]() |
fc7d5a0e35 | ||
![]() |
2a7c693917 | ||
![]() |
838ad77d7f | ||
![]() |
3978ba6c04 | ||
![]() |
60554c25d9 | ||
![]() |
bd03c903d0 | ||
![]() |
113e5d658c | ||
![]() |
f9b4b5a76c | ||
![]() |
2f378210d9 | ||
![]() |
e5de468899 | ||
![]() |
204d96bcec | ||
![]() |
9e37b1429a | ||
![]() |
6b61e22f95 | ||
![]() |
c3dffe42be | ||
![]() |
796947fd6f | ||
![]() |
77b1da3089 | ||
![]() |
f3c6acf634 | ||
![]() |
ab810a20db | ||
![]() |
60f1be6f18 | ||
![]() |
ab6f7d5218 | ||
![]() |
67f50e88a3 | ||
![]() |
79a354c6d9 | ||
![]() |
ee20b141da | ||
![]() |
0c67c6322a | ||
![]() |
99ed3fbc2c | ||
![]() |
ef92bf5342 | ||
![]() |
053d2be3f3 | ||
![]() |
c155bf8c8c | ||
![]() |
e1232800c6 | ||
![]() |
7a2c0bf260 | ||
![]() |
203b5d1e37 | ||
![]() |
1325fc6391 | ||
![]() |
1c3bc3cbf4 | ||
![]() |
8509276972 | ||
![]() |
e7710489ca | ||
![]() |
f6a669ea46 | ||
![]() |
68ad01e346 | ||
![]() |
ffda2c8269 | ||
![]() |
896b2ab954 | ||
![]() |
bbcec8103d | ||
![]() |
8f0ba9cefe | ||
![]() |
cc3ebbe1ae | ||
![]() |
d88db81207 | ||
![]() |
9a15f1d1a3 | ||
![]() |
4e5f091b6c | ||
![]() |
517f196d73 | ||
![]() |
9461d2470a | ||
![]() |
c9f874dc93 | ||
![]() |
53b6285810 | ||
![]() |
5d4e0c41d6 | ||
![]() |
754337b58f | ||
![]() |
16f79085ad | ||
![]() |
005539d30d | ||
![]() |
2d5a90ae31 | ||
![]() |
fc060d6468 | ||
![]() |
d0937d3561 | ||
![]() |
7b8de5e28d | ||
![]() |
790f5ddfad | ||
![]() |
760231be43 | ||
![]() |
837e74a743 | ||
![]() |
630f613721 | ||
![]() |
aba9e6db47 | ||
![]() |
88858022af | ||
![]() |
852bb27de0 | ||
![]() |
9a071a3457 | ||
![]() |
db11db28e4 | ||
![]() |
79a8ef957f | ||
![]() |
0e0dfe80a7 | ||
![]() |
c112aef644 | ||
![]() |
2e30fe1899 | ||
![]() |
6b3ffa22c9 | ||
![]() |
9e78f46010 | ||
![]() |
50a09189e4 | ||
![]() |
fcda42b9f1 | ||
![]() |
48f72a3096 | ||
![]() |
e4e1ac2c18 | ||
![]() |
a719048f81 | ||
![]() |
8f1f41a4a1 | ||
![]() |
fffd53cc1f | ||
![]() |
ae7c139452 | ||
![]() |
76a3e7cd85 | ||
![]() |
20495ef32b | ||
![]() |
41b91bb0c3 | ||
![]() |
6e59cc4c33 | ||
![]() |
2aaed9b9e4 | ||
![]() |
f7dc404eaf | ||
![]() |
f3b9e70dde | ||
![]() |
d065f0abf4 | ||
![]() |
6e173558db | ||
![]() |
f78434e758 | ||
![]() |
ef5f2ccb89 | ||
![]() |
f05db7f544 | ||
![]() |
12cc25bdb0 | ||
![]() |
5936defc06 | ||
![]() |
3e9006464d | ||
![]() |
f7bf8fba40 | ||
![]() |
6bbb80a54e | ||
![]() |
7889077498 | ||
![]() |
074f0da27f | ||
![]() |
d7c35b2fe4 | ||
![]() |
4d8b55a92f | ||
![]() |
7387679a6f | ||
![]() |
af93571568 | ||
![]() |
1e2ecfc0c5 | ||
![]() |
b98a1ff1f5 | ||
![]() |
6170ef09b4 | ||
![]() |
15a1c6566f | ||
![]() |
113b3dffff | ||
![]() |
511ae721e2 |
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,7 +1,11 @@
|
||||
**Please use the search bar** at the top of the page and make sure you are not creating an already submitted issue. Duplicating issues makes it more difficult for everyone to follow. Your issue may have already been solved in the past as well.
|
||||
|
||||
Provide a description of the feature request or bug, the more details the better.
|
||||
If you are experiencing an issue with a tracker, a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
|
||||
If you are experiencing an issue with a tracker, then:
|
||||
1. Use your browser to check you can access the site directly, and if a login is required, check you can login and that you do not have any outstanding account issues.
|
||||
2. If you haven't already, try upgrading to the latest version of Jackett, your issue may have already been resolved.
|
||||
3. If it is still not working for you, then a **full enhanced log must be included**. Instructions for obtaining logs are here: https://github.com/Jackett/Jackett#troubleshooting
|
||||
|
||||
**Jackett version**:
|
||||
**Mono version** (if not using Windows):
|
||||
|
127
README.md
127
README.md
@@ -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.
|
||||
|
||||
@@ -24,49 +24,56 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Anidex
|
||||
* Anime Tosho
|
||||
* AniRena
|
||||
* AudioBookBay
|
||||
* BTstor.net
|
||||
* btbit
|
||||
* BTDB
|
||||
* BT-Scene
|
||||
* cpasbien
|
||||
* ETTV
|
||||
* EliteTorrent.biz
|
||||
* ExtraTorrent.ag
|
||||
* EZTV
|
||||
* Frozen Layer
|
||||
* GkTorrent
|
||||
* Horrible Subs
|
||||
* Idope
|
||||
* IdopeClone
|
||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||
* Il Corsaro Blu
|
||||
* Isohunt2
|
||||
* KATcrs
|
||||
* KickAssTorrent
|
||||
* KickAssTorrent (thekat.se clone)
|
||||
* LimeTorrents
|
||||
* MagnetDL
|
||||
* MejorTorrent <!-- maintained by ivandelabeldad -->
|
||||
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, etc)
|
||||
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
|
||||
* Nyaa.si
|
||||
* Nyaa-Pantsu
|
||||
* Nyoo
|
||||
* ProStyleX
|
||||
* RARBG
|
||||
* RuTor
|
||||
* ShowRSS
|
||||
* SkyTorrentsClone
|
||||
* sukebei.Nyaa.si
|
||||
* sukebei-Pantsu
|
||||
* The Pirate Bay
|
||||
* TNTVillage <!-- maintained by bonny1992 -->
|
||||
* Tokyo Toshokan
|
||||
* Torlock
|
||||
* TorrentCouch
|
||||
* Torrent Downloads
|
||||
* TorrentGalaxy.org
|
||||
* Torrent9
|
||||
* TorrentKim
|
||||
* Torernt9 clone (torrents9.ch)
|
||||
* Torrentz2
|
||||
* World Wide Torrents
|
||||
* YIFY (YTS)
|
||||
* YTS.ag
|
||||
* Zooqle
|
||||
|
||||
### Supported Semi-Private Trackers
|
||||
* 7tor
|
||||
* ArenaBG
|
||||
* CzTorrent
|
||||
* Deildu
|
||||
* Gay-Torrents.net
|
||||
@@ -80,6 +87,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Newstudio
|
||||
* NetHD
|
||||
* NoName Club
|
||||
* RockBox
|
||||
* RuTracker
|
||||
* SkTorrent
|
||||
* Union Fansub
|
||||
@@ -90,27 +98,29 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
### Supported Private Trackers
|
||||
* 2 Fast 4 You
|
||||
* 3D Torrents
|
||||
* 420files
|
||||
* 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
|
||||
* BIT-HDTV
|
||||
* Bithorlo
|
||||
@@ -122,64 +132,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
|
||||
* HD-Forever
|
||||
* HD-Only
|
||||
* HD-Space
|
||||
* HD4Free (HD4)
|
||||
* 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
|
||||
@@ -192,47 +203,53 @@ 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
|
||||
* Racing4Everyone (R4E)
|
||||
* Redacted (PassTheHeadphones)
|
||||
* Red Star Torrent
|
||||
* Redtopia (RED)
|
||||
* RetroFlix
|
||||
* RevolutionTT
|
||||
* RGU
|
||||
* RoDVD
|
||||
* Romanian Metal Torrent
|
||||
* SceneFZ
|
||||
* SceneHD
|
||||
* SceneReactor
|
||||
* SceneRush
|
||||
* SceneTime
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
@@ -248,15 +265,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
|
||||
@@ -272,9 +288,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
|
||||
@@ -288,9 +304,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
|
||||
@@ -340,6 +355,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)
|
||||
@@ -386,11 +409,10 @@ Example config for nginx:
|
||||
```
|
||||
location /jackett {
|
||||
proxy_pass http://127.0.0.1:9117;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Host $http_host;
|
||||
proxy_redirect off;
|
||||
}
|
||||
```
|
||||
@@ -431,7 +453,8 @@ All contributions are welcome just send a pull request. Jackett's framework all
|
||||
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
|
||||
* Open the Jackett solution in Visual Studio 2017 (version 15.7 or above)
|
||||
* Right click on the Jackett solution and click 'Rebuild Solution' to restore nuget packages
|
||||
* Select Jackett.Console as startup project
|
||||
* Select Jackett.Server as startup project
|
||||
* In the drop down menu of the run button select "Jackett.Server" instead of "IIS Express"
|
||||
* Build/Start the project
|
||||
|
||||
### OSX
|
||||
@@ -445,9 +468,9 @@ NOTE: msbuild is included in the mono release.
|
||||
|
||||
NOTE: if you get the error "NU1102: Unable to find package Microsoft.AspNetCore with version (>= 2.1.2)" while restoring packages, you'll need to install it manually.https://www.microsoft.com/net/download/thank-you/dotnet-sdk-2.1.302-macos-x64-installer then delete the entire project directory and restart from a new clone
|
||||
|
||||
* msbuild Jackett.Console/Jackett.Console.csproj /t:Build /p:Configuration=Debug
|
||||
* msbuild Jackett.Server/Jackett.Server.csproj /t:Build /p:Configuration=Debug
|
||||
* curl -sS https://curl.haxx.se/ca/cacert.pem | cert-sync --user /dev/stdin
|
||||
* mono Jackett.Console/bin/Debug/JackettConsole.exe
|
||||
* mono Jackett.Server/bin/Debug/JackettServer.exe
|
||||
|
||||
|
||||
### Linux
|
||||
@@ -457,8 +480,8 @@ sudo apt install mono-complete nuget msbuild # install build tools (debian/ubunt
|
||||
git clone https://github.com/Jackett/Jackett.git
|
||||
cd Jackett/src
|
||||
nuget restore Jackett.sln # prepare dependencies
|
||||
msbuild Jackett.Console/Jackett.Console.csproj /t:Build /p:Configuration=Debug # compile
|
||||
mono Jackett.Console/bin/Debug/JackettConsole.exe # run jackett
|
||||
msbuild Jackett.Server/Jackett.Server.csproj /t:Build /p:Configuration=Debug # compile
|
||||
mono Jackett.Server/bin/Debug/JackettServer.exe # run jackett
|
||||
```
|
||||
|
||||
## Screenshots
|
||||
|
77
install_service_macos
Executable file
77
install_service_macos
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/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
|
||||
launchctl remove org.user.Jackett
|
||||
|
||||
# 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 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 [[ $(launchctl list | grep org.user.Jackett) ]]; 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 plist to LaunchAgents
|
||||
mkdir -p ~/Library/LaunchAgents/
|
||||
cat >~/Library/LaunchAgents/org.user.Jackett.plist <<EOL
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>/usr/bin:/bin:/usr/sbin:/sbin:${monodir}</string>
|
||||
</dict>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>Label</key>
|
||||
<string>org.user.Jackett</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>${monodir}/mono</string>
|
||||
<string>--debug</string>
|
||||
<string>JackettConsole.exe</string>
|
||||
<string>--NoRestart</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>${jackettdir}</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
EOL
|
||||
|
||||
# Run the agent
|
||||
launchctl load ~/Library/LaunchAgents/org.user.Jackett.plist
|
||||
|
||||
# Check that it's running
|
||||
if [[ $(launchctl list | grep org.user.Jackett) ]]; then
|
||||
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
|
||||
else
|
||||
cat << EOL
|
||||
${BOLDRED}ERROR${NC}: Could not launch agent. 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}\`
|
||||
|
||||
EOL
|
||||
fi
|
79
install_service_systemd.sh
Executable file
79
install_service_systemd.sh
Executable 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
|
@@ -731,7 +731,7 @@ function updateReleasesRow(row)
|
||||
labels.empty();
|
||||
|
||||
if (IMDBId) {
|
||||
labels.append('\n<a href="http://www.imdb.com/title/tt' + IMDBId + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>');
|
||||
labels.append('\n<a href="http://www.imdb.com/title/tt' + ("000000" + IMDBId).slice(-7) + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>');
|
||||
}
|
||||
|
||||
if (!isNaN(DownloadVolumeFactor)) {
|
||||
|
@@ -663,6 +663,6 @@
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20180710"></script>
|
||||
<script type="text/javascript" src="../custom.js?changed=20180711"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -120,6 +120,10 @@
|
||||
paths:
|
||||
# present trending results if there are no search parms supplied
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/1/{{else}}/trending{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/2/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/3/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/4/{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/search/{{ .Keywords}}/5/{{else}}{{end}}"
|
||||
keywordsfilters:
|
||||
- name: replace # use this as a workaround till #893 is implemented
|
||||
args: ["Greys Anatomy", "Grey's Anatomy"]
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.2f4y.me/
|
||||
legacylinks:
|
||||
- http://www.2f4y.me/
|
||||
|
||||
caps:
|
||||
|
110
src/Jackett.Common/Definitions/420files.yml
Normal file
110
src/Jackett.Common/Definitions/420files.yml
Normal file
@@ -0,0 +1,110 @@
|
||||
---
|
||||
site: 420files
|
||||
name: 420files
|
||||
description: "Tracker Movies/TV/Music"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://420.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
|
||||
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: form[action*="/login"] .text-red
|
||||
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"
|
@@ -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]
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.arabafenice.me/
|
||||
legacylinks:
|
||||
- http://www.arabafenice.me/
|
||||
|
||||
caps:
|
||||
@@ -99,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"
|
||||
@@ -113,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
|
||||
|
163
src/Jackett.Common/Definitions/arenabg.yml
Normal file
163
src/Jackett.Common/Definitions/arenabg.yml
Normal 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 & 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"
|
132
src/Jackett.Common/Definitions/audiobookbay.yml
Normal file
132
src/Jackett.Common/Definitions/audiobookbay.yml
Normal file
@@ -0,0 +1,132 @@
|
||||
---
|
||||
site: audiobookbay
|
||||
name: AudioBookBay
|
||||
description: "AudioBook Bay (ABB) is a semi-private Torrent Tracker for AUDIOBOOKS"
|
||||
language: en-us
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://audiobookbay.nl/
|
||||
- https://audiobookbay.la/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: Children, cat: Audio/Audiobook, desc: "Children"}
|
||||
- {id: Teen, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
|
||||
- {id: Adults, cat: Audio/Audiobook, desc: "Adults"}
|
||||
- {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, 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, cat: Audio/Audiobook, desc: "Doctor Who"}
|
||||
- {id: Education, cat: Audio/Audiobook, desc: "Education"}
|
||||
- {id: Fantasy, cat: Audio/Audiobook, desc: "Fantasy"}
|
||||
- {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"}
|
||||
- {id: Lecture, cat: Audio/Audiobook, desc: "Lecture"}
|
||||
- {id: LGBT, cat: Audio/Audiobook, desc: "LGBT"}
|
||||
- {id: Literature, cat: Audio/Audiobook, desc: "Literature"}
|
||||
- {id: LitRPG, cat: Audio/Audiobook, desc: "LitRPG"}
|
||||
- {id: Misc., cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
|
||||
- {id: Mystery, cat: Audio/Audiobook, desc: "Mystery"}
|
||||
- {id: Myth, cat: Audio/Audiobook, desc: "Myth Hunting"}
|
||||
- {id: Paranormal, cat: Audio/Audiobook, desc: "Paranormal"}
|
||||
- {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, 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, 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, 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, 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, cat: Audio/Audiobook, desc: "Short Story"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: https://audiobookbay.nl/member/login.php
|
||||
form: form[action="https://audiobookbay.nl/member/login.php"]
|
||||
method: post
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
login: "Login"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("Invalid"))
|
||||
test:
|
||||
path: /member/users/
|
||||
|
||||
download:
|
||||
selector: a[href^="/download?"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
# 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:has(div[class="postTitle"])
|
||||
fields:
|
||||
title:
|
||||
selector: div.postTitle
|
||||
details:
|
||||
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"
|
175
src/Jackett.Common/Definitions/bigtower.yml
Normal file
175
src/Jackett.Common/Definitions/bigtower.yml
Normal file
@@ -0,0 +1,175 @@
|
||||
---
|
||||
site: bigtower
|
||||
name: BigTower
|
||||
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||
language: it-it
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://bigtower.info/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
||||
# Movies
|
||||
- {id: 91, cat: Movies/HD, desc: "DSS"}
|
||||
- {id: 92, cat: Movies/HD, desc: "DSS 3D"}
|
||||
- {id: 14, cat: Movies, desc: "Screener"}
|
||||
- {id: 15, cat: Movies/SD, desc: "DVDRip"}
|
||||
- {id: 16, cat: Movies/HD, desc: "BDRip"}
|
||||
- {id: 17, cat: Movies/HD, desc: "HD 720p"}
|
||||
- {id: 18, cat: Movies/HD, desc: "HD 1080p"}
|
||||
- {id: 19, cat: Movies/HD, desc: "HD 3D"}
|
||||
- {id: 83, cat: Movies/HD, desc: "4K (Ultra HD)"}
|
||||
- {id: 89, cat: Movies/DVD, desc: "DVD 5"}
|
||||
- {id: 90, cat: Movies/DVD, desc: "DVD 9"}
|
||||
- {id: 37, cat: Movies, desc: "MP4"}
|
||||
- {id: 61, cat: TV, desc: "TV Show"}
|
||||
- {id: 78, cat: TV, desc: "Serie TV"}
|
||||
- {id: 96, cat: TV/HD, desc: "Serie TV 720p"}
|
||||
- {id: 97, cat: TV/HD, desc: "Serie TV 1080p"}
|
||||
- {id: 98, cat: TV, desc: "Serie TV MP4"}
|
||||
- {id: 24, cat: TV/Anime, desc: "Cartoni"}
|
||||
- {id: 66, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 71, cat: TV, desc: "SUB iTA"}
|
||||
- {id: 75, cat: TV/Documentary, desc: "Documentari"}
|
||||
- {id: 72, cat: TV/Sport, desc: "Sport"}
|
||||
|
||||
# GAMES
|
||||
- {id: 28, cat: PC/Games, desc: "PC Games"}
|
||||
- {id: 63, cat: Console/Xbox 360, desc: "XBOX 360"}
|
||||
- {id: 64, cat: Console/PS3, desc: "PS3"}
|
||||
- {id: 33, cat: Console/Wii, desc: "WII"}
|
||||
- {id: 76, cat: Console/Other, desc: "PS2"}
|
||||
- {id: 81, cat: Console/Xbox One, desc: "XBOX ONE"}
|
||||
- {id: 84, cat: Console/PS4, desc: "PS4"}
|
||||
|
||||
# MUSIC
|
||||
- {id: 35, cat: Audio, desc: "MP3"}
|
||||
- {id: 67, cat: Audio, desc: "FLAC"}
|
||||
|
||||
# SOFTWARE
|
||||
- {id: 52, cat: PC/ISO, desc: "Windows"}
|
||||
- {id: 54, cat: PC/ISO, desc: "Mac"}
|
||||
- {id: 69, cat: PC/ISO, desc: "Linux"}
|
||||
|
||||
# PHONE
|
||||
- {id: 40, cat: PC/Phone-IOS, desc: "Android"}
|
||||
- {id: 41, cat: PC/Phone-Android, desc: "Iphone"}
|
||||
|
||||
# OTHER
|
||||
- {id: 44, cat: Other, desc: "Varie"}
|
||||
- {id: 82, cat: Other, desc: "Music Video"}
|
||||
- {id: 86, cat: Other, desc: "Navigatori"}
|
||||
- {id: 95, cat: Other, desc: "Immagini"}
|
||||
- {id: 99, cat: Other, desc: "AudioLibri"}
|
||||
|
||||
# EBOOK
|
||||
- {id: 46, cat: Books, desc: "Ebook"}
|
||||
- {id: 73, cat: Books/Comics, desc: "Fumetti"}
|
||||
- {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
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: span:contains("Nome Utente non corretto")
|
||||
test:
|
||||
path: index.php
|
||||
selector: a[href="logout.php"]
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: index.php
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
page: "torrents"
|
||||
category: "{{range .Categories}}{{.}};{{end}}"
|
||||
options: "0"
|
||||
active: "0"
|
||||
rows:
|
||||
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="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
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
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "src=(.*?) "
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
details:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-last-child(2)
|
||||
date:
|
||||
selector: td:nth-last-child(7)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +01:00"
|
||||
- name: dateparse
|
||||
args: "02/01/2006 -07:00"
|
||||
grabs:
|
||||
selector: td:nth-last-child(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-last-child(6)
|
||||
leechers:
|
||||
selector: td:nth-last-child(5)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Gold 100% Free"]: "0"
|
||||
img[alt="Silver 50% Free"]: "0.5"
|
||||
img[alt="Bronze 25% Free"]: "0.75"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img[alt="2x Upload Multiplier"]: "2"
|
||||
img[alt="3x Upload Multiplier"]: "3"
|
||||
img[alt="4x Upload Multiplier"]: "4"
|
||||
img[alt="5x Upload Multiplier"]: "5"
|
||||
img[alt="6x Upload Multiplier"]: "6"
|
||||
img[alt="7x Upload Multiplier"]: "7"
|
||||
img[alt="8x Upload Multiplier"]: "8"
|
||||
img[alt="9x Upload Multiplier"]: "9"
|
||||
img[alt="10x Upload Multiplier"]: "10"
|
||||
"*": "1"
|
@@ -69,9 +69,18 @@
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
# download button can be disbled in the profile, use details link instead
|
||||
# download:
|
||||
# selector: a[href^="download.php/"]
|
||||
# attribute: href
|
||||
download:
|
||||
selector: a[href^="download.php/"]
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php/"]
|
||||
- name: append
|
||||
args: "/invalid.torrent"
|
||||
title:
|
||||
selector: a[href^="details.php?id="]
|
||||
title:
|
||||
|
@@ -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"
|
||||
|
@@ -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"
|
@@ -53,6 +53,10 @@
|
||||
selector: .sbar span:nth-of-type(5) b
|
||||
grabs:
|
||||
selector: .sbar span:nth-of-type(6) b
|
||||
seeders:
|
||||
text: "1"
|
||||
leechers:
|
||||
text: "1"
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://btdb.unblocked.app/
|
||||
legacylinks:
|
||||
- https://btdb.to/
|
||||
|
||||
caps:
|
||||
@@ -25,7 +27,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}}"
|
||||
@@ -63,9 +65,9 @@
|
||||
grabs:
|
||||
selector: div[class$="info"] span:nth-of-type(4)
|
||||
seeders:
|
||||
text: "999"
|
||||
selector: div[class$="info"] span:nth-of-type(4)
|
||||
leechers:
|
||||
text: "999"
|
||||
selector: div[class$="info"] span:nth-of-type(4)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
78
src/Jackett.Common/Definitions/btstornet.yml
Normal file
78
src/Jackett.Common/Definitions/btstornet.yml
Normal file
@@ -0,0 +1,78 @@
|
||||
---
|
||||
site: btstornet
|
||||
name: BTstor.net
|
||||
description: "BTstor.net is a Public BT-Scene clone for MOVIES / TV / GENERAL"
|
||||
language: us-en
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://btstor.net/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
"anime": TV/Anime
|
||||
"books": Books
|
||||
"games": PC/Games
|
||||
"movies": Movies
|
||||
"music": Audio
|
||||
"other": Other
|
||||
"shows": TV
|
||||
"software": PC
|
||||
"video": Movies
|
||||
"xxx": XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
download:
|
||||
selector: "#dlt_"
|
||||
|
||||
search:
|
||||
# https://btstor.net/
|
||||
# https://btstor.net/q/midnight+texas+s01e10/date/
|
||||
keywordsfilters:
|
||||
# replace space between keywords with +
|
||||
- name: re_replace
|
||||
args: [" ", "+"]
|
||||
paths:
|
||||
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}test{{end}}/date/"
|
||||
rows:
|
||||
selector: table.tor > tbody > tr[class$="_tr"]
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: td.tname_index > a
|
||||
details:
|
||||
selector: td.tname_index > a
|
||||
attribute: href
|
||||
category:
|
||||
# src="https://btstor.net/templates/btscene/images/shows.png"
|
||||
selector: td.tname_index > img
|
||||
attribute: src
|
||||
filters:
|
||||
- name: replace
|
||||
args: [".png", ""]
|
||||
- name: split
|
||||
args: ["/", 6]
|
||||
download:
|
||||
selector: td.tname_index > a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td.tsize_index
|
||||
seeders:
|
||||
selector: td.tseeds_index
|
||||
leechers:
|
||||
selector: td.tpeers_index
|
||||
date:
|
||||
selector: td.tupd_index
|
||||
filters:
|
||||
- name: timeago
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -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"
|
||||
|
@@ -5,8 +5,9 @@
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- http://www.cpabien.io/
|
||||
- https://www.cpabien.cx/
|
||||
legacylinks:
|
||||
- http://www.cpasbiens.cc/
|
||||
- http://www.cpabien.cm/
|
||||
@@ -15,12 +16,19 @@
|
||||
- http://cpabien.mx/
|
||||
- https://www.cpabien.bz/
|
||||
- http://www.cpabien.bz/
|
||||
- http://www.cpabien.cx/
|
||||
- http://cpabien.org/
|
||||
- http://cpabien.cc/
|
||||
- http://cpabien.co/
|
||||
- http://cpabien.la/
|
||||
- http://cpabien.club/
|
||||
- http://www.cpabien.io/
|
||||
- https://ww1.cpabien.io/
|
||||
- https://wvw.cpabien.cm/
|
||||
- https://www.cpabien.io/
|
||||
- https://www.cpabien9.net/
|
||||
- https://wwv.cpabien.cm/
|
||||
- http://www.cpabien.cx/
|
||||
- https://www.cpasbien.blue/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
116
src/Jackett.Common/Definitions/dxdhd.yml
Normal file
116
src/Jackett.Common/Definitions/dxdhd.yml
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
site: dxdhd
|
||||
name: DXDHD
|
||||
description: "General Tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://dxdhd.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
- {id: 4, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 5, cat: PC/0day, desc: "Apps"}
|
||||
- {id: 6, cat: Books, desc: "Books"}
|
||||
- {id: 7, cat: PC/Games, desc: "Games"}
|
||||
- {id: 8, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 9, cat: Other, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
login:
|
||||
path: /login
|
||||
method: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.main:contains("Login Failed!")
|
||||
test:
|
||||
path: /torrents
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /filterTorrents
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
||||
uploader: ""
|
||||
imdb: "{{ .Query.IMDBIDShort }}"
|
||||
tvdb: ""
|
||||
tmdb: ""
|
||||
mal: ""
|
||||
sorting: created_at
|
||||
direction: desc
|
||||
qty: 100
|
||||
rows:
|
||||
selector: table > tbody > tr
|
||||
fields:
|
||||
category:
|
||||
selector: a[href*="/categories/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "/categories/.*?\\.(\\d+)"
|
||||
title:
|
||||
selector: a.view-torrent
|
||||
download:
|
||||
selector: a[href*="/download/"]
|
||||
attribute: href
|
||||
details:
|
||||
selector: a.view-torrent
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d\.]+)
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
|
||||
- name: re_replace
|
||||
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"100% Free\"]": "0" # Single Torrent Freeleech
|
||||
"i[data-original-title=\"Global FreeLeech\"]": "0" # Global Freeleech
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double upload\"]": "2" # Single Torrent Double Upload
|
||||
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
|
||||
"*": "1"
|
75
src/Jackett.Common/Definitions/elitetorrent-biz.yml
Normal file
75
src/Jackett.Common/Definitions/elitetorrent-biz.yml
Normal 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"
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: ethor
|
||||
name: Ethor.net (Thor's Land)
|
||||
description: "A French gerneral tracker"
|
||||
@@ -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,8 +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: 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
|
||||
|
@@ -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:
|
||||
|
@@ -80,3 +80,10 @@
|
||||
selector: td:nth-child(8)
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"strong.tl_free": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
|
@@ -162,21 +162,21 @@
|
||||
- name: regexp
|
||||
args: "src=(.+?) "
|
||||
size:
|
||||
selector: td:nth-child(11)
|
||||
selector: td:nth-last-child(3)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
selector: td:nth-last-child(8)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/2006"
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
selector: td:nth-last-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["---", "0"]
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
selector: td:nth-last-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
selector: td:nth-last-child(6)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[alt="Free Leech"]: "0"
|
||||
|
@@ -5,12 +5,22 @@
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://www.gktorrent.org/
|
||||
- https://www.gktorrent.co/
|
||||
legacylinks:
|
||||
- http://www.gktorrent.net/
|
||||
- https://www.gktorrent.com/ # they're forcing http
|
||||
- https://www.gktorrent.org/
|
||||
- https://www.gktorrent.com/
|
||||
- http://www.gktorrent.com/
|
||||
- http://ww1.gktorrent.com/
|
||||
- http://ww2.gktorrent.com/
|
||||
- https://ww2.gktorrent.com/
|
||||
- https://ww3.gktorrent.com/
|
||||
- http://www.gktorrent.net/
|
||||
- https://www.gktorrent.net/
|
||||
- https://ww4.gktorrent.com/
|
||||
- https://www.gktorrent.me/
|
||||
- http://www.gktorrent.co/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
115
src/Jackett.Common/Definitions/hd4free.yml
Normal file
115
src/Jackett.Common/Definitions/hd4free.yml
Normal file
@@ -0,0 +1,115 @@
|
||||
---
|
||||
site: hd4free
|
||||
name: hd4free
|
||||
description: "General Tracker Movies/TV/Apps/Games/Music/Books"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://hd4.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: TV, desc: "TV"}
|
||||
- {id: 3, cat: Audio, desc: "Music"}
|
||||
- {id: 4, cat: Books, desc: "Books"}
|
||||
- {id: 5, cat: PC/Mac, desc: "Apps"}
|
||||
- {id: 6, cat: Other, desc: "Other"}
|
||||
- {id: 7, cat: PC/Games, desc: "Games"}
|
||||
|
||||
|
||||
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"
|
||||
"i[data-original-title=\"Global FreeLeech\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double upload\"]": "2"
|
||||
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
|
||||
"*": "1"
|
104
src/Jackett.Common/Definitions/hdcenter.yml
Normal file
104
src/Jackett.Common/Definitions/hdcenter.yml
Normal 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"
|
@@ -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:
|
||||
|
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://hdhome.org
|
||||
- https://hdhome.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -70,18 +70,17 @@
|
||||
selector: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
inputs:
|
||||
logintype: "username"
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: td.embedded:has(h2:contains("姿势不正确"))
|
||||
- selector: td.embedded:has(h2:contains("失败"))
|
||||
test:
|
||||
path: /torrents.php
|
||||
path: torrents.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /torrents.php
|
||||
- path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://hdtorrents.xyz/
|
||||
legacylinks:
|
||||
- http://hdtorrents.it/
|
||||
|
||||
caps:
|
||||
@@ -54,23 +56,25 @@
|
||||
- name: re_replace #separate title
|
||||
args: ["(\\s+\\/\\s+|\\/\\s+|\\s+\\/|\\/)(.*)\\s\\(", " ("]
|
||||
- name: re_replace #remove (yyyy) from the title
|
||||
args: ["(\\(\\d{4}\\))|(\\(\\d{4})", ""]
|
||||
args: ["(\\(\\d{4}\\)?\\s?)", ""]
|
||||
- name: re_replace #remove |
|
||||
args: ["(\\s\\|\\s)", " "]
|
||||
- name: re_replace #Stagione X --> S0X
|
||||
args: ["Stagione (\\d{0,1}\\s)", "S0$1"]
|
||||
- name: re_replace #Stagione XX --> SXX
|
||||
args: ["Stagione (\\d{2}\\s)", "S$1"]
|
||||
args: ["(\\s\\||\\s\\/)", ""]
|
||||
- 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 [YY-YY --> EYY-YY
|
||||
args: ["(\\s\\/\\sEpisodio|\\s\\/\\sEpisodi|\\sEpisodio|\\s\\|\\sEpisodio|\\sEpisodi)\\s\\[", "E"]
|
||||
args: ["(?i)(\\s\\/?\\s?Episodi[o]?)\\s\\[", "E"]
|
||||
- name: re_replace # Episodio 4 to E4
|
||||
args: ["(?i)\\b(?:[\\s\\/\\|]?Episodi[o]?\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
|
||||
- name: re_replace #/ Completa [episodi YY-YY --> EYY-YY
|
||||
args: ["(\\s\\/\\sCompleta\\s\\[episodi\\s)", "E"]
|
||||
args: ["(?i)(\\s\\/\\sCompleta\\s\\[episodi\\s)", "E"]
|
||||
- name: re_replace #remove di YY] | remove /YY]
|
||||
args: ["(\\sdi\\s\\d{1,2}|\\/\\d{1,2})\\]", " "]
|
||||
args: ["(?i)(\\sdi\\s\\d{1,2}|\\/\\d{1,2})\\]", " "]
|
||||
- name: re_replace #remove various
|
||||
args: ["(Serie completa|Completa|\\[in pausa\\])", ""]
|
||||
args: ["(?i)(Serie completa|Completa|\\[in pausa\\])", ""]
|
||||
title|append: #start year
|
||||
text: "("
|
||||
text: " ("
|
||||
title|append: #add year
|
||||
selector: td:nth-child(2) a:nth-child(1)
|
||||
filters:
|
||||
@@ -97,6 +101,9 @@
|
||||
args: ["ITA", ""]
|
||||
title|append: #end TAG
|
||||
text: "ITA]"
|
||||
filters:
|
||||
- name: re_replace # replace multiple spaces
|
||||
args: ["[ ]{2,}", " "]
|
||||
details:
|
||||
selector: td:nth-child(2) a:nth-child(1)
|
||||
attribute: href
|
||||
@@ -133,6 +140,8 @@
|
||||
"a[href^=\"details.php\"]:contains(\"Stagione\")": 5040 # TV/HD
|
||||
"*": 2040 # default to Movies/HD
|
||||
downloadvolumefactor:
|
||||
text: "1"
|
||||
case:
|
||||
img[src="pic/freedownload.gif"]: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
||||
|
@@ -1,66 +0,0 @@
|
||||
---
|
||||
site: horriblesubs
|
||||
name: Horrible Subs
|
||||
description: "Anime Sub Group - \"So bad yet so good\""
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://horriblesubs.info/
|
||||
legacylinks:
|
||||
- https://horriblesubs.info/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: TV/Anime # Anime
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: prepend-horriblesubs
|
||||
type: checkbox
|
||||
label: Prepend [Horriblesubs] to torrent title
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "lib/{{if .Query.Keywords }}search.php{{else}}latest.php{{end}}"
|
||||
inputs:
|
||||
value: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: "div.release-links"
|
||||
dateheaders:
|
||||
selector: table.release-info
|
||||
filters:
|
||||
- name: split
|
||||
args: [" ", 0 ]
|
||||
- name: replace
|
||||
args: ["(", ""]
|
||||
- name: replace
|
||||
args: [")", ""]
|
||||
- name: replace
|
||||
args: ["/", "-"]
|
||||
- name: dateparse
|
||||
args: "01-02-06"
|
||||
- name: dateparse
|
||||
args: "01-02"
|
||||
fields:
|
||||
category:
|
||||
text: "1"
|
||||
title:
|
||||
selector: table.release-table > tbody > tr > td.dl-label
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "{{if .Config.prepend-horriblesubs}}[Horriblesubs] {{else}}{{end}}"
|
||||
details:
|
||||
attribute: class
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["release-links", ""]
|
||||
- name: re_replace
|
||||
args: [" ?(\\S+?)-((?:s\\d-)?(?:\\d+v?\\d?-){0,2}\\d+p)", "http://horriblesubs.info/shows/$1#$2"]
|
||||
download:
|
||||
selector: table.release-table > tbody > tr > td.hs-magnet-link > span > a
|
||||
attribute: href
|
||||
size:
|
||||
text: "500 MB"
|
@@ -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
|
||||
|
@@ -1,104 +0,0 @@
|
||||
---
|
||||
site: idope
|
||||
name: Idope
|
||||
description: "iDope is a Public torrent search engine presenting direct magnet links"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://idope.cc/
|
||||
legacylinks:
|
||||
- https://idope.se/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 0, cat: Other, desc: "Others"}
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: Other, desc: "Video"}
|
||||
- {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"}
|
||||
|
||||
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.
|
||||
|
||||
search:
|
||||
paths:
|
||||
# present trending results if there are no search parms supplied
|
||||
# sort torrent-list by age in descending order
|
||||
- path: "{{if .Keywords}}torrent-list/{{ .Keywords}}?&o=-3&c={{range .Categories }}{{.}}{{end}}{{else}}browse.html{{end}}"
|
||||
rows:
|
||||
selector: div[class="resultdiv"]
|
||||
fields:
|
||||
title:
|
||||
selector: div[class="resultdivtop"] a div[class="resultdivtopname"]
|
||||
category:
|
||||
optional: true
|
||||
selector: div[class="resultdivbotton"] div[class="resultdivbottoncategory"]
|
||||
case:
|
||||
":contains(\"Others\")": 0
|
||||
":contains(\"Movies\")": 1
|
||||
":contains(\"Video\")": 2
|
||||
":contains(\"TV\")": 3
|
||||
":contains(\"Anime\")": 4
|
||||
":contains(\"XXX\")": 5
|
||||
":contains(\"Music\")": 6
|
||||
":contains(\"Games\")": 7
|
||||
":contains(\"Apps\")": 8
|
||||
":contains(\"Books\")": 9
|
||||
details:
|
||||
selector: div[class="resultdivtop"] a
|
||||
attribute: href
|
||||
download-itorrents:
|
||||
selector: div[class="resultdivbotton"] div[id^="hideinfohash"]
|
||||
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
|
||||
magnet:
|
||||
selector: div[class="resultdivbotton"] div[id^="hideinfohash"]
|
||||
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"
|
||||
date:
|
||||
selector: div[class="resultdivbotton"] div[class="resulttime"] div[class="resultdivbottontime"]
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: div[class="resultdivbotton"] div[class="resultlength"] div[class="resultdivbottonlength"]
|
||||
seeders:
|
||||
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
|
||||
files:
|
||||
selector: div[class="resultdivbotton"] div[class="resultfile"] div[class="resultdivbottonfiles"]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
92
src/Jackett.Common/Definitions/idopeclone.yml
Normal file
92
src/Jackett.Common/Definitions/idopeclone.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
site: idopeclone
|
||||
name: IdopeClone
|
||||
description: "This Clone of iDope is a Public torrent search engine"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.idope.site/
|
||||
legacylinks:
|
||||
- https://idope.top/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {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: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- 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: li:has(div.opt-text-w3layouts)
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: div.opt-text-w3layouts a
|
||||
details:
|
||||
selector: div.opt-text-w3layouts a
|
||||
attribute: href
|
||||
category:
|
||||
optional: true
|
||||
selector: a[href^="/browse/"]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/browse/", ""]
|
||||
magnet:
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
date:
|
||||
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.seedbar span:nth-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Size: ", ""]
|
||||
seeders:
|
||||
selector: div.seedbar span:nth-child(1)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Seed: ", ""]
|
||||
leechers:
|
||||
selector: div.seedbar span:nth-child(2)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Leech: ", ""]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -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"
|
||||
|
@@ -6,21 +6,29 @@
|
||||
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
|
||||
- a60e969b27965d4dc2ff45d50c20e2e872d4e9b9 # incomplete CA chain
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies/HD, desc: "BDRiP"}
|
||||
- {id: 2, cat: Audio, desc: "Music"}
|
||||
- {id: 2, cat: PC/Games, desc: "Games"}
|
||||
- {id: 5, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 7, cat: PC/0day, desc: "App"}
|
||||
- {id: 15, cat: TV, desc: "TV Series"}
|
||||
- {id: 19, cat: Movies/SD, desc: "Screener"}
|
||||
- {id: 20, cat: Movies/SD, desc: "Full DVD"}
|
||||
- {id: 1, cat: Movies/HD, desc: "BDRiP", default: true}
|
||||
- {id: 2, cat: Audio, desc: "Music", default: true}
|
||||
- {id: 2, cat: PC/Games, desc: "Games", default: true}
|
||||
- {id: 5, cat: TV/Anime, desc: "Anime", default: true}
|
||||
- {id: 7, cat: PC/0day, desc: "App", default: true}
|
||||
- {id: 15, cat: TV, desc: "TV Series", default: true}
|
||||
- {id: 19, cat: Movies/SD, desc: "Screener", default: true}
|
||||
- {id: 20, cat: Movies/SD, desc: "Full DVD", default: true}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
80
src/Jackett.Common/Definitions/katcrs.yml
Normal file
80
src/Jackett.Common/Definitions/katcrs.yml
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
site: katcrs
|
||||
name: KATcrs
|
||||
description: "KATcrs is a Public KickAssTorrent clone for TV / MOVIES / GENERAL"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- http://kickasstvshow.host/
|
||||
legacylinks:
|
||||
- https://kickasskatcr.website/
|
||||
- https://kickasskatcr.stream/
|
||||
- https://kickassextratorrent.xyz/
|
||||
- https://kickassextratorrent.website/
|
||||
- https://kickassextratorrent.club/
|
||||
- https://kickasstvshow.xyz/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
movies: Movies
|
||||
TV: TV
|
||||
Video: TV/WEB-DL
|
||||
Anime: TV/Anime
|
||||
Music: Audio
|
||||
Books: Books
|
||||
Documentary: TV/Documentary
|
||||
Games: Console
|
||||
Apps: PC
|
||||
Applications: PC
|
||||
Other: Other
|
||||
Othero: XXX
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- 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
|
||||
attribute: href
|
||||
filters:
|
||||
- name: trim
|
||||
args: /
|
||||
title:
|
||||
selector: td:nth-child(1) div a.cellMainLink
|
||||
attribute: title
|
||||
details:
|
||||
selector: td:nth-child(1) div a.cellMainLink
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(1) div div a[data-download=""]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: td:nth-child(1) div div a[data-nop=""]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(2)
|
||||
date:
|
||||
selector: td:nth-child(3)
|
||||
filters:
|
||||
- name: timeago
|
||||
seeders:
|
||||
selector: td:nth-child(4)
|
||||
leechers:
|
||||
selector: td:nth-child(5)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -6,10 +6,11 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.limetorrents.me/
|
||||
- https://www.limetorrents.info/
|
||||
legacylinks:
|
||||
- https://www.limetorrents.io/
|
||||
- https://www.limetorrents.cc/
|
||||
- https://www.limetorrents.me/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -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"
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.magnetdl.com/
|
||||
legacylinks:
|
||||
- http://www.magnetdl.com/
|
||||
|
||||
caps:
|
||||
|
114
src/Jackett.Common/Definitions/metal-iplay-ro.yml
Normal file
114
src/Jackett.Common/Definitions/metal-iplay-ro.yml
Normal 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"
|
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -7,6 +7,8 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://nyaa.si
|
||||
certificates:
|
||||
- 3801e330482d4f9baef71ca4e33ba23ede74f59c # incomplete CA chain
|
||||
|
||||
settings:
|
||||
- name: filter-id
|
||||
|
107
src/Jackett.Common/Definitions/prostylex.yml
Normal file
107
src/Jackett.Common/Definitions/prostylex.yml
Normal 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"
|
@@ -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"
|
||||
|
113
src/Jackett.Common/Definitions/redtopia.yml
Normal file
113
src/Jackett.Common/Definitions/redtopia.yml
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
site: redtopia
|
||||
name: Redtopia
|
||||
description: "Tracker Music/Podcasts/Audiobooks"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://redtopia.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Audio, desc: "Studio Album"}
|
||||
- {id: 2, cat: Audio, desc: "Studio Single"}
|
||||
- {id: 3, cat: Audio, desc: "Studio Collection"}
|
||||
- {id: 4, cat: Audio, desc: "Indie Album"}
|
||||
- {id: 5, cat: Audio, desc: "Indie Single"}
|
||||
- {id: 6, cat: Audio, desc: "Indie Collection"}
|
||||
- {id: 7, cat: Audio, desc: "Live Album"}
|
||||
- {id: 8, cat: Audio, desc: "OST"}
|
||||
- {id: 9, cat: Audio, desc: "Podcast"}
|
||||
- {id: 10, cat: Audio, desc: "Audio Book"}
|
||||
- {id: 11, cat: Audio, desc: "Audio Drama"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
music-search: [q]
|
||||
|
||||
login:
|
||||
path: /login
|
||||
method: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: form[action*="/login"] .text-red
|
||||
test:
|
||||
path: /torrents
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: /filterTorrents
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
|
||||
search: "{{ .Keywords }}"
|
||||
uploader: ""
|
||||
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(4)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(5)
|
||||
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"
|
||||
"i[data-original-title=\"Global FreeLeech\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double Upload\"]": "2" # global flag
|
||||
"i[data-original-title=\"Double upload\"]": "2" # torrent specific flag
|
||||
"*": "1"
|
104
src/Jackett.Common/Definitions/retroflix.yml
Normal file
104
src/Jackett.Common/Definitions/retroflix.yml
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
site: retroflix
|
||||
name: RetroFlix
|
||||
description: "Private Torrent Tracker for Classic Movies / TV / General Releases."
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://retroflix.club/
|
||||
legacylinks:
|
||||
- https://retroflix.net/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 401, cat: Movies, desc: "Movies"}
|
||||
- {id: 404, cat: TV/Documentary, desc: "Documentaries"}
|
||||
- {id: 405, cat: TV/Anime, desc: "Animations"}
|
||||
- {id: 402, cat: TV, desc: "TV Series"}
|
||||
- {id: 403, cat: TV, desc: "TV Shows"}
|
||||
- {id: 406, cat: Audio/Video, desc: "Music Videos"}
|
||||
- {id: 407, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 409, cat: Other, desc: "Misc"}
|
||||
- {id: 408, cat: Audio, desc: "HQ Audio"}
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Cookie
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: torrents.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
method: get
|
||||
inputs:
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
incldead: 1
|
||||
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
|
||||
search_mode: 0
|
||||
rows:
|
||||
selector: table.torrents > tbody > tr:has(table.torrentname)
|
||||
fields:
|
||||
release_year:
|
||||
selector: a[href^="/torrents.php?processing="]
|
||||
quality:
|
||||
selector: a[href^="/torrents.php?standard="]
|
||||
title:
|
||||
selector: a[title][href^="details.php?id="]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: append
|
||||
args: " {{ .Result.release_year }}"
|
||||
- name: append
|
||||
args: " {{ .Result.quality }}"
|
||||
category:
|
||||
selector: a[href^="?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(5)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
date:
|
||||
selector: td:nth-child(4) > span[title]
|
||||
attribute: title
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02-01-2006 15:04:05"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img.pro_free: "0"
|
||||
img.pro_free2up: "0"
|
||||
img.pro_50pctdown: "0.5"
|
||||
img.pro_50pctdown2up: "0.5"
|
||||
img.pro_30pctdown: "0.3"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
img.pro_50pctdown2up: "2"
|
||||
img.pro_free2up: "2"
|
||||
img.pro_2up: "2"
|
||||
"*": "1"
|
81
src/Jackett.Common/Definitions/rockbox.yml
Normal file
81
src/Jackett.Common/Definitions/rockbox.yml
Normal 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"
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: windows-1252
|
||||
links:
|
||||
- https://rodvd.net/
|
||||
legacylinks:
|
||||
- http://rodvd.net/
|
||||
|
||||
caps:
|
||||
|
111
src/Jackett.Common/Definitions/scenehd.yml
Normal file
111
src/Jackett.Common/Definitions/scenehd.yml
Normal file
@@ -0,0 +1,111 @@
|
||||
---
|
||||
site: scenehd
|
||||
name: SceneHD
|
||||
description: "SceneHD is Private site for HD TV / MOVIES"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://scenehd.org/
|
||||
certificates:
|
||||
- 81cc4e41b6f8ff656ca0e2396ee6d63383198bf1 # self signed
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 2, cat: Movies/UHD, desc: "Movie/2160"}
|
||||
- {id: 1, cat: Movies/HD, desc: "Movie/1080"}
|
||||
- {id: 4, cat: Movies/HD, desc: "Movie/720"}
|
||||
- {id: 8, cat: Movies/Bluray, desc: "Movie/BD5/9"}
|
||||
- {id: 6, cat: TV/UHD, desc: "TV/2160"}
|
||||
- {id: 5, cat: TV/HD, desc: "TV/1080"}
|
||||
- {id: 7, cat: TV/HD, desc: "TV/720"}
|
||||
- {id: 22, cat: Movies/Bluray, desc: "Bluray/Complete"}
|
||||
- {id: 10, cat: XXX, desc: "XXX"}
|
||||
- {id: 16, cat: Movies/Other, desc: "Subpacks"}
|
||||
- {id: 13, cat: Audio/Video, desc: "MVID"}
|
||||
- {id: 9, cat: Other, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
movie-search: [q, imdbid]
|
||||
tv-search: [q, season, ep, imdbid]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: form
|
||||
form: form#loginform
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: body:contains("Your username or password was incorrect.")
|
||||
test:
|
||||
path: browse.php
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}categories[{{.}}]=1&{{end}}"
|
||||
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
|
||||
imdb: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{end}}"
|
||||
rows:
|
||||
selector: table.browse > tbody > tr
|
||||
fields:
|
||||
download:
|
||||
selector: td.browse_dl > a
|
||||
attribute: href
|
||||
title:
|
||||
selector: td.browse_name > a[href^="details.php?id="]
|
||||
category:
|
||||
selector: td.browse_cat a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
imdb:
|
||||
selector: td.browse_imdb > a.catlink
|
||||
optional: true
|
||||
attribute: href
|
||||
details:
|
||||
selector: td.browse_name > a[href^="details.php?id="]
|
||||
attribute: href
|
||||
files:
|
||||
selector: a[href*="&filelist"]
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Files", ""]
|
||||
size:
|
||||
selector: td.browse_centernowrap:has(a[href*="&filelist"])
|
||||
remove: small
|
||||
date:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: append
|
||||
args: " +0200"
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05 -0700"
|
||||
grabs:
|
||||
selector: td:nth-child(9)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
seeders:
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["/", 0]
|
||||
leechers: # some torrents have extra partial seeders: 18 / 0 (3)
|
||||
selector: td:nth-child(10)
|
||||
filters:
|
||||
- name: split
|
||||
args: ["/", 1]
|
||||
- name: split
|
||||
args: [" ", 0]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
a.freetorrent: "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
103
src/Jackett.Common/Definitions/scenerush.yml
Normal file
103
src/Jackett.Common/Definitions/scenerush.yml
Normal 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"
|
@@ -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"
|
||||
|
79
src/Jackett.Common/Definitions/skytorrentsclone.yml
Normal file
79
src/Jackett.Common/Definitions/skytorrentsclone.yml
Normal file
@@ -0,0 +1,79 @@
|
||||
---
|
||||
site: skytorrentsclone
|
||||
name: SkyTorrentsClone
|
||||
description: "SkyTorrents.lol is a Public SkyTorrents clone for TV / MOVIES / GENERAL"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.skytorrents.to/
|
||||
legacylinks:
|
||||
- https://www.skytorrents.lol/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
# category=
|
||||
"album": Audio
|
||||
"ebook": Books
|
||||
"movie": Movies
|
||||
"show": TV
|
||||
# type=
|
||||
"audio": Audio
|
||||
"doc": Books
|
||||
"games": PC/Games
|
||||
"software": PC
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
# https://www.skytorrents.lol/?query=mr+mercedes+s02e05&sort=created
|
||||
# https://www.skytorrents.lol/top100
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created{{else}}top100{{end}}"
|
||||
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=2{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=3{{else}}{{end}}"
|
||||
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=4{{else}}{{end}}"
|
||||
rows:
|
||||
selector: tr.result
|
||||
fields:
|
||||
title:
|
||||
selector: td a
|
||||
category:
|
||||
# try category=
|
||||
optional: true
|
||||
selector: a.label[href*="category="]
|
||||
category:
|
||||
# try type=
|
||||
optional: true
|
||||
selector: a.label[href*="type="]
|
||||
details:
|
||||
selector: td a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="//itorrents"]
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(2)
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
date:
|
||||
# 20 Minutes ago
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: timeago
|
||||
seeders:
|
||||
selector: td:nth-child(5)
|
||||
leechers:
|
||||
selector: td:nth-child(6)
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -302,13 +302,24 @@
|
||||
- name: dateparse
|
||||
args: "02/01/2006 15:04:05"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
# seems size might be floating as the 4th or 5th td so lets try matching the size-unit
|
||||
optional: true
|
||||
selector: td.ttable_col2:contains(" GB")
|
||||
size:
|
||||
optional: true
|
||||
selector: td.ttable_col2:contains(" MB")
|
||||
size:
|
||||
optional: true
|
||||
selector: td.ttable_col2:contains(" kB")
|
||||
size:
|
||||
optional: true
|
||||
selector: td.ttable_col2:contains(" B")
|
||||
grabs:
|
||||
selector: font[color^=orange]
|
||||
selector: td.ttable_col1 > font[color^=orange]
|
||||
seeders:
|
||||
selector: font[color^=green]
|
||||
selector: td.ttable_col1 > b > font[color^=green]
|
||||
leechers:
|
||||
selector: td.ttable_col1 > font[color^=red]
|
||||
selector: td.ttable_col2 > font[color^=red]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
img[src="images/free.gif"]: "0"
|
||||
|
@@ -45,7 +45,7 @@
|
||||
- {id: 399, cat: PC, desc: "Other OS", default: true}
|
||||
|
||||
#Games
|
||||
- {id: 401, cat: Console, desc: "Games", default: true}
|
||||
- {id: 400, cat: Console, desc: "Games", default: true}
|
||||
- {id: 401, cat: PC/Games, desc: "PC", default: true}
|
||||
- {id: 402, cat: PC/Mac, desc: "Mac", default: true}
|
||||
- {id: 403, cat: Console/PS4, desc: "PSx", default: true}
|
||||
@@ -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:
|
||||
|
@@ -47,9 +47,10 @@
|
||||
filters:
|
||||
- name: split
|
||||
args: ["=", "-1"]
|
||||
# normalize to SXXEYY format
|
||||
- name: re_replace
|
||||
args: ["\\b([s])?(\\d{1,3})[x\\s](\\d{1,3})", "S$2E$3"]
|
||||
- name: re_replace # normalize to SXXEYY format
|
||||
args: ["(?i)\\b([s])?(\\d{1,3})[x\\s](\\d{1,3})", "S$2E$3"]
|
||||
- name: re_replace # replace web-dlmux with webdl, sonarr don't like it
|
||||
args: ["(?i)web-?\\s?dlmux", "WEB-DL"]
|
||||
details:
|
||||
selector: td:nth-child(7) a
|
||||
attribute: href
|
||||
|
@@ -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
|
||||
|
@@ -5,8 +5,9 @@
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://ww2.torrent9.blue/
|
||||
- https://ww1.torrent9.ph/
|
||||
legacylinks:
|
||||
- http://www.torrent9.ec/
|
||||
- http://www.torrent9.red/
|
||||
@@ -16,6 +17,9 @@
|
||||
- http://www.torrent9.pe/
|
||||
- http://www.torrent9.blue/
|
||||
- https://www.torrent9.blue/
|
||||
- https://ww2.torrent9.blue/
|
||||
- https://www.torrent9.rip/
|
||||
- https://www.torrent9.ph/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
131
src/Jackett.Common/Definitions/torrent9clone.yml
Normal file
131
src/Jackett.Common/Definitions/torrent9clone.yml
Normal file
@@ -0,0 +1,131 @@
|
||||
---
|
||||
site: torrent9clone
|
||||
name: Torrent9 clone (torrents9.pw)
|
||||
description: "Torrent9 is a FRENCH Public site for TV / MOVIES / GENERAL"
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.torrents9.pw/
|
||||
legacylinks:
|
||||
- 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"
|
@@ -6,9 +6,9 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://et8.org/
|
||||
legacylinks:
|
||||
- https://et8.org/
|
||||
legacylinks:
|
||||
- http://et8.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
60
src/Jackett.Common/Definitions/torrentcouch.yml
Normal file
60
src/Jackett.Common/Definitions/torrentcouch.yml
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
site: torrentcouch
|
||||
name: TorrentCouch
|
||||
description: "TorrentCounch is a Public TV tracker"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentcouch.net/
|
||||
legacylinks:
|
||||
- https://torrentcouch.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: TV, desc: "TV"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings: []
|
||||
|
||||
download:
|
||||
selector: tr td a[href*="/files/download/"]
|
||||
|
||||
search:
|
||||
# https://torrentcouch.com/?s=expanse
|
||||
# https://torrentcouch.net/page/3/?s=expanse
|
||||
paths:
|
||||
- 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:
|
||||
title:
|
||||
selector: h2 a
|
||||
category:
|
||||
text: "1"
|
||||
details:
|
||||
selector: h2 a
|
||||
attribute: href
|
||||
description:
|
||||
selector: p
|
||||
download:
|
||||
selector: h2 a
|
||||
attribute: href
|
||||
size:
|
||||
text: "500 MB"
|
||||
seeders:
|
||||
text: "1"
|
||||
leechers:
|
||||
text: "1"
|
||||
date:
|
||||
text: now
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
108
src/Jackett.Common/Definitions/torrentgalaxyorg.yml
Normal file
108
src/Jackett.Common/Definitions/torrentgalaxyorg.yml
Normal file
@@ -0,0 +1,108 @@
|
||||
---
|
||||
site: torrentgalaxyorg
|
||||
name: TorrentGalaxy.org
|
||||
description: "TorrentGalaxy.org (TGx) is a Public site for TV / MOVIES / GENERAL"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentgalaxy.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 28, cat: TV/Anime, desc: "Anime - All"}
|
||||
- {id: 20, cat: PC/Phone-Other, desc: "Apps - Mobile"}
|
||||
- {id: 19, cat: PC/Mac, desc: "Apps - OS"}
|
||||
- {id: 21, cat: PC, desc: "Apps - Other"}
|
||||
- {id: 18, cat: PC/0day, desc: "Apps - Windows"}
|
||||
- {id: 13, cat: Audio/Audiobook, desc: "Books - Audiobooks"}
|
||||
- {id: 12, cat: Books/Ebook, desc: "Books - Ebooks"}
|
||||
- {id: 14, cat: Books/Technical, desc: "Books - Education"}
|
||||
- {id: 15, cat: Books/Magazines, desc: "Books - Magazine"}
|
||||
- {id: 9, cat: TV/Documentary, desc: "Documentaries - All"}
|
||||
- {id: 11, cat: Console, desc: "Games - Console"}
|
||||
- {id: 43, cat: PC/Phone-Other, desc: "Games - Mobile"}
|
||||
- {id: 17, cat: Console/Other, desc: "Games - Other"}
|
||||
- {id: 10, cat: PC/Games , desc: "Games - Windows"}
|
||||
- {id: 3, cat: Movies/UHD, desc: "Movies - 2K/4K UHD"}
|
||||
- {id: 46, cat: Movies/Foreign, desc: "Movies - Bollywood"}
|
||||
- {id: 45, cat: Movies/Other, desc: "Movies - CAM/TS"}
|
||||
- {id: 42, cat: Movies/HD, desc: "Movies - HD"}
|
||||
- {id: 4, cat: Movies, desc: "Movies - Packs"}
|
||||
- {id: 1, cat: Movies/SD, desc: "Movies - SD"}
|
||||
- {id: 22, cat: Audio, desc: "Music - Albums"}
|
||||
- {id: 26, cat: Audio, desc: "Music - Discography"}
|
||||
- {id: 23, cat: Audio/Lossless, desc: "Music - Lossless"}
|
||||
- {id: 25, cat: Audio/Video, desc: "Music - Musicvideo"}
|
||||
- {id: 24, cat: Audio, desc: "Music - Singles"}
|
||||
- {id: 40, cat: Audio/Other, desc: "Other - Other"}
|
||||
- {id: 37, cat: Other, desc: "Other - Pictures"}
|
||||
- {id: 33, cat: Other, desc: "Other - Training"}
|
||||
- {id: 41, cat: TV/HD, desc: "TV - Episodes HD"}
|
||||
- {id: 5, cat: TV/SD, desc: "TV - Episodes SD"}
|
||||
- {id: 6, cat: TV/OTHER, desc: "TV - Packs"}
|
||||
- {id: 7, cat: TV/Sport, desc: "TV - Sports"}
|
||||
- {id: 35, cat: XXX, desc: "XXX - HD"}
|
||||
- {id: 47, cat: XXX, desc: "XXX - Misc"}
|
||||
- {id: 34, cat: XXX, desc: "XXX - SD"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
# https://torrentgalaxy.org/torrents.php?c41=1&search=mercedes+s02e04&lang=0&sort=id&order=desc
|
||||
path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{.Keywords}}"
|
||||
lang: "0"
|
||||
sort: "id"
|
||||
order: "desc"
|
||||
rows:
|
||||
selector: div[class="tgxtablerow clickable-row click"]
|
||||
fields:
|
||||
title:
|
||||
selector: div.tgxtablecell:nth-child(3) div a
|
||||
attribute: title
|
||||
category:
|
||||
selector: div.tgxtablecell a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
details:
|
||||
selector: div.tgxtablecell:nth-child(3) div a
|
||||
attribute: href
|
||||
download:
|
||||
selector: div.tgxtablecell:nth-child(4) a
|
||||
attribute: href
|
||||
magnet:
|
||||
selector: div.tgxtablecell:nth-child(4) a:nth-child(2)
|
||||
attribute: href
|
||||
size:
|
||||
selector: div.tgxtablecell:nth-child(7) span
|
||||
seeders:
|
||||
selector: div.tgxtablecell:nth-child(10) span font b
|
||||
leechers:
|
||||
selector: div.tgxtablecell:nth-child(10) span font:nth-child(2) b
|
||||
date:
|
||||
# 20Mins ago
|
||||
optional: true
|
||||
selector: div.tgxtablecell:nth-child(11) small:contains("ago")
|
||||
filters:
|
||||
- name: timeago
|
||||
date:
|
||||
# 24/12/18 13:55
|
||||
optional: true
|
||||
selector: div.tgxtablecell:nth-child(11) small:contains(":")
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "02/01/06 15:04"
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -53,7 +53,7 @@
|
||||
q: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
|
||||
incldead: 1
|
||||
rows:
|
||||
selector: table#torrentTable > tbody > tr:has(td.torrentNameInfo)
|
||||
selector: table#torrentsTable > tbody > tr:has(td.torrentNameInfo)
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="/download.php/"]
|
||||
@@ -72,6 +72,8 @@
|
||||
date:
|
||||
selector: td.torrentNameInfo > div
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: [" by.*", ""]
|
||||
- name: split
|
||||
args: ["|", -1]
|
||||
seeders:
|
||||
|
@@ -1,66 +0,0 @@
|
||||
---
|
||||
site: torrentkim
|
||||
name: TorrentKim
|
||||
description: "TorrentKim is a free Korean tracker of pretty much anything Korean."
|
||||
language: ko-KR
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentkim.pro/
|
||||
legacylinks:
|
||||
- https://torrentkim12.com/
|
||||
- https://torrentkim10.net/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: "torrent_variety", cat: TV, desc: "TV - Variety shows"}
|
||||
- {id: "torrent_tv", cat: TV, desc: "TV - Dramas"}
|
||||
- {id: "torrent_mid", cat: TV/FOREIGN, desc: "TV - American Series"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}/bbs/s-1-{{ .Keywords }}{{else}}/bbs/s-1-미운우리새끼{{end}}"
|
||||
rows:
|
||||
selector: "table.board_list > tbody > tr.bg1:nth-child(n+3)"
|
||||
fields:
|
||||
magnet:
|
||||
selector: td:nth-child(1) a[href^="javascript:"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["javascript:Mag_dn('", ""]
|
||||
- name: replace
|
||||
args: ["')", ""]
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
seeders:
|
||||
selector: "td:nth-child(2) font:nth-child(2)"
|
||||
leechers:
|
||||
selector: "td:nth-child(2) font:nth-child(1)"
|
||||
category:
|
||||
selector: td:nth-child(3) a[href^="/bbs/bc.php?bo_table="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: bo_table
|
||||
title:
|
||||
selector: td:nth-child(3) a:last-of-type
|
||||
details:
|
||||
selector: td:nth-child(3) a:last-of-type
|
||||
attribute: href
|
||||
date:
|
||||
selector: td:nth-child(3) a:last-of-type
|
||||
filters:
|
||||
- name: split
|
||||
args: ['.', 2]
|
||||
- name: dateparse
|
||||
args: "060102"
|
||||
size:
|
||||
selector: td:nth-child(5)
|
@@ -69,12 +69,11 @@
|
||||
paths:
|
||||
- path: "{{if .Config.filter-verified }}verified{{else}}searchA{{end}}"
|
||||
inputs:
|
||||
f: "{{ .Query.Keywords }}"
|
||||
f: "{{if .Keywords }}title: {{else}}{{end}}{{ .Keywords }}"
|
||||
safe: "{{if .Config.filter-safe }}1{{else}}0{{end}}"
|
||||
rows:
|
||||
selector: "html body #wrap .results dl:has(a)"
|
||||
filters:
|
||||
- name: andmatch
|
||||
# andmatch filter removed, see #3737
|
||||
fields:
|
||||
title:
|
||||
selector: dt a
|
||||
@@ -114,10 +113,9 @@
|
||||
selector: dt
|
||||
remove: a
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[^a-zA-Z\\s]+", ""]
|
||||
- name: trim
|
||||
args: "»"
|
||||
- name: trim
|
||||
args: " "
|
||||
date:
|
||||
selector: dd span:nth-child(2)
|
||||
attribute: title
|
||||
|
@@ -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:
|
||||
|
@@ -62,6 +62,9 @@
|
||||
search:
|
||||
paths:
|
||||
- path: torrents.php
|
||||
keywordsfilters:
|
||||
- name: re_replace
|
||||
args: ["S(\\d{2})E(\\d{2})", "$1 $2"]
|
||||
inputs:
|
||||
search: "{{ .Keywords }}"
|
||||
category: "0"
|
||||
|
@@ -67,6 +67,8 @@
|
||||
selector: div.group_info
|
||||
remove: span, div.tags
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["\t\t\t\t", " "]
|
||||
- name: replace
|
||||
args: [" / Free", ""]
|
||||
- name: replace
|
||||
|
@@ -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
|
||||
|
185
src/Jackett.Common/Definitions/wihd.yml
Normal file
185
src/Jackett.Common/Definitions/wihd.yml
Normal 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"
|
@@ -7,10 +7,11 @@
|
||||
encoding: UTF-8
|
||||
|
||||
links:
|
||||
- https://worldwidetorrents.me/
|
||||
- https://worldwidetorrents.to/
|
||||
|
||||
legacylinks:
|
||||
- https://worldwidetorrents.eu/
|
||||
- https://worldwidetorrents.me/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -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]
|
||||
|
@@ -5,20 +5,31 @@
|
||||
language: fr-fr
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://ww4.yggtorrent.is/
|
||||
- https://www2.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/
|
||||
- https://ww3.yggtorrent.gg/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 2145, cat: TV, desc: "Film/Vidéo"}
|
||||
- {id: 2178, cat: TV/Anime, desc: "Film/Vidéo : Animation"}
|
||||
- {id: 2178, cat: Movies, desc: "Film/Vidéo : Animation"} # changed to movies, see #3553
|
||||
- {id: 2179, cat: TV/Anime, desc: "Film/Vidéo : Animation Série"}
|
||||
- {id: 2180, cat: TV, desc: "Film/Vidéo : Concert"}
|
||||
- {id: 2181, cat: TV, desc: "Film/Vidéo : Documentaire"}
|
||||
@@ -112,10 +123,17 @@
|
||||
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: /
|
||||
form: form[action$="/user/login"]
|
||||
form: "#user-login"
|
||||
inputs:
|
||||
id: "{{ .Config.username }}"
|
||||
pass: "{{ .Config.password }}"
|
||||
@@ -128,8 +146,8 @@
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search"
|
||||
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search&page=50"
|
||||
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date"
|
||||
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date&page=50"
|
||||
|
||||
rows:
|
||||
selector: "table.table > tbody > tr"
|
||||
@@ -162,8 +180,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
|
||||
|
@@ -22,7 +22,7 @@
|
||||
path: /login
|
||||
method: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
username_email: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
remember: "on"
|
||||
error:
|
||||
@@ -54,13 +54,13 @@
|
||||
- name: split
|
||||
args: ["|", 0]
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
selector: td:nth-child(4)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
selector: td:nth-child(5)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
selector: td:nth-child(6)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
selector: td:nth-child(7)
|
||||
date:
|
||||
selector: td:nth-child(3)
|
||||
filters:
|
||||
|
@@ -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]
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
@@ -63,7 +63,7 @@ namespace Jackett.Common.Indexers.Abstract
|
||||
|
||||
if (!string.IsNullOrEmpty(query.ImdbID))
|
||||
{
|
||||
queryCollection.Add("imdbid", "browse");
|
||||
queryCollection.Add("imdbid", query.ImdbID);
|
||||
}
|
||||
if (searchString != null)
|
||||
{
|
||||
|
@@ -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,
|
@@ -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;
|
||||
|
@@ -10,7 +10,6 @@ using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static Jackett.Common.Models.IndexerConfig.ConfigurationData;
|
||||
@@ -177,10 +176,9 @@ namespace Jackett.Common.Indexers
|
||||
//TODO: Remove this section once users have moved off DPAPI
|
||||
private bool MigratedFromDPAPI(JToken jsonConfig)
|
||||
{
|
||||
bool runningOnDotNetCore = RuntimeInformation.FrameworkDescription.IndexOf("core", StringComparison.OrdinalIgnoreCase) >= 0;
|
||||
bool isWindows = Environment.OSVersion.Platform == PlatformID.Win32NT;
|
||||
|
||||
if (!isWindows && runningOnDotNetCore)
|
||||
if (!isWindows && DotNetCoreUtil.IsRunningOnDotNetCore)
|
||||
{
|
||||
// User isn't running Windows, but is running on .NET Core framework, no access to the DPAPI, so don't bother trying to migrate
|
||||
return false;
|
||||
@@ -575,6 +573,11 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
throw new Exception("Request to " + response.Request.Url + " failed (Error " + response.Status + ") - The tracker seems to be down.");
|
||||
}
|
||||
|
||||
if (response.Status == System.Net.HttpStatusCode.Forbidden && response.Content.Contains("<span data-translate=\"complete_sec_check\">Please complete the security check to access</span>"))
|
||||
{
|
||||
throw new Exception("Request to " + response.Request.Url + " failed (Error " + response.Status + ") - The page is protected by an Cloudflare reCaptcha. The page is in aggressive DDoS mitigation mode or your IP might be blacklisted (e.g. in case of shared VPN IPs). There's no easy way of making it usable with Jackett.");
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task FollowIfRedirect(WebClientStringResult response, string referrer = null, string overrideRedirectUrl = null, string overrideCookies = null, bool accumulateCookies = false)
|
||||
|
@@ -164,7 +164,7 @@ namespace Jackett.Common.Indexers
|
||||
var grabs = qRow.Find("td:nth-child(9) > a").Get(0).FirstChild.ToString();
|
||||
release.Grabs = ParseUtil.CoerceInt(grabs);
|
||||
|
||||
release.DownloadVolumeFactor = 0; // ratioless
|
||||
release.DownloadVolumeFactor = 1;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
||||
{
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
304
src/Jackett.Common/Indexers/HorribleSubs.cs
Normal file
304
src/Jackett.Common/Indexers/HorribleSubs.cs
Normal file
@@ -0,0 +1,304 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
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;
|
||||
using System.Text.RegularExpressions;
|
||||
using AngleSharp.Parser.Html;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
class HorribleSubs : BaseWebIndexer
|
||||
{
|
||||
private string ApiEndpoint { get { return SiteLink + "api.php"; } }
|
||||
|
||||
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
|
||||
"http://horriblesubs.info/"
|
||||
};
|
||||
|
||||
public HorribleSubs(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "Horrible Subs",
|
||||
description: "HorribleSubs - So bad yet so good",
|
||||
link: "https://horriblesubs.info/",
|
||||
caps: new TorznabCapabilities(TorznabCatType.TVAnime),
|
||||
configService: configService,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationData())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "public";
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
configData.LoadValuesFromJson(configJson);
|
||||
var releases = await PerformQuery(new TorznabQuery());
|
||||
|
||||
await ConfigureIfOK(string.Empty, releases.Count() > 0, () =>
|
||||
{
|
||||
throw new Exception("Could not find releases from this URL");
|
||||
});
|
||||
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
return await PerformQuery(query, 0);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> PerformLatestQuery(TorznabQuery query, int attempts)
|
||||
{
|
||||
var ResultParser = new HtmlParser();
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.GetQueryString();
|
||||
var queryCollection = new NameValueCollection();
|
||||
|
||||
queryCollection.Add("method", "getlatest");
|
||||
|
||||
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
|
||||
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
|
||||
|
||||
try
|
||||
{
|
||||
if (response.Content.Contains("Nothing was found"))
|
||||
{
|
||||
return releases.ToArray();
|
||||
}
|
||||
|
||||
var dom = ResultParser.Parse(response.Content);
|
||||
var latestresults = dom.QuerySelectorAll("ul > li > a");
|
||||
foreach (var row in latestresults)
|
||||
{
|
||||
var href = SiteLink + row.Attributes["href"].Value.Substring(1);
|
||||
var showrels = await GetRelease(href);
|
||||
releases.AddRange(showrels);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> GetRelease(string ResultURL)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var ResultParser = new HtmlParser();
|
||||
try
|
||||
{
|
||||
var episodeno = ResultURL.Substring(ResultURL.LastIndexOf("#") + 1); // = 71
|
||||
ResultURL = ResultURL.Replace("#" + episodeno, ""); // = https://horriblesubs.info/shows/boruto-naruto-next-generations
|
||||
|
||||
var showPageResponse = await RequestStringWithCookiesAndRetry(ResultURL, string.Empty);
|
||||
await FollowIfRedirect(showPageResponse);
|
||||
|
||||
Match match = Regex.Match(showPageResponse.Content, "(var hs_showid = )([0-9]*)(;)", RegexOptions.IgnoreCase);
|
||||
if (match.Success == false)
|
||||
{
|
||||
return releases;
|
||||
}
|
||||
|
||||
int ShowID = int.Parse(match.Groups[2].Value);
|
||||
|
||||
string showAPIURL = ApiEndpoint + "?method=getshows&type=show&showid=" + ShowID; //https://horriblesubs.info/api.php?method=getshows&type=show&showid=869
|
||||
var showAPIResponse = await RequestStringWithCookiesAndRetry(showAPIURL, string.Empty);
|
||||
|
||||
|
||||
var showAPIdom = ResultParser.Parse(showAPIResponse.Content);
|
||||
var releaserows = showAPIdom.QuerySelectorAll("div.rls-info-container");
|
||||
|
||||
foreach (var releaserow in releaserows)
|
||||
{
|
||||
string dateStr = releaserow.QuerySelector(".rls-date").TextContent.Trim();
|
||||
string title = releaserow.FirstChild.TextContent;
|
||||
title = title.Replace("SD720p1080p", "");
|
||||
title = title.Replace(dateStr, "");
|
||||
|
||||
if (title.Contains(episodeno) == false)
|
||||
{
|
||||
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")
|
||||
{
|
||||
releasedate = DateTime.Today;
|
||||
}
|
||||
else if (dateStr == "Yesterday")
|
||||
{
|
||||
releasedate = DateTime.Today.AddDays(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
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
|
||||
{
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
var p720 = releaserow.QuerySelector(".link-720p");
|
||||
|
||||
if (p720 != null)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
var p1080 = releaserow.QuerySelector(".link-1080p");
|
||||
|
||||
if (p1080 != null)
|
||||
{
|
||||
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);
|
||||
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)
|
||||
{
|
||||
OnParseError("", ex);
|
||||
}
|
||||
return releases;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, int attempts)
|
||||
{
|
||||
var ResultParser = new HtmlParser();
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.GetQueryString();
|
||||
var queryCollection = new NameValueCollection();
|
||||
|
||||
|
||||
if (string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
return await PerformLatestQuery(query, attempts);
|
||||
}
|
||||
else
|
||||
{
|
||||
queryCollection.Add("method", "search");
|
||||
|
||||
searchString = searchString.Replace("'", ""); // ignore ' (e.g. search for america's Next Top Model)
|
||||
queryCollection.Add("value", searchString);
|
||||
}
|
||||
|
||||
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
|
||||
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
|
||||
|
||||
try
|
||||
{
|
||||
if (response.Content.Contains("Nothing was found"))
|
||||
{
|
||||
return releases.ToArray();
|
||||
}
|
||||
var dom = ResultParser.Parse(response.Content);
|
||||
var showlinks = dom.QuerySelectorAll("ul > li > a");
|
||||
foreach (var showlink in showlinks)
|
||||
{
|
||||
var href = SiteLink + showlink.Attributes["href"].Value.Substring(1); // = https://horriblesubs.info/shows/boruto-naruto-next-generations#71
|
||||
|
||||
var showrels = await GetRelease(href);
|
||||
releases.AddRange(showrels);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(response.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -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.ImdbID) && 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;
|
||||
|
@@ -42,30 +42,41 @@ namespace Jackett.Common.Indexers
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(32, TorznabCatType.TVAnime);
|
||||
AddCategoryMapping(31, TorznabCatType.TVOTHER);
|
||||
AddCategoryMapping(47, TorznabCatType.TVSD);
|
||||
AddCategoryMapping(8, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(48, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(9, TorznabCatType.TVSD);
|
||||
AddCategoryMapping(4, TorznabCatType.TVHD);
|
||||
AddCategoryMapping(6, TorznabCatType.TVSD);
|
||||
|
||||
AddCategoryMapping(22, TorznabCatType.Books);
|
||||
AddCategoryMapping(41, TorznabCatType.BooksComics);
|
||||
AddCategoryMapping(23, TorznabCatType.PC);
|
||||
|
||||
AddCategoryMapping(16, TorznabCatType.MoviesHD);
|
||||
AddCategoryMapping(17, TorznabCatType.MoviesSD);
|
||||
AddCategoryMapping(14, TorznabCatType.MoviesSD);
|
||||
AddCategoryMapping(34, TorznabCatType.MoviesForeign);
|
||||
AddCategoryMapping(18, TorznabCatType.MoviesForeign);
|
||||
AddCategoryMapping(33, TorznabCatType.MoviesForeign);
|
||||
|
||||
AddCategoryMapping(34, TorznabCatType.Audio);
|
||||
AddCategoryMapping(37, TorznabCatType.AudioLossless);
|
||||
AddCategoryMapping(35, TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping(36, TorznabCatType.AudioMP3);
|
||||
AddCategoryMapping(3, TorznabCatType.Other, "Nuked");
|
||||
AddCategoryMapping(32, TorznabCatType.TVAnime, "Anime");
|
||||
AddCategoryMapping(23, TorznabCatType.PC, "Apps");
|
||||
AddCategoryMapping(35, TorznabCatType.AudioAudiobook, "Audiobooks");
|
||||
AddCategoryMapping(31, TorznabCatType.TV, "Childrens/Cartoons");
|
||||
AddCategoryMapping(54, TorznabCatType.TVDocumentary, "Documentary - HD");
|
||||
AddCategoryMapping(41, TorznabCatType.BooksComics, "Comics");
|
||||
AddCategoryMapping(25, TorznabCatType.PCGames, "Games");
|
||||
AddCategoryMapping(29, TorznabCatType.ConsoleXbox, "Games Xbox");
|
||||
AddCategoryMapping(27, TorznabCatType.PCGames, "Games-PC Rips");
|
||||
AddCategoryMapping(28, TorznabCatType.ConsolePS4, "Games-PSx");
|
||||
AddCategoryMapping(49, TorznabCatType.PCPhoneOther, "Mobile");
|
||||
AddCategoryMapping(59, TorznabCatType.MoviesUHD, "Movies-4k");
|
||||
AddCategoryMapping(60, TorznabCatType.MoviesForeign, "Non-English 4k Movies");
|
||||
AddCategoryMapping(16, TorznabCatType.MoviesHD, "Movies HD");
|
||||
AddCategoryMapping(18, TorznabCatType.MoviesForeign, "Movies HD Non-English");
|
||||
AddCategoryMapping(17, TorznabCatType.MoviesSD, "TS/CAM/PPV");
|
||||
AddCategoryMapping(34, TorznabCatType.MoviesForeign, "Movies Low Def Non-English");
|
||||
AddCategoryMapping(14, TorznabCatType.MoviesSD, "Movies-SD");
|
||||
AddCategoryMapping(33, TorznabCatType.MoviesForeign, "Movies SD Non-English");
|
||||
AddCategoryMapping(30, TorznabCatType.AudioOther, "Music");
|
||||
AddCategoryMapping(37, TorznabCatType.AudioLossless, "FLAC");
|
||||
AddCategoryMapping(36, TorznabCatType.AudioMP3, "MP3");
|
||||
AddCategoryMapping(39, TorznabCatType.AudioOther, "Music Other");
|
||||
AddCategoryMapping(38, TorznabCatType.AudioVideo, "Music Video");
|
||||
AddCategoryMapping(45, TorznabCatType.Other, "Other");
|
||||
AddCategoryMapping(7, TorznabCatType.TVSport, "Sports Tv");
|
||||
AddCategoryMapping(44, TorznabCatType.TVSport, "Sports Fitness-Instructional");
|
||||
AddCategoryMapping(58, TorznabCatType.TVSport, "Olympics");
|
||||
AddCategoryMapping(47, TorznabCatType.TVSD, "TV - 480p");
|
||||
AddCategoryMapping(8, TorznabCatType.TVHD, "TV - High Definition");
|
||||
AddCategoryMapping(48, TorznabCatType.TVSD, "TV - Standard Definition - x264");
|
||||
AddCategoryMapping(9, TorznabCatType.TVSD, "TV - Standard Definition - XviD");
|
||||
AddCategoryMapping(4, TorznabCatType.TVHD, "TV Season Packs - HD");
|
||||
AddCategoryMapping(6, TorznabCatType.TVSD, "TV Season Packs - SD");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
@@ -113,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();
|
||||
|
@@ -69,6 +69,8 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, int attempts)
|
||||
{
|
||||
query = query.Clone();
|
||||
|
||||
var originalSearchTerm = query.SearchTerm;
|
||||
if (query.SearchTerm == null)
|
||||
{
|
||||
|
@@ -45,7 +45,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
public async Task<IEnumerable<TorznabQuery>> FallbackQueries()
|
||||
{
|
||||
if (titles == null)
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
return titles.Select(t => query.CreateFallback(t));
|
||||
}
|
||||
|
||||
|
@@ -49,7 +49,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
|
||||
var remainingResults = results.Except(wrongResults).Except(perfectResults);
|
||||
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
var strippedTitles = titles.Select(t => RemoveSpecialChars(t));
|
||||
var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t));
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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,120 +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", "/" }
|
||||
};
|
||||
|
||||
var preRequest = await RequestStringWithCookiesAndRetry(LoginUrl, string.Empty);
|
||||
|
||||
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)
|
||||
@@ -160,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
|
||||
@@ -180,65 +206,79 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
|
||||
var response = await RequestStringWithCookiesAndRetry(urlSearch);
|
||||
if (response.Status == System.Net.HttpStatusCode.Forbidden || CookieHeader.Contains("pass=deleted"))
|
||||
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);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user