Compare commits

...

89 Commits

Author SHA1 Message Date
Garfield69
c33f0594bd divteam: switch to cookie login. resolves #5282 #5281 2019-05-17 08:40:27 +12:00
flightlevel
a4ee8fee8d Pull .NET Core 2.2.5 on Appveyor
#5179
2019-05-16 19:12:45 +10:00
Garfield69
a12f573e80 generationfree: add multi replacement option. #5279 2019-05-16 20:12:18 +12:00
Garfield69
ea14a5a194 mejortorrent: new domain 2019-05-16 12:55:23 +12:00
Garfield69
b9f9c10baf asiancinema: now using download_check. 2019-05-16 12:25:29 +12:00
Garfield69
e049376381 add generation-free a Private French site. resolves #5279 2019-05-16 11:13:06 +12:00
Garfield69
e89312b52f cartoonchaos: add note that only default style is supported. resolves #5274 2019-05-16 07:43:02 +12:00
Garfield69
4f758ee8cc add teamhd a Russian private site. resolves #4397 2019-05-15 16:42:34 +12:00
Garfield69
2f8aa41fe0 add siambit, a Thai Private site. resolves #5243 2019-05-15 12:47:32 +12:00
flightlevel
8425926636 Remove macOS mono script from build 2019-05-14 19:53:04 +10:00
flightlevel
3e0f25c51b Remove macOS Mono script
No reason to run the Mono version of macOS now with the standalone version of Jackett available
2019-05-13 21:07:21 +10:00
flightlevel
c52199f7ca Remove Mono directory from standalone script 2019-05-13 21:06:17 +10:00
flightlevel
bede5241c8 Updater: Use client garbage collection 2019-05-13 21:04:58 +10:00
flightlevel
9cb9b859a8 Global exception catcher 2019-05-13 21:03:32 +10:00
Garfield69
47580ec726 nethd: changes for new layout 2019-05-12 11:05:27 +12:00
Garfield69
8e9290c501 torrent9: new download link. resolves #5250 2019-05-12 10:29:44 +12:00
Garfield69
3ddd35d54b torrent9clone: new domain wvw. 2019-05-12 09:18:32 +12:00
Garfield69
6529b1fe38 gktorrent: new domain .biz 2019-05-12 09:14:46 +12:00
Garfield69
a58ba9e329 removed freedomhd, closed. #750 2019-05-12 09:10:41 +12:00
Garfield69
ca7def79d2 casatorrent: site is forcing https now. 2019-05-12 08:52:32 +12:00
Garfield69
c50a29a8e9 beyound-hd: latest batch of layout changes #5218
plus qty=100 is back now it does not cause internal server 500 errors on the site.
2019-05-11 18:58:30 +12:00
flightlevel
f86e8dd5b6 Limit IMDB searches to movies
#5124
2019-05-11 13:27:25 +10:00
flightlevel
3530fa8244 Added extra updater logging
#5208
2019-05-11 13:04:07 +10:00
Garfield69
6f65992bb5 torrentseeds: handle when title has no mouseover. #5244 2019-05-11 09:47:15 +12:00
Garfield69
f1c83273f2 add efectodoppler a Spanish Private Music site. resolves #5222 2019-05-10 21:44:05 +12:00
Peter Zsak
fdff9e4406 insanetracker: rewritten for the new UI 2.0 (#5236) 2019-05-10 10:36:15 +12:00
Garfield69
b8be09a203 beyond-hd: drop poster requirement 2019-05-10 07:21:31 +12:00
Garfield69
aa26654be9 beyond-hd: add info about show-posters web setting. 2019-05-09 21:19:39 +12:00
Garfield69
20e21cfc8a beyond-hd: corrections to selectors
qty > 25 causes server errors
tvdb and mal not supported
sort -> sorting
filtertorrents -> torrents
language=english only
2019-05-09 13:11:02 +12:00
Zotan
068cbcd36b beyond-hd: Update UNIT3D (#5221) 2019-05-09 11:45:34 +12:00
Garfield69
acb649499b nnm-club: drop expired certificates 2019-05-07 15:50:00 +12:00
Garfield69
8c47f03a55 nyaasi: drop expired certificate 2019-05-07 15:45:22 +12:00
Garfield69
f63fe9918b ilcorsaroblu: drop expired certificate 2019-05-07 15:43:46 +12:00
Garfield69
c1389c76f3 frozenlayer: drop expired certificate 2019-05-07 15:41:18 +12:00
Garfield69
253f9ad6bb trancetraffic: drop expired certificate 2019-05-07 15:39:39 +12:00
Garfield69
ab63e03e3b ilcorsaronero: drop expired certificates 2019-05-07 15:30:32 +12:00
Garfield69
46c6039144 psytorrents: drop expired certificate 2019-05-07 15:28:14 +12:00
Garfield69
b619360bf1 elitetracker: drop expired certificate 2019-05-07 15:25:03 +12:00
Garfield69
ae316ffc1b icetorrent: drop title attribute: #5201 2019-05-07 08:23:16 +12:00
flightlevel
e051c13f3a Package update 2019-05-06 19:41:16 +10:00
Garfield69
88f290d558 yggtorrent: new domain .ch #5187 2019-05-06 09:19:00 +12:00
Garfield69
d6f15940b3 abnormal: add replace-multi option. #3847 2019-05-06 09:13:10 +12:00
Garfield69
e702160c10 filelist: searchin=1 sort=2 resolves #5190 2019-05-06 07:37:49 +12:00
Garfield69
f90ba08b2d xbytes2: oops fix music cat. 2019-05-06 07:29:17 +12:00
Garfield69
a05b64a097 xbytes2: more cat refinements
plus add movie and tv search modes
2019-05-06 07:26:53 +12:00
Roman Smirnov
ce806a7678 kinozal: add Kravec replacement (#5184) 2019-05-06 07:22:22 +12:00
databio-xx
5f41fe3d08 xbytes2: correct the music cats (#5191)
Add correct category for music mp3 and music flac. Apologize for the inconvenience.
2019-05-06 07:21:57 +12:00
Garfield69
ffa264f333 xthor: correct config bullet point for multi. 2019-05-05 19:17:58 +12:00
databio-xx
46aa25772b xbytesv2: Add category for music (#5182) 2019-05-05 15:25:31 +12:00
flightlevel
eeb0b3bc39 Update README.md 2019-05-04 21:05:56 +10:00
flightlevel
cdfdd2c1bb Updater: Improve file copy logic 2019-05-04 20:47:27 +10:00
flightlevel
ec985a2318 Use custom certificate validation handler for httpclient2netcore
https://github.com/Jackett/Jackett/issues/5172
2019-05-04 16:18:25 +10:00
Scott Cooper
d7c09e62bd tapochek: more categories corrections (#5178)
* move comma
2019-05-04 17:59:13 +12:00
flightlevel
2eb54165ac Update proxy message
https://github.com/Jackett/Jackett/issues/4862
2019-05-04 15:58:15 +10:00
flightlevel
5bad47d327 Fix install link
Fixes #5171
2019-05-04 15:52:14 +10:00
Garfield69
8900aea849 Update README.md 2019-05-04 09:28:39 +12:00
Garfield69
85ea6e5a2b Merge branch 'master' of https://github.com/Jackett/Jackett 2019-05-04 09:26:52 +12:00
Garfield69
c69b213376 Update README.md 2019-05-04 09:26:33 +12:00
James
992d2776d3 broadcastthenet: Season Search enhancement (#5174)
- If only a season is searched, format it in a way expected by the indexer
2019-05-04 07:54:30 +12:00
Garfield69
ff62b775db solidtorrents: selectors changed
use non truncated title
add grabs
rework seed leech size
2019-05-03 08:47:03 +12:00
capitre
19b608c529 vizuk: update volumefactors and minseedtime (#5170) 2019-05-03 07:26:45 +12:00
Garfield69
1f9d95355d tapochek: corrention for a couple categories 2019-05-02 20:59:06 +12:00
Garfield69
849d1aeef9 add tapochek a private Russian forum. resolves #4971 2019-05-02 20:37:48 +12:00
Garfield69
08b187bfa1 nnm-club: new domain 2019-05-02 07:49:42 +12:00
snamds
d8b4ad7f39 Newpct: correct Category filter. resolves #5121 (#5163)
Some categories were not well filtered
2019-05-02 07:15:45 +12:00
flightlevel
02546877fd Inform Mono users that Mono is no longer required 2019-05-01 20:15:26 +10:00
Garfield69
52fad1e6d2 shareisland: new layout resolves #5150 2019-04-30 12:19:59 +12:00
Garfield69
049e678b0a tntvillage: add header for search post. resolves #5131 2019-04-30 08:20:21 +12:00
flightlevel
4edcda8351 Make httpclient2netcore the default 2019-04-29 20:30:27 +10:00
Garfield69
01994bf9f5 shareisland: cat updates 2019-04-28 09:12:25 +12:00
flightlevel
0d4c8ba860 Inform users that Mono is no longer needed
Note: Not enabled currently, will enable at a later date
2019-04-27 20:59:33 +10:00
flightlevel
fad453cf0e Add httpclient2netcore 2019-04-27 20:27:11 +10:00
Jorman
222fcde0a3 shareisland revert previous download link changes (#5137)
Revert last change, site changed again the download decision. I commented out the code ... just in case
2019-04-27 19:02:10 +12:00
Jorman
6aa42263be shareisland: followup #5129 (#5130)
The download now works, thanks @garfield69
2019-04-26 19:36:25 +12:00
Jorman
ec036d70f9 shareisland: download link update (#5129)
Update download selector
2019-04-26 18:58:03 +12:00
Garfield69
db300f5ae9 skytorrentclone: restore magnets only option. #4542 2019-04-25 07:09:25 +12:00
Garfield69
1d224b6db9 casatorrent: new domain #4911 2019-04-24 16:21:35 +12:00
Garfield69
a3e97bb050 amigosshare: new results layout 2019-04-23 19:21:57 +12:00
Garfield69
e5827c3456 megabliz: set as private 2019-04-22 17:28:50 +12:00
Garfield69
27d2b6caae kikibt: drop .cc domain, only using .pw now. 2019-04-22 08:32:58 +12:00
Garfield69
bcdc1879d9 btkitty: new domain 2019-04-22 08:28:37 +12:00
Garfield69
a8999e8276 torrentkitty: new domain 2019-04-22 08:20:31 +12:00
Garfield69
4c2db157e9 torrent9clone: back to .lol
same as gktorrent?
2019-04-21 17:34:35 +12:00
Garfield69
10a46bac48 gktorrent: back to .net
whats the f'ing point of yo-yo'ing from .tv to .net and back again?
2019-04-21 17:18:02 +12:00
Garfield69
7d6b282039 Revert "RarBG: bump requestDelay to 2.2 for #5107"
This reverts commit f6bb9ca263.
2019-04-21 15:28:19 +12:00
Garfield69
f6bb9ca263 RarBG: bump requestDelay to 2.2 for #5107 2019-04-21 10:50:34 +12:00
Garfield69
11e8d4d290 custom.js: ensure url len <= 2k resolves #5104
https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers
2019-04-21 09:52:09 +12:00
Peter Zsak
c88a213b2e insanetracker: new login.php page (#5105) 2019-04-21 08:03:55 +12:00
Garfield69
4295e65dfe skytorrentsclone: back to .lol domain
the .to domain redirects to BTDB

turns out .to was a completely different site than .lol and not an alternate as first thought.
changes made for .to have been reversed.
.lol uses query parm for search,
and itorrents.org for dl links
2019-04-19 18:04:40 +12:00
98 changed files with 2023 additions and 795 deletions

View File

@@ -97,7 +97,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* GDF76
* Kinozal
* LostFilm.tv
* Mega-Bliz
* Metal Tracker
* MVGroup Forum
* MVGroup Main
@@ -194,6 +193,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Dragonworld Reloaded
* Dream Team
* DXDHD
* EfectoDoppler
* EliteHD (HDClub) [![(invite needed)][inviteneeded]](#)
* Elit Tracker (ET)
* Elite-Tracker
@@ -204,7 +204,6 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* FileList (FL)
* Femdomcult
* FocusX
* Freedom-HD (Freedom Paradise)
* FreeTorrent
* FullMixMusic
* FunFile (FF)
@@ -212,6 +211,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Fuzer (FZ)
* GAYtorrent.ru
* GazelleGames (GGn)
* Generation-Free
* GFXNews
* GFXPeers
* GigaTorrents
@@ -257,6 +257,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Magico (Trellas)
* Majomparádé (TurkDepo)
* Manicomio Share
* Mega-Bliz
* Mononoké-BT
* MoreThanTV (MTV)
* MyAnonamouse (MAM)
@@ -311,6 +312,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Sharingue
* Shazbat
* Shellife (SL)
* SiamBIT
* SpaceTorrent
* Speed-Share
* SpeedCD
@@ -319,8 +321,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* SportsCult
* SuperBits (SBS)
* TakeaByte
* Tapochek
* Tasmanit
* TBPlus
* TeamHD
* TenYardTorrents (TYT)
* TheEmpire (TE)
* The Geeks
@@ -415,7 +419,8 @@ Jackett can also be run from the command line if you would like to see log messa
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x#linux-distribution-dependencies
### Install as service
To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
1. Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases)
2. To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
### Run without installing as a service
Download and extract the latest `Jackett.Binaries.LinuxAMDx64.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett with the command `./jackett`
@@ -428,7 +433,8 @@ If you want to run it with a user without a /home directory you need to add `Env
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x#linux-distribution-dependencies
### Install as service
To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases)
2. To install Jackett as a service, open the Terminal and run `sudo ./install_service_systemd.sh` You need root permissions to install the service. The service will start on each logon. You can always stop it by running `systemctl stop jackett.service` from Terminal. You can start it again it using `systemctl start jackett.service`. Logs are stored as usual under `~/.config/Jackett/log.txt` and also in `journalctl -u jackett.service`.
### Run without installing as a service
Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett with the command `./jackett`
@@ -558,7 +564,7 @@ All contributions are welcome just send a pull request.
### Windows
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
* Clone Jackett
* From the `src` directory, run `dotnet restore`
* Open Powershell and from the `src` directory, run `dotnet restore`
* Open the Jackett solution in Visual Studio 2017 (version 15.9 or above)
* Right click on the Jackett solution and click 'Rebuild Solution' to restore nuget packages
* Select Jackett.Server as startup project

View File

@@ -6,6 +6,10 @@ image:
environment:
APPVEYOR_YML_DISABLE_PS_LINUX: true
configuration: Release
install:
#Remove once .NET Core 2.2.5 is deployed to Appveyor
- sh: sudo apt-get update
- sh: sudo apt-get -y install dotnet-sdk-2.2
assembly_info:
patch: true
file: '**\AssemblyInfo.*'

View File

@@ -126,7 +126,6 @@ Task("Package-Mono-Full-Framework")
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
CopyFileToDirectory("./install_service_macos_mono", buildOutputPath);
CopyFileToDirectory("./install_service_systemd_mono.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);

View File

@@ -1,77 +0,0 @@
#!/bin/bash
#Setting up colors
BOLDRED="$(printf '\033[1;31m')"
BOLDGREEN="$(printf '\033[1;32m')"
NC="$(printf '\033[0m')" # No Color
# Stop and unload the service if it's running
launchctl remove org.user.Jackett
# Move working directory to Jackett's
cd "$(dirname "$0")"
# Check if we're running from Jackett's directory
if [ ! -f ./JackettConsole.exe ]; then
echo "${BOLDRED}ERROR${NC}: Couldn't locate JackettConsole.exe. Is the script in the right directory?"
exit 1
fi
jackettdir="$(pwd)"
# Check if mono is installed
command -v mono >/dev/null 2>&1 || { echo >&2 "${BOLDRED}ERROR${NC}: Jackett requires Mono but it's not installed. Aborting."; exit 1; }
monodir="$(dirname $(command -v mono))"
# Check that no other service called Jackett is already running
if [[ $(launchctl list | grep org.user.Jackett) ]]; then
echo "${BOLDRED}ERROR${NC}: Jackett already seems to be running as a service. Please stop it before running this script again."
exit 1
fi
# Write the plist to LaunchAgents
mkdir -p ~/Library/LaunchAgents/
cat >~/Library/LaunchAgents/org.user.Jackett.plist <<EOL
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/bin:/bin:/usr/sbin:/sbin:${monodir}</string>
</dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.user.Jackett</string>
<key>ProgramArguments</key>
<array>
<string>${monodir}/mono</string>
<string>--debug</string>
<string>JackettConsole.exe</string>
<string>--NoRestart</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>${jackettdir}</string>
</dict>
</plist>
EOL
# Run the agent
launchctl load ~/Library/LaunchAgents/org.user.Jackett.plist
# Check that it's running
if [[ $(launchctl list | grep org.user.Jackett) ]]; then
echo "${BOLDGREEN}Agent successfully installed and launched!${NC}"
else
cat << EOL
${BOLDRED}ERROR${NC}: Could not launch agent. The installation might have failed.
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
Mono directory: \`${monodir}\`
Jackett directory: \`${jackettdir}\`
EOL
fi

View File

@@ -70,7 +70,6 @@ else
cat << EOL
${BOLDRED}ERROR${NC}: Could not launch service. The installation might have failed.
Please open an issue on https://github.com/Jackett/Jackett/issues and paste following information:
Mono directory: \`${monodir}\`
Jackett directory: \`${jackettdir}\`
Jackett user: \`${jackettuser}\`

View File

@@ -94,6 +94,10 @@ function loadJackettSettings() {
$("#logoutBtn").show();
}
if (data.can_run_netcore != null && data.can_run_netcore === true) {
$("#can-upgrade-from-mono").show();
}
$.each(data.notices, function (index, value) {
console.log(value);
doNotify(value, "danger", "glyphicon glyphicon-alert", false);
@@ -222,12 +226,12 @@ function displayUnconfiguredIndexersList() {
doNotify("Configuration failed: " + data.error, "danger", "glyphicon glyphicon-alert");
}
}).fail(function (data) {
if(data.responseJSON.error !== undefined) {
doNotify("An error occured while configuring this indexer<br /><b>" + data.responseJSON.error + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
}
if(data.responseJSON.error !== undefined) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
doNotify("An error occured while configuring this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while configuring this indexer, is Jackett server running ?", "danger", "glyphicon glyphicon-alert");
}
});
});
});
@@ -444,12 +448,13 @@ function testIndexer(id, notifyResult) {
doNotify("Test failed for " + id + ": \n" + data.error, "danger", "glyphicon glyphicon-alert");
}
}).fail(function (data) {
updateTestState(id, "error", data.error, indexers);
if(data.responseJSON.error !== undefined && notifyResult) {
doNotify("An error occured while testing this indexer<br /><b>" + data.responseJSON.error + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + id + "] " + data.responseJSON.error + " (Test)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while testing indexers, please take a look at indexers with failed test for more informations.", "danger", "glyphicon glyphicon-alert");
}
updateTestState(id, "error", data.error, indexers);
if(data.responseJSON.error !== undefined && notifyResult) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - id.length - "] ".length - " (Test)".length; // keep url <= 2k #5104
doNotify("An error occured while testing this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + id + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Test)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while testing indexers, please take a look at indexers with failed test for more informations.", "danger", "glyphicon glyphicon-alert");
}
});
}
@@ -651,11 +656,12 @@ function populateSetupForm(indexerId, name, config, caps, link, alternativesitel
doNotify("Configuration failed: " + data.error, "danger", "glyphicon glyphicon-alert");
}
}).fail(function (data) {
if(data.responseJSON.error !== undefined) {
doNotify("An error occured while updating this indexer<br /><b>" + data.responseJSON.error + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while updating this indexer, request to Jackett server failed, is server running ?", "danger", "glyphicon glyphicon-alert");
}
if(data.responseJSON.error !== undefined) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[".length - indexerId.length - "] ".length - " (Config)".length; // keep url <= 2k #5104
doNotify("An error occured while updating this indexer<br /><b>" + data.responseJSON.error.substring(0, indexEnd) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data.responseJSON.error.substring(0, indexEnd) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>", "danger", "glyphicon glyphicon-alert", false);
} else {
doNotify("An error occured while updating this indexer, request to Jackett server failed, is server running ?", "danger", "glyphicon glyphicon-alert");
}
}).always(function () {
$goButton.html(originalBtnText);
$goButton.prop('disabled', false);

View File

@@ -51,6 +51,14 @@
<input id="api-key-input" class="form-control input-right" type="text" value="" placeholder="API Key" readonly="">
</div>
<hr />
<div id="can-upgrade-from-mono" hidden class="alert alert-info" role="alert">
<strong>Standalone version of Jackett is now available - Mono not required</strong> <br>
To upgrade to the standalone version of Jackett, <a href="https://github.com/Jackett/Jackett#install-on-linux-amdx64" target="_blank" class="alert-link">click here</a> for install instructions.
Upgrading is straight forward, simply install the standalone version and your indexers/configuration will carry over.
Benefits include: increased performance, improved stability and no dependency on Mono.
</div>
<div class="pull-right">
<button id="jackett-add-indexer" class="btn btn-success btn-sm">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add indexer
@@ -142,8 +150,7 @@
</div>
<div id="proxy-warning" hidden>
<span>
WARNING: The proxy option is unstable and potentially leaks requests. If no fix from the community is forthcoming
in the next few months, the proxy option will be removed from Jackett. Recommendation is to use a VPN.
WARNING: The proxy option potentially leaks requests. Recommendation is to use a VPN.
</span>
</div>
<div class="input-area">
@@ -671,6 +678,6 @@
</script>
<script type="text/javascript" src="../libs/api.js?changed=2017083001"></script>
<script type="text/javascript" src="../custom.js?changed=20190401"></script>
<script type="text/javascript" src="../custom.js?changed=20190427"></script>
</body>
</html>

View File

@@ -175,7 +175,7 @@
sort: "id"
order: "desc"
rows:
selector: table > tbody > tr:has(a[href^="torrents-details.php?id="])
selector: div#fancy-list-group ul.list-group li.list-group-item
fields:
title:
selector: a[href^="torrents-details.php?id="]
@@ -185,14 +185,8 @@
download:
selector: a[href^="download.php?id="]
attribute: href
banner:
selector: a[href^="torrents-details.php?id="]
attribute: title
filters:
- name: regexp
args: "src=\"(.*?)\""
category:
selector: td:first-child img
selector: div.list-group-item-addon img
attribute: src
case:
# unfortunately the site does not have category numbers on the results page, just a .png which can apply to both movies and tv.
@@ -299,11 +293,11 @@
date:
text: now
size:
selector: td:nth-child(2) span.badge-info
selector: div.list-group-item-content p.m-0 span.badge-info
seeders:
selector: td:nth-child(4)
selector: div.list-group-item-controls a:nth-child(1)
leechers:
selector: td:nth-child(5)
selector: div.list-group-item-controls a:nth-child(2)
downloadvolumefactor:
case:
"span.badge-success:contains(\"FREE\")": "0"

View File

@@ -39,6 +39,9 @@
- name: regexp
args: "Ratio : (\\d+)"
download:
selector: a[href*="/download/"]
search:
paths:
- path: filterTorrents
@@ -66,7 +69,7 @@
title:
selector: a.view-torrent
download:
selector: a[href*="/download/"]
selector: a[href*="/download_check/"]
attribute: href
details:
selector: a.view-torrent

View File

@@ -0,0 +1,101 @@
---
site: beyond-hd
name: Beyond-HD
description: "Without BeyondHD, your HDTV is just a TV"
language: en-us
type: private
encoding: UTF-8
links:
- https://beyond-hd.me/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
login:
path: login
method: form
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: 1
error:
- selector: div.has-error
test:
path: torrents
search:
paths:
- path: torrents
inputs:
$raw: "{{range .Categories}}categories[]={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{else}}{{ .Keywords }}{{end}}"
description: ""
uploader: ""
imdb: "{{ .Query.IMDBIDShort }}"
tmdb: ""
sorting: created_at
direction: desc
qty: 100
rows:
selector: table > tbody > tr
fields:
category:
selector: a[href*="/categories/"]
attribute: href
filters:
- name: regexp
args: "/categories/.*?\\.(\\d+)"
title:
selector: a.torrent-name
download:
selector: a[href*="/download/"]
attribute: href
details:
selector: a.torrent-name
attribute: href
banner:
optional: true
selector: div.torrent-poster img
attribute: src
filters:
- name: replace
args: ["https://via.placeholder.com/600x900", ""]
date:
selector: td:not(a[href$="/history"]) span.text-orange
filters:
- name: timeago
size:
selector: td span.text-blue
seeders:
selector: a[href$="/peers"] span.text-green
leechers:
selector: a[href$="/peers"] span.text-red
grabs:
selector: a[href$="/history"]
imdb:
optional: true
selector: a[href*="www.imdb.com/title/tt"]
attribute: href
downloadvolumefactor:
case:
"i[data-original-title=\"Personal Freeleech\"]": "0" # 24 Hour FreeLeech From BON Store
"i[data-original-title=\"Special Freeleech\"]": "0" # Special FreeLeech For Certain User Groups
"i[data-original-title=\"Freeleech Token\"]": "0" # Freeleech From Token
"i[data-original-title=\"Global FreeLeech\"]": "0" # Global Freeleech
"i[data-original-title=\"Freeleech\"]": "0" # Freeleech
"i[data-original-title=\"Featured Torrent\"]": "0" # Featured Torrent
"*": "1"
uploadvolumefactor:
case:
"i[data-original-title=\"Double Upload\"]": "2" # Single Torrent Double Upload
"i[data-original-title=\"Global Double Upload\"]": "2" # Global Double Upload
"i[data-original-title=\"Featured Torrent\"]": "2" # Featured Torrent
"*": "1"
# UNIT3D

View File

@@ -7,15 +7,16 @@
encoding: UTF-8
followredirect: true
links:
- http://btkitty.pet/
- https://btkittys.co/
legacylinks:
- https://cnbtkitty.org/
- http://cnbtkitty.org/
- https://cnbtkitty.com/
- http://cnbtkitty.com/
- https://cnbtkitty.me/
- http://cnbtkitty.me/
- http://cnbtkitty.ws/
- https://cnbtkitty.org/
- http://cnbtkitty.org/
- https://cnbtkitty.com/
- http://cnbtkitty.com/
- https://cnbtkitty.me/
- http://cnbtkitty.me/
- http://cnbtkitty.ws/
- http://btkitty.pet/
caps:
categorymappings:

View File

@@ -18,7 +18,7 @@
- name: info_results
type: info
label: "Search results"
default: "For best results, increase the torrents number in your profile to 100.<br />Default is 15."
default: "Only the <b>xBtit_Default</b> style is supported with this indexer.<br />For best results, increase the torrents number in your profile to 100.<br />Default is 15."
caps:
categorymappings:

View File

@@ -6,7 +6,10 @@
type: private
encoding: UTF-8
links:
- https://teamctgame.xyz/
legacylinks:
- https://teamctgame.co/
- http://teamctgame.xyz/
caps:
categorymappings:

View File

@@ -56,17 +56,21 @@
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: cookie
type: text
label: Cookie
- name: info
type: info
label: How to get the Cookie
default: "<ol><li>Login to this tracker in your browser<li>Open the <b>DevTools</b> panel by pressing <b>F12</b><li>Select the <b>Network</b> tab<li>Click on the <b>Doc</b> button<li>Refresh the page by pressing <b>F5</b><li>Select the <b>Headers</b> tab<li>Find 'cookie:' in the <b>Request Headers</b> section<li>Copy & paste the whole cookie string to here</ol>"
login:
path: index.php?page=login
method: post
method: cookie
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: div#login-alert
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:

View File

@@ -0,0 +1,94 @@
---
site: efectodoppler
name: Efecto Doppler
description: "Efecto Doppler is a SPANISH Private Torrent Tracker for MUSIC"
language: es-es
type: private
encoding: UTF-8
links:
- https://efectodoppler.pw/
caps:
categories:
1: Audio
modes:
search: [q]
music-search: [q, album, artist, label, year]
login:
path: login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
keeplogged: 1
error:
- selector: form > span.warning
test:
path: index.php
selector: a[href^="logout.php?auth="]
ratio:
path: index.php
selector: li#stats_ratio span.stat span
search:
paths:
- path: torrents.php
inputs:
artistname: "{{if .Query.Artist}}{{ .Query.Artist }}{{else}}{{end}}"
groupname: "{{if .Query.Artist}}{{else}}{{ .Keywords }}{{end}}"
order_by: time
order_way: desc
rows:
selector: tr.torrent
fields:
category:
text: "1"
artist:
text: "Varios artistas"
artist:
selector: a[href^="artist.php?id="]
optional: true
title:
selector: a[href^="torrents.php?id="]
filters:
- name: prepend
args: "{{.Result.artist}} - "
details:
selector: a[href^="torrents.php?id="]
attribute: href
banner:
selector: div.group_image img
attribute: src
download:
selector: a[href^="torrents.php?action=download&id="]
attribute: href
description:
selector: div.torrent_info
files:
selector: td:nth-child(3)
date:
selector: td:nth-child(4) span
attribute: title
filters:
- name: dateparse
args: "Jan 02 2006, 15:04"
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.torrent_label[title*="Neutral"]: "0"
strong.torrent_label[title*="Oro"]: "0"
"*": "1"
uploadvolumefactor:
case:
strong.torrent_label[title*="Neutral"]: "0"
"*": "1"

View File

@@ -1,160 +0,0 @@
---
site: freedomhd
name: Freedom-HD
description: "Freedom-HD (Freedom Paradise) is a ratioless FRENCH Private Torrent Tracker for HD MOVIES / GENERAL"
language: fr-fr
type: private
encoding: UTF-8
links:
- http://freedom-paradise.eu/
download:
before:
path: list_thanks.php
method: "get"
inputs:
id: "{{ .DownloadUri.Query.id }}"
to: "give"
torrent: "{{ .DownloadUri.Query.id }}"
caps:
categorymappings:
# ANIMES
- {id: 105, cat: TV/Anime, desc: "ANIMES 1080p-Bluray"}
- {id: 149, cat: TV/Anime, desc: "ANIMES 3D"}
- {id: 143, cat: TV/Anime, desc: "ANIMES 4K-2160p"}
- {id: 104, cat: TV/Anime, desc: "ANIMES 720p-Bluray"}
- {id: 90, cat: TV/Anime, desc: "ANIMES HDrip-720p"}
- {id: 93, cat: TV/Anime, desc: "ANIMES HDrip-1080p"}
- {id: 131, cat: TV/Anime, desc: "ANIMES SD"}
- {id: 120, cat: TV/Anime, desc: "ANIMES X265-1080p"}
- {id: 119, cat: TV/Anime, desc: "ANIMES X265-720p"}
# DOCUMENTAIRES
- {id: 107, cat: TV/Documentary, desc: "DOCS 1080p-Bluray"}
- {id: 152, cat: TV/Documentary, desc: "DOCS 2160p-Bluray"}
- {id: 106, cat: TV/Documentary, desc: "DOCS 720p-Bluray"}
- {id: 94, cat: TV/Documentary, desc: "DOCS HDrip-1080p"}
- {id: 91, cat: TV/Documentary, desc: "DOCS HDrip-720p"}
- {id: 142, cat: TV/Documentary, desc: "DOCS HDTV"}
- {id: 141, cat: TV/Documentary, desc: "DOCS SD"}
# EBOOK
- {id: 124, cat: Books, desc: "Livres et Magazines"}
# FILMS
- {id: 97, cat: Movies/HD, desc: "FILMS Bluray-1080p"}
- {id: 103, cat: Movies/3D, desc: "FILMS 3D"}
- {id: 111, cat: Movies/UHD, desc: "FILMS 4K"}
- {id: 96, cat: Movies/HD, desc: "FILMS Bluray-720p"}
- {id: 127, cat: Movies/HD, desc: "FILMS BDrip"}
- {id: 128, cat: Movies/HD, desc: "FILMS BRrip"}
- {id: 140, cat: Movies/HD, desc: "FILMS BSD-Team"}
- {id: 126, cat: Movies/SD, desc: "FILMS DVDrip"}
- {id: 136, cat: Movies/BluRay, desc: "FILMS Full-Bluray"}
- {id: 135, cat: Movies/SD, desc: "FILMS Team Freedom-HD"}
- {id: 137, cat: Movies/SD, desc: "FILMS Team ticadow"}
- {id: 89, cat: Movies/HD, desc: "FILMS HDrip-720p"}
- {id: 92, cat: Movies/HD, desc: "FILMS HDrip-1080p"}
- {id: 112, cat: Movies/SD, desc: "FILMS Team-Hush"}
- {id: 129, cat: Movies/HD, desc: "FILMS Team-Romkent"}
- {id: 125, cat: Movies/Other, desc: "FILMS WEBrip"}
- {id: 110, cat: Movies/HD, desc: "FILMS X265-1080p"}
- {id: 109, cat: Movies/HD, desc: "FILMS X265-720p"}
# GAMES
- {id: 134, cat: PC/Games, desc: "jeu PC"}
# MUSIQUES
- {id: 114, cat: Audio/Lossless, desc: "MUSIQUES Flac"}
- {id: 113, cat: Audio/MP3, desc: "MUSIQUES MP3"}
- {id: 132, cat: Audio, desc: "MUSIQUES HQ"}
- {id: 130, cat: Audio/Video, desc: "MUSIQUES video clip"}
# SERIE
- {id: 121, cat: TV/SD, desc: "SERIE SD"}
- {id: 102, cat: TV/HD, desc: "SERIE 1080p-Bluray"}
- {id: 101, cat: TV/HD, desc: "SERIE 720p-Bluray"}
- {id: 100, cat: TV/HD, desc: "SERIE HDrip-1080p"}
- {id: 99, cat: TV/HD, desc: "SERIE HDrip-720p"}
- {id: 151, cat: TV/UHD, desc: "SERIE HDrip-2160p"}
# SPECTACLES
- {id: 138, cat: TV, desc: "SPECTACLES Bluray-1080p"}
- {id: 139, cat: TV, desc: "SPECTACLES Bluray-720p"}
- {id: 133, cat: TV, desc: "SPECTACLES DVDrip"}
- {id: 118, cat: TV, desc: "SPECTACLES HDrip-1080p"}
- {id: 117, cat: TV, desc: "SPECTACLES HDrip-720p"}
# SPORT
- {id: 146, cat: TV/Sport, desc: "SPORT HDTV-1080p"}
- {id: 147, cat: TV/Sport, desc: "SPORT HDTV-720p"}
- {id: 148, cat: TV/Sport, desc: "SPORT SD"}
- {id: 144, cat: TV/Sport, desc: "SPORT WEB-DL-1080p"}
- {id: 145, cat: TV/Sport, desc: "SPORT WEB-DL-720p"}
modes:
search: [q]
tv-search: [q, season, ep]
login:
path: account-login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: "yes"
returnto: "/"
error:
- selector: div.myFrame:has(font.error)
test:
path: torrents-search.php
selector: a.logout
search:
paths:
- path: torrents-search.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Query.Keywords }}"
incldead: "1"
rows:
selector: table.ttable_headinner > tbody > tr[class^="t-row"]
filters:
- name: andmatch
after: 1
fields:
download:
selector: a[href^="torrents-details.php?id="]
attribute: href
filters:
- name: replace
args: ["torrents-details.php", "download.php"]
title:
selector: a[href^="torrents-details.php?id="]
attribute: title
category:
selector: a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="torrents-details.php?id="]
attribute: href
description:
selector: ul
banner:
selector: img.rounded-img
attribute: src
size:
selector: td:nth-child(3)
grabs:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(4)
leechers:
selector: td:nth-child(5)
date:
text: now
downloadvolumefactor:
case:
img[alt="freeleech"]: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -7,8 +7,6 @@
encoding: UTF-8
links:
- https://www.frozen-layer.com/
certificates:
- 001bc21dd13b54b05106b510a327a7182ec443a4
settings:
- name: category

View File

@@ -0,0 +1,208 @@
---
site: generationfree
name: Generation-Free
description: "Generation-Free is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL"
language: fr-fr
type: private
encoding: UTF-8
links:
- https://generation-free.biz/
caps:
categorymappings:
- {id: 10, cat: TV/HD, desc: "Animation: HD720P"}
- {id: 11, cat: TV/HD, desc: "Animation: HD1080P"}
- {id: 56, cat: TV/SD, desc: "Animation: DVDRip"}
- {id: 13, cat: TV/SD, desc: "Animation: DVD"}
- {id: 105, cat: TV/HD, desc: "Animation: Bluray"}
- {id: 106, cat: TV/HD, desc: "Animation: HDTV"}
- {id: 108, cat: TV/WEB-DL, desc: "Animation: WEBDL"}
- {id: 109, cat: TV/WEB-DL, desc: "Animation: WEBRIP"}
- {id: 18, cat: PC/0day, desc: "Applications: PC"}
- {id: 16, cat: PC/Games, desc: "Applications: Jeux"}
- {id: 19, cat: PC/Phone-Android, desc: "Applications: Android"}
- {id: 38, cat: PC/Phone-Other, desc: "Applications: Mobile Phone"}
- {id: 17, cat: PC/Mac, desc: "Applications: Mac"}
- {id: 117, cat: PC, desc: "Applications: Appli-autre"}
- {id: 40, cat: PC, desc: "Applications: Linux"}
- {id: 67, cat: TV/OTHER, desc: "Autres: Emission TV"}
- {id: 118, cat: TV/Documentary, desc: "Documentaires: Sport"}
- {id: 15, cat: TV/Documentary, desc: "Documentaires: HD"}
- {id: 14, cat: TV/Documentary, desc: "Documentaires: DivX"}
- {id: 76, cat: TV/Documentary, desc: "Documentaires: TVRip/HDTV"}
- {id: 62, cat: Audio/Audiobook, desc: "E-Books: E-Books Audio"}
- {id: 51, cat: Books/Ebook, desc: "E-Books: BD"}
- {id: 50, cat: Books/Ebook, desc: "E-Books: Manuel Français"}
- {id: 49, cat: Books/Ebook, desc: "E-Books: Manuel Anglais"}
- {id: 36, cat: Books/Ebook, desc: "E-Books: Livres Français"}
- {id: 53, cat: Books/Ebook, desc: "E-Books: Livre Anglais"}
- {id: 52, cat: Books/Ebook, desc: "E-Books: Revue - Journaux"}
- {id: 3, cat: Movies/DVD, desc: "Films: DVDRIP"}
- {id: 4, cat: Movies/DVD, desc: "Films: DVD5"}
- {id: 66, cat: Movies, desc: "Films: VOSTFR"}
- {id: 88, cat: Movies/BluRay, desc: "Films: Full BD/BR"}
- {id: 89, cat: Movies/BluRay, desc: "Films: BD/BR Rip"}
- {id: 5, cat: Movies/DVD, desc: "Films: DVD9"}
- {id: 94, cat: Movies/DVD, desc: "Films: DVDscreen"}
- {id: 91, cat: Movies, desc: "Films: RemuX"}
- {id: 104, cat: Movies/BluRay, desc: "Films: Film-BDRip"}
- {id: 110, cat: Movies/WEBDL, desc: "Films: WEBRip"}
- {id: 111, cat: Movies/WEBDL, desc: "Films: WEBRip-720p-P"}
- {id: 95, cat: Movies/BluRay, desc: "Films: bluray"}
- {id: 102, cat: Movies/WEBDL, desc: "Films: WEB-DL 720P"}
- {id: 101, cat: Movies/WEBDL, desc: "Films: WEB-DL 1080P"}
- {id: 92, cat: Movies/UHD, desc: "Films: 4K"}
- {id: 100, cat: Movies/UHD, desc: "Films: 4KLight"}
- {id: 71, cat: Movies/WEBDL, desc: "Films: WEB-DL"}
- {id: 69, cat: Movies/3D, desc: "Films: Film 3D"}
- {id: 65, cat: TV, desc: "Films: VO"}
- {id: 72, cat: TV/HD, desc: "Films: TVRip/HDTV"}
- {id: 96, cat: Movies/HD, desc: "Films: HDlight"}
- {id: 70, cat: Movies/HD, desc: "Films: MHD X265"}
- {id: 103, cat: Movies/HD, desc: "Films: Film-HDRIP"}
- {id: 57, cat: TV, desc: "Films: TS/CAM"}
- {id: 59, cat: TV, desc: "Films: Spectacle"}
- {id: 87, cat: XXX, desc: "Films: XXX"}
- {id: 55, cat: Movies/HD, desc: "Films: MHD 720P"}
- {id: 54, cat: Movies/HD, desc: "Films: MHD 1080P"}
- {id: 1, cat: Movies/HD, desc: "Films: HD720P"}
- {id: 2, cat: Movies/HD, desc: "Films: HD1080P"}
- {id: 90, cat: Movies/HD, desc: "Films: HD X265"}
- {id: 112, cat: Movies/WEBDL, desc: "Films: WEBrip-1080-P"}
- {id: 77, cat: PC/Phone-Other, desc: "GPS: Cartes"}
- {id: 78, cat: PC/Phone-Other, desc: "GPS: Radars"}
- {id: 125, cat: TV/Anime, desc: "Mangas: DVDRip"}
- {id: 124, cat: TV/Anime, desc: "Mangas: HD720P"}
- {id: 97, cat: Audio, desc: "Musique: Podcast"}
- {id: 98, cat: Audio, desc: "Musique: karaoké"}
- {id: 75, cat: Audio, desc: "Musique: Concert TVRip"}
- {id: 24, cat: Audio/Lossless, desc: "Musique: Single Flac"}
- {id: 25, cat: Audio/MP3, desc: "Musique: Single MP3"}
- {id: 22, cat: Audio/MP3, desc: "Musique: Album MP3"}
- {id: 115, cat: Audio/MP3, desc: "Musique: Coffret mp3"}
- {id: 23, cat: Audio/Lossless, desc: "Musique: Album Flac"}
- {id: 116, cat: Audio/Lossless, desc: "Musique: Coffret flac"}
- {id: 64, cat: Audio, desc: "Musique: Mégamix Maison"}
- {id: 58, cat: Audio, desc: "Musique: Concert"}
- {id: 6, cat: TV, desc: "Serie TV: Saison FR"}
- {id: 7, cat: TV, desc: "Serie TV: Episode FR"}
- {id: 61, cat: TV, desc: "Serie TV: Episode VOSTFR"}
- {id: 93, cat: TV, desc: "Serie TV: Saison VOSTFR"}
- {id: 113, cat: TV, desc: "Serie TV: Episode QC"}
- {id: 114, cat: TV, desc: "Serie TV: Saison QC"}
- {id: 73, cat: TV/WEB-DL, desc: "Serie TV: WEB-DL"}
- {id: 74, cat: TV/HD, desc: "Serie TV: TVRip/HDTV"}
- {id: 12, cat: TV, desc: "Serie TV: Animation"}
- {id: 63, cat: TV, desc: "Serie TV: Episode VO"}
- {id: 120, cat: TV/HD, desc: "Serie TV: Episode Bluray 1080p"}
- {id: 121, cat: TV/HD, desc: "Serie TV: Saison Bluray 720p"}
- {id: 122, cat: TV/HD, desc: "Serie TV: Saison Bluray 1080p"}
- {id: 119, cat: TV/HD, desc: "Serie TV: Episode Bluray 720p"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: multilang
type: checkbox
label: Replace MULTI by another language in release name
default: false
- name: multilanguage
type: select
label: Replace MULTI by this language
default: VOSTFR
options:
FRENCH : "FRENCH"
"MULTI FRENCH": "MULTI FRENCH"
ENGLISH: "ENGLISH"
"MULTI ENGLISH": "MULTI ENGLISH"
VOSTFR: "VOSTFR"
"MULTI VOSTFR": "MULTI VOSTFR"
login:
path: account-login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.tboxhead
test:
path: torrents-search.php
selector: a[href="account-logout.php"]
download:
before:
path: "list_thanks.php"
method: "get"
inputs:
id: "{{ .DownloadUri.Query.id }}"
to: "give"
torrent: "{{ .DownloadUri.Query.id }}"
selector: a[href^="download.php?id="]
search:
paths:
# 40 results per page
- path: torrents-search.php
- path: torrents-search.php
inputs:
page: 1
inputs:
# multi cats unsupported, defaulting to all
cat: 0
search: "{{ .Keywords }}"
incldead: 1
freeleech: 0
inclexternal: 0
lang: 0
sort: id
order: desc
rows:
selector: table.ttable_headinner > tbody > tr.t-row
fields:
title_original:
selector: a[href^="torrents-details.php?id="] b
title_multilang:
text: "{{ .Result.title_original }}"
filters:
- name: re_replace
args: ["\\s[Mm][Uu][Ll][Tt][Ii]\\s", " {{ .Config.multilanguage }} "]
title:
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_original }}{{end}}"
category:
selector: a[href^="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="torrents-details.php?id="]
attribute: href
download:
selector: a[href^="torrents-details.php?id="]
attribute: href
size:
selector: td:nth-last-child(4)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
date:
text: now
downloadvolumefactor:
case:
img[src="images/fl.gif"]: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -7,7 +7,7 @@
encoding: UTF-8
followredirect: true
links:
- https://www.gktorrent.tv/
- https://www.gktorrent.biz/
legacylinks:
- https://www.gktorrent.com/
- http://www.gktorrent.com/
@@ -24,6 +24,7 @@
- https://www.gktorrent.me/
- https://www.rantop.org/
- https://www.gktorrent.cx/
- https://www.gktorrent.tv/
- https://www.gktorrent.net/
caps:

View File

@@ -79,13 +79,12 @@
incldead: 1
search_by: "{{ if .Query.IMDBID }}imdb{{else}}name{{end}}"
rows:
selector: table.table-striped > tbody > tr:has(a[title][href^="details.php?id="])
selector: table.table-striped > tbody > tr:has(a[href^="details.php?id="])
fields:
title:
selector: a[title][href^="details.php?id="]
attribute: title
selector: a[href^="details.php?id="]
details:
selector: a[title][href^="details.php?id="]
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="?cat="]
@@ -96,7 +95,7 @@
banner:
attribute: rel
imdb:
selector: a[href*="https://www.imdb.com/title/"]
selector: a[href*="www.imdb.com/title/"]
optional: true
attribute: href
download:

View File

@@ -10,8 +10,6 @@
legacylinks:
- http://ilcorsaroblu.org/
- https://www.ilcorsaroblu.info/
certificates:
- e6dd93ef71f96d04559e2bee8cc8e6fd74957730 # incomplete CA chain
caps:
categorymappings:

View File

@@ -13,14 +13,6 @@
- https://ilcorsaronero.info/
- https://ilcorsaronero.ch/
- https://ilcorsaronero.cc/
certificates:
- 89c12d4a080b5aeec00acbb269dc9b44584b1b3f # incomplete CA chain
- aa7c40aa360a1cec8a9687312fd50402b912e618 # incomplete CA chain
- 83174ec1f92fa13cdef9d51888ea1dfba2166e17 # incomplete CA chain
- c414bf4ad6c69841693c147849f4c314aa200bdf # incomplete CA chain
- 3a402766ce22fd1aa24bfc1a4fd47e9309eb8c98 # incomplete CA chain
- 160f832730737a70264768ceddf3cd94bc51ffb7 # incomplete CA chain
- a60e969b27965d4dc2ff45d50c20e2e872d4e9b9 # incomplete CA chain
caps:
categorymappings:

View File

@@ -46,14 +46,14 @@
movie-search: [q, imdbid]
login:
path: takelogin.php
path: login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
notsecure: "1"
error:
- selector: div.login_error_content
- selector: div.login_error_content_text
test:
path: browse.php
@@ -65,10 +65,10 @@
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Query.Keywords }}{{end}}"
t: "all"
rows:
selector: table.torrentable > tbody > tr:has(td.maintd)
selector: table.torrenttable > tbody > tr:has(td.torrentmain)
fields:
title:
selector: div.tortitle > a
selector: td.torrentmain > a.torrentname
attribute: title
category:
selector: a[href^="browse.php?cat="]
@@ -77,10 +77,10 @@
- name: querystring
args: cat
details:
selector: div.tortitle > a
selector: td.torrentmain > a.torrentname
attribute: href
download:
selector: a[href^="download.php/"]
selector: a[href*="/download.php/"]
attribute: href
imdb:
optional: true
@@ -95,51 +95,49 @@
selector: a.cover
attribute: href
files:
selector: td:nth-child(6)
selector: div.files > a.button.small
filters:
- name: replace
args: [".", ""]
size:
selector: td:nth-child(8)
selector: td.center.size
filters:
- name: replace
args: [".", ""]
- name: replace
args: [",", "."]
grabs:
selector: td:nth-child(9) > div:first-child
filters:
- name: replace
args: [".", ""]
- name: regexp
args: "^([\\d]+)"
seeders:
selector: td:nth-child(9) > div:first-child
selector: td.center.data > a:first-child
filters:
- name: replace
args: [".", ""]
- name: regexp
args: "\\|\\s*([\\d]+)\\s*\\|"
leechers:
selector: td:nth-child(9) > div:first-child
selector: td.center.data > a:nth-child(2)
filters:
- name: replace
args: [".", ""]
- name: regexp
args: "([\\d]+)$"
date:
selector: td.date
grabs:
selector: td.center.data
filters:
- name: replace
args: [".", ""]
remove: div.uploader, div.moderation, a.leftborder
date:
selector: td.center.date
filters:
- name: re_replace
args: ["(\\-)(\\d{2})(\\d{2})(\\:)", "-$2 $3:"]
- name: dateparse
args: "2006.01.02 15:04:05"
args: "2006-01-02 15:04"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
case:
img[src^="pic/4x.gif"]: "4"
img[src^="pic/3x.gif"]: "3"
img[src^="pic/2x.gif"]: "2"
"*": "1"
a[href^="?doubleup=four"]: "4"
a[href^="?doubleup=three"]: "3"
a[href^="?doubleup=two"]: "2"
"*" : "1"
description:
selector: td.maintd
remove: div.tortitle, div.markcont, div.tablebuttons, div.tablebigbuttons
selector: div.contenttext
remove: div.contenttitle

View File

@@ -7,11 +7,11 @@
encoding: UTF-8
followredirect: true
links:
- https://kikibt.cc/
- https://kikibt.pw/
legacylinks:
- https://kikibt.me/
- http://kikibt.pw/
- https://kikibt.cc/
caps:
categorymappings:

View File

@@ -173,6 +173,8 @@
args: ["Кураж-Бамбей", "kurazh"]
- name: replace
args: ["Кубик в Кубе", "Kubik"]
- name: replace
args: ["Кравец", "Kravec"]
- name: re_replace
args: ["\\((\\d+)\\s+[Сс]езон:\\s+(?:(\\d+-*\\d*)\\s+[Сс]ери[ия]\\s+.*\\d+)\\)(.*)\\s([12][0-9]{3})\\s(.*)", "$3 - S$1E$2 - rus $5"]
- name: re_replace

View File

@@ -1,9 +1,9 @@
---
site: megabliz
name: Mega-Bliz
description: "Mega-Bliz is a Semi-Private site for MOVIES / TV / GENERAL"
description: "Mega-Bliz is a Private site for MOVIES / TV / GENERAL"
language: en-us
type: semi-private
type: private
encoding: UTF-8
links:
- https://mega-bliz.nl/

View File

@@ -39,9 +39,8 @@
search:
paths:
- path: torrents.php
method: post
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
$raw: "{{range .Categories}}cat={{.}}&{{end}}"
search: "{{if .Query.IMDBID}}{{ .Query.IMDBID }}{{else}}{{ .Keywords }}{{end}}"
search_area: "{{ if .Query.IMDBID }}4{{else}}0{{end}}"
search_mode: 0
@@ -54,7 +53,7 @@
- name: andmatch
fields:
title:
selector: td.name > div > a.poster-preview[title]
selector: td.name > div > a[href*="-torrent-"][title]
attribute: title
category:
selector: td.category > a
@@ -63,35 +62,39 @@
- name: querystring
args: cat
details:
selector: td.name > div > a.poster-preview[title]
selector: td.name > div > a[href*="-torrent-"][title]
attribute: href
banner:
selector: td.name > a.poster-preview img
attribute: src
comments:
selector: a[href*="#comments"]
attribute: href
download:
selector: a.bookmark[onclick]
attribute: onclick
selector: td.name > div > a[href*="-torrent-"][title]
attribute: href
filters:
- name: replace
args: [",false)", ""]
- name: replace
args: ["return bookmark(", "download.php?id="]
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
grabs:
selector: td:nth-child(8)
- name: regexp
args: "-torrent-(\\d+).html"
- name: prepend
args: "download.php?id="
date:
selector: td:nth-child(4)
selector: td:nth-child(5)
filters:
- name: timeago
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(9)
downloadvolumefactor:
case:
"span.label:contains(\"Free\")": "0"
"span.label:contains(\"50%\")": "0.5"
"span.label:contains(\"30%\")": "0.7"
"*": "1"
uploadvolumefactor:
case:

View File

@@ -6,12 +6,10 @@
type: semi-private
encoding: windows-1251
links:
- https://nnm-club.me/
- http://nnmclub.to/
legacylinks:
- https://nnm-club.name/
certificates:
- 7877113458e90f3643dd28424657a29469f5dc55
- 0edfdcc8cf9f69dbe5473878145cae92504275b0
- https://nnm-club.me/
settings:
- name: username

View File

@@ -7,8 +7,6 @@
encoding: UTF-8
links:
- https://nyaa.si/
certificates:
- 3801e330482d4f9baef71ca4e33ba23ede74f59c # incomplete CA chain
settings:
- name: filter-id

View File

@@ -17,16 +17,17 @@
- {id: 21, cat: Movies/DVD, desc: "Movie DVD-9"}
- {id: 11, cat: Movies/DVD, desc: "Movie DVD-5"}
- {id: 20, cat: Movies/SD, desc: "Movie DVDRip"}
- {id: 45, cat: Movies, desc: "Movie RIP mp4"}
- {id: 22, cat: Movies/UHD, desc: "Movie 4K-Ultra-HD"}
- {id: 23, cat: Movies/HD, desc: "Movie H-265"}
- {id: 24, cat: Movies/HD, desc: "Movie 1080p"}
- {id: 25, cat: Movies/HD, desc: "Movie 720p"}
- {id: 26, cat: Movies/3D, desc: "Movie 3D-FullHD"}
- {id: 27, cat: Movies/BluRay, desc: "Movie Blu Ray Disk"}
- {id: 43, cat: Movies/SD, desc: "BMovie DRip"}
- {id: 27, cat: Movies/BluRay, desc: "Movie BluRay"}
- {id: 43, cat: Movies/SD, desc: "Movie BDRip"}
- {id: 29, cat: Movies/SD, desc: "Movie Cine News"}
- {id: 30, cat: TV/HD, desc: "Serie Tv HD"}
- {id: 31, cat: TV/SD, desc: "Serie Tv SD"}
- {id: 30, cat: TV/HD, desc: "Serie TV HD"}
- {id: 31, cat: TV/SD, desc: "Serie TV SD"}
- {id: 35, cat: TV/Other, desc: "Programmi TV"}
- {id: 42, cat: TV/Documentary, desc: "Documentari"}
# Music
@@ -46,6 +47,7 @@
- {id: 17, cat: Books, desc: "Edicola Riviste"}
- {id: 41, cat: Books, desc: "Edicola Fumetti"}
# Applicazioni
- {id: 4, cat: PC, desc: "IPTV"}
- {id: 7, cat: PC/0day, desc: "Applicazioni PC"}
- {id: 8, cat: PC/0day, desc: "Applicazioni Linux"}
- {id: 9, cat: PC/Mac, desc: "Applicazioni Mac"}
@@ -77,8 +79,19 @@
path: index.php
selector: a[href="logout.php"]
# download:
# before:
# path: thanks.php
# method: "post"
# inputs:
# infohash: "{{ .DownloadUri.Query.id }}"
# thanks: "1"
# rndval: "1487013827343"
# selector: a[href^="download.php?id="]
search:
paths:
# 30 entries per page
- path: index.php
inputs:
pages: 1
@@ -91,24 +104,6 @@
- path: index.php
inputs:
pages: 4
- path: index.php
inputs:
pages: 5
- path: index.php
inputs:
pages: 6
- path: index.php
inputs:
pages: 7
- path: index.php
inputs:
pages: 8
- path: index.php
inputs:
pages: 9
- path: index.php
inputs:
pages: 10
inputs:
search: "{{ .Keywords }}"
category: "{{range .Categories}}{{.}};{{end}}"
@@ -124,41 +119,16 @@
- name: re_replace # S01E01 to 1 1
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
rows:
selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
selector: table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
filters:
- name: andmatch
fields:
download:
# selector: a[href^="index.php?page=downloadcheck&id="]
selector: a[href^="download.php?id="]
attribute: href
title: # shortened title?
selector: td:nth-child(2)
filters:
- name: re_replace # replace special characters with " " (space)
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
- name: re_replace # replace multiple spaces
args: ["[ ]{2,}", " "]
# normalize to SXXEYY format
- name: re_replace # S01 E01 to S01E01
args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"]
- name: re_replace # 01x01 to S01E01
args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"]
- name: re_replace # 1x01 to S01E01
args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"]
- name: re_replace # Stagione X --> S0X
args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"]
- name: re_replace # Stagione XX --> SXX
args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"]
- name: re_replace # Episodio 4 to E4
args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"]
- name: re_replace # Episodi 4 5 to E04-05
args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"]
- name: re_replace # rimozioni varie
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
title: # long titles?
optional: true
selector: td:nth-child(2)
attribute: title
title:
selector: a[href^="index.php?page=torrent-details&id="]
filters:
- name: re_replace # replace special characters with " " (space)
args: ["[^a-zA-Z0-9\\s]|\\.", " "]
@@ -182,7 +152,7 @@
- name: re_replace # rimozioni varie
args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""]
category:
selector: td:nth-child(1) a[href^="index.php?page=torrents&category="]
selector: a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
@@ -198,21 +168,32 @@
- name: regexp
args: "src=(.+?) "
size:
selector: td:nth-last-child(3)
date:
selector: td[width="85"] # some users have an extra uploader column between the grabs and size column, see #4435
filters:
- name: dateparse
args: "02/01/2006"
grabs:
selector: td[width="85"] + td + td + td
selector: td:has(a[href^="index.php?page=torrent-details&id="]) p:nth-of-type(2)
filters:
- name: replace
args: ["---", "0"]
args: [" \xA0 ", " "]
- name: regexp
args: " (.*?)$"
date:
selector: td:has(a[href^="index.php?page=torrent-details&id="]) p:nth-of-type(3)
filters:
- name: replace
args: ["\xA0 ", " "]
- name: regexp
args: " (.*?)$"
- name: dateparse
args: "15:04:05 02/01/2006"
seeders:
selector: td[width="85"] + td
selector: td:has(a[href^="index.php?page=torrent-details&id="]) p:nth-of-type(4) a:nth-of-type(1)
filters:
leechers:
selector: td[width="85"] + td + td
selector: td:has(a[href^="index.php?page=torrent-details&id="]) p:nth-of-type(4) a:nth-of-type(2)
filters:
grabs:
text: 0
grabs:
optional: true
selector: td:has(a[href^="index.php?page=torrent-details&id="]) p:nth-of-type(4) a:nth-of-type(3)
downloadvolumefactor:
case:
img[alt="Free Leech"]: "0"

View File

@@ -0,0 +1,162 @@
---
site: siambit
name: SiamBIT
description: "SiamBIT is a THAI Private Torrent Tracker for GENERAL"
language: th-th
type: private
encoding: tis-620
links:
- https://www.siambit.me/
caps:
categorymappings:
- {id: 1, cat: Other, desc: "@ King"}
- {id: 75, cat: PC/0day, desc: "OS Windows / Office"}
- {id: 10, cat: TV, desc: "Cartoons / Animation"}
- {id: 9, cat: TV/Sport, desc: "Sports / Football"}
- {id: 110, cat: PC/Games, desc: "Mobile games"}
- {id: 7, cat: PC/Games, desc: "Games"}
- {id: 40, cat: Audio/Video, desc: "clips"}
- {id: 16, cat: Audio/Video, desc: "Concert"}
- {id: 3, cat: Audio/Other, desc: "Karaoke / MV"}
- {id: 70, cat: PC, desc: "software AntiVirus / Antispyware"}
- {id: 100, cat: PC/Phone-Other, desc: "software Mobile / Theme / Ringtone / mv"}
- {id: 85, cat: PC/Mac, desc: "Mac software"}
- {id: 105, cat: PC, desc: "Linux software"}
- {id: 8, cat: PC, desc: "software"}
- {id: 56, cat: Other, desc: "Dictionary / map"}
- {id: 19, cat: TV, desc: "Talk show / comedy / radio"}
- {id: 20, cat: TV, desc: "general"}
- {id: 55, cat: PC/Phone-IOS, desc: "Tablet / iPhone"}
- {id: 21, cat: TV, desc: "Dharma"}
- {id: 2, cat: Audio/MP3, desc: "Music"}
- {id: 130, cat: Audio/Audiobook, desc: "High quality music (Lossless)"}
- {id: 60, cat: Other, desc: "fonts / icons / clip art / templates"}
- {id: 90, cat: Movies/UHD, desc: "4K UHD movies"}
- {id: 91, cat: Movies/DVD, desc: "DVD movies"}
- {id: 92, cat: Movies/HD, desc: "Hi-Def movies"}
- {id: 89, cat: Movies/SD, desc: "VCD movies"}
- {id: 93, cat: TV, desc: "Mother and child @ / Learning materials for children"}
- {id: 4, cat: TV, desc: "TV shows / Variety / Game shows"}
- {id: 50, cat: Other, desc: "Images"}
- {id: 18, cat: Other, desc: "website"}
- {id: 17, cat: TV/Documentary, desc: "Documentary"}
- {id: 11, cat: Books/Technical, desc: "Learning materials / Books / Ebook"}
- {id: 5, cat: Movies, desc: "Movies / series [Korea]"}
- {id: 54, cat: Movies, desc: "Movies / Series [China]"}
- {id: 51, cat: Movies, desc: "Movie series / series [Japan]"}
- {id: 52, cat: Movies, desc: "Movies / Series [Western]"}
- {id: 57, cat: Movies, desc: "Movies / series [other]"}
- {id: 53, cat: Movies, desc: "Movie series / series / drama [Thai]"}
- {id: 901, cat: XXX, desc: "XXX-Anime"}
- {id: 902, cat: XXX, desc: "XXX-Game"}
- {id: 903, cat: XXX, desc: "XXX-Japan censored"}
- {id: 904, cat: XXX, desc: "XXX-Japan"}
- {id: 905, cat: XXX, desc: "XXX-Guava"}
- {id: 906, cat: XXX, desc: "XXX-Asia censored"}
- {id: 907, cat: XXX, desc: "XXX-Asia"}
- {id: 908, cat: XXX, desc: "XXX-Gay"}
- {id: 910, cat: XXX, desc: "XXX-clip"}
- {id: 911, cat: XXX, desc: "XXX-pictures"}
- {id: 912, cat: XXX, desc: "XXX-magazine"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.text
test:
path: nDonated.php
selector: a[href="logout.php"]
search:
paths:
- path: viewno18.php
categorymappings: ["!", 901, 902, 903, 904, 905, 906, 907, 908, 910, 911, 912]
- path: viewbr.php
categorymappings: [901, 902, 903, 904, 905, 906, 907, 908, 910, 911, 912]
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
searchin: 0
rows:
selector: table[width="100%"][border="1"][cellspacing="0"][cellpadding="5"] > tbody > tr:has(a[href^="downloadnew.php?id="])
fields:
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="viewno18.php?cat="], a[href^="viewbr.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="downloadnew.php?id="]
attribute: href
imdb:
optional: true
selector: a[href*="www.imdb.com/title/"]
attribute: href
files:
selector: td:nth-child(5)
date:
selector: td:nth-child(7)
filters:
- name: dateparse
args: "02-01-200615:04:05"
size:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(9)
filters:
- name: regexp
args: (\d+)
seeders:
selector: td:nth-child(10)
leechers:
selector: td:nth-child(11)
downloadvolumefactor:
case:
"td:nth-child(3):contains(\"100%\")": "0"
"td:nth-child(3):contains(\"95%\")": "0.05"
"td:nth-child(3):contains(\"90%\")": "0.1"
"td:nth-child(3):contains(\"85%\")": "0.15"
"td:nth-child(3):contains(\"80%\")": "0.2"
"td:nth-child(3):contains(\"75%\")": "0.25"
"td:nth-child(3):contains(\"70%\")": "0.3"
"td:nth-child(3):contains(\"65%\")": "0.35"
"td:nth-child(3):contains(\"60%\")": "0.4"
"td:nth-child(3):contains(\"55%\")": "0.45"
"td:nth-child(3):contains(\"50%\")": "0.5"
"td:nth-child(3):contains(\"45%\")": "0.55"
"td:nth-child(3):contains(\"40%\")": "0.6"
"td:nth-child(3):contains(\"35%\")": "0.65"
"td:nth-child(3):contains(\"30%\")": "0.7"
"td:nth-child(3):contains(\"25%\")": "0.75"
"td:nth-child(3):contains(\"20%\")": "0.8"
"td:nth-child(3):contains(\"15%\")": "0.85"
"td:nth-child(3):contains(\"10%\")": "0.9"
"td:nth-child(3):contains(\"5%\")": "0.95"
"*": "1"
uploadvolumefactor:
case:
"td:nth-child(4):contains(\"x2\")": "2"
"td:nth-child(4):contains(\"x3\")": "3"
"td:nth-child(4):contains(\"x4\")": "4"
"td:nth-child(4):contains(\"x5\")": "5"
"td:nth-child(4):contains(\"x6\")": "6"
"td:nth-child(4):contains(\"x7\")": "7"
"td:nth-child(4):contains(\"x8\")": "8"
"td:nth-child(4):contains(\"x9\")": "9"
"*": "1"

View File

@@ -6,9 +6,9 @@
type: public
encoding: UTF-8
links:
- https://www.skytorrents.to/
legacylinks:
- https://www.skytorrents.lol/
legacylinks:
- https://www.skytorrents.to/
caps:
categories:
@@ -29,23 +29,23 @@
movie-search: [q]
settings:
- name: btdb.eu-links
- name: itorrents-links
type: checkbox
label: Add download links via btdb.eu
label: Add download links via itorrents.org
default: true
- name: info
type: info
label: btdb.eu Note
default: Without the btdb.eu option only magnet links will be provided.
label: ITorrents Note
default: Without the itorrents option only magnet links will be provided.
search:
# https://www.skytorrents.lol/?search=mr+mercedes+s02e05&sort=created
# https://www.skytorrents.lol/?query=mr+mercedes+s02e05&sort=created
# https://www.skytorrents.lol/top100
paths:
- path: "{{ if .Keywords }}?search={{ .Keywords }}&sort=created{{else}}top100{{end}}"
- path: "{{ if .Keywords }}?search={{ .Keywords }}&sort=created&page=2{{else}}{{end}}"
- path: "{{ if .Keywords }}?search={{ .Keywords }}&sort=created&page=3{{else}}{{end}}"
- path: "{{ if .Keywords }}?search={{ .Keywords }}&sort=created&page=4{{else}}{{end}}"
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created{{else}}top100{{end}}"
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=2{{else}}{{end}}"
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=3{{else}}{{end}}"
- path: "{{ if .Keywords }}?query={{ .Keywords }}&sort=created&page=4{{else}}{{end}}"
rows:
selector: tr.result
fields:
@@ -62,11 +62,11 @@
details:
selector: td a
attribute: href
download-btdb.eu:
selector: a[href^="//btdb.eu"]
download-itorrents:
selector: a[href^="//itorrents"]
attribute: href
download:
text: "{{if .Config.btdb.eu-links}}{{ .Result.download-btdb.eu }}{{else}}{{end}}"
text: "{{if .Config.itorrents-links}}{{ .Result.download-itorrents }}{{else}}{{end}}"
magnet:
selector: a[href^="magnet:?"]
attribute: href

View File

@@ -38,7 +38,8 @@
selector: div[role="listitem"]:has(a[href^="magnet:?xt="])
fields:
title:
selector: div[class$="__title"] h3
selector: div[class$="__title"] a[title]
attribute: title
details:
selector: div[class$="__title"] a
attribute: href
@@ -62,12 +63,13 @@
- name: regexp
args: "(\\d+ \\w+ \\w+)"
seeders:
selector: div.v-list__tile__content div:nth-of-type(3) span:nth-child(1)
selector: div.v-list__tile__sub-title span.green--text
leechers:
selector: div.v-list__tile__content div:nth-of-type(3) span:nth-child(2)
selector: div.v-list__tile__sub-title span.red--text
grabs:
selector: div.v-list__tile__sub-title span:last-of-type
size:
selector: div.v-list__tile__content div:nth-of-type(3)
remove: span
selector: div.v-list__tile__sub-title:last-of-type strong
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -0,0 +1,527 @@
---
site: tapochek
name: Tapochek
description: "Tapochek is a RUSSIAN Private Torrent Tracker for 0DAY / GENERAL"
language: ru-ru
type: private
encoding: windows-1251
links:
- https://tapochek.net/
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: striprussian
type: checkbox
label: Strip Russian Letters
default: false
caps:
categorymappings:
# PC Games
# Игры для PC
- {id: 2, cat: PC/Games, desc: "Игры для PC (общее)"}
- {id: 14, cat: PC/Games, desc: "Альфа-, Бета- и Демо-версии"}
- {id: 314, cat: PC/Games, desc: "NoCD/ NoDVD"}
- {id: 13, cat: PC/Games, desc: "Русификаторы"}
- {id: 12, cat: PC/Games, desc: "Патчи"}
- {id: 11, cat: PC/Games, desc: "Чит-программы и трейнеры"}
- {id: 10, cat: PC/Games, desc: "Дополнения для игр"}
- {id: 9, cat: PC/Games, desc: "Игровые журналы и приложенные материалы"}
- {id: 712, cat: PC/Games, desc: "Гайды, бонусные диски и другие дополнительные материалы"}
- {id: 18, cat: PC/Games, desc: "Горячие новинки"}
- {id: 808, cat: PC/Games, desc: "Репаки от R.G. Механики"}
- {id: 809, cat: PC/Games, desc: "Горячие новинки от R.G. Механики"}
- {id: 810, cat: PC/Games, desc: "Аркады от R.G. Механики"}
- {id: 811, cat: PC/Games, desc: "Приключения и квесты от R.G. Механики"}
- {id: 812, cat: PC/Games, desc: "Стратегии от R.G. Механики"}
- {id: 813, cat: PC/Games, desc: "Симуляторы от R.G. Механики"}
- {id: 814, cat: PC/Games, desc: "Action от R.G. Механики"}
- {id: 815, cat: PC/Games, desc: "RPG от R.G. Механики"}
- {id: 903, cat: PC/Games, desc: "jRPG от R.G. Механики"}
- {id: 887, cat: PC/Games, desc: "Раздачи от R.G. Игроманы"}
- {id: 888, cat: PC/Games, desc: "Аркады от R.G. Игроманы"}
- {id: 889, cat: PC/Games, desc: "Приключения и квесты от R.G. Игроманы"}
- {id: 890, cat: PC/Games, desc: "Стратегии от R.G. Игроманы"}
- {id: 891, cat: PC/Games, desc: "Симуляторы от R.G. Игроманы"}
- {id: 892, cat: PC/Games, desc: "Action от R.G. Игроманы"}
- {id: 893, cat: PC/Games, desc: "RPG от R.G. Игроманы"}
- {id: 913, cat: PC/Games, desc: "Раздачи от R.G. GOGFAN"}
- {id: 935, cat: PC/Games, desc: "Ранний доступ от R.G. GOGFAN"}
- {id: 914, cat: PC/Games, desc: "Аркады от R.G. GOGFAN"}
- {id: 915, cat: PC/Games, desc: "Приключения и квесты от R.G. GOGFAN"}
- {id: 931, cat: PC/Games, desc: "Стратегии от R.G. GOGFAN"}
- {id: 930, cat: PC/Games, desc: "Симуляторы от R.G. GOGFAN"}
- {id: 929, cat: PC/Games, desc: "Action от R.G. GOGFAN"}
- {id: 928, cat: PC/Games, desc: "RPG от R.G. GOGFAN"}
- {id: 24, cat: PC/Games, desc: "Приключения и квесты"}
- {id: 25, cat: PC/Games, desc: "Стратегии"}
- {id: 28, cat: PC/Games, desc: "RTS (стратегии в реальном времени)"}
- {id: 27, cat: PC/Games, desc: "TBS (пошаговые стратегии)"}
- {id: 26, cat: PC/Games, desc: "Wargame"}
- {id: 238, cat: PC/Games, desc: "Экономические стратегии"}
- {id: 19, cat: PC/Games, desc: "Аркады"}
- {id: 23, cat: PC/Games, desc: "Аркады (разное)"}
- {id: 22, cat: PC/Games, desc: "Логические аркады"}
- {id: 21, cat: PC/Games, desc: "Настольные и карточные аркады"}
- {id: 20, cat: PC/Games, desc: "Мини/флеш-игры"}
- {id: 29, cat: PC/Games, desc: "Симуляторы"}
- {id: 31, cat: PC/Games, desc: "Авиасимуляторы"}
- {id: 34, cat: PC/Games, desc: "Спортивные симуляторы"}
- {id: 33, cat: PC/Games, desc: "Космические симуляторы"}
- {id: 32, cat: PC/Games, desc: "Гоночные симуляторы"}
- {id: 30, cat: PC/Games, desc: "Другие симуляторы"}
- {id: 35, cat: PC/Games, desc: "Action"}
- {id: 39, cat: PC/Games, desc: "FPS (1st Person)"}
- {id: 38, cat: PC/Games, desc: "TPS (3rd Person)"}
- {id: 37, cat: PC/Games, desc: "Stealth Action"}
- {id: 36, cat: PC/Games, desc: "Тактические шутеры"}
- {id: 40, cat: PC/Games, desc: "RPG"}
- {id: 41, cat: PC/Games, desc: "Эротические игры"}
- {id: 43, cat: PC/Games, desc: "Эротические"}
- {id: 42, cat: PC/Games, desc: "Хентайные"}
- {id: 44, cat: PC/Games, desc: "Многопользовательские игры"}
- {id: 45, cat: PC/Games, desc: "MMORPG"}
- {id: 46, cat: PC/Games, desc: "Для самых маленьких"}
# Games for Consoles
# Игры для Консолей
- {id: 69, cat: Console/Xbox, desc: "Xbox"}
- {id: 86, cat: Console/Xbox 360, desc: "XBox360 | Игры"}
- {id: 646, cat: Console/Xbox 360, desc: "XBox360 | JTAG"}
- {id: 87, cat: Console/Xbox 360, desc: "XBox360 | 360E"}
- {id: 89, cat: Console/Xbox 360, desc: "XBox360 | Demo"}
- {id: 612, cat: Console/Xbox 360, desc: "XBox360 | Live"}
- {id: 614, cat: Console/Xbox 360, desc: "XBox360 | Soft"}
- {id: 88, cat: Console/Xbox, desc: "XBox | Игры"}
- {id: 85, cat: Console/Xbox, desc: "Прочее | Архив (XBox)"}
- {id: 70, cat: Console/PSP, desc: "PlayStation"}
- {id: 910, cat: Console/PS4, desc: "PS4 | Игры"}
- {id: 911, cat: Console/PS4, desc: "PS4 | Сцена"}
- {id: 689, cat: Console/PS3, desc: "PS3 | Игры"}
- {id: 818, cat: Console/PS3, desc: "PS3 | Сцена"}
- {id: 696, cat: Console/PSP, desc: "PSN | Игры"}
- {id: 853, cat: Console/PS3, desc: "PS3 | Emulation"}
- {id: 904, cat: Console/PS Vita, desc: "PS Vita | Игры"}
- {id: 102, cat: Console/PSP, desc: "PSP | Игры"}
- {id: 103, cat: Console/PS3, desc: "PS2 | Игры"}
- {id: 104, cat: Console/PSP, desc: "PSX | Игры"}
- {id: 435, cat: Console/PSP, desc: "PSP | Сцена"}
- {id: 105, cat: Console/PSP, desc: "PSP | PSX-PSP"}
- {id: 690, cat: Console/PS3, desc: "PS3 | Прочее"}
- {id: 178, cat: Console/PSP, desc: "PSP | Прочее"}
- {id: 101, cat: Console/PSP, desc: "Архив (PS)"}
- {id: 78, cat: Console/NDS, desc: "Nintendo"}
- {id: 148, cat: Console/NDS, desc: "Архив (Nintendo)"}
- {id: 116, cat: Console/NDS, desc: "NDS | Игры"}
- {id: 885, cat: Console/3DS, desc: "3DS | Игры"}
- {id: 912, cat: Console, desc: "Switch | Игры"}
- {id: 115, cat: Console/Wii, desc: "Wii | Игры"}
- {id: 899, cat: Console/WiiU, desc: "Wii U | Игры"}
- {id: 900, cat: Console/WiiU, desc: "Wii U | Сцена"}
- {id: 381, cat: Console/Wiiware/VC, desc: "WiiWare | Игры"}
- {id: 382, cat: Console, desc: "GameCube | Игры"}
- {id: 349, cat: Console, desc: "Sega"}
- {id: 350, cat: Console, desc: "Dreamcast | Игры"}
- {id: 351, cat: Console, desc: "Saturn | Игры"}
- {id: 352, cat: Console, desc: "Игры для старых консолей"}
- {id: 390, cat: Console, desc: "Коллекции (игры для разных платформ)"}
# Games for macOS and Linux
# Игры для macOS и Linux
- {id: 936, cat: PC/Games, desc: "Горячие новинки игр для macOS и Linux"}
- {id: 129, cat: PC/Games, desc: "Игры для Linux от R.G. GOGFAN"}
- {id: 874, cat: PC/Games, desc: "[Linux] Аркады от R.G. GOGFAN"}
- {id: 695, cat: PC/Games, desc: "[Linux] Приключения и квесты от R.G. GOGFAN"}
- {id: 873, cat: PC/Games, desc: "[Linux] Стратегии от R.G. GOGFAN"}
- {id: 872, cat: PC/Games, desc: "[Linux] Симуляторы от R.G. GOGFAN"}
- {id: 871, cat: PC/Games, desc: "[Linux] Action от R.G. GOGFAN"}
- {id: 932, cat: PC/Games, desc: "[Linux] RPG от R.G. GOGFAN"}
- {id: 861, cat: PC/Games, desc: "Игры для macOS от R.G. GOGFAN"}
- {id: 862, cat: PC/Games, desc: "[macOS] Аркады от R.G. GOGFAN"}
- {id: 875, cat: PC/Games, desc: "[macOS] Приключения и квесты от R.G. GOGFAN"}
- {id: 876, cat: PC/Games, desc: "[macOS] Стратегии от R.G. GOGFAN"}
- {id: 877, cat: PC/Games, desc: "[macOS] Симуляторы от R.G. GOGFAN"}
- {id: 878, cat: PC/Games, desc: "[macOS] Action от R.G. GOGFAN"}
- {id: 933, cat: PC/Games, desc: "[macOS] RPG от R.G. GOGFAN"}
# Cinema
# Кинематограф
- {id: 429, cat: Movies, desc: "Новинки кинематографа"}
- {id: 886, cat: Movies/3D, desc: "Новинки (3D)"}
- {id: 703, cat: Movies, desc: "Экранки и Low-рипы (CAMRip, TS, WEBRip)"}
- {id: 430, cat: Movies, desc: "Новинки 2018-2019 (Rips)"}
- {id: 431, cat: Movies/WEBDL, desc: "Новинки 2018-2019 (Web-DL, HD Rips)"}
- {id: 934, cat: Movies/BluRay, desc: "Новинки 2018-2019 (Blu-Ray и BDRemux)"}
- {id: 908, cat: Movies, desc: "Экранки и Low-рипы с рекламой"}
- {id: 909, cat: Movies/HD, desc: "Новинки 2018-2019 (HD и HD Rips) с рекламой"}
- {id: 74, cat: Movies/Foreign, desc: "Зарубежное кино"}
- {id: 121, cat: Movies/BluRay, desc: "Зарубежное кино | Blu-Ray и BDRemux"}
- {id: 122, cat: Movies/HD, desc: "Зарубежное кино | HD Rips"}
- {id: 123, cat: Movies/DVD, desc: "Зарубежное кино | DVD"}
- {id: 124, cat: Movies/Foreign, desc: "Зарубежное кино | Rips"}
- {id: 75, cat: Movies, desc: "Отечественное кино"}
- {id: 127, cat: Movies/BluRay, desc: "Отечественное кино | Blu-Ray и BDRemux"}
- {id: 128, cat: Movies/HD, desc: "Отечественное кино | HD Rips"}
- {id: 130, cat: Movies/DVD, desc: "Российское кино | DVD"}
- {id: 131, cat: Movies, desc: "Российское кино | Rips"}
- {id: 133, cat: Movies/DVD, desc: "Советское кино | DVD"}
- {id: 135, cat: Movies, desc: "Советское кино | Rips"}
- {id: 869, cat: Movies/3D, desc: "3D"}
- {id: 161, cat: TV/FOREIGN, desc: "Зарубежные сериалы"}
- {id: 160, cat: TV, desc: "Отечественные cериалы"}
- {id: 320, cat: TV, desc: "Мультфильмы"}
- {id: 938, cat: TV/HD, desc: "Мультфильмы | Blu-Ray и BDRemux"}
- {id: 324, cat: TV/HD, desc: "Мультфильмы | HD Rips"}
- {id: 325, cat: TV/SD, desc: "Мультфильмы | DVD"}
- {id: 326, cat: TV, desc: "Отечественные мультфильмы | Rips"}
- {id: 327, cat: TV, desc: "Отечественные короткометражные мультфильмы"}
- {id: 328, cat: TV, desc: "Зарубежные мультфильмы | Rips"}
- {id: 329, cat: TV, desc: "Зарубежные короткометражные мультфильмы"}
- {id: 330, cat: TV, desc: "Сборники мультфильмов"}
- {id: 321, cat: TV, desc: "Мультсериалы"}
- {id: 162, cat: TV/Documentary, desc: "Документальные фильмы и телепередачи"}
- {id: 392, cat: TV, desc: "Развлекательные телепередачи и шоу"}
# Anime
# Аниме
- {id: 693, cat: TV/Anime, desc: "Аниме (Основной)"}
- {id: 684, cat: TV/Anime, desc: "Аниме (DVD)"}
- {id: 677, cat: TV/Anime, desc: "Аниме DVD [Бутлег]"}
- {id: 96, cat: TV/Anime, desc: "Аниме DVD [Лицензии]"}
- {id: 678, cat: TV/Anime, desc: "Аниме (HD и Blu-ray)"}
- {id: 660, cat: TV/Anime, desc: "Аниме Blu-ray и Remux"}
- {id: 95, cat: TV/Anime, desc: "Аниме HD Rips"}
- {id: 106, cat: TV/Anime, desc: "Аниме Манга и прочий арт"}
- {id: 109, cat: TV/Anime, desc: "Аниме Манга"}
- {id: 107, cat: TV/Anime, desc: "Аниме Обои, артбуки и др."}
- {id: 685, cat: TV/Anime, desc: "Аниме Азиатские мультфильмы"}
- {id: 687, cat: TV/Anime, desc: "Аниме DVD"}
- {id: 686, cat: TV/Anime, desc: "Аниме Rips"}
- {id: 688, cat: TV/Anime, desc: "Аниме HD Rips"}
- {id: 680, cat: TV/Anime, desc: "Аниме (Хентай)"}
- {id: 681, cat: TV/Anime, desc: "Аниме Censored"}
- {id: 682, cat: TV/Anime, desc: "Аниме UnCensored"}
- {id: 683, cat: TV/Anime, desc: "Аниме PtCensored"}
- {id: 697, cat: TV/Anime, desc: "Аниме Манга, обои, артбуки и др."}
# Music and Music Video
# Музыка и Музыкальное видео
- {id: 451, cat: Audio/Lossless, desc: "Классическая музыка (lossless)"}
- {id: 452, cat: Audio/Lossless, desc: "Классическая музыка в современной обработке (lossless)"}
- {id: 453, cat: Audio/MP3, desc: "Классическая музыка (mp3)"}
- {id: 454, cat: Audio/MP3, desc: "Классическая музыка в современной обработке (mp3)"}
- {id: 455, cat: Audio/Video, desc: "Классическая музыка (video)"}
- {id: 457, cat: Audio/Lossless, desc: "Зарубежный Jazz, Blues (lossless)"}
- {id: 458, cat: Audio/Lossless, desc: "Отечественный Jazz, Blues (lossless)"}
- {id: 459, cat: Audio/MP3, desc: "Зарубежный Jazz, Blues (mp3)"}
- {id: 460, cat: Audio/MP3, desc: "Отечественный Jazz, Blues (mp3)"}
- {id: 461, cat: Audio/Video, desc: "Jazz, Blues (video)"}
- {id: 463, cat: Audio/Lossless, desc: "Зарубежный Reggae, Ska, Dub (lossless)"}
- {id: 464, cat: Audio/Lossless, desc: "Отечественный Reggae, Ska, Dub (lossless)"}
- {id: 465, cat: Audio/MP3, desc: "Зарубежный Reggae, Ska, Dub (mp3)"}
- {id: 466, cat: Audio/MP3, desc: "Отечественный Reggae, Ska, Dub (mp3)"}
- {id: 467, cat: Audio/Video, desc: "Reggae, Ska, Dub (video)"}
- {id: 469, cat: Audio/Lossless, desc: "Rосk (losslеss)"}
- {id: 470, cat: Audio/Lossless, desc: "Mеtаl (losslеss)"}
- {id: 471, cat: Audio/Lossless, desc: "Аltеrnаtivе, Рunk, Indереndеnt (lоsslеss)"}
- {id: 472, cat: Audio/MP3, desc: "Rосk (mр3)"}
- {id: 473, cat: Audio/MP3, desc: "Mеtаl (mр3)"}
- {id: 474, cat: Audio/MP3, desc: "Аltеrnаtivе, Рunk, Indереndеnt (mр3)"}
- {id: 475, cat: Audio/Video, desc: "Зарубежный Rock (video)"}
- {id: 477, cat: Audio/Lossless, desc: "Rосk, Punk, Alternative (losslеss)"}
- {id: 478, cat: Audio, desc: "Mеtаl (losslеss)"}
- {id: 479, cat: Audio/MP3, desc: "Rосk, Punk, Alternative (mр3)"}
- {id: 480, cat: Audio/MP3, desc: "Mеtаl (mр3)"}
- {id: 481, cat: Audio/Video, desc: "Отечественный Rock (video)"}
- {id: 483, cat: Audio/Lossless, desc: "Зарубежная Поп-музыка (lossless)"}
- {id: 484, cat: Audio/Lossless, desc: "Отечественная Поп-музыка (lossless)"}
- {id: 485, cat: Audio/Lossless, desc: "Eurodance, Technopop, Disco (lossless)"}
- {id: 486, cat: Audio/MP3, desc: "Зарубежная Поп-музыка (mp3)"}
- {id: 487, cat: Audio/MP3, desc: "Отечественная Поп-музыка (mp3)"}
- {id: 488, cat: Audio/MP3, desc: "Eurodance, Technopop, Disco (mp3)"}
- {id: 489, cat: Audio/MP3, desc: "Поп-музыка, Eurodance, Disco (официальные сборники) (mp3)"}
- {id: 490, cat: Audio/Video, desc: "Поп-музыка, Eurodance, Disco (video)"}
- {id: 492, cat: Audio/Lossless, desc: "Фольклор, Народная и Этническая музыка (lossless)"}
- {id: 493, cat: Audio/MP3, desc: "Фольклор, Народная и Этническая музыка (mp3)"}
- {id: 494, cat: Audio/Video, desc: "Фольклор, Народная и Этническая музыка (video)"}
- {id: 496, cat: Audio/Lossless, desc: "NewAge, Meditative (lossless)"}
- {id: 497, cat: Audio/Lossless, desc: "Flamenco, Акустическая гитара (lossless)"}
- {id: 498, cat: Audio/MP3, desc: "NewAge, Meditative (mp3)"}
- {id: 499, cat: Audio/MP3, desc: "Flamenco, Акустическая гитара (mp3)"}
- {id: 500, cat: Audio/Video, desc: "New Age, Relax, Meditative &amp; Flamenco (video)"}
- {id: 501, cat: Audio, desc: "Звуки природы"}
- {id: 502, cat: Audio, desc: сихоактивныe аудиопрограммы"}
- {id: 504, cat: Audio/Lossless, desc: "Зарубежный Rap, Hip-Hop, R&#039;n&#039;B (lossless)"}
- {id: 505, cat: Audio/Lossless, desc: "Отечественный Rap, Hip-Hop, R&#039;n&#039;B (lossless)"}
- {id: 506, cat: Audio/MP3, desc: "Зарубежный Rap, Hip-Hop, R&#039;n&#039;B (mp3)"}
- {id: 507, cat: Audio/MP3, desc: "Отечественный Rap, Hip-Hop, R&#039;n&#039;B (mp3)"}
- {id: 508, cat: Audio/Video, desc: "Rap, Hip-Hop, R&#039;n&#039;B (video)"}
- {id: 510, cat: Audio/Lossless, desc: "Trance, Goa Trance, Psy-Trance, PsyChill, Ambient Dub (lossl.."}
- {id: 511, cat: Audio/Lossless, desc: "House, Techno, Hardcore, Hardstyle, Jumpstyle (lossless)"}
- {id: 512, cat: Audio/Lossless, desc: "Drum &amp; Bass, Jungle, Breakbeat, Dubstep, IDM (lossless)"}
- {id: 513, cat: Audio/Lossless, desc: "Chillout, Lounge, Downtempo, Trip-Hop (lossless)"}
- {id: 514, cat: Audio/Lossless, desc: "Traditional Electronic, Ambient, Experimental (lossless)"}
- {id: 515, cat: Audio, desc: "Industrial, Noise, EBM, Dark Electro, Aggrotech, Synthpop, N.."}
- {id: 516, cat: Audio/MP3, desc: "Trance, Goa Trance, Psy-Trance, PsyChill, Ambient Dub (mp3)"}
- {id: 517, cat: Audio/MP3, desc: "House, Techno, Hardcore, Hardstyle, Jumpstyle (mp3)"}
- {id: 518, cat: Audio/MP3, desc: "Drum &amp; Bass, Jungle, Breakbeat, Dubstep, IDM (mp3)"}
- {id: 519, cat: Audio/MP3, desc: "Chillout, Lounge, Downtempo, Trip-Hop (mp3)"}
- {id: 520, cat: Audio/MP3, desc: "Traditional Electronic, Ambient, Experimental (mp3)"}
- {id: 521, cat: Audio, desc: "Industrial, Noise, EBM, Dark Electro, Aggrotech, Synthpop, N.."}
- {id: 522, cat: Audio/Video, desc: "Электронная музыка (video)"}
- {id: 524, cat: Audio/Lossless, desc: "Зарубежный шансон (lossless)"}
- {id: 525, cat: Audio/Lossless, desc: "Отечественный шансон (lossless)"}
- {id: 526, cat: Audio/Lossless, desc: "Авторская песня (lossless)"}
- {id: 527, cat: Audio/Lossless, desc: "Военная песня (lossless)"}
- {id: 528, cat: Audio/MP3, desc: "Зарубежный шансон (mp3)"}
- {id: 529, cat: Audio/MP3, desc: "Отечественный шансон (mp3)"}
- {id: 530, cat: Audio, desc: "Отечественный шансон (официальные сборники) (mp3)"}
- {id: 531, cat: Audio/MP3, desc: "Авторская песня (mp3)"}
- {id: 532, cat: Audio/MP3, desc: "Военная песня (mp3)"}
- {id: 533, cat: Audio/Video, desc: "Шансон, Авторская и Военная песня (video)"}
- {id: 402, cat: Audio/Lossless, desc: "Саундтреки к фильмам и мультфильмам (lossless)"}
- {id: 403, cat: Audio/Lossless, desc: "Саундтреки к аниме (lossless)"}
- {id: 399, cat: Audio/Lossless, desc: "Саундтреки к играм (lossless)"}
- {id: 401, cat: Audio/MP3, desc: "Саундтреки к фильмам и мультфильмам (mp3)"}
- {id: 404, cat: Audio/MP3, desc: "Саундтреки к аниме (mp3)"}
- {id: 400, cat: Audio/MP3, desc: "Саундтреки к играм (mp3)"}
- {id: 535, cat: Audio/Lossless, desc: "Зарубежная музыка других жанров (lossless)"}
- {id: 536, cat: Audio/Lossless, desc: "Отечественная музыка других жанров (lossless)"}
- {id: 537, cat: Audio/MP3, desc: "Зарубежная музыка других жанров (mp3)"}
- {id: 538, cat: Audio/MP3, desc: "Отечественная музыка других жанров (mp3)"}
- {id: 539, cat: Audio/Video, desc: "Музыка других жанров (video)"}
- {id: 540, cat: Audio, desc: "Караоке и минусовки (фонограммы)"}
- {id: 541, cat: Audio, desc: "Сборники песен для детей"}
- {id: 542, cat: Audio, desc: "Неофициальные и внежанровые сборники"}
- {id: 543, cat: Audio, desc: "Неофициальные кинематографические видео"}
- {id: 545, cat: Audio, desc: "Многоканальная музыка"}
- {id: 546, cat: Audio, desc: "Собственные оцифровки"}
- {id: 547, cat: Audio, desc: "Hi-Res stereo"}
# Software
# Программное обеспечение
- {id: 202, cat: PC/Mac, desc: "Mac OS (для Apple Macintosh)"}
- {id: 203, cat: PC/Mac, desc: "Mac OS (для РС-Hackintosh)"}
- {id: 204, cat: PC/Mac, desc: "Программы для просмотра и обработки видео Mac OS"}
- {id: 205, cat: PC/Mac, desc: "Программы для создания и обработки графики Mac OS"}
- {id: 206, cat: PC/Mac, desc: "Аудио редакторы и конверторы для Mac OS"}
- {id: 207, cat: PC/Mac, desc: "Системные программы для Mac OS"}
- {id: 208, cat: PC/Mac, desc: "Другие программы для Mac OS"}
- {id: 215, cat: PC, desc: "Операционные системы (Unix и Unix-подобные)"}
- {id: 216, cat: PC, desc: "Программное обеспечение для Unix и Unix-подобных OS"}
- {id: 217, cat: PC, desc: "Другие OS и программное обеспечение под них"}
- {id: 227, cat: PC, desc: "Настольные OS, выпущенные до 2001 года (Microsoft Windows OS.."}
- {id: 228, cat: PC, desc: "Windows XP"}
- {id: 229, cat: PC, desc: "Windows Vista"}
- {id: 230, cat: PC, desc: "Windows 7"}
- {id: 879, cat: PC, desc: "Windows 8"}
- {id: 905, cat: PC, desc: "Windows 10"}
- {id: 698, cat: PC, desc: "Сборки (Microsoft Windows XP)"}
- {id: 701, cat: PC, desc: "Сборки (Microsoft Windows 7)"}
- {id: 880, cat: PC, desc: "Сборки (Microsoft Windows 8)"}
- {id: 906, cat: PC, desc: "Сборки (Microsoft Windows 10)"}
- {id: 231, cat: PC, desc: "Серверные (Microsoft Windows OS)"}
- {id: 232, cat: PC, desc: "Разное (Microsoft Windows OS)"}
- {id: 236, cat: PC, desc: "Работа с жёстким диском"}
- {id: 237, cat: PC, desc: "Резервное копирование"}
- {id: 240, cat: PC, desc: "Архиваторы и файловые менеджеры"}
- {id: 239, cat: PC, desc: "Программы для настройки и оптимизации ОС"}
- {id: 241, cat: PC, desc: "Сервисное обслуживание компьютера"}
- {id: 242, cat: PC, desc: "Работа с носителями информации"}
- {id: 243, cat: PC, desc: "Информация и диагностика"}
- {id: 244, cat: PC, desc: "Программы для интернет и сетей"}
- {id: 245, cat: PC, desc: "Антивирусы и Файерволы"}
- {id: 246, cat: PC, desc: "Программы для защиты информации"}
- {id: 247, cat: PC, desc: "Драйвера"}
- {id: 248, cat: PC, desc: "Серверное ПО для Windows"}
- {id: 249, cat: PC, desc: "Изменение интерфейса ОС Windows"}
- {id: 250, cat: PC, desc: "Скринсейверы"}
- {id: 251, cat: PC, desc: "Разное (Системные программы под Windows)"}
- {id: 409, cat: PC, desc: "Системы автоматизации проектных работ (САПР)"}
- {id: 607, cat: PC, desc: "Программы для архитекторов и дизайнеров интерьеров"}
- {id: 593, cat: PC, desc: "Офисные программы и системы"}
- {id: 595, cat: PC, desc: "Системы для научной работы"}
- {id: 594, cat: PC, desc: "Системы для бизнеса"}
- {id: 257, cat: PC, desc: "Каталогизаторы и просмотрщики графики"}
- {id: 258, cat: PC, desc: "Аудио- и видео-, CD- проигрыватели и каталогизаторы"}
- {id: 259, cat: PC, desc: "Программы для интернет и сетей"}
- {id: 260, cat: PC, desc: "Распознавание текста, звука и синтез речи"}
- {id: 261, cat: PC, desc: "Словари и переводчики"}
- {id: 262, cat: PC, desc: "Программное обеспечение для автолюбителей"}
- {id: 263, cat: PC, desc: "Медицинское программное обеспечение"}
- {id: 264, cat: PC, desc: "Справочные системы и карты"}
- {id: 265, cat: PC, desc: "Разное (Пользовательские программы)"}
- {id: 268, cat: PC, desc: "WYSIWYG Редакторы для веб-диза"}
- {id: 269, cat: PC, desc: "Текстовые редакторы с подсветкой"}
- {id: 270, cat: PC, desc: "Среды программирования, компиляторы и вспомогательные програ.."}
- {id: 271, cat: PC, desc: "Компоненты для сред программирования"}
- {id: 272, cat: PC, desc: "Системы управления базами данных (СУБД)"}
- {id: 273, cat: PC, desc: "Скрипты и шаблоны"}
- {id: 274, cat: PC, desc: "Разное (Веб-разработка и программирование)"}
- {id: 278, cat: PC, desc: "Программные комплекты"}
- {id: 279, cat: PC, desc: "Плагины для программ компании Adobe"}
- {id: 280, cat: PC, desc: "Графические редакторы"}
- {id: 281, cat: PC, desc: "Программы для верстки, печати и работы со шрифтами"}
- {id: 282, cat: PC, desc: "3D моделирование, рендеринг и плагины для них"}
- {id: 283, cat: PC, desc: "Анимация"}
- {id: 284, cat: PC, desc: "Создание DVD и BD дисков"}
- {id: 285, cat: PC, desc: "Редакторы видео"}
- {id: 286, cat: PC, desc: "Видео- Аудио- конверторы"}
- {id: 287, cat: PC, desc: "Работа со звуком"}
- {id: 290, cat: PC, desc: "Разное (Программы для работы с мультимедиа и 3D)"}
- {id: 293, cat: PC, desc: "Растровые и Векторные Клипарты"}
- {id: 294, cat: PC, desc: "Заготовки, виньетки, рамки"}
- {id: 295, cat: PC, desc: "Стили, кисти, формы и узоры для Adobe Photoshop"}
- {id: 296, cat: PC, desc: "Текстуры и материалы"}
- {id: 297, cat: PC, desc: "3D графика"}
- {id: 298, cat: PC, desc: "Футажи"}
- {id: 299, cat: PC, desc: "Звуковые эффекты"}
- {id: 300, cat: PC, desc: "Библиотеки сэмплов"}
- {id: 301, cat: PC, desc: "Шрифты"}
- {id: 302, cat: PC, desc: "Photostoсks"}
- {id: 303, cat: PC, desc: "Разное (Материалы для мультимедиа и дизайна)"}
- {id: 597, cat: PC, desc: "Справочно-правовые Системы"}
- {id: 600, cat: PC, desc: "Консультант Плюс"}
- {id: 599, cat: PC, desc: "Гарант"}
- {id: 601, cat: PC, desc: "Кодекс"}
- {id: 623, cat: PC, desc: "Мобильные телефоны"}
- {id: 624, cat: PC, desc: "КПК"}
- {id: 625, cat: PC, desc: "Навигаторы"}
- {id: 626, cat: PC, desc: "Карты для навигаторов"}
- {id: 627, cat: PC, desc: "Плееры"}
- {id: 628, cat: PC, desc: "Разное (Мобильные устройства и КПК)"}
- {id: 622, cat: PC/Phone-IOS, desc: "Apple Mobile Device Software"}
- {id: 667, cat: PC/Phone-IOS, desc: "Прошивки (iPhone/iPod Touch/iPad)"}
- {id: 668, cat: PC/Phone-IOS, desc: "Программы (iPhone/iPod Touch/iPad)"}
- {id: 669, cat: PC/Phone-IOS, desc: "Игры (iPhone/iPod Touch/iPad)"}
- {id: 670, cat: PC/Phone-IOS, desc: "Видео (iPhone/iPod Touch/iPad)"}
- {id: 672, cat: PC/Phone-IOS, desc: "Разное (iPhone/iPod Touch/iPad)"}
- {id: 671, cat: PC/Phone-IOS, desc: "Музыка (iPhone/iPod Touch/iPad)"}
- {id: 639, cat: PC, desc: "Обучающие видеоматериалы"}
- {id: 640, cat: PC, desc: "Мультимедийные материалы"}
- {id: 642, cat: PC, desc: "Разное"}
# Library
# Библиотека
- {id: 717, cat: Books, desc: "Аудиокниги"}
- {id: 740, cat: Books, desc: "Проект S.T.A.L.K.E.R."}
- {id: 738, cat: Books, desc: "Детектив / боевик"}
- {id: 739, cat: Books, desc: "Фантастика / фэнтези / мистика / ужасы"}
- {id: 836, cat: Books, desc: "Роман / комедийные произведения / приключения"}
- {id: 838, cat: Books, desc: "Классическая литература и современная проза"}
- {id: 837, cat: Books, desc: "Образование и Право"}
- {id: 843, cat: Books, desc: "Разное"}
- {id: 713, cat: Books, desc: "Художественная литература"}
- {id: 724, cat: Books, desc: "Детектив / боевик"}
- {id: 728, cat: Books, desc: "Фантастика / фэнтези / мистика / ужасы"}
- {id: 725, cat: Books, desc: "Роман / приключения / драма"}
- {id: 727, cat: Books, desc: "Комедийные произведения"}
- {id: 723, cat: Books, desc: "Историческая книга"}
- {id: 721, cat: Books, desc: "Классическая литература и современная проза"}
- {id: 722, cat: Books, desc: "Поэзия"}
- {id: 844, cat: Books, desc: "Разное"}
- {id: 718, cat: Books, desc: "Журналы"}
- {id: 763, cat: Books, desc: "Эротические журналы"}
- {id: 715, cat: Books, desc: "Компьютерная литература"}
- {id: 839, cat: Books, desc: "Научная и тех.литература"}
- {id: 719, cat: Books, desc: "Образование, Право и Психология"}
- {id: 846, cat: Books, desc: "Сексология"}
- {id: 840, cat: Books, desc: "Военное дело"}
- {id: 842, cat: Books, desc: "Спорт и физическое воспитание"}
- {id: 841, cat: Books, desc: "Хобби"}
- {id: 716, cat: Books, desc: "Дом и семейный очаг"}
- {id: 714, cat: Books, desc: "Книги для малышей и их родителей"}
- {id: 845, cat: Books, desc: "Комиксы"}
- {id: 741, cat: Books, desc: "Разное"}
# Technical assistance
# Техническая помощь
- {id: 578, cat: Other, desc: "µTorrent и BitTorrent 4.x, 5.x, 6.x"}
# Release - groups
# Релиз - группы
- {id: 378, cat: Other, desc: "Анонсы"}
# Miscellanea
# Разное
- {id: 644, cat: Other, desc: "Разное"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: login.php
method: form
form: form[action$="/login.php"]
inputs:
login_username: "{{ .Config.username }}"
login_password: "{{ .Config.password }}"
autologin: 1
redirect: "index.php"
error:
- selector: h4:contains("Вы ввели")
test:
path: index.php
selector: a[href="./login.php?logout=1"]
search:
paths:
- path: tracker.php
inputs:
$raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{else}}f[]=-1{{end}}"
nm: "{{ .Keywords }}"
o: 1
s: 2
tm: -1
sns: -1
rows:
selector: tr[id^="tor_"]
fields:
title:
selector: a.genmed
filters:
- name: replace
args: [" / ", " "]
- name: replace
args: ["Кураж-Бамбей", "kurazh"]
- name: replace
args: ["Кубик в Кубе", "Kubik"]
- name: re_replace
args: ["((\\([12][0-9]{3}\\))(.+)\\([Сс]езон\\s+(\\d+).+[Сс]ери[ия]\\s+(?:(\\d+-*\\d*).*\\d+)*\\))", " - S$4E$5 - rus $3"]
- name: re_replace
args: ["(\\([А-Яа-я\\W]+\\))|(^[А-Яа-я\\W\\d]+\\/ )|([а-яА-Я \\-]+,+)|([а-яА-Я]+)", "{{ if .Config.striprussian }}{{ else }}$1$2$3$4{{ end }}"]
- name: replace
args: ["-Rip", "Rip"]
- name: replace
args: ["WEB-DL", "WEBDL"]
- name: replace
args: ["WEBDLRip", "WEBDL"]
- name: replace
args: ["HDTVRip", "HDTV"]
details:
selector: a.genmed
attribute: href
download:
optional: true
selector: a[href^="./download.php?id="]
attribute: href
category:
selector: td a.gen
attribute: href
filters:
- name: querystring
args: f
size:
selector: td:nth-child(6) > u
date:
selector: td:last-child > u
seeders:
selector: td.seedmed > b
leechers:
selector: td.leechmed > b
downloadvolumefactor:
case:
img[src="images/tor_gold.gif"]: "0"
img[src="images/tor_silver.gif"]: "0.5"
"*": "1"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,99 @@
---
site: teamhd
name: TeamHD
description: "TeamHD is a RUSSIAN Private Torrent Tracker for HD MOVIES / TV"
language: ru-ru
type: private
encoding: UTF-8
links:
- https://teamhd.org/
caps:
categorymappings:
- {id: 29, cat: Movies/HD, desc: "Movies Фильмы"}
- {id: 25, cat: TV/Anime, desc: "Cartoons Мультфильмы"}
- {id: 26, cat: Audio/Lossless, desc: "Hi-Res Audio"}
- {id: 27, cat: Other, desc: "Demo Демо"}
- {id: 28, cat: TV/Documentary, desc: "Documentary Документальное кино"}
- {id: 30, cat: Audio/Video, desc: "Music Video Музыкальное видео"}
- {id: 31, cat: TV/Sport, desc: "Sport Спорт"}
- {id: 32, cat: TV/HD, desc: "TV Show ТВ Шоу"}
- {id: 33, cat: TV/HD, desc: "Soaps Сериалы"}
- {id: 34, cat: TV/HD, desc: "Other"}
- {id: 35, cat: Movies, desc: "Content w/o subs Контент без перевода"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: takelogin.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: div.error
test:
path: index.php
selector: a[href="/logout.php"]
search:
paths:
- path: browse
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
incldead: 0
free: 0
year: ""
rows:
selector: table.browse > tbody > tr
fields:
download:
selector: a[href^="download.php?id="]
attribute: href
title:
selector: a[href^="/details/id"]
details:
selector: a[href^="/details/id"]
attribute: href
category:
selector: a[href*="/browse/cat"]
attribute: href
filters:
- name: regexp
args: (\d+)
date:
selector: td > div > small
filters:
- name: dateparse
args: "02-01-2006 15:04"
seeders:
selector: td:nth-child(4)
filters:
- name: split
args: ["|", 0]
leechers:
selector: td:nth-child(4)
filters:
- name: split
args: ["|", 1]
grabs:
selector: td:nth-child(5) strong
filters:
- name: regexp
args: (\d+)
size:
selector: td:nth-child(5)
remove: strong
downloadvolumefactor:
case:
a[href^="/details/id"][style="color:#f2b101"]: "0"
a[href^="/details/id"][style="color:#828b8b"]: "0.5"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -31,6 +31,8 @@
paths:
- path: src/releaselist.php
method: post
headers:
Referer: ["{{.Config.sitelink}}?releaselist"]
inputs:
cat: 0
page: 1

View File

@@ -45,7 +45,7 @@
settings: []
download:
selector: a[href^="/downloading/"]
selector: a.download:contains("le Torrent")
search:
paths:

View File

@@ -7,15 +7,16 @@
encoding: UTF-8
followredirect: true
links:
- https://wvw.torrent9.vc/
- https://wvw.torrent9.lol/
legacylinks:
- https://www.torrents9.pw/
- https://www.torrent9.ch/
- https://www1.torrent9.ch/
- https://www2.torrent9.ch/
- https://wwv.torrent9.vg/
- https://www.torrent9.lol/
- https://www.torrent9.vc/
- https://wvw.torrent9.vc/
- https://www.torrent9.lol/
caps:
categorymappings:

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- https://gotorrentkitty.cc/
legacylinks:
- http://cntorrentkitty.com/
- http://cntorrentkitty.xyz/

View File

@@ -123,13 +123,16 @@
- name: andmatch
fields:
category:
selector: td:nth-of-type(1) a
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: td:nth-of-type(2) a
title: # may be abbreviated
selector: a[href^="details.php?id="]
title: # full title if available
optional: true
selector: td:nth-of-type(2) a[onmouseover]
attribute: onmouseover
filters:
- name: split
@@ -137,9 +140,10 @@
- name: replace
args: ["</b", ""]
details:
selector: td:nth-of-type(2) > a[onmouseover]
selector: a[href^="details.php?id="]
attribute: href
banner:
optional: true
selector: td:nth-of-type(2) > a[onmouseover]
attribute: onmouseover
filters:
@@ -148,7 +152,7 @@
- name: replace
args: ["./pic/noposter.png", ""]
download:
selector: td:nth-of-type(3) a
selector: a[href^="download.php?torrent="]
attribute: href
files:
selector: td:nth-of-type(5)

View File

@@ -7,8 +7,6 @@
encoding: UTF-8
links:
- https://www.trancetraffic.com/
certificates:
- 117B89D7C086F3E051F0A5A3576504667402AE52
caps:
categories:

View File

@@ -158,15 +158,9 @@
attribute: title
filters:
- name: replace
args: ["FREE LEECH!", "0"]
downloadvolumefactor:
optional: true
selector: img[src$="torrent_multiple_download.png"]
attribute: title
filters:
- name: split
args: [":", 1]
- name: trim
args: ["No cuenta la descarga", "0"]
- name: replace
args: ["Cuenta descarga: 0.5", "0.5"]
uploadvolumefactor:
text: "1"
uploadvolumefactor:
@@ -174,10 +168,9 @@
selector: img[src$="torrent_multiple_upload.png"]
attribute: title
filters:
- name: split
args: [":", 1]
- name: trim
- name: replace
args: ["Cuenta subida por: 2", 2]
minimumratio:
text: "1.0"
minimumseedtime:
text: "259200" # 3 day (72h)
text: "345600" # 4 day (96h)

View File

@@ -15,17 +15,21 @@
- {id: 23 , cat: Movies/3D, desc: "Peliculas - 3D"}
- {id: 17 , cat: Movies/HD, desc: "Peliculas - FullBluray/BDRemux"}
- {id: 29 , cat: Movies/HD, desc: "Peliculas - 1080p x265"}
- {id: 21 , cat: Movies/HD, desc: "Peliculas - 4K"}
- {id: 21 , cat: Movies/UHD, desc: "Peliculas - 4K"}
- {id: 30 , cat: Movies/HD, desc: "Peliculas - MicroHD x265"}
- {id: 35 , cat: TV/HD, desc: "TV/Series - 4K"}
- {id: 35 , cat: TV/UHD, desc: "TV/Series - 4K"}
- {id: 31 , cat: TV/HD, desc: "TV/Series - x265"}
- {id: 25 , cat: TV/HD, desc: "TV/Series - HDTV & WEB-DL 1080p"}
- {id: 37 , cat: TV/Documentary, desc: "Documentales"}
- {id: 41 , cat: TV/Sport, desc: "Deportes"}
- {id: 5 , cat: Movies/HD, desc: "Anime"}
- {id: 5 , cat: TV/Anime, desc: "Anime"}
- {id: 34 , cat: TV/HD, desc: "Dibujos animados"}
- {id: 14 , cat: Audio/MP3, desc: "Música - MP3"}
- {id: 39 , cat: Audio/Lossless, desc: "Música - FLAC"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: index.php?page=login

View File

@@ -7,7 +7,7 @@
encoding: UTF-8
followredirect: true
links:
- https://www.yggtorrent.gg/
- https://www.yggtorrent.ch/
legacylinks:
- https://yggtorrent.com/
- https://ww1.yggtorrent.com/
@@ -26,6 +26,7 @@
- https://www.ygg.to/
- https://ww3.yggtorrent.gg/
- http://www2.yggtorrent.gg/
- https://www.yggtorrent.gg/
caps:
categorymappings:
@@ -91,7 +92,7 @@
- name: searchanddlurl
label: Search and download URL
type: text
default: www2.yggtorrent.gg
default: www2.yggtorrent.ch
- name: username
type: text
label: Username

View File

@@ -32,6 +32,7 @@ namespace Jackett.Common.Indexers
private string TorrentCommentUrl { get { return TorrentDescriptionUrl; } }
private string TorrentDescriptionUrl { get { return SiteLink + "torrents.php?id="; } }
private string TorrentDownloadUrl { get { return SiteLink + "torrents.php?action=download&id={id}&authkey={auth_key}&torrent_pass={torrent_pass}"; } }
private string ReplaceMulti { get { return ConfigData.ReplaceMulti.Value; } }
private bool Latency { get { return ConfigData.Latency.Value; } }
private bool DevMode { get { return ConfigData.DevMode.Value; } }
private bool CacheMode { get { return ConfigData.HardDriveCache.Value; } }
@@ -302,6 +303,11 @@ namespace Jackett.Common.Indexers
// Release Name
string name = tRow.Find("td:eq(1) > a").Text();
//issue #3847 replace multi keyword
if(!string.IsNullOrEmpty(ReplaceMulti)){
System.Text.RegularExpressions.Regex regex = new Regex("(?i)([\\.\\- ])MULTI([\\.\\- ])");
name = regex.Replace(name, "$1"+ReplaceMulti+"$2");
}
output("Release: " + name);
// Category

View File

@@ -36,7 +36,7 @@ namespace Jackett.Common.Indexers.Abstract
)
{
this.endpoint = endpoint;
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)

View File

@@ -55,7 +55,7 @@ namespace Jackett.Common.Indexers
Language = "pt-br";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(14, TorznabCatType.TVAnime, "Anime");
AddCategoryMapping(3, TorznabCatType.PC0day, "Aplicativos");

View File

@@ -293,9 +293,9 @@ namespace Jackett.Common.Indexers
if (query.HasSpecifiedCategories)
if (!caps.SupportsCategories(query.Categories))
return false;
if (caps.SupportsImdbSearch && query.IsImdbQuery)
if (caps.SupportsImdbMovieSearch && query.IsImdbQuery)
return true;
else if (!caps.SupportsImdbSearch && query.IsImdbQuery && query.QueryType != "TorrentPotato") // potato query should always contain imdb+search term
else if (!caps.SupportsImdbMovieSearch && query.IsImdbQuery && query.QueryType != "TorrentPotato") // potato query should always contain imdb+search term
return false;
if (caps.SearchAvailable && query.IsSearch)
return true;
@@ -307,7 +307,7 @@ namespace Jackett.Common.Indexers
return true;
if (caps.SupportsTVRageSearch && query.IsTVRageSearch)
return true;
if (caps.SupportsImdbSearch && query.IsImdbQuery)
if (caps.SupportsImdbMovieSearch && query.IsImdbQuery)
return true;
return false;

View File

@@ -1,203 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
namespace Jackett.Common.Indexers
{
public class BeyondHD : BaseWebIndexer
{
private string SearchUrl { get { return SiteLink + "browse.php?searchin=descr&incldead=1&"; } }
private new ConfigurationDataLoginLink configData
{
get { return (ConfigurationDataLoginLink)base.configData; }
set { base.configData = value; }
}
public BeyondHD(IIndexerConfigurationService configService, WebClient w, Logger l, IProtectionService ps)
: base(name: "BeyondHD",
description: "Without BeyondHD, your HDTV is just a TV",
link: "https://beyond-hd.me/",
caps: new TorznabCapabilities(),
configService: configService,
client: w,
logger: l,
p: ps,
configData: new ConfigurationDataLoginLink())
{
Encoding = Encoding.UTF8;
Language = "en-us";
Type = "private";
configData.DisplayText.Value = "Go to the general tab of your BeyondHD user profile and create/copy the Login Link.";
TorznabCaps.SupportsImdbSearch = true;
AddCategoryMapping(37, TorznabCatType.MoviesBluRay, "Movie / Blu-ray");
AddCategoryMapping(71, TorznabCatType.Movies3D, "Movie / 3D");
AddCategoryMapping(83, TorznabCatType.Movies3D, "FraMeSToR 3D");
AddCategoryMapping(77, TorznabCatType.MoviesHD, "Movie / 1080p/i");
AddCategoryMapping(102, TorznabCatType.MoviesUHD, "Movie / 4K Disk");
AddCategoryMapping(94, TorznabCatType.MoviesUHD, "Movie / 4K Other");
AddCategoryMapping(103, TorznabCatType.MoviesUHD, "Movie / 4K Remux");
AddCategoryMapping(78, TorznabCatType.MoviesHD, "Movie / 720p");
AddCategoryMapping(54, TorznabCatType.MoviesHD, "Movie / MP4");
AddCategoryMapping(17, TorznabCatType.MoviesHD, "Movie / Remux");
AddCategoryMapping(38, TorznabCatType.MoviesHD, "Movie / WEB-DL");
AddCategoryMapping(106, TorznabCatType.MoviesHD, "Internal / BHDStudio 1080p");
AddCategoryMapping(105, TorznabCatType.MoviesHD, "Internal / BHDStudio 720p");
AddCategoryMapping(50, TorznabCatType.MoviesHD, "Internal / FraMeSToR 1080p");
AddCategoryMapping(75, TorznabCatType.MoviesHD, "Internal / FraMeSToR 720p");
AddCategoryMapping(49, TorznabCatType.MoviesHD, "Internal / FraMeSToR REMUX");
AddCategoryMapping(101, TorznabCatType.MoviesHD, "Internal / FraMeSToR 4K REMUX");
AddCategoryMapping(61, TorznabCatType.MoviesHD, "Internal / HDX REMUX");
AddCategoryMapping(86, TorznabCatType.MoviesHD, "Internal / SC4R");
AddCategoryMapping(95, TorznabCatType.MoviesHD, "Nightripper 1080p");
AddCategoryMapping(96, TorznabCatType.MoviesHD, "Nightripper 720p");
AddCategoryMapping(98, TorznabCatType.MoviesHD, "Nightripper MicroHD");
AddCategoryMapping(104, TorznabCatType.TVUHD, "TV Show / 4K");
AddCategoryMapping(40, TorznabCatType.TVHD, "TV Show / Blu-ray");
AddCategoryMapping(44, TorznabCatType.TVHD, "TV Show / Encodes");
AddCategoryMapping(48, TorznabCatType.TVHD, "TV Show / HDTV");
AddCategoryMapping(89, TorznabCatType.TVHD, "TV Show / Packs");
AddCategoryMapping(46, TorznabCatType.TVHD, "TV Show / Remux");
AddCategoryMapping(99, TorznabCatType.TVHD, "TV Show / Sports");
AddCategoryMapping(100, TorznabCatType.TVHD, "TV Show / Sports / WEB-DL");
AddCategoryMapping(45, TorznabCatType.TVHD, "TV Show / WEB-DL");
AddCategoryMapping(97, TorznabCatType.TVHD, "Nightripper TV Show Encodes");
AddCategoryMapping(36, TorznabCatType.AudioLossless, "Music / Lossless");
AddCategoryMapping(69, TorznabCatType.AudioMP3, "Music / MP3");
AddCategoryMapping(55, TorznabCatType.AudioVideo, "Music / 1080p/i");
AddCategoryMapping(56, TorznabCatType.AudioVideo, "Music / 720p");
AddCategoryMapping(42, TorznabCatType.AudioVideo, "Music / Blu-ray");
AddCategoryMapping(41, TorznabCatType.AudioVideo, "Music / Movie OST");
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
var result = await RequestStringWithCookies(configData.LoginLink.Value);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("Welcome Back"), () =>
{
var errorMessage = result.Content;
throw new ExceptionWithConfigData(errorMessage, configData);
});
return IndexerConfigurationStatus.RequiresTesting;
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
List<ReleaseInfo> releases = new List<ReleaseInfo>();
Regex IMDBRegEx = new Regex(@"tt(\d+)", RegexOptions.Compiled);
var searchString = query.GetQueryString();
var searchUrl = SearchUrl;
var queryCollection = new NameValueCollection();
var searchStringIsImdbQuery = (ParseUtil.GetImdbID(searchString) != null);
if (query.IsImdbQuery)
{
queryCollection.Add("search", query.ImdbID);
}
else if (searchStringIsImdbQuery)
{
queryCollection.Add("search", searchString);
}
else if (!string.IsNullOrWhiteSpace(searchString))
{
Regex ReplaceRegex = new Regex("[^a-zA-Z0-9]+");
searchString = "%" + ReplaceRegex.Replace(searchString, "%") + "%";
searchString = Regex.Replace(searchString, @"(%\d{3,4})[ip](%)", "$1$2"); // remove i/p from resolution tags (see #835)
queryCollection.Add("search", searchString);
}
foreach (var cat in MapTorznabCapsToTrackers(query))
{
queryCollection.Add("c" + cat, "1");
}
searchUrl += queryCollection.GetQueryString();
var results = await RequestStringWithCookiesAndRetry(searchUrl);
await FollowIfRedirect(results);
try
{
CQ dom = results.Content;
var rows = dom["table.torrenttable > tbody > tr.browse_color, table.torrenttable > tbody > tr.highlight"];
foreach (var row in rows)
{
var release = new ReleaseInfo();
release.MinimumRatio = 1;
release.MinimumSeedTime = 172800;
var qRow = row.Cq();
var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1];
release.Category = MapTrackerCatToNewznab(catStr);
var qLink = row.ChildElements.ElementAt(2).FirstChild.Cq();
release.Link = new Uri(SiteLink + qLink.Attr("href"));
var torrentId = qLink.Attr("href").Split('=').Last();
var descCol = row.ChildElements.ElementAt(3);
var qCommentLink = descCol.FirstChild.Cq();
release.Title = qCommentLink.Text();
if (!query.IsImdbQuery && !query.MatchQueryStringAND(release.Title))
continue;
release.Comments = new Uri(SiteLink + qCommentLink.Attr("href"));
release.Guid = release.Comments;
release.Link = new Uri($"{SiteLink}download.php?torrent={torrentId}");
var dateStr = descCol.ChildElements.Last().Cq().Text().Split('|').Last().ToLowerInvariant().Replace("ago.", "").Trim();
release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr);
var sizeStr = row.ChildElements.ElementAt(7).Cq().Text();
release.Size = ReleaseInfo.GetBytes(sizeStr);
release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).Cq().Text());
release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(10).Cq().Text()) + release.Seeders;
var files = qRow.Find("td:nth-child(6)").Text();
release.Files = ParseUtil.CoerceInt(files);
var grabs = qRow.Find("td:nth-child(9) > a").Get(0).FirstChild.ToString();
release.Grabs = ParseUtil.CoerceInt(grabs);
var imdbLink = qRow.Find("a[href*=\"imdb.com/title/\"]").Attr("href");
if (imdbLink != null)
{
var IMDBMatch = IMDBRegEx.Match(imdbLink);
release.Imdb = ParseUtil.CoerceLong(IMDBMatch.Groups[1].Value);
}
release.DownloadVolumeFactor = 0;
release.UploadVolumeFactor = 1;
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(results.Content, ex);
}
return releases;
}
}
}

View File

@@ -41,7 +41,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.MoviesDVD, "Movies/DVDR");
AddCategoryMapping(2, TorznabCatType.MoviesSD, "Movies/XviD");

View File

@@ -22,7 +22,7 @@ namespace Jackett.Common.Indexers
{
Language = "pt-br";
Type = "private";
TorznabCaps.SupportsImdbSearch = false; // they store the imdb ID but it's not included in the results, search is also not available.
TorznabCaps.SupportsImdbMovieSearch = false; // they store the imdb ID but it's not included in the results, search is also not available.
TorznabCaps.SupportedMusicSearchParamsList = new List<string>() { "q", "album", "artist", "label", "year" };
AddCategoryMapping(1, TorznabCatType.Movies, "Filmes");

View File

@@ -1,7 +1,8 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
@@ -91,6 +92,13 @@ namespace Jackett.Common.Indexers
var btnOffset = query.Offset;
var releases = new List<ReleaseInfo>();
// If only the season is searched for then change format to match expected format
var seasonOnlyMatch = new Regex(@".*\s[Ss]{1}\d{2}(?<![Ee]{1}\d{2,3})?$").Match(searchString);
if (seasonOnlyMatch.Success)
{
searchString = Regex.Replace(searchString, @"[Ss]{1}\d{2}", $"Season {query.Season}");
}
var parameters = new JArray();
parameters.Add(new JValue(configData.Key.Value));
parameters.Add(new JValue(searchString.Trim()));

View File

@@ -92,7 +92,7 @@ namespace Jackett.Common.Indexers
Type = Definition.Type;
TorznabCaps = new TorznabCapabilities();
TorznabCaps.SupportsImdbSearch = Definition.Caps.Modes.Where(c => c.Key == "movie-search" && c.Value.Contains("imdbid")).Any();
TorznabCaps.SupportsImdbMovieSearch = Definition.Caps.Modes.Where(c => c.Key == "movie-search" && c.Value.Contains("imdbid")).Any();
if (Definition.Caps.Modes.ContainsKey("music-search"))
TorznabCaps.SupportedMusicSearchParamsList = Definition.Caps.Modes["music-search"];
@@ -1494,7 +1494,7 @@ namespace Jackett.Common.Indexers
if (Filter.Args != null)
CharacterLimit = int.Parse(Filter.Args);
if (query.ImdbID != null && TorznabCaps.SupportsImdbSearch)
if (query.ImdbID != null && TorznabCaps.SupportsImdbMovieSearch)
break; // skip andmatch filter for imdb searches
if (!query.MatchQueryStringAND(release.Title, CharacterLimit))

View File

@@ -210,7 +210,7 @@ namespace Jackett.Common.Indexers
var qRow = row.Cq();
release.Title = qRow.Find("td:nth-child(2) > a").First().Text().Trim();
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title))
continue;
release.Guid = new Uri(SiteLink + qRow.Find("td:nth-child(2) > a").First().Attr("href"));

View File

@@ -25,10 +25,6 @@ namespace Jackett.Common.Indexers
{ get { return SiteLink + "browse.php"; } }
private bool TorrentHTTPSMode => configData.TorrentHTTPSMode.Value;
private static readonly string[] certificateHashs = new string[] {
"4482711D19A95CDE01D7958E5F1295E05BCA335D", // Let's Encrypt Authority X3
};
private new ConfigurationDataEliteTracker configData
{
get { return (ConfigurationDataEliteTracker)base.configData; }
@@ -128,10 +124,6 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(65, TorznabCatType.TVSport, "UFC");
AddCategoryMapping(37, TorznabCatType.XXX, "XXX");
foreach (var certificateHash in certificateHashs)
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)

View File

@@ -31,7 +31,7 @@ namespace Jackett.Common.Indexers.Feeds
SearchAvailable = true,
TVSearchAvailable = false,
MovieSearchAvailable = false,
SupportsImdbSearch = false,
SupportsImdbMovieSearch = false,
SupportsTVRageSearch = false
};

View File

@@ -47,7 +47,7 @@ namespace Jackett.Common.Indexers
Language = "ro-ro";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(24, TorznabCatType.TVAnime, "Anime");
AddCategoryMapping(11, TorznabCatType.Audio, "Audio");
@@ -120,8 +120,8 @@ namespace Jackett.Common.Indexers
}
queryCollection.Add("cat", cat);
queryCollection.Add("searchin", "0");
queryCollection.Add("sort", "0");
queryCollection.Add("searchin", "1");
queryCollection.Add("sort", "2");
searchUrl += "?" + queryCollection.GetQueryString();

View File

@@ -46,7 +46,7 @@ namespace Jackett.Common.Indexers
Encoding = Encoding.GetEncoding("windows-1255");
Language = "he-il";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
TorznabCaps.Categories.Clear();
// סרטים

View File

@@ -298,7 +298,7 @@ namespace Jackett.Common.Indexers
release.Title = release.Title.Replace(", Neutral Leech!", "");
if (stickyGroup) // AND match for sticky releases
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title))
continue;
var Size = qSize.TextContent;

View File

@@ -42,7 +42,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
TorznabCaps.Categories.Clear();

View File

@@ -66,7 +66,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(72, TorznabCatType.Movies, "Movies");
AddCategoryMapping(87, TorznabCatType.Movies3D, "Movie/3D");

View File

@@ -18,14 +18,15 @@ namespace Jackett.Common.Indexers
{
class MejorTorrent : BaseWebIndexer
{
public static Uri WebUri = new Uri("http://www.mejortorrent.tv/");
public static Uri WebUri = new Uri("http://www.mejortorrentt.com/");
public static Uri DownloadUri = new Uri(WebUri, "secciones.php?sec=descargas&ap=contar_varios");
private static Uri SearchUriBase = new Uri(WebUri, "secciones.php");
public static Uri NewTorrentsUri = new Uri(WebUri, "secciones.php?sec=ultimos_torrents");
public static Encoding MEEncoding = Encoding.GetEncoding("iso-8859-1");
public override string[] LegacySiteLinks { get; protected set; } = new string[] {
"http://www.mejortorrent.org/"
"http://www.mejortorrent.org/",
"http://www.mejortorrent.tv/",
};
public MejorTorrent(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps)

View File

@@ -84,8 +84,8 @@ namespace Jackett.Common.Indexers
private int _maxDailyPages = 7;
private int _maxMoviesPages = 30;
private int _maxEpisodesListPages = 100;
private int[] _allTvCategories = TorznabCatType.TV.SubCategories.Select(c => c.ID).ToArray();
private int[] _allMoviesCategories = TorznabCatType.Movies.SubCategories.Select(c => c.ID).ToArray();
private int[] _allTvCategories = (new TorznabCategory[] { TorznabCatType.TV }).Concat(TorznabCatType.TV.SubCategories).Select(c => c.ID).ToArray();
private int[] _allMoviesCategories = (new TorznabCategory[] { TorznabCatType.Movies }).Concat(TorznabCatType.Movies.SubCategories).Select(c => c.ID).ToArray();
private bool _includeVo;
private bool _filterMovies;

View File

@@ -57,7 +57,7 @@ namespace Jackett.Common.Indexers
Language = "nb-no";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping("main_cat[]=1&sub2_cat[]=19", TorznabCatType.MoviesHD, "Filmer - HD-1080p/i");
AddCategoryMapping("main_cat[]=1&sub2_cat[]=20", TorznabCatType.MoviesHD, "Filmer - HD-720p");

View File

@@ -57,7 +57,7 @@ namespace Jackett.Common.Indexers
Language = "da-dk";
Type = "private";
TorznabCaps.SupportsImdbSearch = false;
TorznabCaps.SupportsImdbMovieSearch = false;
// Apps
AddCategoryMapping("cat=63", TorznabCatType.PCPhoneAndroid, "APPS - Android");

View File

@@ -46,7 +46,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
webclient.requestDelay = 2; // 0.5 requests per second

View File

@@ -48,7 +48,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.MoviesHD);
}

View File

@@ -9,10 +9,6 @@ namespace Jackett.Common.Indexers
{
public class Psytorrents : GazelleTracker
{
private static readonly string[] certificateHashs = new string[] {
"8375026D07C1EAE2DCE7157ABF255357366AE341", // expired
};
public Psytorrents(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
: base(name: "Psytorrents",
desc: "Psytorrents (PSY) is a Private Torrent Tracker for ELECTRONIC MUSIC",
@@ -31,9 +27,6 @@ namespace Jackett.Common.Indexers
AddCategoryMapping(1, TorznabCatType.Audio, "Music");
AddCategoryMapping(2, TorznabCatType.Movies, "Movies");
AddCategoryMapping(3, TorznabCatType.PC0day, "App");
foreach (var certificateHash in certificateHashs)
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, certificateHash);
}
}
}

View File

@@ -63,7 +63,7 @@ namespace Jackett.Common.Indexers
provideTorrentLinkItem.Name = "Generate torrent download link additionally to magnet (not recommended due to DDoS protection).";
configData.AddDynamic("providetorrentlink", provideTorrentLinkItem);
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
webclient.requestDelay = 2.1; // The api has a 1req/2s limit.

View File

@@ -39,7 +39,7 @@ namespace Jackett.Common.Indexers
Encoding = Encoding.UTF8;
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
webclient.EmulateBrowser = false;
webclient.AddTrustedCertificate(new Uri(SiteLink).Host, "81CC4E41B6F8FF656CA0E2396EE6D63383198BF1");

View File

@@ -24,7 +24,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportedMusicSearchParamsList = new List<string>() { "q", "album", "artist", "label", "year" };
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.Movies, "Movies");
AddCategoryMapping(2, TorznabCatType.Audio, "Music");

View File

@@ -144,7 +144,7 @@ namespace Jackett.Common.Indexers
var titleRow = qRow.Find("td:eq(2)").First();
titleRow.Children().Remove();
release.Title = titleRow.Text().Trim();
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title))
continue;
var qBanner = qRow.Find("div[style^=\"cursor: pointer; background-image:url\"]");

View File

@@ -82,7 +82,7 @@ namespace Jackett.Common.Indexers
serie_title = node.SelectSingleNode(".//*[local-name()='raw_title']").InnerText;
release.Title = serie_title;
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title))
continue;
release.Comments = new Uri(node.SelectSingleNode("link").InnerText);

View File

@@ -43,7 +43,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.MoviesOther, "Movies/XviD");
AddCategoryMapping(42, TorznabCatType.Movies, "Movies/Packs");

View File

@@ -42,7 +42,7 @@ namespace Jackett.Common.Indexers
Language = "sv-sw";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.MoviesDVD, "DVD-R Swesub");
AddCategoryMapping(2, TorznabCatType.TV, "DVD-R TV");

View File

@@ -67,7 +67,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(29, TorznabCatType.TVAnime, "Anime");
AddCategoryMapping(28, TorznabCatType.PC, "Appz/Packs");
@@ -230,7 +230,7 @@ namespace Jackett.Common.Indexers
var release = new ReleaseInfo();
release.Title = torrent.name;
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbSearch) && !query.MatchQueryStringAND(release.Title))
if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title))
continue;
release.MinimumRatio = 1;

View File

@@ -45,7 +45,7 @@ namespace Jackett.Common.Indexers
Language = "de-de";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
this.configData.DisplayText.Value = "Only the results from the first search result page are shown, adjust your profile settings to show the maximum.";
this.configData.DisplayText.Name = "Notice";

View File

@@ -47,7 +47,7 @@ namespace Jackett.Common.Indexers {
AddCategoryMapping (7000, TorznabCatType.Other);
AddCategoryMapping (8000, TorznabCatType.Books);
TorznabCaps.SupportsImdbSearch = false;
TorznabCaps.SupportsImdbMovieSearch = false;
webclient.requestDelay = 0;
}

View File

@@ -53,7 +53,7 @@ namespace Jackett.Common.Indexers
configData.DisplayText.Value = "Expect an initial delay (often around 10 seconds) due to XSpeeds CloudFlare DDoS protection";
configData.DisplayText.Name = "Notice";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(92, TorznabCatType.MoviesUHD, "4K Movies");
AddCategoryMapping(91, TorznabCatType.TVUHD, "4K TV");

View File

@@ -41,7 +41,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "private";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
AddCategoryMapping(1, TorznabCatType.MoviesDVD, "Movies/DVDR");
AddCategoryMapping(2, TorznabCatType.MoviesSD, "Movies/XviD");

View File

@@ -44,7 +44,7 @@ namespace Jackett.Common.Indexers
Language = "en-us";
Type = "public";
TorznabCaps.SupportsImdbSearch = true;
TorznabCaps.SupportsImdbMovieSearch = true;
webclient.requestDelay = 2.5; // 0.5 requests per second (2 causes problems)

View File

@@ -7,20 +7,20 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AngleSharp" Version="0.11.0" />
<PackageReference Include="AngleSharp" Version="0.12.0" />
<PackageReference Include="Autofac" Version="4.9.2" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="AutoMapper" Version="8.1.0" />
<PackageReference Include="BencodeNET" Version="2.3.0" />
<PackageReference Include="CloudFlareUtilities" Version="1.3.0" />
<PackageReference Include="CommandLineParser" Version="2.4.3" />
<PackageReference Include="CommandLineParser" Version="2.5.0" />
<PackageReference Include="CsQuery.NETStandard" Version="1.3.6.1" />
<PackageReference Include="DotNet4.SocksProxy" Version="1.4.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
<PackageReference Include="MimeMapping" Version="1.0.1.12" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<PackageReference Include="NLog" Version="4.6.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="NLog" Version="4.6.3" />
<PackageReference Include="SharpZipLib" Version="1.1.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.5.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="4.5.0" />

View File

@@ -33,6 +33,8 @@ namespace Jackett.Common.Models.DTO
public string omdburl { get; set; }
[DataMember]
public string app_version { get; set; }
[DataMember]
public bool can_run_netcore { get; set; }
[DataMember]
public ProxyType proxy_type { get; set; }
@@ -50,7 +52,7 @@ namespace Jackett.Common.Models.DTO
notices = new string[0];
}
public ServerConfig(IEnumerable<string> notices, Models.Config.ServerConfig config, string version)
public ServerConfig(IEnumerable<string> notices, Models.Config.ServerConfig config, string version, bool canRunNetCore)
{
this.notices = notices;
port = config.Port;
@@ -65,6 +67,7 @@ namespace Jackett.Common.Models.DTO
omdbkey = config.OmdbApiKey;
omdburl = config.OmdbApiUrl;
app_version = version;
can_run_netcore = canRunNetCore;
proxy_type = config.ProxyType;
proxy_url = config.ProxyUrl;

View File

@@ -8,6 +8,7 @@
public StringItem Username { get; private set; }
public StringItem Password { get; private set; }
public DisplayItem PagesWarning { get; private set; }
public StringItem ReplaceMulti { get; private set; }
public StringItem Pages { get; private set; }
public DisplayItem SecurityWarning { get; private set; }
public BoolItem Latency { get; private set; }
@@ -34,8 +35,9 @@
CredentialsWarning = new DisplayItem("<b>Credentials Configuration</b> (<i>Private Tracker</i>),<br /><br /> <ul><li><b>Username</b> is your account name on this tracker.</li><li><b>Password</b> is your password associated to your account name.</li></ul>") { Name = "Credentials" };
Username = new StringItem { Name = "Username (Required)", Value = "" };
Password = new StringItem { Name = "Password (Required)", Value = "" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Max Pages to Process</b> let you specify how many page (max) Jackett can process when doing a search. Setting a value <b>higher than 4 is dangerous</b> for you account ! (<b>Result of too many requests to tracker...that <u>will be suspect</u></b>).</li><li><b>With Dead Torrents</b> let you search <u>with</u> torrents which are marked Dead.</li><li><b>Freeleech Only</b> let you search <u>only</u> for torrents which are marked Freeleech.</li><li><b>With Nuked Releases</b> let you search <u>with</u> torrents which are marked Nuked.</li><li><b>3D Releases Only</b> let you search <u>only</u> for torrents which are marked 3D.</li><li><b>French Only</b> let you search <u>only</u> for torrents which are marked FRENCH or TRUEFRENCH (<i>MULTI not included !</i>).</li></ul>") { Name = "Preferences" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Replace MULTI</b>, replace multi keyword in the resultset (leave empty to deactivate)</li><li><b>Max Pages to Process</b> let you specify how many page (max) Jackett can process when doing a search. Setting a value <b>higher than 4 is dangerous</b> for you account ! (<b>Result of too many requests to tracker...that <u>will be suspect</u></b>).</li></ul>") { Name = "Preferences" };
Pages = new StringItem { Name = "Max Pages to Process (Required)", Value = "4" };
ReplaceMulti = new StringItem() { Name = "Replace MULTI", Value = "MULTI.FRENCH" };
SecurityWarning = new DisplayItem("<b>Security Configuration</b> (<i>Read this area carefully !</i>),<br /><br /> <ul><li><b>Latency Simulation</b> will simulate human browsing with Jacket by pausing Jacket for an random time between each request, to fake a real content browsing.</li><li><b>Browser Simulation</b> will simulate a real human browser by injecting additionals headers when doing requests to tracker.</li></ul>") { Name = "Security" };
Latency = new BoolItem() { Name = "Latency Simulation (Optional)", Value = false };
Browser = new BoolItem() { Name = "Browser Simulation (Optional)", Value = true };

View File

@@ -18,7 +18,7 @@
{
CredentialsWarning = new DisplayItem("<b>Credentials Configuration</b> (<i>Private Tracker</i>),<br /><br /> <ul><li><b>PassKey</b> is your private key on your account</li></ul>") { Name = "Credentials" };
PassKey = new StringItem { Name = "PassKey", Value = "" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Freeleech Only</b> let you search <u>only</u> for torrents which are marked Freeleech.</li><b>Replace MULTI</b>, replace multi keyword in the resultset (leave empty to deactivate)<li></li><li><b>Enhanced anime search</b>, Enhance sonarr compatibility with Xthor. Only effective on requests with the <u>TVAnime Torznab category</u>.</li></ul>") { Name = "Preferences" };
PagesWarning = new DisplayItem("<b>Preferences Configuration</b> (<i>Tweak your search settings</i>),<br /><br /> <ul><li><b>Freeleech Only</b> let you search <u>only</u> for torrents which are marked Freeleech.</li><li><b>Replace MULTI</b>, replace multi keyword in the resultset (leave empty to deactivate)</li><li><b>Enhanced anime search</b>, Enhance sonarr compatibility with Xthor. Only effective on requests with the <u>TVAnime Torznab category</u>.</li></ul>") { Name = "Preferences" };
Freeleech = new BoolItem() { Name = "Freeleech Only (Optional)", Value = false };
ReplaceMulti = new StringItem() { Name = "Replace MULTI", Value = "MULTI.FRENCH" };
EnhancedAnime = new BoolItem() { Name = "Enhanced anime search", Value = false };

View File

@@ -18,7 +18,7 @@ namespace Jackett.Common.Models
public bool SupportsTVRageSearch { get; set; }
public bool SupportsImdbSearch { get; set; }
public bool SupportsImdbMovieSearch { get; set; }
public bool MusicSearchAvailable
{
@@ -39,7 +39,7 @@ namespace Jackett.Common.Models
TVSearchAvailable = true;
MovieSearchAvailable = false;
SupportsTVRageSearch = false;
SupportsImdbSearch = false;
SupportsImdbMovieSearch = false;
SupportedMusicSearchParamsList = new List<string>();
}
@@ -48,7 +48,7 @@ namespace Jackett.Common.Models
SearchAvailable = true;
TVSearchAvailable = true;
SupportsTVRageSearch = false;
SupportsImdbSearch = false;
SupportsImdbMovieSearch = false;
SupportedMusicSearchParamsList = new List<string>();
Categories = new List<TorznabCategory>();
Categories.AddRange(cats);
@@ -62,8 +62,6 @@ namespace Jackett.Common.Models
var parameters = new List<string>() { "q", "season", "ep" };
if (SupportsTVRageSearch)
parameters.Add("rid");
if (SupportsImdbSearch)
parameters.Add("imdbid");
return string.Join(",", parameters);
}
}
@@ -73,7 +71,7 @@ namespace Jackett.Common.Models
get
{
var parameters = new List<string>() { "q" };
if (SupportsImdbSearch)
if (SupportsImdbMovieSearch)
parameters.Add("imdbid");
return string.Join(",", parameters);
}
@@ -161,7 +159,7 @@ namespace Jackett.Common.Models
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.SupportsImdbMovieSearch = lhs.SupportsImdbMovieSearch || rhs.SupportsImdbMovieSearch;
lhs.Categories.AddRange(rhs.Categories.Where(x => x.ID < 100000).Except(lhs.Categories)); // exclude indexer specific categories (>= 100000)
return lhs;

View File

@@ -56,6 +56,9 @@ namespace Jackett.Common.Plumbing
case "httpclientnetcore":
RegisterWebClient<HttpWebClientNetCore>(builder);
break;
case "httpclient2netcore":
RegisterWebClient<HttpWebClient2NetCore>(builder);
break;
case "httpclient":
RegisterWebClient<HttpWebClient>(builder);
break;

View File

@@ -16,5 +16,6 @@ namespace Jackett.Common.Services.Interfaces
List<string> notices { get; }
string GetBlackholeDirectory();
string GetApiKey();
bool MonoUserCanRunNetCore();
}
}

View File

@@ -0,0 +1,343 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using com.LandonKey.SocksWebProxy;
using com.LandonKey.SocksWebProxy.Proxy;
using CloudFlareUtilities;
using Jackett.Common.Models.Config;
using Jackett.Common.Services.Interfaces;
using NLog;
using Jackett.Common.Helpers;
using System.Diagnostics;
namespace Jackett.Common.Utils.Clients
{
// Compared to HttpWebClient this implementation will reuse the HttpClient instance (one per indexer).
// This should improve performance and avoid problems with too many open file handles.
public class HttpWebClient2NetCore : WebClient
{
CookieContainer cookies;
ClearanceHandler clearanceHandlr;
HttpClientHandler clientHandlr;
HttpClient client;
static protected Dictionary<string, ICollection<string>> trustedCertificates = new Dictionary<string, ICollection<string>>();
static protected string webProxyUrl;
static protected IWebProxy webProxy;
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
static public bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
var hash = certificate.GetCertHashString();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash, out hosts);
if (hosts != null)
{
if (hosts.Contains(request.RequestUri.Host))
return true;
}
if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}
return sslPolicyErrors == SslPolicyErrors.None;
}
static public void InitProxy(ServerConfig serverConfig)
{
// dispose old SocksWebProxy
if (webProxy != null && webProxy is SocksWebProxy)
{
((SocksWebProxy)webProxy).Dispose();
webProxy = null;
}
webProxyUrl = serverConfig.GetProxyUrl();
if (!string.IsNullOrWhiteSpace(webProxyUrl))
{
if (serverConfig.ProxyType != ProxyType.Http)
{
var addresses = Dns.GetHostAddressesAsync(serverConfig.ProxyUrl).Result;
var socksConfig = new ProxyConfig
{
SocksAddress = addresses.FirstOrDefault(),
Username = serverConfig.ProxyUsername,
Password = serverConfig.ProxyPassword,
Version = serverConfig.ProxyType == ProxyType.Socks4 ?
ProxyConfig.SocksVersion.Four :
ProxyConfig.SocksVersion.Five
};
if (serverConfig.ProxyPort.HasValue)
{
socksConfig.SocksPort = serverConfig.ProxyPort.Value;
}
webProxy = new SocksWebProxy(socksConfig, false);
}
else
{
NetworkCredential creds = null;
if (!serverConfig.ProxyIsAnonymous)
{
var username = serverConfig.ProxyUsername;
var password = serverConfig.ProxyPassword;
creds = new NetworkCredential(username, password);
}
webProxy = new WebProxy(webProxyUrl)
{
BypassProxyOnLocal = false,
Credentials = creds
};
}
}
}
public HttpWebClient2NetCore(IProcessService p, Logger l, IConfigurationService c, ServerConfig sc)
: base(p: p,
l: l,
c: c,
sc: sc)
{
if (webProxyUrl == null)
InitProxy(sc);
cookies = new CookieContainer();
CreateClient();
}
public void CreateClient()
{
clearanceHandlr = new ClearanceHandler();
clearanceHandlr.MaxRetries = 30;
clientHandlr = new HttpClientHandler
{
CookieContainer = cookies,
AllowAutoRedirect = false, // Do not use this - Bugs ahoy! Lost cookies and more.
UseCookies = true,
Proxy = webProxy,
UseProxy = (webProxy != null),
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
// custom certificate validation handler (netcore version)
clientHandlr.ServerCertificateCustomValidationCallback = ValidateCertificate;
clearanceHandlr.InnerHandler = clientHandlr;
client = new HttpClient(clearanceHandlr);
}
// Called everytime the ServerConfig changes
public override void OnNext(ServerConfig value)
{
var newProxyUrl = serverConfig.GetProxyUrl();
if (webProxyUrl != newProxyUrl) // if proxy URL changed
InitProxy(serverConfig);
// recreate client if needed (can't just change the proxy attribute)
if (!ReferenceEquals(clientHandlr.Proxy, webProxy))
{
CreateClient();
}
}
override public void Init()
{
ServicePointManager.DefaultConnectionLimit = 1000;
if (serverConfig.RuntimeSettings.IgnoreSslErrors == true)
{
logger.Info(string.Format("HttpWebClient: Disabling certificate validation"));
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => { return true; };
}
}
override protected async Task<WebClientByteResult> Run(WebRequest webRequest)
{
HttpResponseMessage response = null;
var request = new HttpRequestMessage();
request.Headers.ExpectContinue = false;
request.RequestUri = new Uri(webRequest.Url);
if (webRequest.EmulateBrowser == true)
request.Headers.UserAgent.ParseAdd(BrowserUtil.ChromeUserAgent);
else
request.Headers.UserAgent.ParseAdd("Jackett/" + configService.GetVersion());
// clear cookies from cookiecontainer
var oldCookies = cookies.GetCookies(request.RequestUri);
foreach (Cookie oldCookie in oldCookies)
{
oldCookie.Expired = true;
}
if (!string.IsNullOrEmpty(webRequest.Cookies))
{
// add cookies to cookiecontainer
var cookieUrl = new Uri(request.RequestUri.Scheme + "://" + request.RequestUri.Host); // don't include the path, Scheme is needed for mono compatibility
foreach (var ccookiestr in webRequest.Cookies.Split(';'))
{
var cookiestrparts = ccookiestr.Split('=');
var name = cookiestrparts[0].Trim();
if (string.IsNullOrWhiteSpace(name))
continue;
var value = "";
if (cookiestrparts.Length >= 2)
value = cookiestrparts[1].Trim();
var cookie = new Cookie(name, value);
cookies.Add(cookieUrl, cookie);
}
}
if (webRequest.Headers != null)
{
foreach (var header in webRequest.Headers)
{
if (header.Key != "Content-Type")
{
request.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
}
}
if (!string.IsNullOrEmpty(webRequest.Referer))
request.Headers.Referrer = new Uri(webRequest.Referer);
if (!string.IsNullOrEmpty(webRequest.RawBody))
{
var type = webRequest.Headers.Where(h => h.Key == "Content-Type").Cast<KeyValuePair<string, string>?>().FirstOrDefault();
if (type.HasValue)
{
var str = new StringContent(webRequest.RawBody);
str.Headers.Remove("Content-Type");
str.Headers.Add("Content-Type", type.Value.Value);
request.Content = str;
}
else
request.Content = new StringContent(webRequest.RawBody);
request.Method = HttpMethod.Post;
}
else if (webRequest.Type == RequestType.POST)
{
if (webRequest.PostData != null)
request.Content = new FormUrlEncodedContent(webRequest.PostData);
request.Method = HttpMethod.Post;
}
else
{
request.Method = HttpMethod.Get;
}
response = await client.SendAsync(request);
var result = new WebClientByteResult();
result.Content = await response.Content.ReadAsByteArrayAsync();
foreach (var header in response.Headers)
{
IEnumerable<string> value = header.Value;
result.Headers[header.Key.ToLowerInvariant()] = value.ToArray();
}
// some cloudflare clients are using a refresh header
// Pull it out manually
if (response.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable && response.Headers.Contains("Refresh"))
{
var refreshHeaders = response.Headers.GetValues("Refresh");
var redirval = "";
var redirtime = 0;
if (refreshHeaders != null)
{
foreach (var value in refreshHeaders)
{
var start = value.IndexOf("=");
var end = value.IndexOf(";");
var len = value.Length;
if (start > -1)
{
redirval = value.Substring(start + 1);
result.RedirectingTo = redirval;
// normally we don't want a serviceunavailable (503) to be a redirect, but that's the nature
// of this cloudflare approach..don't want to alter BaseWebResult.IsRedirect because normally
// it shoudln't include service unavailable..only if we have this redirect header.
response.StatusCode = System.Net.HttpStatusCode.Redirect;
redirtime = Int32.Parse(value.Substring(0, end));
System.Threading.Thread.Sleep(redirtime * 1000);
}
}
}
}
if (response.Headers.Location != null)
{
result.RedirectingTo = response.Headers.Location.ToString();
}
// Mono won't add the baseurl to relative redirects.
// e.g. a "Location: /index.php" header will result in the Uri "file:///index.php"
// See issue #1200
if (result.RedirectingTo != null && result.RedirectingTo.StartsWith("file://"))
{
// URL decoding apparently is needed to, without it e.g. Demonoid download is broken
// TODO: is it always needed (not just for relative redirects)?
var newRedirectingTo = WebUtilityHelpers.UrlDecode(result.RedirectingTo, webRequest.Encoding);
if (newRedirectingTo.StartsWith("file:////")) // Location without protocol but with host (only add scheme)
newRedirectingTo = newRedirectingTo.Replace("file://", request.RequestUri.Scheme + ":");
else
newRedirectingTo = newRedirectingTo.Replace("file://", request.RequestUri.Scheme + "://" + request.RequestUri.Host);
logger.Debug("[MONO relative redirect bug] Rewriting relative redirect URL from " + result.RedirectingTo + " to " + newRedirectingTo);
result.RedirectingTo = newRedirectingTo;
}
result.Status = response.StatusCode;
// Compatiblity issue between the cookie format and httpclient
// Pull it out manually ignoring the expiry date then set it manually
// http://stackoverflow.com/questions/14681144/httpclient-not-storing-cookies-in-cookiecontainer
IEnumerable<string> cookieHeaders;
var responseCookies = new List<Tuple<string, string>>();
if (response.Headers.TryGetValues("set-cookie", out cookieHeaders))
{
foreach (var value in cookieHeaders)
{
logger.Debug(value);
var nameSplit = value.IndexOf('=');
if (nameSplit > -1)
{
responseCookies.Add(new Tuple<string, string>(value.Substring(0, nameSplit), value.Substring(0, value.IndexOf(';') == -1 ? value.Length : (value.IndexOf(';'))) + ";"));
}
}
var cookieBuilder = new StringBuilder();
foreach (var cookieGroup in responseCookies.GroupBy(c => c.Item1))
{
cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
}
result.Cookies = cookieBuilder.ToString().Trim();
}
ServerUtil.ResureRedirectIsFullyQualified(webRequest, result);
return result;
}
override public void AddTrustedCertificate(string host, string hash)
{
hash = hash.ToUpper();
ICollection<string> hosts;
trustedCertificates.TryGetValue(hash.ToUpper(), out hosts);
if (hosts == null)
{
hosts = new HashSet<string>();
trustedCertificates[hash] = hosts;
}
hosts.Add(host);
}
}
}

View File

@@ -355,7 +355,7 @@ namespace Jackett.Server.Controllers
return GetErrorXML(201, "Incorrect parameter: invalid imdbid format");
}
if (!CurrentIndexer.TorznabCaps.SupportsImdbSearch)
if (!CurrentIndexer.TorznabCaps.SupportsImdbMovieSearch)
{
logger.Warn($"A search request with imdbid from {Request.HttpContext.Connection.RemoteIpAddress} was made but the indexer {CurrentIndexer.DisplayName} doesn't support it.");
return GetErrorXML(203, "Function Not Available: imdbid is not supported by this indexer");

View File

@@ -64,7 +64,7 @@ namespace Jackett.Server.Controllers
[HttpGet]
public Common.Models.DTO.ServerConfig Config()
{
var dto = new Common.Models.DTO.ServerConfig(serverService.notices, serverConfig, configService.GetVersion());
var dto = new Common.Models.DTO.ServerConfig(serverService.notices, serverConfig, configService.GetVersion(), serverService.MonoUserCanRunNetCore());
return dto;
}

View File

@@ -11,7 +11,7 @@ namespace Jackett.Server
{
public static void ProcessSettings(RuntimeSettings runtimeSettings, Logger logger)
{
if (runtimeSettings.ClientOverride != "httpclient" && runtimeSettings.ClientOverride != "httpclient2" && runtimeSettings.ClientOverride != "httpclientnetcore")
if (runtimeSettings.ClientOverride != "httpclient" && runtimeSettings.ClientOverride != "httpclient2" && runtimeSettings.ClientOverride != "httpclientnetcore" && runtimeSettings.ClientOverride != "httpclient2netcore")
{
logger.Error($"Client override ({runtimeSettings.ClientOverride}) has been deprecated, please remove it from your start arguments");
Environment.Exit(1);

View File

@@ -30,8 +30,8 @@
<ItemGroup>
<PackageReference Include="Autofac" Version="4.9.2" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.4.0" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="CommandLineParser" Version="2.4.3" />
<PackageReference Include="AutoMapper" Version="8.1.0" />
<PackageReference Include="CommandLineParser" Version="2.5.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
@@ -40,7 +40,7 @@
<PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
<PackageReference Include="NLog" Version="4.6.0" />
<PackageReference Include="NLog" Version="4.6.3" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.8.1" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="4.5.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />

View File

@@ -50,7 +50,7 @@ namespace Jackett.Server
{
if (DotNetCoreUtil.IsRunningOnDotNetCore)
{
options.Client = "httpclientnetcore";
options.Client = "httpclient2netcore";
}
else
{

View File

@@ -7,6 +7,7 @@ using NLog;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -31,6 +32,7 @@ namespace Jackett.Server.Services
private List<string> _notices = new List<string>();
private ServerConfig config;
private IProtectionService _protectionService;
private bool isDotNetCoreCapable;
public ServerService(IIndexerManagerService i, IProcessService p, ISerializeService s, IConfigurationService c, Logger l, Common.Utils.Clients.WebClient w, IUpdateService u, IProtectionService protectionService, ServerConfig serverConfig)
{
@@ -279,6 +281,36 @@ namespace Jackett.Server.Services
logger.Error(e, "Error while checking build date of Jackett.Common");
}
//Alert user that they no longer need to use Mono
try
{
Variants variants = new Variants();
Variants.JackettVariant variant = variants.GetVariant();
if (variant == Variants.JackettVariant.Mono)
{
Process process = new Process();
process.StartInfo.FileName = "uname";
process.StartInfo.Arguments = "-m";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
logger.Debug($"uname output was: {output}");
output = output.ToLower();
if (output.Contains("armv7") || output.Contains("armv8") || output.Contains("x86_64"))
{
isDotNetCoreCapable = true;
}
}
}
catch (Exception e)
{
logger.Debug(e, "Unable to get architecture");
}
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
// Load indexers
indexerService.InitIndexers(configService.GetCardigannDefinitionsFolders());
@@ -354,5 +386,10 @@ namespace Jackett.Server.Services
{
return config.APIKey;
}
public bool MonoUserCanRunNetCore()
{
return isDotNetCoreCapable;
}
}
}

View File

@@ -110,7 +110,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser">
<Version>2.4.3</Version>
<Version>2.5.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -6,6 +6,7 @@
<AssemblyName>JackettUpdater</AssemblyName>
<OutputType>Exe</OutputType>
<Version>0.0.0</Version>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
<ItemGroup>

View File

@@ -6,6 +6,7 @@ using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using NLog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -18,11 +19,12 @@ namespace Jackett.Updater
{
private IProcessService processService;
private IServiceConfigService windowsService;
private Logger logger;
public static Logger logger;
private Variants.JackettVariant variant = Variants.JackettVariant.NotFound;
public static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
new Program().Run(args);
}
@@ -182,55 +184,66 @@ namespace Jackett.Updater
// https://github.com/Jackett/Jackett/issues/5022
// https://stackoverflow.com/questions/16764946/what-generates-the-text-file-busy-message-in-unix#comment32135232_16764967
// Delete the ./jackett executable
try
// pdb files are also problematic https://github.com/Jackett/Jackett/issues/5167#issuecomment-489301150
string jackettExecutable = options.Path.TrimEnd('/') + "/jackett";
List<string> pdbFiles = Directory.EnumerateFiles(options.Path, "*.pdb", SearchOption.AllDirectories).ToList();
List<string> removeList = pdbFiles;
removeList.Add(jackettExecutable);
foreach (string fileForDelete in removeList)
{
logger.Info("Attempting to remove the jackett executable from: " + options.Path);
string executable = options.Path.TrimEnd('/') + "/jackett";
if (File.Exists(executable))
try
{
File.Delete(executable);
logger.Info("Deleted " + executable);
logger.Info("Attempting to remove: " + fileForDelete);
if (File.Exists(fileForDelete))
{
File.Delete(fileForDelete);
logger.Info("Deleted " + fileForDelete);
}
else
{
logger.Info("File for deleting not found: " + fileForDelete);
}
}
else
catch (Exception e)
{
logger.Info("jackett executable not found in: " + executable);
logger.Error(e);
}
}
catch (Exception e)
{
logger.Error(e);
}
}
logger.Info("Finding files in: " + updateLocation);
var files = Directory.GetFiles(updateLocation, "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
var fileName = Path.GetFileName(file).ToLowerInvariant();
var files = Directory.GetFiles(updateLocation, "*.*", SearchOption.AllDirectories).OrderBy(x => x).ToList();
logger.Info($"{files.Count()} update files found");
if (fileName.EndsWith(".zip")
|| fileName.EndsWith(".tar")
|| fileName.EndsWith(".gz"))
try
{
foreach (var file in files)
{
continue;
}
try
{
logger.Info("Copying " + fileName);
var dest = Path.Combine(options.Path, file.Substring(updateLocation.Length));
var destDir = Path.GetDirectoryName(dest);
if (!Directory.Exists(destDir))
var fileName = Path.GetFileName(file).ToLowerInvariant();
if (fileName.EndsWith(".zip") || fileName.EndsWith(".tar") || fileName.EndsWith(".gz"))
{
logger.Info("Creating directory " + destDir);
Directory.CreateDirectory(destDir);
continue;
}
bool fileCopySuccess = CopyUpdateFile(options.Path, file, updateLocation, false);
if (!fileCopySuccess)
{
//Perform second attempt, this time removing the target file first
CopyUpdateFile(options.Path, file, updateLocation, true);
}
File.Copy(file, dest, true);
}
catch (Exception e)
{
logger.Error(e);
}
}
catch (Exception ex)
{
logger.Error(ex);
}
logger.Info("File copying complete");
// delete old dirs
string[] oldDirs = new string[] { "Content/logos" };
@@ -323,6 +336,7 @@ namespace Jackett.Updater
"Definitions/crazyhd.yml",
"Definitions/hdplus.yml",
"Definitions/gods.yml",
"Definitions/freedomhd.yml",
};
foreach (var oldFile in oldFiles)
@@ -425,6 +439,73 @@ namespace Jackett.Updater
}
}
private bool CopyUpdateFile(string jackettDestinationDirectory, string fullSourceFilePath, string updateSourceDirectory, bool previousAttemptFailed)
{
bool success = false;
string fileName;
string fullDestinationFilePath;
string fileDestinationDirectory;
try
{
fileName = Path.GetFileName(fullSourceFilePath);
fullDestinationFilePath = Path.Combine(jackettDestinationDirectory, fullSourceFilePath.Substring(updateSourceDirectory.Length));
fileDestinationDirectory = Path.GetDirectoryName(fullDestinationFilePath);
}
catch (Exception e)
{
logger.Error(e);
return false;
}
logger.Info($"Attempting to copy {fileName} from source: {fullSourceFilePath} to destination: {fullDestinationFilePath}");
if (previousAttemptFailed)
{
logger.Info("The first attempt copying file: " + fileName + "failed. Retrying and will delete old file first");
try
{
if (File.Exists(fullDestinationFilePath))
{
logger.Info(fullDestinationFilePath + " was found");
System.Threading.Thread.Sleep(1000);
File.Delete(fullDestinationFilePath);
logger.Info("Deleted " + fullDestinationFilePath);
System.Threading.Thread.Sleep(1000);
}
else
{
logger.Info(fullDestinationFilePath + " was NOT found");
}
}
catch (Exception e)
{
logger.Error(e);
}
}
try
{
if (!Directory.Exists(fileDestinationDirectory))
{
logger.Info("Creating directory " + fileDestinationDirectory);
Directory.CreateDirectory(fileDestinationDirectory);
}
File.Copy(fullSourceFilePath, fullDestinationFilePath, true);
logger.Info("Copied " + fileName);
success = true;
}
catch (Exception e)
{
logger.Error(e);
}
return success;
}
private string GetUpdateLocation()
{
var location = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase);
@@ -443,5 +524,12 @@ namespace Jackett.Updater
return Path.Combine(directoryPath, "JackettConsole.exe");
}
}
private static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
logger.Error(e.ExceptionObject.ToString());
Environment.Exit(1);
}
}
}