mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-12 06:57:05 +02:00
Compare commits
67 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cc10d9f233 | ||
![]() |
805f0f4e0d | ||
![]() |
c5eb78602a | ||
![]() |
d7b5ab8595 | ||
![]() |
562cfd57a6 | ||
![]() |
3d84d12c96 | ||
![]() |
2a71dafb0e | ||
![]() |
02e2bcdbc2 | ||
![]() |
19b496b5c8 | ||
![]() |
5c03cab5a2 | ||
![]() |
183f9f5649 | ||
![]() |
a46b75bef7 | ||
![]() |
f6e0d7d239 | ||
![]() |
6d893a1ac3 | ||
![]() |
175509abc8 | ||
![]() |
8900ece8ab | ||
![]() |
37dc039de4 | ||
![]() |
15b6afb11e | ||
![]() |
753913ccc7 | ||
![]() |
27d4f2108e | ||
![]() |
2fb045e94a | ||
![]() |
7756e8da41 | ||
![]() |
823e06b84e | ||
![]() |
f12571d767 | ||
![]() |
bf1e3a1a53 | ||
![]() |
6276789738 | ||
![]() |
4b66273c19 | ||
![]() |
0fad901ecb | ||
![]() |
3426e66b3b | ||
![]() |
b85721e584 | ||
![]() |
16c2e5521a | ||
![]() |
42d8c30147 | ||
![]() |
338a4cbf6e | ||
![]() |
813c449065 | ||
![]() |
03549b97aa | ||
![]() |
7ee03a9e03 | ||
![]() |
8c6ae89204 | ||
![]() |
d5c902eb82 | ||
![]() |
8a037295d0 | ||
![]() |
c4caa62f8b | ||
![]() |
d3ea4135b9 | ||
![]() |
d0d62eeae9 | ||
![]() |
aa6e7b148b | ||
![]() |
251a631523 | ||
![]() |
4dd49985c3 | ||
![]() |
c24368f8f9 | ||
![]() |
6b35da8ad0 | ||
![]() |
026fa22a37 | ||
![]() |
9d6d5265e2 | ||
![]() |
a86c30fdd4 | ||
![]() |
378b63a658 | ||
![]() |
e09092bbaf | ||
![]() |
ffdce26639 | ||
![]() |
797eff5200 | ||
![]() |
b942689dad | ||
![]() |
9479eb20b7 | ||
![]() |
79d87f4809 | ||
![]() |
3a0d99acbe | ||
![]() |
6b3f42a667 | ||
![]() |
a2d9954a1d | ||
![]() |
f5fa7b5217 | ||
![]() |
bab4620c04 | ||
![]() |
c0b665062e | ||
![]() |
117022151b | ||
![]() |
a96b7cfca9 | ||
![]() |
d8b83c6b07 | ||
![]() |
0594e1c52d |
100
.github/appveyor.yml
vendored
Normal file
100
.github/appveyor.yml
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
version: 0.7.{build}
|
||||
skip_tags: true
|
||||
image: Visual Studio 2015
|
||||
configuration: Release
|
||||
assembly_info:
|
||||
patch: true
|
||||
file: '**\AssemblyInfo.*'
|
||||
assembly_version: '{version}'
|
||||
assembly_file_version: '{version}'
|
||||
assembly_informational_version: '{version}'
|
||||
install:
|
||||
- cmd: choco install InnoSetup
|
||||
before_build:
|
||||
- cmd: nuget restore src\Jackett.sln
|
||||
build:
|
||||
verbosity: minimal
|
||||
after_build:
|
||||
- cmd: >-
|
||||
xcopy src\Jackett.Console\bin\Release build.windows\ /e /y
|
||||
|
||||
copy /Y src\Jackett.Service\bin\Release\JackettService.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
|
||||
|
||||
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
|
||||
|
||||
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe* %APPVEYOR_BUILD_FOLDER%\build.windows\
|
||||
|
||||
copy /Y LICENSE build.windows\LICENSE
|
||||
|
||||
copy /Y README.md build.windows\README.md
|
||||
|
||||
|
||||
xcopy build.windows WindowsBuild\Jackett\ /e /y
|
||||
|
||||
|
||||
msbuild src\Jackett.sln /t:Clean /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
||||
|
||||
"C:\Program Files (x86)\Mono\bin\xbuild.bat" src\Jackett.sln /t:Build /p:Configuration=Release /verbosity:minimal /tv:12.0
|
||||
|
||||
|
||||
xcopy src\Jackett.Console\bin\Release build.mono\ /e /y
|
||||
|
||||
copy /Y src\Jackett.Service\bin\Release\JackettService.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
|
||||
|
||||
copy /Y src\Jackett.Tray\bin\Release\JackettTray.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
|
||||
|
||||
copy /Y src\Jackett.Updater\bin\Release\JackettUpdater.exe* %APPVEYOR_BUILD_FOLDER%\build.mono\
|
||||
|
||||
copy /Y LICENSE build.mono\LICENSE
|
||||
|
||||
copy /Y README.md build.mono\README.md
|
||||
|
||||
copy /Y Upstart.config build.mono\Upstart.config
|
||||
|
||||
|
||||
xcopy build.mono MonoBuild\Jackett\ /e /y
|
||||
|
||||
|
||||
"C:\Program Files (x86)\Inno Setup 5\ISCC.exe" Installer.iss
|
||||
|
||||
RENAME Output\setup.exe Jackett.Installer.Windows.exe
|
||||
|
||||
MOVE Output\Jackett.Installer.Windows.exe %APPVEYOR_BUILD_FOLDER%
|
||||
|
||||
|
||||
cd WindowsBuild
|
||||
|
||||
7z a -tzip -r "%APPVEYOR_BUILD_FOLDER%\Jackett.Binaries.Windows.zip" "Jackett\"
|
||||
|
||||
|
||||
cd %APPVEYOR_BUILD_FOLDER%
|
||||
|
||||
cd MonoBuild
|
||||
|
||||
7z a -ttar "%APPVEYOR_BUILD_FOLDER%\Jackett.Binaries.Mono.tar" "Jackett\"
|
||||
|
||||
cd %APPVEYOR_BUILD_FOLDER%
|
||||
|
||||
7z a -tgzip "Jackett.Binaries.Mono.tar.gz" "Jackett.Binaries.Mono.tar"
|
||||
|
||||
|
||||
appveyor PushArtifact Jackett.Installer.Windows.exe
|
||||
|
||||
appveyor PushArtifact Jackett.Binaries.Windows.zip
|
||||
|
||||
appveyor PushArtifact Jackett.Binaries.Mono.tar.gz
|
||||
deploy:
|
||||
- provider: GitHub
|
||||
tag: v$(appveyor_build_version)
|
||||
auth_token:
|
||||
secure: hOg+16YTIbq4kO9u4D1YVOTbWDqgCX6mAQYMbnmBBSw2CiUsZh7OKbupoUb3FtWa
|
||||
draft: true
|
||||
on:
|
||||
branch: master
|
||||
notifications:
|
||||
- provider: GitHubPullRequest
|
||||
auth_token:
|
||||
secure: k6ZZACPbKcvAFiXe/uOmY6Ofs4aw2rgKEWMNA8EilQpdJ6o7ef31we4DPn3SXZzx
|
||||
on_build_success: true
|
||||
on_build_failure: true
|
||||
on_build_status_changed: true
|
586
README.md
586
README.md
@@ -1,278 +1,308 @@
|
||||
# Jackett
|
||||
|
||||
[](https://github.com/Jackett/Jackett/issues)
|
||||
[](https://github.com/Jackett/Jackett/pulls)
|
||||
[](https://github.com/Jackett/Jackett/releases/latest)
|
||||
[](https://hub.docker.com/r/linuxserver/jackett/)
|
||||
|
||||
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), 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.
|
||||
|
||||
|
||||
|
||||
#### Supported Systems
|
||||
* Windows using .NET 4.5
|
||||
* Linux and OSX using Mono 4 (mono 3 is no longer supported).
|
||||
|
||||
### Supported Public Trackers
|
||||
* EZTV
|
||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||
* Isohunt
|
||||
* KickAssTorrent
|
||||
* KickAssTorrent (kat.how clone)
|
||||
* LimeTorrents
|
||||
* Nyaa <!-- maintained by bonny1992 -->
|
||||
* RARBG
|
||||
* ShowRSS
|
||||
* Sky torrents
|
||||
* The Pirate Bay
|
||||
* TNTVillage <!-- maintained by bonny1992 -->
|
||||
* TorrentProject
|
||||
* Torrentz2
|
||||
|
||||
### Supported Private Trackers
|
||||
* 2 Fast 4 You
|
||||
* 3D Torrents
|
||||
* 7tor
|
||||
* Abnormal
|
||||
* Acid-Lounge
|
||||
* AlphaRatio
|
||||
* Andraste
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AOX
|
||||
* Apollo (XANAX)
|
||||
* ArabaFenice
|
||||
* AsianDVDClub
|
||||
* Audiobook Torrents
|
||||
* Avistaz
|
||||
* BakaBT [![(invite needed)][inviteneeded]](#)
|
||||
* bB
|
||||
* Best Friends
|
||||
* BeyondHD
|
||||
* BIGTorrent
|
||||
* Bit-City Reloaded
|
||||
* BIT-HDTV
|
||||
* BitHQ
|
||||
* BitHUmen
|
||||
* BitMeTV
|
||||
* BitSoup [![(invite needed)][inviteneeded]](#)
|
||||
* Bitspyder
|
||||
* Blu-bits
|
||||
* BlueBird
|
||||
* BroadcastTheNet [![(invite needed)][inviteneeded]](#)
|
||||
* BTN
|
||||
* BTNext
|
||||
* Carpathians
|
||||
* CHDBits
|
||||
* Cinematik
|
||||
* Cinemageddon
|
||||
* CinemaZ
|
||||
* Classix
|
||||
* CZTeam
|
||||
* DanishBits
|
||||
* DataScene
|
||||
* Demonoid
|
||||
* Diablo Torrent
|
||||
* DigitalHive
|
||||
* Dragon World (DTW)
|
||||
* Dragonworld Reloaded
|
||||
* Dream Team
|
||||
* EoT-Forum
|
||||
* eStone
|
||||
* Ethor.net (Thor's Land)
|
||||
* FANO.IN
|
||||
* FileList
|
||||
* Freedom-HD
|
||||
* Freshon
|
||||
* FullMixMusic
|
||||
* FunFile
|
||||
* FunkyTorrents
|
||||
* Fuzer
|
||||
* GFXPeers
|
||||
* Ghost City
|
||||
* GigaTorrents [![(invite needed)][inviteneeded]](#)
|
||||
* GimmePeers <!-- maintained by jamesb2147 -->
|
||||
* GODS [![(invite needed)][inviteneeded]](#)
|
||||
* Gormogon
|
||||
* Greek Team
|
||||
* Hardbay
|
||||
* HD4Free
|
||||
* HD-Space
|
||||
* HD-Torrents
|
||||
* HD-Bits.com
|
||||
* HDBits
|
||||
* HDChina
|
||||
* HDClub
|
||||
* HDHome
|
||||
* HDSky
|
||||
* HDTorrents.it
|
||||
* Hebits
|
||||
* Hon3y HD
|
||||
* Hounddawgs
|
||||
* House-of-Torrents
|
||||
* Hyperay
|
||||
* ICE Torrent
|
||||
* I Love Classics
|
||||
* Immortalseed
|
||||
* Infinity-T
|
||||
* inPeril
|
||||
* Insane Tracker
|
||||
* IPTorrents
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* Le Paradis Du Net
|
||||
* LinkoManija
|
||||
* LosslessClub
|
||||
* M-Team - TP
|
||||
* Magico
|
||||
* Majomparádé
|
||||
* Mononoké-BT
|
||||
* MoreThanTV
|
||||
* MyAnonamouse
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* Nachtwerk
|
||||
* NCore
|
||||
* NetHD
|
||||
* New Real World
|
||||
* NextGen
|
||||
* Norbits [![(invite needed)][inviteneeded]](#) <!-- added by DiseaseNO but no longer maintained? -->
|
||||
* notwhat.cd
|
||||
* Ourbits
|
||||
* Passione Torrent <!-- maintained by bonny1992 -->
|
||||
* PassThePopcorn [![(invite needed)][inviteneeded]](#)
|
||||
* PirateTheNet
|
||||
* PiXELHD
|
||||
* PolishSource
|
||||
* PolishTracker
|
||||
* Pretome
|
||||
* PrivateHD
|
||||
* Psytorrents
|
||||
* PTFiles
|
||||
* QcTorrent
|
||||
* Redacted (PassTheHeadphones)
|
||||
* RevolutionTT
|
||||
* Rockhard Lossless
|
||||
* RoDVD
|
||||
* RuTracker
|
||||
* SceneAccess
|
||||
* SceneFZ
|
||||
* SceneTime
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
* Shareisland
|
||||
* ShareSpaceDB
|
||||
* Shazbat
|
||||
* Shellife
|
||||
* SpeedCD
|
||||
* Superbits
|
||||
* Tasmanit
|
||||
* The Empire
|
||||
* The Horror Charnel
|
||||
* The New Retro
|
||||
* The Shinning
|
||||
* The-Torrents
|
||||
* TehConnection
|
||||
* TenYardTracker
|
||||
* Torrent Network
|
||||
* Torrent Sector Crew
|
||||
* Torrent411
|
||||
* Torrent9
|
||||
* TorrentBD
|
||||
* TorrentBytes
|
||||
* TorrentCCF [![(invite needed)][inviteneeded]](#)
|
||||
* TorrentDay
|
||||
* TorrentHeaven
|
||||
* TorrentHR
|
||||
* Torrenting
|
||||
* TorrentLeech
|
||||
* Torrents.Md
|
||||
* Torrent-Syndikat
|
||||
* ToTheGlory
|
||||
* TranceTraffic
|
||||
* TransmitheNet
|
||||
* TV Chaos UK
|
||||
* TV-Vault
|
||||
* u-Torrent
|
||||
* UHDBits
|
||||
* Ultimate Gamer Club
|
||||
* ULTRAHDCLUB
|
||||
* Waffles
|
||||
* World-In-HD [![(invite needed)][inviteneeded]](#)
|
||||
* WorldOfP2P
|
||||
* x264
|
||||
* XSpeeds
|
||||
* Xthor
|
||||
* Xtreme Zone
|
||||
* Ztracker
|
||||
|
||||
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to kaso1717 -at- gmail.com to get them fixed/improved.
|
||||
|
||||
## Installation on Windows
|
||||
|
||||
We recommend you install Jackett as a Windows service using the supplied installer. You may also download the zipped version if you would like to configure everything manually.
|
||||
|
||||
To get started with using the installer for Jackett, follow the steps below:
|
||||
|
||||
1. Download the latest version of the Windows installer, "Jackett.Installer.Windows.exe" from the [releases](https://github.com/Jackett/Jackett/releases/latest) page.
|
||||
2. When prompted if you would like this app to make changes to your computer, select "yes".
|
||||
3. If you would like to install Jackett as a Windows Service, make sure the "Install as Windows Service" checkbox is filled.
|
||||
4. Once the installation has finished, check the "Launch Jackett" box to get started.
|
||||
5. Navigate your web browser to: http://127.0.0.1:9117
|
||||
6. You're now ready to begin adding your trackers and using Jackett.
|
||||
|
||||
When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
|
||||
|
||||
Jackett can also be run from the command line if you would like to see log messages (Ensure the server isn't already running from the tray/service). This can be done by using "JackettConsole.exe" (for Command Prompt), found in the Jackett data folder: "%ProgramData%\Jackett".
|
||||
|
||||
## Installation on Linux/OSX
|
||||
1. Install [Mono 4](http://www.mono-project.com/download/#download-lin) or better (version 4.8 is recommended)
|
||||
* Follow the instructions on the mono website and install the `mono-devel` and the `ca-certificates-mono` packages.
|
||||
* On Red Hat/CentOS/openSUSE/Fedora the `mono-locale-extras` package is also required.
|
||||
2. Install libcurl:
|
||||
* Debian/Ubunutu: `apt-get install libcurl4-openssl-dev`
|
||||
* Redhat/Fedora: `yum install libcurl-devel`
|
||||
* For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel).
|
||||
3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono --debug JackettConsole.exe`.
|
||||
|
||||
Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jackett-on-ubuntu-14-x-for-custom-torrents-in-sonarr/) and [Ubuntu 15.x](http://www.htpcguides.com/install-jackett-ubuntu-15-x-for-custom-torrents-in-sonarr/)
|
||||
|
||||
## Installation using Docker
|
||||
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system eg. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
|
||||
|
||||
## Installation on Synology
|
||||
Jackett is available as beta package from [SynoCommuniy](https://synocommunity.com/)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* __Command line switches__
|
||||
|
||||
You can pass various options when running via the command line, see --help for details.
|
||||
|
||||
* __Unable to connect to trackers with invalid SSL certificates__
|
||||
|
||||
You can disable certificate validation using the `--IgnoreSslErrors true` option but it's not recommended to use it as it enables Man-in-the-middle attacks on your connections.
|
||||
|
||||
* __Enable logging__
|
||||
|
||||
You can get additional logging with the command line switches `-t -l` or by enabeling `Enhanced logging` via the web interface.
|
||||
Please post logs if you are unable to resolve your issue with these switches ensuring to remove your username/password/cookies.
|
||||
The logfiles (log.txt/updater.txt) are stored in `%ProgramData%\Jackett` on Windows and `~/.config/Jackett/` on Linux/OSX.
|
||||
|
||||
## Creating an issue
|
||||
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
|
||||
|
||||
## Contributing
|
||||
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual studio 2015 when making code changes in this project.
|
||||
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png
|
||||
# Jackett
|
||||
|
||||
[](https://github.com/Jackett/Jackett/issues)
|
||||
[](https://github.com/Jackett/Jackett/pulls)
|
||||
[](https://ci.appveyor.com/project/camjac251/jackett)
|
||||
[](https://github.com/Jackett/Jackett/releases/latest)
|
||||
[](https://hub.docker.com/r/linuxserver/jackett/)
|
||||
|
||||
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), 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.
|
||||
|
||||
|
||||
|
||||
#### Supported Systems
|
||||
* Windows using .NET 4.5
|
||||
* Linux and OSX using Mono 4 (mono 3 is no longer supported).
|
||||
|
||||
### Supported Public Trackers
|
||||
* Anidex
|
||||
* EZTV
|
||||
* Horrible Subs
|
||||
* Il Corsaro Nero <!-- maintained by bonny1992 -->
|
||||
* Isohunt
|
||||
* KickAssTorrent
|
||||
* KickAssTorrent (kat.how clone)
|
||||
* LimeTorrents
|
||||
* Nyaa.si
|
||||
* Nyaa-Pantsu
|
||||
* Nyoo
|
||||
* RARBG
|
||||
* ShowRSS
|
||||
* Sky torrents
|
||||
* The Pirate Bay
|
||||
* TNTVillage <!-- maintained by bonny1992 -->
|
||||
* Tokyo Toshokan
|
||||
* TorrentProject
|
||||
* Torrentz2
|
||||
|
||||
### Supported Private Trackers
|
||||
* 2 Fast 4 You
|
||||
* 3D Torrents
|
||||
* 7tor
|
||||
* Abnormal
|
||||
* Acid-Lounge
|
||||
* AlphaRatio
|
||||
* Andraste
|
||||
* AnimeBytes
|
||||
* AnimeTorrents
|
||||
* AOX
|
||||
* Apollo (XANAX)
|
||||
* ArabaFenice
|
||||
* Arche Torrent
|
||||
* AsianDVDClub
|
||||
* Audiobook Torrents
|
||||
* Awesome-HD
|
||||
* Avistaz
|
||||
* BakaBT [![(invite needed)][inviteneeded]](#)
|
||||
* bB
|
||||
* Best Friends
|
||||
* BeyondHD
|
||||
* BIGTorrent
|
||||
* Bit-City Reloaded
|
||||
* BIT-HDTV
|
||||
* BitHQ
|
||||
* BitHUmen
|
||||
* BitMeTV
|
||||
* BitSoup [![(invite needed)][inviteneeded]](#)
|
||||
* Bitspyder
|
||||
* Blu-bits
|
||||
* BlueBird
|
||||
* BroadcastTheNet [![(invite needed)][inviteneeded]](#)
|
||||
* BTNext
|
||||
* Carpathians
|
||||
* CHDBits
|
||||
* Cinematik
|
||||
* Cinemageddon
|
||||
* CinemaZ
|
||||
* Classix
|
||||
* CZTeam
|
||||
* DanishBits
|
||||
* DataScene
|
||||
* Deildu
|
||||
* Demonoid
|
||||
* Diablo Torrent
|
||||
* DigitalHive
|
||||
* Dragon World (DTW)
|
||||
* Dragonworld Reloaded
|
||||
* Dream Team
|
||||
* EoT-Forum
|
||||
* eStone
|
||||
* Ethor.net (Thor's Land)
|
||||
* FANO.IN
|
||||
* FileList
|
||||
* Freedom-HD
|
||||
* Freshon
|
||||
* FullMixMusic
|
||||
* FunFile
|
||||
* FunkyTorrents
|
||||
* Fuzer
|
||||
* GFXPeers
|
||||
* Ghost City
|
||||
* GigaTorrents [![(invite needed)][inviteneeded]](#)
|
||||
* GimmePeers <!-- maintained by jamesb2147 -->
|
||||
* GODS [![(invite needed)][inviteneeded]](#)
|
||||
* Gormogon
|
||||
* Greek Team
|
||||
* Hardbay
|
||||
* HD4Free
|
||||
* HD-Space
|
||||
* HD-Torrents
|
||||
* HD-Bits.com
|
||||
* HDBits
|
||||
* HDChina
|
||||
* HDClub
|
||||
* HDHome
|
||||
* HDSky
|
||||
* HDTorrents.it
|
||||
* Hebits
|
||||
* Hon3y HD
|
||||
* Hounddawgs
|
||||
* House-of-Torrents
|
||||
* Hyperay
|
||||
* ICE Torrent
|
||||
* I Love Classics
|
||||
* Immortalseed
|
||||
* Infinity-T
|
||||
* inPeril
|
||||
* Insane Tracker
|
||||
* IPTorrents
|
||||
* JPopsuki
|
||||
* Kapaki
|
||||
* Karagarga
|
||||
* Le Paradis Du Net
|
||||
* LinkoManija
|
||||
* LosslessClub
|
||||
* M-Team - TP
|
||||
* Magico
|
||||
* Majomparádé
|
||||
* Mononoké-BT
|
||||
* MoreThanTV
|
||||
* MyAnonamouse
|
||||
* myAmity
|
||||
* MySpleen
|
||||
* Nachtwerk
|
||||
* NCore
|
||||
* Nebulance
|
||||
* NetHD
|
||||
* New Real World
|
||||
* NextGen
|
||||
* Norbits [![(invite needed)][inviteneeded]](#) <!-- added by DiseaseNO but no longer maintained? -->
|
||||
* notwhat.cd
|
||||
* Ourbits
|
||||
* Passione Torrent <!-- maintained by bonny1992 -->
|
||||
* PassThePopcorn [![(invite needed)][inviteneeded]](#)
|
||||
* PirateTheNet
|
||||
* PiXELHD
|
||||
* PolishSource
|
||||
* PolishTracker
|
||||
* Pretome
|
||||
* PrivateHD
|
||||
* Psytorrents
|
||||
* PTFiles
|
||||
* QcTorrent
|
||||
* Redacted (PassTheHeadphones)
|
||||
* RevolutionTT
|
||||
* Rockhard Lossless
|
||||
* RoDVD
|
||||
* RuTracker
|
||||
* SceneAccess
|
||||
* SceneFZ
|
||||
* SceneTime
|
||||
* SDBits
|
||||
* Secret Cinema
|
||||
* Shareisland
|
||||
* ShareSpaceDB
|
||||
* Shazbat
|
||||
* Shellife
|
||||
* SpeedCD
|
||||
* SportsCult
|
||||
* SportHD
|
||||
* Superbits
|
||||
* Tasmanit
|
||||
* The Empire
|
||||
* The Geeks
|
||||
* The Horror Charnel
|
||||
* The Occult
|
||||
* The New Retro
|
||||
* The Place
|
||||
* The Shinning
|
||||
* The Show
|
||||
* The Vault
|
||||
* The-Torrents
|
||||
* TehConnection
|
||||
* TenYardTracker
|
||||
* Torrent Network
|
||||
* Torrent Sector Crew
|
||||
* Torrent411
|
||||
* Torrent9
|
||||
* TorrentBD
|
||||
* TorrentBytes
|
||||
* TorrentCCF [![(invite needed)][inviteneeded]](#)
|
||||
* TorrentDay
|
||||
* TorrentHeaven
|
||||
* TorrentHR
|
||||
* Torrenting
|
||||
* TorrentLeech
|
||||
* Torrents.Md
|
||||
* Torrent-Syndikat
|
||||
* ToTheGlory
|
||||
* TranceTraffic
|
||||
* Trezzor
|
||||
* TV Chaos UK
|
||||
* TV-Vault
|
||||
* u-Torrent
|
||||
* UHDBits
|
||||
* Ultimate Gamer Club
|
||||
* ULTRAHDCLUB
|
||||
* Waffles
|
||||
* World-In-HD [![(invite needed)][inviteneeded]](#)
|
||||
* WorldOfP2P
|
||||
* x264
|
||||
* XSpeeds
|
||||
* Xthor
|
||||
* Xtreme Zone
|
||||
* Ztracker
|
||||
|
||||
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and are missing features or are broken. If you have an invite for them please send it to kaso1717 -at- gmail.com to get them fixed/improved.
|
||||
|
||||
## Installation on Windows
|
||||
|
||||
We recommend you install Jackett as a Windows service using the supplied installer. You may also download the zipped version if you would like to configure everything manually.
|
||||
|
||||
To get started with using the installer for Jackett, follow the steps below:
|
||||
|
||||
1. Download the latest version of the Windows installer, "Jackett.Installer.Windows.exe" from the [releases](https://github.com/Jackett/Jackett/releases/latest) page.
|
||||
2. When prompted if you would like this app to make changes to your computer, select "yes".
|
||||
3. If you would like to install Jackett as a Windows Service, make sure the "Install as Windows Service" checkbox is filled.
|
||||
4. Once the installation has finished, check the "Launch Jackett" box to get started.
|
||||
5. Navigate your web browser to: http://127.0.0.1:9117
|
||||
6. You're now ready to begin adding your trackers and using Jackett.
|
||||
|
||||
When installed as a service the tray icon acts as a way to open/start/stop Jackett. If you opted to not install it as a service then Jackett will run its web server from the tray tool.
|
||||
|
||||
Jackett can also be run from the command line if you would like to see log messages (Ensure the server isn't already running from the tray/service). This can be done by using "JackettConsole.exe" (for Command Prompt), found in the Jackett data folder: "%ProgramData%\Jackett".
|
||||
|
||||
## Installation on Linux
|
||||
1. Install [Mono 4](http://www.mono-project.com/download/#download-lin) or better (version 4.8 is recommended)
|
||||
* Follow the instructions on the mono website and install the `mono-devel` and the `ca-certificates-mono` packages.
|
||||
* On Red Hat/CentOS/openSUSE/Fedora the `mono-locale-extras` package is also required.
|
||||
2. Install libcurl:
|
||||
* Debian/Ubunutu: `apt-get install libcurl4-openssl-dev`
|
||||
* Redhat/Fedora: `yum install libcurl-devel`
|
||||
* For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel).
|
||||
3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono --debug JackettConsole.exe`.
|
||||
|
||||
Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jackett-on-ubuntu-14-x-for-custom-torrents-in-sonarr/) and [Ubuntu 15.x](http://www.htpcguides.com/install-jackett-ubuntu-15-x-for-custom-torrents-in-sonarr/)
|
||||
|
||||
## Installation on OSX
|
||||
1. Install [Mono 4](http://www.mono-project.com/download/#download-mac) or better (version 4.8 is recommended)
|
||||
* Setup ssl support by running
|
||||
```
|
||||
https://curl.haxx.se/ca/cacert.pem
|
||||
cert-sync --user ~/Downloads/cacert.pem
|
||||
```
|
||||
1. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono --debug JackettConsole.exe`.
|
||||
|
||||
## Installation using Docker
|
||||
Detailed instructions are available at [LinuxServer.io Jackett Docker](https://hub.docker.com/r/linuxserver/jackett/). The Jackett Docker is highly recommended, especially if you are having Mono stability issues or having issues running Mono on your system eg. QNAP, Synology. Thanks to [LinuxServer.io](https://linuxserver.io)
|
||||
|
||||
## Installation on Synology
|
||||
Jackett is available as beta package from [SynoCommuniy](https://synocommunity.com/)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* __Command line switches__
|
||||
|
||||
You can pass various options when running via the command line, see --help for details.
|
||||
|
||||
* __Unable to connect to trackers with invalid SSL certificates__
|
||||
|
||||
If you're using mono this is often caused by missing ca-certificates.
|
||||
Try reimporting the certificates in this case:
|
||||
|
||||
`wget -O - https://curl.haxx.se/ca/cacert.pem | cert-sync /dev/stdin`
|
||||
|
||||
As a option of last resort you can disable certificate validation using the `--IgnoreSslErrors true` option but it's not recommended to use it as it enables Man-in-the-middle attacks on your connections.
|
||||
|
||||
* __Enable logging__
|
||||
|
||||
You can get additional logging with the command line switches `-t -l` or by enabeling `Enhanced logging` via the web interface.
|
||||
Please post logs if you are unable to resolve your issue with these switches ensuring to remove your username/password/cookies.
|
||||
The logfiles (log.txt/updater.txt) are stored in `%ProgramData%\Jackett` on Windows and `~/.config/Jackett/` on Linux/OSX.
|
||||
|
||||
## Creating an issue
|
||||
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
|
||||
|
||||
## Contributing
|
||||
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual studio 2015 when making code changes in this project.
|
||||
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
[inviteneeded]: https://raw.githubusercontent.com/Jackett/Jackett/master/.github/label-inviteneeded.png
|
||||
|
@@ -52,5 +52,10 @@ namespace JackettTest
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InitAggregateIndexer()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -185,6 +185,7 @@ namespace Jackett.Updater
|
||||
"Definitions/rarbg.yml",
|
||||
"Definitions/t411.yml",
|
||||
"Definitions/hdbc.yml", // renamed to hdbitscom
|
||||
"Definitions/nyaa.yml",
|
||||
};
|
||||
|
||||
foreach (var oldFIle in oldFiles)
|
||||
|
54
src/Jackett/Definitions/anidex.yml
Normal file
54
src/Jackett/Definitions/anidex.yml
Normal file
@@ -0,0 +1,54 @@
|
||||
---
|
||||
site: anidex
|
||||
name: Anidex
|
||||
description: "Anidex is a torrent tracker and indexer, primarily for English fansub groups of anime"
|
||||
language: en-us
|
||||
encoding: UTF-8
|
||||
type: public
|
||||
links:
|
||||
- https://anidex.info/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: TV/Anime # Anime
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings: []
|
||||
|
||||
search:
|
||||
path: "ajax/page.ajax.php"
|
||||
headers:
|
||||
x-requested-with: ["XMLHttpRequest"]
|
||||
inputs:
|
||||
page: "torrents"
|
||||
filename: "{{ .Query.Keywords }}"
|
||||
category: "0"
|
||||
rows:
|
||||
selector: div.table-responsive > table > tbody > tr
|
||||
fields:
|
||||
category:
|
||||
text: "1"
|
||||
title:
|
||||
selector: td:nth-child(3) > a.torrent > span.span-1440
|
||||
details:
|
||||
selector: td:nth-child(3) > a.torrent
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(5) > a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
date:
|
||||
selector: td:nth-child(8)
|
||||
attribute: title
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["UTC", "+00:00"]
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04:05 -07:00"
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
68
src/Jackett/Definitions/awesomehd.yml
Executable file
68
src/Jackett/Definitions/awesomehd.yml
Executable file
@@ -0,0 +1,68 @@
|
||||
---
|
||||
site: awesomehd
|
||||
name: Awesome-HD
|
||||
description: "An HD tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://awesome-hd.me
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Movies/HD, desc: "Movies"}
|
||||
- {id: 2, cat: TV/HD, desc: "TV-Shows"}
|
||||
|
||||
modes:
|
||||
searchstr: [q]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Cookie
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
search:
|
||||
path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
searchstr: "{{ .Query.Keywords }}"
|
||||
page: torrents
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.group, tr.torrent, tr.group_torrent:not(.edition_info)
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
optional: true
|
||||
details:
|
||||
selector: a[href^="torrents.php?id="]
|
||||
attribute: href
|
||||
title:
|
||||
selector: td:nth-child(3) > a
|
||||
category:
|
||||
selector: td:nth-child(2)
|
||||
# files:
|
||||
# selector: td:nth-child(4)
|
||||
date:
|
||||
selector: td:nth-last-child(5)
|
||||
size:
|
||||
selector: td:nth-last-child(4)
|
||||
grabs:
|
||||
selector: td:nth-last-child(3)
|
||||
seeders:
|
||||
selector: td:nth-last-child(2)
|
||||
leechers:
|
||||
selector: td:nth-last-child(1)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
92
src/Jackett/Definitions/deildu.yml
Normal file
92
src/Jackett/Definitions/deildu.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
site: deildu
|
||||
name: Deildu
|
||||
language: is-is
|
||||
type: semi-private
|
||||
encoding: iso-8859-1
|
||||
links:
|
||||
- https://deildu.net/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 11, cat: Audio, desc: "Music"}
|
||||
- {id: 6, cat: Movies, desc: "Movies"}
|
||||
- {id: 5, cat: Movies/DVD, desc: "Movies DVDR"}
|
||||
- {id: 8, cat: TV, desc: "TV shows"}
|
||||
- {id: 12, cat: Movies/HD, desc: "HD Movies"}
|
||||
- {id: 12, cat: TV/HD, desc: "HD TV"}
|
||||
- {id: 9, cat: TV/Documentary, desc: "TV - Documentaries"}
|
||||
- {id: 9, cat: Movies/Other, desc: "Movie - Documentaries"}
|
||||
- {id: 2, cat: TV/Sport, desc: "Sports"}
|
||||
- {id: 7, cat: Movies/Other, desc: "Cartoons"}
|
||||
- {id: 14, cat: PC, desc: "Windows"}
|
||||
- {id: 3, cat: PC/Mac, desc: "Mac"}
|
||||
- {id: 10, cat: PC/Games, desc: "Games"}
|
||||
- {id: 4, cat: XXX, desc: "XXX"}
|
||||
- {id: 1, cat: Other, desc: "Other"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: takelogin.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
keeplogged: 1
|
||||
|
||||
test:
|
||||
path: my.php
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
incldead: "1"
|
||||
rows:
|
||||
selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="])
|
||||
filters:
|
||||
- name: andmatch
|
||||
args: 55
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
attribute: href
|
||||
title:
|
||||
selector: td:nth-child(2)
|
||||
# category:
|
||||
# selector: a[href^="browse.php?cat="]
|
||||
# attribute: href
|
||||
# filters:
|
||||
# - name: querystring
|
||||
# args: cat
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-0215:04:05"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
61
src/Jackett/Definitions/horriblesubs.yml
Normal file
61
src/Jackett/Definitions/horriblesubs.yml
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
site: horriblesubs
|
||||
name: Horrible Subs
|
||||
description: "Anime Sub Group - \"So bad yet so good\""
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://horriblesubs.info/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: TV/Anime # Anime
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings:
|
||||
- name: prepend-horriblesubs
|
||||
type: checkbox
|
||||
label: Prepend [Horriblesubs] to torrent title
|
||||
|
||||
search:
|
||||
path: "lib/{{if .Query.Keywords }}search.php{{else}}latest.php{{end}}"
|
||||
inputs:
|
||||
value: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: "div.release-links"
|
||||
dateheaders:
|
||||
selector: table.release-info
|
||||
filters:
|
||||
- name: split
|
||||
args: [" ", 0 ]
|
||||
- name: replace
|
||||
args: ["(", ""]
|
||||
- name: replace
|
||||
args: [")", ""]
|
||||
- name: replace
|
||||
args: ["/", "-"]
|
||||
- name: dateparse
|
||||
args: "01-02-06"
|
||||
fields:
|
||||
category:
|
||||
text: "1"
|
||||
title:
|
||||
selector: table.release-table > tbody > tr > td.dl-label
|
||||
filters:
|
||||
- name: prepend
|
||||
args: "{{if .Config.prepend-horriblesubs}}[Horriblesubs] {{else}}{{end}}"
|
||||
details:
|
||||
attribute: class
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["release-links", ""]
|
||||
- name: re_replace
|
||||
args: [" ?(\\S+?)-((?:s\\d-)?(?:\\d+v?\\d?-){0,2}\\d+p)", "http://horriblesubs.info/shows/$1#$2"]
|
||||
download:
|
||||
selector: table.release-table > tbody > tr > td.hs-magnet-link > span > a
|
||||
attribute: href
|
||||
size:
|
||||
text: "500 MB"
|
@@ -2,7 +2,7 @@
|
||||
site: kickasstorrent
|
||||
name: KickAssTorrent
|
||||
language: en-us
|
||||
type: public
|
||||
type: semi-private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://katcr.co/
|
||||
@@ -68,7 +68,7 @@
|
||||
- {id: 153, cat: Other, desc: "Other - Wordpress"}
|
||||
- {id: 6, cat: TV/HD, desc: "TV - Blu-Ray Disc"}
|
||||
- {id: 7, cat: TV/Documentary, desc: "TV - Documentary"}
|
||||
- {id: 5, cat: TV/SD, desc: "TV - DVD Disc"}
|
||||
- {id: 5, cat: TV/SD, desc: "TV - DVD ISO"}
|
||||
- {id: 41, cat: TV/HD, desc: "TV - HD"}
|
||||
- {id: 151, cat: TV/Other, desc: "TV - Other"}
|
||||
- {id: 146, cat: TV/Sport, desc: "TV - Sport"}
|
||||
@@ -85,7 +85,22 @@
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
settings: []
|
||||
settings:
|
||||
- name: username
|
||||
type: text
|
||||
label: Username
|
||||
- name: passkey
|
||||
type: text
|
||||
label: Passkey
|
||||
|
||||
login:
|
||||
method: post
|
||||
path: "new/account-login.php"
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
passkey: "{{ .Config.passkey }}"
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
search:
|
||||
path: "/new/torrents-search.php"
|
||||
@@ -164,7 +179,7 @@
|
||||
":has(a:contains(\"Other\")):contains(\"Wordpress\")": 153
|
||||
":has(a:contains(\"TV\")):contains(\"Blu-Ray Disc\")": 6
|
||||
":has(a:contains(\"TV\")):contains(\"Documentary\")": 7
|
||||
":has(a:contains(\"TV\")):contains(\"DVD Disc\")": 5
|
||||
":has(a:contains(\"TV\")):contains(\"DVD ISO\")": 5
|
||||
":has(a:contains(\"TV\")):contains(\"HD\")": 41
|
||||
":has(a:contains(\"TV\")):contains(\"Other\")": 151
|
||||
":has(a:contains(\"TV\")):contains(\"Sport\")": 146
|
||||
@@ -176,6 +191,7 @@
|
||||
":has(a:contains(\"XXX\")):contains(\"UltraHD\")": 121
|
||||
":has(a:contains(\"XXX\")):contains(\"Videos\")": 119
|
||||
":has(a:contains(\"XXX\")):contains(\"XXX Games\")": 126
|
||||
"*": 0 # some older torrents's don't have a category
|
||||
details:
|
||||
selector: a.cellMainLink
|
||||
attribute: href
|
||||
|
83
src/Jackett/Definitions/nyaa-pantsu.yml
Normal file
83
src/Jackett/Definitions/nyaa-pantsu.yml
Normal file
@@ -0,0 +1,83 @@
|
||||
#,==========,
|
||||
#| | | |
|
||||
#`-./ \.-' -Config'd by Quatroking, 05-05-2017-
|
||||
# `.__.'
|
||||
|
||||
---
|
||||
site: nyaa-pantsu
|
||||
name: Nyaa-pantsu
|
||||
language: en-en
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://nyaa.pantsu.cat/
|
||||
|
||||
settings: []
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# Anime
|
||||
# - {id: 3_, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 3_12, cat: TV/Anime, desc: "Anime music videos"}
|
||||
- {id: 3_5, cat: TV/Anime, desc: "English subtitled animes"}
|
||||
- {id: 3_13, cat: TV/Anime, desc: "Non-english subtitled animes"}
|
||||
- {id: 3_6, cat: TV/Anime, desc: "Raw animes"}
|
||||
# Audio
|
||||
# - {id: 2_, cat: Audio, desc: "Audio"}
|
||||
- {id: 2_3, cat: Audio, desc: "Lossless audio"}
|
||||
- {id: 2_4, cat: Audio, desc: "Lossy audio"}
|
||||
# Literature
|
||||
# - {id: 4_, cat: Books, desc: "Literature"}
|
||||
- {id: 4_7, cat: Books, desc: "Literature english translated"}
|
||||
- {id: 4_14, cat: Books, desc: "Literature non-english translated"}
|
||||
- {id: 4_8, cat: Books, desc: "Raw literature"}
|
||||
# Software
|
||||
- {id: 1_1, cat: PC/ISO, desc: "Applications"}
|
||||
- {id: 1_2, cat: PC/Games, desc: "Games"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q]
|
||||
|
||||
|
||||
search:
|
||||
path: /search
|
||||
inputs:
|
||||
# page: "search"
|
||||
q: "{{ .Query.Keywords}}"
|
||||
rows:
|
||||
selector: tr.torrent-info
|
||||
fields:
|
||||
title:
|
||||
selector: td.name a
|
||||
category:
|
||||
selector: td:nth-child(1) a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "=", -1 ]
|
||||
details:
|
||||
selector: td.name a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[title="Magnet link"]
|
||||
attribute: href
|
||||
seeders:
|
||||
selector: td:nth-child(3) b
|
||||
optional: true
|
||||
leechers:
|
||||
selector: td:nth-child(4) b
|
||||
optional: true
|
||||
grabs:
|
||||
selector: td:nth-child(5)
|
||||
optional: true
|
||||
date:
|
||||
selector: td.date
|
||||
filters:
|
||||
- name: dateparse
|
||||
args: "2006-01-02T15:04:05Z"
|
||||
size:
|
||||
selector: td.filesize
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["Unknown", "0"]
|
@@ -1,74 +0,0 @@
|
||||
---
|
||||
site: nyaa
|
||||
name: Nyaa
|
||||
language: en-en
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.nyaa.se/
|
||||
|
||||
settings: []
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# Anime
|
||||
- {id: 1_32, cat: TV/Anime, desc: "Anime music videos"}
|
||||
- {id: 1_37, cat: TV/Anime, desc: "English subtitled animes"}
|
||||
- {id: 1_38, cat: TV/Anime, desc: "Non-english subtitled animes"}
|
||||
- {id: 1_11, cat: TV/Anime, desc: "Raw animes"}
|
||||
# Audio
|
||||
- {id: 3_14, cat: Audio, desc: "Lossless audio"}
|
||||
- {id: 3_15, cat: Audio, desc: "Lossy audio"}
|
||||
# Literature
|
||||
- {id: 2_12, cat: Books, desc: "Literature english translated"}
|
||||
- {id: 2_39, cat: Books, desc: "Literature non-english translated"}
|
||||
- {id: 2_13, cat: Books, desc: "Raw literature"}
|
||||
# Software
|
||||
- {id: 6_23, cat: PC/ISO, desc: "Applications"}
|
||||
- {id: 6_24, cat: PC/Games, desc: "Games"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
|
||||
search:
|
||||
path: /
|
||||
inputs:
|
||||
page: "search"
|
||||
term: "{{ .Query.Keywords}}"
|
||||
rows:
|
||||
selector: tr.tlistrow
|
||||
fields:
|
||||
title:
|
||||
selector: td.tlistname a
|
||||
category:
|
||||
selector: td.tlisticon a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "=", -1 ]
|
||||
details:
|
||||
selector: td.tlistname a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[title="Download"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td.tlistsize
|
||||
seeders:
|
||||
text: 0
|
||||
seeders:
|
||||
selector: td.tlistsn
|
||||
optional: true
|
||||
leechers:
|
||||
text: 0
|
||||
leechers:
|
||||
selector: td.tlistln
|
||||
optional: true
|
||||
grabs:
|
||||
selector: td.tlistdn
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
74
src/Jackett/Definitions/nyaasi.yml
Normal file
74
src/Jackett/Definitions/nyaasi.yml
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
site: nyaasi
|
||||
name: Nyaa.si
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://nyaa.si
|
||||
|
||||
settings: []
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# Anime
|
||||
- {id: 1_0, cat: TV/Anime, desc: "Anime"}
|
||||
- {id: 1_1, cat: TV/Anime, desc: "Anime music videos"}
|
||||
- {id: 1_2, cat: TV/Anime, desc: "English subtitled animes"}
|
||||
- {id: 1_3, cat: TV/Anime, desc: "Non-english subtitled animes"}
|
||||
- {id: 1_4, cat: TV/Anime, desc: "Raw animes"}
|
||||
# Audio
|
||||
- {id: 2_0, cat: Audio, desc: "Audio"}
|
||||
- {id: 2_1, cat: Audio, desc: "Lossless audio"}
|
||||
- {id: 2_2, cat: Audio, desc: "Lossy audio"}
|
||||
# Literature
|
||||
- {id: 3_0, cat: Books, desc: "Literature"}
|
||||
- {id: 3_1, cat: Books, desc: "Literature english translated"}
|
||||
- {id: 3_2, cat: Books, desc: "Literature non-english translated"}
|
||||
- {id: 3_3, cat: Books, desc: "Raw literature"}
|
||||
# Software
|
||||
- {id: 6_0, cat: PC, desc: "Software"}
|
||||
- {id: 6_1, cat: PC/ISO, desc: "Applications"}
|
||||
- {id: 6_2, cat: PC/Games, desc: "Games"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q]
|
||||
|
||||
|
||||
search:
|
||||
path: /
|
||||
inputs:
|
||||
q: "{{ .Query.Keywords}}"
|
||||
rows:
|
||||
selector: tr.default,tr.danger,tr.success
|
||||
fields:
|
||||
category:
|
||||
selector: td:nth-child(1) a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "=", -1 ]
|
||||
title:
|
||||
selector: td:nth-child(2) a
|
||||
details:
|
||||
selector: td:nth-child(2) a
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(3) a
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(4)
|
||||
date:
|
||||
selector: td:nth-child(5)
|
||||
filters:
|
||||
- name: append
|
||||
args: " -00"
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04 -07"
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
75
src/Jackett/Definitions/nyoo.yml
Normal file
75
src/Jackett/Definitions/nyoo.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
# Config'd by Quatroking, 07-05-2017
|
||||
---
|
||||
site: nyoo
|
||||
name: Nyoo
|
||||
language: en-en
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://nyoo.moe
|
||||
|
||||
settings: []
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
# Anime
|
||||
- {id: 3_12, cat: TV/Anime, desc: "Anime music videos"}
|
||||
- {id: 3_5, cat: TV/Anime, desc: "English subtitled animes"}
|
||||
- {id: 3_13, cat: TV/Anime, desc: "Non-english subtitled animes"}
|
||||
- {id: 3_6, cat: TV/Anime, desc: "Raw animes"}
|
||||
# Audio
|
||||
- {id: 2_3, cat: Audio, desc: "Lossless audio"}
|
||||
- {id: 2_4, cat: Audio, desc: "Lossy audio"}
|
||||
# Literature
|
||||
- {id: 4_7, cat: Books, desc: "Literature english translated"}
|
||||
- {id: 4_14, cat: Books, desc: "Literature non-english translated"}
|
||||
- {id: 4_8, cat: Books, desc: "Raw literature"}
|
||||
# Software
|
||||
- {id: 1_1, cat: PC/ISO, desc: "Applications"}
|
||||
- {id: 1_2, cat: PC/Games, desc: "Games"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
|
||||
search:
|
||||
path: /search
|
||||
inputs:
|
||||
page: "search"
|
||||
q: "{{ .Query.Keywords}}"
|
||||
rows:
|
||||
selector: tr.tlistrow
|
||||
fields:
|
||||
title:
|
||||
selector: td.tlistname a
|
||||
category:
|
||||
selector: td.tlisticon a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "=", -1 ]
|
||||
details:
|
||||
selector: td.tlistname a
|
||||
attribute: href
|
||||
download:
|
||||
selector: a[title="Magnet Download"]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td.tlistsize
|
||||
# seeders:
|
||||
# text: 0
|
||||
# seeders:
|
||||
# selector: td.tlistsn
|
||||
# optional: true
|
||||
# leechers:
|
||||
# text: 0
|
||||
# leechers:
|
||||
# selector: td.tlistln
|
||||
# optional: true
|
||||
# grabs:
|
||||
# selector: td.tlistdn
|
||||
downloadvolumefactor:
|
||||
text: "0"
|
||||
uploadvolumefactor:
|
||||
text: "1"
|
@@ -1,103 +0,0 @@
|
||||
---
|
||||
site: redacted-scrape
|
||||
name: Redacted (scrape)
|
||||
description: "A music tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://redacted.ch/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 1, cat: Audio, desc: "Music"}
|
||||
- {id: 2, cat: PC, desc: "Applications"}
|
||||
- {id: 3, cat: Books, desc: "E-Books"}
|
||||
- {id: 4, cat: Audio/Audiobook, desc: "Audiobooks"}
|
||||
- {id: 5, cat: Movies, desc: "E-Learning Videos"}
|
||||
- {id: 6, cat: TV, desc: "Comedy"}
|
||||
- {id: 7, cat: Books/Comics, desc: "Comics"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
login:
|
||||
path: login.php
|
||||
method: post
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
keeplogged: 1
|
||||
login: "Log in"
|
||||
error:
|
||||
- selector: form#loginform > span.warning
|
||||
test:
|
||||
path: torrents.php
|
||||
|
||||
ratio:
|
||||
path: torrents.php
|
||||
selector: li#stats_ratio > span
|
||||
|
||||
search:
|
||||
path: torrents.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
searchstr: "{{ .Query.Keywords }}"
|
||||
order_by: time
|
||||
order_way: desc
|
||||
action: basic
|
||||
searchsubmit: 1
|
||||
rows:
|
||||
selector: table#torrent_table > tbody > tr.torrent
|
||||
fields:
|
||||
download:
|
||||
selector: a[href^="torrents.php?action=download&id="]
|
||||
attribute: href
|
||||
description:
|
||||
selector: div.group_info
|
||||
remove: span
|
||||
title:
|
||||
selector: div.group_info
|
||||
remove: span, div.tags
|
||||
filters:
|
||||
- name: replace
|
||||
args: [" / Neutral Leech!", ""]
|
||||
- name: replace
|
||||
args: [" / Freeleech!", ""]
|
||||
category:
|
||||
selector: td.cats_col
|
||||
case:
|
||||
div.cats_music: 1
|
||||
div.cats_applications: 2
|
||||
div.cats_ebooks: 3
|
||||
div.cats_audiobooks: 4
|
||||
div.cats_elearningvideos: 5
|
||||
div.cats_comedy: 6
|
||||
div.cats_comics: 7
|
||||
comments:
|
||||
selector: a[href^="torrents.php?id="]
|
||||
attribute: href
|
||||
files:
|
||||
selector: td:nth-child(3)
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(5)
|
||||
grabs:
|
||||
selector: td:nth-child(6)
|
||||
seeders:
|
||||
selector: td:nth-child(7)
|
||||
leechers:
|
||||
selector: td:nth-child(8)
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"strong.tl_free": "0"
|
||||
"strong.tl_neutral": "0"
|
||||
":root div.alertbar:contains(\"freeleech\")": "0"
|
||||
":root div.alertbar:contains(\"FREELEECH\")": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"strong.tl_neutral": "0"
|
||||
"*": "1"
|
143
src/Jackett/Definitions/sporthd.yml
Normal file
143
src/Jackett/Definitions/sporthd.yml
Normal file
@@ -0,0 +1,143 @@
|
||||
---
|
||||
site: sporthd
|
||||
name: SportHD
|
||||
description: "Sports tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://sporthd.org/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 50, cat: Movies, desc: "Australian Open"}
|
||||
- {id: 32, cat: Movies, desc: "Basketball"}
|
||||
- {id: 22, cat: Movies, desc: "Boxing"}
|
||||
- {id: 23, cat: Movies, desc: "Brasilareo Seria A"}
|
||||
- {id: 54, cat: Movies, desc: "Brazil League"}
|
||||
- {id: 11, cat: Movies, desc: "BundesLiga"}
|
||||
- {id: 45, cat: Movies, desc: "CAF"}
|
||||
- {id: 37, cat: Movies, desc: "Champions Hockey League"}
|
||||
- {id: 46, cat: Movies, desc: "Copa Americana"}
|
||||
- {id: 41, cat: Movies, desc: "Copa Del Rey"}
|
||||
- {id: 42, cat: Movies, desc: "Copa do Brasil"}
|
||||
- {id: 43, cat: Movies, desc: "Copa Libertadores"}
|
||||
- {id: 40, cat: Movies, desc: "Coppa Italia"}
|
||||
- {id: 51, cat: Movies, desc: "Coupe de France"}
|
||||
- {id: 39, cat: Movies, desc: "DFB Pokal"}
|
||||
- {id: 49, cat: Movies, desc: "English League Cup"}
|
||||
- {id: 8, cat: Movies, desc: "EPL"}
|
||||
- {id: 13, cat: Movies, desc: "Eredivisie"}
|
||||
- {id: 2, cat: Movies, desc: "EURO Cup"}
|
||||
- {id: 6, cat: Movies, desc: "EURO Cup Qualification"}
|
||||
- {id: 66, cat: Movies, desc: "Eurobasket"}
|
||||
- {id: 53, cat: Movies, desc: "Euroleague ULEB"}
|
||||
- {id: 38, cat: Movies, desc: "FA Cup"}
|
||||
- {id: 59, cat: Movies, desc: "FIFA U-20 World Cup"}
|
||||
- {id: 69, cat: Movies, desc: "FIFA World Clup Cup"}
|
||||
- {id: 19, cat: Movies, desc: "Football League Championship"}
|
||||
- {id: 18, cat: Movies, desc: "Formula 1"}
|
||||
- {id: 7, cat: Movies, desc: "Friendly matches"}
|
||||
- {id: 30, cat: Movies, desc: "Handball"}
|
||||
- {id: 31, cat: Movies, desc: "IIHF"}
|
||||
- {id: 15, cat: Movies, desc: "IndyCar"}
|
||||
- {id: 20, cat: Movies, desc: "KHL"}
|
||||
- {id: 10, cat: Movies, desc: "La Liga"}
|
||||
- {id: 12, cat: Movies, desc: "Ligue 1"}
|
||||
- {id: 21, cat: Movies, desc: "Major League Soccer"}
|
||||
- {id: 67, cat: Movies, desc: "MLB"}
|
||||
- {id: 63, cat: Movies, desc: "MMA"}
|
||||
- {id: 58, cat: Movies, desc: "MotoGP"}
|
||||
- {id: 16, cat: Movies, desc: "NBA"}
|
||||
- {id: 57, cat: Movies, desc: "NBA Playoffs"}
|
||||
- {id: 14, cat: Movies, desc: "NCAA"}
|
||||
- {id: 34, cat: Movies, desc: "NFL"}
|
||||
- {id: 17, cat: Movies, desc: "NHL"}
|
||||
- {id: 36, cat: Movies, desc: "Old classic games"}
|
||||
- {id: 68, cat: Movies, desc: "Olympic Games 2016"}
|
||||
- {id: 28, cat: Movies, desc: "Other domestic leagues"}
|
||||
- {id: 55, cat: Movies, desc: "Paulista A1"}
|
||||
- {id: 26, cat: Movies, desc: "Portuguese League"}
|
||||
- {id: 65, cat: Movies, desc: "ROH"}
|
||||
- {id: 61, cat: Movies, desc: "Rollan Garros"}
|
||||
- {id: 29, cat: Movies, desc: "Rugby"}
|
||||
- {id: 9, cat: Movies, desc: "Serie A"}
|
||||
- {id: 33, cat: Movies, desc: "SHL"}
|
||||
- {id: 47, cat: Movies, desc: "Ski Jumping"}
|
||||
- {id: 25, cat: Movies, desc: "Sport video"}
|
||||
- {id: 44, cat: Movies, desc: "Sudamericana"}
|
||||
- {id: 52, cat: Movies, desc: "Taca Da Liga"}
|
||||
- {id: 24, cat: Movies, desc: "Tennis"}
|
||||
- {id: 64, cat: Movies, desc: "TNA"}
|
||||
- {id: 56, cat: Movies, desc: "Torneo Premiera A"}
|
||||
- {id: 3, cat: Movies, desc: "UCL"}
|
||||
- {id: 4, cat: Movies, desc: "UEL"}
|
||||
- {id: 60, cat: Movies, desc: "UFC"}
|
||||
- {id: 35, cat: Movies, desc: "Volleyball"}
|
||||
- {id: 5, cat: Movies, desc: "WC Qualification"}
|
||||
- {id: 1, cat: Movies, desc: "World Cup"}
|
||||
- {id: 27, cat: Movies, desc: "World Cup 2014"}
|
||||
- {id: 48, cat: Movies, desc: "WWE"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
settings:
|
||||
- name: cookie
|
||||
type: text
|
||||
label: Cookie
|
||||
|
||||
login:
|
||||
method: cookie
|
||||
inputs:
|
||||
cookie: "{{ .Config.cookie }}"
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table.embedded > tbody > tr:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
selector: td:nth-child(2)
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
# files:
|
||||
# selector: td:nth-child(3)
|
||||
# size:
|
||||
# selector: td:nth-child(4)
|
||||
#seeders:
|
||||
# selector: td:nth-child(5)
|
||||
#leechers:
|
||||
# selector: td:nth-child(5)
|
||||
# date:
|
||||
# selector: td:nth-child(7)
|
||||
# filters:
|
||||
# - name: append
|
||||
# args: " ago"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
124
src/Jackett/Definitions/sportscult.yml
Normal file
124
src/Jackett/Definitions/sportscult.yml
Normal file
@@ -0,0 +1,124 @@
|
||||
---
|
||||
site: sportscult
|
||||
name: SportsCult
|
||||
description: "Sports tracker"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://sportscult.org
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 47, cat: TV/Sport, desc: "EPL"}
|
||||
- {id: 41, cat: TV/Sport, desc: "American Football"}
|
||||
- {id: 17, cat: TV/Sport, desc: "Athletics"}
|
||||
- {id: 34, cat: TV/Sport, desc: "Bodybuilding/Fitness"}
|
||||
- {id: 29, cat: TV/Sport, desc: "Boxing"}
|
||||
- {id: 19, cat: TV/Sport, desc: "BrainGames"}
|
||||
- {id: 36, cat: TV/Sport, desc: "BreakDance"}
|
||||
- {id: 40, cat: TV/Sport, desc: "Cricet/Golf/Baseball"}
|
||||
- {id: 23, cat: TV/Sport, desc: "Cycling"}
|
||||
- {id: 31, cat: TV/Sport, desc: "Documentary"}
|
||||
- {id: 1, cat: TV/Sport, desc: "European Basketball"}
|
||||
- {id: 6, cat: TV/Sport, desc: "European Soccer"}
|
||||
- {id: 37, cat: TV/Sport, desc: "Extreme Sports"}
|
||||
- {id: 9, cat: TV/Sport, desc: "Fight Sports"}
|
||||
- {id: 32, cat: TV/Sport, desc: "Formula1"}
|
||||
- {id: 45, cat: TV/Sport, desc: "GAA (Gaelic)"}
|
||||
- {id: 8, cat: TV/Sport, desc: "Golf"}
|
||||
- {id: 22, cat: TV/Sport, desc: "Gymnastics"}
|
||||
- {id: 39, cat: TV/Sport, desc: "Handball"}
|
||||
- {id: 2, cat: TV/Sport, desc: "International Basket"}
|
||||
- {id: 25, cat: TV/Sport, desc: "IceHockey"}
|
||||
- {id: 4, cat: TV/Sport, desc: "International Soccer"}
|
||||
- {id: 42, cat: TV/Sport, desc: "KHL"}
|
||||
- {id: 35, cat: TV/Sport, desc: "KickBoxing/Muay Thai"}
|
||||
- {id: 43, cat: TV/Sport, desc: "La Liga"}
|
||||
- {id: 15, cat: TV/Sport, desc: "MotorSport"}
|
||||
- {id: 24, cat: TV/Sport, desc: "MLB/Baseball"}
|
||||
- {id: 28, cat: TV/Sport, desc: "MMA"}
|
||||
- {id: 11, cat: TV/Sport, desc: "NBA/WNBA"}
|
||||
- {id: 3, cat: TV/Sport, desc: "NCAA Basket/Football"}
|
||||
- {id: 5, cat: TV/Sport, desc: "NFL"}
|
||||
- {id: 27, cat: TV/Sport, desc: "NHL"}
|
||||
- {id: 26, cat: TV/Sport, desc: "Olympic games"}
|
||||
- {id: 7, cat: TV/Sport, desc: "Rugby"}
|
||||
- {id: 44, cat: TV/Sport, desc: "Serie A"}
|
||||
- {id: 38, cat: TV/Sport, desc: "Snooker/Pool"}
|
||||
- {id: 30, cat: TV/Sport, desc: "Streetball"}
|
||||
- {id: 18, cat: TV/Sport, desc: "Swimming/Aquatics"}
|
||||
- {id: 46, cat: TV/Sport, desc: "AFL(AustralianFB)"}
|
||||
- {id: 12, cat: TV/Sport, desc: "Tennis"}
|
||||
- {id: 20, cat: TV/Sport, desc: "Volleyball/Beach"}
|
||||
- {id: 21, cat: TV/Sport, desc: "Weightlifting"}
|
||||
- {id: 16, cat: TV/Sport, desc: "WinterSport"}
|
||||
- {id: 33, cat: TV/Sport, desc: "Wrestling/Grapling"}
|
||||
- {id: 48, cat: TV/Sport, desc: "Uncategorised"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /?page=login
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
uid: "{{ .Config.username }}"
|
||||
pwd: "{{ .Config.password }}"
|
||||
error:
|
||||
- selector: span:contains("Password Incorrect")
|
||||
test:
|
||||
path: index.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php?id="]
|
||||
|
||||
search:
|
||||
path: index.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
page: torrents
|
||||
category: 0
|
||||
active: 1
|
||||
rows:
|
||||
selector: table[cellspacing!="1"].lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="index.php?page=torrents&category="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: category
|
||||
title:
|
||||
remove: span
|
||||
selector: td:nth-child(2)
|
||||
download:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["index.php?page=torrent-details&id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="index.php?page=torrent-details&id="]
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(4)
|
||||
seeders:
|
||||
selector: td:nth-child(6)
|
||||
leechers:
|
||||
selector: td:nth-child(7)
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
# date:
|
||||
# selector: td:nth-child(5)
|
||||
# filters:
|
||||
# - name: dateparse
|
||||
# args: "02/05/2017"
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"*": "1"
|
@@ -6,7 +6,7 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://www.theempire.bz/
|
||||
- http://theempire.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
157
src/Jackett/Definitions/thegeeks.yml
Normal file
157
src/Jackett/Definitions/thegeeks.yml
Normal file
@@ -0,0 +1,157 @@
|
||||
---
|
||||
site: thegeeks
|
||||
name: The Geeks
|
||||
description: "Technology E-Learning"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://thegeeks.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 71, cat: Other, desc: "Antiques / Collecting"}
|
||||
- {id: 46, cat: Other, desc: "Comp: Security/Encryption"}
|
||||
- {id: 37, cat: Other, desc: "Game Shows / Quiz Shows"}
|
||||
- {id: 16, cat: Other, desc: "Magic & Illusion"}
|
||||
- {id: 79, cat: Other, desc: "Reality: Competitions"}
|
||||
- {id: 68, cat: Other, desc: "Arts & Crafts / Jewelry"}
|
||||
- {id: 52, cat: Other, desc: "Comp: Software Training"}
|
||||
- {id: 2, cat: Other, desc: "Games: Cards / Gambling"}
|
||||
- {id: 12, cat: Other, desc: "Math & Statistics"}
|
||||
- {id: 53, cat: Other, desc: "Reality: Social Experiment"}
|
||||
- {id: 72, cat: Other, desc: "Astronomy / Space"}
|
||||
- {id: 41, cat: Other, desc: "Comp: Theory/Ref/Mags"}
|
||||
- {id: 63, cat: Other, desc: "Games: Tabletop / Roleplay"}
|
||||
- {id: 10, cat: Other, desc: "Medicine & Health"}
|
||||
- {id: 61, cat: Other, desc: "Sci: Biology"}
|
||||
- {id: 28, cat: Other, desc: "Business / Finance"}
|
||||
- {id: 47, cat: Other, desc: "Comp: Web Development"}
|
||||
- {id: 36, cat: Other, desc: "Gardening / Agriculture"}
|
||||
- {id: 26, cat: Other, desc: "Music: History / Theory"}
|
||||
- {id: 77, cat: Other, desc: "Sci: Chemistry"}
|
||||
- {id: 38, cat: Other, desc: "Crime & Investigation"}
|
||||
- {id: 21, cat: Other, desc: "DIY / Workshop"}
|
||||
- {id: 55, cat: Other, desc: "History of Civilization"}
|
||||
- {id: 15, cat: Other, desc: "Music: Learning / Courses"}
|
||||
- {id: 76, cat: Other, desc: "Sci: Physics"}
|
||||
- {id: 45, cat: Other, desc: "Photography"}
|
||||
- {id: 82, cat: Other, desc: "Docu: Architecture / Building"}
|
||||
- {id: 56, cat: Other, desc: "History of War & Politics"}
|
||||
- {id: 75, cat: Other, desc: "Nature"}
|
||||
- {id: 80, cat: Other, desc: "Sports - Live/Highlights"}
|
||||
- {id: 85, cat: Other, desc: "Childrens Educational"}
|
||||
- {id: 39, cat: Other, desc: "Docu: Fly on The Wall"}
|
||||
- {id: 58, cat: Other, desc: "History: Biographies"}
|
||||
- {id: 54, cat: Other, desc: "News / World Reports"}
|
||||
- {id: 22, cat: Other, desc: "Sports/Exercise/Outdoors"}
|
||||
- {id: 40, cat: Other, desc: "Comp: Certification Courses"}
|
||||
- {id: 69, cat: Other, desc: "Documentaries: Misc"}
|
||||
- {id: 31, cat: Other, desc: "History: Misc"}
|
||||
- {id: 83, cat: Other, desc: "Nova"}
|
||||
- {id: 24, cat: Other, desc: "Stock Media"}
|
||||
- {id: 44, cat: Other, desc: "Comp: Digital Audio/Video"}
|
||||
- {id: 59, cat: Other, desc: "Earth / Environment"}
|
||||
- {id: 23, cat: Other, desc: "Hobbies: Misc"}
|
||||
- {id: 27, cat: Other, desc: "Paleontology"}
|
||||
- {id: 33, cat: Other, desc: "Style & Fashion"}
|
||||
- {id: 48, cat: Other, desc: "Comp: Games Dev/Guides"}
|
||||
- {id: 18, cat: Other, desc: "Engineering"}
|
||||
- {id: 35, cat: Other, desc: "Home / Property"}
|
||||
- {id: 60, cat: Other, desc: "Performing Arts"}
|
||||
- {id: 73, cat: Other, desc: "Survivalism"}
|
||||
- {id: 3, cat: Other, desc: "Comp: Graphics "}
|
||||
- {id: 25, cat: Other, desc: "Exam Prep / Education"}
|
||||
- {id: 78, cat: Other, desc: "Horizon"}
|
||||
- {id: 67, cat: Other, desc: "Pets / Animal Keeping"}
|
||||
- {id: 86, cat: Other, desc: "Tattoos/Body Art"}
|
||||
- {id: 42, cat: Other, desc: "Comp: Lang/DBs"}
|
||||
- {id: 4, cat: Other, desc: "Fine & Visual Arts"}
|
||||
- {id: 1, cat: Other, desc: "Languages / Linguistics"}
|
||||
- {id: 29, cat: Other, desc: "Philosophy"}
|
||||
- {id: 32, cat: Other, desc: "Travel / Culture"}
|
||||
- {id: 49, cat: Other, desc: "Comp: Network/Hardware"}
|
||||
- {id: 9, cat: Other, desc: "Food / Cooking / Nutrition"}
|
||||
- {id: 20, cat: Other, desc: "Law & Justice"}
|
||||
- {id: 11, cat: Other, desc: "Political Studies"}
|
||||
- {id: 34, cat: Other, desc: "Vehicles & Transport"}
|
||||
- {id: 43, cat: Other, desc: "Comp: Operating Systems"}
|
||||
- {id: 84, cat: Other, desc: "FrontLine"}
|
||||
- {id: 30, cat: Other, desc: "Literature"}
|
||||
- {id: 14, cat: Other, desc: "Psychology/Sociology"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
image: img#freecap
|
||||
input: word
|
||||
error:
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: main.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
filters:
|
||||
selector: td:nth-child(2) b
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{4}-\d{2}-\d{2})
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"font[color=\"blue\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"*": "1"
|
139
src/Jackett/Definitions/theoccult.yml
Normal file
139
src/Jackett/Definitions/theoccult.yml
Normal file
@@ -0,0 +1,139 @@
|
||||
---
|
||||
site: theoccult
|
||||
name: The Occult
|
||||
description: "Cult E-Learning"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://theoccult.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 63, cat: Other, desc: "Academic / Reference"}
|
||||
- {id: 21, cat: Other, desc: "Everything Else"}
|
||||
- {id: 68, cat: Other, desc: "Mythology and Folklore"}
|
||||
- {id: 61, cat: Other, desc: "Rajneesh"}
|
||||
- {id: 1, cat: Other, desc: "Thelema / Crowley"}
|
||||
- {id: 51, cat: Other, desc: "African/African Diaspora Relig"}
|
||||
- {id: 30, cat: Other, desc: "Fourth Way"}
|
||||
- {id: 17, cat: Other, desc: "Native American"}
|
||||
- {id: 57, cat: Other, desc: "Ritual Magic"}
|
||||
- {id: 74, cat: Other, desc: "Theosophy / Anthroposophy"}
|
||||
- {id: 10, cat: Other, desc: "Alchemy"}
|
||||
- {id: 7, cat: Other, desc: "Freemasonry"}
|
||||
- {id: 54, cat: Other, desc: "New Age"}
|
||||
- {id: 34, cat: Other, desc: "Rosicrucian"}
|
||||
- {id: 73, cat: Other, desc: "Traditional Left-Hand Path"}
|
||||
- {id: 69, cat: Other, desc: "Ancient Languages"}
|
||||
- {id: 6, cat: Other, desc: "Golden Dawn"}
|
||||
- {id: 76, cat: Other, desc: "Non-Dualism"}
|
||||
- {id: 75, cat: Other, desc: "Sacred Geometry"}
|
||||
- {id: 71, cat: Other, desc: "Traditional Witchcraft"}
|
||||
- {id: 9, cat: Other, desc: "Astrology"}
|
||||
- {id: 35, cat: Other, desc: "Grimoires"}
|
||||
- {id: 52, cat: Other, desc: "Northern European Paganism"}
|
||||
- {id: 31, cat: Other, desc: "Satanism"}
|
||||
- {id: 77, cat: Other, desc: "Transpersonal Psychology"}
|
||||
- {id: 25, cat: Other, desc: "Buddhism "}
|
||||
- {id: 26, cat: Other, desc: "Hinduism"}
|
||||
- {id: 70, cat: Other, desc: "Other Divination"}
|
||||
- {id: 28, cat: Other, desc: "Shamanism"}
|
||||
- {id: 19, cat: Other, desc: "Wicca / NeoWicca / Eclectic"}
|
||||
- {id: 32, cat: Other, desc: "Chaos Magic "}
|
||||
- {id: 64, cat: Other, desc: "Lovecraft Mythos"}
|
||||
- {id: 67, cat: Other, desc: "Other Eastern Traditions"}
|
||||
- {id: 56, cat: Other, desc: "Southern European Paganism"}
|
||||
- {id: 20, cat: Other, desc: "Yoga / Tantra"}
|
||||
- {id: 66, cat: Other, desc: "Energy Healing"}
|
||||
- {id: 13, cat: Other, desc: "Lucid Dreams/Astral Projection"}
|
||||
- {id: 49, cat: Other, desc: "Paranormal"}
|
||||
- {id: 72, cat: Other, desc: "Specialty Presses"}
|
||||
- {id: 4, cat: Other, desc: "Enochian"}
|
||||
- {id: 14, cat: Other, desc: "Meditation"}
|
||||
- {id: 33, cat: Other, desc: "Parapsychology"}
|
||||
- {id: 58, cat: Other, desc: "Sufism"}
|
||||
- {id: 11, cat: Other, desc: "Entheogens"}
|
||||
- {id: 53, cat: Other, desc: "Middle Eastern Magic"}
|
||||
- {id: 15, cat: Other, desc: "Philosophy"}
|
||||
- {id: 55, cat: Other, desc: "Taoism / Daoism"}
|
||||
- {id: 29, cat: Other, desc: "Esoteric Christianity"}
|
||||
- {id: 65, cat: Other, desc: "Modern Grimoires"}
|
||||
- {id: 12, cat: Other, desc: "Qabalah / Kabbalah / Cabala"}
|
||||
- {id: 18, cat: Other, desc: "Tarot / Oracle Cards"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
image: img#freecap
|
||||
input: word
|
||||
error:
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: main.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
filters:
|
||||
selector: td:nth-child(2) b
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{4}-\d{2}-\d{2})
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"font[color=\"blue\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"*": "1"
|
120
src/Jackett/Definitions/theplace.yml
Normal file
120
src/Jackett/Definitions/theplace.yml
Normal file
@@ -0,0 +1,120 @@
|
||||
---
|
||||
site: theplace
|
||||
name: The Place
|
||||
description: "Self-improvement E-Learning"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://theplace.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 46, cat: Other, desc: "Alpha Male Example Clips"}
|
||||
- {id: 68, cat: Other, desc: "Author: Juggler"}
|
||||
- {id: 69, cat: Other, desc: "Author: Sean Messenger"}
|
||||
- {id: 42, cat: Other, desc: "Food / Drink / Cooking"}
|
||||
- {id: 22, cat: Other, desc: "Seduction: Other"}
|
||||
- {id: 60, cat: Other, desc: "Author: AMP"}
|
||||
- {id: 70, cat: Other, desc: "Author: Michael Hall (NLP)"}
|
||||
- {id: 61, cat: Other, desc: "Author: Style (Neil Strauss)"}
|
||||
- {id: 47, cat: Other, desc: "Health / Fitness / Massage"}
|
||||
- {id: 39, cat: Other, desc: "Seduction: Video"}
|
||||
- {id: 51, cat: Other, desc: "Author: Anthony Robbins"}
|
||||
- {id: 49, cat: Other, desc: "Author: Mystery"}
|
||||
- {id: 66, cat: Other, desc: "Author: Vince Kelvin"}
|
||||
- {id: 43, cat: Other, desc: "Hypnotism / NLP"}
|
||||
- {id: 14, cat: Other, desc: "Seduction: Written"}
|
||||
- {id: 50, cat: Other, desc: "Author: Carlos Xuma"}
|
||||
- {id: 53, cat: Other, desc: "Author: Pickup101"}
|
||||
- {id: 41, cat: Other, desc: "Dance / Singing / Voice"}
|
||||
- {id: 44, cat: Other, desc: "Languages / Accents"}
|
||||
- {id: 40, cat: Other, desc: "Sex"}
|
||||
- {id: 48, cat: Other, desc: "Author: David DeAngelo"}
|
||||
- {id: 65, cat: Other, desc: "Author: Richard Bandler (NLP)"}
|
||||
- {id: 57, cat: Other, desc: "Everything Else"}
|
||||
- {id: 45, cat: Other, desc: "Magic / Illusions / Tricks"}
|
||||
- {id: 54, cat: Other, desc: "Author: David Shade"}
|
||||
- {id: 52, cat: Other, desc: "Author: Ross Jeffries"}
|
||||
- {id: 58, cat: Other, desc: "Fashion / Clothing / Grooming"}
|
||||
- {id: 59, cat: Other, desc: "Psychology / Body Language"}
|
||||
- {id: 71, cat: Other, desc: "Author: Jerry Stocking"}
|
||||
- {id: 67, cat: Other, desc: "Author: RSD"}
|
||||
- {id: 64, cat: Other, desc: "Fighting / Martial Arts"}
|
||||
- {id: 38, cat: Other, desc: "Seduction: Audio"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
image: img#freecap
|
||||
input: word
|
||||
error:
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: main.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
filters:
|
||||
selector: td:nth-child(2) b
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{4}-\d{2}-\d{2})
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"font[color=\"blue\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"*": "1"
|
137
src/Jackett/Definitions/theshow.yml
Normal file
137
src/Jackett/Definitions/theshow.yml
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
site: theshow
|
||||
name: The Show
|
||||
description: "Entertainment E-Learning"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://theshow.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 64, cat: Other, desc: "Graphics / Photo Editing"}
|
||||
- {id: 51, cat: Other, desc: "Performing Craft: Acting"}
|
||||
- {id: 85, cat: Other, desc: "Scripts: Theatre"}
|
||||
- {id: 90, cat: Other, desc: "Visual Craft: Handcraft/Sculpt"}
|
||||
- {id: 32, cat: Other, desc: "Magazines / Trade Journals"}
|
||||
- {id: 4, cat: Other, desc: "Performing Craft: Dance"}
|
||||
- {id: 49, cat: Other, desc: "Software / Tutorials"}
|
||||
- {id: 93, cat: Other, desc: "Visual Craft: Jewelry Making"}
|
||||
- {id: 17, cat: Other, desc: "A-V: Film/Video Editing"}
|
||||
- {id: 66, cat: Other, desc: "Mindset / Creativity"}
|
||||
- {id: 10, cat: Other, desc: "Production: Cinematography"}
|
||||
- {id: 26, cat: Other, desc: "Stock: Film / Video"}
|
||||
- {id: 11, cat: Other, desc: "Visual Craft: Needlework"}
|
||||
- {id: 30, cat: Other, desc: "A-V: Sound Recording/Design"}
|
||||
- {id: 67, cat: Other, desc: "Music Business / Promotion"}
|
||||
- {id: 1, cat: Other, desc: "Production: Directing (Film)"}
|
||||
- {id: 54, cat: Other, desc: "Stock: Music / Sound FX"}
|
||||
- {id: 52, cat: Other, desc: "Visual Craft: Photography"}
|
||||
- {id: 6, cat: Other, desc: "A-V: Videography"}
|
||||
- {id: 73, cat: Other, desc: "Music: Shows/Special Events"}
|
||||
- {id: 7, cat: Other, desc: "Production: Directing(Theatre)"}
|
||||
- {id: 13, cat: Other, desc: "Stock: Photos / Illustrations"}
|
||||
- {id: 89, cat: Other, desc: "Visual Craft: Scrapbooking"}
|
||||
- {id: 9, cat: Other, desc: "A-V: Visual FX"}
|
||||
- {id: 70, cat: Other, desc: "Performances: Competitions"}
|
||||
- {id: 53, cat: Other, desc: "Production: Visuals"}
|
||||
- {id: 69, cat: Other, desc: "TV Shows: Action/Drama/Mystery"}
|
||||
- {id: 88, cat: Other, desc: "Visual Craft: Tattoos/Body Art"}
|
||||
- {id: 29, cat: Other, desc: "Business / Distribution"}
|
||||
- {id: 94, cat: Other, desc: "Performances: Dance/Ballet"}
|
||||
- {id: 77, cat: Other, desc: "Radio: Comedy/Drama/Mystery"}
|
||||
- {id: 68, cat: Other, desc: "TV Shows: Comedy"}
|
||||
- {id: 21, cat: Other, desc: "Writing Craft: Screenwriting"}
|
||||
- {id: 56, cat: Other, desc: "Creative Writing"}
|
||||
- {id: 82, cat: Other, desc: "Performances: Drama/Art"}
|
||||
- {id: 79, cat: Other, desc: "Radio: Entertain/Arts/Narrativ"}
|
||||
- {id: 71, cat: Other, desc: "TV Shows: Entertain/Chat/Goss"}
|
||||
- {id: 25, cat: Other, desc: "Digital Craft: 3D Modeling"}
|
||||
- {id: 76, cat: Other, desc: "Performances: Sketch/Improv"}
|
||||
- {id: 80, cat: Other, desc: "Radio: Music Performances"}
|
||||
- {id: 92, cat: Other, desc: "Visual Craft: Design Theory"}
|
||||
- {id: 63, cat: Other, desc: "Everything Else"}
|
||||
- {id: 75, cat: Other, desc: "Performances: Spoken Word"}
|
||||
- {id: 83, cat: Other, desc: "Scripts: Radio"}
|
||||
- {id: 91, cat: Other, desc: "Visual Craft: Drawing/Drafting"}
|
||||
- {id: 65, cat: Other, desc: "Film History / Theory "}
|
||||
- {id: 78, cat: Other, desc: "Performances: Standup Comedy"}
|
||||
- {id: 84, cat: Other, desc: "Scripts: Television"}
|
||||
- {id: 87, cat: Other, desc: "Visual Craft: Fashion/Makeup"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
image: img#freecap
|
||||
input: word
|
||||
error:
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: main.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
filters:
|
||||
selector: td:nth-child(2) b
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{4}-\d{2}-\d{2})
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"font[color=\"blue\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"*": "1"
|
138
src/Jackett/Definitions/thevault.yml
Normal file
138
src/Jackett/Definitions/thevault.yml
Normal file
@@ -0,0 +1,138 @@
|
||||
---
|
||||
site: thevault
|
||||
name: The Vault
|
||||
description: "Business/Marketing E-Learning"
|
||||
language: en-us
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- http://thevault.click/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
- {id: 87, cat: Other, desc: "Author: Brian Tracy"}
|
||||
- {id: 106, cat: Other, desc: "Autobiographies / Biographies"}
|
||||
- {id: 67, cat: Other, desc: "Investing / Trading / Stocks"}
|
||||
- {id: 93, cat: Other, desc: "Negotiation / Contracts"}
|
||||
- {id: 99, cat: Other, desc: "Net: Traffic Generation"}
|
||||
- {id: 107, cat: Other, desc: "Author: Dan Kennedy"}
|
||||
- {id: 118, cat: Other, desc: "Ayn Rand / Objectivism"}
|
||||
- {id: 75, cat: Other, desc: "Magazines"}
|
||||
- {id: 97, cat: Other, desc: "Net: Affiliate Schemes"}
|
||||
- {id: 102, cat: Other, desc: "Net: Web Site/Blog Templates"}
|
||||
- {id: 110, cat: Other, desc: "Author: Dan Pena"}
|
||||
- {id: 112, cat: Other, desc: "Consulting"}
|
||||
- {id: 70, cat: Other, desc: "Management / Leadership"}
|
||||
- {id: 105, cat: Other, desc: "Net: Blogging"}
|
||||
- {id: 114, cat: Other, desc: "Network Marketing (MLM)"}
|
||||
- {id: 117, cat: Other, desc: "Author: Eben Pagan"}
|
||||
- {id: 94, cat: Other, desc: "Copywriting"}
|
||||
- {id: 85, cat: Other, desc: "Mindset / Achievement"}
|
||||
- {id: 76, cat: Other, desc: "Net: E-Commerce"}
|
||||
- {id: 111, cat: Other, desc: "Offshore / Tax Avoidance"}
|
||||
- {id: 92, cat: Other, desc: "Author: Jay Abraham"}
|
||||
- {id: 103, cat: Other, desc: "Corporate Design / Branding"}
|
||||
- {id: 80, cat: Other, desc: "Misc: Audio"}
|
||||
- {id: 100, cat: Other, desc: "Net: eBay / Online Auctions"}
|
||||
- {id: 116, cat: Other, desc: "Private Label Rights (PLR)"}
|
||||
- {id: 89, cat: Other, desc: "Author: Jim Rohn"}
|
||||
- {id: 84, cat: Other, desc: "Customer Service"}
|
||||
- {id: 90, cat: Other, desc: "Misc: Other"}
|
||||
- {id: 115, cat: Other, desc: "Net: Email Marketing"}
|
||||
- {id: 68, cat: Other, desc: "Real Estate / Property Develop"}
|
||||
- {id: 96, cat: Other, desc: "Author: John Reese"}
|
||||
- {id: 65, cat: Other, desc: "Economics / Finance"}
|
||||
- {id: 83, cat: Other, desc: "Misc: Software"}
|
||||
- {id: 95, cat: Other, desc: "Net: Marketing"}
|
||||
- {id: 104, cat: Other, desc: "Recruitment / Interviewing"}
|
||||
- {id: 63, cat: Other, desc: "Author: Robert Kiyosaki"}
|
||||
- {id: 113, cat: Other, desc: "Entertainment Business"}
|
||||
- {id: 81, cat: Other, desc: "Misc: Video"}
|
||||
- {id: 101, cat: Other, desc: "Net: Misc"}
|
||||
- {id: 71, cat: Other, desc: "Sales / Marketing"}
|
||||
- {id: 86, cat: Other, desc: "Author: T Harv Eker"}
|
||||
- {id: 109, cat: Other, desc: "Gambling / Betting"}
|
||||
- {id: 82, cat: Other, desc: "Misc: Written / E-Books"}
|
||||
- {id: 98, cat: Other, desc: "Net: Pay-Per-Click Advertising"}
|
||||
- {id: 72, cat: Other, desc: "Small Business / Entrepreneurs"}
|
||||
- {id: 88, cat: Other, desc: "Author: Zig Ziglar"}
|
||||
- {id: 73, cat: Other, desc: "Hypnosis / NLP"}
|
||||
- {id: 62, cat: Other, desc: "Money Management / Taxes"}
|
||||
- {id: 108, cat: Other, desc: "Net: Search Engine Optimizing"}
|
||||
- {id: 91, cat: Other, desc: "TTC Lectures"}
|
||||
|
||||
modes:
|
||||
search: [q]
|
||||
|
||||
login:
|
||||
path: /login.php
|
||||
method: form
|
||||
form: form
|
||||
inputs:
|
||||
username: "{{ .Config.username }}"
|
||||
password: "{{ .Config.password }}"
|
||||
captcha:
|
||||
type: image
|
||||
image: img#freecap
|
||||
input: word
|
||||
error:
|
||||
- selector: table:contains("Login failed!")
|
||||
test:
|
||||
path: main.php
|
||||
|
||||
download:
|
||||
selector: a[href^="download.php"]
|
||||
|
||||
search:
|
||||
path: browse.php
|
||||
inputs:
|
||||
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
|
||||
search: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="])
|
||||
fields:
|
||||
category:
|
||||
selector: a[href^="browse.php?cat="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: querystring
|
||||
args: cat
|
||||
title:
|
||||
filters:
|
||||
selector: td:nth-child(2) b
|
||||
download:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
filters:
|
||||
- name: replace
|
||||
args: ["details.php?id=", "download.php?id="]
|
||||
details:
|
||||
selector: a[href^="details.php?id="]
|
||||
attribute: href
|
||||
grabs:
|
||||
selector: td:nth-child(8)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: ([\d,]+)
|
||||
files:
|
||||
selector: td:nth-child(4)
|
||||
size:
|
||||
selector: td:nth-child(7)
|
||||
seeders:
|
||||
selector: td:nth-child(9)
|
||||
leechers:
|
||||
selector: td:nth-child(10)
|
||||
date:
|
||||
selector: td:nth-child(6)
|
||||
filters:
|
||||
- name: regexp
|
||||
args: (\d{4}-\d{2}-\d{2})
|
||||
downloadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"font[color=\"blue\"]": "0"
|
||||
"*": "1"
|
||||
uploadvolumefactor:
|
||||
case:
|
||||
"font[color=\"green\"]": "0"
|
||||
"*": "1"
|
74
src/Jackett/Definitions/tokyotosho.yml
Normal file
74
src/Jackett/Definitions/tokyotosho.yml
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
site: tokyotosho
|
||||
name: Tokyo Toshokan
|
||||
description: "A BitTorrent Library for Japanese Media"
|
||||
language: en-us
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.tokyotosho.info/
|
||||
|
||||
caps:
|
||||
categories:
|
||||
1: TV/Anime # Anime
|
||||
10: TV/Anime # Non-English Anime
|
||||
3: Books # Manga
|
||||
8: TV/Anime # Drama
|
||||
2: Audio # Anime Music
|
||||
9: TV/Anime # Anime Music Videos
|
||||
7: TV/Anime # Raw Anime
|
||||
4: XXX # Hentai
|
||||
12: XXX # Hentai (Anime)
|
||||
13: XXX # Hentai (Manga)
|
||||
14: XXX # Hentai (Games)
|
||||
11: TV/Anime # Batch
|
||||
15: XXX # JAV
|
||||
5: Other # Other
|
||||
modes:
|
||||
search: [q]
|
||||
tv-search: [q, season, ep]
|
||||
|
||||
search:
|
||||
path: "{{if .Query.Keywords }}search.php{{else}}index.php{{end}}"
|
||||
inputs:
|
||||
terms: "{{ .Query.Keywords }}"
|
||||
rows:
|
||||
selector: "table.listing tr.category_0"
|
||||
after: 1
|
||||
fields:
|
||||
category:
|
||||
selector: td:nth-child(1) > a
|
||||
attribute: href
|
||||
filters:
|
||||
- name: regexp
|
||||
args: "(\\d+)"
|
||||
title:
|
||||
selector: td:nth-child(2) > a:nth-child(2)
|
||||
details:
|
||||
selector: td:nth-child(3) > a
|
||||
attribute: href
|
||||
download:
|
||||
selector: td:nth-child(2) > a:nth-child(2)
|
||||
attribute: href
|
||||
size:
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "|", 1 ]
|
||||
- name: regexp
|
||||
args: "Size: (.+?) ?$"
|
||||
date:
|
||||
selector: td:nth-child(4)
|
||||
filters:
|
||||
- name: split
|
||||
args: [ "|", 2 ]
|
||||
- name: regexp
|
||||
args: "Date: (.+?) ?$"
|
||||
- name: replace
|
||||
args: ["UTC","-00"]
|
||||
- name: dateparse
|
||||
args: "2006-01-02 15:04 -07"
|
||||
seeders:
|
||||
selector: td:nth-child(5) > span:nth-child(1)
|
||||
leechers:
|
||||
selector: td:nth-child(5) > span:nth-child(2)
|
@@ -126,9 +126,9 @@ namespace Jackett.Indexers.Abstract
|
||||
if (!string.IsNullOrEmpty(artist))
|
||||
release.Title += artist + " - ";
|
||||
release.Title += groupName;
|
||||
if (!string.IsNullOrEmpty(groupYear))
|
||||
if (!string.IsNullOrEmpty(groupYear) && groupYear != "0")
|
||||
release.Title += " [" + groupYear + "]";
|
||||
if (!string.IsNullOrEmpty(releaseType))
|
||||
if (!string.IsNullOrEmpty(releaseType) && releaseType != "Unknown")
|
||||
release.Title += " [" + releaseType + "]";
|
||||
|
||||
release.Description = "";
|
||||
@@ -180,7 +180,7 @@ namespace Jackett.Indexers.Abstract
|
||||
|
||||
var format = (string)torrent["format"];
|
||||
if (!string.IsNullOrEmpty(format))
|
||||
flags.Add(format);
|
||||
flags.Add(HttpUtility.HtmlDecode(format));
|
||||
|
||||
var encoding = (string)torrent["encoding"];
|
||||
if (!string.IsNullOrEmpty(encoding))
|
||||
|
@@ -135,8 +135,8 @@ namespace Jackett.Indexers
|
||||
{
|
||||
configData.CookieHeader.Value = jsonConfig.Value<string>("cookies");
|
||||
configData.IncludeRaw.Value = jsonConfig.Value<bool>("raws");
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -302,9 +302,9 @@ namespace Jackett.Indexers
|
||||
releaseInfo = releaseInfo.Replace("Season ", "S");
|
||||
releaseInfo = releaseInfo.Trim();
|
||||
int test = 0;
|
||||
if (InsertSeason && int.TryParse(releaseInfo, out test) && releaseInfo.Length==1)
|
||||
if (InsertSeason && int.TryParse(releaseInfo, out test) && releaseInfo.Length<=3)
|
||||
{
|
||||
releaseInfo = "S01E0" + releaseInfo;
|
||||
releaseInfo = "E0" + releaseInfo;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -35,7 +35,7 @@ namespace Jackett.Indexers
|
||||
public AnimeTorrents(IIndexerManagerService i, HttpWebClient c, Logger l, IProtectionService ps)
|
||||
: base(name: "AnimeTorrents",
|
||||
description: "Definitive source for anime and manga",
|
||||
link: "http://animetorrents.me/",
|
||||
link: "https://animetorrents.me/",
|
||||
caps: new TorznabCapabilities(),
|
||||
manager: i,
|
||||
client: c, // Forced HTTP client for custom headers
|
||||
@@ -78,7 +78,7 @@ namespace Jackett.Indexers
|
||||
{ "rememberme[]", "1" }
|
||||
};
|
||||
|
||||
var loginPage = await RequestStringWithCookiesAndRetry(LoginUrl, null, null);
|
||||
var loginPage = await RequestStringWithCookiesAndRetry(LoginUrl, "", LoginUrl);
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true);
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
|
||||
|
184
src/Jackett/Indexers/ArcheTorrent.cs
Normal file
184
src/Jackett/Indexers/ArcheTorrent.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using AngleSharp.Parser.Html;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
using Jackett.Models;
|
||||
using Jackett.Models.IndexerConfig;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils;
|
||||
using Jackett.Utils.Clients;
|
||||
|
||||
namespace Jackett.Indexers
|
||||
{
|
||||
class ArcheTorrent : BaseIndexer, IIndexer
|
||||
{
|
||||
string LoginUrl { get { return SiteLink + "account-login.php"; } }
|
||||
string BrowseUrl { get { return SiteLink + "torrents-search.php"; } }
|
||||
string DownloadUrl { get { return SiteLink + "download.php"; } }
|
||||
|
||||
new ConfigurationDataBasicLogin configData
|
||||
{
|
||||
get { return (ConfigurationDataBasicLogin)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public ArcheTorrent(IIndexerManagerService indexerManager, IWebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "Arche Torrent",
|
||||
description: "French Torrent Tracker",
|
||||
link: "https://www.archetorrent.com/",
|
||||
manager: indexerManager,
|
||||
logger: logger,
|
||||
p: protectionService,
|
||||
client: webClient,
|
||||
configData: new ConfigurationDataBasicLogin()
|
||||
)
|
||||
{
|
||||
Encoding = Encoding.GetEncoding("UTF-8");
|
||||
Language = "fr-fr";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping (18, TorznabCatType.PC, "Applications: PC");
|
||||
AddCategoryMapping (19, TorznabCatType.PCMac, "Applications: Mac");
|
||||
AddCategoryMapping (54, TorznabCatType.PC, "Applications: linux");
|
||||
AddCategoryMapping (56, TorznabCatType.XXXOther, "Autres: ebook xxx");
|
||||
AddCategoryMapping (36, TorznabCatType.Books, "Autres: E-Books");
|
||||
AddCategoryMapping (37, TorznabCatType.Other, "Autres: Images");
|
||||
AddCategoryMapping (38, TorznabCatType.PCPhoneOther, "Autres: Telephone-mobile");
|
||||
AddCategoryMapping (47, TorznabCatType.Movies, "Films: Animé");
|
||||
AddCategoryMapping (1, TorznabCatType.MoviesDVD, "Films: DVD");
|
||||
AddCategoryMapping (2, TorznabCatType.MoviesSD, "Films: Dvdrip");
|
||||
AddCategoryMapping (68, TorznabCatType.Movies, "Films: TAT Releases");
|
||||
AddCategoryMapping (70, TorznabCatType.MoviesHD, "Films: UHD 4K");
|
||||
AddCategoryMapping (69, TorznabCatType.Movies, "Films: Retro");
|
||||
AddCategoryMapping (3, TorznabCatType.MoviesHD, "Films: HD1080");
|
||||
AddCategoryMapping (42, TorznabCatType.MoviesHD, "Films: HD720");
|
||||
AddCategoryMapping (4, TorznabCatType.Movies, "Films: Cam/Ts");
|
||||
AddCategoryMapping (22, TorznabCatType.MoviesBluRay, "Films: bluray");
|
||||
AddCategoryMapping (23, TorznabCatType.Movies3D, "Films: 3D");
|
||||
AddCategoryMapping (24, TorznabCatType.MoviesForeign, "Films: VOSTFR");
|
||||
AddCategoryMapping (25, TorznabCatType.XXX, "Films: Adulte");
|
||||
AddCategoryMapping (48, TorznabCatType.TVDocumentary, "Films: Documentaire");
|
||||
AddCategoryMapping (49, TorznabCatType.MoviesOther, "Films: Spectacle");
|
||||
AddCategoryMapping (51, TorznabCatType.MoviesSD, "Films: R5");
|
||||
AddCategoryMapping (52, TorznabCatType.MoviesSD, "Films: bdrip");
|
||||
AddCategoryMapping (53, TorznabCatType.MoviesSD, "Films: brrip");
|
||||
AddCategoryMapping (55, TorznabCatType.MoviesDVD, "Films: dvd-pack");
|
||||
AddCategoryMapping (57, TorznabCatType.Movies, "Films: manga");
|
||||
AddCategoryMapping (59, TorznabCatType.MoviesWEBDL, "Films: Webrip");
|
||||
AddCategoryMapping (63, TorznabCatType.MoviesSD, "Films: M-HD");
|
||||
AddCategoryMapping (10, TorznabCatType.PCGames, "Jeux: PC");
|
||||
AddCategoryMapping (11, TorznabCatType.ConsoleOther, "Jeux: PS2");
|
||||
AddCategoryMapping (43, TorznabCatType.ConsolePS3, "Jeux: PS3");
|
||||
AddCategoryMapping (12, TorznabCatType.ConsolePSP, "Jeux: PSP");
|
||||
AddCategoryMapping (14, TorznabCatType.ConsoleXbox360, "Jeux: Xbox360");
|
||||
AddCategoryMapping (44, TorznabCatType.ConsoleWii, "Jeux: Wii");
|
||||
AddCategoryMapping (45, TorznabCatType.ConsoleNDS, "Jeux: DS");
|
||||
AddCategoryMapping (71, TorznabCatType.AudioMP3, "Musique: TAT Music Release");
|
||||
AddCategoryMapping (26, TorznabCatType.AudioMP3, "Musique: Mp3");
|
||||
AddCategoryMapping (27, TorznabCatType.AudioVideo, "Musique: Clip Video");
|
||||
AddCategoryMapping (58, TorznabCatType.AudioLossless, "Musique: Flac");
|
||||
AddCategoryMapping (62, TorznabCatType.TVSD, "Serie tv: TV BDRip");
|
||||
AddCategoryMapping (5, TorznabCatType.TVSD, "Serie tv: Dvdrip");
|
||||
AddCategoryMapping (41, TorznabCatType.TVHD, "Serie tv: Hd");
|
||||
AddCategoryMapping (60, TorznabCatType.TVSD, "Serie tv: pack série tv");
|
||||
AddCategoryMapping (64, TorznabCatType.TVFOREIGN, "Serie tv: vostfr");
|
||||
AddCategoryMapping (65, TorznabCatType.TVHD, "Serie tv: Série tv 720P");
|
||||
AddCategoryMapping (66, TorznabCatType.TVHD, "Serie tv: Série tv 1080P");
|
||||
AddCategoryMapping (67, TorznabCatType.TVHD, "Serie tv: Série tv PackHD");
|
||||
AddCategoryMapping (73, TorznabCatType.TVAnime, "Serie tv: Anime ");
|
||||
AddCategoryMapping (72, TorznabCatType.TVSport, "Sport: sport");
|
||||
AddCategoryMapping (61, TorznabCatType.TVSD, "Tv: DVDRip");
|
||||
}
|
||||
|
||||
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
configData.LoadValuesFromJson(configJson);
|
||||
|
||||
var pairs = new Dictionary<string, string>
|
||||
{
|
||||
{ "username", configData.Username.Value },
|
||||
{ "password", configData.Password.Value }
|
||||
};
|
||||
|
||||
var result = await PostDataWithCookies(LoginUrl, pairs);
|
||||
|
||||
await ConfigureIfOK(result.Cookies, result.Cookies != null, () =>
|
||||
{
|
||||
var errorMessage = result.Content;
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchString = query.GetQueryString();
|
||||
|
||||
var queryCollection = new Dictionary<string, string>();
|
||||
queryCollection.Add ("search", searchString);
|
||||
queryCollection.Add ("cat", "0");
|
||||
queryCollection.Add("incldead", "0");
|
||||
queryCollection.Add("freeleech", "0");
|
||||
queryCollection.Add ("lang", "0");
|
||||
|
||||
var searchUrl = BrowseUrl + "?" + queryCollection.GetQueryString ();
|
||||
|
||||
var results = await RequestStringWithCookies (searchUrl);
|
||||
|
||||
try
|
||||
{
|
||||
var RowsSelector = "table.ttable_headinner tr.t-row";
|
||||
var SearchResultParser = new HtmlParser();
|
||||
var SearchResultDocument = SearchResultParser.Parse(results.Content);
|
||||
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
|
||||
var lastDate = DateTime.Now;
|
||||
|
||||
foreach (var Row in Rows)
|
||||
{
|
||||
var release = new ReleaseInfo();
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 0;
|
||||
|
||||
var category = Row.QuerySelector("td:nth-child(1) a");
|
||||
var title = Row.QuerySelector("td:nth-child(2) a b");
|
||||
|
||||
var link = Row.QuerySelector("td:nth-child(2) a");
|
||||
var Size = Row.QuerySelector("td:nth-child(5)");
|
||||
var Grabs = Row.QuerySelector("td:nth-child(8) font b");
|
||||
var Seeders = Row.QuerySelector("td:nth-child(6) font b");
|
||||
var Leechers = Row.QuerySelector("td:nth-child(7) font b");
|
||||
var categoryId = category.GetAttribute("href").Split('=').Last();
|
||||
var torrentId = link.GetAttribute ("href").Split ('&').First ().Split ('=').Last ();
|
||||
|
||||
release.Title = title.TextContent;
|
||||
release.Category = MapTrackerCatToNewznab(categoryId);
|
||||
release.Link = new Uri(DownloadUrl + "?id=" + torrentId);
|
||||
release.Guid = release.Link;
|
||||
release.Size = ReleaseInfo.GetBytes(Size.TextContent);
|
||||
release.Seeders = ParseUtil.CoerceInt(Seeders.TextContent);
|
||||
release.Peers = ParseUtil.CoerceInt(Leechers.TextContent) + release.Seeders;
|
||||
release.Grabs = ParseUtil.CoerceLong(Grabs.TextContent);
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -36,7 +36,7 @@ namespace Jackett.Indexers
|
||||
public BB(IIndexerManagerService i, Logger l, IWebClient w, IProtectionService ps)
|
||||
: base(name: "bB",
|
||||
description: "bB",
|
||||
link: "http://www.reddit.com/r/baconbits/",
|
||||
link: "https://baconbits.org/",
|
||||
caps: new TorznabCapabilities(),
|
||||
manager: i,
|
||||
client: w,
|
||||
|
@@ -105,7 +105,7 @@ namespace Jackett.Indexers
|
||||
return releases;
|
||||
}
|
||||
|
||||
public Uri UncleanLink(Uri link)
|
||||
public virtual Uri UncleanLink(Uri link)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(downloadUrlBase))
|
||||
{
|
||||
@@ -540,8 +540,8 @@ namespace Jackett.Indexers
|
||||
if (isLoggedin)
|
||||
{
|
||||
CookieHeader = cookies;
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -641,5 +641,25 @@ namespace Jackett.Indexers
|
||||
|
||||
return result.Distinct().ToList();
|
||||
}
|
||||
|
||||
public bool CanHandleQuery(TorznabQuery query)
|
||||
{
|
||||
var caps = TorznabCaps;
|
||||
if (!caps.SearchAvailable && query.IsSearch)
|
||||
return false;
|
||||
if (!caps.TVSearchAvailable && query.IsTVSearch)
|
||||
return false;
|
||||
if (!caps.MovieSearchAvailable && query.IsMovieSearch)
|
||||
return false;
|
||||
if (!caps.SupportsTVRageSearch && query.IsTVRageSearch)
|
||||
return false;
|
||||
if (!caps.SupportsImdbSearch && query.IsImdbQuery)
|
||||
return false;
|
||||
|
||||
if (query.HasSpecifiedCategories)
|
||||
if (!caps.SupportsCategories(query.Categories))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
34
src/Jackett/Indexers/BrokenStones.cs
Normal file
34
src/Jackett/Indexers/BrokenStones.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using Jackett.Models;
|
||||
using NLog;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils.Clients;
|
||||
using Jackett.Indexers.Abstract;
|
||||
|
||||
namespace Jackett.Indexers
|
||||
{
|
||||
public class BrokenStones : GazelleTracker, IIndexer
|
||||
{
|
||||
public BrokenStones(IIndexerManagerService indexerManager, IWebClient webClient, Logger logger, IProtectionService protectionService)
|
||||
: base(name: "BrokenStones",
|
||||
desc: null,
|
||||
link: "https://brokenstones.club/",
|
||||
indexerManager: indexerManager,
|
||||
logger: logger,
|
||||
protectionService: protectionService,
|
||||
webClient: webClient
|
||||
)
|
||||
{
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.PCMac, "MacOS Apps");
|
||||
AddCategoryMapping(2, TorznabCatType.PCMac, "MacOS Games");
|
||||
AddCategoryMapping(3, TorznabCatType.PCPhoneIOS, "iOS Apps");
|
||||
AddCategoryMapping(4, TorznabCatType.PCPhoneIOS, "iOS Games");
|
||||
AddCategoryMapping(5, TorznabCatType.Other, "Graphics");
|
||||
AddCategoryMapping(6, TorznabCatType.Audio, "Audio");
|
||||
AddCategoryMapping(7, TorznabCatType.Other, "Tutorials");
|
||||
AddCategoryMapping(8, TorznabCatType.Other, "Other");
|
||||
}
|
||||
}
|
||||
}
|
@@ -191,6 +191,7 @@ namespace Jackett.Indexers
|
||||
{
|
||||
public string Path { get; set; }
|
||||
public List<searchPathBlock> Paths { get; set; }
|
||||
public Dictionary<string, List<string>> Headers { get; set; }
|
||||
public List<filterBlock> Keywordsfilters { get; set; }
|
||||
public Dictionary<string, string> Inputs { get; set; }
|
||||
public List<errorBlock> Error { get; set; }
|
||||
@@ -915,8 +916,8 @@ namespace Jackett.Indexers
|
||||
await DoLogin();
|
||||
await TestLogin();
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
|
||||
@@ -1005,8 +1006,7 @@ namespace Jackett.Indexers
|
||||
Data = DateTimeUtil.FromTimeAgo(Data).ToString(DateTimeUtil.RFC1123ZPattern);
|
||||
break;
|
||||
case "fuzzytime":
|
||||
var timestr = (string)Filter.Args;
|
||||
Data = DateTimeUtil.FromUnknown(timestr).ToString(DateTimeUtil.RFC1123ZPattern);
|
||||
Data = DateTimeUtil.FromUnknown(Data).ToString(DateTimeUtil.RFC1123ZPattern);
|
||||
break;
|
||||
case "hexdump":
|
||||
// this is mainly for debugging invisible special char related issues
|
||||
@@ -1051,7 +1051,10 @@ namespace Jackett.Indexers
|
||||
|
||||
if (Selector.Selector != null)
|
||||
{
|
||||
selection = QuerySelector(Dom, Selector.Selector);
|
||||
if (Dom.Matches(Selector.Selector))
|
||||
selection = Dom;
|
||||
else
|
||||
selection = QuerySelector(Dom, Selector.Selector);
|
||||
if (selection == null)
|
||||
{
|
||||
throw new Exception(string.Format("Selector \"{0}\" didn't match {1}", Selector.Selector, Dom.ToHtmlPretty()));
|
||||
@@ -1215,10 +1218,18 @@ namespace Jackett.Indexers
|
||||
|
||||
// send HTTP request
|
||||
WebClientStringResult response = null;
|
||||
Dictionary<string, string> headers = null;
|
||||
if (Search.Headers != null)
|
||||
{
|
||||
// FIXME: fix jackett header handling (allow it to specifiy the same header multipe times)
|
||||
headers = new Dictionary<string, string>();
|
||||
foreach (var header in Search.Headers)
|
||||
headers.Add(header.Key, header.Value[0]);
|
||||
}
|
||||
if (method == RequestType.POST)
|
||||
response = await PostDataWithCookies(searchUrl, queryCollection);
|
||||
response = await PostDataWithCookies(searchUrl, queryCollection, null, null, headers);
|
||||
else
|
||||
response = await RequestStringWithCookies(searchUrl);
|
||||
response = await RequestStringWithCookies(searchUrl, null, null, headers);
|
||||
var results = response.Content;
|
||||
try
|
||||
{
|
||||
@@ -1485,18 +1496,32 @@ namespace Jackett.Indexers
|
||||
{
|
||||
var PrevRow = Row.PreviousElementSibling;
|
||||
string value = null;
|
||||
if (PrevRow == null) // continue with parent
|
||||
{
|
||||
var Parent = Row.ParentElement;
|
||||
if (Parent != null)
|
||||
PrevRow = Parent.PreviousElementSibling;
|
||||
}
|
||||
while (PrevRow != null)
|
||||
{
|
||||
var CurRow = PrevRow;
|
||||
logger.Info(PrevRow.OuterHtml);
|
||||
try
|
||||
{
|
||||
value = handleSelector(DateHeaders, PrevRow);
|
||||
value = handleSelector(DateHeaders, CurRow);
|
||||
break;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
PrevRow = PrevRow.PreviousElementSibling;
|
||||
PrevRow = CurRow.PreviousElementSibling;
|
||||
if (PrevRow == null) // continue with parent
|
||||
{
|
||||
var Parent = CurRow.ParentElement;
|
||||
if (Parent != null)
|
||||
PrevRow = Parent.PreviousElementSibling;
|
||||
}
|
||||
}
|
||||
|
||||
if (value == null && DateHeaders.Optional == false)
|
||||
|
@@ -123,8 +123,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@@ -125,8 +125,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@@ -128,8 +128,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@@ -45,5 +45,7 @@ namespace Jackett.Indexers
|
||||
|
||||
IEnumerable<ReleaseInfo> CleanLinks(IEnumerable<ReleaseInfo> releases);
|
||||
Uri UncleanLink(Uri link);
|
||||
|
||||
bool CanHandleQuery(TorznabQuery query);
|
||||
}
|
||||
}
|
||||
|
@@ -169,8 +169,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
85
src/Jackett/Indexers/Meta/BaseMetaIndexer.cs
Normal file
85
src/Jackett/Indexers/Meta/BaseMetaIndexer.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Models;
|
||||
using Jackett.Models.IndexerConfig;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Indexers.Meta
|
||||
{
|
||||
public abstract class BaseMetaIndexer : BaseIndexer, IIndexer
|
||||
{
|
||||
protected BaseMetaIndexer(string name, string description, IIndexerManagerService manager, Logger logger, ConfigurationData configData, IProtectionService p, Func<IIndexer, bool> filter)
|
||||
: base(name, "http://127.0.0.1/", description, manager, null, logger, configData, p, null, null)
|
||||
{
|
||||
filterFunc = filter;
|
||||
}
|
||||
|
||||
public Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
return Task.FromResult(IndexerConfigurationStatus.Completed);
|
||||
}
|
||||
|
||||
public virtual async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var tasks = Indexers.Where(i => i.CanHandleQuery(query)).Select(i => i.PerformQuery(query)).ToList(); // explicit conversion to List to execute LINQ query
|
||||
var aggregateTask = Task.WhenAll<IEnumerable<ReleaseInfo>>(tasks);
|
||||
await aggregateTask;
|
||||
if (aggregateTask.Exception != null)
|
||||
logger.Error(aggregateTask.Exception, "Error during request in metaindexer " + ID);
|
||||
|
||||
IEnumerable<ReleaseInfo> result = tasks.Where(x => x.Status == TaskStatus.RanToCompletion).SelectMany(x => x.Result).OrderByDescending(r => r.PublishDate); // Ordering by the number of seeders might be useful as well.
|
||||
// Limiting the response size might be interesting for use-cases where there are
|
||||
// tons of trackers configured in Jackett. For now just use the limit param if
|
||||
// someone wants to do that.
|
||||
if (query.Limit > 0)
|
||||
result = result.Take(query.Limit);
|
||||
return result;
|
||||
}
|
||||
|
||||
public override Uri UncleanLink(Uri link)
|
||||
{
|
||||
var indexer = GetOriginalIndexerForLink(link);
|
||||
if (indexer != null)
|
||||
return indexer.UncleanLink(link);
|
||||
|
||||
return base.UncleanLink(link);
|
||||
}
|
||||
|
||||
public override Task<byte[]> Download(Uri link)
|
||||
{
|
||||
var indexer = GetOriginalIndexerForLink(link);
|
||||
if (indexer != null)
|
||||
return indexer.Download(link);
|
||||
|
||||
return base.Download(link);
|
||||
}
|
||||
|
||||
private IIndexer GetOriginalIndexerForLink(Uri link)
|
||||
{
|
||||
var prefix = string.Format("{0}://{1}", link.Scheme, link.Host);
|
||||
var validIndexers = Indexers.Where(i => i.SiteLink.StartsWith(prefix, StringComparison.CurrentCulture));
|
||||
if (validIndexers.Count() > 0)
|
||||
return validIndexers.First();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private Func<IIndexer, bool> filterFunc;
|
||||
private IEnumerable<IIndexer> indexers;
|
||||
public IEnumerable<IIndexer> Indexers {
|
||||
get {
|
||||
return indexers;
|
||||
}
|
||||
set {
|
||||
indexers = value.Where(i => i.IsConfigured && filterFunc(i));
|
||||
TorznabCaps = value.Select(i => i.TorznabCaps).Aggregate(new TorznabCapabilities(), TorznabCapabilities.Concat); ;
|
||||
IsConfigured = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
src/Jackett/Indexers/Meta/MetaIndexers.cs
Normal file
21
src/Jackett/Indexers/Meta/MetaIndexers.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Models;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils.Clients;
|
||||
using NLog;
|
||||
|
||||
namespace Jackett.Indexers.Meta
|
||||
{
|
||||
class AggregateIndexer : BaseMetaIndexer, IIndexer
|
||||
{
|
||||
public AggregateIndexer(IIndexerManagerService i, Logger l, IProtectionService ps)
|
||||
: base("AggregateSearch", "This feed includes all configured trackers", i, l, new Models.IndexerConfig.ConfigurationData(), ps, x => true)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@@ -74,8 +74,9 @@ namespace Jackett.Indexers
|
||||
var isTv = TorznabCatType.QueryContainsParentCategory(query.Categories, new List<int> { TorznabCatType.TV.ID });
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchQuery = query.GetQueryString();
|
||||
var searchQuerySingleEpisodes = Regex.Replace(searchQuery, @"(S\d{2})$", "$1*"); // If we're just seaching for a season (no episode) append an * to include all episodes of that season.
|
||||
|
||||
await GetReleases(releases, query, searchQuery);
|
||||
await GetReleases(releases, query, searchQuerySingleEpisodes);
|
||||
|
||||
// Search for torrent groups
|
||||
if (isTv)
|
||||
|
@@ -157,6 +157,8 @@ namespace Jackett.Indexers
|
||||
{
|
||||
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;
|
||||
@@ -170,7 +172,7 @@ namespace Jackett.Indexers
|
||||
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);
|
||||
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());
|
||||
|
@@ -148,7 +148,7 @@ namespace Jackett.Indexers
|
||||
release.Size = long.Parse((string)torrent["Size"]);
|
||||
release.Grabs = long.Parse((string)torrent["Snatched"]);
|
||||
release.Seeders = int.Parse((string)torrent["Seeders"]);
|
||||
release.Peers = int.Parse((string)torrent["Leechers"]);
|
||||
release.Peers = release.Seeders + int.Parse((string)torrent["Leechers"]);
|
||||
release.PublishDate = DateTime.ParseExact((string)torrent["UploadTime"], "yyyy-MM-dd HH:mm:ss",
|
||||
CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime();
|
||||
release.Link = new Uri(string.Format("{0}?action=download&id={1}&authkey={2}&torrent_pass={3}",
|
||||
|
@@ -30,7 +30,7 @@ namespace Jackett.Indexers
|
||||
public SceneFZ(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "SceneFZ",
|
||||
description: "Torrent tracker. Tracking over 50.000 torrent files.",
|
||||
link: "http://scenefz.net/",
|
||||
link: "http://scenefz.me/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
manager: i,
|
||||
client: wc,
|
||||
|
@@ -128,8 +128,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@@ -17,7 +17,7 @@ namespace Jackett.Indexers
|
||||
{
|
||||
public class ShowRSS : BaseIndexer, IIndexer
|
||||
{
|
||||
private string SearchAllUrl { get { return SiteLink + "feeds/all.rss"; } }
|
||||
private string SearchAllUrl { get { return SiteLink + "other/all.rss"; } }
|
||||
|
||||
new ConfigurationData configData
|
||||
{
|
||||
@@ -79,7 +79,7 @@ namespace Jackett.Indexers
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
|
||||
serie_title = node.SelectSingleNode(".//*[local-name()='rawtitle']").InnerText;
|
||||
serie_title = node.SelectSingleNode(".//*[local-name()='raw_title']").InnerText;
|
||||
release.Title = serie_title;
|
||||
|
||||
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
|
||||
|
@@ -109,10 +109,9 @@ namespace Jackett.Indexers
|
||||
queryCollection.Add("swesub", "false");
|
||||
queryCollection.Add("watchview", "false");
|
||||
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
queryCollection.Add("categories[]", cat);
|
||||
|
||||
searchUrl += "?" + queryCollection.GetQueryString();
|
||||
foreach (var cat in MapTorznabCapsToTrackers(query))
|
||||
searchUrl += "&categories[]=" + cat;
|
||||
var results = await RequestStringWithCookies(searchUrl, null, SiteLink);
|
||||
|
||||
try
|
||||
|
@@ -17,7 +17,7 @@ namespace Jackett.Indexers
|
||||
{
|
||||
public class T411 : BaseIndexer, IIndexer
|
||||
{
|
||||
const string ApiUrl = "https://api.t411.ai";
|
||||
const string ApiUrl = "https://api.t411.al";
|
||||
const string AuthUrl = ApiUrl + "/auth";
|
||||
const string SearchUrl = ApiUrl + "/torrents/search/";
|
||||
const string TermsUrl = ApiUrl + "/terms/tree";
|
||||
@@ -35,7 +35,7 @@ namespace Jackett.Indexers
|
||||
public T411(IIndexerManagerService i, Logger l, IWebClient wc, IProtectionService ps)
|
||||
: base(name: "T411",
|
||||
description: "French Torrent Tracker",
|
||||
link: "https://t411.ai/",
|
||||
link: "https://t411.al/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
manager: i,
|
||||
client: wc,
|
||||
|
@@ -142,8 +142,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@@ -28,9 +28,9 @@ namespace Jackett.Indexers
|
||||
}
|
||||
|
||||
public TransmitheNet(IIndexerManagerService i, Logger l, IWebClient c, IProtectionService ps)
|
||||
: base(name: "TransmitTheNet",
|
||||
description: " At Transmithe.net we will change the way you think about TV",
|
||||
link: "https://transmithe.net/",
|
||||
: base(name: "Nebulance",
|
||||
description: " At Nebulance we will change the way you think about TV",
|
||||
link: "https://nebulance.io/",
|
||||
caps: TorznabUtil.CreateDefaultTorznabTVCaps(),
|
||||
manager: i,
|
||||
client: c,
|
||||
|
217
src/Jackett/Indexers/Trezzor.cs
Normal file
217
src/Jackett/Indexers/Trezzor.cs
Normal file
@@ -0,0 +1,217 @@
|
||||
using CsQuery;
|
||||
using Jackett.Models;
|
||||
using Jackett.Services;
|
||||
using Jackett.Utils;
|
||||
using Jackett.Utils.Clients;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using Jackett.Models.IndexerConfig;
|
||||
|
||||
namespace Jackett.Indexers
|
||||
{
|
||||
public class Trezzor : BaseIndexer, IIndexer
|
||||
{
|
||||
string LoginUrl { get { return SiteLink + "prihlasenie.php"; } }
|
||||
private string SearchUrl { get { return SiteLink + "torrents.php?"; } }
|
||||
|
||||
|
||||
new ConfigurationDataBasicLogin configData
|
||||
{
|
||||
get { return (ConfigurationDataBasicLogin)base.configData; }
|
||||
set { base.configData = value; }
|
||||
}
|
||||
|
||||
public Trezzor(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps)
|
||||
: base(name: "Trezzor",
|
||||
description: "SK/CZ Tracker.",
|
||||
link: "https://tracker.czech-server.com/",
|
||||
caps: new TorznabCapabilities(),
|
||||
manager: i,
|
||||
client: wc,
|
||||
logger: l,
|
||||
p: ps,
|
||||
configData: new ConfigurationDataBasicLogin())
|
||||
{
|
||||
Encoding = Encoding.GetEncoding("windows-1250");
|
||||
Language = "cs-cz";
|
||||
Type = "private";
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.MoviesDVD, "DVD CZ/SK dabing");
|
||||
AddCategoryMapping(2, TorznabCatType.MoviesDVD, "DVD CZ/SK titulky");
|
||||
AddCategoryMapping(3, TorznabCatType.AudioVideo, "DVD Hudební video");
|
||||
AddCategoryMapping(4, TorznabCatType.MoviesSD, "XviD, DivX CZ/SK dabing");
|
||||
AddCategoryMapping(13, TorznabCatType.Audio, "Hudba CZ/SK scéna");
|
||||
AddCategoryMapping(24, TorznabCatType.Audio, "Mluv. slovo CZ/SK dabing");
|
||||
AddCategoryMapping(10, TorznabCatType.AudioOther, "DTS audio");
|
||||
AddCategoryMapping(14, TorznabCatType.PCGames, "Hry");
|
||||
AddCategoryMapping(17, TorznabCatType.PC, "Programy");
|
||||
AddCategoryMapping(14, TorznabCatType.PC, "Cestiny,patche,upgrady");
|
||||
AddCategoryMapping(18, TorznabCatType.Books, "Knihy CZ/SK lokalizace");
|
||||
AddCategoryMapping(18, TorznabCatType.BooksComics, "Komiks CZ/SK lokalizace");
|
||||
AddCategoryMapping(16, TorznabCatType.Other, "Foto,obrázky");
|
||||
AddCategoryMapping(20, TorznabCatType.Console, "Konzole");
|
||||
AddCategoryMapping(21, TorznabCatType.PCPhoneOther, "Mobilmánia");
|
||||
AddCategoryMapping(22, TorznabCatType.Other, "Ostatní CZ/SK scéna");
|
||||
AddCategoryMapping(23, TorznabCatType.Other, "Na prani non CZ/SK");
|
||||
AddCategoryMapping(27, TorznabCatType.Other, "TreZzoR rls");
|
||||
AddCategoryMapping(35, TorznabCatType.AudioVideo, "HDTV Hudební video");
|
||||
AddCategoryMapping(36, TorznabCatType.MoviesSD, "XviD, DivX CZ/SK titulky");
|
||||
AddCategoryMapping(31, TorznabCatType.MoviesHD, "HDTV CZ/SK Dabing");
|
||||
AddCategoryMapping(33, TorznabCatType.MoviesHD, "HDTV CZ/SK Titulky");
|
||||
AddCategoryMapping(39, TorznabCatType.Movies3D, "3D HDTV CZ/SK Dabing");
|
||||
AddCategoryMapping(40, TorznabCatType.Movies3D, "3D HDTV CZ/SK Titulky");
|
||||
AddCategoryMapping(5, TorznabCatType.MoviesSD, "TV-rip CZ/SK dabing");
|
||||
|
||||
AddCategoryMapping(41, TorznabCatType.TVHD, "HD Seriály CZ/SK dabing");
|
||||
AddCategoryMapping(42, TorznabCatType.TVHD, "HD Seriály CZ/SK titulky");
|
||||
AddCategoryMapping(7, TorznabCatType.TVSD, "Seriály CZ/SK dabing");
|
||||
AddCategoryMapping(37, TorznabCatType.TVSD, "Seriály CZ/SK titulky");
|
||||
|
||||
AddCategoryMapping(9, TorznabCatType.XXXXviD, "XXX CZ/SK dabing");
|
||||
AddCategoryMapping(32, TorznabCatType.XXXx264, "XXX HD CZ/SK dabing");
|
||||
AddCategoryMapping(27, TorznabCatType.Other, "TreZzoR rls");
|
||||
|
||||
}
|
||||
|
||||
public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
|
||||
{
|
||||
LoadValuesFromJson(configJson);
|
||||
|
||||
var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty);
|
||||
|
||||
var pairs = new Dictionary<string, string> {
|
||||
{ "uid", configData.Username.Value },
|
||||
{ "pwd", configData.Password.Value }
|
||||
};
|
||||
|
||||
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null, LoginUrl);
|
||||
|
||||
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("If your browser doesn't have javascript enabled"), () =>
|
||||
{
|
||||
var errorMessage = "Couldn't login";
|
||||
throw new ExceptionWithConfigData(errorMessage, configData);
|
||||
});
|
||||
return IndexerConfigurationStatus.RequiresTesting;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var searchurls = new List<string>();
|
||||
var searchUrl = SearchUrl;
|
||||
var queryCollection = new NameValueCollection();
|
||||
var searchString = query.GetQueryString();
|
||||
|
||||
|
||||
// assign category only if one cat is required, otherwise search in whole tracker (tracker has ability to search only in one category or in everything)
|
||||
var _cats = MapTorznabCapsToTrackers(query);
|
||||
if (_cats.Count == 1) searchUrl += "category=" + _cats.First() + "&";
|
||||
|
||||
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
queryCollection.Add("search", searchString);
|
||||
}
|
||||
|
||||
|
||||
|
||||
queryCollection.Add("active", "1");
|
||||
|
||||
searchUrl += queryCollection.GetQueryString().Replace("(", "%28").Replace(")", "%29"); // maually url encode brackets to prevent "hacking" detection
|
||||
|
||||
|
||||
var results = await RequestStringWithCookiesAndRetry(searchUrl);
|
||||
|
||||
// Check for being logged out
|
||||
if (results.IsRedirect)
|
||||
if (results.RedirectingTo.Contains("prihlasenie.php"))
|
||||
throw new ExceptionWithConfigData("Login failed, please reconfigure the tracker to update the cookies", configData);
|
||||
else
|
||||
throw new ExceptionWithConfigData(string.Format("Got a redirect to {0}, please adjust your the alternative link", results.RedirectingTo), configData);
|
||||
|
||||
if (results.Content.Contains("prihlasenie.php")) throw new ExceptionWithConfigData("Login failed, please reconfigure the tracker to update the cookies", configData);
|
||||
|
||||
try
|
||||
{
|
||||
CQ dom = results.Content;
|
||||
ReleaseInfo release;
|
||||
|
||||
var rows = dom[".torrenty_lista"];
|
||||
foreach (var row in rows)
|
||||
{
|
||||
CQ qRow = row.Cq();
|
||||
|
||||
release = new ReleaseInfo();
|
||||
|
||||
string _cat = qRow.Find("td").Get(0).FirstChild.GetAttribute("href");
|
||||
string _catName = qRow.Find("td a img").Get(0).GetAttribute("alt");
|
||||
int _from = _cat.IndexOf("=");
|
||||
_cat = _cat.Substring(_from + 1);
|
||||
|
||||
// filter results from categories, that were not requested
|
||||
if ((_cats.Count > 1) && (!_cats.Contains(_cat))) continue;
|
||||
release.Category = MapTrackerCatToNewznab(_cat);
|
||||
|
||||
string _guid = qRow.Find("td").Get(1).FirstChild.GetAttribute("href");
|
||||
release.Guid = new Uri(SiteLink + _guid);
|
||||
|
||||
string _title = qRow.Find("td").Get(1).FirstChild.InnerText;
|
||||
release.Title = _title + " [" + _catName + "]";
|
||||
|
||||
string _commentsLink = qRow.Find("td").Get(2).FirstChild.GetAttribute("href");
|
||||
release.Comments = new Uri(SiteLink + _guid);
|
||||
|
||||
string _downloadLink = qRow.Find("td").Get(3).FirstChild.GetAttribute("href");
|
||||
release.Link = new Uri(SiteLink + _downloadLink);
|
||||
|
||||
string _publishDate = qRow.Find("td").Get(5).InnerText;
|
||||
DateTime _parsed;
|
||||
DateTime.TryParse(_publishDate, out _parsed);
|
||||
release.PublishDate = _parsed;
|
||||
|
||||
string _size = qRow.Find("td").Get(6).InnerText;
|
||||
release.Size = ReleaseInfo.GetBytes(_size);
|
||||
|
||||
string _seeds = qRow.Find("td").Get(7).FirstChild.InnerText;
|
||||
string _leechs = qRow.Find("td").Get(8).FirstChild.InnerText;
|
||||
int seeders, peers;
|
||||
if (ParseUtil.TryCoerceInt(_seeds, out seeders))
|
||||
{
|
||||
release.Seeders = seeders;
|
||||
if (ParseUtil.TryCoerceInt(_leechs, out peers))
|
||||
{
|
||||
release.Peers = peers + release.Seeders;
|
||||
}
|
||||
}
|
||||
|
||||
release.MinimumRatio = 1;
|
||||
release.MinimumSeedTime = 172800;
|
||||
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
if (release.Title.Contains("FREELEECH")) release.DownloadVolumeFactor = 0;
|
||||
else release.DownloadVolumeFactor = 1;
|
||||
|
||||
releases.Add(release);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnParseError(results.Content, ex);
|
||||
}
|
||||
|
||||
return releases;
|
||||
}
|
||||
}
|
||||
}
|
@@ -305,7 +305,8 @@ namespace Jackett.Indexers
|
||||
// Loop on Categories needed
|
||||
if (categoriesList.Count > 0)
|
||||
{
|
||||
parameters.Add("category", string.Join("+", categoriesList));
|
||||
// ignore categories for now, something changed or is buggy, needs investigation
|
||||
//parameters.Add("category", string.Join("+", categoriesList));
|
||||
}
|
||||
|
||||
// If Only Freeleech Enabled
|
||||
|
@@ -89,8 +89,8 @@ namespace Jackett.Indexers
|
||||
throw new Exception("Your cookie did not work");
|
||||
}
|
||||
|
||||
SaveConfig();
|
||||
IsConfigured = true;
|
||||
SaveConfig();
|
||||
return IndexerConfigurationStatus.Completed;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -98,9 +98,8 @@ namespace Jackett
|
||||
}
|
||||
|
||||
// Register indexers
|
||||
foreach (var indexer in thisAssembly.GetTypes()
|
||||
.Where(p => typeof(IIndexer).IsAssignableFrom(p) && !p.IsInterface)
|
||||
.ToArray())
|
||||
var indexerTypes = thisAssembly.GetTypes().Where(p => typeof (IIndexer).IsAssignableFrom (p) && !p.IsInterface && !p.IsInNamespace("Jackett.Indexers.Meta"));
|
||||
foreach (var indexer in indexerTypes)
|
||||
{
|
||||
builder.RegisterType(indexer).Named<IIndexer>(BaseIndexer.GetIndexerID(indexer));
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ namespace Jackett.Models.IndexerConfig.Bespoke
|
||||
{
|
||||
IncludeRaw = new BoolItem() { Name = "IncludeRaw", Value = false };
|
||||
DateWarning = new DisplayItem("This tracker does not supply upload dates so they are based off year of release.") { Name = "DateWarning" };
|
||||
InsertSeason = new BoolItem() { Name = "Prefix episode number with S01 for Sonarr Compatability", Value = false };
|
||||
InsertSeason = new BoolItem() { Name = "Prefix episode number with E0 for Sonarr Compatability", Value = false };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -66,6 +66,11 @@ namespace Jackett.Models
|
||||
}
|
||||
}
|
||||
|
||||
public bool SupportsCategories (int[] categories)
|
||||
{
|
||||
return Categories.Count(i => categories.Any(c => c == i.ID)) > 0;
|
||||
}
|
||||
|
||||
public JArray CapsToJson()
|
||||
{
|
||||
var jArray = new JArray();
|
||||
@@ -112,5 +117,16 @@ namespace Jackett.Models
|
||||
|
||||
return xdoc.Declaration.ToString() + Environment.NewLine + xdoc.ToString();
|
||||
}
|
||||
public static TorznabCapabilities Concat (TorznabCapabilities lhs, TorznabCapabilities rhs)
|
||||
{
|
||||
lhs.SearchAvailable = lhs.SearchAvailable || rhs.SearchAvailable;
|
||||
lhs.TVSearchAvailable = lhs.TVSearchAvailable || rhs.TVSearchAvailable;
|
||||
lhs.MovieSearchAvailable = lhs.MovieSearchAvailable || rhs.MovieSearchAvailable;
|
||||
lhs.SupportsTVRageSearch = lhs.SupportsTVRageSearch || rhs.SupportsTVRageSearch;
|
||||
lhs.SupportsImdbSearch = lhs.SupportsImdbSearch || rhs.SupportsImdbSearch;
|
||||
lhs.Categories.AddRange (rhs.Categories.Except (lhs.Categories));
|
||||
|
||||
return lhs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -31,6 +31,54 @@ namespace Jackett.Models
|
||||
|
||||
protected string[] QueryStringParts = null;
|
||||
|
||||
public bool IsSearch
|
||||
{
|
||||
get
|
||||
{
|
||||
return (QueryStringParts != null && QueryStringParts.Length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsTVSearch
|
||||
{
|
||||
get
|
||||
{
|
||||
return QueryType == "tvsearch";
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMovieSearch
|
||||
{
|
||||
get
|
||||
{
|
||||
return QueryType == "movie";
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsTVRageSearch
|
||||
{
|
||||
get
|
||||
{
|
||||
return RageID != null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsImdbQuery
|
||||
{
|
||||
get
|
||||
{
|
||||
return ImdbID != null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasSpecifiedCategories
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Categories != null && Categories.Length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
public string SanitizedSearchTerm
|
||||
{
|
||||
get
|
||||
|
@@ -11,6 +11,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Jackett.Indexers.Meta;
|
||||
|
||||
namespace Jackett.Services
|
||||
{
|
||||
@@ -23,6 +24,7 @@ namespace Jackett.Services
|
||||
void SaveConfig(IIndexer indexer, JToken obj);
|
||||
void InitIndexers();
|
||||
void InitCardigannIndexers(string path);
|
||||
void InitAggregateIndexer();
|
||||
void SortIndexers();
|
||||
}
|
||||
|
||||
@@ -35,6 +37,7 @@ namespace Jackett.Services
|
||||
private Logger logger;
|
||||
private Dictionary<string, IIndexer> indexers = new Dictionary<string, IIndexer>();
|
||||
private ICacheService cacheService;
|
||||
private AggregateIndexer aggregateIndexer;
|
||||
|
||||
public IndexerManagerService(IContainer c, IConfigurationService config, Logger l, ICacheService cache)
|
||||
{
|
||||
@@ -86,7 +89,7 @@ namespace Jackett.Services
|
||||
{
|
||||
logger.Info("Using HTTP Client: " + container.Resolve<IWebClient>().GetType().Name);
|
||||
|
||||
foreach (var idx in container.Resolve<IEnumerable<IIndexer>>().Where(p => p.ID != "cardigannindexer").OrderBy(_ => _.DisplayName))
|
||||
foreach (var idx in container.Resolve<IEnumerable<IIndexer>>().Where(p => p.ID != "cardigannindexer" && p.ID != "aggregateindexer").OrderBy(_ => _.DisplayName))
|
||||
{
|
||||
indexers.Add(idx.ID, idx);
|
||||
LoadIndexerConfig(idx);
|
||||
@@ -126,12 +129,24 @@ namespace Jackett.Services
|
||||
}
|
||||
}
|
||||
|
||||
public void InitAggregateIndexer()
|
||||
{
|
||||
logger.Info("Adding aggregate indexer");
|
||||
AggregateIndexer aggregateIndexer = new AggregateIndexer(this, logger, container.Resolve<IProtectionService>());
|
||||
this.aggregateIndexer = aggregateIndexer;
|
||||
UpdateAggregateIndexer();
|
||||
}
|
||||
|
||||
public IIndexer GetIndexer(string name)
|
||||
{
|
||||
if (indexers.ContainsKey(name))
|
||||
{
|
||||
return indexers[name];
|
||||
}
|
||||
else if (name == "all")
|
||||
{
|
||||
return aggregateIndexer;
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Error("Request for unknown indexer: " + name);
|
||||
@@ -170,6 +185,7 @@ namespace Jackett.Services
|
||||
{
|
||||
indexers[name] = container.ResolveNamed<IIndexer>(indexer.ID);
|
||||
}
|
||||
UpdateAggregateIndexer();
|
||||
}
|
||||
|
||||
private string GetIndexerConfigFilePath(IIndexer indexer)
|
||||
@@ -179,6 +195,7 @@ namespace Jackett.Services
|
||||
|
||||
public void SaveConfig(IIndexer indexer, JToken obj)
|
||||
{
|
||||
UpdateAggregateIndexer();
|
||||
lock (configWriteLock)
|
||||
{
|
||||
var uID = Guid.NewGuid().ToString("N");
|
||||
@@ -247,5 +264,10 @@ namespace Jackett.Services
|
||||
newIndexers.Add(indexer.Key, indexer.Value);
|
||||
indexers = newIndexers;
|
||||
}
|
||||
|
||||
private void UpdateAggregateIndexer()
|
||||
{
|
||||
aggregateIndexer.Indexers = indexers.Where(p => p.Value.IsConfigured).Select(p => p.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -287,6 +287,7 @@ namespace Jackett.Services
|
||||
{
|
||||
indexerService.InitCardigannIndexers(dir);
|
||||
}
|
||||
indexerService.InitAggregateIndexer();
|
||||
indexerService.SortIndexers();
|
||||
client.Init();
|
||||
updater.CleanupTempDir();
|
||||
|
Reference in New Issue
Block a user