mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-15 08:24:14 +02:00
Compare commits
194 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 |
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):
|
||||
|
97
README.md
97
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.
|
||||
|
||||
@@ -28,11 +28,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* BTstor.net
|
||||
* btbit
|
||||
* BTDB
|
||||
* BT-Scene
|
||||
* cpasbien
|
||||
* ETTV
|
||||
* EliteTorrent.biz
|
||||
* ExtraTorrent.ag
|
||||
* ExtraTorrentClone
|
||||
* EZTV
|
||||
* Frozen Layer
|
||||
* GkTorrent
|
||||
@@ -51,6 +50,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Nyaa.si
|
||||
* Nyaa-Pantsu
|
||||
* Nyoo
|
||||
* ProStyleX
|
||||
* RARBG
|
||||
* RuTor
|
||||
* ShowRSS
|
||||
@@ -65,6 +65,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Torrent Downloads
|
||||
* TorrentGalaxy.org
|
||||
* Torrent9
|
||||
* Torernt9 clone (torrents9.ch)
|
||||
* Torrentz2
|
||||
* World Wide Torrents
|
||||
* YTS.ag
|
||||
@@ -72,6 +73,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
|
||||
### Supported Semi-Private Trackers
|
||||
* 7tor
|
||||
* ArenaBG
|
||||
* CzTorrent
|
||||
* Deildu
|
||||
* Gay-Torrents.net
|
||||
@@ -85,6 +87,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Newstudio
|
||||
* NetHD
|
||||
* NoName Club
|
||||
* RockBox
|
||||
* RuTracker
|
||||
* SkTorrent
|
||||
* Union Fansub
|
||||
@@ -98,23 +101,23 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* 720pier
|
||||
* Abnormal
|
||||
* Acid-Lounge
|
||||
* AlphaRatio
|
||||
* AlphaRatio (AR)
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AnimeTorrents (AnT)
|
||||
* Anthelion (was TehConnection.me)
|
||||
* AOX
|
||||
* Apollo (XANAX)
|
||||
* ArabaFenice
|
||||
* Arche Torrent
|
||||
* AsianDVDClub
|
||||
* AST4u
|
||||
* Audiobook Torrents
|
||||
* Awesome-HD
|
||||
* Avistaz
|
||||
* Awesome-HD (AHD)
|
||||
* Avistaz (AsiaTorrents)
|
||||
* B2S-Share
|
||||
* Back-ups
|
||||
* BakaBT [![(invite needed)][inviteneeded]](#)
|
||||
* bB
|
||||
* BeyondHD
|
||||
* BeyondHD (BHD)
|
||||
* BIGTorrent
|
||||
* BigTower
|
||||
* Bit-City Reloaded
|
||||
@@ -128,65 +131,65 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* BitTorrentFiles [![(invite needed)][inviteneeded]](#)
|
||||
* BJ-Share
|
||||
* BlueBird
|
||||
* Blutopia
|
||||
* Blutopia (BLU)
|
||||
* Brasil Tracker
|
||||
* BroadcastTheNet
|
||||
* BroadcastTheNet (BTN)
|
||||
* BrokenStones
|
||||
* BTGigs
|
||||
* BTNext
|
||||
* BTXpress
|
||||
* BTNext (BTNT)
|
||||
* BTXpress (BTX)
|
||||
* Carpathians
|
||||
* CCFBits
|
||||
* CGPeers
|
||||
* CHDBits
|
||||
* Cinematik
|
||||
* Cinemageddon
|
||||
* CinemaZ
|
||||
* CinemaZ (EuTorrents)
|
||||
* Classix
|
||||
* DanishBits
|
||||
* DataScene
|
||||
* Demonoid
|
||||
* Diablo Torrent
|
||||
* DigitalHive
|
||||
* Downloadville
|
||||
* Dragonworld Reloaded
|
||||
* Dream Team
|
||||
* DXDHD
|
||||
* EliteHD [![(invite needed)][inviteneeded]](#)
|
||||
* Elit Tracker
|
||||
* Elite-Tracker
|
||||
* Empornium
|
||||
* Empornium (EMP)
|
||||
* eStone
|
||||
* Ethor.net (Thor's Land)
|
||||
* FANO.IN
|
||||
* FileList
|
||||
* FileList (FL)
|
||||
* Femdomcult
|
||||
* Freedom-HD
|
||||
* FullMixMusic
|
||||
* FunFile
|
||||
* FunkyTorrents
|
||||
* FunkyTorrents (FT)
|
||||
* Fuzer
|
||||
* GAYtorrent.ru
|
||||
* GazelleGames
|
||||
* GazelleGames (GGn)
|
||||
* Gfxnews
|
||||
* GFXPeers
|
||||
* GigaTorrents
|
||||
* GimmePeers <!-- maintained by jamesb2147 -->
|
||||
* Girotottent
|
||||
* GODS [![(invite needed)][inviteneeded]](#)
|
||||
* GODS
|
||||
* Greek Team
|
||||
* HacheDe
|
||||
* Hardbay
|
||||
* HD4Free (HD4)
|
||||
* HD-Forever
|
||||
* HD-Only
|
||||
* HD-Space
|
||||
* HD-Forever (HDF)
|
||||
* HD-Only (HDO)
|
||||
* HD-Space (HDS)
|
||||
* HD-Spain
|
||||
* HD-Torrents
|
||||
* HD-Torrents (HDT)
|
||||
* HD-Bits.com
|
||||
* HDBits
|
||||
* HDChina
|
||||
* HDCity
|
||||
* HDHome
|
||||
* HDHome (HDBigger)
|
||||
* HDME
|
||||
* HDSky
|
||||
* HDTorrents.it
|
||||
@@ -199,36 +202,37 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Immortalseed
|
||||
* inPeril
|
||||
* Insane Tracker
|
||||
* IPTorrents
|
||||
* IPTorrents (IPT)
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* LinkoManija
|
||||
* LosslessClub
|
||||
* M-Team - TP
|
||||
* Magico
|
||||
* M-Team (TP)
|
||||
* Magico (Trellas)
|
||||
* Majomparádé
|
||||
* Manicomio Share
|
||||
* Mononoké-BT
|
||||
* MoreThanTV
|
||||
* MoreThanTV (MTV)
|
||||
* MyAnonamouse
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* NCore
|
||||
* Nebulance
|
||||
* Nebulance (NBL)
|
||||
* New Real World
|
||||
* NordicBits
|
||||
* Norbits <!-- added by DiseaseNO but no longer maintained? -->
|
||||
* NordicBits (NB)
|
||||
* Norbits
|
||||
* notwhat.cd
|
||||
* Orpheus
|
||||
* Ourbits
|
||||
* Passione Torrent <!-- maintained by bonny1992 -->
|
||||
* PassThePopcorn
|
||||
* PassThePopcorn (PTP)
|
||||
* PirateTheNet
|
||||
* PiXELHD
|
||||
* PolishSource
|
||||
* PolishTracker
|
||||
* Pretome
|
||||
* PrivateHD
|
||||
* PrivateHD (PHD)
|
||||
* Psytorrents
|
||||
* PTFiles
|
||||
* PuntoTorrent
|
||||
@@ -240,8 +244,11 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* RevolutionTT
|
||||
* RGU
|
||||
* RoDVD
|
||||
* Romanian Metal Torrent
|
||||
* SceneFZ
|
||||
* SceneHD
|
||||
* SceneReactor
|
||||
* SceneRush
|
||||
* SceneTime
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
@@ -257,15 +264,14 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Superbits
|
||||
* Tasmanit
|
||||
* TBPlus
|
||||
* TehConnection.me
|
||||
* TenYardTracker
|
||||
* The Empire
|
||||
* The Geeks
|
||||
* The Horror Charnel
|
||||
* The Horror Charnel (THC)
|
||||
* The Occult
|
||||
* The New Retro
|
||||
* The Place
|
||||
* The Shinning
|
||||
* The Shinning (TsH)
|
||||
* The Show
|
||||
* The Vault
|
||||
* The-Torrents
|
||||
@@ -281,9 +287,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* TorrentHR
|
||||
* Torrenting
|
||||
* Torrentland
|
||||
* TorrentLeech
|
||||
* TorrentLeech (TL)
|
||||
* Torrents.Md
|
||||
* TorrentSeeds
|
||||
* TorrentSeeds (TS)
|
||||
* Torrent-Syndikat
|
||||
* TOrrent-tuRK (TORK)
|
||||
* TorViet
|
||||
@@ -297,9 +303,8 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
|
||||
* Ultimate Gamer Club
|
||||
* Waffles
|
||||
* World-In-HD
|
||||
* WorldOfP2P
|
||||
* x-ite.me
|
||||
* x264
|
||||
* WorldOfP2P (WOP)
|
||||
* x-ite.me (XM)
|
||||
* xBytesV2
|
||||
* XSpeeds
|
||||
* Xthor
|
||||
@@ -349,6 +354,14 @@ If you want to run it with a user without a /home directory you need to add `Env
|
||||
|
||||
Mono must be compiled with the Roslyn compiler (default), using MCS will cause "An error has occurred." errors (See https://github.com/Jackett/Jackett/issues/2704).
|
||||
|
||||
### Install as service
|
||||
1. Install Jackett with the steps from above.
|
||||
2. Open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service.
|
||||
2. If the installation was a success, you can close the Terminal window.
|
||||
|
||||
The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`.
|
||||
Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
|
||||
|
||||
### Installation on Linux via Ansible
|
||||
|
||||
On a RHEL/Centos 7 system: [linuxhq.jackett](https://galaxy.ansible.com/linuxhq/jackett)
|
||||
|
0
install_service_macos
Normal file → Executable file
0
install_service_macos
Normal file → Executable file
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
|
@@ -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:
|
||||
|
@@ -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]
|
||||
|
@@ -101,6 +101,13 @@
|
||||
search:
|
||||
paths:
|
||||
- path: index.php
|
||||
keywordsfilters:
|
||||
- name: diacritics
|
||||
args: replace
|
||||
- name: re_replace # S01 to 1
|
||||
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
|
||||
- name: re_replace # S01E01 to 1 1
|
||||
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
|
||||
inputs:
|
||||
search: "{{if .Query.IMDBID}}{{ .Query.IMDBIDShort }}{{else}}{{ .Keywords }}{{end}}"
|
||||
page: "torrents"
|
||||
@@ -115,6 +122,21 @@
|
||||
attribute: href
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
filters:
|
||||
- name: re_replace # S01 E01 to S01E01
|
||||
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
|
||||
- name: re_replace # 01x01 to S01E01
|
||||
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
|
||||
- name: re_replace # 1x01 to S01E01
|
||||
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
|
||||
- name: re_replace # Stagione X --> S0X
|
||||
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
|
||||
- name: re_replace # Stagione XX --> SXX
|
||||
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
|
||||
- name: re_replace # Episodio 4 to E4
|
||||
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
|
||||
- name: re_replace # Episodi 4 5 to E04-05
|
||||
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
|
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"
|
@@ -12,23 +12,23 @@
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: Children, cat: Audio/Audiobook, desc: "Children"}
|
||||
- {id: Teen & Young Adult, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
|
||||
- {id: Teen, cat: Audio/Audiobook, desc: "Teen & Young Adult"}
|
||||
- {id: Adults, cat: Audio/Audiobook, desc: "Adults"}
|
||||
- {id: The Undead, cat: Audio/Audiobook, desc: "The Undead"}
|
||||
- {id: The, cat: Audio/Audiobook, desc: "The Undead"}
|
||||
- {id: Action, cat: Audio/Audiobook, desc: "Action"}
|
||||
- {id: Adventure, cat: Audio/Audiobook, desc: "Adventure"}
|
||||
- {id: Art, cat: Audio/Audiobook, desc: "Art"}
|
||||
- {id: Autobiography & Biographies, cat: Audio/Audiobook, desc: "Autobiography & Biographies"}
|
||||
- {id: Autobiography, cat: Audio/Audiobook, desc: "Autobiography & Biographies"}
|
||||
- {id: Business, cat: Audio/Audiobook, desc: "Business"}
|
||||
- {id: Computer, cat: Audio/Audiobook, desc: "Computer"}
|
||||
- {id: Contemporary, cat: Audio/Audiobook, desc: "Contemporary"}
|
||||
- {id: Crime, cat: Audio/Audiobook, desc: "Crime"}
|
||||
- {id: Detective, cat: Audio/Audiobook, desc: "Detective"}
|
||||
- {id: Doctor Who, cat: Audio/Audiobook, desc: "Doctor Who"}
|
||||
- {id: Doctor, cat: Audio/Audiobook, desc: "Doctor Who"}
|
||||
- {id: Education, cat: Audio/Audiobook, desc: "Education"}
|
||||
- {id: Fantasy, cat: Audio/Audiobook, desc: "Fantasy"}
|
||||
- {id: General Fiction, cat: Audio/Audiobook, desc: "General Fiction"}
|
||||
- {id: Historical Fiction, cat: Audio/Audiobook, desc: "Historical Fiction"}
|
||||
- {id: General, cat: Audio/Audiobook, desc: "General Fiction"}
|
||||
- {id: Historical, cat: Audio/Audiobook, desc: "Historical Fiction"}
|
||||
- {id: History, cat: Audio/Audiobook, desc: "History"}
|
||||
- {id: Horror, cat: Audio/Audiobook, desc: "Horror"}
|
||||
- {id: Humor, cat: Audio/Audiobook, desc: "Humor"}
|
||||
@@ -36,39 +36,39 @@
|
||||
- {id: LGBT, cat: Audio/Audiobook, desc: "LGBT"}
|
||||
- {id: Literature, cat: Audio/Audiobook, desc: "Literature"}
|
||||
- {id: LitRPG, cat: Audio/Audiobook, desc: "LitRPG"}
|
||||
- {id: Misc. Non-fiction, cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
|
||||
- {id: Misc., cat: Audio/Audiobook, desc: "Misc. Non-fiction"}
|
||||
- {id: Mystery, cat: Audio/Audiobook, desc: "Mystery"}
|
||||
- {id: Myth Hunting, cat: Audio/Audiobook, desc: "Myth Hunting"}
|
||||
- {id: Myth, cat: Audio/Audiobook, desc: "Myth Hunting"}
|
||||
- {id: Paranormal, cat: Audio/Audiobook, desc: "Paranormal"}
|
||||
- {id: Plays & Theater, cat: Audio/Audiobook, desc: "Plays & Theater"}
|
||||
- {id: Plays, cat: Audio/Audiobook, desc: "Plays & Theater"}
|
||||
- {id: Poetry, cat: Audio/Audiobook, desc: "Poetry"}
|
||||
- {id: Political, cat: Audio/Audiobook, desc: "Political"}
|
||||
- {id: Postapocalyptic, cat: Audio/Audiobook, desc: "Postapocalyptic"}
|
||||
- {id: Radio Productions, cat: Audio/Audiobook, desc: "Radio Productions"}
|
||||
- {id: Radio, cat: Audio/Audiobook, desc: "Radio Productions"}
|
||||
- {id: Romance, cat: Audio/Audiobook, desc: "Romance"}
|
||||
- {id: Sci-Fi, cat: Audio/Audiobook, desc: "Sci-Fi"}
|
||||
- {id: Science, cat: Audio/Audiobook, desc: "Science"}
|
||||
- {id: Self-help, cat: Audio/Audiobook, desc: "Self-help"}
|
||||
- {id: SHTF, cat: Audio/Audiobook, desc: "SHTF"}
|
||||
- {id: Spiritual & Religious, cat: Audio/Audiobook, desc: "Spiritual & Religious"}
|
||||
- {id: Spiritual, cat: Audio/Audiobook, desc: "Spiritual & Religious"}
|
||||
- {id: Sports, cat: Audio/Audiobook, desc: "Sports"}
|
||||
- {id: Suspense, cat: Audio/Audiobook, desc: "Suspense"}
|
||||
- {id: Thriller, cat: Audio/Audiobook, desc: "Thriller"}
|
||||
- {id: True Crime, cat: Audio/Audiobook, desc: "True Crime"}
|
||||
- {id: True, cat: Audio/Audiobook, desc: "True Crime"}
|
||||
- {id: Tutorial, cat: Audio/Audiobook, desc: "Tutorial"}
|
||||
- {id: Westerns, cat: Audio/Audiobook, desc: "Westerns"}
|
||||
- {id: Anthology, cat: Audio/Audiobook, desc: "Anthology"}
|
||||
- {id: Bestsellers, cat: Audio/Audiobook, desc: "Bestsellers"}
|
||||
- {id: Classic, cat: Audio/Audiobook, desc: "Classic"}
|
||||
- {id: Documentary, cat: Audio/Audiobook, desc: "Documentary"}
|
||||
- {id: Full Cast, cat: Audio/Audiobook, desc: "Full Cast"}
|
||||
- {id: Full, cat: Audio/Audiobook, desc: "Full Cast"}
|
||||
- {id: Libertarian, cat: Audio/Audiobook, desc: "Libertarian"}
|
||||
- {id: Military, cat: Audio/Audiobook, desc: "Military"}
|
||||
- {id: Novel, cat: Audio/Audiobook, desc: "Novel"}
|
||||
- {id: Short Story, cat: Audio/Audiobook, desc: "Short Story"}
|
||||
- {id: Short, cat: Audio/Audiobook, desc: "Short Story"}
|
||||
|
||||
modes:
|
||||
search: [s]
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: https://audiobookbay.nl/member/login.php
|
||||
@@ -90,17 +90,43 @@
|
||||
|
||||
search:
|
||||
paths:
|
||||
# show members page if no search parameters
|
||||
- path: /
|
||||
inputs:
|
||||
"s": "{{ .Keywords }}"
|
||||
# with just 7 results per page, try to grab up to 35 results
|
||||
# http://audiobookbay.nl/?s=teeth
|
||||
# http://audiobookbay.nl/page/2/?s=teeth
|
||||
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
|
||||
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/5/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
rows:
|
||||
selector: div.post
|
||||
selector: div.post:has(div[class="postTitle"])
|
||||
fields:
|
||||
title:
|
||||
selector: div.postTitle
|
||||
details:
|
||||
selector: div.postTitle
|
||||
selector: div.postTitle h2 a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[href^="/audio-books/"]
|
||||
attribute: href
|
||||
banner:
|
||||
optional: true
|
||||
selector: img
|
||||
attribute: src
|
||||
category:
|
||||
selector: div.postInfo
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Category: (.+?)\\s"
|
||||
date:
|
||||
selector: div.postContent p:contains("Posted:")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "Posted: (.+?)Format:"
|
||||
- name: dateparse
|
||||
args: "2 Jan 2006"
|
||||
size:
|
||||
selector: div.postContent p:contains("File Size:")
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "File Size: (.+?)s"
|
||||
|
@@ -1,4 +1,4 @@
|
||||
---
|
||||
---
|
||||
site: bigtower
|
||||
name: BigTower
|
||||
description: "Big Tower is an ITALIAN Private site for TV / MOVIES / GENERAL"
|
||||
@@ -70,12 +70,23 @@
|
||||
- {id: 74, cat: Books/Comics, desc: "Manga"}
|
||||
- {id: 87, cat: Books, desc: "Giornali"}
|
||||
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: donor
|
||||
type: checkbox
|
||||
label: Show donor torrent? (Enable if you're a donor)
|
||||
default: false
|
||||
|
||||
login:
|
||||
path: index.php?page=login
|
||||
method: post
|
||||
@@ -98,7 +109,7 @@
|
||||
options: "0"
|
||||
active: "0"
|
||||
rows:
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="])
|
||||
selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]){{if .Config.donor }}{{else}}:not(:has(img[src*="keditbookmarks.png"])){{end}}
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
@@ -108,6 +119,9 @@
|
||||
args: ["index.php?page=torrent-details&id=", "download.php?id="]
|
||||
title:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
filters:
|
||||
- name: re_replace # rimozioni varie
|
||||
args: ["(?i)(\\[Richiesta\\])", ""]
|
||||
banner:
|
||||
selector: a[onmouseover][href^="index.php?page=torrent-details&id="]
|
||||
attribute: onmouseover
|
||||
|
@@ -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"
|
@@ -54,9 +54,9 @@
|
||||
grabs:
|
||||
selector: .sbar span:nth-of-type(6) b
|
||||
seeders:
|
||||
text: "999"
|
||||
text: "1"
|
||||
leechers:
|
||||
text: "999"
|
||||
text: "1"
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
@@ -25,7 +25,7 @@
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}q/{{ .Keywords}}/?sort=time{{else}}recent{{end}}"
|
||||
- path: "{{if .Keywords}}q/{{ .Keywords}}/?sort=time{{else}}q/test/{{end}}"
|
||||
- path: "{{if .Keywords}}q/{{ .Keywords}}/2?sort=time{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}q/{{ .Keywords}}/3?sort=time{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}q/{{ .Keywords}}/4?sort=time{{else}}{{end}}"
|
||||
|
@@ -39,7 +39,7 @@
|
||||
- name: re_replace
|
||||
args: [" ", "+"]
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}q/{{ .Keywords }}/date/{{else}}/{{end}}"
|
||||
- path: "q/{{ if .Keywords }}{{ .Keywords }}{{else}}test{{end}}/date/"
|
||||
rows:
|
||||
selector: table.tor > tbody > tr[class$="_tr"]
|
||||
filters:
|
||||
|
@@ -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:
|
||||
- https://ww1.cpabien.io/
|
||||
- https://www.cpasbien.blue/
|
||||
legacylinks:
|
||||
- http://www.cpasbiens.cc/
|
||||
- http://www.cpabien.cm/
|
||||
@@ -22,6 +23,12 @@
|
||||
- http://cpabien.la/
|
||||
- http://cpabien.club/
|
||||
- http://www.cpabien.io/
|
||||
- https://ww1.cpabien.io/
|
||||
- https://wvw.cpabien.cm/
|
||||
- https://www.cpabien.io/
|
||||
- https://www.cpabien.cx/
|
||||
- https://www.cpabien9.net/
|
||||
- https://wwv.cpabien.cm/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
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"
|
@@ -40,6 +40,26 @@
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q, imdbid]
|
||||
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: password
|
||||
type: password
|
||||
label: Password
|
||||
- name: multilang
|
||||
type: checkbox
|
||||
label: Replace VFQ/MULTI by another language in release name
|
||||
default: false
|
||||
- name: multilanguage
|
||||
type: select
|
||||
label: Replace MULTI by this language
|
||||
default: MULTI.FRENCH
|
||||
options:
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH : "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
|
||||
login:
|
||||
path: login3.php
|
||||
method: form
|
||||
@@ -81,17 +101,28 @@
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["/details.php", "/download.php"]
|
||||
title:
|
||||
_title_original:
|
||||
selector: a[href^="/details.php"]:has(b)
|
||||
_title_original: # long titles (shortened with ...)
|
||||
selector: a[href^="/details.php"][title]
|
||||
attribute: title
|
||||
optional: true
|
||||
_title_normalized:
|
||||
text: "{{ .Result._title_original }}"
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["VFQ", "FRENCH"]
|
||||
- name: replace
|
||||
args: ["vfq", "FRENCH"]
|
||||
- name: re_replace
|
||||
args: ["S(\\d{2}) E(\\d{2})", "S$1E$2"]
|
||||
- name: re_replace
|
||||
args: ["S(\\d{1}) E(\\d{2})", "S0$1E$2"]
|
||||
_title_multilang:
|
||||
text: "{{ .Result._title_normalized }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]MULTI[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
- name: re_replace
|
||||
args: ["(?i)[\\.\\s\\[\\-]VFQ[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title:
|
||||
text: "{{if .Config.multilang }}{{ .Result._title_multilang }}{{else}}{{ .Result._title_normalized }}{{end}}"
|
||||
category:
|
||||
selector: a[href^="/browse.php?cat="]
|
||||
attribute: href
|
||||
|
@@ -1,981 +0,0 @@
|
||||
---
|
||||
site: extratorrentclone
|
||||
name: ExtraTorrentClone
|
||||
description: "ExtraTorrentClone is a Public tracker, a popular alternative to the original ET site, providing Movie / TV / General magnets"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://geetorrent.com/
|
||||
legacylinks:
|
||||
- https://eltorrents.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
#Anime
|
||||
- {id: 1, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 963, cat: TV/Anime, desc: "Anime - Absolute Duo"}
|
||||
- {id: 951, cat: TV/Anime, desc: "Anime - Akame ga Kill"}
|
||||
- {id: 959, cat: TV/Anime, desc: "Anime - Aldnoah Zero"}
|
||||
- {id: 99, cat: TV/Anime, desc: "Anime - Anime - Other"}
|
||||
- {id: 86, cat: TV/Anime, desc: "Anime - Battle Programer Shirase"}
|
||||
- {id: 87, cat: TV/Anime, desc: "Anime - Big O"}
|
||||
- {id: 960, cat: TV/Anime, desc: "Anime - Binan Koukou Chikyuu Bouei-bu Love"}
|
||||
- {id: 267, cat: TV/Anime, desc: "Anime - Bleach"}
|
||||
- {id: 88, cat: TV/Anime, desc: "Anime - Cardcaptor Sakura"}
|
||||
- {id: 89, cat: TV/Anime, desc: "Anime - Chobits"}
|
||||
- {id: 142, cat: TV/Anime, desc: "Anime - Comics"}
|
||||
- {id: 962, cat: TV/Anime, desc: "Anime - Death Parade"}
|
||||
- {id: 151, cat: TV/Anime, desc: "Anime - Dragon ball"}
|
||||
- {id: 90, cat: TV/Anime, desc: "Anime - Dragonball GT"}
|
||||
- {id: 91, cat: TV/Anime, desc: "Anime - Dragonball Z"}
|
||||
- {id: 156, cat: TV/Anime, desc: "Anime - DVD-R"}
|
||||
- {id: 950, cat: TV/Anime, desc: "Anime - Fairy Tail"}
|
||||
- {id: 92, cat: TV/Anime, desc: "Anime - Flame of Recca"}
|
||||
- {id: 93, cat: TV/Anime, desc: "Anime - Full Metal Alchemist"}
|
||||
- {id: 95, cat: TV/Anime, desc: "Anime - Ghost In The Shell SAC"}
|
||||
- {id: 94, cat: TV/Anime, desc: "Anime - Gundam"}
|
||||
- {id: 620, cat: TV/Anime, desc: "Anime - Hentai"}
|
||||
- {id: 145, cat: TV/Anime, desc: "Anime - Hunter X Hunter"}
|
||||
- {id: 949, cat: TV/Anime, desc: "Anime - Inou Battle wa Nichijou-kei no Naka de"}
|
||||
- {id: 96, cat: TV/Anime, desc: "Anime - InuYasha"}
|
||||
- {id: 524, cat: TV/Anime, desc: "Anime - Kiba"}
|
||||
- {id: 97, cat: TV/Anime, desc: "Anime - Konkiki No Gash Bell"}
|
||||
- {id: 961, cat: TV/Anime, desc: "Anime - Kuroko No Basuke"}
|
||||
- {id: 98, cat: TV/Anime, desc: "Anime - Last Exile"}
|
||||
- {id: 964, cat: TV/Anime, desc: "Anime - Log Horizon"}
|
||||
- {id: 952, cat: TV/Anime, desc: "Anime - Nanatsu no Taizai"}
|
||||
- {id: 101, cat: TV/Anime, desc: "Anime - Naruto"}
|
||||
- {id: 508, cat: TV/Anime, desc: "Anime - One Piece"}
|
||||
- {id: 100, cat: TV/Anime, desc: "Anime - Onegai Twins"}
|
||||
- {id: 523, cat: TV/Anime, desc: "Anime - Ouran High School Host Club"}
|
||||
- {id: 102, cat: TV/Anime, desc: "Anime - PlanetES"}
|
||||
- {id: 146, cat: TV/Anime, desc: "Anime - Prince of Tennis"}
|
||||
- {id: 103, cat: TV/Anime, desc: "Anime - Ranma 1/2"}
|
||||
- {id: 104, cat: TV/Anime, desc: "Anime - Ruroni Kenshin"}
|
||||
- {id: 105, cat: TV/Anime, desc: "Anime - Samurai Champloo"}
|
||||
- {id: 107, cat: TV/Anime, desc: "Anime - Scrapped Princess"}
|
||||
- {id: 997, cat: TV/Anime, desc: "Anime - Spider-man"}
|
||||
- {id: 106, cat: TV/Anime, desc: "Anime - Stellvia of the Universe"}
|
||||
- {id: 525, cat: TV/Anime, desc: "Anime - Strawberry Panic"}
|
||||
- {id: 953, cat: TV/Anime, desc: "Anime - Sword Art Online II"}
|
||||
- {id: 958, cat: TV/Anime, desc: "Anime - Tokyo Ghoul"}
|
||||
|
||||
#Audio
|
||||
- {id: 5, cat: Audio, desc: "Music"}
|
||||
- {id: 54, cat: Audio, desc: "Music - Alternative"}
|
||||
- {id: 990, cat: Audio, desc: "Music - Ambient"}
|
||||
- {id: 160, cat: Audio, desc: "Music - Anime"}
|
||||
- {id: 55, cat: Audio, desc: "Music - Asian"}
|
||||
- {id: 56, cat: Audio, desc: "Music - Blues"}
|
||||
- {id: 809, cat: Audio, desc: "Music - Bollywood"}
|
||||
- {id: 57, cat: Audio, desc: "Music - Christian"}
|
||||
- {id: 58, cat: Audio, desc: "Music - Classic"}
|
||||
- {id: 515, cat: Audio, desc: "Music - Compilation/Various Artists (VA)"}
|
||||
- {id: 59, cat: Audio, desc: "Music - Country/Western"}
|
||||
- {id: 971, cat: Audio, desc: "Music - Discography"}
|
||||
- {id: 60, cat: Audio, desc: "Music - Drum N Bass"}
|
||||
- {id: 61, cat: Audio, desc: "Music - Electronic"}
|
||||
- {id: 850, cat: Audio, desc: "Music - FLAC"}
|
||||
- {id: 519, cat: Audio, desc: "Music - Folk"}
|
||||
- {id: 62, cat: Audio, desc: "Music - Game Music"}
|
||||
- {id: 233, cat: Audio, desc: "Music - Gothic"}
|
||||
- {id: 63, cat: Audio, desc: "Music - Hardcore"}
|
||||
- {id: 78, cat: Audio, desc: "Music - HardHouse/Old School Radio Mixes"}
|
||||
- {id: 512, cat: Audio, desc: "Music - Hardrock"}
|
||||
- {id: 724, cat: Audio, desc: "Music - Hardstyle"}
|
||||
- {id: 306, cat: Audio, desc: "Music - Heavy/Death Metal"}
|
||||
- {id: 64, cat: Audio, desc: "Music - Hip Hop"}
|
||||
- {id: 511, cat: Audio, desc: "Music - Indie/Britpop"}
|
||||
- {id: 65, cat: Audio, desc: "Music - Industrial"}
|
||||
- {id: 66, cat: Audio, desc: "Music - Jazz"}
|
||||
- {id: 67, cat: Audio, desc: "Music - Karaoke"}
|
||||
- {id: 521, cat: Audio, desc: "Music - Latin"}
|
||||
- {id: 68, cat: Audio, desc: "Music - Metal"}
|
||||
- {id: 526, cat: Audio, desc: "Music - Motown"}
|
||||
- {id: 79, cat: Audio, desc: "Music - Music - Other"}
|
||||
- {id: 69, cat: Audio, desc: "Music - Music Videos"}
|
||||
- {id: 522, cat: Audio, desc: "Music - Non-English"}
|
||||
- {id: 507, cat: Audio, desc: "Music - Now That's What I Call Music"}
|
||||
- {id: 70, cat: Audio, desc: "Music - Pop"}
|
||||
- {id: 852, cat: Audio, desc: "Music - Progressive"}
|
||||
- {id: 71, cat: Audio, desc: "Music - Punk"}
|
||||
- {id: 72, cat: Audio, desc: "Music - R&B"}
|
||||
- {id: 851, cat: Audio, desc: "Music - Rai"}
|
||||
- {id: 73, cat: Audio, desc: "Music - Rap"}
|
||||
- {id: 74, cat: Audio, desc: "Music - Reggae"}
|
||||
- {id: 75, cat: Audio, desc: "Music - Rock"}
|
||||
- {id: 527, cat: Audio, desc: "Music - Rock 'n' Roll"}
|
||||
- {id: 514, cat: Audio, desc: "Music - Singer Songwriter"}
|
||||
- {id: 230, cat: Audio, desc: "Music - Ska"}
|
||||
- {id: 505, cat: Audio, desc: "Music - Soul"}
|
||||
- {id: 77, cat: Audio, desc: "Music - Soundtracks"}
|
||||
- {id: 161, cat: Audio, desc: "Music - Techno"}
|
||||
- {id: 420, cat: Audio, desc: "Music - Trance/House/Dance"}
|
||||
- {id: 76, cat: Audio, desc: "Music - Unsigned/Amateur"}
|
||||
- {id: 1002, cat: Audio, desc: "Music - AAC"}
|
||||
- {id: 1003, cat: Audio, desc: "Music - Album"}
|
||||
- {id: 1004, cat: Audio, desc: "Music - Box Set"}
|
||||
- {id: 1005, cat: Audio, desc: "Music - Concerts"}
|
||||
- {id: 1006, cat: Audio, desc: "Music - Discography"}
|
||||
- {id: 1007, cat: Audio, desc: "Music - DVD"}
|
||||
- {id: 1008, cat: Audio/Lossless, desc: "Music - Lossless"}
|
||||
- {id: 1009, cat: Audio/MP3, desc: "Music - MP3"}
|
||||
- {id: 1011, cat: Audio, desc: "Music - Radio"}
|
||||
- {id: 1012, cat: Audio, desc: "Music - Single"}
|
||||
|
||||
#Movies
|
||||
- {id: 4, cat: Movies, desc: "Movies"}
|
||||
- {id: 419, cat: Movies, desc: "Movies - Action"}
|
||||
- {id: 28, cat: Movies, desc: "Movies - Adventure"}
|
||||
- {id: 29, cat: Movies, desc: "Movies - Animation"}
|
||||
- {id: 30, cat: Movies, desc: "Movies - Asian"}
|
||||
- {id: 32, cat: Movies, desc: "Movies - Automotive/Cars"}
|
||||
- {id: 628, cat: Movies, desc: "Movies - Biography"}
|
||||
- {id: 977, cat: Movies, desc: "Movies - Black and White"}
|
||||
- {id: 558, cat: Movies, desc: "Movies - Bollywood/Desi"}
|
||||
- {id: 976, cat: Movies, desc: "Movies - Classic"}
|
||||
- {id: 33, cat: Movies, desc: "Movies - Comedy"}
|
||||
- {id: 34, cat: Movies, desc: "Movies - Concerts"}
|
||||
- {id: 600, cat: Movies, desc: "Movies - Crime"}
|
||||
- {id: 35, cat: Movies, desc: "Movies - Documentary"}
|
||||
- {id: 37, cat: Movies, desc: "Movies - Drama"}
|
||||
- {id: 742, cat: Movies, desc: "Movies - Dubbed/Dual Audio"}
|
||||
- {id: 36, cat: Movies, desc: "Movies - DVD/Film Extras"}
|
||||
- {id: 149, cat: Movies, desc: "Movies - Family"}
|
||||
- {id: 38, cat: Movies, desc: "Movies - Fantasy"}
|
||||
- {id: 39, cat: Movies, desc: "Movies - Gore Flicks"}
|
||||
- {id: 602, cat: Movies, desc: "Movies - History"}
|
||||
- {id: 40, cat: Movies, desc: "Movies - Horror"}
|
||||
- {id: 41, cat: Movies, desc: "Movies - Kids"}
|
||||
- {id: 150, cat: Movies, desc: "Movies - KVCD"}
|
||||
- {id: 974, cat: Movies, desc: "Movies - Lollywood"}
|
||||
- {id: 42, cat: Movies, desc: "Movies - Martial Arts"}
|
||||
- {id: 44, cat: Movies/Other, desc: "Movies - Other"}
|
||||
- {id: 805, cat: Movies/3D, desc: "Movies - 3D"}
|
||||
- {id: 975, cat: Movies/UHD, desc: "Movies - 4K"}
|
||||
- {id: 947, cat: Movies, desc: "Movies - Musical"}
|
||||
- {id: 43, cat: Movies, desc: "Movies - Mystery"}
|
||||
- {id: 603, cat: Movies/Foreign, desc: "Movies - non English"}
|
||||
- {id: 978, cat: Movies, desc: "Movies - Rarities"}
|
||||
- {id: 45, cat: Movies, desc: "Movies - Romance"}
|
||||
- {id: 46, cat: Movies, desc: "Movies - Samples/Trailers"}
|
||||
- {id: 47, cat: Movies, desc: "Movies - Sci-Fi"}
|
||||
- {id: 48, cat: Movies, desc: "Movies - Sports related"}
|
||||
- {id: 779, cat: Movies, desc: "Movies - Stand-up comedy"}
|
||||
- {id: 49, cat: Movies, desc: "Movies - Thriller"}
|
||||
- {id: 671, cat: Movies, desc: "Movies - Travel"}
|
||||
- {id: 307, cat: Movies, desc: "Movies - War"}
|
||||
- {id: 601, cat: Movies, desc: "Movies - Western"}
|
||||
- {id: 1024, cat: Movies, desc: "Movies - HEVC/x265"}
|
||||
- {id: 1030, cat: Movies, desc: "Movies - Divx/Xvid"}
|
||||
- {id: 1031, cat: Movies, desc: "Movies - h.264/x264"}
|
||||
- {id: 1032, cat: Movies/HD, desc: "Movies - HD"}
|
||||
- {id: 1033, cat: Movies, desc: "Movies - MP4"}
|
||||
- {id: 1034, cat: Movies, desc: "Movies - SVCD/VCD"}
|
||||
- {id: 1035, cat: Movies, desc: "Movies - YIFY"}
|
||||
|
||||
#TV
|
||||
- {id: 8, cat: TV, desc: "TV"}
|
||||
- {id: 986, cat: TV, desc: "TV - 12 Monkeys"}
|
||||
- {id: 598, cat: TV, desc: "TV - 19-2"}
|
||||
- {id: 795, cat: TV, desc: "TV - 2 Broke Girls"}
|
||||
- {id: 435, cat: TV, desc: "TV - 24"}
|
||||
- {id: 169, cat: TV, desc: "TV - 30 Days"}
|
||||
- {id: 561, cat: TV, desc: "TV - 30 Rock"}
|
||||
- {id: 274, cat: TV, desc: "TV - 60 Minutes"}
|
||||
- {id: 862, cat: TV, desc: "TV - 666 Park Avenue"}
|
||||
- {id: 273, cat: TV, desc: "TV - 'Allo 'Allo!"}
|
||||
- {id: 310, cat: TV, desc: "TV - A-Team"}
|
||||
- {id: 797, cat: TV, desc: "TV - About a Boy"}
|
||||
- {id: 998, cat: TV, desc: "TV - Above Suspicion"}
|
||||
- {id: 966, cat: TV, desc: "TV - Adam - E.V.A"}
|
||||
- {id: 573, cat: TV, desc: "TV - Alaska State Troopers"}
|
||||
- {id: 821, cat: TV, desc: "TV - Alcatraz"}
|
||||
- {id: 118, cat: TV, desc: "TV - Alias"}
|
||||
- {id: 810, cat: TV, desc: "TV - Almost Human"}
|
||||
- {id: 771, cat: TV, desc: "TV - Alphas"}
|
||||
- {id: 818, cat: TV, desc: "TV - American Chopper"}
|
||||
- {id: 234, cat: TV, desc: "TV - American Dad"}
|
||||
- {id: 194, cat: TV, desc: "TV - American Horror Story"}
|
||||
- {id: 634, cat: TV, desc: "TV - American Idol"}
|
||||
- {id: 674, cat: TV, desc: "TV - Americas Got Talent"}
|
||||
- {id: 675, cat: TV, desc: "TV - Americas Next Top Model"}
|
||||
- {id: 894, cat: TV, desc: "TV - Ancient Aliens"}
|
||||
- {id: 170, cat: TV, desc: "TV - Angel"}
|
||||
- {id: 911, cat: TV, desc: "TV - Anger Management"}
|
||||
- {id: 659, cat: TV, desc: "TV - Archer"}
|
||||
- {id: 275, cat: TV, desc: "TV - Arrested Development"}
|
||||
- {id: 872, cat: TV, desc: "TV - Arrow"}
|
||||
- {id: 984, cat: TV, desc: "TV - Ash vs Evil Dead"}
|
||||
- {id: 171, cat: TV, desc: "TV - Attack Of The Show"}
|
||||
- {id: 837, cat: TV, desc: "TV - Awake"}
|
||||
- {id: 902, cat: TV, desc: "TV - Awkward"}
|
||||
- {id: 916, cat: TV, desc: "TV - Baby Daddy"}
|
||||
- {id: 165, cat: TV, desc: "TV - Babylon 5"}
|
||||
- {id: 309, cat: TV, desc: "TV - Back In The Game"}
|
||||
- {id: 460, cat: TV, desc: "TV - Band Of Brothers"}
|
||||
- {id: 329, cat: TV, desc: "TV - Banshee"}
|
||||
- {id: 891, cat: TV, desc: "TV - Bates Motel"}
|
||||
- {id: 802, cat: TV, desc: "TV - Batman The Brave and The Bold"}
|
||||
- {id: 163, cat: TV, desc: "TV - Battlestar Galactica"}
|
||||
- {id: 794, cat: TV, desc: "TV - BBC"}
|
||||
- {id: 886, cat: TV, desc: "TV - Beauty and the Beast"}
|
||||
- {id: 172, cat: TV, desc: "TV - Beauty And The Geek"}
|
||||
- {id: 782, cat: TV, desc: "TV - Beavis and Butt-Head"}
|
||||
- {id: 584, cat: TV, desc: "TV - Being Erica"}
|
||||
- {id: 669, cat: TV, desc: "TV - Being Human"}
|
||||
- {id: 683, cat: TV, desc: "TV - Believe"}
|
||||
- {id: 335, cat: TV, desc: "TV - Bellator FC"}
|
||||
- {id: 979, cat: TV, desc: "TV - Better Call Saul"}
|
||||
- {id: 173, cat: TV, desc: "TV - Big Brother"}
|
||||
- {id: 666, cat: TV, desc: "TV - Big Love"}
|
||||
- {id: 774, cat: TV, desc: "TV - Bigg Boss"}
|
||||
- {id: 989, cat: TV, desc: "TV - Billions"}
|
||||
- {id: 174, cat: TV, desc: "TV - Bitten"}
|
||||
- {id: 396, cat: TV, desc: "TV - Black Sails"}
|
||||
- {id: 981, cat: TV, desc: "TV - Blindspot"}
|
||||
- {id: 717, cat: TV, desc: "TV - Blue Bloods"}
|
||||
- {id: 754, cat: TV, desc: "TV - Boardwalk Empire"}
|
||||
- {id: 709, cat: TV, desc: "TV - Bobs Burgers"}
|
||||
- {id: 767, cat: TV, desc: "TV - Body of Proof"}
|
||||
- {id: 175, cat: TV, desc: "TV - Bold and the beautiful"}
|
||||
- {id: 969, cat: TV, desc: "TV - Bollywood TV Shows"}
|
||||
- {id: 269, cat: TV, desc: "TV - Bones"}
|
||||
- {id: 235, cat: TV, desc: "TV - Boston Legal"}
|
||||
- {id: 676, cat: TV, desc: "TV - Breaking Bad"}
|
||||
- {id: 707, cat: TV, desc: "TV - Breakout Kings"}
|
||||
- {id: 409, cat: TV, desc: "TV - Brickleberry"}
|
||||
- {id: 680, cat: TV, desc: "TV - Brooklyn Nine-Nine"}
|
||||
- {id: 560, cat: TV, desc: "TV - Brothers And Sisters"}
|
||||
- {id: 147, cat: TV, desc: "TV - Buffy"}
|
||||
- {id: 677, cat: TV, desc: "TV - Burn Notice"}
|
||||
- {id: 619, cat: TV, desc: "TV - Californication"}
|
||||
- {id: 883, cat: TV, desc: "TV - Call of the Wildman"}
|
||||
- {id: 719, cat: TV, desc: "TV - Camelot"}
|
||||
- {id: 921, cat: TV, desc: "TV - Camp"}
|
||||
- {id: 661, cat: TV, desc: "TV - Caprica"}
|
||||
- {id: 928, cat: TV, desc: "TV - Capture"}
|
||||
- {id: 128, cat: TV, desc: "TV - Carnivale"}
|
||||
- {id: 736, cat: TV, desc: "TV - Cartoon"}
|
||||
- {id: 658, cat: TV, desc: "TV - Castle"}
|
||||
- {id: 941, cat: TV, desc: "TV - Cedar Cove"}
|
||||
- {id: 846, cat: TV, desc: "TV - Celebrity Juice"}
|
||||
- {id: 141, cat: TV, desc: "TV - Charmed"}
|
||||
- {id: 900, cat: TV, desc: "TV - Chicago Fire"}
|
||||
- {id: 324, cat: TV, desc: "TV - Chicago PD"}
|
||||
- {id: 315, cat: TV, desc: "TV - Chopped"}
|
||||
- {id: 184, cat: TV, desc: "TV - Chozen"}
|
||||
- {id: 657, cat: TV, desc: "TV - Chuck"}
|
||||
- {id: 133, cat: TV, desc: "TV - Cold Case"}
|
||||
- {id: 629, cat: TV, desc: "TV - Community"}
|
||||
- {id: 178, cat: TV, desc: "TV - Conan O'Brien"}
|
||||
- {id: 946, cat: TV, desc: "TV - Constantine"}
|
||||
- {id: 879, cat: TV, desc: "TV - Continuum"}
|
||||
- {id: 861, cat: TV, desc: "TV - Copper"}
|
||||
- {id: 322, cat: TV, desc: "TV - Cops"}
|
||||
- {id: 186, cat: TV, desc: "TV - Cosmos A Space Time Odyssey"}
|
||||
- {id: 670, cat: TV, desc: "TV - Cougar Town"}
|
||||
- {id: 729, cat: TV, desc: "TV - Covert Affairs"}
|
||||
- {id: 651, cat: TV, desc: "TV - Craig Ferguson"}
|
||||
- {id: 280, cat: TV, desc: "TV - Criminal Minds"}
|
||||
- {id: 788, cat: TV, desc: "TV - Crisis"}
|
||||
- {id: 279, cat: TV, desc: "TV - Criss Angel BeLIEve"}
|
||||
- {id: 323, cat: TV, desc: "TV - Crossing Jordan"}
|
||||
- {id: 926, cat: TV, desc: "TV - Crossing Lines"}
|
||||
- {id: 108, cat: TV, desc: "TV - CSI"}
|
||||
- {id: 325, cat: TV, desc: "TV - Curb Your Enthusiasm"}
|
||||
- {id: 882, cat: TV, desc: "TV - Da Vincis Demons"}
|
||||
- {id: 282, cat: TV, desc: "TV - Dallas"}
|
||||
- {id: 678, cat: TV, desc: "TV - Damages"}
|
||||
- {id: 798, cat: TV, desc: "TV - Dancing with the Stars US"}
|
||||
- {id: 652, cat: TV, desc: "TV - David Letterman"}
|
||||
- {id: 994, cat: TV, desc: "TV - Days of Our Lives"}
|
||||
- {id: 985, cat: TV, desc: "TV - DCs Legends of Tomorrow"}
|
||||
- {id: 181, cat: TV, desc: "TV - Dead Like Me"}
|
||||
- {id: 679, cat: TV, desc: "TV - Deadliest Catch"}
|
||||
- {id: 182, cat: TV, desc: "TV - Deadwood"}
|
||||
- {id: 890, cat: TV, desc: "TV - Defiance"}
|
||||
- {id: 281, cat: TV, desc: "TV - Democracy Now!"}
|
||||
- {id: 183, cat: TV, desc: "TV - Desperate Housewives"}
|
||||
- {id: 939, cat: TV, desc: "TV - Devious Maids"}
|
||||
- {id: 585, cat: TV, desc: "TV - Dexter"}
|
||||
- {id: 644, cat: TV, desc: "TV - Dirty Jobs"}
|
||||
- {id: 122, cat: TV, desc: "TV - Discovery Channel"}
|
||||
- {id: 167, cat: TV, desc: "TV - Doctor Who"}
|
||||
- {id: 968, cat: TV, desc: "TV - Documentary"}
|
||||
- {id: 606, cat: TV, desc: "TV - Dollhouse"}
|
||||
- {id: 839, cat: TV, desc: "TV - Dont Trust the Bitch in Apartment"}
|
||||
- {id: 326, cat: TV, desc: "TV - Dr Who"}
|
||||
- {id: 925, cat: TV, desc: "TV - Dracula"}
|
||||
- {id: 328, cat: TV, desc: "TV - Drawn Together"}
|
||||
- {id: 732, cat: TV, desc: "TV - Drop Dead"}
|
||||
- {id: 820, cat: TV, desc: "TV - Eastbound and Down"}
|
||||
- {id: 875, cat: TV, desc: "TV - Elementary"}
|
||||
- {id: 283, cat: TV, desc: "TV - Ellen DeGeneres"}
|
||||
- {id: 330, cat: TV, desc: "TV - Enlisted"}
|
||||
- {id: 187, cat: TV, desc: "TV - Entourage"}
|
||||
- {id: 270, cat: TV, desc: "TV - ER"}
|
||||
- {id: 765, cat: TV, desc: "TV - Eureka"}
|
||||
- {id: 238, cat: TV, desc: "TV - Everybody Loves Raymond"}
|
||||
- {id: 571, cat: TV, desc: "TV - Extant"}
|
||||
- {id: 840, cat: TV, desc: "TV - Fact or Faked Paranormal Files"}
|
||||
- {id: 828, cat: TV, desc: "TV - Fairly Legeal"}
|
||||
- {id: 876, cat: TV, desc: "TV - Faking It"}
|
||||
- {id: 917, cat: TV, desc: "TV - Falling Skies"}
|
||||
- {id: 188, cat: TV, desc: "TV - Family Guy"}
|
||||
- {id: 855, cat: TV, desc: "TV - Family Tools"}
|
||||
- {id: 411, cat: TV, desc: "TV - Fargo"}
|
||||
- {id: 331, cat: TV, desc: "TV - Farscape"}
|
||||
- {id: 983, cat: TV, desc: "TV - Fear the Walking Dead"}
|
||||
- {id: 332, cat: TV, desc: "TV - Fifth Gear"}
|
||||
- {id: 672, cat: TV, desc: "TV - Flashforward"}
|
||||
- {id: 753, cat: TV, desc: "TV - Flashpoint"}
|
||||
- {id: 831, cat: TV, desc: "TV - Foreign Series/Non English"}
|
||||
- {id: 266, cat: TV, desc: "TV - Forever"}
|
||||
- {id: 922, cat: TV, desc: "TV - Franklin and Bash"}
|
||||
- {id: 140, cat: TV, desc: "TV - Friends"}
|
||||
- {id: 612, cat: TV, desc: "TV - Fringe"}
|
||||
- {id: 277, cat: TV, desc: "TV - From Dusk Till Dawn"}
|
||||
- {id: 681, cat: TV, desc: "TV - Futurama"}
|
||||
- {id: 728, cat: TV, desc: "TV - Game of Thrones"}
|
||||
- {id: 334, cat: TV, desc: "TV - Gang Related"}
|
||||
- {id: 996, cat: TV, desc: "TV - General Hospital"}
|
||||
- {id: 954, cat: TV, desc: "TV - Geordie Shore"}
|
||||
- {id: 574, cat: TV, desc: "TV - Ghost Adventures"}
|
||||
- {id: 704, cat: TV, desc: "TV - Ghost Hunters"}
|
||||
- {id: 642, cat: TV, desc: "TV - Ghost Mine"}
|
||||
- {id: 338, cat: TV, desc: "TV - Ghost Whisperer"}
|
||||
- {id: 284, cat: TV, desc: "TV - Gilmore Girls"}
|
||||
- {id: 682, cat: TV, desc: "TV - Glee"}
|
||||
- {id: 865, cat: TV, desc: "TV - Go On"}
|
||||
- {id: 276, cat: TV, desc: "TV - Gold Rush"}
|
||||
- {id: 339, cat: TV, desc: "TV - Good Eats"}
|
||||
- {id: 599, cat: TV, desc: "TV - Gossip Girl"}
|
||||
- {id: 580, cat: TV, desc: "TV - Gotham"}
|
||||
- {id: 919, cat: TV, desc: "TV - Graceland"}
|
||||
- {id: 955, cat: TV, desc: "TV - Gracepoint"}
|
||||
- {id: 285, cat: TV, desc: "TV - Greys Anatomy"}
|
||||
- {id: 819, cat: TV, desc: "TV - Grimm"}
|
||||
- {id: 237, cat: TV, desc: "TV - Growing Up Fisher"}
|
||||
- {id: 340, cat: TV, desc: "TV - Guiding Light"}
|
||||
- {id: 866, cat: TV, desc: "TV - Guys With Kids"}
|
||||
- {id: 880, cat: TV, desc: "TV - Hannibal"}
|
||||
- {id: 813, cat: TV, desc: "TV - Happily Divorced"}
|
||||
- {id: 769, cat: TV, desc: "TV - Happy Endings"}
|
||||
- {id: 190, cat: TV, desc: "TV - Harald Schmidt"}
|
||||
- {id: 713, cat: TV, desc: "TV - Harrys Law"}
|
||||
- {id: 832, cat: TV, desc: "TV - Hart of Dixie"}
|
||||
- {id: 341, cat: TV, desc: "TV - Haunted"}
|
||||
- {id: 773, cat: TV, desc: "TV - Haven"}
|
||||
- {id: 712, cat: TV, desc: "TV - Hawaii Five-0"}
|
||||
- {id: 781, cat: TV, desc: "TV - Helix"}
|
||||
- {id: 853, cat: TV, desc: "TV - Hell on Wheels"}
|
||||
- {id: 191, cat: TV, desc: "TV - Hells Kitchen"}
|
||||
- {id: 884, cat: TV, desc: "TV - Hemlock Grove"}
|
||||
- {id: 342, cat: TV, desc: "TV - Hercules"}
|
||||
- {id: 556, cat: TV, desc: "TV - Heroes"}
|
||||
- {id: 343, cat: TV, desc: "TV - Hex"}
|
||||
- {id: 192, cat: TV, desc: "TV - Hogans Heroes"}
|
||||
- {id: 588, cat: TV, desc: "TV - Hollands Hoop"}
|
||||
- {id: 755, cat: TV, desc: "TV - Homeland"}
|
||||
- {id: 812, cat: TV, desc: "TV - Hostages"}
|
||||
- {id: 684, cat: TV, desc: "TV - Hot in Cleveland"}
|
||||
- {id: 286, cat: TV, desc: "TV - House"}
|
||||
- {id: 913, cat: TV, desc: "TV - House Of Cards"}
|
||||
- {id: 287, cat: TV, desc: "TV - How I Met Your Mother"}
|
||||
- {id: 568, cat: TV, desc: "TV - How Its Made"}
|
||||
- {id: 893, cat: TV, desc: "TV - How to Live with Your Parents"}
|
||||
- {id: 288, cat: TV, desc: "TV - Howard Stern"}
|
||||
- {id: 132, cat: TV, desc: "TV - Huff"}
|
||||
- {id: 345, cat: TV, desc: "TV - Humor Amarillo"}
|
||||
- {id: 756, cat: TV, desc: "TV - Hung"}
|
||||
- {id: 637, cat: TV, desc: "TV - Hustle"}
|
||||
- {id: 346, cat: TV, desc: "TV - In Justice"}
|
||||
- {id: 685, cat: TV, desc: "TV - In Plain Sight"}
|
||||
- {id: 582, cat: TV, desc: "TV - Ink Master"}
|
||||
- {id: 347, cat: TV, desc: "TV - Inked"}
|
||||
- {id: 965, cat: TV, desc: "TV - Inside MMA"}
|
||||
- {id: 873, cat: TV, desc: "TV - Intelligence US"}
|
||||
- {id: 240, cat: TV, desc: "TV - Into the West"}
|
||||
- {id: 166, cat: TV, desc: "TV - Iron Chef"}
|
||||
- {id: 289, cat: TV, desc: "TV - Invasion"}
|
||||
- {id: 817, cat: TV, desc: "TV - Ironside"}
|
||||
- {id: 772, cat: TV, desc: "TV - Its Always Sunny in Philadelphia"}
|
||||
- {id: 988, cat: TV, desc: "TV - iZombie"}
|
||||
- {id: 991, cat: TV, desc: "TV - Jane the Virgin"}
|
||||
- {id: 290, cat: TV, desc: "TV - Jay Leno"}
|
||||
- {id: 763, cat: TV, desc: "TV - Jersey Shore"}
|
||||
- {id: 177, cat: TV, desc: "TV - Joe Rogan Questions Everything"}
|
||||
- {id: 110, cat: TV, desc: "TV - Joey"}
|
||||
- {id: 196, cat: TV, desc: "TV - Justice League Unlimited"}
|
||||
- {id: 686, cat: TV, desc: "TV - Justified"}
|
||||
- {id: 412, cat: TV, desc: "TV - kabachitare!"}
|
||||
- {id: 738, cat: TV, desc: "TV - Killer Contact"}
|
||||
- {id: 349, cat: TV, desc: "TV - Killer Instinct"}
|
||||
- {id: 197, cat: TV, desc: "TV - Kim Possible"}
|
||||
- {id: 741, cat: TV, desc: "TV - King"}
|
||||
- {id: 933, cat: TV, desc: "TV - King and Maxwel"}
|
||||
- {id: 350, cat: TV, desc: "TV - King Of The Hill"}
|
||||
- {id: 351, cat: TV, desc: "TV - Kitchen Confidential"}
|
||||
- {id: 790, cat: TV, desc: "TV - Kitchen Nightmares US"}
|
||||
- {id: 348, cat: TV, desc: "TV - Kolchak The Night Stalker"}
|
||||
- {id: 241, cat: TV, desc: "TV - Koot en Bie"}
|
||||
- {id: 198, cat: TV, desc: "TV - Kung Fu"}
|
||||
- {id: 199, cat: TV, desc: "TV - La Femme Nikita"}
|
||||
- {id: 570, cat: TV, desc: "TV - LA Ink"}
|
||||
- {id: 242, cat: TV, desc: "TV - Laguna Beach"}
|
||||
- {id: 130, cat: TV, desc: "TV - Las Vegas"}
|
||||
- {id: 843, cat: TV, desc: "TV - Last Man Standing"}
|
||||
- {id: 867, cat: TV, desc: "TV - Last Resort"}
|
||||
- {id: 200, cat: TV, desc: "TV - Late Night with Conan O'Brien"}
|
||||
- {id: 115, cat: TV, desc: "TV - Law And Order"}
|
||||
- {id: 591, cat: TV, desc: "TV - Law and Order UK"}
|
||||
- {id: 243, cat: TV, desc: "TV - Le Cameleon"}
|
||||
- {id: 578, cat: TV, desc: "TV - Legend of the Seeker"}
|
||||
- {id: 590, cat: TV, desc: "TV - Legends"}
|
||||
- {id: 898, cat: TV, desc: "TV - Legit"}
|
||||
- {id: 638, cat: TV, desc: "TV - Level3"}
|
||||
- {id: 656, cat: TV, desc: "TV - Leverage"}
|
||||
- {id: 618, cat: TV, desc: "TV - Lie To Me"}
|
||||
- {id: 650, cat: TV, desc: "TV - Life"}
|
||||
- {id: 353, cat: TV, desc: "TV - Life on Mars"}
|
||||
- {id: 716, cat: TV, desc: "TV - Lights Out"}
|
||||
- {id: 244, cat: TV, desc: "TV - Line Of Fire"}
|
||||
- {id: 504, cat: TV, desc: "TV - Little Britain"}
|
||||
- {id: 665, cat: TV, desc: "TV - Little Mosque on the Prairie"}
|
||||
- {id: 148, cat: TV, desc: "TV - Long Island Medium"}
|
||||
- {id: 914, cat: TV, desc: "TV - Longmire"}
|
||||
- {id: 354, cat: TV, desc: "TV - Los Serrano"}
|
||||
- {id: 111, cat: TV, desc: "TV - Lost"}
|
||||
- {id: 314, cat: TV, desc: "TV - Lost Girl"}
|
||||
- {id: 858, cat: TV, desc: "TV - Louie"}
|
||||
- {id: 726, cat: TV, desc: "TV - Love Bites"}
|
||||
- {id: 937, cat: TV, desc: "TV - Low Winter Sun"}
|
||||
- {id: 956, cat: TV, desc: "TV - Lucha Underground"}
|
||||
- {id: 980, cat: TV, desc: "TV - Lucifer"}
|
||||
- {id: 503, cat: TV, desc: "TV - Lucky Louie"}
|
||||
- {id: 687, cat: TV, desc: "TV - Luther"}
|
||||
- {id: 157, cat: TV, desc: "TV - MacGyver"}
|
||||
- {id: 705, cat: TV, desc: "TV - Mad Love"}
|
||||
- {id: 826, cat: TV, desc: "TV - Mad Men"}
|
||||
- {id: 869, cat: TV, desc: "TV - Made in Jersey"}
|
||||
- {id: 355, cat: TV, desc: "TV - MADtv"}
|
||||
- {id: 871, cat: TV, desc: "TV - Major Crimes"}
|
||||
- {id: 667, cat: TV, desc: "TV - Make It or Break It"}
|
||||
- {id: 357, cat: TV, desc: "TV - Malcolm In The Middle"}
|
||||
- {id: 662, cat: TV, desc: "TV - Man vs Wild"}
|
||||
- {id: 759, cat: TV, desc: "TV - Marvels Agents of S.H.I.E.L.D"}
|
||||
- {id: 910, cat: TV, desc: "TV - MasterChef US"}
|
||||
- {id: 358, cat: TV, desc: "TV - Masters Of Horror"}
|
||||
- {id: 824, cat: TV, desc: "TV - Masters of Sex"}
|
||||
- {id: 291, cat: TV, desc: "TV - Medium"}
|
||||
- {id: 617, cat: TV, desc: "TV - Melrose Place"}
|
||||
- {id: 688, cat: TV, desc: "TV - Memphis Beat"}
|
||||
- {id: 905, cat: TV, desc: "TV - Men at Work"}
|
||||
- {id: 645, cat: TV, desc: "TV - Men of a Certain Age"}
|
||||
- {id: 633, cat: TV, desc: "TV - Mercy"}
|
||||
- {id: 579, cat: TV, desc: "TV - Merlin"}
|
||||
- {id: 359, cat: TV, desc: "TV - Miami Ink"}
|
||||
- {id: 825, cat: TV, desc: "TV - Midsomer Murders"}
|
||||
- {id: 783, cat: TV, desc: "TV - Mike and Molly"}
|
||||
- {id: 823, cat: TV, desc: "TV - Mind Games"}
|
||||
- {id: 246, cat: TV, desc: "TV - Mind of Mencia"}
|
||||
- {id: 313, cat: TV, desc: "TV - Misfits"}
|
||||
- {id: 842, cat: TV, desc: "TV - Missing"}
|
||||
- {id: 647, cat: TV, desc: "TV - Mistresses US"}
|
||||
- {id: 179, cat: TV, desc: "TV - Mixology"}
|
||||
- {id: 632, cat: TV, desc: "TV - Modern Family"}
|
||||
- {id: 245, cat: TV, desc: "TV - Modern Marvels"}
|
||||
- {id: 398, cat: TV, desc: "TV - Mom"}
|
||||
- {id: 201, cat: TV, desc: "TV - Monk"}
|
||||
- {id: 361, cat: TV, desc: "TV - Monty Pythons Flying Circus"}
|
||||
- {id: 907, cat: TV, desc: "TV - Motive"}
|
||||
- {id: 247, cat: TV, desc: "TV - Mr Bean"}
|
||||
- {id: 992, cat: TV, desc: "TV - Mr. Robot"}
|
||||
- {id: 356, cat: TV, desc: "TV - MST3K"}
|
||||
- {id: 292, cat: TV, desc: "TV - My Favorite Martian"}
|
||||
- {id: 792, cat: TV, desc: "TV - My Ghost Story"}
|
||||
- {id: 999, cat: TV, desc: "TV - My Little Pony - Friendship is Magic"}
|
||||
- {id: 362, cat: TV, desc: "TV - My Name Is Earl"}
|
||||
- {id: 202, cat: TV, desc: "TV - My Restaurant Rules"}
|
||||
- {id: 193, cat: TV, desc: "TV - Mythbusters"}
|
||||
- {id: 940, cat: TV, desc: "TV - Naked And Afraid"}
|
||||
- {id: 203, cat: TV, desc: "TV - NASA 50 Years Of Space Exploration"}
|
||||
- {id: 899, cat: TV, desc: "TV - Nashville"}
|
||||
- {id: 636, cat: TV, desc: "TV - National Geographic"}
|
||||
- {id: 120, cat: TV, desc: "TV - NCIS"}
|
||||
- {id: 920, cat: TV, desc: "TV - Necessary Roughness"}
|
||||
- {id: 841, cat: TV, desc: "TV - New Girl"}
|
||||
- {id: 957, cat: TV, desc: "TV - New Japan Pro Wrestling"}
|
||||
- {id: 311, cat: TV, desc: "TV - NewGamePlus"}
|
||||
- {id: 363, cat: TV, desc: "TV - Night Stalker"}
|
||||
- {id: 722, cat: TV, desc: "TV - Nikita"}
|
||||
- {id: 293, cat: TV, desc: "TV - Nip Tuck"}
|
||||
- {id: 710, cat: TV, desc: "TV - No Ordinary Family"}
|
||||
- {id: 294, cat: TV, desc: "TV - Numb3rs"}
|
||||
- {id: 689, cat: TV, desc: "TV - Nurse Jackie"}
|
||||
- {id: 703, cat: TV, desc: "TV - Off the Map"}
|
||||
- {id: 833, cat: TV, desc: "TV - Once Upon a Time Once"}
|
||||
- {id: 364, cat: TV, desc: "TV - One Tree Hill"}
|
||||
- {id: 424, cat: TV, desc: "TV - Only Fools And Horses"}
|
||||
- {id: 935, cat: TV, desc: "TV - Orange Is The New Black"}
|
||||
- {id: 881, cat: TV, desc: "TV - Orphan Black"}
|
||||
- {id: 113, cat: TV, desc: "TV - Other"}
|
||||
- {id: 365, cat: TV, desc: "TV - Out of Practice S01E"}
|
||||
- {id: 248, cat: TV, desc: "TV - Outer Limits"}
|
||||
- {id: 646, cat: TV, desc: "TV - Outer Space Astronauts"}
|
||||
- {id: 336, cat: TV, desc: "TV - Outlander"}
|
||||
- {id: 723, cat: TV, desc: "TV - Outsourced"}
|
||||
- {id: 249, cat: TV, desc: "TV - Over There"}
|
||||
- {id: 757, cat: TV, desc: "TV - Pan Am"}
|
||||
- {id: 640, cat: TV, desc: "TV - Paradox"}
|
||||
- {id: 778, cat: TV, desc: "TV - Parenthood"}
|
||||
- {id: 613, cat: TV, desc: "TV - Parks and Recreation"}
|
||||
- {id: 250, cat: TV, desc: "TV - Passions"}
|
||||
- {id: 414, cat: TV, desc: "TV - PBS NOW"}
|
||||
- {id: 690, cat: TV, desc: "TV - Penn and Teller Bullshit"}
|
||||
- {id: 945, cat: TV, desc: "TV - Penny Dreadful"}
|
||||
- {id: 927, cat: TV, desc: "TV - Perception"}
|
||||
- {id: 785, cat: TV, desc: "TV - Person of Interest"}
|
||||
- {id: 366, cat: TV, desc: "TV - Phil of the Future"}
|
||||
- {id: 204, cat: TV, desc: "TV - Pimp My Ride"}
|
||||
- {id: 967, cat: TV, desc: "TV - Player Attack"}
|
||||
- {id: 427, cat: TV, desc: "TV - Poker"}
|
||||
- {id: 691, cat: TV, desc: "TV - Pretty Little Liars"}
|
||||
- {id: 784, cat: TV, desc: "TV - Prime Suspect US"}
|
||||
- {id: 734, cat: TV, desc: "TV - Primeval"}
|
||||
- {id: 229, cat: TV, desc: "TV - Prison Break"}
|
||||
- {id: 692, cat: TV, desc: "TV - Private Practice"}
|
||||
- {id: 368, cat: TV, desc: "TV - Project Runway"}
|
||||
- {id: 663, cat: TV, desc: "TV - Psych"}
|
||||
- {id: 205, cat: TV, desc: "TV - Punkd"}
|
||||
- {id: 803, cat: TV, desc: "TV - QI"}
|
||||
- {id: 982, cat: TV, desc: "TV - Quantico"}
|
||||
- {id: 251, cat: TV, desc: "TV - Quantum Leap"}
|
||||
- {id: 993, cat: TV, desc: "TV - Queen of the South"}
|
||||
- {id: 252, cat: TV, desc: "TV - Queer as Folk"}
|
||||
- {id: 714, cat: TV, desc: "TV - Raising Hope"}
|
||||
- {id: 317, cat: TV, desc: "TV - Ravenswood"}
|
||||
- {id: 936, cat: TV, desc: "TV - Ray Donovan"}
|
||||
- {id: 594, cat: TV, desc: "TV - Ray Mears Northern Wilderness"}
|
||||
- {id: 822, cat: TV, desc: "TV - Real Time with Bill Maher"}
|
||||
- {id: 369, cat: TV, desc: "TV - Reba"}
|
||||
- {id: 885, cat: TV, desc: "TV - Rectify"}
|
||||
- {id: 206, cat: TV, desc: "TV - Red Dwarf"}
|
||||
- {id: 906, cat: TV, desc: "TV - Red Widow"}
|
||||
- {id: 117, cat: TV, desc: "TV - ReGenesis"}
|
||||
- {id: 854, cat: TV, desc: "TV - Reign"}
|
||||
- {id: 370, cat: TV, desc: "TV - Related"}
|
||||
- {id: 327, cat: TV, desc: "TV - Remedy"}
|
||||
- {id: 253, cat: TV, desc: "TV - Remington Steele"}
|
||||
- {id: 254, cat: TV, desc: "TV - Reno 911"}
|
||||
- {id: 207, cat: TV, desc: "TV - Rescue Me"}
|
||||
- {id: 576, cat: TV, desc: "TV - Resurrection"}
|
||||
- {id: 295, cat: TV, desc: "TV - Reunion"}
|
||||
- {id: 208, cat: TV, desc: "TV - Revelations"}
|
||||
- {id: 760, cat: TV, desc: "TV - Revenge"}
|
||||
- {id: 859, cat: TV, desc: "TV - Revolution"}
|
||||
- {id: 312, cat: TV, desc: "TV - Rewind"}
|
||||
- {id: 768, cat: TV, desc: "TV - Ringer"}
|
||||
- {id: 604, cat: TV, desc: "TV - Rip Off Britain"}
|
||||
- {id: 693, cat: TV, desc: "TV - River Monsters"}
|
||||
- {id: 929, cat: TV, desc: "TV - Rizzoli and Isles"}
|
||||
- {id: 209, cat: TV, desc: "TV - Robot Chicken"}
|
||||
- {id: 888, cat: TV, desc: "TV - Rogue"}
|
||||
- {id: 944, cat: TV, desc: "TV - ROH-Wrestling"}
|
||||
- {id: 255, cat: TV, desc: "TV - Rome"}
|
||||
- {id: 849, cat: TV, desc: "TV - Rookie Blue"}
|
||||
- {id: 694, cat: TV, desc: "TV - Royal Pains"}
|
||||
- {id: 695, cat: TV, desc: "TV - Rubicon"}
|
||||
- {id: 807, cat: TV, desc: "TV - Rules of Engagement"}
|
||||
- {id: 372, cat: TV, desc: "TV - Ruri no Shima"}
|
||||
- {id: 892, cat: TV, desc: "TV - Rush"}
|
||||
- {id: 555, cat: TV, desc: "TV - Russian TV programs"}
|
||||
- {id: 789, cat: TV, desc: "TV - Salem"}
|
||||
- {id: 605, cat: TV, desc: "TV - Sanctuary"}
|
||||
- {id: 776, cat: TV, desc: "TV - Satisfaction US"}
|
||||
- {id: 373, cat: TV, desc: "TV - Saturday Night Live"}
|
||||
- {id: 915, cat: TV, desc: "TV - Save Me"}
|
||||
- {id: 696, cat: TV, desc: "TV - Saving Grace"}
|
||||
- {id: 931, cat: TV, desc: "TV - Saving Hope"}
|
||||
- {id: 844, cat: TV, desc: "TV - Scandal"}
|
||||
- {id: 344, cat: TV, desc: "TV - Scorpion"}
|
||||
- {id: 987, cat: TV, desc: "TV - Scream"}
|
||||
- {id: 138, cat: TV, desc: "TV - Scrubs"}
|
||||
- {id: 304, cat: TV, desc: "TV - Sean Saves The World"}
|
||||
- {id: 715, cat: TV, desc: "TV - Secret Diary Of A Call Girl"}
|
||||
- {id: 210, cat: TV, desc: "TV - Seinfeld"}
|
||||
- {id: 296, cat: TV, desc: "TV - Sex and The City"}
|
||||
- {id: 708, cat: TV, desc: "TV - Shameless"}
|
||||
- {id: 375, cat: TV, desc: "TV - Sin Rastro"}
|
||||
- {id: 737, cat: TV, desc: "TV - Single Ladies"}
|
||||
- {id: 211, cat: TV, desc: "TV - Six Feet Under"}
|
||||
- {id: 697, cat: TV, desc: "TV - Skins"}
|
||||
- {id: 376, cat: TV, desc: "TV - Sleeper Cell"}
|
||||
- {id: 112, cat: TV, desc: "TV - Sleepy Hollow"}
|
||||
- {id: 256, cat: TV, desc: "TV - Sliders"}
|
||||
- {id: 137, cat: TV, desc: "TV - Smallville"}
|
||||
- {id: 830, cat: TV, desc: "TV - Smash"}
|
||||
- {id: 649, cat: TV, desc: "TV - So You Think You Can Dance"}
|
||||
- {id: 569, cat: TV, desc: "TV - Sons of Anarchy"}
|
||||
- {id: 815, cat: TV, desc: "TV - Sons of Guns"}
|
||||
- {id: 212, cat: TV, desc: "TV - South Park"}
|
||||
- {id: 718, cat: TV, desc: "TV - Southland"}
|
||||
- {id: 257, cat: TV, desc: "TV - Space 1999"}
|
||||
- {id: 297, cat: TV, desc: "TV - Space Above and Beyond"}
|
||||
- {id: 631, cat: TV, desc: "TV - Spartacus"}
|
||||
- {id: 845, cat: TV, desc: "TV - Spike TV"}
|
||||
- {id: 607, cat: TV, desc: "TV - Spooks"}
|
||||
- {id: 131, cat: TV, desc: "TV - Sports Illustrated"}
|
||||
- {id: 159, cat: TV, desc: "TV - Sports related"}
|
||||
- {id: 378, cat: TV, desc: "TV - Stacked"}
|
||||
- {id: 379, cat: TV, desc: "TV - Star Trek"}
|
||||
- {id: 563, cat: TV, desc: "TV - Star Wars The Clone Wars"}
|
||||
- {id: 615, cat: TV, desc: "TV - Star-Crossed"}
|
||||
- {id: 139, cat: TV, desc: "TV - Star-Trek Enterprise"}
|
||||
- {id: 144, cat: TV, desc: "TV - Star-Trek The Next Generation"}
|
||||
- {id: 380, cat: TV, desc: "TV - Stargate"}
|
||||
- {id: 123, cat: TV, desc: "TV - Stargate Atlantis"}
|
||||
- {id: 124, cat: TV, desc: "TV - StarGate SG1"}
|
||||
- {id: 562, cat: TV, desc: "TV - Stargate Universe"}
|
||||
- {id: 258, cat: TV, desc: "TV - Starved"}
|
||||
- {id: 213, cat: TV, desc: "TV - Stella"}
|
||||
- {id: 614, cat: TV, desc: "TV - Steven Seagal Lawman"}
|
||||
- {id: 381, cat: TV, desc: "TV - Still Standing"}
|
||||
- {id: 857, cat: TV, desc: "TV - Strike Back"}
|
||||
- {id: 528, cat: TV, desc: "TV - Studio 60 on the Sunset Strip"}
|
||||
- {id: 838, cat: TV, desc: "TV - Suburgatory"}
|
||||
- {id: 761, cat: TV, desc: "TV - Suits"}
|
||||
- {id: 214, cat: TV, desc: "TV - Summerland"}
|
||||
- {id: 400, cat: TV, desc: "TV - Super Fun Night"}
|
||||
- {id: 298, cat: TV, desc: "TV - Supernatural"}
|
||||
- {id: 299, cat: TV, desc: "TV - Surface"}
|
||||
- {id: 382, cat: TV, desc: "TV - Survivor"}
|
||||
- {id: 215, cat: TV, desc: "TV - Survivors"}
|
||||
- {id: 847, cat: TV, desc: "TV - Swamp People"}
|
||||
- {id: 863, cat: TV, desc: "TV - Switched at Birth"}
|
||||
- {id: 153, cat: TV, desc: "TV - Tattoo Nightmares"}
|
||||
- {id: 217, cat: TV, desc: "TV - Teen Titans"}
|
||||
- {id: 731, cat: TV, desc: "TV - Teen Wolf"}
|
||||
- {id: 764, cat: TV, desc: "TV - Terra Nova"}
|
||||
- {id: 119, cat: TV, desc: "TV - That 70s Show"}
|
||||
- {id: 316, cat: TV, desc: "TV - The 100"}
|
||||
- {id: 168, cat: TV, desc: "TV - The 4400"}
|
||||
- {id: 300, cat: TV, desc: "TV - The Adventures of Sherlock Holmes"}
|
||||
- {id: 185, cat: TV, desc: "TV - The After"}
|
||||
- {id: 383, cat: TV, desc: "TV - The Amazing Race"}
|
||||
- {id: 887, cat: TV, desc: "TV - The Americans"}
|
||||
- {id: 301, cat: TV, desc: "TV - The Apprentice"}
|
||||
- {id: 384, cat: TV, desc: "TV - The Bernie Mac Show"}
|
||||
- {id: 583, cat: TV, desc: "TV - The Big Bang Theory"}
|
||||
- {id: 829, cat: TV, desc: "TV - The Big C"}
|
||||
- {id: 572, cat: TV, desc: "TV - The Biggest Loser"}
|
||||
- {id: 581, cat: TV, desc: "TV - The Blacklist"}
|
||||
- {id: 410, cat: TV, desc: "TV - The Boondocks"}
|
||||
- {id: 608, cat: TV, desc: "TV - The Border"}
|
||||
- {id: 775, cat: TV, desc: "TV - The Borgias"}
|
||||
- {id: 923, cat: TV, desc: "TV - The Bridge US"}
|
||||
- {id: 711, cat: TV, desc: "TV - The Cape"}
|
||||
- {id: 730, cat: TV, desc: "TV - The Carrie Diaries"}
|
||||
- {id: 586, cat: TV, desc: "TV - The Cleveland Show"}
|
||||
- {id: 896, cat: TV, desc: "TV - The Client List"}
|
||||
- {id: 218, cat: TV, desc: "TV - The Closer"}
|
||||
- {id: 272, cat: TV, desc: "TV - The Colbert Report"}
|
||||
- {id: 219, cat: TV, desc: "TV - The Comeback"}
|
||||
- {id: 510, cat: TV, desc: "TV - The Contender"}
|
||||
- {id: 758, cat: TV, desc: "TV - The Crazy Ones"}
|
||||
- {id: 114, cat: TV, desc: "TV - The Daily Show"}
|
||||
- {id: 856, cat: TV, desc: "TV - The Dead Files"}
|
||||
- {id: 220, cat: TV, desc: "TV - The Dead Zone"}
|
||||
- {id: 189, cat: TV, desc: "TV - The Divide"}
|
||||
- {id: 386, cat: TV, desc: "TV - The Dog Whisperer"}
|
||||
- {id: 702, cat: TV, desc: "TV - The Event"}
|
||||
- {id: 610, cat: TV, desc: "TV - The F Word"}
|
||||
- {id: 639, cat: TV, desc: "TV - The Family"}
|
||||
- {id: 835, cat: TV, desc: "TV - The Finder"}
|
||||
- {id: 834, cat: TV, desc: "TV - The Firm"}
|
||||
- {id: 973, cat: TV, desc: "TV - The Flash"}
|
||||
- {id: 877, cat: TV, desc: "TV - The Following"}
|
||||
- {id: 635, cat: TV, desc: "TV - The Forgotten"}
|
||||
- {id: 932, cat: TV, desc: "TV - The Fosters"}
|
||||
- {id: 816, cat: TV, desc: "TV - The Game"}
|
||||
- {id: 766, cat: TV, desc: "TV - The Gates"}
|
||||
- {id: 259, cat: TV, desc: "TV - The Girls Next Door"}
|
||||
- {id: 740, cat: TV, desc: "TV - The Glades"}
|
||||
- {id: 587, cat: TV, desc: "TV - The Goldbergs"}
|
||||
- {id: 648, cat: TV, desc: "TV - The Good Wife"}
|
||||
- {id: 912, cat: TV, desc: "TV - The Goodwin Games"}
|
||||
- {id: 278, cat: TV, desc: "TV - The Haunting Of"}
|
||||
- {id: 903, cat: TV, desc: "TV - The Hero"}
|
||||
- {id: 655, cat: TV, desc: "TV - The Hills"}
|
||||
- {id: 221, cat: TV, desc: "TV - The Inside"}
|
||||
- {id: 595, cat: TV, desc: "TV - The Jeff Dunham Show"}
|
||||
- {id: 387, cat: TV, desc: "TV - The Jetsons"}
|
||||
- {id: 827, cat: TV, desc: "TV - The Killing"}
|
||||
- {id: 388, cat: TV, desc: "TV - The King Of Queens"}
|
||||
- {id: 321, cat: TV, desc: "TV - The Knick"}
|
||||
- {id: 271, cat: TV, desc: "TV - The L Word"}
|
||||
- {id: 609, cat: TV, desc: "TV - The League"}
|
||||
- {id: 897, cat: TV, desc: "TV - The Leftovers"}
|
||||
- {id: 808, cat: TV, desc: "TV - The Life and Times of Tim"}
|
||||
- {id: 924, cat: TV, desc: "TV - The Listener"}
|
||||
- {id: 222, cat: TV, desc: "TV - The Lone Gunmen"}
|
||||
- {id: 152, cat: TV, desc: "TV - The Lost World"}
|
||||
- {id: 643, cat: TV, desc: "TV - The Mentalist"}
|
||||
- {id: 878, cat: TV, desc: "TV - The Michael J Fox"}
|
||||
- {id: 630, cat: TV, desc: "TV - The Middle"}
|
||||
- {id: 405, cat: TV, desc: "TV - The Millers"}
|
||||
- {id: 901, cat: TV, desc: "TV - The Mindy Project"}
|
||||
- {id: 860, cat: TV, desc: "TV - The Mob Doctor"}
|
||||
- {id: 870, cat: TV, desc: "TV - The Musketeers"}
|
||||
- {id: 239, cat: TV, desc: "TV - The Mysteries Of Laura"}
|
||||
- {id: 938, cat: TV, desc: "TV - The Newsroom"}
|
||||
- {id: 109, cat: TV, desc: "TV - The O.C."}
|
||||
- {id: 308, cat: TV, desc: "TV - The Office"}
|
||||
- {id: 319, cat: TV, desc: "TV - The Originals"}
|
||||
- {id: 392, cat: TV, desc: "TV - The Others"}
|
||||
- {id: 390, cat: TV, desc: "TV - The O`Reilly Factor"}
|
||||
- {id: 698, cat: TV, desc: "TV - The Pacific"}
|
||||
- {id: 302, cat: TV, desc: "TV - The PJs"}
|
||||
- {id: 567, cat: TV, desc: "TV - The Practice"}
|
||||
- {id: 260, cat: TV, desc: "TV - The Real World"}
|
||||
- {id: 176, cat: TV, desc: "TV - The Red Road"}
|
||||
- {id: 597, cat: TV, desc: "TV - The Replacements"}
|
||||
- {id: 664, cat: TV, desc: "TV - The Sci Fi Guys"}
|
||||
- {id: 393, cat: TV, desc: "TV - The Secret Adventures of Jules Verne"}
|
||||
- {id: 786, cat: TV, desc: "TV - The Secret Circle"}
|
||||
- {id: 668, cat: TV, desc: "TV - The Secret Life of the American Teenager"}
|
||||
- {id: 735, cat: TV, desc: "TV - The Shadow Line"}
|
||||
- {id: 223, cat: TV, desc: "TV - The Shield"}
|
||||
- {id: 125, cat: TV, desc: "TV - The Simpsons"}
|
||||
- {id: 423, cat: TV, desc: "TV - The Sopranos"}
|
||||
- {id: 333, cat: TV, desc: "TV - The Strain"}
|
||||
- {id: 236, cat: TV, desc: "TV - The Tomorrow People US"}
|
||||
- {id: 699, cat: TV, desc: "TV - The Tudors"}
|
||||
- {id: 611, cat: TV, desc: "TV - The Ultimate Fighter"}
|
||||
- {id: 320, cat: TV, desc: "TV - The Unexplained Files"}
|
||||
- {id: 721, cat: TV, desc: "TV - The Vampire Diaries"}
|
||||
- {id: 654, cat: TV, desc: "TV - The Venture Bros"}
|
||||
- {id: 725, cat: TV, desc: "TV - The Voice"}
|
||||
- {id: 720, cat: TV, desc: "TV - The Walking Dead"}
|
||||
- {id: 394, cat: TV, desc: "TV - The War At Home"}
|
||||
- {id: 116, cat: TV, desc: "TV - The West Wing"}
|
||||
- {id: 577, cat: TV, desc: "TV - The X Factor"}
|
||||
- {id: 425, cat: TV, desc: "TV - Thief"}
|
||||
- {id: 268, cat: TV, desc: "TV - Threshold"}
|
||||
- {id: 796, cat: TV, desc: "TV - Thundercats"}
|
||||
- {id: 216, cat: TV, desc: "TV - TLC Connections"}
|
||||
- {id: 904, cat: TV, desc: "TV - TNA-Wrestling"}
|
||||
- {id: 399, cat: TV, desc: "TV - Tonight Show With Jay Leno"}
|
||||
- {id: 616, cat: TV, desc: "TV - Top Chef"}
|
||||
- {id: 224, cat: TV, desc: "TV - Top Gear"}
|
||||
- {id: 942, cat: TV, desc: "TV - Top Shot"}
|
||||
- {id: 762, cat: TV, desc: "TV - Torchwood"}
|
||||
- {id: 836, cat: TV, desc: "TV - Touch"}
|
||||
- {id: 225, cat: TV, desc: "TV - Trailer Park Boys"}
|
||||
- {id: 1001, cat: TV, desc: "TV - Transformers Prime"}
|
||||
- {id: 733, cat: TV, desc: "TV - Treme"}
|
||||
- {id: 303, cat: TV, desc: "TV - Tripping the Rift"}
|
||||
- {id: 787, cat: TV, desc: "TV - Trophy Wife"}
|
||||
- {id: 565, cat: TV, desc: "TV - True Blood"}
|
||||
- {id: 180, cat: TV, desc: "TV - True Detective"}
|
||||
- {id: 727, cat: TV, desc: "TV - Turn"}
|
||||
- {id: 261, cat: TV, desc: "TV - Twin Peaks"}
|
||||
- {id: 930, cat: TV, desc: "TV - Twisted"}
|
||||
- {id: 401, cat: TV, desc: "TV - Two And A Half Men"}
|
||||
- {id: 337, cat: TV, desc: "TV - Tyrant"}
|
||||
- {id: 793, cat: TV, desc: "TV - UFC"}
|
||||
- {id: 814, cat: TV, desc: "TV - Ugly Americans"}
|
||||
- {id: 559, cat: TV, desc: "TV - Ugly Betty"}
|
||||
- {id: 155, cat: TV, desc: "TV - UK"}
|
||||
- {id: 934, cat: TV, desc: "TV - Under the Dome"}
|
||||
- {id: 791, cat: TV, desc: "TV - Underbelly"}
|
||||
- {id: 706, cat: TV, desc: "TV - Undercover Boss"}
|
||||
- {id: 777, cat: TV, desc: "TV - Unforgettable"}
|
||||
- {id: 129, cat: TV, desc: "TV - Unscripted"}
|
||||
- {id: 739, cat: TV, desc: "TV - Unsealed Alien Files"}
|
||||
- {id: 226, cat: TV, desc: "TV - Unsolved Mysteries"}
|
||||
- {id: 868, cat: TV, desc: "TV - Up All Night"}
|
||||
- {id: 262, cat: TV, desc: "TV - Urgences"}
|
||||
- {id: 566, cat: TV, desc: "TV - V"}
|
||||
- {id: 895, cat: TV, desc: "TV - Veep"}
|
||||
- {id: 864, cat: TV, desc: "TV - Vegas"}
|
||||
- {id: 121, cat: TV, desc: "TV - Veronica Mars"}
|
||||
- {id: 908, cat: TV, desc: "TV - Vice"}
|
||||
- {id: 402, cat: TV, desc: "TV - Viewtiful Joe"}
|
||||
- {id: 799, cat: TV, desc: "TV - Vikings"}
|
||||
- {id: 227, cat: TV, desc: "TV - Viva La Bam"}
|
||||
- {id: 263, cat: TV, desc: "TV - Wanted"}
|
||||
- {id: 593, cat: TV, desc: "TV - Warehouse 13"}
|
||||
- {id: 995, cat: TV, desc: "TV - Wayward Pines"}
|
||||
- {id: 264, cat: TV, desc: "TV - Weeds"}
|
||||
- {id: 404, cat: TV, desc: "TV - Weird U S"}
|
||||
- {id: 909, cat: TV, desc: "TV - Wentworth"}
|
||||
- {id: 596, cat: TV, desc: "TV - When Ghosts Attack"}
|
||||
- {id: 575, cat: TV, desc: "TV - White Collar"}
|
||||
- {id: 406, cat: TV, desc: "TV - Whose Line Is It Anyway"}
|
||||
- {id: 918, cat: TV, desc: "TV - Wilfred US"}
|
||||
- {id: 135, cat: TV, desc: "TV - Will And Grace"}
|
||||
- {id: 673, cat: TV, desc: "TV - Witches of East End"}
|
||||
- {id: 408, cat: TV, desc: "TV - Without A Trace"}
|
||||
- {id: 800, cat: TV, desc: "TV - Workaholics"}
|
||||
- {id: 127, cat: TV, desc: "TV - WWE - Wrestling"}
|
||||
- {id: 228, cat: TV, desc: "TV - X Files"}
|
||||
- {id: 770, cat: TV, desc: "TV - X-Men"}
|
||||
- {id: 265, cat: TV, desc: "TV - Young and the Restless"}
|
||||
- {id: 801, cat: TV, desc: "TV - Young Justice"}
|
||||
- {id: 889, cat: TV, desc: "TV - Zero Hour US"}
|
||||
- {id: 1025, cat: TV, desc: "TV - HEVC/x265"}
|
||||
- {id: 1026, cat: TV, desc: "TV - Divx/Xvid"}
|
||||
- {id: 1027, cat: TV, desc: "TV - DVD"}
|
||||
- {id: 1028, cat: TV, desc: "TV/HD - HD"}
|
||||
- {id: 1029, cat: TV, desc: "TV - SVCD/VCD"}
|
||||
|
||||
#Apps
|
||||
- {id: 7, cat: PC, desc: "Software"}
|
||||
- {id: 416, cat: PC/Phone-Other, desc: "Software - Mobile"}
|
||||
- {id: 532, cat: PC, desc: "Software - KeyGen / Tools"}
|
||||
- {id: 17, cat: PC, desc: "Software - Linux"}
|
||||
- {id: 27, cat: PC/Mac, desc: "Software - Mac"}
|
||||
- {id: 232, cat: PC/Phone-Other, desc: "Software - Mobile phones"}
|
||||
- {id: 18, cat: PC, desc: "Software - Other operating systems"}
|
||||
- {id: 19, cat: PC, desc: "Software - Palm, PocketPC and IPAQ"}
|
||||
- {id: 20, cat: PC, desc: "Software - Windows - CD/DVD Tools"}
|
||||
- {id: 25, cat: PC, desc: "Software - Windows - Other"}
|
||||
- {id: 21, cat: PC, desc: "Software - Windows - Photo Editing"}
|
||||
- {id: 22, cat: PC, desc: "Software - Windows - Security"}
|
||||
- {id: 23, cat: PC, desc: "Software - Windows - Sound Editing"}
|
||||
- {id: 24, cat: PC, desc: "Software - Windows - Video Apps"}
|
||||
|
||||
#Games
|
||||
- {id: 3, cat: PC/Games, desc: "Games"}
|
||||
- {id: 136, cat: PC/Games, desc: "Games - fixes/patches"}
|
||||
- {id: 422, cat: PC/Games, desc: "Games - Other"}
|
||||
- {id: 26, cat: PC/Games, desc: "Games - Mac"}
|
||||
- {id: 231, cat: Console, desc: "Games - Mobile phones"}
|
||||
- {id: 627, cat: Console/NDS, desc: "Games - Nintendo DS"}
|
||||
- {id: 11, cat: Console, desc: "Games - PS 2"}
|
||||
- {id: 700, cat: Console/PS3, desc: "Games - PS 3"}
|
||||
- {id: 12, cat: Console, desc: "Games - PS X"}
|
||||
- {id: 158, cat: Console/PSP, desc: "Games - PSP"}
|
||||
- {id: 13, cat: Console, desc: "Games - ROMS/Retro"}
|
||||
- {id: 15, cat: Console, desc: "Games - Sega Saturn"}
|
||||
- {id: 14, cat: PC/Games, desc: "Games - Video Demonstrations"}
|
||||
- {id: 701, cat: Console/Wii, desc: "Games -Wii"}
|
||||
- {id: 421, cat: PC/Games, desc: "Games - Windows"}
|
||||
- {id: 10, cat: PC/Games, desc: "Games - Windows Kids Games"}
|
||||
- {id: 16, cat: Console/Xbox, desc: "Games - XBox"}
|
||||
- {id: 1017, cat: Console, desc: "Games - PS 1"}
|
||||
- {id: 1018, cat: Console/Xbox 360, desc: "Games - Xbox 360"}
|
||||
- {id: 1014, cat: Console/3DS, desc: "Games - Nintendo 3DS"}
|
||||
- {id: 1015, cat: Console, desc: "Games - Dreamcast"}
|
||||
- {id: 1016, cat: Console, desc: "Games - GameCube"}
|
||||
|
||||
#XXX
|
||||
- {id: 533, cat: XXX, desc: "XXX"}
|
||||
- {id: 943, cat: XXX, desc: "XXX - Animation/Hentai"}
|
||||
- {id: 553, cat: XXX/DVD, desc: "XXX - DVD"}
|
||||
- {id: 536, cat: XXX, desc: "XXX - Games"}
|
||||
- {id: 948, cat: XXX/x264, desc: "XXX - HD Video"}
|
||||
- {id: 535, cat: XXX/Imageset, desc: "XXX - Pictures"}
|
||||
- {id: 552, cat: XXX, desc: "XXX - Video"}
|
||||
- {id: 804, cat: XXX, desc: "XXX - Video 3D"}
|
||||
- {id: 970, cat: XXX, desc: "XXX - Virtual Reality"}
|
||||
- {id: 806, cat: XXX, desc: "XXX - Wallpapers"}
|
||||
|
||||
#Books
|
||||
- {id: 2, cat: Books, desc: "Books"}
|
||||
- {id: 625, cat: Books, desc: "Books - Adventure"}
|
||||
- {id: 51, cat: Books, desc: "Books - Audio books"}
|
||||
- {id: 848, cat: Books/Comics, desc: "Books - Comics"}
|
||||
- {id: 624, cat: Books, desc: "Books - Crime"}
|
||||
- {id: 623, cat: Books, desc: "Books - Drama"}
|
||||
- {id: 50, cat: Books/Ebook, desc: "Books - Ebooks"}
|
||||
- {id: 621, cat: Books, desc: "Books - Educational"}
|
||||
- {id: 622, cat: Books, desc: "Books - Horror"}
|
||||
- {id: 465, cat: Books/Magazines, desc: "Books - Magazines"}
|
||||
- {id: 1000, cat: Books, desc: "Books - Sexual Fitness and Education"}
|
||||
- {id: 626, cat: Books, desc: "Books - True Stories"}
|
||||
|
||||
#Other
|
||||
- {id: 6, cat: Other, desc: "Pictures"}
|
||||
- {id: 9, cat: Other, desc: "Other"}
|
||||
- {id: 53, cat: Other, desc: "Pictures - Other"}
|
||||
- {id: 52, cat: Other, desc: "Wallpapers"}
|
||||
- {id: 80, cat: Other, desc: "Other - Articles"}
|
||||
- {id: 143, cat: Other, desc: "Other - Comics"}
|
||||
- {id: 85, cat: Other, desc: "Other - Funny clips"}
|
||||
- {id: 81, cat: Other, desc: "Other - Manuals"}
|
||||
- {id: 83, cat: Other, desc: "Other - Other"}
|
||||
- {id: 413, cat: Other, desc: "Other - Radio shows"}
|
||||
- {id: 82, cat: Other, desc: "Other - Religion"}
|
||||
- {id: 874, cat: Other, desc: "Other - Subtitles"}
|
||||
- {id: 557, cat: Other, desc: "Other - Training "}
|
||||
- {id: 1021, cat: Other, desc: "Other - Tutorials"}
|
||||
- {id: 1022, cat: Other, desc: "Other - Sounds"}
|
||||
- {id: 1023, cat: Other, desc: "Other - Nulled Scripts"}
|
||||
|
||||
#Mobile
|
||||
- {id: 752, cat: PC/Phone-Other, desc: "Mobile - Games for Android"}
|
||||
- {id: 746, cat: PC/Phone-Other, desc: "Mobile - Games for Apple iPod, iPod Touch, iPad, iPhone"}
|
||||
- {id: 745, cat: PC/Phone-Other, desc: "Mobile - Games for Java"}
|
||||
- {id: 744, cat: PC/Phone-Other, desc: "Mobile - Games for Symbian"}
|
||||
- {id: 743, cat: PC/Phone-Other, desc: "Mobile - Games for Windows Mobile"}
|
||||
- {id: 517, cat: PC/Phone-Other, desc: "Mobile - Music"}
|
||||
- {id: 554, cat: PC/Phone-Other, desc: "Mobile - Other"}
|
||||
- {id: 748, cat: PC/Phone-Other, desc: "Mobile - Software - Other"}
|
||||
- {id: 972, cat: PC/Phone-Other, desc: "Mobile - Software for Android"}
|
||||
- {id: 749, cat: PC/Phone-Other, desc: "Mobile - Software for Apple iPad, iPhone, iPod Touch"}
|
||||
- {id: 747, cat: PC/Phone-Other, desc: "Mobile - Software for Windows Mobile"}
|
||||
- {id: 428, cat: PC/Phone-Other, desc: "Mobile - Tv"}
|
||||
- {id: 417, cat: PC/Phone-Other, desc: "Mobile - Video"}
|
||||
- {id: 750, cat: PC/Phone-Other, desc: "Mobile - Video for Apple iPad, iPhone, iPod Touch"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}search/?search={{ .Keywords}}{{else}}{{end}}"
|
||||
rows:
|
||||
selector: tr[class^="tlr"]
|
||||
fields:
|
||||
title:
|
||||
selector: td.tli a
|
||||
category:
|
||||
selector: td a[href^="/category/"]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: ["/", 2]
|
||||
details:
|
||||
selector: td.tli a
|
||||
attribute: href
|
||||
download:
|
||||
selector: td a[href^="magnet:?xt="]
|
||||
attribute: href
|
||||
date:
|
||||
selector: td:nth-last-of-type(5)
|
||||
filters:
|
||||
- name: timeago
|
||||
size:
|
||||
selector: td:nth-last-of-type(4)
|
||||
seeders:
|
||||
text: 0
|
||||
leechers:
|
||||
text: 0
|
||||
seeders:
|
||||
optional: true
|
||||
selector: td.sy
|
||||
leechers:
|
||||
optional: true
|
||||
selector: td.ly
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -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,15 +5,20 @@
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://ww2.gktorrent.com/
|
||||
- https://www.gktorrent.me/
|
||||
legacylinks:
|
||||
- https://www.gktorrent.org/
|
||||
- http://www.gktorrent.net/
|
||||
- https://www.gktorrent.com/ # they're forcing http
|
||||
- https://www.gktorrent.com/
|
||||
- http://www.gktorrent.com/
|
||||
- http://ww1.gktorrent.com/
|
||||
- http://ww2.gktorrent.com/ # they're forcing https
|
||||
- http://ww2.gktorrent.com/
|
||||
- https://ww2.gktorrent.com/
|
||||
- https://ww3.gktorrent.com/
|
||||
- http://www.gktorrent.net/
|
||||
- https://www.gktorrent.net/
|
||||
- https://ww4.gktorrent.com/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -79,6 +79,30 @@
|
||||
args: ([\d\.]+)
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
|
||||
- name: re_replace
|
||||
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"100% Free\"]": "0"
|
||||
@@ -87,4 +111,5 @@
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"Double upload\"]": "2"
|
||||
"i[data-original-title=\"Double Upload\"]": "2" # Global Double Upload
|
||||
"*": "1"
|
||||
|
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:
|
||||
|
@@ -70,7 +70,6 @@
|
||||
selector: img[alt="CAPTCHA"]
|
||||
input: imagestring
|
||||
inputs:
|
||||
logintype: "username"
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://hdtorrents.xyz/
|
||||
legacylinks:
|
||||
- http://hdtorrents.it/
|
||||
|
||||
caps:
|
||||
|
@@ -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
|
||||
|
@@ -6,99 +6,86 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.idope.site/
|
||||
legacylinks:
|
||||
- https://idope.top/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 0, cat: Other, desc: "Others"}
|
||||
- {id: 1, cat: Movies, desc: "Movies"}
|
||||
- {id: 2, cat: Other, desc: "Videos"}
|
||||
- {id: 3, cat: TV, desc: "TV"}
|
||||
- {id: 4, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 5, cat: XXX, desc: "XXX"}
|
||||
- {id: 6, cat: Audio, desc: "Music"}
|
||||
- {id: 7, cat: PC/Games, desc: "Games"}
|
||||
- {id: 8, cat: PC, desc: "Apps"}
|
||||
- {id: 9, cat: Books, desc: "Books"}
|
||||
- {id: other, cat: Other, desc: "Others"}
|
||||
- {id: movies, cat: Movies, desc: "Movies"}
|
||||
- {id: videos, cat: Other, desc: "Videos"}
|
||||
- {id: tv, cat: TV, desc: "TV"}
|
||||
- {id: anime, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: xxx, cat: XXX, desc: "XXX"}
|
||||
- {id: adult, cat: XXX, desc: "XXX"}
|
||||
- {id: music, cat: Audio, desc: "Music"}
|
||||
- {id: games, cat: PC/Games, desc: "Games"}
|
||||
- {id: apps, cat: PC/0day, desc: "Apps"}
|
||||
- {id: applications, cat: PC/0day, desc: "Apps"}
|
||||
- {id: android, cat: PC/Phone-Android, desc: "Android"}
|
||||
- {id: software, cat: PC/0day, desc: "Apps"}
|
||||
- {id: books, cat: Books, desc: "Books"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
movie-search: [q]
|
||||
|
||||
settings:
|
||||
- name: itorrents-links
|
||||
type: checkbox
|
||||
label: Add download links via itorrents.org
|
||||
- name: info
|
||||
type: info
|
||||
label: ITorrents Note
|
||||
default: Without the itorrents option only magnet links will be provided.
|
||||
settings: []
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{if .Keywords}}search/{{ .Keywords}}/{{else}}recent-torrents/{{end}}"
|
||||
- path: "{{if .Keywords}}search/{{ .Keywords}}/{{else}}recent/{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/2{{else}}recent/2{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/3{{else}}recent/3{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/4{{else}}recent/4{{end}}"
|
||||
- path: "{{if .Keywords}}s/{{ .Keywords}}/page/5{{else}}recent/5{{end}}"
|
||||
rows:
|
||||
selector: div[class="resultdiv"]
|
||||
selector: li:has(div.opt-text-w3layouts)
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
title:
|
||||
selector: div[class="resultdivtop"] div[class="resultdivtopname"]
|
||||
selector: div.opt-text-w3layouts a
|
||||
details:
|
||||
selector: div[class="resultdivbotton"] div[class="magneticdiv"] a
|
||||
selector: div.opt-text-w3layouts a
|
||||
attribute: href
|
||||
category:
|
||||
optional: true
|
||||
selector: div[class="resultdivbotton"] div[class="resultdivbottoncategory"]
|
||||
case:
|
||||
":contains(\"Other\")": 0
|
||||
":contains(\"Movies\")": 1
|
||||
":contains(\"Video\")": 2
|
||||
":contains(\"TV\")": 3
|
||||
":contains(\"Anime\")": 4
|
||||
":contains(\"xxx\")": 5
|
||||
":contains(\"XXX\")": 5
|
||||
":contains(\"Adult\")": 5
|
||||
":contains(\"Music\")": 6
|
||||
":contains(\"Games\")": 7
|
||||
":contains(\"Apps\")": 8
|
||||
":contains(\"Software\")": 8
|
||||
":contains(\"Books\")": 9
|
||||
download-itorrents:
|
||||
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
|
||||
selector: a[href^="/browse/"]
|
||||
filters:
|
||||
- name: toupper
|
||||
- name: prepend
|
||||
args: http://itorrents.org/torrent/
|
||||
- name: append
|
||||
args: ".torrent"
|
||||
download:
|
||||
text: "{{if .Config.itorrents-links}}{{ .Result.download-itorrents }}{{else}}{{end}}"
|
||||
magfile:
|
||||
text: "{{ .Result.title }}"
|
||||
filters:
|
||||
- name: validfilename
|
||||
- name: urlencode
|
||||
- name: replace
|
||||
args: ["/browse/", ""]
|
||||
magnet:
|
||||
selector: div[class="resultdivbotton"] div[class="resultseed"] div[class="resultdivbottonseed"]
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "magnet:?xt=urn:btih:"
|
||||
- name: append
|
||||
args: "&dn={{ .Result.magfile }}.torrent"
|
||||
- name: append
|
||||
args: "&tr=http://182.176.139.129:6969/announce&tr=http://explodie.org:6969/announce&tr=http://tracker.mgtracker.org:2710/announce&tr=udp://tracker.coppersurfer.tk:6969/announce&tr=udp://tracker.leechers-paradise.org:6969/announce&tr=udp://tracker.pirateparty.gr:6969/announce&tr=udp://tracker.sktorrent.net:6969/announce&tr=udp://tracker.zer0day.to:1337/announce"
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
date:
|
||||
selector: div[class="resultdivbotton"] div[class="resulttime"] div[class="resultdivbottontime"]
|
||||
selector: div.seedbar span:nth-child(4)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Age: ", ""]
|
||||
- name: timeago
|
||||
files:
|
||||
selector: div.seedbar span:nth-child(5)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Files: ", ""]
|
||||
size:
|
||||
selector: div[class="resultdivbotton"] div[class="resultlength"] div[class="resultdivbottonlength"]
|
||||
selector: div.seedbar span:nth-child(3)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Size: ", ""]
|
||||
seeders:
|
||||
text: "999"
|
||||
selector: div.seedbar span:nth-child(1)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Seed: ", ""]
|
||||
leechers:
|
||||
text: "999"
|
||||
selector: div.seedbar span:nth-child(2)
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Leech: ", ""]
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
|
@@ -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,11 +6,17 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://ilcorsaronero.cc/
|
||||
legacylinks:
|
||||
- https://ilcorsaronero.info/
|
||||
- https://ilcorsaronero.ch/
|
||||
certificates:
|
||||
- 89c12d4a080b5aeec00acbb269dc9b44584b1b3f # incomplete CA chain
|
||||
- aa7c40aa360a1cec8a9687312fd50402b912e618 # incomplete CA chain
|
||||
- 83174ec1f92fa13cdef9d51888ea1dfba2166e17 # incomplete CA chain
|
||||
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
|
||||
- 3a402766ce22fd1aa24bfc1a4fd47e9309eb8c98 # incomplete CA chain
|
||||
- 160f832730737a70264768ceddf3cd94bc51ffb7 # incomplete CA chain
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -6,7 +6,13 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://kickasstvshow.xyz/
|
||||
legacylinks:
|
||||
- https://kickasskatcr.website/
|
||||
- https://kickasskatcr.stream/
|
||||
- https://kickassextratorrent.xyz/
|
||||
- https://kickassextratorrent.website/
|
||||
- https://kickassextratorrent.club/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
@@ -35,6 +41,8 @@
|
||||
- path: "{{ if .Keywords }}search/{{ .Keywords }}/{{else}}new/{{end}}"
|
||||
rows:
|
||||
selector: table.data tr.odd
|
||||
filters:
|
||||
- name: andmatch
|
||||
fields:
|
||||
category:
|
||||
selector: span.uploader_block strong a
|
||||
|
@@ -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
|
||||
|
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"
|
||||
|
@@ -33,7 +33,7 @@
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: table.main:contains("Login Failed!")
|
||||
- selector: form[action*="/login"] .text-red
|
||||
test:
|
||||
path: /torrents
|
||||
|
||||
@@ -77,6 +77,30 @@
|
||||
args: ([\d\.]+)
|
||||
date:
|
||||
selector: time
|
||||
filters:
|
||||
# translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portoguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch
|
||||
- name: re_replace
|
||||
args: ["(önce|tagasi|geleden|fa|temu|siden|atrás|nazpět|назад|acum|hace|il y a|vor|преди)", "ago"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut)", "minute"]
|
||||
- name: re_replace
|
||||
args: ["(dakika|minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten)", "minutes"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur)", "hour"]
|
||||
- name: re_replace
|
||||
args: ["(saat|tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden)", "hours"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден)", "day"]
|
||||
- name: re_replace
|
||||
args: ["(gün|päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen)", "days"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица)", "week"]
|
||||
- name: re_replace
|
||||
args: ["(hafta|nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken)", "weeks"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|mois|Monat|месец|maand)", "month"]
|
||||
- name: re_replace
|
||||
args: ["(ay|kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden)", "months"]
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"i[data-original-title=\"100% Free\"]": "0"
|
||||
|
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"
|
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"
|
||||
|
@@ -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:
|
||||
|
@@ -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://www.torrent9.ph/
|
||||
- https://ww1.torrent9.ph/
|
||||
legacylinks:
|
||||
- http://www.torrent9.ec/
|
||||
- http://www.torrent9.red/
|
||||
@@ -18,6 +19,7 @@
|
||||
- https://www.torrent9.blue/
|
||||
- https://ww2.torrent9.blue/
|
||||
- https://www.torrent9.rip/
|
||||
- https://www.torrent9.ph/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
129
src/Jackett.Common/Definitions/torrent9clone.yml
Normal file
129
src/Jackett.Common/Definitions/torrent9clone.yml
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
site: torrent9clone
|
||||
name: Torrent9 clone (torrents9.ch)
|
||||
description: "Torrent9 is a FRENCH Public site for TV / MOVIES / GENERAL"
|
||||
language: fr-fr
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.torrent9.ch/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: films, cat: Movies, desc: "Movies"}
|
||||
- {id: series, cat: TV, desc: "TV"}
|
||||
- {id: musique, cat: Audio, desc: "Music"}
|
||||
- {id: ebook, cat: Books, desc: "Books"}
|
||||
- {id: logiciels, cat: PC, desc: "Software"}
|
||||
- {id: jeux-pc, cat: PC/Games, desc: "PC Games"}
|
||||
- {id: jeux-consoles, cat: Console/Xbox360, desc: "Console Games"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: category
|
||||
type: select
|
||||
label: Category Filter
|
||||
default: "/"
|
||||
options:
|
||||
"/" : "All"
|
||||
"/films/": "Movies"
|
||||
"/films-french/": "Movies/French"
|
||||
"/films-vostfr/": "Movies/VOSTFR"
|
||||
"/films-dvdrip-x264/": "Movies/DVDRIP .x264"
|
||||
"/720p/": "Movies/BluRay 720p"
|
||||
"/1080p/": "Movies/BluRay 1080p"
|
||||
"/series/": "TV/Series"
|
||||
"/series-vostfr/": "TV/VOSTFR"
|
||||
"/series-francaise/": "TV/French"
|
||||
"/series-dvdrip/": "TV/DVDRIP"
|
||||
"/spectacles/": "Shows"
|
||||
"/musique/": "Music"
|
||||
"/ebook/": "Ebooks"
|
||||
"/logiciels/": "Software"
|
||||
"/jeux-pc/": "PC Games"
|
||||
"/jeux-consoles/": "Console Games"
|
||||
|
||||
download:
|
||||
selector: a[href^="magnet:?"]
|
||||
attribute: href
|
||||
|
||||
search:
|
||||
paths:
|
||||
- path: "{{ if .Keywords }}/recherche/{{ .Keywords }}{{else}}/top{{end}}"
|
||||
rows:
|
||||
selector: div.table-responsive > table tbody tr
|
||||
fields:
|
||||
site_date:
|
||||
selector: td:nth-child(1) a
|
||||
filters:
|
||||
# date is at the end of the title, so we get it and name it site_date
|
||||
- name: regexp
|
||||
args: "(\\w+)$"
|
||||
title:
|
||||
selector: td:nth-child(1) a
|
||||
filters:
|
||||
# now we put the date at the right place according scene naming rules using .Result.site_date
|
||||
- name: replace
|
||||
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
|
||||
- name: replace
|
||||
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
|
||||
- name: replace
|
||||
args: ["VOSTFR", "{{ .Result.site_date }} VOSTFR"]
|
||||
# and we delete it at the end
|
||||
- name: re_replace
|
||||
args: ["(\\w+)$", ""]
|
||||
details:
|
||||
selector: td:nth-child(1) a
|
||||
attribute: href
|
||||
category:
|
||||
selector: td:nth-child(1) i
|
||||
case:
|
||||
i[class="Films"]: films
|
||||
i[class="Séries"]: series
|
||||
i[class="Musique"]: musique
|
||||
i[class=""Jeux-PC"]: jeux-pc
|
||||
i[class="Logiciels"]: logiciels
|
||||
i[class="Ebook"]: ebook
|
||||
download:
|
||||
selector: td:nth-child(1) a
|
||||
attribute: href
|
||||
date:
|
||||
text: "now"
|
||||
size:
|
||||
selector: td:nth-child(2)
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: [ "\\.(\\d) Ko", "$1X00"]
|
||||
- name: re_replace
|
||||
args: [ " Ko", "000"]
|
||||
- name: re_replace
|
||||
args: [ "\\.(\\d) Mo", "$1X00000"]
|
||||
- name: re_replace
|
||||
args: [ " Mo", "000000"]
|
||||
- name: re_replace
|
||||
args: [ "\\.(\\d) Go", "$1X00000000"]
|
||||
- name: re_replace
|
||||
args: [ " Go", "000000000"]
|
||||
- name: re_replace
|
||||
args: [ "\\.(\\d) To", "$1X00000000000"]
|
||||
- name: re_replace
|
||||
args: [ " To", "000000000000"]
|
||||
- name: replace
|
||||
args: [ "X", "" ]
|
||||
seeders:
|
||||
text: 0
|
||||
seeders:
|
||||
selector: td:nth-child(3) span.seed_ok
|
||||
optional: true
|
||||
leechers:
|
||||
text: 0
|
||||
leechers:
|
||||
selector: td:nth-child(4)
|
||||
optional: true
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://torrentcouch.net/
|
||||
legacylinks:
|
||||
- https://torrentcouch.com/
|
||||
|
||||
caps:
|
||||
@@ -23,10 +25,12 @@
|
||||
|
||||
search:
|
||||
# https://torrentcouch.com/?s=expanse
|
||||
# https://torrentcouch.net/page/3/?s=expanse
|
||||
paths:
|
||||
- path: /
|
||||
inputs:
|
||||
s: "{{.Keywords}}"
|
||||
- path: "{{if .Keywords}}/?s={{ .Keywords}}{{else}}/{{end}}"
|
||||
- path: "{{if .Keywords}}/page/2/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/3/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
- path: "{{if .Keywords}}/page/4/?s={{ .Keywords}}{{else}}{{end}}"
|
||||
rows:
|
||||
selector: article
|
||||
fields:
|
||||
@@ -45,9 +49,9 @@
|
||||
size:
|
||||
text: "500 MB"
|
||||
seeders:
|
||||
text: "999"
|
||||
text: "1"
|
||||
leechers:
|
||||
text: "999"
|
||||
text: "1"
|
||||
date:
|
||||
text: now
|
||||
downloadvolumefactor:
|
||||
|
@@ -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:
|
||||
|
@@ -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,17 +5,25 @@
|
||||
language: fr-fr
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
followredirect: true
|
||||
links:
|
||||
- https://yggtorrent.to/
|
||||
- https://ww3.yggtorrent.gg/
|
||||
legacylinks:
|
||||
- https://yggtorrent.is/
|
||||
- https://yggtorrent.com/
|
||||
- https://ww1.yggtorrent.com/
|
||||
- https://yggtorrent.is/
|
||||
- https://www.yggtorrent.is/
|
||||
- https://ww1.yggtorrent.is/
|
||||
- https://ww2.yggtorrent.is/
|
||||
- https://ww3.yggtorrent.is/
|
||||
- https://ww4.yggtorrent.is/
|
||||
- https://yggtorrent.to/
|
||||
- https://www3.yggtorrent.to/
|
||||
- https://www6.yggtorrent.to/
|
||||
- https://www8.yggtorrent.to/
|
||||
- https://www9.yggtorrent.to/
|
||||
- https://ygg.to/
|
||||
- https://www.ygg.to/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
@@ -114,6 +122,13 @@
|
||||
FRENCH : "FRENCH"
|
||||
MULTI.FRENCH: "MULTI.FRENCH"
|
||||
ENGLISH: "ENGLISH"
|
||||
MULTI.ENGLISH: "MULTI.ENGLISH"
|
||||
VOSTFR: "VOSTFR"
|
||||
MULTI.VOSTFR: "MULTI.VOSTFR"
|
||||
- name: vostfr
|
||||
type: checkbox
|
||||
label: Replace VOSTFR with ENGLISH
|
||||
default: false
|
||||
login:
|
||||
method: form
|
||||
path: /
|
||||
@@ -164,8 +179,15 @@
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
|
||||
title:
|
||||
title_phase2:
|
||||
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
|
||||
title_vostfr:
|
||||
text: "{{ .Result.title_phase2 }}"
|
||||
filters:
|
||||
- name: re_replace
|
||||
args: ["[\\.\\s\\[\\-][Vv][Oo][Ss][Tt][Ff][Rr][\\.\\s\\]\\-]", ".ENGLISH."]
|
||||
title:
|
||||
text: "{{if .Config.vostfr }}{{ .Result.title_vostfr }}{{else}}{{ .Result.title_phase2 }}{{end}}"
|
||||
details:
|
||||
selector: ":nth-child(2) > a"
|
||||
attribute: href
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -135,6 +135,13 @@ namespace Jackett.Common.Indexers
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ensure fansub group name is present in the title
|
||||
// This is needed for things like configuring tag restrictions in Sonarr
|
||||
if (title.Contains("[HorribleSubs]") == false)
|
||||
{
|
||||
title = "[HorribleSubs] " + title;
|
||||
}
|
||||
|
||||
DateTime releasedate;
|
||||
if (dateStr == "Today")
|
||||
{
|
||||
@@ -148,23 +155,33 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
releasedate = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MM/dd/yy", CultureInfo.InvariantCulture), DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
|
||||
|
||||
var p480 = releaserow.QuerySelector(".link-480p");
|
||||
|
||||
if (p480 != null)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
PublishDate = releasedate,
|
||||
Files = 1,
|
||||
Category = new List<int> { TorznabCatType.TVAnime.ID },
|
||||
Size = 524288000,
|
||||
Seeders = 1,
|
||||
Peers = 2,
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
release.Title = string.Format("{0} [480p]", title);
|
||||
release.PublishDate = releasedate;
|
||||
release.Link = new Uri(p480.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.MagnetUri = new Uri(p480.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Files = 1;
|
||||
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
|
||||
release.Size = 524288000;
|
||||
release.Seeders = 999;
|
||||
release.Peers = 1998;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
if (p480.QuerySelector(".hs-torrent-link > a") != null)
|
||||
{
|
||||
release.Link = new Uri(p480.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.Guid = release.Link;
|
||||
}
|
||||
if (p480.QuerySelector(".hs-magnet-link > a") != null)
|
||||
{
|
||||
release.MagnetUri = new Uri(p480.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Guid = release.MagnetUri;
|
||||
}
|
||||
releases.Add(release);
|
||||
}
|
||||
|
||||
@@ -172,18 +189,28 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
if (p720 != null)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
PublishDate = releasedate,
|
||||
Files = 1,
|
||||
Category = new List<int> { TorznabCatType.TVAnime.ID },
|
||||
Size = 524288000,
|
||||
Seeders = 1,
|
||||
Peers = 2,
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
release.Title = string.Format("{0} [720p]", title);
|
||||
release.PublishDate = releasedate;
|
||||
release.Link = new Uri(p720.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.MagnetUri = new Uri(p720.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Files = 1;
|
||||
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
|
||||
release.Size = 524288000;
|
||||
release.Seeders = 999;
|
||||
release.Peers = 1998;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
if (p720.QuerySelector(".hs-torrent-link > a") != null)
|
||||
{
|
||||
release.Link = new Uri(p720.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.Guid = release.Link;
|
||||
}
|
||||
if (p720.QuerySelector(".hs-magnet-link > a") != null)
|
||||
{
|
||||
release.MagnetUri = new Uri(p720.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Guid = release.MagnetUri;
|
||||
}
|
||||
releases.Add(release);
|
||||
}
|
||||
|
||||
@@ -191,21 +218,30 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
if (p1080 != null)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
PublishDate = releasedate,
|
||||
Files = 1,
|
||||
Category = new List<int> { TorznabCatType.TVAnime.ID },
|
||||
Size = 524288000,
|
||||
Seeders = 1,
|
||||
Peers = 2,
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
release.Title = string.Format("{0} [1080p]", title);
|
||||
release.PublishDate = releasedate;
|
||||
release.Link = new Uri(p1080.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.MagnetUri = new Uri(p1080.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Files = 1;
|
||||
release.Category = new List<int> { TorznabCatType.TVAnime.ID };
|
||||
release.Size = 524288000;
|
||||
release.Seeders = 999;
|
||||
release.Peers = 1998;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
if (p1080.QuerySelector(".hs-torrent-link > a") != null)
|
||||
{
|
||||
release.Link = new Uri(p1080.QuerySelector(".hs-torrent-link > a").GetAttribute("href"));
|
||||
release.Guid = release.Link;
|
||||
}
|
||||
if (p1080.QuerySelector(".hs-magnet-link > a") != null)
|
||||
{
|
||||
release.MagnetUri = new Uri(p1080.QuerySelector(".hs-magnet-link > a").GetAttribute("href"));
|
||||
release.Guid = release.MagnetUri;
|
||||
}
|
||||
releases.Add(release);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@@ -34,6 +34,13 @@ namespace Jackett.Common.Indexers
|
||||
"http://ghost.cable-modem.org/",
|
||||
"http://logan.unusualperson.com/",
|
||||
"http://baywatch.workisboring.com/",
|
||||
"https://ipt.getcrazy.me",
|
||||
"https://ipt.findnemo.net",
|
||||
"https://ipt.beelyrics.net",
|
||||
"https://ipt.venom.global",
|
||||
"https://ipt.workisboring.net",
|
||||
"https://ipt.lol",
|
||||
|
||||
};
|
||||
|
||||
private new ConfigurationDataRecaptchaLogin configData
|
||||
@@ -202,7 +209,7 @@ namespace Jackett.Common.Indexers
|
||||
// Redirect to ? then to /t
|
||||
await FollowIfRedirect(response, request.Url, null, firstCallCookies);
|
||||
|
||||
await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () =>
|
||||
await ConfigureIfOK(firstCallCookies, response.Content.Contains("/lout.php"), () =>
|
||||
{
|
||||
CQ dom = response.Content;
|
||||
var messageEl = dom["body > div"].First();
|
||||
@@ -241,6 +248,10 @@ namespace Jackett.Common.Indexers
|
||||
var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl);
|
||||
|
||||
var results = response.Content;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(query.SearchTerm) && results.Contains("No Torrents Found!"))
|
||||
throw new Exception("Got No Torrents Found! Make sure your IPTorrents profile config contain proper default category settings.");
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = results;
|
||||
|
@@ -124,7 +124,7 @@ namespace Jackett.Common.Indexers
|
||||
CQ dom = results.Content;
|
||||
|
||||
var rows = dom["#sortabletable tr:has(a[href*=\"details.php?id=\"])"];
|
||||
foreach (var row in rows.Skip(1))
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
var qRow = row.Cq();
|
||||
|
@@ -45,7 +45,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
public async Task<IEnumerable<TorznabQuery>> FallbackQueries()
|
||||
{
|
||||
if (titles == null)
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
return titles.Select(t => query.CreateFallback(t));
|
||||
}
|
||||
|
||||
|
@@ -49,7 +49,7 @@ namespace Jackett.Common.Indexers.Meta
|
||||
|
||||
var remainingResults = results.Except(wrongResults).Except(perfectResults);
|
||||
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title.ToEnumerable();
|
||||
var titles = (await resolver.MovieForId(query.ImdbID.ToNonNull())).Title?.ToEnumerable() ?? Enumerable.Empty<string>();
|
||||
var strippedTitles = titles.Select(t => RemoveSpecialChars(t));
|
||||
var normalizedTitles = strippedTitles.SelectMany(t => GenerateTitleVariants(t));
|
||||
|
||||
|
@@ -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,122 +31,137 @@ namespace Jackett.Common.Indexers
|
||||
: base(name: "MyAnonamouse",
|
||||
description: "Friendliness, Warmth and Sharing",
|
||||
link: "https://www.myanonamouse.net/",
|
||||
caps: new TorznabCapabilities(TorznabCatType.Books,
|
||||
TorznabCatType.AudioAudiobook,
|
||||
TorznabCatType.BooksComics,
|
||||
TorznabCatType.BooksEbook,
|
||||
TorznabCatType.BooksMagazines,
|
||||
TorznabCatType.BooksTechnical),
|
||||
configService: configService,
|
||||
caps: new TorznabCapabilities(),
|
||||
client: c,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataBasicLogin())
|
||||
configData: new ConfigurationDataMyAnonamouse())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
webclient.EmulateBrowser = false;
|
||||
|
||||
AddCategoryMapping("61", TorznabCatType.BooksComics);
|
||||
AddCategoryMapping("91", TorznabCatType.BooksTechnical);
|
||||
AddCategoryMapping("80", TorznabCatType.BooksTechnical);
|
||||
AddCategoryMapping("79", TorznabCatType.BooksMagazines);
|
||||
AddCategoryMapping("39", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("49", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("50", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("83", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("51", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("97", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("40", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("41", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("106", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("42", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("52", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("98", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("54", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("55", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("43", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("99", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("84", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("44", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("56", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("137", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("45", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("57", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("85", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("87", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("119", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("88", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("58", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("59", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("46", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("47", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("53", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("89", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("100", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("108", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("48", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("111", TorznabCatType.AudioAudiobook);
|
||||
AddCategoryMapping("60", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("71", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("72", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("90", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("73", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("101", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("62", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("63", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("107", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("64", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("74", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("102", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("76", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("77", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("65", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("103", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("115", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("66", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("78", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("138", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("67", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("92", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("118", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("94", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("120", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("95", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("81", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("82", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("68", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("69", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("75", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("96", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("104", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("109", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("70", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("112", TorznabCatType.BooksEbook);
|
||||
AddCategoryMapping("13", TorznabCatType.AudioAudiobook, "AudioBooks");
|
||||
AddCategoryMapping("14", TorznabCatType.BooksEbook, "E-Books");
|
||||
AddCategoryMapping("15", TorznabCatType.AudioAudiobook, "Musicology");
|
||||
AddCategoryMapping("16", TorznabCatType.AudioAudiobook, "Radio");
|
||||
AddCategoryMapping("39", TorznabCatType.AudioAudiobook, "Audiobooks - Action/Adventure");
|
||||
AddCategoryMapping("49", TorznabCatType.AudioAudiobook, "Audiobooks - Art");
|
||||
AddCategoryMapping("50", TorznabCatType.AudioAudiobook, "Audiobooks - Biographical");
|
||||
AddCategoryMapping("83", TorznabCatType.AudioAudiobook, "Audiobooks - Business");
|
||||
AddCategoryMapping("51", TorznabCatType.AudioAudiobook, "Audiobooks - Computer/Internet");
|
||||
AddCategoryMapping("97", TorznabCatType.AudioAudiobook, "Audiobooks - Crafts");
|
||||
AddCategoryMapping("40", TorznabCatType.AudioAudiobook, "Audiobooks - Crime/Thriller");
|
||||
AddCategoryMapping("41", TorznabCatType.AudioAudiobook, "Audiobooks - Fantasy");
|
||||
AddCategoryMapping("106", TorznabCatType.AudioAudiobook, "Audiobooks - Food");
|
||||
AddCategoryMapping("42", TorznabCatType.AudioAudiobook, "Audiobooks - General Fiction");
|
||||
AddCategoryMapping("52", TorznabCatType.AudioAudiobook, "Audiobooks - General Non-Fic");
|
||||
AddCategoryMapping("98", TorznabCatType.AudioAudiobook, "Audiobooks - Historical Fiction");
|
||||
AddCategoryMapping("54", TorznabCatType.AudioAudiobook, "Audiobooks - History");
|
||||
AddCategoryMapping("55", TorznabCatType.AudioAudiobook, "Audiobooks - Home/Garden");
|
||||
AddCategoryMapping("43", TorznabCatType.AudioAudiobook, "Audiobooks - Horror");
|
||||
AddCategoryMapping("99", TorznabCatType.AudioAudiobook, "Audiobooks - Humor");
|
||||
AddCategoryMapping("84", TorznabCatType.AudioAudiobook, "Audiobooks - Instructional");
|
||||
AddCategoryMapping("44", TorznabCatType.AudioAudiobook, "Audiobooks - Juvenile");
|
||||
AddCategoryMapping("56", TorznabCatType.AudioAudiobook, "Audiobooks - Language");
|
||||
AddCategoryMapping("45", TorznabCatType.AudioAudiobook, "Audiobooks - Literary Classics");
|
||||
AddCategoryMapping("57", TorznabCatType.AudioAudiobook, "Audiobooks - Math/Science/Tech");
|
||||
AddCategoryMapping("85", TorznabCatType.AudioAudiobook, "Audiobooks - Medical");
|
||||
AddCategoryMapping("87", TorznabCatType.AudioAudiobook, "Audiobooks - Mystery");
|
||||
AddCategoryMapping("119", TorznabCatType.AudioAudiobook, "Audiobooks - Nature");
|
||||
AddCategoryMapping("88", TorznabCatType.AudioAudiobook, "Audiobooks - Philosophy");
|
||||
AddCategoryMapping("58", TorznabCatType.AudioAudiobook, "Audiobooks - Pol/Soc/Relig");
|
||||
AddCategoryMapping("59", TorznabCatType.AudioAudiobook, "Audiobooks - Recreation");
|
||||
AddCategoryMapping("46", TorznabCatType.AudioAudiobook, "Audiobooks - Romance");
|
||||
AddCategoryMapping("47", TorznabCatType.AudioAudiobook, "Audiobooks - Science Fiction");
|
||||
AddCategoryMapping("53", TorznabCatType.AudioAudiobook, "Audiobooks - Self-Help");
|
||||
AddCategoryMapping("89", TorznabCatType.AudioAudiobook, "Audiobooks - Travel/Adventure");
|
||||
AddCategoryMapping("100", TorznabCatType.AudioAudiobook, "Audiobooks - True Crime");
|
||||
AddCategoryMapping("108", TorznabCatType.AudioAudiobook, "Audiobooks - Urban Fantasy");
|
||||
AddCategoryMapping("48", TorznabCatType.AudioAudiobook, "Audiobooks - Western");
|
||||
AddCategoryMapping("111", TorznabCatType.AudioAudiobook, "Audiobooks - Young Adult");
|
||||
AddCategoryMapping("60", TorznabCatType.BooksEbook, "Ebooks - Action/Adventure");
|
||||
AddCategoryMapping("71", TorznabCatType.BooksEbook, "Ebooks - Art");
|
||||
AddCategoryMapping("72", TorznabCatType.BooksEbook, "Ebooks - Biographical");
|
||||
AddCategoryMapping("90", TorznabCatType.BooksEbook, "Ebooks - Business");
|
||||
AddCategoryMapping("61", TorznabCatType.BooksComics, "Ebooks - Comics/Graphic novels");
|
||||
AddCategoryMapping("73", TorznabCatType.BooksEbook, "Ebooks - Computer/Internet");
|
||||
AddCategoryMapping("101", TorznabCatType.BooksEbook, "Ebooks - Crafts");
|
||||
AddCategoryMapping("62", TorznabCatType.BooksEbook, "Ebooks - Crime/Thriller");
|
||||
AddCategoryMapping("63", TorznabCatType.BooksEbook, "Ebooks - Fantasy");
|
||||
AddCategoryMapping("107", TorznabCatType.BooksEbook, "Ebooks - Food");
|
||||
AddCategoryMapping("64", TorznabCatType.BooksEbook, "Ebooks - General Fiction");
|
||||
AddCategoryMapping("74", TorznabCatType.BooksEbook, "Ebooks - General Non-Fiction");
|
||||
AddCategoryMapping("102", TorznabCatType.BooksEbook, "Ebooks - Historical Fiction");
|
||||
AddCategoryMapping("76", TorznabCatType.BooksEbook, "Ebooks - History");
|
||||
AddCategoryMapping("77", TorznabCatType.BooksEbook, "Ebooks - Home/Garden");
|
||||
AddCategoryMapping("65", TorznabCatType.BooksEbook, "Ebooks - Horror");
|
||||
AddCategoryMapping("103", TorznabCatType.BooksEbook, "Ebooks - Humor");
|
||||
AddCategoryMapping("115", TorznabCatType.BooksEbook, "Ebooks - Illusion/Magic");
|
||||
AddCategoryMapping("91", TorznabCatType.BooksEbook, "Ebooks - Instructional");
|
||||
AddCategoryMapping("66", TorznabCatType.BooksEbook, "Ebooks - Juvenile");
|
||||
AddCategoryMapping("78", TorznabCatType.BooksEbook, "Ebooks - Language");
|
||||
AddCategoryMapping("67", TorznabCatType.BooksEbook, "Ebooks - Literary Classics");
|
||||
AddCategoryMapping("79", TorznabCatType.BooksMagazines, "Ebooks - Magazines/Newspapers");
|
||||
AddCategoryMapping("80", TorznabCatType.BooksTechnical, "Ebooks - Math/Science/Tech");
|
||||
AddCategoryMapping("92", TorznabCatType.BooksEbook, "Ebooks - Medical");
|
||||
AddCategoryMapping("118", TorznabCatType.BooksEbook, "Ebooks - Mixed Collections");
|
||||
AddCategoryMapping("94", TorznabCatType.BooksEbook, "Ebooks - Mystery");
|
||||
AddCategoryMapping("120", TorznabCatType.BooksEbook, "Ebooks - Nature");
|
||||
AddCategoryMapping("95", TorznabCatType.BooksEbook, "Ebooks - Philosophy");
|
||||
AddCategoryMapping("81", TorznabCatType.BooksEbook, "Ebooks - Pol/Soc/Relig");
|
||||
AddCategoryMapping("82", TorznabCatType.BooksEbook, "Ebooks - Recreation");
|
||||
AddCategoryMapping("68", TorznabCatType.BooksEbook, "Ebooks - Romance");
|
||||
AddCategoryMapping("69", TorznabCatType.BooksEbook, "Ebooks - Science Fiction");
|
||||
AddCategoryMapping("75", TorznabCatType.BooksEbook, "Ebooks - Self-Help");
|
||||
AddCategoryMapping("96", TorznabCatType.BooksEbook, "Ebooks - Travel/Adventure");
|
||||
AddCategoryMapping("104", TorznabCatType.BooksEbook, "Ebooks - True Crime");
|
||||
AddCategoryMapping("109", TorznabCatType.BooksEbook, "Ebooks - Urban Fantasy");
|
||||
AddCategoryMapping("70", TorznabCatType.BooksEbook, "Ebooks - Western");
|
||||
AddCategoryMapping("112", TorznabCatType.BooksEbook, "Ebooks - Young Adult");
|
||||
AddCategoryMapping("19", TorznabCatType.AudioAudiobook, "Guitar/Bass Tabs");
|
||||
AddCategoryMapping("20", TorznabCatType.AudioAudiobook, "Individual Sheet");
|
||||
AddCategoryMapping("24", TorznabCatType.AudioAudiobook, "Individual Sheet MP3");
|
||||
AddCategoryMapping("126", TorznabCatType.AudioAudiobook, "Instructional Book with Video");
|
||||
AddCategoryMapping("22", TorznabCatType.AudioAudiobook, "Instructional Media - Music");
|
||||
AddCategoryMapping("113", TorznabCatType.AudioAudiobook, "Lick Library - LTP/Jam With");
|
||||
AddCategoryMapping("114", TorznabCatType.AudioAudiobook, "Lick Library - Techniques/QL");
|
||||
AddCategoryMapping("17", TorznabCatType.AudioAudiobook, "Music - Complete Editions");
|
||||
AddCategoryMapping("26", TorznabCatType.AudioAudiobook, "Music Book");
|
||||
AddCategoryMapping("27", TorznabCatType.AudioAudiobook, "Music Book MP3");
|
||||
AddCategoryMapping("30", TorznabCatType.AudioAudiobook, "Sheet Collection");
|
||||
AddCategoryMapping("31", TorznabCatType.AudioAudiobook, "Sheet Collection MP3");
|
||||
AddCategoryMapping("127", TorznabCatType.AudioAudiobook, "Radio - Comedy");
|
||||
AddCategoryMapping("130", TorznabCatType.AudioAudiobook, "Radio - Drama");
|
||||
AddCategoryMapping("128", TorznabCatType.AudioAudiobook, "Radio - Factual/Documentary");
|
||||
AddCategoryMapping("132", TorznabCatType.AudioAudiobook, "Radio - Reading");
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "email", configData.Username.Value },
|
||||
{ "password", configData.Password.Value },
|
||||
{ "returnto", "/" }
|
||||
};
|
||||
|
||||
configData.CookieHeader.Cookie = ""; // cookie reset needed in order to relogin
|
||||
|
||||
var preRequest = await RequestStringWithCookiesAndRetry(LoginUrl);
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, preRequest.Cookies, true, SearchUrl, SiteLink);
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("Search Results"), () =>
|
||||
// TODO: implement captcha
|
||||
CookieHeader = "mam_id=" + configData.MamId.Value;
|
||||
try
|
||||
{
|
||||
CQ dom = result.Content;
|
||||
var errorMessage = dom["table.main table td.text"].Text().Trim().Replace("\n\t", " ");
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
var results = await PerformQuery(new TorznabQuery());
|
||||
if (results.Count() == 0)
|
||||
{
|
||||
throw new Exception("Your man_id did not work");
|
||||
}
|
||||
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
IsConfigured = false;
|
||||
throw new Exception("Your man_id did not work: " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
@@ -162,12 +178,20 @@ namespace Jackett.Common.Indexers
|
||||
qParams.Add("tor[sortType]", "default");
|
||||
qParams.Add("tor[startNumber]", "0");
|
||||
|
||||
qParams.Add("thumbnails", "1"); // gives links for thumbnail sized versions of their posters
|
||||
//qParams.Add("posterLink", "1"); // gives links for a full sized poster
|
||||
//qParams.Add("dlLink", "1"); // include the url to download the torrent
|
||||
qParams.Add("description", "1"); // include the description
|
||||
//qParams.Add("bookmarks", "0"); // include if the item is bookmarked or not
|
||||
|
||||
List<string> catList = MapTorznabCapsToTrackers(query);
|
||||
if (catList.Any())
|
||||
{
|
||||
int index = 0;
|
||||
foreach (string cat in catList)
|
||||
{
|
||||
qParams.Add("tor[cat][]", cat);
|
||||
qParams.Add("tor[cat]["+index+"]", cat);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -182,65 +206,79 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
|
||||
var response = await RequestStringWithCookiesAndRetry(urlSearch);
|
||||
if (response.Status == System.Net.HttpStatusCode.Forbidden || CookieHeader.Contains("pass=deleted") || response.Content.Contains("Access limits exceeded."))
|
||||
if (response.Content.StartsWith("Error"))
|
||||
{
|
||||
// re-login
|
||||
await ApplyConfiguration(null);
|
||||
response = await RequestStringWithCookiesAndRetry(urlSearch);
|
||||
throw new Exception(response.Content);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = response.Content;
|
||||
var rows = dom["table[class='newTorTable'] > tbody > tr[id^=\"tdr\"]"];
|
||||
var jsonContent = JObject.Parse(response.Content);
|
||||
var sitelink = new Uri(SiteLink);
|
||||
|
||||
foreach (IDomObject row in rows)
|
||||
var error = jsonContent.Value<string>("error");
|
||||
if(error != null)
|
||||
{
|
||||
CQ torrentData = row.OuterHTML;
|
||||
CQ cells = row.Cq().Find("td");
|
||||
|
||||
string tid = torrentData.Attr("id").Substring(4);
|
||||
var qTitle = torrentData.Find("a[class='title']").First();
|
||||
string title = qTitle.Text().Trim();
|
||||
var details = new Uri(SiteLink + qTitle.Attr("href"));
|
||||
string author = torrentData.Find("a[class='author']").First().Text().Trim();
|
||||
Uri link = new Uri(SiteLink + "tor/download.php?tid=" + tid); // DL Link is no long available directly, build it ourself
|
||||
long files = ParseUtil.CoerceLong(cells.Elements.ElementAt(4).Cq().Find("a").Text());
|
||||
long size = ReleaseInfo.GetBytes(cells.Elements.ElementAt(4).Cq().Text().Split('[')[1].TrimEnd(']'));
|
||||
int seeders = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(0).Cq().Text());
|
||||
int leechers = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(1).Cq().Text());
|
||||
long grabs = ParseUtil.CoerceLong(cells.Elements.ElementAt(6).Cq().Find("p").ElementAt(2).Cq().Text());
|
||||
bool freeleech = torrentData.Find("img[alt=\"freeleech\"]").Any();
|
||||
|
||||
string pubDateStr = cells.Elements.ElementAt(5).Cq().Text().Split('[')[0];
|
||||
DateTime publishDate = DateTime.Parse(pubDateStr).ToLocalTime();
|
||||
|
||||
long category = 0;
|
||||
string cat = torrentData.Find("a[class='newCatLink']").First().Attr("href").Remove(0, "/tor/browse.php?tor[cat][]]=".Length);
|
||||
long.TryParse(cat, out category);
|
||||
if (error == "Nothing returned, out of 0")
|
||||
return releases;
|
||||
}
|
||||
|
||||
foreach (var item in jsonContent.Value<JArray>("data"))
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
|
||||
var id = item.Value<long>("id");
|
||||
release.Title = item.Value<string>("title");
|
||||
|
||||
release.Title = String.IsNullOrEmpty(author) ? title : String.Format("{0} by {1}", title, author);
|
||||
release.Guid = link;
|
||||
release.Link = link;
|
||||
release.PublishDate = publishDate;
|
||||
release.Files = files;
|
||||
release.Size = size;
|
||||
release.Description = release.Title;
|
||||
release.Seeders = seeders;
|
||||
release.Peers = seeders + leechers;
|
||||
release.Grabs = grabs;
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.Category = MapTrackerCatToNewznab(category.ToString());
|
||||
release.Comments = details;
|
||||
release.Description = item.Value<string>("description");
|
||||
|
||||
if (freeleech)
|
||||
var author_info = item.Value<string>("author_info");
|
||||
string author = null;
|
||||
if (!string.IsNullOrWhiteSpace(author_info))
|
||||
{
|
||||
author_info = Regex.Unescape(author_info);
|
||||
var author_info_json = JObject.Parse(author_info);
|
||||
author = author_info_json.First.Last.Value<string>();
|
||||
}
|
||||
if (author != null)
|
||||
release.Title += " by " + author;
|
||||
|
||||
var flags = new List<string>();
|
||||
|
||||
var lang_code = item.Value<string>("lang_code");
|
||||
if (!string.IsNullOrEmpty(lang_code))
|
||||
flags.Add(lang_code);
|
||||
|
||||
var filetype = item.Value<string>("filetype");
|
||||
if (!string.IsNullOrEmpty(filetype))
|
||||
flags.Add(filetype);
|
||||
|
||||
if (flags.Count > 0)
|
||||
release.Title += " [" + string.Join(" / ", flags) + "]";
|
||||
|
||||
var category = item.Value<string>("category");
|
||||
release.Category = MapTrackerCatToNewznab(category);
|
||||
|
||||
release.Link = new Uri(sitelink, "/tor/download.php?tid=" + id);
|
||||
release.Comments = new Uri(sitelink, "/t/" + id);
|
||||
release.Guid = release.Comments;
|
||||
|
||||
var dateStr = item.Value<string>("added");
|
||||
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
|
||||
release.PublishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
|
||||
release.Grabs = item.Value<long>("times_completed");
|
||||
release.Files = item.Value<long>("numfiles");
|
||||
release.Seeders = item.Value<int>("seeders");
|
||||
release.Peers = item.Value<int>("leechers") + release.Seeders;
|
||||
var size = item.Value<string>("size");
|
||||
release.Size = ReleaseInfo.GetBytes(size);
|
||||
var free = item.Value<int>("free");
|
||||
|
||||
if (free == 1)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else
|
||||
release.DownloadVolumeFactor = 1;
|
||||
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
|
@@ -117,6 +117,118 @@ namespace Jackett.Common.Indexers
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
List<ReleaseInfo> parseTorrents(WebClientStringResult results, String seasonep, TorznabQuery query, int already_founded, int limit)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
try
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
|
||||
ReleaseInfo release;
|
||||
var rows = dom[".box_torrent_all"].Find(".box_torrent");
|
||||
|
||||
// Check torrents only till we reach the query Limit
|
||||
for(int i=0; (i<rows.Length && ((already_founded + releases.Count) < limit )); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
CQ qRow = rows[i].Cq();
|
||||
var key = dom["link[rel=alternate]"].First().Attr("href").Split('=').Last();
|
||||
|
||||
release = new ReleaseInfo();
|
||||
var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
|
||||
//if (torrentTxt == null) continue;
|
||||
release.Title = torrentTxt.GetAttribute("title");
|
||||
release.Description = qRow.Find("span").Get(0).GetAttribute("title") + " " + qRow.Find("a.infolink").Text();
|
||||
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
|
||||
string downloadId = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);
|
||||
|
||||
release.Link = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
|
||||
release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
|
||||
release.Guid = new Uri(release.Comments.ToString() + "#comments"); ;
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
|
||||
var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdblink);
|
||||
var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
|
||||
if (banner != null)
|
||||
{
|
||||
Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
|
||||
var BannerMatch = BannerRegEx.Match(banner);
|
||||
var bannerurl = BannerMatch.Groups[1].Value;
|
||||
release.BannerUrl = new Uri(bannerurl);
|
||||
}
|
||||
release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
|
||||
string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
|
||||
release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
|
||||
string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
|
||||
string cat = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
|
||||
release.Category = MapTrackerCatToNewznab(cat);
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !release.Title.Contains("hun"))
|
||||
release.Title += ".hun";
|
||||
|
||||
if (seasonep == null)
|
||||
releases.Add(release);
|
||||
|
||||
else
|
||||
{
|
||||
if (query.MatchQueryStringAND(release.Title, null, seasonep))
|
||||
{
|
||||
/* For sonnar if the search querry was english the title must be english also so we need to change the Description and Title */
|
||||
var temp = release.Title;
|
||||
|
||||
// releasedata everithing after Name.S0Xe0X
|
||||
String releasedata = release.Title.Split(new[] { seasonep }, StringSplitOptions.None)[1].Trim();
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !releasedata.Contains("hun"))
|
||||
releasedata += ".hun";
|
||||
|
||||
// release description contains [imdb: ****] but we only need the data before it for title
|
||||
String[] description = { release.Description, "" };
|
||||
if (release.Description.Contains("[imdb:"))
|
||||
{
|
||||
description = release.Description.Split('[');
|
||||
description[1] = "[" + description[1];
|
||||
}
|
||||
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + "." + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// if search is done for S0X than we dont want to put . between S0X and E0X
|
||||
Match match = Regex.Match(releasedata, @"^E\d\d?");
|
||||
if (seasonep.Length == 3 && match.Success)
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// add back imdb points to the description [imdb: 8.7]
|
||||
release.Description = temp + " " + description[1];
|
||||
release.Description = release.Description.Trim();
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (FormatException ex)
|
||||
{
|
||||
logger.Error("Problem of parsing Torrent:" + rows[i].InnerHTML);
|
||||
logger.Error("Exception was the following:" + ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
protected async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, String seasonep)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
@@ -155,98 +267,42 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
|
||||
var results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);
|
||||
|
||||
|
||||
try
|
||||
CQ dom = results.Content;
|
||||
int numVal = 0;
|
||||
|
||||
// find pagelinks in the bottom
|
||||
var pagelinks = dom["div[id=pager_bottom]"].Find("a");
|
||||
if (pagelinks.Length > 0)
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
|
||||
ReleaseInfo release;
|
||||
var rows = dom[".box_torrent_all"].Find(".box_torrent");
|
||||
|
||||
foreach (var row in rows)
|
||||
// If there are several pages find the link for the latest one
|
||||
for (int i= pagelinks.Length - 1; i > 0; i--)
|
||||
{
|
||||
CQ qRow = row.Cq();
|
||||
|
||||
var key = dom["link[rel=alternate]"].First().Attr("href").Split('=').Last();
|
||||
|
||||
release = new ReleaseInfo();
|
||||
var torrentTxt = qRow.Find(".torrent_txt, .torrent_txt2").Find("a").Get(0);
|
||||
//if (torrentTxt == null) continue;
|
||||
release.Title = torrentTxt.GetAttribute("title");
|
||||
release.Description = qRow.Find("div.siterank").Text();
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
string downloadLink = SiteLink + torrentTxt.GetAttribute("href");
|
||||
string downloadId = downloadLink.Substring(downloadLink.IndexOf("&id=") + 4);
|
||||
|
||||
release.Link = new Uri(SiteLink.ToString() + "torrents.php?action=download&id=" + downloadId + "&key=" + key);
|
||||
release.Comments = new Uri(SiteLink.ToString() + "torrents.php?action=details&id=" + downloadId);
|
||||
release.Guid = new Uri(release.Comments.ToString() + "#comments"); ;
|
||||
release.Seeders = ParseUtil.CoerceInt(qRow.Find(".box_s2").Find("a").First().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qRow.Find(".box_l2").Find("a").First().Text()) + release.Seeders;
|
||||
var imdblink = qRow.Find("a[href*=\".imdb.com/title\"]").Attr("href");
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdblink);
|
||||
var banner = qRow.Find("img.infobar_ico").Attr("onmouseover");
|
||||
if (banner != null)
|
||||
var last_page_link = (pagelinks[i].Cq().Attr("href")).Trim();
|
||||
if (last_page_link.Contains("oldal"))
|
||||
{
|
||||
Regex BannerRegEx = new Regex(@"mutat\('(.*?)', '", RegexOptions.Compiled);
|
||||
var BannerMatch = BannerRegEx.Match(banner);
|
||||
var bannerurl = BannerMatch.Groups[1].Value;
|
||||
release.BannerUrl = new Uri(bannerurl);
|
||||
Match match = Regex.Match(last_page_link, @"(?<=[\?,&]oldal=)(\d+)(?=&)");
|
||||
numVal = Int32.Parse(match.Value);
|
||||
break;
|
||||
}
|
||||
release.PublishDate = DateTime.Parse(qRow.Find(".box_feltoltve2").Get(0).InnerHTML.Replace("<br />", " "), CultureInfo.InvariantCulture);
|
||||
string[] sizeSplit = qRow.Find(".box_meret2").Get(0).InnerText.Split(' ');
|
||||
release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0]));
|
||||
string catlink = qRow.Find("a:has(img[class='categ_link'])").First().Attr("href");
|
||||
string cat = ParseUtil.GetArgumentFromQueryString(catlink, "tipus");
|
||||
release.Category = MapTrackerCatToNewznab(cat);
|
||||
if (seasonep == null)
|
||||
releases.Add(release);
|
||||
|
||||
else
|
||||
{
|
||||
if (query.MatchQueryStringAND(release.Title, null, seasonep))
|
||||
{
|
||||
/* For sonnar if the search querry was english the title must be english also so we need to change the Description and Title */
|
||||
var temp = release.Title;
|
||||
|
||||
// releasedata everithing after Name.S0Xe0X
|
||||
String releasedata =release.Title.Split(new[] { seasonep }, StringSplitOptions.None)[1].Trim();
|
||||
|
||||
/* if the release name not contains the language we add it because it is know from category */
|
||||
if (cat.Contains("hun") && !releasedata.Contains("hun"))
|
||||
releasedata += ".hun";
|
||||
|
||||
// release description contains [imdb: ****] but we only need the data before it for title
|
||||
String[] description = {release.Description, ""};
|
||||
if (release.Description.Contains("[imdb:"))
|
||||
{
|
||||
description = release.Description.Split('[');
|
||||
description[1] = "[" + description[1];
|
||||
}
|
||||
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + "." + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// if search is done for S0X than we dont want to put . between S0X and E0X
|
||||
Match match = Regex.Match(releasedata, @"^E\d\d?");
|
||||
if (seasonep.Length==3 && match.Success)
|
||||
release.Title = (description[0].Trim() + "." + seasonep.Trim() + releasedata.Trim('.')).Replace(' ', '.');
|
||||
|
||||
// add back imdb points to the description [imdb: 8.7]
|
||||
release.Description = temp+" "+ description[1];
|
||||
release.Description = release.Description.Trim();
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
}
|
||||
|
||||
var limit = query.Limit;
|
||||
if (limit == 0)
|
||||
limit = 100;
|
||||
|
||||
releases = parseTorrents(results, seasonep, query, releases.Count, limit);
|
||||
|
||||
// Check all the pages for the torrents.
|
||||
// The starting index is 2. (the first one is the original where we parse out the pages.)
|
||||
for (int i=2; (i<= numVal && releases.Count < limit); i++ )
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
pairs.Add(new KeyValuePair<string, string>("oldal", i.ToString()));
|
||||
results = await PostDataWithCookiesAndRetry(SearchUrl, pairs);
|
||||
releases.AddRange(parseTorrents(results, seasonep, query, releases.Count, limit));
|
||||
pairs.Remove(new KeyValuePair<string, string>("oldal", i.ToString()));
|
||||
}
|
||||
|
||||
return releases;
|
||||
|
@@ -33,12 +33,13 @@ namespace Jackett.Common.Indexers
|
||||
public int? Season;
|
||||
public int? Episode;
|
||||
public int? EpisodeTo;
|
||||
public int Score;
|
||||
|
||||
public NewpctRelease()
|
||||
{
|
||||
}
|
||||
|
||||
public NewpctRelease(NewpctRelease copyFrom):
|
||||
public NewpctRelease(NewpctRelease copyFrom) :
|
||||
base(copyFrom)
|
||||
{
|
||||
NewpctReleaseType = copyFrom.NewpctReleaseType;
|
||||
@@ -46,6 +47,7 @@ namespace Jackett.Common.Indexers
|
||||
Season = copyFrom.Season;
|
||||
Episode = copyFrom.Episode;
|
||||
EpisodeTo = copyFrom.EpisodeTo;
|
||||
Score = copyFrom.Score;
|
||||
}
|
||||
|
||||
public override object Clone()
|
||||
@@ -54,29 +56,38 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
}
|
||||
|
||||
private static Uri SiteLinkUri = new Uri("http://www.tvsinpagar.com/");
|
||||
private static Uri DefaultSiteLinkUri = new Uri("http://descargas2020.com/");
|
||||
private Uri _siteUri;
|
||||
private NewpctRelease _mostRecentRelease;
|
||||
private char[] _wordSeparators = new char[] { ' ', '.', ',', ';', '(', ')', '-', '_' };
|
||||
private int _wordNotFoundScore = 100000;
|
||||
private Regex _searchStringRegex = new Regex(@"(.+?)S0?(\d+)(E0?(\d+))?$", RegexOptions.IgnoreCase);
|
||||
private Regex _titleListRegex = new Regex(@"Serie( *Descargar)?(.+?)(Temporada(.+?)(\d+)(.+?))?Capitulos?(.+?)(\d+)((.+?)(\d+))?(.+?)-(.+?)Calidad(.*)", RegexOptions.IgnoreCase);
|
||||
private Regex _titleClassicRegex = new Regex(@"(\[[^\]]*\])?\[Cap\.(\d{1,2})(\d{2})([_-](\d{1,2})(\d{2}))?\]", RegexOptions.IgnoreCase);
|
||||
private Regex _titleClassicTvQualityRegex = new Regex(@"\[([^\]]*HDTV[^\]]*)", RegexOptions.IgnoreCase);
|
||||
|
||||
private int _maxDailyPages = 7;
|
||||
private int _maxMoviesPages = 20;
|
||||
private int _maxEpisodesListPages = 100;
|
||||
private int[] _allTvCategories = TorznabCatType.TV.SubCategories.Select(c => c.ID).ToArray();
|
||||
private int[] _allMoviesCategories = TorznabCatType.Movies.SubCategories.Select(c => c.ID).ToArray();
|
||||
|
||||
private bool _includeVo;
|
||||
private bool _filterMovies;
|
||||
private DateTime _dailyNow;
|
||||
private int _dailyResultIdx;
|
||||
|
||||
private string _searchUrl = "/buscar";
|
||||
private string _dailyUrl = "/ultimas-descargas/pg/{0}";
|
||||
private string[] _seriesLetterUrls = new string[] { "/series/letter/{0}", "/series-hd/letter/{0}" };
|
||||
private string[] _seriesVOLetterUrls = new string[] { "/series-vo/letter/{0}" };
|
||||
private string _seriesUrl = "{0}/pg/{1}";
|
||||
private string[] _voUrls = new string[] { "serie-vo", "serievo" };
|
||||
|
||||
public Newpct(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "Newpct",
|
||||
description: "Newpct - descargar torrent peliculas, series",
|
||||
link: SiteLinkUri.AbsoluteUri,
|
||||
link: DefaultSiteLinkUri.AbsoluteUri,
|
||||
caps: new TorznabCapabilities(TorznabCatType.TV,
|
||||
TorznabCatType.TVSD,
|
||||
TorznabCatType.TVHD,
|
||||
@@ -93,13 +104,15 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
var voItem = new BoolItem() { Name = "Include original versions in search results", Value = false };
|
||||
configData.AddDynamic("IncludeVo", voItem);
|
||||
|
||||
var filterMoviesItem = new BoolItem() { Name = "Only full match movies", Value = true };
|
||||
configData.AddDynamic("FilterMovies", filterMoviesItem);
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
configData.LoadValuesFromJson(configJson);
|
||||
var releases = await PerformQuery(new TorznabQuery());
|
||||
SiteLinkUri = new Uri(configData.SiteLink.Value);
|
||||
|
||||
await ConfigureIfOK(string.Empty, releases.Count() > 0, () =>
|
||||
{
|
||||
@@ -138,6 +151,9 @@ namespace Jackett.Common.Indexers
|
||||
CleanCache();
|
||||
}
|
||||
|
||||
_siteUri = new Uri(configData.SiteLink.Value);
|
||||
_includeVo = ((BoolItem)configData.GetDynamic("IncludeVo")).Value;
|
||||
_filterMovies = ((BoolItem)configData.GetDynamic("FilterMovies")).Value;
|
||||
_dailyNow = DateTime.Now;
|
||||
_dailyResultIdx = 0;
|
||||
bool rssMode = string.IsNullOrEmpty(query.SanitizedSearchTerm);
|
||||
@@ -147,7 +163,7 @@ namespace Jackett.Common.Indexers
|
||||
int pg = 1;
|
||||
while (pg <= _maxDailyPages)
|
||||
{
|
||||
Uri url = new Uri(SiteLinkUri, string.Format(_dailyUrl, pg));
|
||||
Uri url = new Uri(_siteUri, string.Format(_dailyUrl, pg));
|
||||
var results = await RequestStringWithCookies(url.AbsoluteUri);
|
||||
|
||||
var items = ParseDailyContent(results.Content);
|
||||
@@ -169,12 +185,18 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
else
|
||||
{
|
||||
//Only tv search supported. (newpct web search is useless)
|
||||
bool isTvSearch = query.Categories == null || query.Categories.Length == 0 ||
|
||||
query.Categories.Any(c => _allTvCategories.Contains(c));
|
||||
if (isTvSearch)
|
||||
{
|
||||
return await TvSearch(query);
|
||||
releases.AddRange(await TvSearch(query));
|
||||
}
|
||||
|
||||
bool isMovieSearch = query.Categories == null || query.Categories.Length == 0 ||
|
||||
query.Categories.Any(c => _allMoviesCategories.Contains(c));
|
||||
if (isMovieSearch)
|
||||
{
|
||||
releases.AddRange(await MovieSearch(query));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +205,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> TvSearch(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> newpctReleases = null;
|
||||
List<ReleaseInfo> newpctReleases = null;
|
||||
|
||||
string seriesName = query.SanitizedSearchTerm;
|
||||
int? season = query.Season > 0 ? (int?)query.Season : null;
|
||||
@@ -242,7 +264,8 @@ namespace Jackett.Common.Indexers
|
||||
return newpctReleases.Where(r =>
|
||||
{
|
||||
NewpctRelease nr = r as NewpctRelease;
|
||||
return nr.Season.HasValue != season.HasValue || //Can't determine if same season
|
||||
return (
|
||||
nr.Season.HasValue != season.HasValue || //Can't determine if same season
|
||||
nr.Season.HasValue && season.Value == nr.Season.Value && //Same season and ...
|
||||
(
|
||||
nr.Episode.HasValue != episode.HasValue || //Can't determine if same episode
|
||||
@@ -251,7 +274,8 @@ namespace Jackett.Common.Indexers
|
||||
nr.Episode.Value == episode.Value || //Same episode
|
||||
nr.EpisodeTo.HasValue && episode.Value >= nr.Episode.Value && episode.Value <= nr.EpisodeTo.Value //Episode in interval
|
||||
)
|
||||
);
|
||||
)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -285,7 +309,7 @@ namespace Jackett.Common.Indexers
|
||||
private IEnumerable<Uri> SeriesListUris(string seriesName)
|
||||
{
|
||||
IEnumerable<string> lettersUrl;
|
||||
if (!((BoolItem)configData.GetDynamic("IncludeVo")).Value)
|
||||
if (!_includeVo)
|
||||
{
|
||||
lettersUrl = _seriesLetterUrls;
|
||||
}
|
||||
@@ -296,7 +320,7 @@ namespace Jackett.Common.Indexers
|
||||
string seriesLetter = !char.IsDigit(seriesName[0]) ? seriesName[0].ToString() : "0-9";
|
||||
return lettersUrl.Select(urlFormat =>
|
||||
{
|
||||
return new Uri(SiteLinkUri, string.Format(urlFormat, seriesLetter.ToLower()));
|
||||
return new Uri(_siteUri, string.Format(urlFormat, seriesLetter.ToLower()));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -319,6 +343,8 @@ namespace Jackett.Common.Indexers
|
||||
title = title2;
|
||||
|
||||
var detailsUrl = anchor.GetAttribute("href");
|
||||
if (!_includeVo && _voUrls.Any(vo => detailsUrl.ToLower().Contains(vo.ToLower())))
|
||||
continue;
|
||||
|
||||
var span = row.QuerySelector("span");
|
||||
var quality = span.ChildNodes[0].TextContent.Trim();
|
||||
@@ -331,12 +357,12 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
NewpctRelease newpctRelease;
|
||||
if (releaseType == ReleaseType.TV)
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
string.Format("Serie {0} - {1} Calidad [{2}]", title, language, quality),
|
||||
detailsUrl, quality, language, ReleaseInfo.GetBytes(sizeText), _dailyNow - TimeSpan.FromMilliseconds(_dailyResultIdx));
|
||||
else
|
||||
newpctRelease = GetReleaseFromData(releaseType,
|
||||
string.Format("{0} [{1}][{2}]", title, quality, language),
|
||||
string.Format("{0} [{1}][{2}]", title, quality, language),
|
||||
detailsUrl, quality, language, ReleaseInfo.GetBytes(sizeText), _dailyNow - TimeSpan.FromMilliseconds(_dailyResultIdx));
|
||||
|
||||
releases.Add(newpctRelease);
|
||||
@@ -410,6 +436,113 @@ namespace Jackett.Common.Indexers
|
||||
return releases;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ReleaseInfo>> MovieSearch(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<NewpctRelease>();
|
||||
|
||||
string searchStr = query.SanitizedSearchTerm;
|
||||
|
||||
int pg = 1;
|
||||
while (pg <= _maxMoviesPages)
|
||||
{
|
||||
var queryCollection = new Dictionary<string, string>();
|
||||
queryCollection.Add("q", searchStr);
|
||||
queryCollection.Add("pg", pg.ToString());
|
||||
|
||||
Uri url = new Uri(_siteUri, string.Format(_searchUrl, pg));
|
||||
var results = await PostDataWithCookies(url.AbsoluteUri, queryCollection);
|
||||
|
||||
var items = ParseSearchContent(results.Content);
|
||||
if (items == null || !items.Any())
|
||||
break;
|
||||
|
||||
releases.AddRange(items);
|
||||
pg++;
|
||||
}
|
||||
|
||||
ScoreReleases(releases, searchStr);
|
||||
|
||||
if (_filterMovies)
|
||||
releases = releases.Where(r => r.Score < _wordNotFoundScore).ToList();
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
private IEnumerable<NewpctRelease> ParseSearchContent(string content)
|
||||
{
|
||||
var SearchResultParser = new HtmlParser();
|
||||
var doc = SearchResultParser.Parse(content);
|
||||
|
||||
List<NewpctRelease> releases = new List<NewpctRelease>();
|
||||
|
||||
try
|
||||
{
|
||||
var rows = doc.QuerySelectorAll(".content .info");
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var anchor = row.QuerySelector("a");
|
||||
var h2 = anchor.QuerySelector("h2");
|
||||
var title = Regex.Replace(h2.TextContent, @"\s+", " ").Trim();
|
||||
var detailsUrl = anchor.GetAttribute("href");
|
||||
|
||||
bool isSeries = h2.QuerySelector("span") != null && h2.TextContent.ToLower().Contains("calidad");
|
||||
bool isGame = title.ToLower().Contains("pcdvd");
|
||||
if (isSeries || isGame)
|
||||
continue;
|
||||
|
||||
var span = row.QuerySelectorAll("span");
|
||||
|
||||
var pubDateText = span[1].TextContent.Trim();
|
||||
var sizeText = span[2].TextContent.Trim();
|
||||
|
||||
long size = ReleaseInfo.GetBytes(sizeText);
|
||||
DateTime publishDate = DateTime.ParseExact(pubDateText, "dd-MM-yyyy", null);
|
||||
|
||||
var div = row.QuerySelector("div");
|
||||
|
||||
NewpctRelease newpctRelease;
|
||||
newpctRelease = GetReleaseFromData(ReleaseType.Movie, title, detailsUrl, null, null, size, publishDate);
|
||||
|
||||
releases.Add(newpctRelease);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
private void ScoreReleases(IEnumerable<NewpctRelease> releases, string searchTerm)
|
||||
{
|
||||
string[] searchWords = searchTerm.ToLower().Split(_wordSeparators, StringSplitOptions.None).
|
||||
Select(s => s.Trim()).
|
||||
Where(s => !string.IsNullOrEmpty(s)).ToArray();
|
||||
|
||||
foreach (NewpctRelease release in releases)
|
||||
{
|
||||
release.Score = 0;
|
||||
string[] releaseWords = release.Title.ToLower().Split(_wordSeparators, StringSplitOptions.None).
|
||||
Select(s => s.Trim()).
|
||||
Where(s => !string.IsNullOrEmpty(s)).ToArray();
|
||||
|
||||
foreach (string search in searchWords)
|
||||
{
|
||||
int index = Array.IndexOf(releaseWords, search);
|
||||
if (index >= 0)
|
||||
{
|
||||
release.Score += index;
|
||||
releaseWords[index] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Score += _wordNotFoundScore;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ReleaseType ReleaseTypeFromQuality(string quality)
|
||||
{
|
||||
if (quality.Trim().ToLower().StartsWith("hdtv"))
|
||||
@@ -434,6 +567,8 @@ namespace Jackett.Common.Indexers
|
||||
result.Episode = int.Parse(match.Groups[8].Value.Trim().PadLeft(2, '0'));
|
||||
result.EpisodeTo = match.Groups[11].Success ? (int?)int.Parse(match.Groups[11].Value.Trim()) : null;
|
||||
string audioQuality = match.Groups[13].Value.Trim(' ', '[', ']');
|
||||
if (string.IsNullOrEmpty(language))
|
||||
language = audioQuality;
|
||||
quality = match.Groups[14].Value.Trim(' ', '[', ']');
|
||||
|
||||
string seasonText = result.Season.ToString();
|
||||
@@ -448,11 +583,11 @@ namespace Jackett.Common.Indexers
|
||||
Match matchClassic = _titleClassicRegex.Match(title);
|
||||
if (matchClassic.Success)
|
||||
{
|
||||
result.Season = matchClassic.Groups[3].Success ? (int?)int.Parse(matchClassic.Groups[3].Value) : null;
|
||||
result.Episode = matchClassic.Groups[4].Success ? (int?)int.Parse(matchClassic.Groups[4].Value) : null;
|
||||
result.EpisodeTo = matchClassic.Groups[7].Success ? (int?)int.Parse(matchClassic.Groups[7].Value) : null;
|
||||
if (matchClassic.Groups[2].Success)
|
||||
quality = matchClassic.Groups[2].Value;
|
||||
result.Season = matchClassic.Groups[2].Success ? (int?)int.Parse(matchClassic.Groups[2].Value) : null;
|
||||
result.Episode = matchClassic.Groups[3].Success ? (int?)int.Parse(matchClassic.Groups[3].Value) : null;
|
||||
result.EpisodeTo = matchClassic.Groups[6].Success ? (int?)int.Parse(matchClassic.Groups[6].Value) : null;
|
||||
if (matchClassic.Groups[1].Success)
|
||||
quality = matchClassic.Groups[1].Value;
|
||||
}
|
||||
|
||||
result.Title = title;
|
||||
@@ -478,29 +613,29 @@ namespace Jackett.Common.Indexers
|
||||
result.Seeders = 1;
|
||||
result.Peers = 1;
|
||||
|
||||
result.Title = FixedTitle(result, quality);
|
||||
result.Title = FixedTitle(result, quality, language);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private string FixedTitle(NewpctRelease release, string quality)
|
||||
private string FixedTitle(NewpctRelease release, string quality, string language)
|
||||
{
|
||||
if (String.IsNullOrEmpty(release.SeriesName))
|
||||
{
|
||||
release.SeriesName = release.Title;
|
||||
if (release.Title.Contains("-"))
|
||||
{
|
||||
release.SeriesName = release.Title.Substring(0, release.Title.IndexOf('-') - 1);
|
||||
}
|
||||
}
|
||||
if (String.IsNullOrEmpty(quality))
|
||||
{
|
||||
quality = "HDTV";
|
||||
if (release.NewpctReleaseType == ReleaseType.TV && release.SeriesName.Contains("-"))
|
||||
release.SeriesName = release.Title.Substring(0, release.SeriesName.IndexOf('-') - 1);
|
||||
}
|
||||
|
||||
var titleParts = new List<string>();
|
||||
|
||||
titleParts.Add(release.SeriesName);
|
||||
|
||||
if (release.NewpctReleaseType == ReleaseType.TV)
|
||||
{
|
||||
if (String.IsNullOrEmpty(quality))
|
||||
quality = "HDTV";
|
||||
|
||||
var seasonAndEpisode = "S" + release.Season.ToString().PadLeft(2, '0');
|
||||
seasonAndEpisode += "E" + release.Episode.ToString().PadLeft(2, '0');
|
||||
if (release.EpisodeTo != release.Episode && release.EpisodeTo != null && release.EpisodeTo != 0)
|
||||
@@ -509,12 +644,31 @@ namespace Jackett.Common.Indexers
|
||||
}
|
||||
titleParts.Add(seasonAndEpisode);
|
||||
}
|
||||
titleParts.Add(quality.Replace("[", "").Replace("]", ""));
|
||||
if (release.Title.ToLower().Contains("esp") || release.Title.ToLower().Contains("cast"))
|
||||
|
||||
if (!string.IsNullOrEmpty(quality) && !release.SeriesName.Contains(quality))
|
||||
{
|
||||
titleParts.Add(quality);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(language) && !release.SeriesName.Contains(language))
|
||||
{
|
||||
titleParts.Add(language);
|
||||
}
|
||||
|
||||
if (release.Title.ToLower().Contains("espa\u00F1ol") ||
|
||||
release.Title.ToLower().Contains("espanol") ||
|
||||
release.Title.ToLower().Contains("castellano") ||
|
||||
release.Title.ToLower().EndsWith("espa"))
|
||||
{
|
||||
titleParts.Add("Spanish");
|
||||
}
|
||||
return String.Join(".", titleParts);
|
||||
|
||||
string result = String.Join(".", titleParts);
|
||||
|
||||
result = Regex.Replace(result, @"[\[\]]+", ".");
|
||||
result = Regex.Replace(result, @"\.[ \.]*\.", ".");
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -348,7 +348,7 @@ namespace Jackett.Common.Indexers
|
||||
// Category
|
||||
string categoryID = tRow.Find("td:eq(0) > a:eq(0)").Attr("href").Split('?').Last();
|
||||
var newznab = MapTrackerCatToNewznab(categoryID);
|
||||
Output("Category: " + MapTrackerCatToNewznab(categoryID).First().ToString() + " (" + categoryID + ")");
|
||||
Output("Category: " + (newznab.Count > 0 ? newznab.First().ToString() : "unknown category") + " (" + categoryID + ")");
|
||||
|
||||
// Seeders
|
||||
int seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(9)").Text(), @"\d+").Value);
|
||||
@@ -397,7 +397,7 @@ namespace Jackett.Common.Indexers
|
||||
// Building release infos
|
||||
var release = new ReleaseInfo
|
||||
{
|
||||
Category = MapTrackerCatToNewznab(categoryID.ToString()),
|
||||
Category = newznab,
|
||||
Title = name,
|
||||
Seeders = seeders,
|
||||
Peers = seeders + leechers,
|
||||
@@ -680,7 +680,15 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
var defaultTheme = new[] { "/templates/1/", "/templates/2/", "/templates/3/", "/templates/4/", "/templates/5/", "/templates/6/", "/templates/11/", "/templates/12/" };
|
||||
var oldV2 = new[] { "/templates/7/", "/templates/8/", "/templates/9/", "/templates/10/", "/templates/14/" };
|
||||
|
||||
|
||||
// template 7 contains a reference to template 2 (logout button), so check for oldV2 first
|
||||
if (oldV2.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody')
|
||||
return _fDom["# base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)"];
|
||||
}
|
||||
|
||||
if (defaultTheme.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
@@ -688,12 +696,6 @@ namespace Jackett.Common.Indexers
|
||||
return _fDom["# base_content2 > div.article > table > tbody:not(:first) > tr"];
|
||||
}
|
||||
|
||||
if (oldV2.Any(_fDom.Document.Body.InnerHTML.Contains))
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
// $('#base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody')
|
||||
return _fDom["# base_content > table.mainouter > tbody > tr > td.outer > div.article > table > tbody > tr:not(:first)"];
|
||||
}
|
||||
return _fDom;
|
||||
}
|
||||
|
||||
|
@@ -7,12 +7,12 @@ using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class Apollo : GazelleTracker
|
||||
public class Orpheus : GazelleTracker
|
||||
{
|
||||
public Apollo(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Apollo",
|
||||
public Orpheus(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Orpheus",
|
||||
desc: "A music tracker",
|
||||
link: "https://apollo.rip/",
|
||||
link: "https://orpheus.network/",
|
||||
configService: configService,
|
||||
logger: logger,
|
||||
protectionService: protectionService,
|
||||
@@ -33,4 +33,4 @@ namespace Jackett.Common.Indexers
|
||||
AddCategoryMapping(7, TorznabCatType.Books, "Comics");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -3,11 +3,16 @@ using Jackett.Common.Models;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using NLog;
|
||||
using System;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class Psytorrents : GazelleTracker
|
||||
{
|
||||
private static readonly string[] certificateHashs = new string[] {
|
||||
"455333CC651C249E1A91DFF8EFC2A5F8044FE956", // expired
|
||||
};
|
||||
|
||||
public Psytorrents(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Psytorrents",
|
||||
desc: "Psytorrents (PSY) is a Private Torrent Tracker for ELECTRONIC MUSIC",
|
||||
@@ -22,9 +27,13 @@ namespace Jackett.Common.Indexers
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.Audio, "Music");
|
||||
AddCategoryMapping(2, TorznabCatType.Movies, "Movies");
|
||||
AddCategoryMapping(3, TorznabCatType.PC0day, "App");
|
||||
|
||||
foreach (var certificateHash in certificateHashs)
|
||||
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -59,7 +59,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
TorznabCaps.SupportsImdbSearch = true;
|
||||
|
||||
webclient.requestDelay = 2.0; // 0.5 requests per second (2 causes problems)
|
||||
webclient.requestDelay = 2.1; // The api has a 1req/2s limit.
|
||||
|
||||
AddCategoryMapping(4, TorznabCatType.XXX, "XXX (18+)");
|
||||
AddCategoryMapping(14, TorznabCatType.MoviesSD, "Movies/XVID");
|
||||
@@ -164,11 +164,11 @@ namespace Jackett.Common.Indexers
|
||||
queryCollection.Add("mode", "list");
|
||||
}
|
||||
|
||||
var cats = string.Join(";", MapTorznabCapsToTrackers(query));
|
||||
if (!string.IsNullOrEmpty(cats))
|
||||
{
|
||||
queryCollection.Add("category", cats);
|
||||
}
|
||||
var querycats = MapTorznabCapsToTrackers(query);
|
||||
if (querycats.Count == 0)
|
||||
querycats = GetAllTrackerCategories(); // default to all, without specifing it some categories are missing (e.g. games), see #4146
|
||||
var cats = string.Join(";", querycats);
|
||||
queryCollection.Add("category", cats);
|
||||
|
||||
var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString();
|
||||
var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty);
|
||||
@@ -217,6 +217,7 @@ namespace Jackett.Common.Indexers
|
||||
release.InfoHash = release.MagnetUri.ToString().Split(':')[3].Split('&')[0];
|
||||
|
||||
release.Comments = new Uri(item.Value<string>("info_page"));
|
||||
release.Link = release.Comments; // in case of a torrent download we grab the link from the details page in Download()
|
||||
release.Guid = release.MagnetUri;
|
||||
|
||||
var episode_info = item.Value<JToken>("episode_info");
|
||||
@@ -251,5 +252,27 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
public override async Task<byte[]> Download(Uri link)
|
||||
{
|
||||
// build download link from info redirect link
|
||||
var slink = link.ToString();
|
||||
var response = await RequestStringWithCookies(slink);
|
||||
if (!response.IsRedirect && response.Content.Contains("Invalid token."))
|
||||
{
|
||||
// get new token
|
||||
token = null;
|
||||
await CheckToken();
|
||||
slink += "&token=" + token;
|
||||
response = await RequestStringWithCookies(slink);
|
||||
}
|
||||
if (!response.IsRedirect)
|
||||
throw new Exception("Downlaod Failed, expected redirect");
|
||||
|
||||
var targeturi = new Uri(response.RedirectingTo);
|
||||
var id = targeturi.Segments.Last();
|
||||
var dluri = new Uri(targeturi, "/download.php?id=" + id + "&f=jackett.torrent");
|
||||
return await base.Download(dluri, RequestType.GET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class SpeedCD : BaseWebIndexer
|
||||
{
|
||||
private string LoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
private string LoginUrl { get { return SiteLink + "take.login.php"; } }
|
||||
private string SearchUrl { get { return SiteLink + "browse.php"; } }
|
||||
|
||||
private new ConfigurationDataBasicLogin configData
|
||||
|
@@ -19,9 +19,11 @@ namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class TorrentHeaven : BaseWebIndexer
|
||||
{
|
||||
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
|
||||
"https://torrentheaven.myfqdn.info/",
|
||||
};
|
||||
private string IndexUrl { get { return SiteLink + "index.php"; } }
|
||||
private string LoginCompleteUrl { get { return SiteLink + "index.php?strWebValue=account&strWebAction=login_complete&ancestry=verify"; } }
|
||||
private static readonly string certificateHash = "6F5CE30D578C2A7AECFB919D0D013976D395055F";
|
||||
|
||||
private new ConfigurationDataCaptchaLogin configData
|
||||
{
|
||||
@@ -32,7 +34,7 @@ namespace Jackett.Common.Indexers
|
||||
public TorrentHeaven(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "TorrentHeaven",
|
||||
description: "A German general tracker.",
|
||||
link: "https://torrentheaven.myfqdn.info/",
|
||||
link: "https://newheaven.nl/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
configService: configService,
|
||||
client: wc,
|
||||
@@ -91,8 +93,6 @@ namespace Jackett.Common.Indexers
|
||||
AddCategoryMapping(30, TorznabCatType.PC, "APPLICATIONS/Sonstige");
|
||||
AddCategoryMapping(70, TorznabCatType.PC, "APPLICATIONS/Linux");
|
||||
AddCategoryMapping(71, TorznabCatType.PCMac, "APPLICATIONS/Mac");
|
||||
|
||||
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
|
||||
}
|
||||
|
||||
public override async Task<ConfigurationData> GetConfigurationForSetup()
|
||||
|
@@ -187,7 +187,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
var qRow = row.Cq();
|
||||
|
||||
var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1];
|
||||
var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1].Split('&')[0];
|
||||
release.Category = MapTrackerCatToNewznab(catStr);
|
||||
|
||||
var qLink = row.ChildElements.ElementAt(2).FirstElementChild.Cq();
|
||||
@@ -221,8 +221,9 @@ namespace Jackett.Common.Indexers
|
||||
if (imdbLink.Any())
|
||||
release.Imdb = ParseUtil.GetLongFromString(imdbLink.Attr("href"));
|
||||
|
||||
var sizeStr = row.ChildElements.ElementAt(5).Cq().Text();
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
var sizeFileCountRowChilds = row.ChildElements.ElementAt(5).ChildElements;
|
||||
release.Size = ReleaseInfo.GetBytes(sizeFileCountRowChilds.ElementAt(0).Cq().Text());
|
||||
release.Files = ParseUtil.CoerceInt(sizeFileCountRowChilds.ElementAt(2).Cq().Text());
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text());
|
||||
release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()) + release.Seeders;
|
||||
|
@@ -1,979 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using CsQuery;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig.Bespoke;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
/// <summary>
|
||||
/// Provider for WiHD Private French Tracker
|
||||
/// </summary>
|
||||
public class WiHD : BaseCachingWebIndexer
|
||||
{
|
||||
private string LoginUrl { get { return SiteLink + "login"; } }
|
||||
private string LoginCheckUrl { get { return SiteLink + "login_check"; } }
|
||||
private string SearchUrl { get { return SiteLink + "torrent/ajaxfiltertorrent/"; } }
|
||||
private bool Latency { get { return ConfigData.Latency.Value; } }
|
||||
private bool DevMode { get { return ConfigData.DevMode.Value; } }
|
||||
private bool CacheMode { get { return ConfigData.HardDriveCache.Value; } }
|
||||
private static string Directory => Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name.ToLower(), MethodBase.GetCurrentMethod().DeclaringType?.Name.ToLower());
|
||||
|
||||
private Dictionary<string, string> emulatedBrowserHeaders = new Dictionary<string, string>();
|
||||
private CQ fDom = null;
|
||||
|
||||
private ConfigurationDataWiHD ConfigData
|
||||
{
|
||||
get { return (ConfigurationDataWiHD)configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public WiHD(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
|
||||
: base(
|
||||
name: "WiHD",
|
||||
description: "Your World in High Definition",
|
||||
link: "https://world-in-hd.net/",
|
||||
caps: new TorznabCapabilities(),
|
||||
configService: configService,
|
||||
client: w,
|
||||
logger: l,
|
||||
p: ps,
|
||||
downloadBase: "https://world-in-hd.net/torrents/download/",
|
||||
configData: new ConfigurationDataWiHD())
|
||||
{
|
||||
Encoding = Encoding.UTF8;
|
||||
Language = "fr-fr";
|
||||
Type = "private";
|
||||
|
||||
// Clean capabilities
|
||||
TorznabCaps.Categories.Clear();
|
||||
|
||||
// Movies
|
||||
AddCategoryMapping("565af82b1fd35761568b4572", TorznabCatType.MoviesHD); // 1080P
|
||||
AddCategoryMapping("565af82b1fd35761568b4574", TorznabCatType.MoviesHD); // 720P
|
||||
AddCategoryMapping("565af82b1fd35761568b4576", TorznabCatType.MoviesHD); // HDTV
|
||||
AddCategoryMapping("565af82b1fd35761568b4578", TorznabCatType.MoviesBluRay); // Bluray
|
||||
AddCategoryMapping("565af82b1fd35761568b457a", TorznabCatType.MoviesBluRay); // Bluray Remux
|
||||
AddCategoryMapping("565af82b1fd35761568b457c", TorznabCatType.Movies3D); // Bluray 3D
|
||||
|
||||
// TV
|
||||
AddCategoryMapping("565af82d1fd35761568b4587", TorznabCatType.TVHD); // 1080P
|
||||
AddCategoryMapping("565af82d1fd35761568b4589", TorznabCatType.TVHD); // 720P
|
||||
AddCategoryMapping("565af82d1fd35761568b458b", TorznabCatType.TVHD); // HDTV
|
||||
AddCategoryMapping("565af82d1fd35761568b458d", TorznabCatType.TVHD); // Bluray
|
||||
AddCategoryMapping("565af82d1fd35761568b458f", TorznabCatType.TVHD); // Bluray Remux
|
||||
AddCategoryMapping("565af82d1fd35761568b4591", TorznabCatType.TVHD); // Bluray 3D
|
||||
|
||||
// Anime
|
||||
AddCategoryMapping("565af82d1fd35761568b459c", TorznabCatType.TVAnime); // 1080P
|
||||
AddCategoryMapping("565af82d1fd35761568b459e", TorznabCatType.TVAnime); // 720P
|
||||
AddCategoryMapping("565af82d1fd35761568b45a0", TorznabCatType.TVAnime); // HDTV
|
||||
AddCategoryMapping("565af82d1fd35761568b45a2", TorznabCatType.TVAnime); // Bluray
|
||||
AddCategoryMapping("565af82d1fd35761568b45a4", TorznabCatType.TVAnime); // Bluray Remux
|
||||
AddCategoryMapping("565af82d1fd35761568b45a6", TorznabCatType.TVAnime); // Bluray 3D
|
||||
|
||||
// Other
|
||||
AddCategoryMapping("565af82d1fd35761568b45af", TorznabCatType.PC); // Apps
|
||||
AddCategoryMapping("565af82d1fd35761568b45b1", TorznabCatType.AudioVideo); // Clips
|
||||
AddCategoryMapping("565af82d1fd35761568b45b3", TorznabCatType.AudioOther); // Audios Tracks of Movies/TV/Anime
|
||||
AddCategoryMapping("565af82d1fd35761568b45b5", TorznabCatType.TVDocumentary); // Documentary
|
||||
AddCategoryMapping("565af82d1fd35761568b45b7", TorznabCatType.MoviesBluRay); // Bluray (ALL)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configure our WiHD Provider
|
||||
/// </summary>
|
||||
/// <param name="configJson">Our params in Json</param>
|
||||
/// <returns>Configuration state</returns>
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
// Retrieve config values set by Jackett's user
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
// Check & Validate Config
|
||||
validateConfig();
|
||||
|
||||
// Setting our data for a better emulated browser (maximum security)
|
||||
// TODO: Encoded Content not supported by Jackett at this time
|
||||
// emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");
|
||||
|
||||
// If we want to simulate a browser
|
||||
if (ConfigData.Browser.Value)
|
||||
{
|
||||
// Clean headers
|
||||
emulatedBrowserHeaders.Clear();
|
||||
|
||||
// Inject headers
|
||||
emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
|
||||
emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
|
||||
emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
|
||||
emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
|
||||
emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
|
||||
}
|
||||
|
||||
// Getting login form to retrieve CSRF token
|
||||
var myRequest = new Utils.Clients.WebRequest()
|
||||
{
|
||||
Url = LoginUrl
|
||||
};
|
||||
|
||||
// Add our headers to request
|
||||
myRequest.Headers = emulatedBrowserHeaders;
|
||||
|
||||
// Get login page
|
||||
var loginPage = await webclient.GetString(myRequest);
|
||||
|
||||
// Retrieving our CSRF token
|
||||
CQ loginPageDom = loginPage.Content;
|
||||
var csrfToken = loginPageDom["input[name=\"_csrf_token\"]"].Last();
|
||||
|
||||
// Building login form data
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "_csrf_token", csrfToken.Attr("value") },
|
||||
{ "_username", ConfigData.Username.Value },
|
||||
{ "_password", ConfigData.Password.Value },
|
||||
{ "_remember_me", "on" },
|
||||
{ "_submit", "" }
|
||||
};
|
||||
|
||||
// Do the login
|
||||
var request = new Utils.Clients.WebRequest()
|
||||
{
|
||||
Cookies = loginPage.Cookies,
|
||||
PostData = pairs,
|
||||
Referer = LoginUrl,
|
||||
Type = RequestType.POST,
|
||||
Url = LoginUrl,
|
||||
Headers = emulatedBrowserHeaders
|
||||
};
|
||||
|
||||
// Perform loggin
|
||||
latencyNow();
|
||||
output("\nPerform loggin.. with " + LoginCheckUrl);
|
||||
var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null);
|
||||
|
||||
// Test if we are logged in
|
||||
await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () =>
|
||||
{
|
||||
// Oops, unable to login
|
||||
output("-> Login failed", "error");
|
||||
throw new ExceptionWithConfigData("Failed to login", configData);
|
||||
});
|
||||
|
||||
output("-> Login Success");
|
||||
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Execute our search query
|
||||
/// </summary>
|
||||
/// <param name="query">Query</param>
|
||||
/// <returns>Releases</returns>
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var torrentRowList = new List<CQ>();
|
||||
var searchTerm = query.GetQueryString();
|
||||
var searchUrl = SearchUrl;
|
||||
int nbResults = 0;
|
||||
int pageLinkCount = 0;
|
||||
|
||||
// Check cache first so we don't query the server (if search term used or not in dev mode)
|
||||
if (!DevMode && !string.IsNullOrEmpty(searchTerm))
|
||||
{
|
||||
lock (cache)
|
||||
{
|
||||
// Remove old cache items
|
||||
CleanCache();
|
||||
|
||||
// Search in cache
|
||||
var cachedResult = cache.Where(i => i.Query == searchTerm).FirstOrDefault();
|
||||
if (cachedResult != null)
|
||||
return cachedResult.Results.Select(s => (ReleaseInfo)s.Clone()).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
// Add emulated XHR request
|
||||
emulatedBrowserHeaders.Add("X-Requested-With", "XMLHttpRequest");
|
||||
|
||||
// Build our query
|
||||
var request = buildQuery(searchTerm, query, searchUrl);
|
||||
|
||||
// Getting results & Store content
|
||||
fDom = await queryExec(request);
|
||||
|
||||
try
|
||||
{
|
||||
// Find number of results
|
||||
nbResults = ParseUtil.CoerceInt(Regex.Match(fDom["div.ajaxtotaltorrentcount"].Text(), @"\d+").Value);
|
||||
|
||||
// Find torrent rows
|
||||
var firstPageRows = findTorrentRows();
|
||||
|
||||
// Add them to torrents list
|
||||
torrentRowList.AddRange(firstPageRows.Select(fRow => fRow.Cq()));
|
||||
|
||||
// Check if there are pagination links at bottom
|
||||
Boolean pagination = (nbResults != 0);
|
||||
|
||||
// If pagination available
|
||||
if (pagination)
|
||||
{
|
||||
// Calculate numbers of pages available for this search query (Based on number results and number of torrents on first page)
|
||||
pageLinkCount = (int)Math.Ceiling((double)nbResults / firstPageRows.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if we have a minimum of one result
|
||||
if (firstPageRows.Length >= 1)
|
||||
{
|
||||
// Set page count arbitrary to one
|
||||
pageLinkCount = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
output("\nNo result found for your query, please try another search term ...\n", "info");
|
||||
// No result found for this query
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
output("\nFound " + nbResults + " result(s) in " + pageLinkCount + " page(s) for this query !");
|
||||
output("\nThere are " + firstPageRows.Length + " results on the first page !");
|
||||
|
||||
// If we have a term used for search and pagination result superior to one
|
||||
if (!string.IsNullOrWhiteSpace(query.GetQueryString()) && pageLinkCount > 1)
|
||||
{
|
||||
// Starting with page #2
|
||||
for (int i = 2; i <= Math.Min(Int32.Parse(ConfigData.Pages.Value), pageLinkCount); i++)
|
||||
{
|
||||
output("\nProcessing page #" + i);
|
||||
|
||||
// Request our page
|
||||
latencyNow();
|
||||
|
||||
// Build our query
|
||||
var pageRequest = buildQuery(searchTerm, query, searchUrl, i);
|
||||
|
||||
// Getting results & Store content
|
||||
fDom = await queryExec(pageRequest);
|
||||
|
||||
// Process page results
|
||||
var additionalPageRows = findTorrentRows();
|
||||
|
||||
// Add them to torrents list
|
||||
torrentRowList.AddRange(additionalPageRows.Select(fRow => fRow.Cq()));
|
||||
}
|
||||
}
|
||||
|
||||
// Loop on results
|
||||
foreach (CQ tRow in torrentRowList)
|
||||
{
|
||||
output("\n=>> Torrent #" + (releases.Count + 1));
|
||||
|
||||
// Release Name
|
||||
string name = tRow.Find(".torrent-h3 > h3 > a").Attr("title").ToString();
|
||||
output("Release: " + name);
|
||||
|
||||
// Category
|
||||
string categoryID = tRow.Find(".category > img").Attr("src").Split('/').Last().ToString();
|
||||
string categoryName = tRow.Find(".category > img").Attr("title").ToString();
|
||||
output("Category: " + MapTrackerCatToNewznab(mediaToCategory(categoryID, categoryName)).First().ToString() + " (" + categoryName + ")");
|
||||
|
||||
// Uploader
|
||||
string uploader = tRow.Find(".uploader > span > a").Attr("title").ToString();
|
||||
output("Uploader: " + uploader);
|
||||
|
||||
// Seeders
|
||||
int seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".seeders")[0].LastChild.ToString(), @"\d+").Value);
|
||||
output("Seeders: " + seeders);
|
||||
|
||||
// Leechers
|
||||
int leechers = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".leechers")[0].LastChild.ToString(), @"\d+").Value);
|
||||
output("Leechers: " + leechers);
|
||||
|
||||
// Completed
|
||||
int completed = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".completed")[0].LastChild.ToString(), @"\d+").Value);
|
||||
output("Completed: " + completed);
|
||||
|
||||
// Comments
|
||||
int comments = ParseUtil.CoerceInt(Regex.Match(tRow.Find(".comments")[0].LastChild.ToString(), @"\d+").Value);
|
||||
output("Comments: " + comments);
|
||||
|
||||
// Size & Publish Date
|
||||
string infosData = tRow.Find(".torrent-h3 > span")[0].LastChild.ToString().Trim();
|
||||
IList<string> infosList = infosData.Split('-').Select(s => s.Trim()).Where(s => s != String.Empty).ToList();
|
||||
|
||||
// --> Size
|
||||
var size = ReleaseInfo.GetBytes(infosList[1].Replace("Go", "gb").Replace("Mo", "mb").Replace("Ko", "kb"));
|
||||
output("Size: " + infosList[1] + " (" + size + " bytes)");
|
||||
|
||||
// --> Publish Date
|
||||
IList<string> clockList = infosList[0].Replace("Il y a", "").Split(',').Select(s => s.Trim()).Where(s => s != String.Empty).ToList();
|
||||
var clock = agoToDate(clockList);
|
||||
output("Released on: " + clock.ToString());
|
||||
|
||||
// Torrent Details URL
|
||||
string details = tRow.Find(".torrent-h3 > h3 > a").Attr("href").ToString().TrimStart('/');
|
||||
Uri detailsLink = new Uri(SiteLink + details);
|
||||
output("Details: " + detailsLink.AbsoluteUri);
|
||||
|
||||
// Torrent Comments URL
|
||||
Uri commentsLink = new Uri(SiteLink + details + "#tab_2");
|
||||
output("Comments Link: " + commentsLink.AbsoluteUri);
|
||||
|
||||
// Torrent Download URL
|
||||
string download = tRow.Find(".download-item > a").Attr("href").ToString().TrimStart('/');
|
||||
Uri downloadLink = new Uri(SiteLink + download);
|
||||
output("Download Link: " + downloadLink.AbsoluteUri);
|
||||
|
||||
// Freeleech
|
||||
int downloadVolumeFactor = 1;
|
||||
if (tRow.Find(".fl-item").Length >= 1)
|
||||
{
|
||||
downloadVolumeFactor = 0;
|
||||
output("FreeLeech =)");
|
||||
}
|
||||
|
||||
// Building release infos
|
||||
var release = new ReleaseInfo()
|
||||
{
|
||||
Category = MapTrackerCatToNewznab(mediaToCategory(categoryID, categoryName)),
|
||||
Title = name,
|
||||
Seeders = seeders,
|
||||
Peers = seeders + leechers,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 345600,
|
||||
PublishDate = clock,
|
||||
Size = size,
|
||||
Guid = detailsLink,
|
||||
Comments = commentsLink,
|
||||
Link = downloadLink,
|
||||
UploadVolumeFactor = 1,
|
||||
DownloadVolumeFactor = downloadVolumeFactor
|
||||
};
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError("Error, unable to parse result \n" + ex.StackTrace, ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Remove our XHR request header
|
||||
emulatedBrowserHeaders.Remove("X-Requested-With");
|
||||
}
|
||||
|
||||
// Return found releases
|
||||
return releases;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Build query to process
|
||||
/// </summary>
|
||||
/// <param name="term">Term to search</param>
|
||||
/// <param name="query">Torznab Query for categories mapping</param>
|
||||
/// <param name="url">Search url for provider</param>
|
||||
/// <param name="page">Page number to request</param>
|
||||
/// <returns>URL to query for parsing and processing results</returns>
|
||||
private string buildQuery(string term, TorznabQuery query, string url, int page = 1)
|
||||
{
|
||||
var parameters = new NameValueCollection();
|
||||
List<string> categoriesList = MapTorznabCapsToTrackers(query);
|
||||
string categories = null;
|
||||
|
||||
// If search term not provided
|
||||
if (string.IsNullOrWhiteSpace(term))
|
||||
{
|
||||
// Showing all torrents (just for output function)
|
||||
term = "null";
|
||||
}
|
||||
|
||||
// Encode & Add search term to URL
|
||||
url += Uri.EscapeDataString(term);
|
||||
|
||||
// Check if we are processing a new page
|
||||
if (page > 1)
|
||||
{
|
||||
// Adding page number to query
|
||||
url += "/" + page.ToString();
|
||||
}
|
||||
|
||||
// Adding interrogation point
|
||||
url += "?";
|
||||
|
||||
// Building our tracker query
|
||||
parameters.Add("exclu", Convert.ToInt32(ConfigData.Exclusive.Value).ToString());
|
||||
parameters.Add("freeleech", Convert.ToInt32(ConfigData.Freeleech.Value).ToString());
|
||||
parameters.Add("reseed", Convert.ToInt32(ConfigData.Reseed.Value).ToString());
|
||||
|
||||
// Loop on Categories needed
|
||||
foreach (string category in categoriesList)
|
||||
{
|
||||
// If last, build !
|
||||
if (categoriesList.Last() == category)
|
||||
{
|
||||
// Adding previous categories to URL with latest category
|
||||
parameters.Add(Uri.EscapeDataString("subcat[]"), category + categories);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Build categories parameter
|
||||
categories += "&" + Uri.EscapeDataString("subcat[]") + "=" + category;
|
||||
}
|
||||
}
|
||||
|
||||
// Add timestamp as a query param (for no caching)
|
||||
parameters.Add("_", UnixTimeNow().ToString());
|
||||
|
||||
// Building our query -- Cannot use GetQueryString due to UrlEncode (generating wrong subcat[] param)
|
||||
url += string.Join("&", parameters.AllKeys.Select(a => a + "=" + parameters[a]));
|
||||
|
||||
output("\nBuilded query for \"" + term + "\"... " + url);
|
||||
|
||||
// Return our search url
|
||||
return url;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Switch Method for Querying
|
||||
/// </summary>
|
||||
/// <param name="request">URL created by Query Builder</param>
|
||||
/// <returns>Results from query</returns>
|
||||
private async Task<String> queryExec(string request)
|
||||
{
|
||||
String results = null;
|
||||
|
||||
// Switch in we are in DEV mode with Hard Drive Cache or not
|
||||
if (DevMode && CacheMode)
|
||||
{
|
||||
// Check Cache before querying and load previous results if available
|
||||
results = await queryCache(request);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Querying tracker directly
|
||||
results = await queryTracker(request);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Torrents Page from Cache by Query Provided
|
||||
/// </summary>
|
||||
/// <param name="request">URL created by Query Builder</param>
|
||||
/// <returns>Results from query</returns>
|
||||
private async Task<String> queryCache(string request)
|
||||
{
|
||||
String results;
|
||||
|
||||
// Create Directory if not exist
|
||||
System.IO.Directory.CreateDirectory(Directory);
|
||||
|
||||
// Clean Storage Provider Directory from outdated cached queries
|
||||
cleanCacheStorage();
|
||||
|
||||
// File Name
|
||||
string fileName = StringUtil.HashSHA1(request) + ".json";
|
||||
|
||||
// Create fingerprint for request
|
||||
string file = Path.Combine(Directory, fileName);
|
||||
|
||||
// Checking modes states
|
||||
if (File.Exists(file))
|
||||
{
|
||||
// File exist... loading it right now !
|
||||
output("Loading results from hard drive cache ..." + fileName);
|
||||
try
|
||||
{
|
||||
using (StreamReader fileReader = File.OpenText(file))
|
||||
{
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
results = (String)serializer.Deserialize(fileReader, typeof(String));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
output("Error loading cached results ! " + e.Message, "error");
|
||||
results = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No cached file found, querying tracker directly
|
||||
results = await queryTracker(request);
|
||||
|
||||
// Cached file didn't exist for our query, writing it right now !
|
||||
output("Writing results to hard drive cache ..." + fileName);
|
||||
using (StreamWriter fileWriter = File.CreateText(file))
|
||||
{
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
serializer.Serialize(fileWriter, results);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Torrents Page from Tracker by Query Provided
|
||||
/// </summary>
|
||||
/// <param name="request">URL created by Query Builder</param>
|
||||
/// <returns>Results from query</returns>
|
||||
private async Task<String> queryTracker(string request)
|
||||
{
|
||||
WebClientStringResult results = null;
|
||||
|
||||
// Cache mode not enabled or cached file didn't exist for our query
|
||||
output("\nQuerying tracker for results....");
|
||||
|
||||
// Request our first page
|
||||
latencyNow();
|
||||
results = await RequestStringWithCookiesAndRetry(request, null, null, emulatedBrowserHeaders);
|
||||
|
||||
// Return results from tracker
|
||||
return results.Content;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clean Hard Drive Cache Storage
|
||||
/// </summary>
|
||||
/// <param name="force">Force Provider Folder deletion</param>
|
||||
private void cleanCacheStorage(bool force = false)
|
||||
{
|
||||
// Check cleaning method
|
||||
if (force)
|
||||
{
|
||||
// Deleting Provider Storage folder and all files recursively
|
||||
output("\nDeleting Provider Storage folder and all files recursively ...");
|
||||
|
||||
// Check if directory exist
|
||||
if (System.IO.Directory.Exists(Directory))
|
||||
{
|
||||
// Delete storage directory of provider
|
||||
System.IO.Directory.Delete(Directory, true);
|
||||
output("-> Storage folder deleted successfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
// No directory, so nothing to do
|
||||
output("-> No Storage folder found for this provider !");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var i = 0;
|
||||
// Check if there is file older than ... and delete them
|
||||
output("\nCleaning Provider Storage folder... in progress.");
|
||||
System.IO.Directory.GetFiles(Directory)
|
||||
.Select(f => new FileInfo(f))
|
||||
.Where(f => f.LastAccessTime < DateTime.Now.AddMilliseconds(-Convert.ToInt32(ConfigData.HardDriveCacheKeepTime.Value)))
|
||||
.ToList()
|
||||
.ForEach(f =>
|
||||
{
|
||||
output("Deleting cached file << " + f.Name + " >> ... done.");
|
||||
f.Delete();
|
||||
i++;
|
||||
});
|
||||
|
||||
// Inform on what was cleaned during process
|
||||
if (i > 0)
|
||||
{
|
||||
output("-> Deleted " + i + " cached files during cleaning.");
|
||||
}
|
||||
else
|
||||
{
|
||||
output("-> Nothing deleted during cleaning.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a random fake latency to avoid detection on tracker side
|
||||
/// </summary>
|
||||
private void latencyNow()
|
||||
{
|
||||
// Need latency ?
|
||||
if (Latency)
|
||||
{
|
||||
// Generate a random value in our range
|
||||
var random = new Random(DateTime.Now.Millisecond);
|
||||
int waiting = random.Next(Convert.ToInt32(ConfigData.LatencyStart.Value), Convert.ToInt32(ConfigData.LatencyEnd.Value));
|
||||
output("\nLatency Faker => Sleeping for " + waiting + " ms...");
|
||||
|
||||
// Sleep now...
|
||||
System.Threading.Thread.Sleep(waiting);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate an UTC Unix TimeStamp
|
||||
/// </summary>
|
||||
/// <returns>Unix TimeStamp</returns>
|
||||
private long UnixTimeNow()
|
||||
{
|
||||
var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
|
||||
return (long)timeSpan.TotalSeconds;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find torrent rows in search pages
|
||||
/// </summary>
|
||||
/// <returns>JQuery Object</returns>
|
||||
private CQ findTorrentRows()
|
||||
{
|
||||
// Return all occurencis of torrents found
|
||||
return fDom[".torrent-item"];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert Ago date to DateTime
|
||||
/// </summary>
|
||||
/// <param name="clockList"></param>
|
||||
/// <returns>A DateTime</returns>
|
||||
private DateTime agoToDate(IList<string> clockList)
|
||||
{
|
||||
DateTime release = DateTime.Now;
|
||||
foreach (var ago in clockList)
|
||||
{
|
||||
// Check for years
|
||||
if (ago.Contains("Années") || ago.Contains("Année"))
|
||||
{
|
||||
// Number of years to remove
|
||||
int years = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddYears(-years);
|
||||
|
||||
continue;
|
||||
}
|
||||
// Check for months
|
||||
else if (ago.Contains("Mois"))
|
||||
{
|
||||
// Number of months to remove
|
||||
int months = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddMonths(-months);
|
||||
|
||||
continue;
|
||||
}
|
||||
// Check for days
|
||||
else if (ago.Contains("Jours") || ago.Contains("Jour"))
|
||||
{
|
||||
// Number of days to remove
|
||||
int days = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddDays(-days);
|
||||
|
||||
continue;
|
||||
}
|
||||
// Check for hours
|
||||
else if (ago.Contains("Heures") || ago.Contains("Heure"))
|
||||
{
|
||||
// Number of hours to remove
|
||||
int hours = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddHours(-hours);
|
||||
|
||||
continue;
|
||||
}
|
||||
// Check for minutes
|
||||
else if (ago.Contains("Minutes") || ago.Contains("Minute"))
|
||||
{
|
||||
// Number of minutes to remove
|
||||
int minutes = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddMinutes(-minutes);
|
||||
|
||||
continue;
|
||||
}
|
||||
// Check for seconds
|
||||
else if (ago.Contains("Secondes") || ago.Contains("Seconde"))
|
||||
{
|
||||
// Number of seconds to remove
|
||||
int seconds = ParseUtil.CoerceInt(Regex.Match(ago.ToString(), @"\d+").Value);
|
||||
// Removing
|
||||
release = release.AddSeconds(-seconds);
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Unable to detect release date of torrent", "error");
|
||||
//throw new Exception("Unable to detect release date of torrent");
|
||||
}
|
||||
}
|
||||
return release;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve category ID from media ID
|
||||
/// </summary>
|
||||
/// <param name="media">Media ID</param>
|
||||
/// <returns>Category ID</returns>
|
||||
private string mediaToCategory(string media, string name)
|
||||
{
|
||||
// Declare our Dictionnary -- Media ID (key) <-> Category ID (value)
|
||||
Dictionary<string, string> dictionary = new Dictionary<string, string>();
|
||||
|
||||
// Movies
|
||||
dictionary.Add("565af82b1fd35761568b4573", "565af82b1fd35761568b4572"); // 1080P
|
||||
dictionary.Add("565af82b1fd35761568b4575", "565af82b1fd35761568b4574"); // 720P
|
||||
dictionary.Add("565af82b1fd35761568b4577", "565af82b1fd35761568b4576"); // HDTV
|
||||
dictionary.Add("565af82b1fd35761568b4579", "565af82b1fd35761568b4578"); // Bluray
|
||||
dictionary.Add("565af82b1fd35761568b457b", "565af82b1fd35761568b457a"); // Bluray Remux
|
||||
dictionary.Add("565af82b1fd35761568b457d", "565af82b1fd35761568b457c"); // Bluray 3D
|
||||
|
||||
// TV
|
||||
dictionary.Add("565af82d1fd35761568b4588", "565af82d1fd35761568b4587"); // 1080P
|
||||
dictionary.Add("565af82d1fd35761568b458a", "565af82d1fd35761568b4589"); // 720P
|
||||
dictionary.Add("565af82d1fd35761568b458c", "565af82d1fd35761568b458b"); // HDTV
|
||||
dictionary.Add("565af82d1fd35761568b458e", "565af82d1fd35761568b458d"); // Bluray
|
||||
dictionary.Add("565af82d1fd35761568b4590", "565af82d1fd35761568b458f"); // Bluray Remux
|
||||
dictionary.Add("565af82d1fd35761568b4592", "565af82d1fd35761568b4591"); // Bluray 3D
|
||||
|
||||
// Anime
|
||||
dictionary.Add("565af82d1fd35761568b459d", "565af82d1fd35761568b459c"); // 1080P
|
||||
dictionary.Add("565af82d1fd35761568b459f", "565af82d1fd35761568b459e"); // 720P
|
||||
dictionary.Add("565af82d1fd35761568b45a1", "565af82d1fd35761568b45a0"); // HDTV
|
||||
dictionary.Add("565af82d1fd35761568b45a3", "565af82d1fd35761568b45a2"); // Bluray
|
||||
dictionary.Add("565af82d1fd35761568b45a5", "565af82d1fd35761568b45a4"); // Bluray Remux
|
||||
// BUG ~~ Media ID for Anime BR 3D is same as TV BR 3D ~~
|
||||
//dictionary.Add("565af82d1fd35761568b4592", "565af82d1fd35761568b45a6"); // Bluray 3D
|
||||
|
||||
// Other
|
||||
dictionary.Add("565af82d1fd35761568b45b0", "565af82d1fd35761568b45af"); // Apps
|
||||
dictionary.Add("565af82d1fd35761568b45b2", "565af82d1fd35761568b45b1"); // Clips
|
||||
dictionary.Add("565af82d1fd35761568b45b4", "565af82d1fd35761568b45b3"); // Audios Tracks of Movies/TV/Anime
|
||||
dictionary.Add("565af82d1fd35761568b45b6", "565af82d1fd35761568b45b5"); // Documentary
|
||||
dictionary.Add("565af82d1fd35761568b45b8", "565af82d1fd35761568b45b7"); // Bluray (ALL)
|
||||
|
||||
// Check if we know this media ID
|
||||
if (dictionary.ContainsKey(media))
|
||||
{
|
||||
// Due to a bug on tracker side, check for a specific id/name as image is same for TV/Anime BR 3D
|
||||
if (media == "565af82d1fd35761568b4592" && name == "Animations - Bluray 3D")
|
||||
{
|
||||
// If it's an Anime BR 3D
|
||||
return "565af82d1fd35761568b45a6";
|
||||
}
|
||||
else
|
||||
{
|
||||
// Return category ID for media ID
|
||||
return dictionary[media];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Media ID unknown
|
||||
throw new Exception("Media ID Unknow !");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Output message for logging or developpment (console)
|
||||
/// </summary>
|
||||
/// <param name="message">Message to output</param>
|
||||
/// <param name="level">Level for Logger</param>
|
||||
private void output(string message, string level = "debug")
|
||||
{
|
||||
// Check if we are in dev mode
|
||||
if (DevMode)
|
||||
{
|
||||
// Output message to console
|
||||
Console.WriteLine(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Send message to logger with level
|
||||
switch (level)
|
||||
{
|
||||
default:
|
||||
goto case "debug";
|
||||
case "debug":
|
||||
// Only if Debug Level Enabled on Jackett
|
||||
if (logger.IsDebugEnabled)
|
||||
{
|
||||
logger.Debug(message);
|
||||
}
|
||||
break;
|
||||
|
||||
case "info":
|
||||
logger.Info(message);
|
||||
break;
|
||||
|
||||
case "error":
|
||||
logger.Error(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validate Config entered by user on Jackett
|
||||
/// </summary>
|
||||
private void validateConfig()
|
||||
{
|
||||
output("\nValidating Settings ... \n");
|
||||
|
||||
// Check Username Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Username.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Validated Setting -- Username (auth) => " + ConfigData.Username.Value.ToString());
|
||||
}
|
||||
|
||||
// Check Password Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.Password.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("You must provide a password with your username for this tracker to login !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Validated Setting -- Password (auth) => " + ConfigData.Password.Value.ToString());
|
||||
}
|
||||
|
||||
// Check Max Page Setting
|
||||
if (!string.IsNullOrEmpty(ConfigData.Pages.Value))
|
||||
{
|
||||
try
|
||||
{
|
||||
output("Validated Setting -- Max Pages => " + Convert.ToInt32(ConfigData.Pages.Value));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a numeric maximum number of pages to crawl !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a maximum number of pages to crawl !", ConfigData);
|
||||
}
|
||||
|
||||
// Check Latency Setting
|
||||
if (ConfigData.Latency.Value)
|
||||
{
|
||||
output("\nValidated Setting -- Latency Simulation enabled");
|
||||
|
||||
// Check Latency Start Setting
|
||||
if (!string.IsNullOrEmpty(ConfigData.LatencyStart.Value))
|
||||
{
|
||||
try
|
||||
{
|
||||
output("Validated Setting -- Latency Start => " + Convert.ToInt32(ConfigData.LatencyStart.Value));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a numeric latency start in ms !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ExceptionWithConfigData("Latency Simulation enabled, Please enter a start latency !", ConfigData);
|
||||
}
|
||||
|
||||
// Check Latency End Setting
|
||||
if (!string.IsNullOrEmpty(ConfigData.LatencyEnd.Value))
|
||||
{
|
||||
try
|
||||
{
|
||||
output("Validated Setting -- Latency End => " + Convert.ToInt32(ConfigData.LatencyEnd.Value));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a numeric latency end in ms !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ExceptionWithConfigData("Latency Simulation enabled, Please enter a end latency !", ConfigData);
|
||||
}
|
||||
}
|
||||
|
||||
// Check Browser Setting
|
||||
if (ConfigData.Browser.Value)
|
||||
{
|
||||
output("\nValidated Setting -- Browser Simulation enabled");
|
||||
|
||||
// Check ACCEPT header Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.HeaderAccept.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an ACCEPT header !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Validated Setting -- ACCEPT (header) => " + ConfigData.HeaderAccept.Value.ToString());
|
||||
}
|
||||
|
||||
// Check ACCEPT-LANG header Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.HeaderAcceptLang.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an ACCEPT-LANG header !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Validated Setting -- ACCEPT-LANG (header) => " + ConfigData.HeaderAcceptLang.Value.ToString());
|
||||
}
|
||||
|
||||
// Check USER-AGENT header Setting
|
||||
if (string.IsNullOrEmpty(ConfigData.HeaderUserAgent.Value))
|
||||
{
|
||||
throw new ExceptionWithConfigData("Browser Simulation enabled, Please enter an USER-AGENT header !", ConfigData);
|
||||
}
|
||||
else
|
||||
{
|
||||
output("Validated Setting -- USER-AGENT (header) => " + ConfigData.HeaderUserAgent.Value.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
// Check Dev Cache Settings
|
||||
if (ConfigData.HardDriveCache.Value == true)
|
||||
{
|
||||
output("\nValidated Setting -- DEV Hard Drive Cache enabled");
|
||||
|
||||
// Check if Dev Mode enabled !
|
||||
if (!ConfigData.DevMode.Value)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Hard Drive is enabled but not in DEV MODE, Please enable DEV MODE !", ConfigData);
|
||||
}
|
||||
|
||||
// Check Cache Keep Time Setting
|
||||
if (!string.IsNullOrEmpty(ConfigData.HardDriveCacheKeepTime.Value))
|
||||
{
|
||||
try
|
||||
{
|
||||
output("Validated Setting -- Cache Keep Time (ms) => " + Convert.ToInt32(ConfigData.HardDriveCacheKeepTime.Value));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new ExceptionWithConfigData("Please enter a numeric hard drive keep time in ms !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ExceptionWithConfigData("Hard Drive Cache enabled, Please enter a maximum keep time for cache !", ConfigData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Delete cache if previously existed
|
||||
cleanCacheStorage(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,207 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using CsQuery;
|
||||
using Jackett.Common.Models;
|
||||
using Jackett.Common.Models.IndexerConfig;
|
||||
using Jackett.Common.Services.Interfaces;
|
||||
using Jackett.Common.Utils;
|
||||
using Jackett.Common.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Common.Indexers
|
||||
{
|
||||
public class x264 : BaseWebIndexer
|
||||
{
|
||||
private string SearchUrl { get { return SiteLink + "browse.php"; } }
|
||||
private string LoginUrl { get { return SiteLink + "login.php"; } }
|
||||
private string SubmitLoginUrl { get { return SiteLink + "takelogin.php"; } }
|
||||
|
||||
private new ConfigurationDataRecaptchaLogin configData
|
||||
{
|
||||
get { return (ConfigurationDataRecaptchaLogin)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public x264(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
|
||||
: base(name: "x264",
|
||||
description: "A movie/TV tracker",
|
||||
link: "https://x264.me/",
|
||||
caps: new TorznabCapabilities(),
|
||||
configService: configService,
|
||||
client: w,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataRecaptchaLogin())
|
||||
{
|
||||
Encoding = Encoding.GetEncoding("iso-8859-1");
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
TorznabCaps.SupportsImdbSearch = true;
|
||||
|
||||
AddCategoryMapping(20, TorznabCatType.Movies); // Movies&TV/Sources
|
||||
AddCategoryMapping(53, TorznabCatType.MoviesHD); // Movies/1080p
|
||||
AddCategoryMapping(30, TorznabCatType.MoviesHD); // Movies/576p
|
||||
AddCategoryMapping(50, TorznabCatType.MoviesHD); // Movies/720p
|
||||
AddCategoryMapping(33, TorznabCatType.MoviesSD); // Movies/SD
|
||||
AddCategoryMapping(54, TorznabCatType.TVHD); // TV/1080p
|
||||
AddCategoryMapping(31, TorznabCatType.TVHD); // TV/576p
|
||||
AddCategoryMapping(51, TorznabCatType.TVHD); // TV/720p
|
||||
AddCategoryMapping(25, TorznabCatType.TVSD); // TV/SD
|
||||
}
|
||||
|
||||
public override async Task<ConfigurationData> GetConfigurationForSetup()
|
||||
{
|
||||
var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty);
|
||||
CQ dom = loginPage.Content;
|
||||
|
||||
var result = this.configData;
|
||||
var captcha = dom.Find(".g-recaptcha");
|
||||
result.CookieHeader.Value = loginPage.Cookies;
|
||||
result.Captcha.SiteKey = captcha.Attr("data-sitekey");
|
||||
result.Captcha.Version = "2";
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "username", configData.Username.Value },
|
||||
{ "password", configData.Password.Value },
|
||||
{ "g-recaptcha-response", configData.Captcha.Value }
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
|
||||
{
|
||||
// Cookie was manually supplied
|
||||
CookieHeader = configData.Captcha.Cookie;
|
||||
try
|
||||
{
|
||||
var results = await PerformQuery(new TorznabQuery());
|
||||
if (!results.Any())
|
||||
{
|
||||
throw new Exception("Your cookie did not work. You might have to change the \"Login Type\" to \"Normal\" in the x264 profile settings.");
|
||||
}
|
||||
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
IsConfigured = false;
|
||||
throw new Exception("Your cookie did not work: " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(SubmitLoginUrl, pairs, configData.CookieHeader.Value, true, null, LoginUrl);
|
||||
await ConfigureIfOK(result.Cookies, result.Content.Contains("logout.php"), () =>
|
||||
{
|
||||
var errorMessage = result.Content;
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
List<ReleaseInfo> releases = new List<ReleaseInfo>();
|
||||
|
||||
var searchString = query.GetQueryString();
|
||||
var searchUrl = SearchUrl;
|
||||
var queryCollection = new NameValueCollection();
|
||||
queryCollection.Add("incldead", "1");
|
||||
queryCollection.Add("xtype", "0");
|
||||
queryCollection.Add("stype", "0");
|
||||
|
||||
if (query.ImdbID != null)
|
||||
{
|
||||
queryCollection.Add("search", query.ImdbID);
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
queryCollection.Add("search", searchString);
|
||||
}
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
{
|
||||
queryCollection.Add("c" + cat, "1");
|
||||
}
|
||||
|
||||
searchUrl += "?" + queryCollection.GetQueryString();
|
||||
|
||||
var results = await RequestStringWithCookiesAndRetry(searchUrl);
|
||||
try
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
|
||||
var sideWideFreeLeech = false;
|
||||
if (dom.Find("td > b > font[color=\"white\"]:contains(Free Leech)").Length >= 1)
|
||||
sideWideFreeLeech = true;
|
||||
|
||||
var rows = dom["table > tbody > tr[height=36]"];
|
||||
foreach (var row in rows)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 7 * 24 * 60 * 60;
|
||||
|
||||
var qRow = row.Cq();
|
||||
var qCatLink = qRow.Find("a[href^=?cat]").First();
|
||||
var qDetailsLink = qRow.Find("a[href^=details.php]").First();
|
||||
var qSeeders = qRow.Find("td:eq(8)");
|
||||
var qLeechers = qRow.Find("td:eq(9)");
|
||||
var qDownloadLink = qRow.Find("a[href^=\"download.php\"]").First();
|
||||
var qImdbLink = qRow.Find("a[href^=/redir.php?url=http://www.imdb.com]");
|
||||
var qSize = qRow.Find("td:eq(6)");
|
||||
|
||||
var catStr = qCatLink.Attr("href").Split('=')[1];
|
||||
release.Category = MapTrackerCatToNewznab(catStr);
|
||||
|
||||
release.Link = new Uri(SiteLink + qDownloadLink.Attr("href"));
|
||||
release.Title = qDetailsLink.Text().Trim();
|
||||
release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href"));
|
||||
release.Guid = release.Link;
|
||||
|
||||
var sizeStr = qSize.Text();
|
||||
release.Size = ReleaseInfo.GetBytes(sizeStr);
|
||||
|
||||
if (qImdbLink.Length == 1)
|
||||
{
|
||||
var ImdbId = qImdbLink.Attr("href").Split('/').Last().Substring(2);
|
||||
release.Imdb = ParseUtil.CoerceLong(ImdbId);
|
||||
}
|
||||
|
||||
release.Seeders = ParseUtil.CoerceInt(qSeeders.Text());
|
||||
release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders;
|
||||
|
||||
var files = qRow.Find("td:nth-child(3)").Text();
|
||||
release.Files = ParseUtil.CoerceInt(files);
|
||||
|
||||
var grabs = qRow.Find("td:nth-child(8)").Get(0).FirstChild.ToString();
|
||||
release.Grabs = ParseUtil.CoerceInt(grabs);
|
||||
|
||||
if (sideWideFreeLeech || qRow.Find("font[color=\"red\"]:contains(FREE)").Length >= 1)
|
||||
release.DownloadVolumeFactor = 0;
|
||||
else
|
||||
release.DownloadVolumeFactor = 1;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
@@ -78,6 +78,10 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
var queryCollection = new NameValueCollection();
|
||||
|
||||
// without this the API sometimes returns nothing
|
||||
queryCollection.Add("sort", "date_added");
|
||||
queryCollection.Add("limit", "50");
|
||||
|
||||
if (query.ImdbID != null)
|
||||
{
|
||||
queryCollection.Add("query_term", query.ImdbID);
|
||||
@@ -131,7 +135,11 @@ namespace Jackett.Common.Indexers
|
||||
return releases.ToArray();
|
||||
}
|
||||
|
||||
foreach (var movie_item in data_items.Value<JToken>("movies"))
|
||||
var movies = data_items.Value<JToken>("movies");
|
||||
if (movies == null)
|
||||
throw new Exception("API error, movies missing");
|
||||
|
||||
foreach (var movie_item in movies)
|
||||
{
|
||||
var torrents = movie_item.Value<JArray>("torrents");
|
||||
if (torrents == null)
|
||||
@@ -142,7 +150,7 @@ namespace Jackett.Common.Indexers
|
||||
|
||||
// Append the quality to the title because thats how radarr seems to be determining the quality?
|
||||
// All releases are BRRips, see issue #2200
|
||||
release.Title = movie_item.Value<string>("title_long") + " " + torrent_info.Value<string>("quality") + " BRRip";
|
||||
release.Title = "[YTS] " + movie_item.Value<string>("title_long") + " " + torrent_info.Value<string>("quality") + " BRRip";
|
||||
var imdb = movie_item.Value<string>("imdb_code");
|
||||
release.Imdb = ParseUtil.GetImdbID(imdb);
|
||||
|
||||
|
@@ -211,4 +211,11 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Save the compiled date so that we know if the user is running an old version of Jackett -->
|
||||
<ItemGroup>
|
||||
<AssemblyAttribute Include="Jackett.Common.Utils.BuildDateAttribute">
|
||||
<_Parameter1>$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</_Parameter1>
|
||||
</AssemblyAttribute>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -0,0 +1,20 @@
|
||||
namespace Jackett.Common.Models.IndexerConfig
|
||||
{
|
||||
|
||||
public class ConfigurationDataMyAnonamouse : ConfigurationData
|
||||
{
|
||||
public StringItem MamId { get; private set; }
|
||||
public DisplayItem MamIdHint { get; private set; }
|
||||
|
||||
public ConfigurationDataMyAnonamouse()
|
||||
{
|
||||
MamId = new StringItem { Name = "mam_id" };
|
||||
MamIdHint = new DisplayItem(
|
||||
"Go to your <a href=\"https://www.myanonamouse.net/preferences/index.php?view=security\" target=\"_blank\">security preferences</a> and create a new session for the IP used by the Jackett server. Then paste the resulting mam_id value into the mam_id field here.")
|
||||
{
|
||||
Name = "mam_id instructions"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -68,6 +68,7 @@ namespace Jackett.Common.Models
|
||||
public string Encoding { get; set; }
|
||||
public List<string> Links { get; set; }
|
||||
public List<string> Legacylinks { get; set; }
|
||||
public bool Followredirect { get; set; } = false;
|
||||
public List<string> Certificates { get; set; }
|
||||
public capabilitiesBlock Caps { get; set; }
|
||||
public loginBlock Login { get; set; }
|
||||
@@ -183,6 +184,7 @@ namespace Jackett.Common.Models
|
||||
{
|
||||
public List<string> Categories { get; set; }
|
||||
public bool Inheritinputs { get; set; } = true;
|
||||
public bool Followredirect { get; set; } = false;
|
||||
}
|
||||
|
||||
public class requestBlock
|
||||
|
@@ -63,6 +63,7 @@ namespace Jackett.Common.Models
|
||||
select new XElement("item",
|
||||
new XElement("title", r.Title),
|
||||
new XElement("guid", r.Guid),
|
||||
new XElement("jackettindexer", new XAttribute("id", r.Origin.ID), r.Origin.DisplayName),
|
||||
r.Comments == null ? null : new XElement("comments", r.Comments.ToString()),
|
||||
r.PublishDate == DateTime.MinValue ? new XElement("pubDate", xmlDateFormat(DateTime.Now)) : new XElement("pubDate", xmlDateFormat(r.PublishDate)),
|
||||
r.Size == null ? null : new XElement("size", r.Size),
|
||||
|
@@ -11,11 +11,11 @@ namespace Jackett.Common.Utils
|
||||
// When updating these make sure they are not detected by the incapsula bot detection engine (e.g. kickasstorrent indexer)
|
||||
if (System.Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
return "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
|
||||
return "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 63.0.3239.132 Safari/537.36";
|
||||
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
src/Jackett.Common/Utils/BuildDate.cs
Normal file
27
src/Jackett.Common/Utils/BuildDate.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Jackett.Common.Utils
|
||||
{
|
||||
public static class BuildDate
|
||||
{
|
||||
public static DateTime GetBuildDateTime()
|
||||
{
|
||||
Assembly commonAssembly = Assembly.GetExecutingAssembly();
|
||||
var attribute = commonAssembly.GetCustomAttribute<BuildDateAttribute>();
|
||||
return attribute?.DateTime ?? default(DateTime);
|
||||
}
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Assembly)]
|
||||
public class BuildDateAttribute : Attribute
|
||||
{
|
||||
public BuildDateAttribute(string value)
|
||||
{
|
||||
DateTime = DateTime.ParseExact(value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
||||
}
|
||||
|
||||
public DateTime DateTime { get; }
|
||||
}
|
||||
}
|
@@ -20,8 +20,8 @@ namespace Jackett.Common.Utils
|
||||
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("simpledatetime", typeof(SimpleDateTimeRenderer));
|
||||
|
||||
var logConfig = new LoggingConfiguration();
|
||||
|
||||
var logFile = new FileTarget();
|
||||
logConfig.AddTarget("file", logFile);
|
||||
logFile.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}";
|
||||
logFile.FileName = Path.Combine(settings.DataFolder, logFileName);
|
||||
logFile.ArchiveFileName = Path.Combine(settings.DataFolder, logFileName + ".{#####}.txt");
|
||||
@@ -29,24 +29,54 @@ namespace Jackett.Common.Utils
|
||||
logFile.MaxArchiveFiles = 5;
|
||||
logFile.KeepFileOpen = false;
|
||||
logFile.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
|
||||
logConfig.AddTarget("file", logFile);
|
||||
|
||||
var microsoftRule = new LoggingRule();
|
||||
microsoftRule.LoggerNamePattern = "Microsoft.*";
|
||||
microsoftRule.SetLoggingLevels(LogLevel.Warn, LogLevel.Fatal);
|
||||
microsoftRule.Final = true;
|
||||
microsoftRule.Targets.Add(logFile);
|
||||
|
||||
var microsoftDebugRule = new LoggingRule();
|
||||
microsoftDebugRule.LoggerNamePattern = "Microsoft.*";
|
||||
microsoftDebugRule.SetLoggingLevels(LogLevel.Debug, LogLevel.Info);
|
||||
microsoftDebugRule.Final = true;
|
||||
if (settings.TracingEnabled)
|
||||
{
|
||||
microsoftDebugRule.Targets.Add(logFile);
|
||||
}
|
||||
logConfig.LoggingRules.Add(microsoftDebugRule);
|
||||
|
||||
var logFileRule = new LoggingRule("*", logLevel, logFile);
|
||||
logConfig.LoggingRules.Add(logFileRule);
|
||||
|
||||
if (!fileOnly)
|
||||
{
|
||||
var logConsole = new ColoredConsoleTarget();
|
||||
logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}";
|
||||
logConfig.AddTarget("console", logConsole);
|
||||
|
||||
logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}";
|
||||
var logConsoleRule = new LoggingRule("*", logLevel, logConsole);
|
||||
logConfig.LoggingRules.Add(logConsoleRule);
|
||||
|
||||
var logService = new LogCacheService();
|
||||
logConfig.AddTarget("service", logService);
|
||||
|
||||
var serviceRule = new LoggingRule("*", logLevel, logService);
|
||||
logConfig.LoggingRules.Add(serviceRule);
|
||||
|
||||
microsoftRule.Targets.Add(logConsole);
|
||||
microsoftRule.Targets.Add(logService);
|
||||
|
||||
if (settings.TracingEnabled)
|
||||
{
|
||||
microsoftDebugRule.Targets.Add(logConsole);
|
||||
microsoftDebugRule.Targets.Add(logService);
|
||||
}
|
||||
}
|
||||
|
||||
logConfig.LoggingRules.Add(microsoftRule);
|
||||
|
||||
return logConfig;
|
||||
}
|
||||
|
||||
|
@@ -140,6 +140,32 @@ namespace Jackett.Server
|
||||
{
|
||||
foreach (var rule in LogManager.Configuration.LoggingRules)
|
||||
{
|
||||
if (rule.LoggerNamePattern == "Microsoft.*")
|
||||
{
|
||||
if (!rule.Levels.Contains(LogLevel.Debug))
|
||||
{
|
||||
//don't change the first microsoftRule
|
||||
continue;
|
||||
}
|
||||
|
||||
var targets = LogManager.Configuration.ConfiguredNamedTargets;
|
||||
if (level == LogLevel.Debug)
|
||||
{
|
||||
foreach (var target in targets)
|
||||
{
|
||||
rule.Targets.Add(target);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var target in targets)
|
||||
{
|
||||
rule.Targets.Remove(target);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (level == LogLevel.Debug)
|
||||
{
|
||||
if (!rule.Levels.Contains(LogLevel.Debug))
|
||||
|
@@ -7,6 +7,7 @@ using Jackett.Common.Utils;
|
||||
using Microsoft.AspNetCore;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NLog;
|
||||
using NLog.Web;
|
||||
using System;
|
||||
@@ -184,6 +185,11 @@ namespace Jackett.Server
|
||||
.PreferHostingUrls(true)
|
||||
.UseConfiguration(Configuration)
|
||||
.UseStartup<Startup>()
|
||||
.ConfigureLogging(logging =>
|
||||
{
|
||||
logging.ClearProviders();
|
||||
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
|
||||
})
|
||||
.UseNLog();
|
||||
}
|
||||
}
|
||||
|
@@ -258,6 +258,24 @@ namespace Jackett.Server.Services
|
||||
logger.Error(e, "Error while checking the username");
|
||||
}
|
||||
|
||||
//Warn user that they are using an old version of Jackett
|
||||
try
|
||||
{
|
||||
DateTime compiledData = BuildDate.GetBuildDateTime();
|
||||
|
||||
if (compiledData < DateTime.Now.AddMonths(-3))
|
||||
{
|
||||
string version = configService.GetVersion();
|
||||
string notice = $"Your version of Jackett v{version} is very old. Multiple indexers are likely to fail when using an old version. Update to the latest version of Jackett.";
|
||||
_notices.Add(notice);
|
||||
logger.Error(notice);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.Error(e, "Error while checking build date of Jackett.Common");
|
||||
}
|
||||
|
||||
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
|
||||
// Load indexers
|
||||
indexerService.InitIndexers(configService.GetCardigannDefinitionsFolders());
|
||||
|
@@ -79,10 +79,10 @@ namespace Jackett.Server
|
||||
|
||||
builder.Populate(services);
|
||||
builder.RegisterModule(new JackettModule(runtimeSettings));
|
||||
builder.RegisterType<SecuityService>().As<ISecuityService>();
|
||||
builder.RegisterType<ServerService>().As<IServerService>();
|
||||
builder.RegisterType<ProtectionService>().As<IProtectionService>();
|
||||
builder.RegisterType<ServiceConfigService>().As<IServiceConfigService>();
|
||||
builder.RegisterType<SecuityService>().As<ISecuityService>().SingleInstance();
|
||||
builder.RegisterType<ServerService>().As<IServerService>().SingleInstance();
|
||||
builder.RegisterType<ProtectionService>().As<IProtectionService>().SingleInstance();
|
||||
builder.RegisterType<ServiceConfigService>().As<IServiceConfigService>().SingleInstance();
|
||||
|
||||
IContainer container = builder.Build();
|
||||
Helper.ApplicationContainer = container;
|
||||
|
@@ -275,6 +275,8 @@ namespace Jackett.Updater
|
||||
"Definitions/torrentkim.yml",
|
||||
"Definitions/horriblesubs.yml",
|
||||
"Definitions/idope.yml",
|
||||
"Definitions/bt-scene.yml",
|
||||
"Definitions/extratorrentclone.yml",
|
||||
};
|
||||
|
||||
foreach (var oldFile in oldFiles)
|
||||
|
Reference in New Issue
Block a user