mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-13 07:24:08 +02:00
Compare commits
89 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c33f0594bd | ||
![]() |
a4ee8fee8d | ||
![]() |
a12f573e80 | ||
![]() |
ea14a5a194 | ||
![]() |
b9f9c10baf | ||
![]() |
e049376381 | ||
![]() |
e89312b52f | ||
![]() |
4f758ee8cc | ||
![]() |
2f8aa41fe0 | ||
![]() |
8425926636 | ||
![]() |
3e0f25c51b | ||
![]() |
c52199f7ca | ||
![]() |
bede5241c8 | ||
![]() |
9cb9b859a8 | ||
![]() |
47580ec726 | ||
![]() |
8e9290c501 | ||
![]() |
3ddd35d54b | ||
![]() |
6529b1fe38 | ||
![]() |
a58ba9e329 | ||
![]() |
ca7def79d2 | ||
![]() |
c50a29a8e9 | ||
![]() |
f86e8dd5b6 | ||
![]() |
3530fa8244 | ||
![]() |
6f65992bb5 | ||
![]() |
f1c83273f2 | ||
![]() |
fdff9e4406 | ||
![]() |
b8be09a203 | ||
![]() |
aa26654be9 | ||
![]() |
20e21cfc8a | ||
![]() |
068cbcd36b | ||
![]() |
acb649499b | ||
![]() |
8c47f03a55 | ||
![]() |
f63fe9918b | ||
![]() |
c1389c76f3 | ||
![]() |
253f9ad6bb | ||
![]() |
ab63e03e3b | ||
![]() |
46c6039144 | ||
![]() |
b619360bf1 | ||
![]() |
ae316ffc1b | ||
![]() |
e051c13f3a | ||
![]() |
88f290d558 | ||
![]() |
d6f15940b3 | ||
![]() |
e702160c10 | ||
![]() |
f90ba08b2d | ||
![]() |
a05b64a097 | ||
![]() |
ce806a7678 | ||
![]() |
5f41fe3d08 | ||
![]() |
ffa264f333 | ||
![]() |
46aa25772b | ||
![]() |
eeb0b3bc39 | ||
![]() |
cdfdd2c1bb | ||
![]() |
ec985a2318 | ||
![]() |
d7c09e62bd | ||
![]() |
2eb54165ac | ||
![]() |
5bad47d327 | ||
![]() |
8900aea849 | ||
![]() |
85ea6e5a2b | ||
![]() |
c69b213376 | ||
![]() |
992d2776d3 | ||
![]() |
ff62b775db | ||
![]() |
19b608c529 | ||
![]() |
1f9d95355d | ||
![]() |
849d1aeef9 | ||
![]() |
08b187bfa1 | ||
![]() |
d8b4ad7f39 | ||
![]() |
02546877fd | ||
![]() |
52fad1e6d2 | ||
![]() |
049e678b0a | ||
![]() |
4edcda8351 | ||
![]() |
01994bf9f5 | ||
![]() |
0d4c8ba860 | ||
![]() |
fad453cf0e | ||
![]() |
222fcde0a3 | ||
![]() |
6aa42263be | ||
![]() |
ec036d70f9 | ||
![]() |
db300f5ae9 | ||
![]() |
1d224b6db9 | ||
![]() |
a3e97bb050 | ||
![]() |
e5827c3456 | ||
![]() |
27d2b6caae | ||
![]() |
bcdc1879d9 | ||
![]() |
a8999e8276 | ||
![]() |
4c2db157e9 | ||
![]() |
10a46bac48 | ||
![]() |
7d6b282039 | ||
![]() |
f6bb9ca263 | ||
![]() |
11e8d4d290 | ||
![]() |
c88a213b2e | ||
![]() |
4295e65dfe |
16
README.md
16
README.md
@@ -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
|
||||
|
@@ -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.*'
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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
|
@@ -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}\`
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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>
|
||||
|
@@ -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"
|
||||
|
@@ -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
|
||||
|
101
src/Jackett.Common/Definitions/beyond-hd.yml
Normal file
101
src/Jackett.Common/Definitions/beyond-hd.yml
Normal 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
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -6,7 +6,10 @@
|
||||
type: private
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://teamctgame.xyz/
|
||||
legacylinks:
|
||||
- https://teamctgame.co/
|
||||
- http://teamctgame.xyz/
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -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:
|
||||
|
94
src/Jackett.Common/Definitions/efectodoppler.yml
Normal file
94
src/Jackett.Common/Definitions/efectodoppler.yml
Normal 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"
|
@@ -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"
|
@@ -7,8 +7,6 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.frozen-layer.com/
|
||||
certificates:
|
||||
- 001bc21dd13b54b05106b510a327a7182ec443a4
|
||||
|
||||
settings:
|
||||
- name: category
|
||||
|
208
src/Jackett.Common/Definitions/generationfree.yml
Normal file
208
src/Jackett.Common/Definitions/generationfree.yml
Normal 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"
|
@@ -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:
|
||||
|
@@ -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:
|
||||
|
@@ -10,8 +10,6 @@
|
||||
legacylinks:
|
||||
- http://ilcorsaroblu.org/
|
||||
- https://www.ilcorsaroblu.info/
|
||||
certificates:
|
||||
- e6dd93ef71f96d04559e2bee8cc8e6fd74957730 # incomplete CA chain
|
||||
|
||||
caps:
|
||||
categorymappings:
|
||||
|
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -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/
|
||||
|
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -7,8 +7,6 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://nyaa.si/
|
||||
certificates:
|
||||
- 3801e330482d4f9baef71ca4e33ba23ede74f59c # incomplete CA chain
|
||||
|
||||
settings:
|
||||
- name: filter-id
|
||||
|
@@ -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"
|
||||
|
162
src/Jackett.Common/Definitions/siambit.yml
Normal file
162
src/Jackett.Common/Definitions/siambit.yml
Normal 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"
|
@@ -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
|
||||
|
@@ -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:
|
||||
|
527
src/Jackett.Common/Definitions/tapochek.yml
Normal file
527
src/Jackett.Common/Definitions/tapochek.yml
Normal 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 & Flamenco (video)"}
|
||||
- {id: 501, cat: Audio, desc: "Звуки природы"}
|
||||
- {id: 502, cat: Audio, desc: "Психоактивныe аудиопрограммы"}
|
||||
- {id: 504, cat: Audio/Lossless, desc: "Зарубежный Rap, Hip-Hop, R'n'B (lossless)"}
|
||||
- {id: 505, cat: Audio/Lossless, desc: "Отечественный Rap, Hip-Hop, R'n'B (lossless)"}
|
||||
- {id: 506, cat: Audio/MP3, desc: "Зарубежный Rap, Hip-Hop, R'n'B (mp3)"}
|
||||
- {id: 507, cat: Audio/MP3, desc: "Отечественный Rap, Hip-Hop, R'n'B (mp3)"}
|
||||
- {id: 508, cat: Audio/Video, desc: "Rap, Hip-Hop, R'n'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 & 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 & 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"
|
99
src/Jackett.Common/Definitions/teamhd.yml
Normal file
99
src/Jackett.Common/Definitions/teamhd.yml
Normal 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"
|
@@ -31,6 +31,8 @@
|
||||
paths:
|
||||
- path: src/releaselist.php
|
||||
method: post
|
||||
headers:
|
||||
Referer: ["{{.Config.sitelink}}?releaselist"]
|
||||
inputs:
|
||||
cat: 0
|
||||
page: 1
|
||||
|
@@ -45,7 +45,7 @@
|
||||
settings: []
|
||||
|
||||
download:
|
||||
selector: a[href^="/downloading/"]
|
||||
selector: a.download:contains("le Torrent")
|
||||
|
||||
search:
|
||||
paths:
|
||||
|
@@ -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:
|
||||
|
@@ -6,6 +6,8 @@
|
||||
type: public
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://gotorrentkitty.cc/
|
||||
legacylinks:
|
||||
- http://cntorrentkitty.com/
|
||||
- http://cntorrentkitty.xyz/
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -7,8 +7,6 @@
|
||||
encoding: UTF-8
|
||||
links:
|
||||
- https://www.trancetraffic.com/
|
||||
certificates:
|
||||
- 117B89D7C086F3E051F0A5A3576504667402AE52
|
||||
|
||||
caps:
|
||||
categories:
|
||||
|
@@ -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)
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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");
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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");
|
||||
|
@@ -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");
|
||||
|
@@ -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()));
|
||||
|
@@ -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))
|
||||
|
@@ -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"));
|
||||
|
@@ -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)
|
||||
|
@@ -31,7 +31,7 @@ namespace Jackett.Common.Indexers.Feeds
|
||||
SearchAvailable = true,
|
||||
TVSearchAvailable = false,
|
||||
MovieSearchAvailable = false,
|
||||
SupportsImdbSearch = false,
|
||||
SupportsImdbMovieSearch = false,
|
||||
SupportsTVRageSearch = false
|
||||
};
|
||||
|
||||
|
@@ -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();
|
||||
|
||||
|
@@ -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();
|
||||
|
||||
// סרטים
|
||||
|
@@ -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;
|
||||
|
@@ -42,7 +42,7 @@ namespace Jackett.Common.Indexers
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
TorznabCaps.SupportsImdbSearch = true;
|
||||
TorznabCaps.SupportsImdbMovieSearch = true;
|
||||
|
||||
TorznabCaps.Categories.Clear();
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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");
|
||||
|
@@ -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");
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -48,7 +48,7 @@ namespace Jackett.Common.Indexers
|
||||
Language = "en-us";
|
||||
Type = "private";
|
||||
|
||||
TorznabCaps.SupportsImdbSearch = true;
|
||||
TorznabCaps.SupportsImdbMovieSearch = true;
|
||||
|
||||
AddCategoryMapping(1, TorznabCatType.MoviesHD);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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.
|
||||
|
||||
|
@@ -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");
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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\"]");
|
||||
|
@@ -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);
|
||||
|
@@ -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");
|
||||
|
@@ -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");
|
||||
|
@@ -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;
|
||||
|
@@ -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";
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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");
|
||||
|
@@ -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");
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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" />
|
||||
|
@@ -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;
|
||||
|
@@ -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 };
|
||||
|
@@ -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 };
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -16,5 +16,6 @@ namespace Jackett.Common.Services.Interfaces
|
||||
List<string> notices { get; }
|
||||
string GetBlackholeDirectory();
|
||||
string GetApiKey();
|
||||
bool MonoUserCanRunNetCore();
|
||||
}
|
||||
}
|
||||
|
343
src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs
Normal file
343
src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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");
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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" />
|
||||
|
@@ -50,7 +50,7 @@ namespace Jackett.Server
|
||||
{
|
||||
if (DotNetCoreUtil.IsRunningOnDotNetCore)
|
||||
{
|
||||
options.Client = "httpclientnetcore";
|
||||
options.Client = "httpclient2netcore";
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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" />
|
||||
|
@@ -6,6 +6,7 @@
|
||||
<AssemblyName>JackettUpdater</AssemblyName>
|
||||
<OutputType>Exe</OutputType>
|
||||
<Version>0.0.0</Version>
|
||||
<ServerGarbageCollection>false</ServerGarbageCollection>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user