Compare commits

..

71 Commits

Author SHA1 Message Date
Garfield69
0b12640d58 torrentland: add missing categories 2019-02-06 07:50:10 +13:00
Garfield69
5329125950 Revert "Update torrentland.yml (#4578) resolves #3708"
This reverts commit 0300942a8f.
2019-02-06 07:36:41 +13:00
Garfield69
7128e0c599 add CasStudioTV a Russian Private TV site. Resolves #3285 2019-02-05 20:11:39 +13:00
Garfield69
6f9a2caa18 ettv: fix results for TEST. resolves #4602 2019-02-05 17:54:34 +13:00
Garfield69
e98fad4f73 add XWTorrents a private tracker for pro wresting and mma. resolves #1876 2019-02-05 17:29:48 +13:00
Garfield69
2eb76ffb86 Revert "torrentland: possible untested fix for #4599"
This reverts commit bb2c8e6c6a.
2019-02-05 10:53:04 +13:00
Garfield69
4ffc9f06c9 add pwtorrent a pro wrestling site. resolves #3683 2019-02-05 10:26:35 +13:00
Garfield69
14912bba09 hdchina: cosmetic update description 2019-02-05 10:25:26 +13:00
Garfield69
bb2c8e6c6a torrentland: possible untested fix for #4599 2019-02-05 07:16:35 +13:00
djoole
c4c91cc462 yggtorrent: replaced " " by """" for improved searches (#4597)
replace spaces in searched name by quotation marks so that a YGG search engine return results on partial keywords
2019-02-05 06:33:55 +13:00
Garfield69
fd036ecef9 add how to get cookie to yaml indexers 2019-02-04 19:26:40 +13:00
Garfield69
72c28319f3 add pt99 a Chinese Private tracker. resolves #4147 2019-02-04 19:25:11 +13:00
Garfield69
d255e83756 film-paleis: andmatch results 2019-02-04 17:42:43 +13:00
Garfield69
a41c45b7d3 takeabyte: fix cat 37 2019-02-04 14:53:16 +13:00
Garfield69
83d11a58cb hdchina: fix volumefactor 2019-02-04 14:00:45 +13:00
Garfield69
fbadc4f3a9 hdchina: enable imdbid searches 2019-02-04 13:22:37 +13:00
Garfield69
7bf35bda8f torrentcouch: changes for results page 2019-02-04 06:40:23 +13:00
Garfield69
f65df4e45d add TakeaByte a NORDIC Private tracker. resolves #4153
will need to login once my profile freeleech has expired in order to define more download and upload volumefactors
2019-02-03 20:15:47 +13:00
Garfield69
da3f84527d cpasbienclone: new domain .cm 2019-02-03 19:49:38 +13:00
Garfield69
b915e815e9 iptorrents: add www. to the alternate links list. resolves #4594 2019-02-03 18:53:09 +13:00
Garfield69
1ef7dcf457 add 3evils a Private torrent tracker. resolves #4264
I may need to revisit the download and upload volumefactors once my profile gets old enough to stop getting automatic freeleech.
2019-02-03 17:07:39 +13:00
Garfield69
9eb52b76ca add film-paleis, a Dutch semi-private site. resolves #2651 2019-02-03 06:39:25 +13:00
Garfield69
55cae3657e add Monova a Public indexer. resolves #4447 2019-02-02 17:10:53 +13:00
Garfield69
953e3cf701 tntvillage: domain change, dropped www. resolves #4582 2019-02-02 06:43:53 +13:00
Garfield69
7a7c00c562 add TorrentFunk a Public search engine 2019-02-01 16:55:14 +13:00
Garfield69
7d39938af6 torlock: add alternate domains 2019-02-01 12:22:30 +13:00
Garfield69
47d815c805 rutor: amend to handle mirrors. resolves #4446 2019-02-01 10:55:50 +13:00
Oscar Menéndez García
0300942a8f Update torrentland.yml (#4578) resolves #3708
Update tracker definition.
2019-02-01 08:53:51 +13:00
Garfield69
0ba21e3f18 ilcorsaronero: : add default trackers to magnet. 2019-02-01 07:32:55 +13:00
Garfield69
008b995df4 torrentz2: add default trackers to magnet. resolves #4574 2019-02-01 07:32:44 +13:00
Garfield69
7dd8e247c8 add Alein a Bulgarian semi-private tracker. resolves #4021 2019-01-31 21:49:48 +13:00
Garfield69
c408c6880c add Vanila a Russian semi-private torrent forum. resolves #4003 2019-01-31 17:54:35 +13:00
Garfield69
68aa4184e0 cpasbienclone: new domain www2. 2019-01-31 07:29:33 +13:00
Garfield69
0407b15c1b add shokweb a chinese public ste. resolves #3210 2019-01-30 17:12:55 +13:00
Garfield69
27240bcfed add TorrentKitty a Chinese Public tracker. #3210 2019-01-30 15:21:38 +13:00
Garfield69
a3f0131156 greekteam: possible fix for #4540 2019-01-30 08:28:35 +13:00
Romain Lecat
5924a4fd22 YggTorrent: domain change www2. (#4565) 2019-01-30 06:09:49 +13:00
Garfield69
296c218308 add BTKitty, a public DHT search engine. resolves #2974 2019-01-29 20:35:29 +13:00
Garfield69
bce1689bfe torrent9: new domain wvw. 2019-01-29 19:13:45 +13:00
Garfield69
d0d4dcf11d gktorrent: new domain .tv 2019-01-29 16:36:46 +13:00
Garfield69
5a1f9e4af9 add Torrof public meta-search engine. resolves #4165 2019-01-28 12:33:48 +13:00
xfouloux
a2946ca903 Update archetorrent.yml (#4546)
add options like on yggtorrent to rewrite MULTI with MULTI.FRENCH or ENGLISH etc...
other sames options of rewrite vostfr etc...
2019-01-27 20:12:43 +13:00
Garfield69
a2c881a968 add DIGBT a public DHT search engine. resolves #4344 2019-01-27 20:10:25 +13:00
Garfield69
25ae101654 Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-26 20:52:17 +13:00
Garfield69
b9c2f8ad5d add GDF76 semi-private site for ITA films in mp4 format optimized for streaming resolves #4253 2019-01-26 20:52:14 +13:00
Lewis Dexter Litanzios
ba39c8ad5b Update README.md (#4534) 2019-01-26 18:39:05 +11:00
maxtop51
a45770f541 Create cpasbienclone.yml (#4545)
* Create cpasbienclone.yml

* Update README.md

* Update cpasbienclone.yml
2019-01-26 14:35:00 +13:00
WSHaRK993
ba565e0376 Delete HDForever.cs (#4539) 2019-01-26 10:36:51 +13:00
WSHaRK993
649d53f857 Incomplete HD-Forever API remplacement. (#4538)
Gazelle API from HD-Forever doesn't push languages, releasers, and download factors. Here is a remplacement.

 src/Jackett.Common/Indexers/HDForever.cs should be deleted.
2019-01-26 10:36:28 +13:00
Garfield69
f612345fac skytorrentsclone: make itorrents link optional. resolves #4542 2019-01-26 10:31:46 +13:00
Garfield69
d8607ee0f2 yggtorrent: new domain www.yggtorrent.gg 2019-01-25 06:32:19 +13:00
flightlevel
8c84bed209 Add BuildOutputPath parameter to publish 2019-01-24 20:17:01 +11:00
Romain Lecat
655448fb74 Fix for YggTorrent shitty URL management. Thanks to @xfouloux for this. Fixes #4504 (#4521)
* Fix for YggTorrent shitty URL management. Thanks to @xfouloux for this. Fixes #4504

* Add option to perform agressive quality mapping, required for some fr anime releases

* Correct search URL for yggtorrent by default

* Revert "Add option to perform agressive quality mapping, required for some fr anime releases"

This reverts commit b74042362c.
2019-01-24 20:15:18 +11:00
flightlevel
15049a4efb VS 15.9 required for .NET Core 2.2
Testing the updater
2019-01-21 21:27:01 +11:00
flightlevel
a90ed2601a Add variants to the updater 2019-01-21 21:18:59 +11:00
flightlevel
fa71356666 Update AngleSharp to v0.10
Breaking changes in AngleSharp v0.10, more information here https://github.com/AngleSharp/AngleSharp/blob/master/doc/Migration.md
2019-01-20 11:09:27 +11:00
flightlevel
12ffb4cbe7 Add missing BuildOutputPath 2019-01-20 10:14:31 +11:00
flightlevel
b67f59e865 Create separate tasks for each NetCore variant 2019-01-20 09:56:38 +11:00
flightlevel
d51dda4434 Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-20 09:54:59 +11:00
flightlevel
70666c459b Change assembly name to jackett for Non-Windows .NET Core 2019-01-20 09:54:11 +11:00
Garfield69
60b7c7860b Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-20 07:29:24 +13:00
Garfield69
fc343b336f t9clone: follow redirect plus new domain 2019-01-20 07:29:21 +13:00
flightlevel
8cacbcc9b9 Make build.sh executable 2019-01-19 17:28:13 +11:00
flightlevel
e48a20f93d First steps to make Cake compatible with Linux
Working, but still needs some improvements
2019-01-19 17:23:56 +11:00
kaso17
5d2c64711f Merge branch 'master' of https://github.com/Jackett/Jackett 2019-01-18 11:17:22 +01:00
kaso17
a76becef3a superbits: use cookie login 2019-01-18 11:17:00 +01:00
mrhydejc
82c7900f77 YGG: Enhance sonarr compatibility with anime by renaming episode (xxx -> Exxx) (#4478) 2019-01-18 11:04:06 +01:00
flightlevel
3984af24fd Trigger build 2019-01-18 06:56:39 +11:00
Aurelien
375fc86937 fix parse error in EliteTracker indexer (#4471) 2019-01-16 21:06:53 +01:00
Garfield69
3d99aa3863 torrent9clone: new domain www>www1 2019-01-17 07:53:43 +13:00
Jorman
5e48f764aa shareisland: fetch more results (#4469) 2019-01-16 15:40:53 +01:00
74 changed files with 3171 additions and 231 deletions

1
.gitattributes vendored
View File

@@ -6,6 +6,7 @@
# Declare files that will always have LF line endings on checkout.
*.yml text eol=lf
*.sh text eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.cs text eol=crlf

View File

@@ -27,7 +27,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* AudioBookBay
* BTstor.net
* btbit
* BTKitty
* cpasbien
* cpasbienClone
* DIGBT
* ETTV
* EliteTorrent.biz
* ExtraTorrent.ag
@@ -45,6 +48,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* LimeTorrents
* MagnetDL
* MejorTorrent <!-- maintained by ivandelabeldad -->
* Monova
* Newpct (aka: tvsinpagar, descargas2020, torrentlocura, torrentrapid, tumejortorrent, pctnew, etc)
* Nyaa.si
* Nyaa-Pantsu
@@ -52,6 +56,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* ProStyleX
* RARBG
* RuTor
* shokweb
* ShowRSS
* SkyTorrentsClone
* sukebei.Nyaa.si
@@ -62,21 +67,27 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Torlock
* TorrentCouch
* Torrent Downloads
* TorrentFunk
* TorrentGalaxy.org
* TorrentKitty
* Torrent9
* Torernt9 clone (torrents9.ch)
* Torrentz2
* Torrof
* World Wide Torrents
* YTS.ag
* Zooqle
### Supported Semi-Private Trackers
* 7tor
* Alein
* ArenaBG
* CzTorrent
* Deildu
* Film-Paleis
* Gay-Torrents.net
* Gay-Torrents.org
* GDF76
* Kinozal
* LostFilm.tv
* Mega-Bliz
@@ -90,6 +101,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* RuTracker
* SkTorrent
* Union Fansub
* Vanila
* Xtreme Zone
* YggTorrent
* Ztracker
@@ -97,6 +109,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
### Supported Private Trackers
* 2 Fast 4 You
* 3D Torrents
* 3evils
* 420files
* 720pier
* Abnormal
@@ -141,6 +154,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* BTNext (BTNT)
* BTXpress (BTX)
* Carpathians
* CasStudioTV
* CCFBits
* CGPeers
* CHDBits
@@ -190,7 +204,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* HD-Torrents (HDT)
* HD-Bits.com
* HDBits
* HDChina
* HDChina (HDWing)
* HDCity
* HDHome (HDBigger)
* HDME
@@ -238,8 +252,10 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* Pretome
* PrivateHD (PHD)
* Psytorrents
* PT99
* PTFiles
* PuntoTorrent
* PWTorrents (PWT)
* Racing4Everyone (R4E)
* Redacted (PassTheHeadphones)
* Red Star Torrent
@@ -266,6 +282,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* SportsCult
* SportHD
* Superbits
* TakeaByte
* Tasmanit
* TBPlus
* TenYardTracker
@@ -310,6 +327,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/
* x-ite.me (XM)
* xBytesV2
* XSpeeds
* XWTorrents (XWT)
* Xthor
* ExoticaZ (Your Exotic Torrents)
* Zamunda.net
@@ -454,14 +472,27 @@ To use it, please just request a free API key on [OMDb](http://www.omdbapi.com/a
Please supply as much information about the problem you are experiencing as possible. Your issue has a much greater chance of being resolved if logs are supplied so that we can see what is going on. Creating an issue with '### isn't working' doesn't help anyone to fix the problem.
## Contributing
All contributions are welcome just send a pull request. Jackett's framework allows our team (and any other volunteering dev) to implement new trackers in an hour or two. If you'd like support for a new tracker but are not a developer then feel free to leave a request on the [issues page](https://github.com/Jackett/Jackett/issues). It is recommended to use Visual Studio 2017 when making code changes in this project. You can download the community version for free [here](https://www.visualstudio.com/downloads/).
Jackett's framework typically allows our team and volunteering developers to implement new trackers in a couple of hours
Depending on logic complexity, there are two common ways new trackers are implemented:
1. simple [definitions](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Definitions) (.yml / YAML), and;
2. advanced (native) [indexers](http://github.com/Jackett/Jackett/tree/master/src/Jackett.Common/Indexers) (.cs / C#)
Read more about the [simple definition format](https://github.com/Jackett/Jackett/wiki/Definition-format).
If you are a developer then it's recommended to download the free community version of [Visual Studio](http://visualstudio.com)
If you are not a developer and would like a (new) tracker supported then feel free to leave an [issue](https://github.com/Jackett/Jackett/issues) request.
All contributions are welcome just send a pull request.
## Building from source
### Windows
* Install the .NET Core [SDK](https://www.microsoft.com/net/download/windows)
* Open the Jackett solution in Visual Studio 2017 (version 15.7 or above)
* 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
* In the drop down menu of the run button select "Jackett.Server" instead of "IIS Express"

View File

@@ -1,6 +1,10 @@
version: 0.10.{build}
skip_tags: true
image: Visual Studio 2017
image:
- Visual Studio 2017
- Ubuntu
environment:
APPVEYOR_YML_DISABLE_PS_LINUX: true
configuration: Release
assembly_info:
patch: true
@@ -17,7 +21,8 @@ dotnet_csproj:
file_version: '{version}'
informational_version: '{version}'
build_script:
- ps: .\build.ps1
- ps: .\build.ps1 --target=Default
- sh: ./build.sh --target=Linux
test: off
before_deploy:
- ps: ${env:release_description} = ( Get-Content -LiteralPath BuildOutput/ReleaseNotes.txt -Encoding UTF8 ) -join "`n";

View File

@@ -16,6 +16,7 @@ var configuration = Argument("configuration", "Debug");
var workingDir = MakeAbsolute(Directory("./"));
var artifactsDirName = "Artifacts";
var testResultsDirName = "TestResults";
var netCoreFramework = "netcoreapp2.2";
//////////////////////////////////////////////////////////////////////
// TASKS
@@ -25,8 +26,17 @@ Task("Info")
.Does(() =>
{
Information(@"Jackett Cake build script starting...");
Information(@"Requires InnoSetup and C:\cygwin to be present for packaging (Pre-installed on AppVeyor)");
Information(@"Requires InnoSetup and C:\cygwin to be present for packaging (Pre-installed on AppVeyor) on Windows");
Information(@"Working directory is: " + workingDir);
if (IsRunningOnWindows())
{
Information("Platform is Windows");
}
else
{
Information("Platform is Linux, Windows builds will be skipped");
}
});
Task("Clean")
@@ -39,6 +49,8 @@ Task("Clean")
CleanDirectories("./" + artifactsDirName);
CleanDirectories("./" + testResultsDirName);
CreateDirectory("./" + artifactsDirName);
Information("Clean completed");
});
@@ -67,41 +79,26 @@ Task("Run-Unit-Tests")
Results = new[] { new NUnit3Result { FileName = resultsFile } }
});
if(AppVeyor.IsRunningOnAppVeyor)
if (AppVeyor.IsRunningOnAppVeyor && IsRunningOnWindows())
{
AppVeyor.UploadTestResults(resultsFile, AppVeyorTestResultsType.NUnit3);
}
});
Task("Check-Packaging-Platform")
Task("Package-Windows-Full-Framework")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
if (IsRunningOnWindows())
{
CreateDirectory("./" + artifactsDirName);
Information("Platform is Windows");
}
else
{
throw new Exception("Packaging is currently only implemented for a Windows environment");
}
});
Task("Package-Windows-Full-Framework")
.IsDependentOn("Check-Packaging-Platform")
.Does(() =>
{
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = "./BuildOutput/Experimental/net461/win7-x86/Jackett";
string buildOutputPath = "./BuildOutput/net461/win7-x86/Jackett";
DotNetCorePublish(serverProjectPath, "net461", "win7-x86");
DotNetCorePublish(serverProjectPath, "net461", "win7-x86", buildOutputPath);
CopyFiles("./src/Jackett.Service/bin/" + configuration + "/JackettService.*", buildOutputPath);
CopyFiles("./src/Jackett.Tray/bin/" + configuration + "/JackettTray.*", buildOutputPath);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
Zip("./BuildOutput/Experimental/net461/win7-x86", $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
Zip("./BuildOutput/net461/win7-x86", $"./{artifactsDirName}/Jackett.Binaries.Windows.zip");
//InnoSetup
string sourceFolder = MakeAbsolute(Directory(buildOutputPath)).ToString();
@@ -119,16 +116,20 @@ Task("Package-Windows-Full-Framework")
});
Task("Package-Mono-Full-Framework")
.IsDependentOn("Check-Packaging-Platform")
.IsDependentOn("Run-Unit-Tests")
.Does(() =>
{
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = "./BuildOutput/Experimental/net461/linux-x64/Jackett";
string buildOutputPath = "./BuildOutput/net461/linux-x64/Jackett";
DotNetCorePublish(serverProjectPath, "net461", "linux-x64");
DotNetCorePublish(serverProjectPath, "net461", "linux-x64", buildOutputPath);
CopyFiles("./src/Jackett.Updater/bin/" + configuration + "/net461" + "/JackettUpdater.*", buildOutputPath); //builds against multiple frameworks
CopyFileToDirectory("./install_service_macos", buildOutputPath);
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);
//There is an issue with Mono 5.8 (fixed in Mono 5.12) where its expecting to use its own patched version of System.Net.Http.dll, instead of the version supplied in folder
//https://github.com/dotnet/corefx/issues/19914
//https://bugzilla.xamarin.com/show_bug.cgi?id=60315
@@ -145,40 +146,77 @@ Task("Package-Mono-Full-Framework")
DeleteFile(buildOutputPath + "/System.Runtime.InteropServices.RuntimeInformation.dll");
Gzip("./BuildOutput/Experimental/net461/linux-x64", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.Mono.tar.gz");
Gzip("./BuildOutput/net461/linux-x64", $"./{artifactsDirName}", "Jackett", "Jackett.Binaries.Mono.tar.gz");
});
Task("Experimental-DotNetCore")
.IsDependentOn("Check-Packaging-Platform")
Task("Package-DotNetCore-macOS")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "osx-x64";
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "win-x86");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "osx-x64");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "linux-x64");
DotNetCorePublish(serverProjectPath, "netcoreapp2.2", "linux-arm");
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
Zip("./BuildOutput/Experimental/netcoreapp2.2/win-x86", $"./{artifactsDirName}/Experimental.netcoreapp.win-x86.zip");
Zip("./BuildOutput/Experimental/netcoreapp2.2/osx-x64", $"./{artifactsDirName}/Experimental.netcoreapp.osx-x64.zip");
Gzip("./BuildOutput/Experimental/netcoreapp2.2/linux-x64", $"./{artifactsDirName}", "Jackett", "Experimental.netcoreapp.linux-x64.tar.gz");
Gzip("./BuildOutput/Experimental/netcoreapp2.2/linux-arm", $"./{artifactsDirName}", "Jackett", "Experimental.netcoreapp.linux-arm.tar.gz");
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
CopyFileToDirectory("./install_service_macos", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Experimental.Jackett.Binaries.macOS.tar.gz");
});
Task("Package")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
.IsDependentOn("Experimental-DotNetCore")
Task("Package-DotNetCore-LinuxAMD64")
.IsDependentOn("Clean")
.Does(() =>
{
Information("Packaging completed");
string runtimeId = "linux-x64";
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Experimental.Jackett.Binaries.LinuxAMD64.tar.gz");
});
Task("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "linux-arm";
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Experimental.Jackett.Binaries.LinuxARM32.tar.gz");
});
Task("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Clean")
.Does(() =>
{
string runtimeId = "linux-arm64";
string serverProjectPath = "./src/Jackett.Server/Jackett.Server.csproj";
string buildOutputPath = $"./BuildOutput/{netCoreFramework}/{runtimeId}/Jackett";
DotNetCorePublish(serverProjectPath, netCoreFramework, runtimeId, buildOutputPath);
CopyFileToDirectory("./install_service_systemd.sh", buildOutputPath);
CopyFileToDirectory("./Upstart.config", buildOutputPath);
Gzip($"./BuildOutput/{netCoreFramework}/{runtimeId}", $"./{artifactsDirName}", "Jackett", "Experimental.Jackett.Binaries.LinuxARM64.tar.gz");
});
Task("Appveyor-Push-Artifacts")
.IsDependentOn("Package")
.IsDependentOn("Clean")
.Does(() =>
{
if (AppVeyor.IsRunningOnAppVeyor)
if (AppVeyor.IsRunningOnAppVeyor && IsRunningOnWindows())
{
foreach (var file in GetFiles(workingDir + $"/{artifactsDirName}/*"))
{
@@ -187,12 +225,12 @@ Task("Appveyor-Push-Artifacts")
}
else
{
Information(@"Skipping as not running in AppVeyor Environment");
Information(@"Skipping artifact push as not running in AppVeyor Windows Environment");
}
});
Task("Release-Notes")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Clean")
.Does(() =>
{
string latestTag = GitDescribe(".", false, GitDescribeStrategy.Tags, 0);
@@ -230,7 +268,7 @@ Task("Release-Notes")
string buildNote = String.Join(Environment.NewLine, notesList);
Information(buildNote);
System.IO.File.WriteAllLines(workingDir + "\\BuildOutput\\ReleaseNotes.txt", notesList.ToArray());
System.IO.File.WriteAllLines(workingDir + "/BuildOutput/ReleaseNotes.txt", notesList.ToArray());
}
else
{
@@ -239,6 +277,32 @@ Task("Release-Notes")
});
Task("Windows-Environment")
.IsDependentOn("Package-Windows-Full-Framework")
.IsDependentOn("Package-Mono-Full-Framework")
.IsDependentOn("Package-DotNetCore-macOS")
.IsDependentOn("Package-DotNetCore-LinuxAMD64")
.IsDependentOn("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Release-Notes")
.Does(() =>
{
Information("Windows-Environment Task Completed");
});
Task("Linux-Environment")
.IsDependentOn("Package-DotNetCore-macOS")
.IsDependentOn("Package-DotNetCore-LinuxAMD64")
.IsDependentOn("Package-DotNetCore-LinuxARM32")
.IsDependentOn("Package-DotNetCore-LinuxARM64")
.IsDependentOn("Appveyor-Push-Artifacts")
.IsDependentOn("Release-Notes")
.Does(() =>
{
Information("Linux-Environment Task Completed");
});
private void RunCygwinCommand(string utility, string utilityArguments)
{
@@ -285,29 +349,52 @@ private string RelativeWinPathToCygPath(string relativePath)
return cygPath;
}
private void Gzip(string sourceFolder, string outputDirectory, string tarCdirectoryOption, string outputFileName)
private void RunLinuxCommand(string file, string arg)
{
var cygSourcePath = RelativeWinPathToCygPath(sourceFolder);
var tarFileName = outputFileName.Remove(outputFileName.Length - 3, 3);
var tarArguments = @"-cvf " + cygSourcePath + "/" + tarFileName + " -C " + cygSourcePath + $" {tarCdirectoryOption} --mode ='755'";
var gzipArguments = @"-k " + cygSourcePath + "/" + tarFileName;
var startInfo = new System.Diagnostics.ProcessStartInfo()
{
Arguments = arg,
FileName = file,
UseShellExecute = true
};
RunCygwinCommand("Tar", tarArguments);
RunCygwinCommand("Gzip", gzipArguments);
MoveFile($"{sourceFolder}/{tarFileName}.gz", $"{outputDirectory}/{tarFileName}.gz");
var process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();
}
private void DotNetCorePublish(string projectPath, string framework, string runtime)
private void Gzip(string sourceFolder, string outputDirectory, string tarCdirectoryOption, string outputFileName)
{
var tarFileName = outputFileName.Remove(outputFileName.Length - 3, 3);
if (IsRunningOnWindows())
{
var cygSourcePath = RelativeWinPathToCygPath(sourceFolder);
var tarArguments = @"-cvf " + cygSourcePath + "/" + tarFileName + " -C " + cygSourcePath + $" {tarCdirectoryOption} --mode ='755'";
var gzipArguments = @"-k " + cygSourcePath + "/" + tarFileName;
RunCygwinCommand("Tar", tarArguments);
RunCygwinCommand("Gzip", gzipArguments);
MoveFile($"{sourceFolder}/{tarFileName}.gz", $"{outputDirectory}/{tarFileName}.gz");
}
else
{
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type d -exec chmod 755 {} \;");
RunLinuxCommand("find", MakeAbsolute(Directory(sourceFolder)) + @" -type f -exec chmod 644 {} \;");
//RunLinuxCommand("chmod", $"755 {MakeAbsolute(Directory(sourceFolder))} /Jackett/jackett");
RunLinuxCommand("tar", $"-C {sourceFolder} -zcvf {outputDirectory}/{tarFileName}.gz {tarCdirectoryOption}");
}
}
private void DotNetCorePublish(string projectPath, string framework, string runtime, string outputPath)
{
var settings = new DotNetCorePublishSettings
{
Framework = framework,
Runtime = runtime,
OutputDirectory = $"./BuildOutput/Experimental/{framework}/{runtime}/Jackett"
};
{
Framework = framework,
Runtime = runtime,
OutputDirectory = outputPath
};
DotNetCorePublish(projectPath, settings);
DotNetCorePublish(projectPath, settings);
}
//////////////////////////////////////////////////////////////////////
@@ -315,12 +402,19 @@ private void DotNetCorePublish(string projectPath, string framework, string runt
//////////////////////////////////////////////////////////////////////
Task("Default")
.IsDependentOn("Release-Notes")
.IsDependentOn("Windows-Environment")
.Does(() =>
{
Information("Default Task Completed");
});
Task("Linux")
.IsDependentOn("Linux-Environment")
.Does(() =>
{
Information("Linux Task Completed");
});
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////

View File

@@ -25,10 +25,6 @@ Specifies the amount of information to be displayed.
Shows description about tasks.
.PARAMETER DryRun
Performs a dry run.
.PARAMETER Experimental
Uses the nightly builds of the Roslyn script engine.
.PARAMETER Mono
Uses the Mono Compiler rather than the Roslyn script engine.
.PARAMETER SkipToolPackageRestore
Skips restoring of packages.
.PARAMETER ScriptArgs
@@ -49,13 +45,25 @@ Param(
[switch]$ShowDescription,
[Alias("WhatIf", "Noop")]
[switch]$DryRun,
[switch]$Experimental,
[switch]$Mono,
[switch]$SkipToolPackageRestore,
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$ScriptArgs
)
# Attempt to set highest encryption available for SecurityProtocol.
# PowerShell will not set this by default (until maybe .NET 4.6.x). This
# will typically produce a message for PowerShell v2 (just an info
# message though)
try {
# Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)
# Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won't
# exist in .NET 4.0, even though they are addressable if .NET 4.5+ is
# installed (.NET 4.5 is an in-place upgrade).
[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48
} catch {
Write-Output 'Unable to set PowerShell to use TLS 1.2 and TLS 1.1 due to old .NET Framework installed. If you see underlying connection closed or trust errors, you may need to upgrade to .NET Framework 4.5+ and PowerShell v3'
}
[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
function MD5HashFile([string] $filePath)
{
@@ -85,7 +93,7 @@ function GetProxyEnabledWebClient
{
$wc = New-Object System.Net.WebClient
$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$wc.Proxy = $proxy
return $wc
}
@@ -115,10 +123,11 @@ if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
# Make sure that packages.config exist.
if (!(Test-Path $PACKAGES_CONFIG)) {
Write-Verbose -Message "Downloading packages.config..."
try {
Write-Verbose -Message "Downloading packages.config..."
try {
$wc = GetProxyEnabledWebClient
$wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch {
$wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG)
} catch {
Throw "Could not download packages.config."
}
}
@@ -225,8 +234,6 @@ if ($Configuration) { $cakeArguments += "-configuration=$Configuration" }
if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
if ($ShowDescription) { $cakeArguments += "-showdescription" }
if ($DryRun) { $cakeArguments += "-dryrun" }
if ($Experimental) { $cakeArguments += "-experimental" }
if ($Mono) { $cakeArguments += "-mono" }
$cakeArguments += $ScriptArgs
# Start Cake

117
build.sh Executable file
View File

@@ -0,0 +1,117 @@
#!/usr/bin/env bash
##########################################################################
# This is the Cake bootstrapper script for Linux and OS X.
# This file was downloaded from https://github.com/cake-build/resources
# Feel free to change this file to fit your needs.
##########################################################################
# Define directories.
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
TOOLS_DIR=$SCRIPT_DIR/tools
ADDINS_DIR=$TOOLS_DIR/Addins
MODULES_DIR=$TOOLS_DIR/Modules
NUGET_EXE=$TOOLS_DIR/nuget.exe
CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe
PACKAGES_CONFIG=$TOOLS_DIR/packages.config
PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum
ADDINS_PACKAGES_CONFIG=$ADDINS_DIR/packages.config
MODULES_PACKAGES_CONFIG=$MODULES_DIR/packages.config
# Define md5sum or md5 depending on Linux/OSX
MD5_EXE=
if [[ "$(uname -s)" == "Darwin" ]]; then
MD5_EXE="md5 -r"
else
MD5_EXE="md5sum"
fi
# Define default arguments.
SCRIPT="build.cake"
CAKE_ARGUMENTS=()
# Parse arguments.
for i in "$@"; do
case $1 in
-s|--script) SCRIPT="$2"; shift ;;
--) shift; CAKE_ARGUMENTS+=("$@"); break ;;
*) CAKE_ARGUMENTS+=("$1") ;;
esac
shift
done
# Make sure the tools folder exist.
if [ ! -d "$TOOLS_DIR" ]; then
mkdir "$TOOLS_DIR"
fi
# Make sure that packages.config exist.
if [ ! -f "$TOOLS_DIR/packages.config" ]; then
echo "Downloading packages.config..."
curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages
if [ $? -ne 0 ]; then
echo "An error occurred while downloading packages.config."
exit 1
fi
fi
# Download NuGet if it does not exist.
if [ ! -f "$NUGET_EXE" ]; then
echo "Downloading NuGet..."
curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
if [ $? -ne 0 ]; then
echo "An error occurred while downloading nuget.exe."
exit 1
fi
fi
# Restore tools from NuGet.
pushd "$TOOLS_DIR" >/dev/null
if [ ! -f "$PACKAGES_CONFIG_MD5" ] || [ "$( cat "$PACKAGES_CONFIG_MD5" | sed 's/\r$//' )" != "$( $MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' )" ]; then
find . -type d ! -name . ! -name 'Cake.Bakery' | xargs rm -rf
fi
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet tools."
exit 1
fi
$MD5_EXE "$PACKAGES_CONFIG" | awk '{ print $1 }' >| "$PACKAGES_CONFIG_MD5"
popd >/dev/null
# Restore addins from NuGet.
if [ -f "$ADDINS_PACKAGES_CONFIG" ]; then
pushd "$ADDINS_DIR" >/dev/null
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet addins."
exit 1
fi
popd >/dev/null
fi
# Restore modules from NuGet.
if [ -f "$MODULES_PACKAGES_CONFIG" ]; then
pushd "$MODULES_DIR" >/dev/null
mono "$NUGET_EXE" install -ExcludeVersion
if [ $? -ne 0 ]; then
echo "Could not restore NuGet modules."
exit 1
fi
popd >/dev/null
fi
# Make sure that Cake has been installed.
if [ ! -f "$CAKE_EXE" ]; then
echo "Could not find Cake.exe at '$CAKE_EXE'."
exit 1
fi
# Start Cake
exec mono "$CAKE_EXE" $SCRIPT "${CAKE_ARGUMENTS[@]}"

View File

@@ -0,0 +1,114 @@
---
site: 3evils
name: 3evils
description: "3evils is a Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en
type: private
encoding: UTF-8
links:
- https://www.3evils.com/
caps:
categorymappings:
- {id: 2, cat: Console, desc: "Games"}
- {id: 3, cat: Movies, desc: "Movies"}
- {id: 4, cat: Audio, desc: "Music"}
- {id: 9, cat: TV/Anime, desc: " Anime"}
- {id: 17, cat: TV, desc: " TV"}
- {id: 18, cat: PC, desc: "Appz"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: login.php
method: form
form: form[action="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: "/browse.php"
error:
- selector: h2:contains("Login failed!")
message:
selector: table tr td.colhead2
test:
path: /
selector: :has(a[href$="/logout.php?hash_please="])
search:
paths:
# ttps://www.3evils.com/browse.php?search=black+lightning+s02e11&searchin=title&incldead=1
# https://www.3evils.com/browse.php?c3=1&c4=1&search=&searchin=title&incldead=0
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{.Keywords}}"
incldead: 1
rows:
selector: table.table-bordered tr:has(a[href^="browse.php?cat="])
filters:
- name: andmatch
fields:
title:
selector: a[href^="details.php?id="] b
title:
# if this is available it is the full length title, as the one above can be abbreviated with ...
optional: true
selector: a[href^="details.php?id="][onmouseover]
attribute: onmouseover
filters:
- name: regexp
args: "Tip\\('<b>(.*?)</b>"
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details.php?id=", "download.php?torrent="]
size:
selector: td:nth-last-child(6)
files:
selector: td:nth-last-child(9)
grabs:
selector: td:nth-last-child(5)
filters:
- name: replace
args: ["Times", ""]
# 2 flavours of dates
date:
# Today<br />10:20 AM
# Yesterday<br />08:03 PM
optional: true
selector: td:nth-last-child(7):contains("day")
date:
# Feb 14 2019<br />10:20 AM
optional: true
selector: td:nth-last-child(7):not(:contains("day"))
filters:
- name: regex # drop break in between date and time
args: ["(.+?)<[^>]*>(.+?)","$1 $2"]
- name: dateparse
args: "Jan 2 2006 03:04 pm"
seeders:
selector: td:nth-last-child(4)
leechers:
selector: td:nth-last-child(3)
downloadvolumefactor:
case:
"b:contains(\"[FREE]\")": "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -0,0 +1,116 @@
---
site: alein
name: Alein
description: "Alein is a BULGARIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en
type: semi-private
encoding: UTF-8
links:
- http://alein.org/
caps:
categorymappings:
- {id: 1, cat: Movies/SD, desc: "Movies-XviD"}
- {id: 15, cat: Movies/HD, desc: "Movies-x264"}
- {id: 41, cat: Movies, desc: "Movies-BG"}
- {id: 14, cat: Movies/HD, desc: "Movies-HD"}
- {id: 48, cat: Movies/UHD, desc: "Movies-x265"}
- {id: 39, cat: Movies/Foreign, desc: "Movies-XviD-Rus"}
- {id: 40, cat: Movies/Foreign, desc: "Movies-x264-Rus"}
- {id: 20, cat: Movies/Other, desc: "Movies-Animations"}
- {id: 16, cat: Movies/3D, desc: "Movies-3D"}
- {id: 5, cat: TV/Anime, desc: "Movies-Anime"}
- {id: 21, cat: Movies/BluRay, desc: "Movies-Blu-ray"}
- {id: 22, cat: TV/Documentary , desc: "Movies-Documentaries"}
- {id: 11, cat: Movies/DVD, desc: "Movies-DVD-R"}
- {id: 47, cat: TV/SD, desc: "TV-Episodes"}
- {id: 46, cat: TV/HD, desc: "TV-Episodes-HD"}
- {id: 3, cat: PC/ISO, desc: "Games-PC ISO"}
- {id: 31, cat: Console/Xbox, desc: "Games-XBOX"}
- {id: 33, cat: Console/PSP, desc: "Games-PS"}
- {id: 2, cat: Audio/MP3, desc: "Music-MP3"}
- {id: 50, cat: Audio/Lossless, desc: "Music-FLAC"}
- {id: 18, cat: Audio/Video, desc: "Music-Video"}
- {id: 9, cat: PC/0day, desc: "Software-Windows"}
- {id: 8, cat: PC, desc: "Software-Linux"}
- {id: 36, cat: Other, desc: "Trailer"}
- {id: 34, cat: Other/Misc, desc: "Pictures"}
- {id: 4, cat: Other, desc: "Other"}
- {id: 6, cat: Books/Comics, desc: "Books-Comics"}
- {id: 24, cat: PC/Phone-Other, desc: "Mobile-GSM"}
- {id: 23, cat: TV/Sport, desc: "Sport"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
login:
path: index.php?page=login
method: form
form: form[action*="/index.php?page=login"]
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: td.lista span[style="color:#FF0000;"]
test:
path: /
selector: :has(a[href="logout.php"])
download:
selector: a[href^="download.php?id="]
search:
paths:
# http://alein.org/index.php?page=torrents&category=1%3B15%3B41%3B14%3B48%3B39%3B20%3B16%3B5%3B21%3B22%3B11&search=venom&active=1
- path: index.php
inputs:
page: "torrents"
category: "{{range .Categories}}{{.}};{{end}}"
search: "{{if .Keywords }}{{.Keywords}}{{else}}{{end}}"
active: "1"
rows:
selector: tr.trclass
fields:
title:
selector: td.lista-list a
details:
selector: td.lista-list a
attribute: href
category:
selector: td.lista-cat a
attribute: href
filters:
- name: querystring
args: category
download:
selector: td.lista-list a
attribute: href
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(9)
date:
selector: td:nth-child(5)
filters:
- name: dateparse
args: "02/01/2006"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -1,4 +1,4 @@
---
---
site: archetorrent
name: ArcheTorrent
description: "ArcheTorrent is a FRENCH Private Torrent Tracker"
@@ -7,7 +7,38 @@
encoding: UTF-8
links:
- https://archetorrent.com
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: filter_title
type: checkbox
label: Try to normalize releases names by moving year after the title
default: false
- 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: FRENCH
options:
FRENCH : "FRENCH"
MULTI.FRENCH: "MULTI.FRENCH"
ENGLISH: "ENGLISH"
MULTI.ENGLISH: "MULTI.ENGLISH"
VOSTFR: "VOSTFR"
MULTI.VOSTFR: "MULTI.VOSTFR"
- name: vostfr
type: checkbox
label: Replace VOSTFR with ENGLISH
default: false
caps:
categorymappings:
- {id: 18, cat: PC, desc: "Applications: PC"}
@@ -109,11 +140,43 @@
args: "Poster le: </b>(.*?)<br />"
- name: dateparse
args: "02-01-2006"
title:
title_normal:
selector: a[href^="torrents-details.php?id="]
filters:
- name: replace
args: [" - (Nouveau!)", ""]
title_filtered:
selector: a[href^="torrents-details.php?id="]
filters:
- name: replace
args: [" - (Nouveau!)", ""]
- name: re_replace
args: ["(?i)^(?:(.+?)((?:[\\.\\-\\s_\\[]+(?:imax|(?:dvd|bd|tv)(?:rip|scr)|bluray(?:\\-?rip)?|720\\s*p?|1080\\s*p?|vof?|vost(?:fr)?|multi|vf(?:f|q)?[1-3]?|(?:true)?french|eng?)[\\.\\-\\s_\\]]*)*)([\\(\\[]?(?:20|1[7-9])\\d{2}[\\)\\]]?)(.*)$|(.*))$", "$1 $3 $2 $4 $5"]
- name: replace
args: [".", " "]
- name: trim
- name: re_replace
args: ["(?i)\\s(mkv|avi|divx|xvid|mp4)$", ""]
- name: re_replace
args: ["(\\s{2,5})", " "]
- name: trim
title_phase1:
text: "{{if .Config.filter_title }}{{ .Result.title_filtered }}{{else}}{{ .Result.title_normal }}{{end}}"
title_multilang:
text: "{{ .Result.title_phase1 }}"
filters:
- name: re_replace
args: ["[\\.\\s\\[\\-][Mm][Uu][Ll][Tt][Ii][\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."]
title_phase2:
text: "{{if .Config.multilang }}{{ .Result.title_multilang }}{{else}}{{ .Result.title_phase1 }}{{end}}"
title_vostfr:
text: "{{ .Result.title_phase2 }}"
filters:
- name: re_replace
args: ["[\\.\\s\\[\\-][Vv][Oo][Ss][Tt][Ff][Rr][\\.\\s\\]\\-]", ".ENGLISH."]
title:
text: "{{if .Config.vostfr }}{{ .Result.title_vostfr }}{{else}}{{ .Result.title_phase2 }}{{end}}"
category:
selector: a[href^="torrents.php?cat="]
attribute: href

View File

@@ -20,6 +20,10 @@
- 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:
method: cookie

View File

@@ -57,7 +57,11 @@
settings:
- name: cookie
type: text
label: Cookie
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:
method: cookie

View File

@@ -0,0 +1,76 @@
---
site: btkitty
name: BTKitty
description: "BTKITTY is a Public BitTorrent DHT search engine."
language: en-us
type: public
encoding: UTF-8
links:
- http://cnbtkitty.ws/
legacylinks:
- https://cnbtkitty.org/
- http://cnbtkitty.org/
- https://cnbtkitty.com/
- http://cnbtkitty.com/
- https://cnbtkitty.me/
- http://cnbtkitty.me/
caps:
categorymappings:
- {id: 1, cat: Other, desc: "Other"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: info
type: info
default: BTKitty does not use categories. In your software Indexer settings, set the category to 100001.
download:
selector: a[href^="magnet:?"]
search:
paths:
- path: /
method: post
followredirect: true
inputs:
keyword: "{{if .Keywords }}{{.Keywords}}{{else}}test{{end}}"
hidden: "true"
rows:
selector: dl.list-con
filters:
- name: andmatch
fields:
title:
selector: dt a
category:
text: "1"
details:
selector: dt a
attribute: href
download:
selector: dt a
attribute: href
size:
selector: dd span:nth-of-type(4) b
files:
selector: dd span:nth-of-type(5) b
date:
selector: dd span:nth-of-type(3) b
filters:
- name: dateparse
args: "2006-01-02"
grabs:
selector: dd span:nth-of-type(7) b
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,339 @@
---
site: casstudiotv
name: CasStudioTV
description: "CasStudioTV is a RUSSIAN Private Torrent Tracker for TV"
language: ru
type: private
encoding: UTF-8
links:
- https://casstudio.tv/
caps:
categorymappings:
- {id: 259, cat: TV, desc: "Сериалы (TV Series)"}
- {id: 56, cat: TV, desc: "Зарубежные сериалы (Foreign series)"}
- {id: 310, cat: TV, desc: "9-1-1"}
- {id: 246, cat: TV, desc: "11.22.63"}
- {id: 158, cat: TV, desc: "4400 / The 4400"}
- {id: 86, cat: TV, desc: "12 Обезьян / 12 Monkeys"}
- {id: 120, cat: TV, desc: "Агенты Щ.И.Т. / Agents of S.H.I.E.L.D."}
- {id: 72, cat: TV, desc: "Агент Картер / Agent Carter"}
- {id: 103, cat: TV, desc: "Ад На Колёсах / Hell On Wheels"}
- {id: 110, cat: TV, desc: "Американская семейка / Modern Family"}
- {id: 62, cat: TV, desc: "Американцы / The Americans"}
- {id: 70, cat: TV, desc: "Анатомия страсти / Анатомия Грей / Grey's Anatomy"}
- {id: 210, cat: TV, desc: "База Куантико / Quantico"}
- {id: 305, cat: TV, desc: "Беглецы / Runaways"}
- {id: 122, cat: TV, desc: "Безумцы / Mad Men"}
- {id: 134, cat: TV, desc: "Белый воротничок / White Collar"}
- {id: 281, cat: TV, desc: "Барыги / Narcos"}
- {id: 239, cat: TV, desc: "Баскетс / Baskets"}
- {id: 155, cat: TV, desc: "Бешеные псы / Mad Dogs"}
- {id: 243, cat: TV, desc: "Библиотекари / The Librarians"}
- {id: 154, cat: TV, desc: "Блудливая Калифорния / Californication"}
- {id: 208, cat: TV, desc: "Бойтесь ходячих мертвецов / Fear the Walking Dead"}
- {id: 150, cat: TV, desc: "Больница Никербокер / The Knick"}
- {id: 119, cat: TV, desc: "Бывает и хуже / The Middle"}
- {id: 87, cat: TV, desc: "В поле зрения / Person of Interest"}
- {id: 219, cat: TV, desc: "В пустыне смерти / Into the Badlands"}
- {id: 118, cat: TV, desc: "Веб терапия / Web Therapy"}
- {id: 123, cat: TV, desc: "Ведьмы Ист-Энда / Witches of East End"}
- {id: 309, cat: TV, desc: "Видоизмененный углерод / Altered Carbon"}
- {id: 241, cat: TV, desc: "Винил / Vinyl"}
- {id: 91, cat: TV, desc: "Викинги / Vikings"}
- {id: 172, cat: TV, desc: "Вице-Президент / Veep"}
- {id: 204, cat: TV, desc: "Власть в ночном городе / Power"}
- {id: 228, cat: TV, desc: "Волшебники / The Magicians"}
- {id: 220, cat: TV, desc: "Восприятие / Perception"}
- {id: 254, cat: TV, desc: "Восстание / Rebellion"}
- {id: 248, cat: TV, desc: "Вместе / Togetherness"}
- {id: 192, cat: TV, desc: "Водолей / Aquarius"}
- {id: 65, cat: TV, desc: "Возмездие / Revenge"}
- {id: 121, cat: TV, desc: "Все Ненавидят Криса / Everybody Hates Chris"}
- {id: 166, cat: TV, desc: "Ганнибал / Hannibal"}
- {id: 211, cat: TV, desc: "Герои: Возрождение / Heroes Reborn"}
- {id: 293, cat: TV, desc: "Голубая кровь / Blue Bloods"}
- {id: 145, cat: TV, desc: "Город Хищниц / Cougar Town"}
- {id: 61, cat: TV, desc: "Готэм / Gotham"}
- {id: 117, cat: TV, desc: "Гримм / Grimm"}
- {id: 108, cat: TV, desc: "Две девицы на мели / 2 Broke Girls"}
- {id: 66, cat: TV, desc: "Девочки / Girls"}
- {id: 271, cat: TV, desc: "Девушка по вызову / The Girlfriend Experience"}
- {id: 176, cat: TV, desc: "Декстер / Dexter"}
- {id: 232, cat: TV, desc: "Десница Божья / Hand of God"}
- {id: 307, cat: TV, desc: "Династия / Dynasty"}
- {id: 102, cat: TV, desc: "Дневники вампира / The Vampire Diaries"}
- {id: 229, cat: TV, desc: "Джессика Джонс / Jessica Jones"}
- {id: 282, cat: TV, desc: "Дорожная команда / Roadies"}
- {id: 205, cat: TV, desc: "До смерти красива / Drop Dead Diva"}
- {id: 104, cat: TV, desc: "Древние / The Originals"}
- {id: 278, cat: TV, desc: "Загадочные события / Stranger Things"}
- {id: 182, cat: TV, desc: "Задержка в развитии / Arrested Development"}
- {id: 201, cat: TV, desc: "За пределами / Выжившая / Род человеческий / Extant"}
- {id: 301, cat: TV, desc: "Защитники / The Defenders"}
- {id: 314, cat: TV, desc: "Звёздный путь / Star Trek"}
- {id: 167, cat: TV, desc: "Зов крови / Потерянная / Фейри / Lost Girl"}
- {id: 116, cat: TV, desc: "Зовите меня Фитц / Call Me Fitz"}
- {id: 74, cat: TV, desc: "Империя / Empire"}
- {id: 75, cat: TV, desc: "Как избежать наказания за убийство / How to Get Away with Murder"}
- {id: 203, cat: TV, desc: "Как бы счастье / Happyish"}
- {id: 141, cat: TV, desc: "Как Я Встретил Вашу Маму / How I Met Your Mother"}
- {id: 277, cat: TV, desc: "Карантин / Containment"}
- {id: 306, cat: TV, desc: "Каратель / The Punisher"}
- {id: 174, cat: TV, desc: "Карточный домик / House of Cards"}
- {id: 63, cat: TV, desc: "Касл / Castle"}
- {id: 285, cat: TV, desc: "Квантовый скачок / Quantum Leap"}
- {id: 169, cat: TV, desc: "Кей и Пил / Key and Peele"}
- {id: 195, cat: TV, desc: "Киллджойс / Killjoys"}
- {id: 222, cat: TV, desc: "Клуб жен астронавтов / The Astronaut Wives Club"}
- {id: 197, cat: TV, desc: "Коварные горничные / Devious Maids"}
- {id: 230, cat: TV, desc: "Колония / Colony"}
- {id: 170, cat: TV, desc: "Континуум / Continuum"}
- {id: 233, cat: TV, desc: "Конец детства / Childhood's End"}
- {id: 147, cat: TV, desc: "Копы-новобранцы / Rookie Blue"}
- {id: 291, cat: TV, desc: "Королева Юга / Queen of the South"}
- {id: 193, cat: TV, desc: "Красавица и чудовище / Beauty and the Beast"}
- {id: 132, cat: TV, desc: "Крах / The Fall"}
- {id: 146, cat: TV, desc: "Красотки в Кливленде / Hot in Cleveland"}
- {id: 171, cat: TV, desc: "Красавцы / Антураж / Entourage"}
- {id: 207, cat: TV, desc: "Кремниевая долина / Silicon Valley"}
- {id: 238, cat: TV, desc: "Легенды завтрашнего дня / Legends of Tomorrow"}
- {id: 300, cat: TV, desc: "Легион / Legion"}
- {id: 294, cat: TV, desc: "Лемони Сникет: 33 несчастья / A Series of Unfortunate Events"}
- {id: 130, cat: TV, desc: "Лиллехаммер / Lilyhammer"}
- {id: 276, cat: TV, desc: "Любовницы / Mistresses US"}
- {id: 198, cat: TV, desc: "Люди / Humans"}
- {id: 165, cat: TV, desc: "Лютер / Luther"}
- {id: 247, cat: TV, desc: "Люцифер / Lucifer"}
- {id: 313, cat: TV, desc: "МакГайвер / MacGyver"}
- {id: 127, cat: TV, desc: "Майк и Молли / Mike & Molly"}
- {id: 156, cat: TV, desc: "Мастера Секса / Masters of Sex"}
- {id: 245, cat: TV, desc: "Медики Чикаго / Chicago Med"}
- {id: 180, cat: TV, desc: "Миллеры в разводе / The Millers"}
- {id: 244, cat: TV, desc: "Миллиарды / Billions"}
- {id: 234, cat: TV, desc: "Мистер Робинсон / Mr. Robinson"}
- {id: 200, cat: TV, desc: "Мистер робот / Mr. Robot"}
- {id: 173, cat: TV, desc: "Мост / Broen / Bron"}
- {id: 126, cat: TV, desc: "Мотель Бейтс / Bates Motel"}
- {id: 231, cat: TV, desc: "Моцарт в джунглях / Mozart in the Jungle"}
- {id: 69, cat: TV, desc: "Мушкетеры / The Musketeers"}
- {id: 76, cat: TV, desc: "Мыслить как преступник / Criminal Minds"}
- {id: 202, cat: TV, desc: "На грани / The Brink"}
- {id: 175, cat: TV, desc: "Налёт / Braquo"}
- {id: 125, cat: TV, desc: "Настоящая кровь / True Blood"}
- {id: 152, cat: TV, desc: "Настоящий детектив / True Detective"}
- {id: 79, cat: TV, desc: "Не те парни / The Wrong Mans"}
- {id: 164, cat: TV, desc: "Нэшвилл / Nashville"}
- {id: 58, cat: TV, desc: "Обитель лжи / House of Lies"}
- {id: 137, cat: TV, desc: "Оборотень / Teen Wolf"}
- {id: 303, cat: TV, desc: "Одаренные / The Gifted"}
- {id: 92, cat: TV, desc: "Однажды в сказке / Once Upon A Time"}
- {id: 279, cat: TV, desc: "Однажды ночью / The Night Of"}
- {id: 275, cat: TV, desc: "Оранжевый - хит сезона / Orange is the New Black"}
- {id: 304, cat: TV, desc: "Орвилл / The Orville"}
- {id: 212, cat: TV, desc: "Оставленные / The Leftovers"}
- {id: 139, cat: TV, desc: "Острые козырьки / Peaky Blinders"}
- {id: 163, cat: TV, desc: "Отчаянные домохозяйки / Desperate Housewives"}
- {id: 138, cat: TV, desc: "Отбросы / Misfits"}
- {id: 80, cat: TV, desc: "Пересекающиеся линии / Пересекая черту / Crossing Lines"}
- {id: 218, cat: TV, desc: "Плоть и кости / Flesh and Bone"}
- {id: 99, cat: TV, desc: "Под куполом / Under The Dome"}
- {id: 149, cat: TV, desc: "Подпольная Империя / Boardwalk Empire"}
- {id: 78, cat: TV, desc: "Помнить все / Незабываемое / Unforgettable"}
- {id: 272, cat: TV, desc: "Поворот / TURN"}
- {id: 90, cat: TV, desc: "Пожарные Чикаго / Chicago Fire"}
- {id: 236, cat: TV, desc: "Полицейские на велосипедах / Pacific Blue"}
- {id: 144, cat: TV, desc: "Полиция Гавайев / Hawaii Five-0"}
- {id: 77, cat: TV, desc: "Полиция Чикаго / Chicago PD"}
- {id: 162, cat: TV, desc: "Последователи / The Following"}
- {id: 287, cat: TV, desc: "Приговор / Conviction"}
- {id: 135, cat: TV, desc: "ПригорАД / Suburgatory"}
- {id: 274, cat: TV, desc: "Проповедник / Preacher"}
- {id: 113, cat: TV, desc: "Просветленная / Enlightened"}
- {id: 235, cat: TV, desc: "Пространство / The Expanse"}
- {id: 290, cat: TV, desc: "Радиоволна / Frequency"}
- {id: 112, cat: TV, desc: "Революция / Revolution"}
- {id: 83, cat: TV, desc: "Родина / Homeland"}
- {id: 128, cat: TV, desc: "Рэй Донован / Ray Donovan"}
- {id: 136, cat: TV, desc: "Риццоли и Айлc / Rizzoli & Isles"}
- {id: 160, cat: TV, desc: "Рухнувшие Небеса / Falling Skies"}
- {id: 199, cat: TV, desc: "Салем / Salem"}
- {id: 111, cat: TV, desc: "Сверхъестественное / Supernatural"}
- {id: 157, cat: TV, desc: "Секретные материалы / X-Files"}
- {id: 267, cat: TV, desc: "Семья / The Family"}
- {id: 311, cat: TV, desc: "Сирена / Siren"}
- {id: 64, cat: TV, desc: "Скандал / Scandal"}
- {id: 213, cat: TV, desc: "Слепое пятно / Blindspot"}
- {id: 129, cat: TV, desc: "Служба новостей / Новости / The Newsroom"}
- {id: 286, cat: TV, desc: "Смертельное Оружие / Lethal Weapon"}
- {id: 93, cat: TV, desc: "Сообщество / Community"}
- {id: 179, cat: TV, desc: "Сопрано / The Sopranos"}
- {id: 194, cat: TV, desc: "Сорвиголова / Daredevil"}
- {id: 109, cat: TV, desc: "Сотня / 100 / The Hundred"}
- {id: 153, cat: TV, desc: "Спартак / Spartacus"}
- {id: 266, cat: TV, desc: "Страна чудес / Wonderland"}
- {id: 191, cat: TV, desc: "Страшные сказки / Penny Dreadful"}
- {id: 131, cat: TV, desc: "Стрела / Arrow"}
- {id: 190, cat: TV, desc: "Супергёрл / Supergirl"}
- {id: 82, cat: TV, desc: "Сыны Анархии / Sons of Anarchy"}
- {id: 295, cat: TV, desc: "Табу / Taboo"}
- {id: 273, cat: TV, desc: "Тайны Лауры / The Mysteries of Laura"}
- {id: 178, cat: TV, desc: "Твин Пикс / Twin Peaks"}
- {id: 107, cat: TV, desc: "Теория Большого Взрыва / The Big Bang Theory"}
- {id: 196, cat: TV, desc: "Тёмная материя / Dark Matter"}
- {id: 280, cat: TV, desc: "Тик / The Tick"}
- {id: 181, cat: TV, desc: "Тугая струна / Wire in the Blood"}
- {id: 95, cat: TV, desc: "Убийство / The Killing"}
- {id: 81, cat: TV, desc: "Убить скуку / Bored to Death"}
- {id: 98, cat: TV, desc: "Уилфред / Wilfred"}
- {id: 187, cat: TV, desc: "Уэйуорд Пайнс / Wayward Pines"}
- {id: 142, cat: TV, desc: "Флэш / Flash"}
- {id: 168, cat: TV, desc: "Форс-мажоры / Костюмы / Suits"}
- {id: 59, cat: TV, desc: "Ходячие мертвецы / The Walking Dead"}
- {id: 308, cat: TV, desc: "Хороший доктор / The Good Doctor"}
- {id: 143, cat: TV, desc: "Хранилище 13 / Warehouse 13"}
- {id: 237, cat: TV, desc: "Хроники Шаннары / The Shannara Chronicles"}
- {id: 94, cat: TV, desc: "Хэйвен / Haven"}
- {id: 124, cat: TV, desc: "Царство / Reign"}
- {id: 268, cat: TV, desc: "Час пик / Rush Hour"}
- {id: 115, cat: TV, desc: "Чёрное зеркало / Black Mirror"}
- {id: 73, cat: TV, desc: "Черные Паруса / Black Sails"}
- {id: 177, cat: TV, desc: "Черный список / The Blacklist"}
- {id: 189, cat: TV, desc: "Шёпот / The Whispers"}
- {id: 106, cat: TV, desc: "Шпионка / Alias"}
- {id: 85, cat: TV, desc: "Штамм / The Strain"}
- {id: 288, cat: TV, desc: "Экзорцист / The Exorcist"}
- {id: 105, cat: TV, desc: "Элементарно / Elementary"}
- {id: 217, cat: TV, desc: "Эш против Зловещих мертвецов / Ash vs Evil Dead"}
- {id: 270, cat: TV, desc: "яЗомби / iZombie"}
- {id: 53, cat: TV, desc: "Другие сериалы (Other TV series)"}
- {id: 240, cat: TV, desc: "Клим (Klim)"}
- {id: 283, cat: TV, desc: "Amazon"}
- {id: 284, cat: TV, desc: "Amazon English"}
- {id: 88, cat: TV, desc: "Мультсериалы (Cartoons)"}
- {id: 101, cat: TV, desc: "Южный Парк / South Park"}
- {id: 89, cat: TV, desc: "Спецагент Арчер / Archer"}
- {id: 225, cat: TV, desc: "Стендап / Stand Up"}
- {id: 54, cat: TV, desc: "Особый раздел (Special section)"}
- {id: 100, cat: TV, desc: "Короткометражки (Short films)"}
- {id: 60, cat: TV, desc: "Документальные (Documentaries)"}
- {id: 159, cat: TV, desc: "Разное (Misc.)"}
- {id: 261, cat: TV, desc: "Спорт (Sport)"}
- {id: 262, cat: TV, desc: "Автомотоспорт (Autosport)"}
- {id: 263, cat: TV, desc: "Формула 1 / Formula 1"}
- {id: 264, cat: TV, desc: "MotoGP / SBK"}
- {id: 265, cat: TV, desc: "V8 supercars"}
- {id: 31, cat: TV, desc: "Пользователи (Users)"}
- {id: 188, cat: TV, desc: "Поздравления (Congratulations)"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: ucp.php?mode=login
method: form
form: form#login
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: fieldset:has(div.error)
test:
path: /
selector: :has(a[href^="./ucp.php?mode=logout&sid="])
# download:
# selector: a[href^="./download/file.php?id="]:not(img)
search:
paths:
#https://casstudio.tv/search.php?tracker_search=torrent&keywords=star&terms=all&author=&sc=1&sf=titleonly&sr=topics&sk=t&sd=d&st=0&ch=300&t=0&submit=Search
- path: search.php
inputs:
tracker_search: "torrent"
keywords: "{{if .Keywords }}{{.Keywords}}{{else}}star{{end}}"
terms: "all"
author: ""
sc: "1"
sf: "titleonly"
sr: "topics"
sk: "t"
sd: "d"
st: "0"
ch: "300"
t: "0"
submit: "Search"
rows:
selector: tr.row
fields:
title:
selector: a.topictitle
details:
selector: a.topictitle
attribute: href
category:
selector: a[href^="./viewforum.php?f="]
attribute: href
filters:
- name: querystring
args: f
download:
selector: a[href^="./download/file.php?id="]
attribute: href
size:
selector: a[href^="./viewforum.php?f="] + b
filters:
- name: replace
args: ["ТБ", "TB"]
- name: replace
args: ["ГБ", "GB"]
- name: replace
args: ["МБ", "MB"]
- name: replace
args: ["КБ", "KB"]
seeders:
selector: td.forumtopics span.seed
leechers:
selector: td.forumtopics span.leech
grabs:
selector: td.forumposts span.complet
date:
# 12 янв 2019, 11:26
selector: td.forumdetails span.forum-descriptions
filters:
# extract the date
- name: regexp
args: "(\\d{2} \\D{3} \\d{4}, \\d{2}:\\d{2})"
# replace month abbreviations
- name: replace
args: ["янв", "Jan"]
- name: replace
args: ["фев", "Feb"]
- name: replace
args: ["мар", "Mar"]
- name: replace
args: ["апр", "Apr"]
- name: replace
args: ["май", "May"]
- name: replace
args: ["июн", "Jun"]
- name: replace
args: ["июл", "Jul"]
- name: replace
args: ["авг", "Aug"]
- name: replace
args: ["сен", "Sep"]
- name: replace
args: ["окт", "Oct"]
- name: replace
args: ["ноя", "Nov"]
- name: replace
args: ["дек", "Dec"]
- name: dateparse
args: "02 Jan 06, 15:04"
downloadvolumefactor:
text: "1"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,96 @@
---
site: cpasbienclone
name: cpasbien clone
description: "cpasbien clone is a FRENCH Public site for TV / MOVIES / GENERAL"
language: fr-fr
type: public
encoding: UTF-8
followredirect: true
links:
- https://cpasbiens.cm/
legacylinks:
- https://www1.cpasbiens.ws/
- https://www2.cpasbiens.ws/
caps:
categorymappings:
- {id: films, cat: Movies, desc: "Movies"}
- {id: series, cat: TV, desc: "TV"}
modes:
search: [q]
tv-search: [q, season, ep]
settings: []
download:
selector: div#btn-download a
attribute: href
search:
paths:
- path: "{{if .Keywords}}/recherche/{{.Keywords}}{{else}}{{end}}"
rows:
selector: div#gauche > table > tbody > tr:has(a)
fields:
site_date:
selector: a
filters:
# date is at the end of the title, so we get it and name it site_date
- name: regexp
args: "(\\w+)$"
title:
selector: a
filters:
# now we put the date at the right place according scene naming rules using .Result.site_date
- name: replace
args: ["FRENCH", "{{ .Result.site_date }} FRENCH"]
- name: replace
args: ["TRUEFRENCH", "{{ .Result.site_date }} TRUEFRENCH"]
- name: replace
args: ["VOSTFR", "{{ .Result.site_date }} VOSTFR"]
# and we delete it at the end
- name: re_replace
args: ["(\\w+)$", ""]
details:
selector: a
attribute: href
download:
selector: a
attribute: href
size:
selector: div.poid
filters:
- name: re_replace
args: [ "\\.(\\d) Ko", "$1X00"]
- name: re_replace
args: [ " Ko", "000"]
- name: re_replace
args: [ "\\.(\\d) Mo", "$1X00000"]
- name: re_replace
args: [ " Mo", "000000"]
- name: re_replace
args: [ "\\.(\\d) Go", "$1X00000000"]
- name: re_replace
args: [ " Go", "000000000"]
- name: re_replace
args: [ "\\.(\\d) To", "$1X00000000000"]
- name: re_replace
args: [ " To", "000000000000"]
- name: replace
args: [ "X", "" ]
date:
text: "now"
seeders:
text: 0
seeders:
selector: div.up
optional: true
leechers:
text: 0
leechers:
selector: div.down
optional: true
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -42,6 +42,10 @@
- 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:
method: cookie

View File

@@ -0,0 +1,74 @@
---
site: digbt
name: DIGBT
description: "DIGBT is a Public BitTorrent DHT search engine"
language: en-us
type: public
encoding: UTF-8
links:
- https://www.digbt.org/
caps:
categories:
# DIGBT does not support categories
1: Other
modes:
search: [q]
settings: []
search:
# DIGBT does not support a default empty search or provide trending/latest/new pages
# attempt to fetch up to 50 results (10 per page)
paths:
- path: "search/{{if .Keywords}}{{.Keywords}}{{else}}test{{end}}?c=&s=time&u=y"
- path: "search/{{if .Keywords}}{{.Keywords}}-time-2/{{else}}test-time-2/{{end}}?c=&s=time&u=y"
- path: "search/{{if .Keywords}}{{.Keywords}}-time-3/{{else}}test-time-3/{{end}}?c=&s=time&u=y"
- path: "search/{{if .Keywords}}{{.Keywords}}-time-4/{{else}}test-time-4/{{end}}?c=&s=time&u=y"
- path: "search/{{if .Keywords}}{{.Keywords}}-time-5/{{else}}test-time-5/{{end}}?c=&s=time&u=y"
rows:
selector: tr td.x-item
fields:
title:
selector: div a
category:
text: "1"
details:
selector: div a
attribute: href
download:
selector: div.tail a[href^="magnet:?"]
attribute: href
magnet:
selector: div.tail a[href^="magnet:?"]
attribute: href
date:
selector: div span.ctime
filters:
- name: replace
args: ["yesterday", "1 day"]
- name: timeago
size:
selector: div.tail
filters:
- name: regexp
args: "Size: (.+?) Downloads:"
files:
selector: div.tail
filters:
- name: regexp
args: "Files: (.+?) Size:"
seeders:
text: "1"
leechers:
text: "1"
grabs:
selector: div.tail
filters:
- name: regexp
args: "Downloads: (.+?) Updated:"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -65,7 +65,7 @@
selector: a[href^="{{ .Config.downloadlink }}"]
search:
path: torrents-search.php
path: "{{if .Keywords}}torrents-search.php{{else}}torrents.php{{end}}"
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"

View File

@@ -0,0 +1,142 @@
---
site: film-paleis
name: Film-Paleis
description: "Film-Paleis is a DUTCH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
language: nl-NL
type: semi-private
encoding: UTF-8
links:
- https://www.film-paleis.me/
caps:
categorymappings:
- {id: 2, cat: Movies/BluRay, desc: " Bluray/HD"}
- {id: 3, cat: Movies/DVD, desc: " DVD Kids"}
- {id: 4, cat: Audio/Video, desc: " DVD Muziek"}
- {id: 5, cat: Movies/DVD, desc: " DVD Films"}
- {id: 7, cat: Movies/UHD, desc: " 4K films"}
- {id: 8, cat: XXX, desc: " Erotiek"}
- {id: 9, cat: PC/Phone-Other, desc: " GSM/Navigatie"}
- {id: 10, cat: Audio, desc: " Muziek Album"}
- {id: 11, cat: Audio/Other, desc: " Muziek Diverse"}
- {id: 12, cat: Console/NDS, desc: " Nintendo"}
- {id: 13, cat: Movies, desc: " Classic"}
- {id: 15, cat: Other, desc: " Overige"}
- {id: 16, cat: PC/0day, desc: " PC Software"}
- {id: 17, cat: PC, desc: " PC Spellen"}
- {id: 19, cat: TV, desc: " TV Series"}
- {id: 21, cat: Movies/SD, desc: " Divx/Xvid"}
- {id: 24, cat: Books/Ebook, desc: " E-Books"}
- {id: 26, cat: Audio/Other, desc: " Cabaret"}
- {id: 27, cat: TV/Documentary, desc: " Documentaire"}
- {id: 31, cat: Movies/HD, desc: " HD 265"}
- {id: 32, cat: Audio/Audiobook, desc: " Luister Boeken"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: login.php
method: form
form: form[action="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: "/browse.php"
error:
- selector: table tr td font[color="yellow"]:not(contains("Torrents"))
test:
path: /
selector: :has(a[href="logout.php"])
search:
paths:
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{.Keywords}}"
incldead: 1
rows:
selector: table.mainouter
filters:
- name: andmatch
fields:
title:
selector: a[href^="details.php?id="]
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details", "download"]
size:
selector: td:nth-child(4) table tr td:nth-child(2)
filters:
- name: regexp
args: "(.+?) in"
files:
selector: td:nth-child(4) table tr td:nth-child(2)
filters:
- name: regexp
args: "in (\\d{1,}) bestan"
grabs:
selector: td:nth-child(4) table tr:nth-child(2) td:nth-child(1)
filters:
- name: regexp
args: "(\\d{1,})"
date:
selector: td:nth-child(4) table tr:nth-child(2) td:nth-child(2)
filters:
- name: replace
args: ["januari", "January"]
- name: replace
args: ["februari", "February"]
- name: replace
args: ["maart", "March"]
- name: replace
args: ["april", "April"]
- name: replace
args: ["mei", "May"]
- name: replace
args: ["juni", "June"]
- name: replace
args: ["juli", "July"]
- name: replace
args: ["augustus", "August"]
- name: replace
args: ["september", "September"]
- name: replace
args: ["oktober", "October"]
- name: replace
args: ["november", "November"]
- name: replace
args: ["december", "December"]
- name: re_replace
args: ["\\s*om\\s*"," "]
- name: dateparse
args: "2 January 2006 15:04:05"
seeders:
text: "0"
seeders:
optional: true
selector: td:nth-child(4) table tr:nth-child(3) td:nth-child(5) b:nth-child(1)
leechers:
text: "0"
leechers:
optional: true
selector: td:nth-child(4) table tr:nth-child(3) td:nth-child(5) b:nth-child(2)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,86 @@
---
site: gdf76
name: gdf76
description: "gdf76 is an ITALIAN semi-private site for ITA films in mp4 format optimized for streaming"
language: en
type: semi-private
encoding: UTF-8
links:
- http://gdf76.altervista.org/
caps:
categorymappings:
- {id: 11, cat: Movies, desc: "Film 720p"}
- {id: 13, cat: TV, desc: "Serie TV"}
- {id: 2, cat: Audio, desc: "Music"}
- {id: 3, cat: PC/Games, desc: "Games"}
- {id: 5, cat: TV/Anime, desc: "Anime"}
- {id: 6, cat: Books, desc: "Books"}
- {id: 7, cat: PC/0day, desc: "Apps Win"}
- {id: 8, cat: PC, desc: "Apps Linux"}
- {id: 9, cat: PC/Mac, desc: "Apps Mac"}
- {id: 4, cat: Other, desc: "Other"}
- {id: 12, cat: XXX, desc: "Adult"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: index.php
method: form
form: form[action="index.php?page=login"]
inputs:
uid: "{{ .Config.username }}"
pwd: "{{ .Config.password }}"
error:
- selector: tr td span[style="color:#FF0000;"]
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: index.php
inputs:
page: torrents
search: "{{ if .Keywords }}{{ .Keywords }}{{else}}{{end}}"
category: 0
active: 0
rows:
selector: tr:has(a[href^="index.php?page=torrent-details"])
fields:
title:
selector: td a[href^="index.php?page=torrent-details"]
details:
selector: td a[href^="index.php?page=torrent-details"]
attribute: href
category:
selector: td a[href^="index.php?page=torrents&category="]
attribute: href
filters:
- name: querystring
args: category
download:
selector: td a[href^="download.php"]
attribute: href
size:
text: "500 MB"
date:
# 19/01/2019
selector: td:nth-child(4)
filters:
- name: dateparse
args: "02/01/2006"
seeders:
selector: td:nth-child(5)
leechers:
selector: td:nth-child(6)
grabs:
selector: td:nth-child(7)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -7,7 +7,7 @@
encoding: UTF-8
followredirect: true
links:
- https://www.gktorrent.net/
- https://www.gktorrent.tv/
legacylinks:
- https://www.gktorrent.com/
- http://www.gktorrent.com/
@@ -23,6 +23,7 @@
- https://www.gktorrent.org/
- https://www.gktorrent.me/
- https://www.rantop.org/
- https://www.gktorrent.net/
caps:
categorymappings:
- {id: movies, cat: Movies, desc: "Movies"}

View File

@@ -121,20 +121,20 @@
download:
text: "download2.php?torrent={{ .Result._id }}"
size:
selector: td:nth-last-child(3)
selector: td:nth-last-child(4)
date:
selector: td:nth-last-child(5) > nobr
selector: td:nth-last-child(6) > nobr
filters:
- name: append
args: " +02:00"
- name: dateparse
args: "2006-01-0215:04:05 -07:00"
files:
selector: td:nth-last-child(6)
selector: td:nth-last-child(8)
seeders:
selector: td:nth-last-child(2)
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(1)
selector: td:nth-last-child(2)
downloadvolumefactor:
case:
"img[src=\"pic/free.png\"]": "0"

View File

@@ -1,7 +1,7 @@
---
site: hdchina
name: HDChina
description: "A chinese tracker"
description: "HDChina (HDWing) is a CHINESE Private Torrent Tracker for HD MOVIES / TV"
language: zh-cn
type: private
encoding: UTF-8
@@ -41,6 +41,8 @@
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
login:
path: login.php
@@ -114,10 +116,15 @@
args: " ago"
downloadvolumefactor:
case:
img.pro_50pctdown: ".5"
img.pro_30pctdown: ".3"
img.pro_free: "0"
img.pro_free2up: "0"
img.pro_50pctdown: "0.5"
img.pro_50pctdown2up: "0.5"
img.pro_30pctdown: "0.3"
"*": "1"
uploadvolumefactor:
case:
"*": "1"
img.pro_50pctdown2up: "2"
img.pro_free2up: "2"
img.pro_2up: "2"
"*": "1"

View File

@@ -0,0 +1,220 @@
---
site: hdforever
name: HD-Forever
description: "A french private HD tracker"
language: fr-fr
type: private
encoding: UTF-8
links:
- https://hdf.world
caps:
categories:
1: Movies
2: Movies
3: Movies
4: Movies
5: TV
6: TV/Anime
7: Movies
modes:
search: [q]
login:
path: login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
keeplogged: 1
login: "Log in"
error:
- selector: form#loginform > span.warning
test:
path: torrents.php
ratio:
path: torrents.php
selector: li#stats_ratio > span
search:
path: torrents.php
inputs:
$raw: "{{range .Categories}}filter_cat[{{.}}]=1&{{end}}"
searchstr: "{{ .Query.Keywords }}"
order_by: time
order_way: desc
action: basic
searchsubmit: 1
rows:
selector: table#torrent_table > tbody > tr.torrent
fields:
download:
selector: a[href^="torrents.php?action=download&"]
attribute: href
title:
selector: div.group_info
remove: span:nth-child(1), div.tags
filters:
- name: replace
args: ["\n", ""]
- name: re_replace
args: ["^(.+) (.+)", "$2-$1"]
- name: replace
args: [" ", " "]
- name: replace
args: ["Blu-Ray Original", "Complete.BluRay"]
- name: replace
args: ["Blu-Ray Remux", "Remux"]
- name: replace
args: ["Blu-Ray Rip", "BluRay.Rip"]
- name: replace
args: ["mHD", "mHD.BluRay.Rip"]
- name: replace
args: ["/ DC", "/ Directors.Cut"]
- name: replace
args: ["/ VL", "/ Extended"]
- name: replace
args: ["/ RM", "/ Remastered"]
- name: replace
args: ["/ UC", "/ Uncut"]
- name: replace
args: ["/ ES", "/ Special.Edition"]
- name: replace
args: [" / Cust_sub", ""]
- name: replace
args: [" / Cust", ""]
- name: replace
args: ["/ UN", "/ Unrated"]
- name: replace
args: [" / Crit", ""]
- name: replace
args: [" / WAC", ""]
- name: replace
args: [" / MoC", ""]
- name: replace
args: [" / BFI", ""]
- name: replace
args: [" / MUET", ""]
- name: replace
args: ["/ Exc NF", "/ NF"]
- name: replace
args: ["/ Exc AMZ", "/ AMZ"]
- name: replace
args: ["/ Exc YOU", "/ YT"]
- name: replace
args: [" / ↓25%", ""]
- name: replace
args: [" / ↓50%", ""]
- name: replace
args: [" / ↓75%", ""]
- name: replace
args: [" / Free", ""]
- name: replace
args: [" / Complété!", ""]
- name: replace
args: [" / ", "."]
- name: trim
- name: replace
args: [".VFF.VFQ.StFr.MULTI", ".MULTI.VFF.VFQ"]
- name: replace
args: [".VFF.VFQ.VO.StFr.MULTI", ".MULTI.VFF.VFQ"]
- name: replace
args: [".VFF.VFQ.VO.StFr", ".MULTI.VFF.VFQ"]
- name: replace
args: [".VFQ.VO.StFr", ".MULTI.VFQ"]
- name: replace
args: [".VO.VFI.StFr", ".MULTI"]
- name: replace
args: [".VO.VF?.StFr", ".MULTI"]
- name: replace
args: [".VFF.VO.StFr", ".MULTI.VFF"]
- name: replace
args: [".VOF.StFr", ".FRENCH"]
- name: replace
args: [".VFQ.StFr", ".FRENCH"]
- name: replace
args: [".VFF.StFr.MULTI", ".MULTI.VFF"]
- name: replace
args: [".VFF.StFr", ".FRENCH"]
- name: replace
args: [".VFI.MULTI", ".MULTI"]
- name: replace
args: [".VO.StFr", ".VOSTFR"]
- name: replace
args: [".VFQ.VO", ".MULTI.VFQ"]
- name: replace
args: [".VFF.VO", ".MULTI.VFF"]
- name: replace
args: [".VO.VF?.StFr", ".MULTI"]
- name: replace
args: [".VFI.StFr", ".FRENCH"]
- name: replace
args: [".VOF.MULTI", ".MULTI.FRENCH"]
- name: replace
args: [".VOF", ".FRENCH"]
- name: replace
args: [".VFQ.MULTI", ".MULTI.VFQ"]
description:
selector: div.group_info
details:
selector: a[href^="torrents.php?id="]
attribute: href
comments:
selector: a[href^="torrents.php?id="]
attribute: href
category:
selector: td.cats_col
case:
div.cats_film: 1
div.cats_dessinanimé: 2
div.cats_bonusbd: 3
div.cats_concert: 4
div.cats_série: 5
div.cats_sérieanim: 6
div.cats_doc: 7
files:
selector: td:nth-child(3)
date:
selector: td:nth-child(4)
filters:
- name: replace
args: ["Il y a ", ""]
- name: replace
args: ["heures", "hours"]
- name: replace
args: ["heure", "hour"]
- name: replace
args: ["jours", "days"]
- name: replace
args: ["jour", "day"]
- name: replace
args: ["semaines", "weeks"]
- name: replace
args: ["semaine", "week"]
- name: replace
args: ["mois", "months"]
- name: replace
args: ["ans", "years"]
- name: replace
args: ["an", "year"]
- name: append
args: " ago"
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:
"div.group_info:contains(\"↓Free\")": "0"
"div.group_info:contains(\"↓75%\")": "0.75"
"div.group_info:contains(\"↓50%\")": "0.50"
"div.group_info:contains(\"↓25%\")": "0.25"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -132,7 +132,7 @@
- name: prepend
args: "magnet:?xt=urn:btih:"
- name: append
args: "&dn={{ .Result.title }}.torrent"
args: "&dn={{ .Result.title }}.torrent&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://tracker.opentrackr.org:1337"
size:
selector: td:nth-child(3) font
date:

View File

@@ -91,7 +91,11 @@
- 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:
method: cookie
test:

View File

@@ -0,0 +1,74 @@
---
site: monova
name: Monova
description: "Monova is a Public torrent index."
language: en-us
type: public
encoding: UTF-8
links:
- https://monova.org/
- https://monova.to/
caps:
categories:
"video-camera": Movies
"music": Audio
"book": Books
"gamepad": PC/Games
"cog": PC/0day
"venus-mars": XXX
"list": Other
"picture-o": Other/Misc
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings: []
download:
selector: a#download-file
search:
paths:
# https://monova.to/search?term=vikings+s05e05
# https://monova.to/video
- path: "{{if .Keywords}}/search?term={{.Keywords}}{{else}}/video{{end}}"
rows:
selector: tr.desktop:not(tr.success)
filters:
- name: andmatch
fields:
title:
selector: td.torrent_name a
category:
selector: td.torrent_name i
attribute: class
filters:
# remove fa fa- prefix
- name: replace
args: ["fa fa-", ""]
details:
selector: td.torrent_name a
attribute: href
download:
selector: td.torrent_name a
attribute: href
size:
selector: td.center-align
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"
date:
selector: td.torrent_name
remove: a
filters:
- name: replace
args: ["added ",""]
- name: timeago

View File

@@ -0,0 +1,126 @@
---
site: pt99
name: PT99
description: "PT99 is a CHINESE Private Torrent Tracker for 0DAY / GENERAL"
language: zh-CN
type: private
encoding: UTF-8
followredirect: true
links:
- https://pt.j99.info/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies(电影)"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries(记录片)"}
- {id: 405, cat: TV/Anime, desc: "Animations(动漫)"}
- {id: 402, cat: TV, desc: "TV Series(电视剧)"}
- {id: 403, cat: TV/OTHER, desc: "TV Shows(电视节目)"}
- {id: 406, cat: Audio/Video, desc: "Music Videos(音乐视频)"}
- {id: 407, cat: TV/Sport, desc: "Sports(体育节目)"}
- {id: 408, cat: Audio/Lossless, desc: "HQ Audio(高品质音频)"}
- {id: 410, cat: Audio, desc: "Music(音乐)"}
- {id: 411, cat: PC, desc: "Software(软件)"}
- {id: 412, cat: Books, desc: "Document(文档)"}
- {id: 413, cat: PC/Games, desc: "PC_Game(PC游戏)"}
- {id: 414, cat: Console, desc: "Other_Game(其他游戏)"}
- {id: 409, cat: Other, desc: "Misc(其他)"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid]
movie-search: [q, imdbid]
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:
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
ratio:
path: index.php
selector: table#info_block
filters:
- name: replace
args: ["分享率:","Ratio:"] # for simplified chinese language setting
- name: regexp
args: "Ratio:\\s(.*?)\\s\\s"
search:
paths:
- path: torrents.php
inputs:
$raw: "{{range .Categories}}cat{{.}}=1&{{end}}"
incldead: "0"
spstate: "0"
inclbookmarked: "0"
search: "{{if .Query.IMDBID}}{{.Query.IMDBID}}{{else}}{{.Keywords}}{{end}}"
search_area: "{{if .Query.IMDBID}}4{{else}}0{{end}}"
search_mode: "0"
rows:
selector: table.torrents tr:has(a[href^="?cat="])
filters:
- name: andmatch
fields:
title:
selector: td.progresstd a
attribute: title
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details.php", "download.php"]
imdb:
selector: a[href^="http://www.imdb.com/title/tt"]
attribute: href
size:
selector: td:nth-child(5)
grabs:
selector: td:nth-child(8)
seeders:
selector: td:nth-child(6)
leechers:
selector: td:nth-child(7)
date:
selector: td:nth-child(4) span
attribute: title
filters:
- name: dateparse
args: "2006-01-02 15:04:05"
downloadvolumefactor:
case:
img.pro_free: "0"
img.pro_free2up: "0"
img.pro_50pctdown: "0.5"
img.pro_50pctdown2up: "0.5"
img.pro_30pctdown: "0.3"
"*": "1"
uploadvolumefactor:
case:
img.pro_50pctdown2up: "2"
img.pro_free2up: "2"
img.pro_2up: "2"
"*": "1"

View File

@@ -0,0 +1,104 @@
---
site: pwtorrents
name: PWTorrents
description: "PWTorrents (PWT) is a Private Torrent Tracker for PROFESSIONAL WRESTLING"
language: en-us
type: private
encoding: UTF-8
links:
- https://pwtorrents.net/
caps:
categorymappings:
- {id: 1, cat: TV/Sport, desc: "Boxing"}
- {id: 2, cat: TV/Sport, desc: "Documentaries"}
- {id: 3, cat: TV/Sport, desc: "DVD"}
- {id: 4, cat: TV/Sport, desc: "ECW"}
- {id: 5, cat: TV/Sport, desc: "Games and Software"}
- {id: 6, cat: TV/Sport, desc: "Indy's"}
- {id: 7, cat: TV/Sport, desc: "Matches"}
- {id: 8, cat: TV/Sport, desc: "Misc."}
- {id: 9, cat: TV/Sport, desc: "MMA"}
- {id: 11, cat: TV/Sport, desc: "Puro"}
- {id: 10, cat: TV/Sport, desc: "PWT Packs"}
- {id: 12, cat: TV/Sport, desc: "Ring Of Honor"}
- {id: 13, cat: TV/Sport, desc: "TNA PPV's"}
- {id: 14, cat: TV/Sport, desc: "TNA Weekly"}
- {id: 15, cat: TV/Sport, desc: "WCW"}
- {id: 18, cat: TV/Sport, desc: "WWE Network"}
- {id: 16, cat: TV/Sport, desc: "WWE PPV's"}
- {id: 17, cat: TV/Sport, desc: "WWE Weekly"}
modes:
search: [q]
login:
path: login.php
method: form
form: form[action="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Login failed!")
test:
path: my.php
ratio:
path: browse.php
selector: span.smallfont:has(a[href="logout.php"])
filters:
- name: regexp
args: "Ratio:\\s(.*?)\\s\\s"
search:
paths:
# https://pwtorrents.net/browse.php?c18=1&c16=1&c17=1&incldead=0
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
incldead: "1"
search: "{{ .Keywords }}"
sort: "4" # date
type: "desc"
rows:
selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="])
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
download:
selector: a[href^="download.php"]
attribute: href
details:
selector: a[href^="details.php?id="]
attribute: href
grabs:
selector: td:nth-child(6) a
filters:
- name: replace
args: ["times", ""]
- name: replace
args: ["time", ""]
size:
selector: td:nth-child(5)
seeders:
selector: td:nth-child(8)
leechers:
selector: td:nth-child(9)
date:
selector: td:nth-child(4)
filters:
- name: dateparse
args: "2006-01-0215:04:05"
downloadvolumefactor:
case:
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -30,6 +30,10 @@
- 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:
method: cookie

View File

@@ -7,6 +7,8 @@
encoding: UTF-8
links:
- http://rutor.info/
- http://new-rutor.org/
- http://live-rutor.org/
caps:
# unfortunately RuTor does not display categories anywhere in its search results page :-(
@@ -35,12 +37,12 @@
search:
paths:
# http://rutor.info/search/0/0/000/0/gotham%2004x01
- path: "{{ if .Query.Q }}search/0/0/{{ .Config.method }}00/0/{{ .Query.Q }}{{else}}top{{end}}"
- path: "{{ if .Keywords }}search/0/0/{{ .Config.method }}00/0/{{ .Keywords }}/{{else}}top/{{end}}"
rows:
selector: table > tbody > tr:has(td:has(a.downgif))
selector: tr:has(td:has(a.downgif))
fields:
title:
selector: td:nth-of-type(2) a:nth-of-type(3)
selector: td:nth-of-type(2) a[href^="/torrent/"]
filters:
- name: re_replace
args: [".+\\/\\s([^а-яА-я\\/]+)\\s.*\\[(?:S*(\\d+))(?:x*(\\d+-*\\d*).*)*\\].*\\)\\s+(.+)\\s+(?:\\||от)\\s*(.+)","$1 - S$2E$3 - rus - $4 - $5"]
@@ -49,13 +51,14 @@
- name: replace
args: ["Кураж-Бамбей", "kurazh"]
details:
selector: td:nth-of-type(2) a:nth-of-type(3)
selector: td:nth-of-type(2) a[href^="/torrent/"]
attribute: href
download:
selector: td:nth-of-type(2) a:nth-of-type(1)
selector: td:nth-of-type(2) a.downgif
attribute: href
magnet:
selector: td:nth-of-type(2) a:nth-of-type(2)
optional: true
selector: td:nth-of-type(2) a[href^="magnet:?xt="]
attribute: href
date:
# 27 Окт 17
@@ -108,9 +111,9 @@
optional: true
selector: td:contains(\00a0B)
seeders:
selector: td span:has(img[alt="S"])
selector: td span.green
leechers:
selector: td:has(img[alt="L"]) span
selector: td span.red
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -35,6 +35,10 @@
- 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:
method: cookie

View File

@@ -80,6 +80,42 @@
search:
paths:
- path: /index.php
inputs:
pages: 1
- path: /index.php
inputs:
pages: 2
- path: /index.php
inputs:
pages: 3
- 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}}"
page: torrents
active: 0
order: 3
by: 2
keywordsfilters:
- name: diacritics
args: replace
@@ -87,11 +123,6 @@
args: ["(?i)\\bS0*(\\d+)\\b", "$1"]
- name: re_replace # S01E01 to 1 1
args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"]
inputs:
search: "{{ .Keywords }}"
category: "{{range .Categories}}{{.}};{{end}}"
page: torrents
active: 0
rows:
selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="])
filters:

View File

@@ -0,0 +1,74 @@
---
site: shokweb
name: shokweb
description: "shokweb is a CHINESE Public tracker"
language: zh-CN
type: public
encoding: UTF-8
links:
- https://shokweb.com/
certificates:
- ba7fb6290a9d7d821e73efb0eac4ed95a7fd2d11 # expired
settings: []
caps:
categories:
"影视": Movies # Movie
"安装包": PC/ISO # installation package
"其他": Other # Other
"音乐": Audio # Music
"文档书籍": Books # Documents Book
"压缩文件": PC # Compressed Files
"图像": Other/Misc # Image
modes:
search: [q]
search:
paths:
# https://shokweb.com/ (latest)
# https://shokweb.com/search/supergirl%20s04e01 (search)
- path: "{{if .Keywords}}{{.Keywords}}{{else}}{{end}}"
rows:
selector: div:has(a[href^="magnet:?"])
filters:
- name: andmatch
fields:
title:
selector: a[href^="/post/"]
category:
selector: p:has(img) span:nth-last-child(4)
details:
selector: a[href^="/post/"]
attribute: href
download:
selector: a[href^="magnet:?"]
attribute: href
size:
selector: p:has(img) span:nth-last-child(2)
grabs:
selector: p:has(img) span:nth-last-child(5)
date:
selector: p:has(img) span:nth-last-child(1)
filters:
- name: replace
args: ["时", " hours"]
- name: replace
args: ["分", " minutes"]
- name: replace
args: ["天", " days"]
- name: replace
args: ["年", " year"]
- name: replace
args: ["月", " months"]
- name: replace
args: ["前", " ago"]
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -28,7 +28,15 @@
tv-search: [q, season, ep]
movie-search: [q]
settings: []
settings:
- name: itorrents-links
type: checkbox
label: Add download links via itorrents.org
default: true
- name: info
type: info
label: ITorrents Note
default: Without the itorrents option only magnet links will be provided.
search:
# https://www.skytorrents.lol/?query=mr+mercedes+s02e05&sort=created
@@ -54,9 +62,11 @@
details:
selector: td a
attribute: href
download:
download-itorrents:
selector: a[href^="//itorrents"]
attribute: href
download:
text: "{{if .Config.itorrents-links}}{{ .Result.download-itorrents }}{{else}}{{end}}"
magnet:
selector: a[href^="magnet:?"]
attribute: href

View File

@@ -86,6 +86,10 @@
- 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:
method: cookie

View File

@@ -0,0 +1,148 @@
---
site: takeabyte
name: TakeaByte
description: "TakeaByte is a NORDIC Private Torrent Tracker for 0DAY / GENERAL"
language: en-us
type: private
encoding: UTF-8
links:
- https://takeabyte-nordic.org/
certificates:
- 8b88d216d270b9b672ba44fbbdd5ca3d8919e5fd # expired Nov 2015
caps:
categorymappings:
- {id: 3, cat: Movies, desc: "Movies"}
- {id: 9, cat: Movies/3D, desc: "Movies 3D"}
- {id: 47, cat: Movies/BluRay, desc: "Movies BD 1080p"}
- {id: 21, cat: Movies/Other, desc: "Movies Boxset"}
- {id: 43, cat: Movies, desc: "Movies TBN"}
- {id: 40, cat: Movies, desc: "Movies Danish"}
- {id: 34, cat: Movies/DVD, desc: "Movies DVD-R"}
- {id: 10, cat: Movies/SD, desc: "Movies XviD"}
- {id: 19, cat: Movies, desc: "Movies Kids"}
- {id: 41, cat: Movies, desc: "Movies Swedish"}
- {id: 20, cat: Movies, desc: "Movies MP4"}
- {id: 49, cat: Movies, desc: "Movies Nordisk"}
- {id: 42, cat: Movies, desc: "Movies Norway"}
- {id: 11, cat: Movies/HD, desc: "HD 1080p"}
- {id: 25, cat: Movies/HD, desc: "HD-1080p Custom"}
- {id: 14, cat: Movies/HD, desc: "HD-720p"}
- {id: 26, cat: Movies/HD, desc: "HD-720p Custom"}
- {id: 23, cat: Audio/Other, desc: "Music Boxset"}
- {id: 35, cat: Audio/Lossless, desc: "Music Flac"}
- {id: 22, cat: Audio/MP3, desc: "Music MP3"}
- {id: 24, cat: Audio/Video, desc: "Music Video"}
- {id: 32, cat: Audio/Audiobook, desc: "Audio-Books"}
- {id: 33, cat: Books/Ebook, desc: "E-Books"}
- {id: 30, cat: PC/Mac, desc: "Apps Mac"}
- {id: 31, cat: PC/Phone-Other, desc: "Apps Mobile"}
- {id: 1, cat: PC/0day, desc: "Apps Windows"}
- {id: 15, cat: Console, desc: "Games Other"}
- {id: 45, cat: Console/NDS, desc: "Games NDS"}
- {id: 13, cat: Console, desc: "Games Others"}
- {id: 37, cat: Console/PS Vita, desc: "Games PS2"}
- {id: 38, cat: Console/PS3, desc: "Games PS3"}
- {id: 36, cat: Console/PSP, desc: "Games PSP"}
- {id: 7, cat: Console/Wii, desc: "Games Wii"}
- {id: 39, cat: Console/Xbox, desc: "Games XBOX"}
- {id: 8, cat: PC/Games, desc: "Games PC"}
- {id: 12, cat: PC/Games, desc: "Games PC Rips"}
- {id: 46, cat: Other, desc: "Wallpapers"}
- {id: 27, cat: TV/Other, desc: "TV Boxset"}
- {id: 28, cat: TV, desc: "TV-Series"}
- {id: 52, cat: XXX, desc: "XXX"}
- {id: 53, cat: XXX/Packs, desc: "XXX-Pack"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
login:
path: login.php
method: form
form: form[action="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
returnto: "/browse.php"
error:
- selector: h2:contains("Login failed!")
message:
selector: table tr td.colhead2
test:
path: /
selector: :has(a[href^="logout.php?hash_please="])
search:
paths:
# http://takeabyte-nordic.org/browse.php?search=first+man&searchin=title&incldead=0
# http://takeabyte-nordic.org/browse.php?c9=1&c47=1&c21=1&c11=1&c25=1&c14=1&c26=1&c3=1&search=%22first+man%22&searchin=title&incldead=0
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
search: "{{.Keywords}}"
searchin: "title"
incldead: 1
rows:
selector: table tr:has(a[href^="browse.php?cat="]):has(a[href^="details.php?id="])
filters:
- name: andmatch
fields:
title:
selector: a[href^="details.php?id="] b
details:
selector: a[href^="details.php?id="]
attribute: href
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
download:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details.php?id=", "download.php?torrent="]
size:
selector: td:nth-last-child(4)
files:
selector: td:nth-last-child(7)
grabs:
selector: td:nth-last-child(3)
filters:
- name: replace
args: ["times", ""]
- name: replace
args: ["time", ""]
# 2 flavours of dates
date:
# Today<br />13:20:59
# Yesterday<br />08:03:01
optional: true
selector: td:nth-last-child(5):contains("day")
date:
# Feb 14 2019<br />14:20:12
optional: true
selector: td:nth-last-child(5):not(:contains("day"))
filters:
- name: regex # drop break in between date and time
args: ["(.+?)<[^>]*>(.+?)","$1 $2"]
- name: dateparse
args: "Jan 2 2006 15:04:05"
seeders:
selector: td:nth-last-child(2)
leechers:
selector: td:nth-last-child(1)
downloadvolumefactor:
case:
"b:contains(\"[Free and Double]\")": "0"
"*": "1"
uploadvolumefactor:
case:
"b:contains(\"[Free and Double]\")": "2"
"*": "1"

View File

@@ -6,6 +6,8 @@
type: public
encoding: UTF-8
links:
- http://tntvillage.scambioetico.org/
legacylinks:
- http://www.tntvillage.scambioetico.org/
caps:

View File

@@ -7,8 +7,8 @@
encoding: UTF-8
links:
- https://www.torlock2.com/
legacylinks:
- https://www.torlock.com/
- https://torlock.com/
caps:
categorymappings:

View File

@@ -7,7 +7,7 @@
encoding: UTF-8
followredirect: true
links:
- https://www.torrent9.uno/
- https://wvw.torrent9.uno/
legacylinks:
- http://www.torrent9.ec/
- http://www.torrent9.red/
@@ -22,6 +22,7 @@
- https://www.torrent9.ph/
- https://ww1.torrent9.ph/
- https://torrent9.ga/
- https://www.torrent9.uno/
caps:
categorymappings:

View File

@@ -5,10 +5,13 @@
language: fr-fr
type: public
encoding: UTF-8
followredirect: true
links:
- https://www.torrent9.ch/
- https://www2.torrent9.ch/
legacylinks:
- https://www.torrents9.pw/
- https://www.torrent9.ch/
- https://www1.torrent9.ch/
caps:
categorymappings:

View File

@@ -35,16 +35,16 @@
selector: article
fields:
title:
selector: h2 a
selector: h1.entry-title a
category:
text: "1"
details:
selector: h2 a
selector: h1.entry-title a
attribute: href
description:
selector: p
download:
selector: h2 a
selector: h1.entry-title a
attribute: href
size:
text: "500 MB"
@@ -53,7 +53,10 @@
leechers:
text: "1"
date:
text: now
selector: span.posted-on a time
filters:
- name: dateparse
args: "January 2, 2006"
downloadvolumefactor:
text: "0"
uploadvolumefactor:

View File

@@ -0,0 +1,119 @@
---
site: torrentfunk
name: TorrentFunk
description: "TorrentFunk is a Public torrent index"
language: en-us
type: public
encoding: UTF-8
links:
- https://www.torrentfunk.com/
caps:
categories:
1: Movies
2: Audio
3: TV
4: PC/Games
5: PC
6: TV/Anime
7: XXX
8: Other
9: Other
10: Books
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: category
type: select
label: Category
default: "all"
options:
"all": "All"
"movie": "Movies"
"music": "Music"
"television": "TV"
"game": "Games"
"software": "Software"
"anime": "Anime"
"ebook": "eBooks"
"adult": "Adult"
- name: verified
type: select
label: Verified
default: "_"
options:
"_": "Any"
"on": "Verified Only"
- name: sort
type: select
label: Sort Desc
default: "added"
options:
"added": "Date"
"seeds": "Seeders"
"peers": "Leechers"
"size": "Size"
"name": "Title"
download:
selector: a[href^="/tor/"]
search:
paths:
# https://www.torrentfunk.com/all/torrents/vikings.html?v=&smi=&sma=&i=50&sort=added&o=desc
- path: "{{.Config.category}}/torrents/{{.Keywords}}.html?v={{re_replace .Config.verified \"_\" \"\"}}&smi=&sma=&i=50&sort={{.Config.sort}}&o=desc"
rows:
selector: table.tmain tbody tr:has(a[href^="/torrent/"])
filters:
- name: andmatch
fields:
title:
selector: div a[href^="/torrent/"]
category:
selector: td[class^="tv"], td[class^="tn"]
attribute: class
filters:
- name: regexp
args: "(\\d)"
details:
selector: div a[href^="/torrent/"]
attribute: href
download:
selector: div a[href^="/torrent/"]
attribute: href
# two types of dates
date:
# Today
optional: true
selector: td:nth-child(2):contains("Today")
filters:
- name: fuzzytime
date:
# Yesterday
optional: true
selector: td:nth-child(2):contains("Yesterday")
filters:
- name: fuzzytime
date:
# 7 Jul
# 25 Dec
selector: td:nth-child(2):contains(" ")
optional: true
filters:
- name: dateparse
args: "2 Jan"
size:
selector: td:nth-child(3)
seeders:
selector: td:nth-child(4)
leechers:
selector: td:nth-child(5)
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,100 @@
---
site: torrentkitty
name: TorrentKitty
description: "TorrentKitty is a CHINESE Public torrent search engine."
language: cn
type: public
encoding: UTF-8
links:
- http://cntorrentkitty.com/
- http://cntorrentkitty.xyz/
settings:
- name: category
type: select
label: Category
default: "0"
options:
"0": "All"
"1": "Other"
"2": "Video"
"3": "Music"
"4": "Documents"
"5": "Software"
"6": "Compress"
"7": "Images"
"8": "Image"
caps:
categories:
"[其他]": Other # other
"[视频]": Movies # video
"[音乐]": Audio # music
"[文档]": Books # documents
"[软件]": PC/0day # software
"[压缩]": PC # compress
"[图片]": Other/Misc # images
"[映像]": Other/Misc # image
modes:
search: [q]
download:
selector: a[href^="magnet:?"]
search:
paths:
# http://cntorrentkitty.com/tk/what%20men%20want/1-0-0.html (10 hits)
# http://cntorrentkitty.com/newest/ (100 hits)
# try and fetch at least 50 keyword results
- path: "{{if .Keywords}}tk/{{.Keywords}}/1-0-{{.Config.category}}.html{{else}}newest/{{end}}"
- path: "{{if .Keywords}}tk/{{.Keywords}}/2-0-{{.Config.category}}.html{{else}}{{end}}"
- path: "{{if .Keywords}}tk/{{.Keywords}}/3-0-{{.Config.category}}.html{{else}}{{end}}"
- path: "{{if .Keywords}}tk/{{.Keywords}}/4-0-{{.Config.category}}.html{{else}}{{end}}"
- path: "{{if .Keywords}}tk/{{.Keywords}}/5-0-{{.Config.category}}.html{{else}}{{end}}"
rows:
selector: p.p1:not(p.filelist), p.p0:not(p.filelist)
after: 1
fields:
category:
selector: span:nth-child(1)
title:
selector: a[target="_blank"]
details:
selector: a[target="_blank"]
attribute: href
download:
selector: a[target="_blank"]
attribute: href
size:
selector: b:contains(" GB"), b:contains(" MB"), b:contains(" KB")
date:
text: "now"
date:
selector: b:contains("收录"):contains(":")
optional: true
filters:
- name: replace
args: ["收录",""]
- name: dateparse
args: "2006-01-02 15:04:05"
date:
selector: b:contains(收录):not(:contains(":"))
optional: true
filters:
- name: replace
args: ["收录",""]
- name: dateparse
args: "2006-01-02"
files:
selector: b:contains("个文件")
filters:
- name: replace
args: ["个文件",""]
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -20,7 +20,11 @@
- {id: 15, cat: Movies/DVD, desc: "Peliculas - DVDRip"}
- {id: 71, cat: Movies/Other, desc: "Peliculas - Peliculas V.O."}
- {id: 72, cat: Movies/3D, desc: "Peliculas - 3D"}
- {id: 75, cat: Movies/HD, desc: "Peliculas - 4K"}
- {id: 75, cat: Movies/UHD, desc: "Peliculas - 4K"}
- {id: 80, cat: Movies/BluRay, desc: "Peliculas - JMBD"}
- {id: 81, cat: Movies/UHD, desc: "Peliculas - 4K Remux"}
- {id: 82, cat: Movies/BluRay, desc: "Peliculas - CUSTOM FULLBR"}
- {id: 83, cat: Movies/UHD, desc: "Peliculas - 4K CUSTOM"}
#Eml HDTeam
- {id: 69, cat: Movies/BluRay, desc: "Eml HDTeam - FULLBR"}
- {id: 68, cat: Movies/BluRay, desc: "Eml HDTeam - JMBD"}
@@ -31,7 +35,7 @@
- {id: 73, cat: Movies/3D, desc: "EML HDTeam - 3D"}
- {id: 74, cat: Movies/DVD, desc: "EML HDTeam - DVD"}
- {id: 77, cat: Movies/Other, desc: "EML HDTeam - Animacion"}
- {id: 78, cat: Movies/HD, desc: "EML HDTeam - 4K"}
- {id: 78, cat: Movies/UHD, desc: "EML HDTeam - 4K"}
- {id: 79, cat: Movies/BluRay, desc: "EML HDTeam - CUSTOM BR"}
#Series
- {id: 50, cat: TV/HD, desc: "Series - Full BluRay"}
@@ -39,6 +43,7 @@
- {id: 20, cat: TV/SD, desc: "Series - HDRip"}
- {id: 22, cat: TV/SD, desc: "Series - DVD"}
- {id: 51, cat: TV/OTHER, desc: "Series - Otros Formatos"}
- {id: 84, cat: TV/HD, desc: "Series - H265"}
#Documentales
- {id: 53, cat: TV/Documentary, desc: "Documentales - HD"}
- {id: 52, cat: TV/Documentary, desc: "Documentales - SD"}

View File

@@ -107,7 +107,7 @@
- name: prepend
args: "magnet:?xt=urn:btih:"
- name: append
args: "&dn={{ .Result.magfile }}.torrent"
args: "&dn={{ .Result.magfile }}.torrent&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://tracker.opentrackr.org:1337"
category:
optional: true
selector: dt

View File

@@ -0,0 +1,117 @@
---
site: torrof
name: Torrof
description: "Torrof (Torrentoff) is meta-search engine for torrents"
language: en-us
type: public
encoding: UTF-8
links:
- http://www.torrof.com/
caps:
categories:
"Software": PC
"Book": Books
"Video": Movies
"Music": Audio
"Other": Other
"Picture": Other/Misc
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: category
type: select
label: Category
default: "_"
options:
"_": "All"
"Book": "Book"
"Music": "Music"
"Other": "Other"
"Picture": "Picture"
"Software": "Software"
"Video": "Video"
- name: verified
type: select
label: Verified
default: "_"
options:
"_": "Any"
"1": "Verified Only"
- name: sort
type: select
label: Sort
default: "_"
options:
"_": "Default"
"creation_date desc": "Age desc"
"creation_date asc": "Age asc"
"total_size desc": "Size desc"
"total_size asc": "Size asc"
download:
selector: section.file-info a:nth-child(2)
search:
paths:
- path: "{{if .Keywords}}{{.Keywords}}{{else}}test{{end}}"
method: post
inputs:
# torrof does not support trending/latest/new pages
text: "{{if .Keywords}}{{.Keywords}}{{else}}test{{end}}"
size: "0:inf"
date: "0:inf"
verified_only: "{{ re_replace .Config.verified \"_\" \"\" }}"
category: "{{ re_replace .Config.category \"_\" \"\" }}"
tags: ""
mode: "titles"
sort: "{{ re_replace .Config.sort \"_\" \"\" }}"
page: "0"
rows:
# ignore adverts
selector: tr:has(a[href^="/view/"])
filters:
# torrof uses fuzzy search logic
- name: andmatch
fields:
title:
selector: td:nth-child(2) a:nth-child(1)
category:
selector: td:nth-child(1) span
attribute: title
filters:
# grab first word
- name: split
args: [" ", 0]
details:
selector: td:nth-child(2) a:nth-child(1)
attribute: href
download:
selector: td:nth-child(2) a:nth-child(1)
attribute: href
date:
selector: td:nth-child(4)
filters:
- name: dateparse
args: "Jan 2006"
size:
selector: td:nth-child(3) span:nth-child(1)
files:
selector: td:nth-child(3) span:nth-last-child(1)
filters:
- name: replace
args: [" Files", ""]
seeders:
text: "1"
leechers:
text: "1"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,171 @@
---
site: vanila
name: Vanila
description: "Vanila is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV / MUSIC"
language: ru
type: semi-private
encoding: UTF-8
links:
- https://vanila.org/
caps:
categorymappings:
# TV
- {id: 1252, cat: TV, desc: "All TV Shows"}
- {id: 503, cat: TV, desc: "Russian TV Series"}
- {id: 504, cat: TV, desc: "TV Series"}
- {id: 1355, cat: TV/Foreign, desc: "Asian TV Series"}
- {id: 1415, cat: TV/Foreign, desc: "Indian, Latina, Turc TV Series"}
- {id: 585, cat: TV/Other, desc: "Video Lessons"}
- {id: 1036, cat: TV/Sport, desc: "TV Sport"}
# Movies
- {id: 442, cat: Movies, desc: "All Movies"}
- {id: 463, cat: Movies/HD, desc: "World Movies HD"}
- {id: 962, cat: Movies/UHD, desc: "World Movies UHD"}
- {id: 963, cat: Movies/3D, desc: "World Movies 3D"}
- {id: 465, cat: Movies/Other, desc: "World Movies Collection"}
- {id: 466, cat: Movies/DVD, desc: "World Movies DVD/BD Rip"}
- {id: 199, cat: Movies/Other, desc: "World Cartoons"}
- {id: 467, cat: Movies, desc: "Classic World Movies"}
- {id: 1382, cat: Movies, desc: "CIS Movies"}
- {id: 468, cat: Movies/Other, desc: "ART Movies"}
- {id: 469, cat: Movies/Other, desc: "ART Movies Rip"}
# Cartoons
- {id: 28, cat: TV/Anime, desc: "All Cartoons/Anime"}
- {id: 202, cat: TV/Anime, desc: "Cartoons"}
- {id: 342, cat: TV/Anime, desc: "Cartoons - Disney/Pixar"}
- {id: 893, cat: TV/Anime, desc: "Cartoons - Anime"}
- {id: 200, cat: TV/Anime, desc: "Cartoons - Russian"}
# Music
- {id: 214, cat: Audio/MP3, desc: "All Lossy Music"}
- {id: 165, cat: Audio/Lossless, desc: "All Lossless Music"}
- {id: 139, cat: Audio/Video, desc: "Music Video"}
- {id: 874, cat: Audio/Audiobook, desc: "Audiobook"}
- {id: 7, cat: Audio/Other, desc: "Music Compilation"}
# Books
- {id: 536, cat: Books, desc: "All Books"}
- {id: 537, cat: Books, desc: "Published Books"}
- {id: 552, cat: Books/Magazines, desc: "Magazines"}
- {id: 611, cat: Books/Technical, desc: "Technical"}
# Other
- {id: 3, cat: PC, desc: "PC Programs"}
- {id: 4, cat: PC/Games, desc: "PC Games"}
- {id: 5, cat: Console, desc: "Console Games"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
login:
path: ucp.php?mode=login
method: form
form: form#login
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: fieldset:has(div.error)
test:
path: /
selector: :has(a[href^="./ucp.php?mode=logout&sid="])
download:
selector: a[href^="./download/file.php?id="]:not(img)
search:
paths:
# https://vanila.org/search.php?sr=topics&sf=titleonly&tracker_search=torrent&keywords=venom&submit.x=0&submit.y=0
- path: search.php
inputs:
sr: "topics"
sf: "titleonly"
tracker_search: "torrent"
keywords: "{{if .Keywords }}{{.Keywords}}{{else}}test{{end}}"
submit.x: "0"
submit.y: "0"
rows:
selector: li.row
fields:
title:
selector: a.topictitle
details:
selector: a.topictitle
attribute: href
category:
selector: a[href^="./viewforum.php?f="]
attribute: href
filters:
- name: querystring
args: f
download:
selector: a.topictitle
attribute: href
banner:
optional: true
selector: img.tt_poster
attribute: src
size:
selector: a[href^="./viewforum.php?f="] + b
filters:
- name: replace
args: ["ТБ", "TB"]
- name: replace
args: ["ГБ", "GB"]
- name: replace
args: ["МБ", "MB"]
- name: replace
args: ["КБ", "KB"]
seeders:
selector: dd.posts span.seed
leechers:
selector: dd.posts span.leech
grabs:
selector: dd.views span.complet
date:
# 12 янв 2019, 11:26
selector: dt
filters:
# extract the date
- name: regexp
args: "(\\d{2} \\D{3} \\d{4}, \\d{2}:\\d{2})"
# replace month abbreviations
- name: replace
args: ["янв", "Jan"]
- name: replace
args: ["фев", "Feb"]
- name: replace
args: ["мар", "Mar"]
- name: replace
args: ["апр", "Apr"]
- name: replace
args: ["май", "May"]
- name: replace
args: ["июн", "Jun"]
- name: replace
args: ["июл", "Jul"]
- name: replace
args: ["авг", "Aug"]
- name: replace
args: ["сен", "Sep"]
- name: replace
args: ["окт", "Oct"]
- name: replace
args: ["ноя", "Nov"]
- name: replace
args: ["дек", "Dec"]
- name: dateparse
args: "02 Jan 06, 15:04"
downloadvolumefactor:
text: "0"
uploadvolumefactor:
text: "1"

View File

@@ -0,0 +1,138 @@
---
site: xwtorrents
name: XWtorrents
description: "XtremeWrestlingTorrents (XWT) is a Private Torrent Tracker for PROFESSIONAL WRESTLING / MMA"
language: en-us
type: private
encoding: UTF-8
links:
- https://xtremewrestlingtorrents.net/
caps:
categorymappings:
- {id: 47, cat: TV/Sport, desc: "Boxing"}
- {id: 14, cat: TV/Sport, desc: "Documentary"}
- {id: 20, cat: TV/Sport, desc: "DVD"}
- {id: 2, cat: TV/Sport, desc: "ECW Original"}
- {id: 26, cat: TV/Sport, desc: "ECW Weekly"}
- {id: 21, cat: TV/Sport, desc: "Int Indy's"}
- {id: 69, cat: TV/Sport, desc: "Lucha Libre"}
- {id: 70, cat: TV/Sport, desc: "Lucha Libre HD"}
- {id: 23, cat: TV/Sport, desc: "Misc"}
- {id: 24, cat: TV/Sport, desc: "MMA"}
- {id: 59, cat: TV/Sport, desc: "MMA HD"}
- {id: 30, cat: TV/Sport, desc: "Packs"}
- {id: 68, cat: TV/Sport, desc: "Podcasts"}
- {id: 29, cat: TV/Sport, desc: "Puro"}
- {id: 18, cat: TV/Sport, desc: "ROH"}
- {id: 52, cat: TV/Sport, desc: "ROH HD"}
- {id: 45, cat: TV/Sport, desc: "Shoot Interviews"}
- {id: 4, cat: TV/Sport, desc: "Single Matches"}
- {id: 7, cat: TV/Sport, desc: "TNA Impact"}
- {id: 49, cat: TV/Sport, desc: "TNA Impact HD"}
- {id: 6, cat: TV/Sport, desc: "TNA PPV's"}
- {id: 55, cat: TV/Sport, desc: "TNA PPV's HD"}
- {id: 66, cat: TV/Sport, desc: "Total Divas"}
- {id: 67, cat: TV/Sport, desc: "Total Divas HD"}
- {id: 57, cat: TV/Sport, desc: "Tough Enough"}
- {id: 58, cat: TV/Sport, desc: "Tough Enough HD"}
- {id: 22, cat: TV/Sport, desc: "USA Indy's"}
- {id: 12, cat: TV/Sport, desc: "WCW"}
- {id: 71, cat: TV/Sport, desc: "Womens Wrestling"}
- {id: 15, cat: TV/Sport, desc: "Wrestling Films"}
- {id: 72, cat: TV/Sport, desc: "WWE 205 Live"}
- {id: 73, cat: TV/Sport, desc: "WWE 205 Live HD"}
- {id: 16, cat: TV/Sport, desc: "WWE Heat"}
- {id: 63, cat: TV/Sport, desc: "WWE Main Event"}
- {id: 64, cat: TV/Sport, desc: "WWE Network"}
- {id: 65, cat: TV/Sport, desc: "WWE Network HD"}
- {id: 46, cat: TV/Sport, desc: "WWE NXT"}
- {id: 50, cat: TV/Sport, desc: "WWE NXT HD"}
- {id: 9, cat: TV/Sport, desc: "WWE PPV's"}
- {id: 56, cat: TV/Sport, desc: "WWE PPV's HD"}
- {id: 10, cat: TV/Sport, desc: "WWE RAW"}
- {id: 51, cat: TV/Sport, desc: "WWE RAW HD"}
- {id: 11, cat: TV/Sport, desc: "WWE Smackdown"}
- {id: 53, cat: TV/Sport, desc: "WWE Smackdown HD"}
- {id: 43, cat: TV/Sport, desc: "WWE Superstars"}
- {id: 54, cat: TV/Sport, desc: "WWE Superstars HD"}
- {id: 19, cat: TV/Sport, desc: "WWE Velocity"}
- {id: 31, cat: TV/Sport, desc: "WWE Vintage"}
modes:
search: [q]
login:
path: login.php
method: form
form: form[action="tlogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: table.main:contains("Login failed!")
message:
selector: table tr td.text
test:
path: browse.php
selector: div#wel-messeng:has(a[href="logout.php"])
ratio:
path: browse.php
selector: div#wel-radio b:nth-child(2)
search:
paths:
# http://xtremewrestlingtorrents.net/browse.php?search=halftime+heat&c16=1&c65=1&c10=1&c54=1&c76=1&c46=1&c51=1&c31=1&c11=1&incldead=1
- path: browse.php
inputs:
$raw: "{{range .Categories}}c{{.}}=1&{{end}}"
incldead: "1"
search: "{{ .Keywords }}"
sort: "4" # date
type: "desc"
rows:
selector: table[border="0"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="])
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a[href^="details.php?id="]
attribute: title
download:
selector: a[href^="download.php"]
attribute: href
details:
selector: a[href^="details.php?id="]
attribute: href
files:
selector: td:nth-child(3)
grabs:
selector: td:nth-child(7)
filters:
- name: replace
args: ["times", ""]
- name: replace
args: ["time", ""]
size:
selector: td:nth-child(6)
seeders:
selector: td:nth-last-child(3)
leechers:
selector: td:nth-last-child(2)
date:
selector: td:nth-child(5)
filters:
- name: dateparse
args: "2006-01-0215:04:05"
downloadvolumefactor:
case:
img[src="pic/freeleech.png"]: "0"
"*": "1"
uploadvolumefactor:
case:
"*": "1"

View File

@@ -1,4 +1,4 @@
---
---
site: yggtorrent
name: YGGtorrent
description: "YGGTorrent is a FRENCH Semi-Private Torrent Tracker for 0DAY / GENERAL"
@@ -25,6 +25,7 @@
- https://ygg.to/
- https://www.ygg.to/
- https://ww3.yggtorrent.gg/
- https://yggtorrent.gg/
- https://www.yggtorrent.gg/
caps:
@@ -131,6 +132,10 @@
type: checkbox
label: Replace VOSTFR with ENGLISH
default: false
- name: enhancedAnime
type: checkbox
label: Enhance sonarr compatibility with anime by renaming episode (xxx to exxx). Works only if episode is at the end of the query. Can disturb movies search. (back to the future 3 -> back to the future e3)
default: false
login:
method: form
path: /
@@ -143,12 +148,13 @@
- selector: "#login_msg_pass[style=\"\"][style] > center"
test:
path: /
selector: a[href$="/user/logout"]
selector: div#top_panel:contains("Déconnexion")
search:
followredirect: true
paths:
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date"
- path: "/engine/search?category={{ .Config.category }}&name={{ .Keywords }}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date&page=50"
- path: "/engine/search?category={{ .Config.category }}&name={{if .Config.enhancedAnime}}{{ re_replace .Keywords \"([\\.\\s\\[\\-])(\\d+)$\" \"$1e$2\" }}{{else}}{{ re_replace .Keywords \"\\s\" \"\"\"\" }}{{end}}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date"
- path: "/engine/search?category={{ .Config.category }}&name={{if .Config.enhancedAnime}}{{ re_replace .Keywords \"([\\.\\s\\[\\-])(\\d+)$\" \"$1e$2\" }}{{else}}{{ re_replace .Keywords \"\\s\" \"\"\"\" }}{{end}}&description=&file=&uploader=&sub_category=&do=search&order=desc&sort=publish_date&page=50"
rows:
selector: "table.table > tbody > tr"
@@ -286,7 +292,7 @@
leechers:
text: 0
leechers:
selector: "td:nth-child(*)"
selector: "td:nth-child(9)"
optional: true
downloadvolumefactor:
text: "1"

View File

@@ -4,7 +4,7 @@ using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -172,7 +172,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = "ul.topics > li.row";
var ResultParser = new HtmlParser();
var SearchResultDocument = ResultParser.Parse(results.Content);
var SearchResultDocument = ResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
{
@@ -190,7 +190,7 @@ namespace Jackett.Common.Indexers
release.Guid = release.Comments;
var detailsResult = await RequestStringWithCookies(SiteLink + qDetailsLink.GetAttribute("href"));
var DetailsResultDocument = ResultParser.Parse(detailsResult.Content);
var DetailsResultDocument = ResultParser.ParseDocument(detailsResult.Content);
var qDownloadLink = DetailsResultDocument.QuerySelector("table.table2 > tbody > tr > td > a[href^=\"/download/torrent.php?id\"]");
release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").TrimStart('/'));

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -1647,7 +1647,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = "ul.topics > li";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
{

View File

@@ -6,7 +6,7 @@ using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -78,7 +78,7 @@ namespace Jackett.Common.Indexers.Abstract
await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("logout.php"), () =>
{
var loginResultParser = new HtmlParser();
var loginResultDocument = loginResultParser.Parse(response.Content);
var loginResultDocument = loginResultParser.ParseDocument(response.Content);
var loginform = loginResultDocument.QuerySelector("#loginform");
if (loginform == null)
throw new ExceptionWithConfigData(response.Content, configData);

View File

@@ -7,7 +7,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Dom;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -144,7 +144,7 @@ namespace Jackett.Common.Indexers
const string rowsSelector = "table.torrent_table > tbody > tr:not(tr.colhead)";
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.Parse(results.Content);
var searchResultDocument = searchResultParser.ParseDocument(results.Content);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
foreach (var row in rows)
{
@@ -276,7 +276,7 @@ namespace Jackett.Common.Indexers
const string rowsSelector = "table.torrent_table > tbody > tr:not(tr.colhead)";
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.Parse(results.Content);
var searchResultDocument = searchResultParser.ParseDocument(results.Content);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
ICollection<int> groupCategory = null;

View File

@@ -8,8 +8,8 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Dom;
using AngleSharp.Dom.Html;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Dom;
using AngleSharp.Html.Parser;
using Jackett.Common.Helpers;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
@@ -371,7 +371,7 @@ namespace Jackett.Common.Indexers
return true; // no error
var ResultParser = new HtmlParser();
var ResultDocument = ResultParser.Parse(loginResult.Content);
var ResultDocument = ResultParser.ParseDocument(loginResult.Content);
foreach (errorBlock error in errorBlocks)
{
var selection = ResultDocument.QuerySelector(error.Selector);
@@ -445,7 +445,7 @@ namespace Jackett.Common.Indexers
// request real login page again
landingResult = await RequestStringWithCookies(LoginUrl, null, SiteLink);
var htmlParser = new HtmlParser();
landingResultDocument = htmlParser.Parse(landingResult.Content);
landingResultDocument = htmlParser.ParseDocument(landingResult.Content);
}
else
{
@@ -719,7 +719,7 @@ namespace Jackett.Common.Indexers
if (Login.Test.Selector != null)
{
var testResultParser = new HtmlParser();
var testResultDocument = testResultParser.Parse(testResult.Content);
var testResultDocument = testResultParser.ParseDocument(testResult.Content);
var selection = testResultDocument.QuerySelectorAll(Login.Test.Selector);
if (selection.Length == 0)
{
@@ -784,7 +784,7 @@ namespace Jackett.Common.Indexers
landingResult = await RequestStringWithCookies(LoginUrl.AbsoluteUri, null, SiteLink);
var htmlParser = new HtmlParser();
landingResultDocument = htmlParser.Parse(landingResult.Content);
landingResultDocument = htmlParser.ParseDocument(landingResult.Content);
var hasCaptcha = false;
@@ -1237,7 +1237,7 @@ namespace Jackett.Common.Indexers
try
{
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results);
var SearchResultDocument = SearchResultParser.ParseDocument(results);
// check if we need to login again
var loginNeeded = CheckIfLoginIsNeeded(response, SearchResultDocument);
@@ -1257,7 +1257,7 @@ namespace Jackett.Common.Indexers
await FollowIfRedirect(response);
results = response.Content;
SearchResultDocument = SearchResultParser.Parse(results);
SearchResultDocument = SearchResultParser.ParseDocument(results);
}
checkForError(response, Definition.Search.Error);
@@ -1265,7 +1265,7 @@ namespace Jackett.Common.Indexers
if (Search.Preprocessingfilters != null)
{
results = applyFilters(results, Search.Preprocessingfilters, variables);
SearchResultDocument = SearchResultParser.Parse(results);
SearchResultDocument = SearchResultParser.ParseDocument(results);
logger.Debug(string.Format("CardigannIndexer ({0}): result after preprocessingfilters: {1}", ID, results));
}
@@ -1652,7 +1652,7 @@ namespace Jackett.Common.Indexers
response = await RequestStringWithCookies(response.RedirectingTo);
var results = response.Content;
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results);
var SearchResultDocument = SearchResultParser.ParseDocument(results);
var DlUri = SearchResultDocument.QuerySelector(selector);
if (DlUri != null)
{

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
@@ -170,7 +170,7 @@ namespace Jackett.Common.Indexers
{
var RowsSelector = "table[id='sortabletable'] > tbody > tr";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
var lastDate = DateTime.Now;
@@ -236,7 +236,7 @@ namespace Jackett.Common.Indexers
banner.Remove();
}
tooltip.QuerySelector("div:contains(\"Total Hits : \")").Remove();
tooltip.QuerySelector("div:contains(\"Total Hits\")").Remove();
var longtitle = tooltip.QuerySelectorAll("div").First();
release.Title = longtitle.TextContent;

View File

@@ -5,7 +5,7 @@ using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -233,7 +233,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = ".torrent_table > tbody > tr";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
bool stickyGroup = false;

View File

@@ -1,29 +0,0 @@
using Jackett.Common.Indexers.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using NLog;
namespace Jackett.Common.Indexers
{
public class HDForever : GazelleTracker
{
public HDForever(IIndexerConfigurationService configService, WebClient webClient, Logger logger, IProtectionService protectionService)
: base(name: "HD-Forever",
desc: "HD-Forever (HD-F) is a FRENCH Private Torrent Tracker for HD MOVIES",
link: "https://hdf.world/",
configService: configService,
logger: logger,
protectionService: protectionService,
webClient: webClient,
supportsFreeleechTokens: true
)
{
Language = "fr-fr";
Type = "private";
this.supportsCategories = false; // they have categories but the API never returns the category, always default to Movie
AddCategoryMapping(1, TorznabCatType.MoviesHD, "Movie");
}
}
}

View File

@@ -13,7 +13,7 @@ using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
using System.Text.RegularExpressions;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
namespace Jackett.Common.Indexers
{
@@ -83,7 +83,7 @@ namespace Jackett.Common.Indexers
{
return releases.ToArray();
}
var dom = ResultParser.Parse(response.Content);
var dom = ResultParser.ParseDocument(response.Content);
var resultLinks = dom.QuerySelectorAll("ul > li > a");
var uniqueShowLinks = new HashSet<string>();
foreach (var resultLink in resultLinks)
@@ -125,7 +125,7 @@ namespace Jackett.Common.Indexers
return releases.ToArray();
}
var dom = ResultParser.Parse(response.Content);
var dom = ResultParser.ParseDocument(response.Content);
var latestresults = dom.QuerySelectorAll("ul > li > a");
foreach (var resultLink in latestresults)
{
@@ -173,7 +173,7 @@ namespace Jackett.Common.Indexers
while(true)
{
var showAPIResponse = await RequestStringWithCookiesAndRetry(apiUrl + "&nextid=" + nextId, string.Empty);
var showAPIdom = ResultParser.Parse(showAPIResponse.Content);
var showAPIdom = ResultParser.ParseDocument(showAPIResponse.Content);
var releaseRowResults = showAPIdom.QuerySelectorAll("div.rls-info-container");
releaserows.AddRange(releaseRowResults);
nextId++;

View File

@@ -24,6 +24,7 @@ namespace Jackett.Common.Indexers
public override string[] AlternativeSiteLinks { get; protected set; } = new string[] {
"https://iptorrents.com/",
"https://www.iptorrents.com/",
"https://ipt-update.com/",
"https://iptorrents.eu/",
"https://nemo.iptorrents.com/",

View File

@@ -7,7 +7,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Dom;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
@@ -351,7 +351,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(results.Content);
var document = parser.ParseDocument(results.Content);
var rows = document.QuerySelectorAll("div.row");
foreach (var row in rows)
@@ -380,7 +380,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(results.Content);
var document = parser.ParseDocument(results.Content);
var playButton = document.QuerySelector("div.external-btn");
if (playButton != null && !playButton.ClassList.Contains("inactive"))
@@ -428,7 +428,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(results.Content);
var document = parser.ParseDocument(results.Content);
var seasons = document.QuerySelectorAll("div.serie-block");
var rowSelector = "table.movie-parts-list > tbody > tr";
@@ -585,7 +585,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(results.Content);
var document = parser.ParseDocument(results.Content);
var meta = document.QuerySelector("meta");
var metaContent = meta.GetAttribute("content");
@@ -611,7 +611,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(results.Content);
var document = parser.ParseDocument(results.Content);
var rows = document.QuerySelectorAll("div.inner-box--item");
logger.Debug("> Parsing " + rows.Count().ToString() + " releases");

View File

@@ -4,8 +4,8 @@ using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Dom.Html;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Dom;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -762,7 +762,7 @@ namespace Jackett.Common.Indexers
{
var result = await mt.RequestBytesWithCookies(uri.AbsoluteUri, null, method, null, data, headers);
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(mt.Encoding.GetString(result.Content));
var doc = SearchResultParser.ParseDocument(mt.Encoding.GetString(result.Content));
return doc;
}
}

View File

@@ -7,7 +7,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Dom;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using CsQuery;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
@@ -120,7 +120,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.Parse(response.Content);
var document = parser.ParseDocument(response.Content);
var groups = document.QuerySelectorAll(".torrent_table > tbody > tr.group");
var torrents = document.QuerySelectorAll(".torrent_table > tbody > tr.torrent");

View File

@@ -6,7 +6,7 @@ using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -373,7 +373,7 @@ namespace Jackett.Common.Indexers
private IEnumerable<NewpctRelease> ParseDailyContent(string content)
{
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(content);
var doc = SearchResultParser.ParseDocument(content);
List<NewpctRelease> releases = new List<NewpctRelease>();
@@ -425,7 +425,7 @@ namespace Jackett.Common.Indexers
private string ParseSeriesListContent(string content, string title)
{
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(content);
var doc = SearchResultParser.ParseDocument(content);
Dictionary<string, string> results = new Dictionary<string, string>();
@@ -450,7 +450,7 @@ namespace Jackett.Common.Indexers
private IEnumerable<NewpctRelease> ParseEpisodesListContent(string content)
{
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(content);
var doc = SearchResultParser.ParseDocument(content);
List<NewpctRelease> releases = new List<NewpctRelease>();
@@ -517,7 +517,7 @@ namespace Jackett.Common.Indexers
private IEnumerable<NewpctRelease> ParseSearchContent(string content)
{
var SearchResultParser = new HtmlParser();
var doc = SearchResultParser.Parse(content);
var doc = SearchResultParser.ParseDocument(content);
List<NewpctRelease> releases = new List<NewpctRelease>();

View File

@@ -4,7 +4,7 @@ using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -57,7 +57,7 @@ namespace Jackett.Common.Indexers
{
var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty);
var LoginParser = new HtmlParser();
var LoginDocument = LoginParser.Parse(loginPage.Content);
var LoginDocument = LoginParser.ParseDocument(loginPage.Content);
configData.CaptchaCookie.Value = loginPage.Cookies;
@@ -104,7 +104,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.Content.Contains("logout.php"), () =>
{
var LoginParser = new HtmlParser();
var LoginDocument = LoginParser.Parse(result.Content);
var LoginDocument = LoginParser.ParseDocument(result.Content);
var errorMessage = LoginDocument.QuerySelector("span.warning[id!=\"no-cookies\"]:has(br)").TextContent;
throw new ExceptionWithConfigData(errorMessage, configData);
});
@@ -144,7 +144,7 @@ namespace Jackett.Common.Indexers
Regex IMDBRegEx = new Regex(@"tt(\d+)", RegexOptions.Compiled);
var hParser = new HtmlParser();
var ResultDocument = hParser.Parse(results.Content);
var ResultDocument = hParser.ParseDocument(results.Content);
try
{
var Groups = ResultDocument.QuerySelectorAll("div.browsePoster");

View File

@@ -36,7 +36,7 @@ namespace Jackett.Common.Indexers
client: w,
logger: l,
p: ps,
configData: new ConfigurationDataBasicLogin())
configData: new ConfigurationDataCookie())
{
Encoding = Encoding.UTF8;
Language = "sv-sw";

View File

@@ -4,7 +4,7 @@ using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -95,7 +95,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = "table.torrent_table > tbody > tr.torrent";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
{

View File

@@ -6,7 +6,7 @@ using System.Net;
using System.Text;
using System.Threading.Tasks;
using AngleSharp.Dom;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -106,7 +106,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = "div.borderwrap:has(div.maintitle) > table > tbody > tr:has(a[href*=\"index.php?showtopic=\"])";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
{
@@ -201,7 +201,7 @@ namespace Jackett.Common.Indexers
var response = await RequestStringWithCookies(link.ToString());
var results = response.Content;
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results);
var SearchResultDocument = SearchResultParser.ParseDocument(results);
var downloadSelector = "a[title=\"Download attachment\"]";
var DlUri = SearchResultDocument.QuerySelector(downloadSelector);
if (DlUri != null)

View File

@@ -5,7 +5,7 @@ using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -64,7 +64,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("logout.php"), () =>
{
var parser = new HtmlParser();
var document = parser.Parse(response.Content);
var document = parser.ParseDocument(response.Content);
var messageEl = document.QuerySelector("form > span[class='warning']");
var errorMessage = response.Content;
if (messageEl != null)
@@ -104,7 +104,7 @@ namespace Jackett.Common.Indexers
{
var globalFreeleech = false;
var parser = new HtmlParser();
var document = parser.Parse(htmlResponse);
var document = parser.ParseDocument(htmlResponse);
if (document.QuerySelector("div.nicebar > span:contains(\"Personal Freeleech\")") != null)
globalFreeleech = true;

View File

@@ -4,7 +4,7 @@ using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using AngleSharp.Parser.Html;
using AngleSharp.Html.Parser;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Models.IndexerConfig.Bespoke;
@@ -1443,7 +1443,7 @@ namespace Jackett.Common.Indexers
configData.CookieHeader.Value = null;
var response = await RequestStringWithCookies(LoginUrl);
var LoginResultParser = new HtmlParser();
var LoginResultDocument = LoginResultParser.Parse(response.Content);
var LoginResultDocument = LoginResultParser.ParseDocument(response.Content);
var captchaimg = LoginResultDocument.QuerySelector("img[src^=\"https://static.t-ru.org/captcha/\"]");
if (captchaimg != null)
{
@@ -1489,7 +1489,7 @@ namespace Jackett.Common.Indexers
logger.Debug(result.Content);
var errorMessage = "Unknown error message, please report";
var LoginResultParser = new HtmlParser();
var LoginResultDocument = LoginResultParser.Parse(result.Content);
var LoginResultDocument = LoginResultParser.ParseDocument(result.Content);
var errormsg = LoginResultDocument.QuerySelector("h4[class=\"warnColor1 tCenter mrg_16\"]");
if (errormsg != null)
errorMessage = errormsg.TextContent;
@@ -1534,7 +1534,7 @@ namespace Jackett.Common.Indexers
string RowsSelector = "table#tor-tbl > tbody > tr";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.Parse(results.Content);
var SearchResultDocument = SearchResultParser.ParseDocument(results.Content);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
foreach (var Row in Rows)
{

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AngleSharp" Version="0.9.11" />
<PackageReference Include="AngleSharp" Version="0.10.1" />
<PackageReference Include="Autofac" Version="4.8.1" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="BencodeNET" Version="2.2.24" />

View File

@@ -32,6 +32,7 @@ namespace Jackett.Common.Services
ITrayLockService lockService;
private ServerConfig serverConfig;
bool forceupdatecheck = false;
Variants.JackettVariant variant = Variants.JackettVariant.NotFound;
public UpdateService(Logger l, WebClient c, IConfigurationService cfg, ITrayLockService ls, ServerConfig sc)
{
@@ -88,6 +89,11 @@ namespace Jackett.Common.Services
logger.Info($"Skipping update check as it is disabled.");
return;
}
Variants variants = new Variants();
variant = variants.GetVariant();
logger.Info("Jackett variant: " + variant.ToString());
if (DotNetCoreUtil.IsRunningOnDotNetCore)
{
logger.Info($"Skipping update check as running Jackett on .NET Core is still in preview. Updates must be performed manually at this time.");
@@ -223,7 +229,9 @@ namespace Jackett.Common.Services
private async Task<string> DownloadRelease(List<Asset> assets, bool isWindows, string version)
{
var targetAsset = assets.Where(a => isWindows ? a.Browser_download_url.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) : a.Browser_download_url.EndsWith(".gz", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
Variants variants = new Variants();
string artifactFileName = variants.GetArtifactFileName(variant);
Asset targetAsset = assets.Where(a => a.Browser_download_url.EndsWith(artifactFileName, StringComparison.OrdinalIgnoreCase) && artifactFileName.Length > 0).FirstOrDefault();
if (targetAsset == null)
{

View File

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace Jackett.Common.Utils
{
public class Variants
{
public enum JackettVariant
{
NotFound,
FullFrameworkWindows,
Mono,
CoreWindows,
CoreMacOs,
CoreLinuxAmd64,
CoreLinuxArm32,
CoreLinuxArm64
}
public JackettVariant GetVariant()
{
if (DotNetCoreUtil.IsRunningOnDotNetCore)
{
//Dot Net Core
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return JackettVariant.CoreWindows;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
return JackettVariant.CoreMacOs;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.X64)
{
return JackettVariant.CoreLinuxAmd64;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.Arm)
{
return JackettVariant.CoreLinuxArm32;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{
return JackettVariant.CoreLinuxArm64;
}
}
else
{
//Full framework
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
return JackettVariant.FullFrameworkWindows;
}
else
{
return JackettVariant.Mono;
}
}
return JackettVariant.NotFound;
}
public string GetArtifactFileName(JackettVariant variant)
{
switch (variant)
{
case JackettVariant.FullFrameworkWindows:
{
return "Jackett.Binaries.Windows.zip";
}
case JackettVariant.Mono:
{
return "Jackett.Binaries.Mono.tar.gz";
}
case JackettVariant.CoreWindows:
{
return ""; //Not implemented yet
}
case JackettVariant.CoreMacOs:
{
return "Jackett.Binaries.macOS.tar.gz";
}
case JackettVariant.CoreLinuxAmd64:
{
return "Jackett.Binaries.LinuxAMD64.tar.gz";
}
case JackettVariant.CoreLinuxArm32:
{
return "Jackett.Binaries.LinuxARM32.tar.gz";
}
case JackettVariant.CoreLinuxArm64:
{
return "Jackett.Binaries.LinuxARM64.tar.gz";
}
default:
{
return "";
}
}
}
}
}

View File

@@ -8,8 +8,12 @@
<NoWarn>NU1605</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' != 'net461' and $(RuntimeIdentifier.Contains('win')) == 'false'">
<AssemblyName>jackett</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp2.2'">
<RuntimeIdentifiers>win-x86;osx-x64;linux-x64;linux-arm</RuntimeIdentifiers>
<RuntimeIdentifiers>win-x86;osx-x64;linux-x64;linux-arm;linux-arm64</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net461'">
@@ -51,15 +55,6 @@
<Content Include="..\..\LICENSE" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\Upstart.config" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\install_service_macos" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\install_service_systemd.sh" Visible="false">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@@ -91,6 +91,9 @@ namespace Jackett.Server.Services
var runtimedir = RuntimeEnvironment.GetRuntimeDirectory();
logger.Info("Environment version: " + Environment.Version.ToString() + " (" + runtimedir + ")");
logger.Info("OS version: " + Environment.OSVersion.ToString() + (Environment.Is64BitOperatingSystem ? " (64bit OS)" : "") + (Environment.Is64BitProcess ? " (64bit process)" : ""));
Variants variants = new Variants();
Variants.JackettVariant variant = variants.GetVariant();
logger.Info("Jackett variant: " + variant.ToString());
try
{