Compare commits

...

125 Commits

Author SHA1 Message Date
jackettbot[bot]
b0dbd475dc Update rudub 2025-11-27 01:29:09 +00:00
Garfield69
14b132e4f3 torrenttip: bump domain 2025-11-26 18:35:37 +13:00
Garfield69
5e78223cdc torrentsome: bump domain 2025-11-26 18:35:26 +13:00
jackettbot[bot]
4cd883d432 Update rudub 2025-11-26 01:29:05 +00:00
ilike2burnthing
a1a98f9836 theoldschool-api: add setting to disable imdbid & tvdbid search
https://github.com/Prowlarr/Indexers/issues/691
2025-11-25 22:46:44 +00:00
Garfield69
0c9c144e5a extremebits: CA expired. 2025-11-26 05:26:58 +13:00
Garfield69
a2da916252 zktorrent: new domain 2025-11-25 18:34:09 +13:00
Garfield69
8d85708721 assorted nexus: bump engine tag 2025-11-25 17:03:30 +13:00
Garfield69
a00ff4703e rudub workflow part 2 of 2 previous domain pics -> world 2025-11-25 16:08:38 +13:00
jackettbot[bot]
fcf7694ae7 Update rudub 2025-11-25 01:29:25 +00:00
Garfield69
503030045f torrentkitty: prevent "could not select database" 2025-11-25 09:11:34 +13:00
Garfield69
5f53bea74a sosulki: new domain + change row selector. resolves #7559 2025-11-25 06:12:49 +13:00
Garfield69
855d89296a nicept: bump engine tag and add cookie comment. completes 7800813aee 2025-11-25 05:11:51 +13:00
ilike2burnthing
7800813aee nicept: change to cookie login
`response` JS input
2025-11-24 15:14:42 +00:00
ilike2burnthing
2151dba5d1 rudub workflow part 1 of 2 current domain pics -> world 2025-11-24 14:27:09 +00:00
ilike2burnthing
8e1887a133 Revert "matrix: update cat 26 detection"
This reverts commit aa0ae46fd9.
2025-11-24 14:13:24 +00:00
Garfield69
587bef69d4 nortorrent: new domain 2025-11-24 18:34:15 +13:00
ilike2burnthing
32863c2aa9 matrix: add cat 2025-11-24 04:53:08 +00:00
jackettbot[bot]
6e0a3ea759 Update rudub 2025-11-24 01:29:27 +00:00
Garfield69
7de44d8c9e ArabicSource: add magnet. resolves #15996 2025-11-24 08:45:38 +13:00
Garfield69
53646c28de arabicsource: grabs/seed/leech are long not int 2025-11-24 07:36:20 +13:00
Garfield69
aa0ae46fd9 matrix: update cat 26 detection 2025-11-24 07:15:23 +13:00
Bogdan
535f199e84 anilibria: use TryParse in season and episode parsing 2025-11-23 15:05:12 +02:00
Bogdan
64dd9c6897 anilibria: fix roman to arabic regex
Fixes #16303
2025-11-23 14:58:12 +02:00
jackettbot[bot]
eb3898a961 Update rudub 2025-11-23 01:29:45 +00:00
dependabot[bot]
75bf8d7078 build(deps): bump actions/checkout from 5 to 6 (#16305)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
(skip definitions update job for dependabot)
2025-11-22 02:46:28 +00:00
jackettbot[bot]
390b1714f4 Update rudub 2025-11-22 01:28:49 +00:00
Garfield69
6254d62c23 torrentqq: bump domain 2025-11-21 18:32:28 +13:00
jackettbot[bot]
08773ae3c9 Update rudub 2025-11-21 01:28:59 +00:00
jackettbot[bot]
7b7f77e06f Update rudub 2025-11-20 01:29:17 +00:00
Bogdan
64fc61f777 core: refactor remaining obsolete calls (#16301) 2025-11-19 19:41:26 +02:00
Garfield69
dee082ead3 torrenttip: bump domain 2025-11-20 05:39:38 +13:00
Garfield69
6347fdff66 torrentsome: bump domain 2025-11-20 05:39:28 +13:00
Garfield69
cdeac3c0ef kickasstorrents-to: new cat 2025-11-20 05:39:13 +13:00
Bogdan
6d568a4059 yts: update links
Closes #16297
2025-11-19 17:50:18 +02:00
jackettbot[bot]
3dd5b1e5f0 Update rudub 2025-11-19 01:29:18 +00:00
Garfield69
fb9845d1e3 magnetz: q -> query 2025-11-19 13:03:56 +13:00
Garfield69
70b0aa1f67 linuxtracker: new cat 2025-11-19 06:10:10 +13:00
Garfield69
368afcfc5a hdgalaktik: new size selector. resolves dd11b7e6cd 2025-11-18 16:42:57 +13:00
jackettbot[bot]
29d28e2607 Update rudub 2025-11-18 01:29:11 +00:00
Garfield69
b023e8fe6d clearjav: -> 9.1.7 drop info_hash 2025-11-18 06:56:48 +13:00
Garfield69
d51752f682 kickasstorrents-to: new cat 2025-11-18 06:36:40 +13:00
Garfield69
ec40699cdc hdgalaktik: restore previous size selector. reverts dd11b7e6cd 2025-11-18 06:36:24 +13:00
jackettbot[bot]
3c798127c5 Update rudub 2025-11-17 01:29:17 +00:00
Bogdan
61b263dd98 core: refactor obsolete calls (#16290)
* core: refactor obsolete hashing calls

* core: delete cert callback validation removal in update service

* core: remove deprecated ServicePointManager calls

- Avoid harcoding SSL protocols.
- Lowering DefaultConnectionLimit 1000 to MaxConnectionsPerServer 20

* core: avoid is only supported on windows warnings
2025-11-16 22:05:22 +02:00
ilike2burnthing
dd11b7e6cd hdgalaktik: update size selector & remove cert exception 2025-11-16 19:05:54 +00:00
jackettbot[bot]
bec42c4ac0 Update rudub 2025-11-16 01:29:39 +00:00
Garfield69
9b08d7ad46 hdgalaktik: new layout resolves #13186
necessitates switching to categorydesc
plus new selectors
2025-11-16 13:10:06 +13:00
Garfield69
9311af24b5 uztracker: update cats 2025-11-16 06:01:56 +13:00
jackettbot[bot]
9e5d79d2a4 Update rudub 2025-11-15 01:29:11 +00:00
jackettbot[bot]
15c64f9f66 Update rudub 2025-11-14 01:29:13 +00:00
ilike2burnthing
f1f8f0f756 mvgroup: add flaresolverr info (#16289) 2025-11-13 22:23:12 +00:00
ilike2burnthing
b3d4ec6f23 Update README.md 2025-11-13 17:30:03 +00:00
Garfield69
7f33664f97 sextorrent: new cats 2025-11-14 05:30:19 +13:00
Garfield69
43aaaf4142 torrentqq: bump domain 2025-11-14 05:15:02 +13:00
Garfield69
20a0bedc3b magnetcat: bump alternate domains 2025-11-14 05:13:55 +13:00
ilike2burnthing
31e0a19eeb amigosshare: remove possible trailing spaces (#16288) 2025-11-13 17:21:56 +13:00
jackettbot[bot]
ccb98cbe48 Update rudub 2025-11-13 01:29:07 +00:00
Garfield69
6560931e42 Revert "bump version to 0.25.*"
This reverts commit 46082db9b9.
2025-11-13 05:50:47 +13:00
Garfield69
46082db9b9 bump version to 0.25.* 2025-11-13 05:48:35 +13:00
Bogdan
89f4a9fb89 core: fixed constants usage to determine target framework (#16287) 2025-11-12 17:47:30 +02:00
Garfield69
3e2411865f torrenttip: bump domain 2025-11-12 18:36:12 +13:00
Garfield69
74b2f9e670 torrentsome: bump domain 2025-11-12 18:35:56 +13:00
ilike2burnthing
78b538d2be huntorrent: fix category and IMDBID search, split bithorlo to huntorrent-bithorlo (#16285) 2025-11-12 16:55:08 +13:00
jackettbot[bot]
e92e9d168e Update rudub 2025-11-12 01:29:21 +00:00
Garfield69
e32053b153 oxtorrent-vip: removed. resolves #15411 2025-11-12 13:21:01 +13:00
Bogdan
7eabdec5b0 core: bump dotnet packages (#16284) 2025-11-11 22:16:38 +02:00
Garfield69
76a61e67c4 fix b9834455ed 2025-11-12 08:48:39 +13:00
Garfield69
b9834455ed nortorrent, zetorrents, zktorrent: add proxy alternate
also update domain list tld
2025-11-12 08:39:59 +13:00
ilike2burnthing
2f3f86bf25 pipelines: update images (#16283) 2025-11-11 19:17:47 +00:00
Garfield69
05918d22c1 ztracker: now on https 2025-11-12 06:47:32 +13:00
ilike2burnthing
cae5c818df infinityhd: add private tracker. resolves #16281 (#16282) 2025-11-11 17:34:55 +00:00
ilike2burnthing
84b258a3bb hd-unit3d-api: remove unused book search mode 2025-11-11 17:20:17 +00:00
Garfield69
887c5bafe6 zetorrents & zktorrent: drop home path
prevents Fatal error: Uncaught --> Smarty: Unable to load template file 'home.html' <-- thrown in /www/wwwroot/www-zktorrent.com/libs/sysplugins/smarty_internal_templatebase.php on line 129
2025-11-11 18:36:21 +13:00
jackettbot[bot]
eb933878ec Update rudub 2025-11-11 01:29:07 +00:00
Garfield69
3116dcce2b torrent-turk: update cats 2025-11-11 06:01:49 +13:00
Garfield69
459bc4683e torrentsir: removed. resolves #11214 2025-11-11 05:23:04 +13:00
Garfield69
37ef94e8a5 torrentqq: bump alternate domain 2025-11-11 05:20:20 +13:00
Garfield69
7bbc63ddb8 torrentssg: removed. resolves #15872 2025-11-11 05:20:03 +13:00
jackettbot[bot]
e25370d959 Update rudub 2025-11-10 01:29:27 +00:00
Garfield69
46d6cf7ca1 uztracker: update cats 2025-11-10 06:25:05 +13:00
Garfield69
b8f4caddc2 noname-clubl: new cats 2025-11-10 06:24:37 +13:00
Garfield69
2cfd55b325 extratorrent-st: new cat 2025-11-10 06:23:03 +13:00
Garfield69
5f37536783 ebooks-shares: new cat 2025-11-10 06:22:43 +13:00
Garfield69
c0994d7a5e abtorrents: update cat 2025-11-10 06:22:24 +13:00
Garfield69
7455f3aec6 add magnetz a public site. resolves #16277 2025-11-09 16:40:06 +13:00
ilike2burnthing
832184afaf darkpeers: update MR & MST 2025-11-09 02:26:09 +00:00
jackettbot[bot]
f8bd4cd479 Update rudub 2025-11-09 01:29:25 +00:00
Tiberio
9e1d4af15e shareisland: preserve special chars in release names (#16276) 2025-11-08 20:08:24 +00:00
Garfield69
052d4ab3e2 thepiratedship: removed. resolves #15722 2025-11-09 05:41:30 +13:00
Garfield69
86ba95ceb6 add dasunerwartete-api (#16265) #15156 2025-11-08 15:01:44 +13:00
jackettbot[bot]
15e81d14c9 Update rudub 2025-11-08 01:28:46 +00:00
ilike2burnthing
fd3731c429 core: add IPv6 LLAs to known networks
7ef3b6bd0a
2025-11-08 00:44:02 +00:00
Chad Whitely
adcbd5389c animetorrents: search filename and description (#16274) 2025-11-07 19:09:40 +00:00
ilike2burnthing
995ce3ee84 dontorrent: update sitelinks. resolves #16272
and addresses #6214
2025-11-07 18:12:58 +00:00
Garfield69
ecdb32e57f R4E: new cat 2025-11-08 06:04:17 +13:00
Garfield69
dd49233d41 abtorrents: update cat 2025-11-08 06:04:02 +13:00
Garfield69
2df84ce82d dontorrent: new tld 2025-11-07 18:32:24 +13:00
Garfield69
1b00e38094 rudub workflow part 2 of 2 previous domain homes -> pics 2025-11-07 14:50:30 +13:00
jackettbot[bot]
42ec7db599 Update rudub 2025-11-07 01:28:59 +00:00
Garfield69
ad60961347 rudub workflow part 1 of 2 current domain homes -> pics 2025-11-07 10:43:29 +13:00
Garfield69
c2bb44dfb6 torrentqq: bump domain 2025-11-07 06:01:06 +13:00
Garfield69
f218af30b9 ilolicon: removed. resolves #15230 2025-11-07 06:00:52 +13:00
jackettbot[bot]
d8f0a876d5 Update rudub 2025-11-06 01:29:07 +00:00
Garfield69
eb8279fd00 assorted nexus: bump engine tag 2025-11-06 05:27:20 +13:00
Garfield69
f554ba36c2 torrenttip: bump domain 2025-11-05 18:33:42 +13:00
Garfield69
9c3d105705 torrentsome: bump domain 2025-11-05 18:33:25 +13:00
jackettbot[bot]
da1a0cd98e Update rudub 2025-11-05 01:29:24 +00:00
Garfield69
98cc4f0f99 pignetwork: DL gone from results, create replacement 2025-11-05 05:58:08 +13:00
Garfield69
8e0a583296 fearnopeer: update cats 2025-11-05 05:55:56 +13:00
Garfield69
d40019fc86 ebook-shares: new cat 2025-11-05 05:55:43 +13:00
jackettbot[bot]
1eebcdffca Update rudub 2025-11-04 01:29:07 +00:00
Garfield69
458c1c9420 torrentcontrol: removed. resolves #16238 2025-11-04 05:54:22 +13:00
Garfield69
3db9c65fe0 filelist: update cats
new cats 29, 30
reorder to match category pull down for easier crosschecking
2025-11-04 05:52:02 +13:00
Garfield69
8be39359d9 ilcorsaronero: add comment for domains list link 2025-11-04 05:50:30 +13:00
jackettbot[bot]
ae601a48f1 Update rudub 2025-11-03 01:29:25 +00:00
jackettbot[bot]
1e90e0ba5b Update rudub 2025-11-02 01:29:31 +00:00
Bogdan
72a52629ab newheaven: attempt to use the full release title 2025-11-01 19:10:19 +02:00
Garfield69
88a9ae48ca huntorrent: search all 4 browsers. resolves #10771 2025-11-01 15:48:13 +13:00
Garfield69
5e71e30bc3 add sextorrent a private site. resolves #16182 2025-11-01 14:32:43 +13:00
jackettbot[bot]
3060759f6c Update rudub 2025-11-01 01:29:23 +00:00
Garfield69
38ffba9405 uhdtorrent: removed. resolves #16262 2025-11-01 06:12:46 +13:00
Garfield69
98fd98de28 cangbaoge: leech,grabs can be missing 2025-11-01 06:01:33 +13:00
Garfield69
0f5f76ac6a huntorrent: new selectors, again 2025-11-01 06:01:06 +13:00
drewdrew21b
7a8ffe297c phoenixproject: restore private tracker with scraping (#16266)
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-10-31 07:49:43 +00:00
92 changed files with 1460 additions and 1764 deletions

View File

@@ -57,7 +57,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v5
uses: actions/checkout@v6
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL

View File

@@ -15,7 +15,7 @@ concurrency:
jobs:
update-rudub:
name: Update rudub
if: github.repository == 'Jackett/Jackett'
if: (github.repository == 'Jackett/Jackett' && github.actor != 'dependabot[bot]')
runs-on: ubuntu-latest
permissions:
contents: write
@@ -34,14 +34,14 @@ jobs:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
token: ${{ steps.app-token.outputs.token }}
- name: Setup Environment Variables
run: |
echo "CURRENT_RUDUB_DOMAIN=$(date +'%b%d' | tr '[:upper:]' '[:lower:]').rudub.homes" >> $GITHUB_ENV
echo "PREVIOUS_RUDUB_DOMAIN=$(date --date='yesterday' +'%b%d' | tr '[:upper:]' '[:lower:]').rudub.homes" >> $GITHUB_ENV
echo "CURRENT_RUDUB_DOMAIN=$(date +'%b%d' | tr '[:upper:]' '[:lower:]').rudub.world" >> $GITHUB_ENV
echo "PREVIOUS_RUDUB_DOMAIN=$(date --date='yesterday' +'%b%d' | tr '[:upper:]' '[:lower:]').rudub.world" >> $GITHUB_ENV
- name: Update rudub definition
uses: mikefarah/yq@master

View File

@@ -20,7 +20,7 @@ jobs:
steps:
# This workflow will run a script that is stored in the repository. This step checks out the repository contents so that the workflow can access the script.
- name: Check out repo content
uses: actions/checkout@v5
uses: actions/checkout@v6
# This step sets up Node.js. The script that this workflow will run uses Node.js.
- name: Setup Node.js

View File

@@ -83,6 +83,7 @@ Prior versions of Jackett are no longer supported.
* Mac Torrents Download
* Magnet Cat
* MagnetDownload
* Magnetz
* MegaPeer
* MejorTorrent
* Mikan
@@ -96,7 +97,6 @@ Prior versions of Jackett are no longer supported.
* Nyaa.si
* OneJAV
* OxTorrent
* OxTorrent-vip
* OpenSharing
* PC-torrent
* Pirate's Paradise
@@ -125,7 +125,6 @@ Prior versions of Jackett are no longer supported.
* torrent.by
* torrent-pirat
* Torrent9
* TorrentControl
* TorrentDosFilmes
* TorrentDownload
* TorrentGalaxyClone
@@ -133,9 +132,7 @@ Prior versions of Jackett are no longer supported.
* TorrentProject2
* TorrentQQ (토렌트큐큐)
* Torrents.csv
* TorrentSir (토렌트썰)
* Torrentsome (토렌트썸)
* torrentssg (토렌트쓱)
* Torrenttip (토렌트팁)
* TrahT
* U3C3
@@ -397,11 +394,11 @@ Prior versions of Jackett are no longer supported.
* House of Devil
* HQMusic
* HUDBT (蝴蝶) [![(invite needed)][inviteneeded]](#)
* ilolicon PT
* ImmortalSeed (iS)
* Immortuos
* Indietorrents [![(invite needed)][inviteneeded]](#)
* INFINITY [PAY2DL] [![(invite needed)][inviteneeded]](#)
* InfinityHD
* Infire
* Insane Tracker
* IPTorrents (IPT)
@@ -475,6 +472,7 @@ Prior versions of Jackett are no longer supported.
* PassThePopcorn (PTP) [![(invite needed)][inviteneeded]](#)
* Peeratiko
* Peers.FM
* Phoenix Project
* PigNetwork (猪猪网)
* PixelCove (Ultimate Gamer)
* PiXELHD (PxHD) [![(invite needed)][inviteneeded]](#)
@@ -525,6 +523,7 @@ Prior versions of Jackett are no longer supported.
* SeedFile (SF)
* seedpool
* SewerPT (下水道) [![(invite needed)][inviteneeded]](#)
* SexTorrent
* SFP (Share Friends Projekt)
* ShaKaw [![(invite needed)][inviteneeded]](#)
* Shareisland
@@ -563,7 +562,6 @@ Prior versions of Jackett are no longer supported.
* The Vault (TVBZ)
* The-New-Fun
* TheLeachZone (TLZ)
* ThePiratedShip
* TJUPT (北洋园PT)
* TLFBits [![(invite needed)][inviteneeded]](#)
* TmGHuB (TH) [![(invite needed)][inviteneeded]](#)
@@ -598,7 +596,6 @@ Prior versions of Jackett are no longer supported.
* U2 (U2分享園@動漫花園) [![(invite needed)][inviteneeded]](#)
* UBits
* UHDBits
* uHDTorrent
* UltraHD
* UnlimitZ
* upload.cx (ULCX)
@@ -834,7 +831,7 @@ Detailed instructions are available at [Jackett's Wiki](https://github.com/Jacke
## Running Jackett behind a reverse proxy
When running jackett behind a reverse proxy make sure that the original hostname of the request is passed to Jackett. If HTTPS is used also set the X-Forwarded-Proto header to "https". Don't forget to adjust the "Base path override" Jackett option accordingly.
When running Jackett behind a reverse proxy make sure that the original hostname of the request is passed to Jackett. If HTTPS is used also set the X-Forwarded-Proto header to "https". Don't forget to adjust the "Base path override" Jackett option accordingly.
Example config for apache:
```

View File

@@ -44,70 +44,70 @@ stages:
matrix:
Windows:
buildDescription: Windows
imageName: windows-2022
imageName: windows-2025
framework: $(netCoreFramework)
runtime: win-x86
archiveType: zip
artifactName: Jackett.Binaries.Windows.zip
macOS:
buildDescription: macOS
imageName: macOS-13
imageName: macOS-15
framework: $(netCoreFramework)
runtime: osx-x64
archiveType: tar
artifactName: Jackett.Binaries.macOS.tar.gz
macOSARM64:
buildDescription: macOS ARM64
imageName: macOS-13
imageName: macOS-15
framework: $(netCoreFramework)
runtime: osx-arm64
archiveType: tar
artifactName: Jackett.Binaries.macOSARM64.tar.gz
LinuxAMDx64:
buildDescription: Linux AMD x64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-x64
archiveType: tar
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
LinuxARM32:
buildDescription: Linux ARM32
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-arm
archiveType: tar
artifactName: Jackett.Binaries.LinuxARM32.tar.gz
LinuxARM64:
buildDescription: Linux ARM64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-arm64
archiveType: tar
artifactName: Jackett.Binaries.LinuxARM64.tar.gz
LinuxMuslAMDx64:
buildDescription: Linux musl AMD x64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-musl-x64
archiveType: tar
artifactName: Jackett.Binaries.LinuxMuslAMDx64.tar.gz
LinuxMuslARM32:
buildDescription: Linux musl ARM32
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-musl-arm
archiveType: tar
artifactName: Jackett.Binaries.LinuxMuslARM32.tar.gz
LinuxMuslARM64:
buildDescription: Linux musl ARM64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-musl-arm64
archiveType: tar
artifactName: Jackett.Binaries.LinuxMuslARM64.tar.gz
Mono:
buildDescription: Mono
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: net471
runtime: linux-x64
archiveType: tar
@@ -231,7 +231,7 @@ stages:
- task: CopyFiles@2
displayName: Copy Mono Specific Scripts
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
condition: and(succeeded(), eq(variables['buildDescription'], 'Mono'))
inputs:
SourceFolder: $(Build.SourcesDirectory)
contents: |
@@ -269,7 +269,7 @@ stages:
# https://github.com/Jackett/Jackett/issues/3547
- task: PowerShell@2
displayName: Patch Mono Build (Mono only)
condition: and(succeeded(), startsWith(variables['buildDescription'], 'Mono'))
condition: and(succeeded(), eq(variables['buildDescription'], 'Mono'))
inputs:
workingDirectory: $(Build.BinariesDirectory)/Jackett
targetType: inline
@@ -329,7 +329,7 @@ stages:
- job: Linting_Dotnet
displayName: Linting Dotnet
pool:
vmImage: ubuntu-22.04
vmImage: ubuntu-24.04
workspace:
clean: all
steps:
@@ -362,7 +362,7 @@ stages:
- job: Linting_YAML
displayName: Linting YAML
pool:
vmImage: ubuntu-22.04
vmImage: ubuntu-24.04
workspace:
clean: all
steps:
@@ -382,7 +382,7 @@ stages:
- job: Validate_YAML_Schema
displayName: Validate YAML Schema
pool:
vmImage: ubuntu-22.04
vmImage: ubuntu-24.04
workspace:
clean: all
steps:
@@ -421,22 +421,22 @@ stages:
matrix:
Windows:
buildDescription: Windows
imageName: windows-2022
imageName: windows-2025
framework: $(netCoreFramework)
runtime: win-x86
macOS:
buildDescription: macOS
imageName: macOS-13
imageName: macOS-15
framework: $(netCoreFramework)
runtime: osx-x64
LinuxAMDx64:
buildDescription: LinuxAMDx64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: $(netCoreFramework)
runtime: linux-x64
Mono:
buildDescription: Mono
imageName: ubuntu-22.04
imageName: ubuntu-24.04
framework: net471
runtime: linux-x64
pool:
@@ -445,6 +445,15 @@ stages:
steps:
- checkout: self
- task: Bash@3
displayName: Install Mono (Mono only)
condition: and(succeeded(), eq(variables['buildDescription'], 'Mono'))
inputs:
targetType: inline
script: |
sudo apt update
sudo apt install mono-complete
- task: UseDotNet@2
displayName: Install .NET Core SDK
inputs:
@@ -514,25 +523,25 @@ stages:
matrix:
Windows:
buildDescription: Windows
imageName: windows-2022
imageName: windows-2025
artifactName: Jackett.Binaries.Windows.zip
framework: $(netCoreFramework)
runtime: win-x86
macOS:
buildDescription: macOS
imageName: macOS-13
imageName: macOS-15
artifactName: Jackett.Binaries.macOS.tar.gz
framework: $(netCoreFramework)
runtime: osx-x64
LinuxAMDx64:
buildDescription: Linux AMD x64
imageName: ubuntu-22.04
imageName: ubuntu-24.04
artifactName: Jackett.Binaries.LinuxAMDx64.tar.gz
framework: $(netCoreFramework)
runtime: linux-x64
Mono:
buildDescription: Mono
imageName: ubuntu-22.04
imageName: ubuntu-24.04
artifactName: Jackett.Binaries.Mono.tar.gz
framework: net471
runtime: linux-x64
@@ -542,6 +551,15 @@ stages:
steps:
- checkout: self
- task: Bash@3
displayName: Install Mono (Mono only)
condition: and(succeeded(), eq(variables['buildDescription'], 'Mono'))
inputs:
targetType: inline
script: |
sudo apt update
sudo apt install mono-complete
- task: DownloadBuildArtifacts@0
displayName: Download artifacts for integration tests
inputs:
@@ -596,7 +614,7 @@ stages:
workspace:
clean: all
pool:
vmImage: ubuntu-22.04
vmImage: ubuntu-24.04
steps:
- checkout: self

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFrameworks>netstandard2.0;net9.0</TargetFrameworks>
<LangVersion>9</LangVersion>
<NoWarn />
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>

View File

@@ -182,4 +182,4 @@ search:
description:
selector: td.rowfollow:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.9.9 2025-10-02
# NexusPHP v1.9.11 2025-11-02

View File

@@ -35,7 +35,7 @@ caps:
- {id: 215, cat: Audio/Audiobook, desc: "Paranormal Romance"}
- {id: 200, cat: Audio/Audiobook, desc: "Radio Drama"}
- {id: 205, cat: Audio/Audiobook, desc: "Reference & Educational"}
- {id: 207, cat: Audio/Audiobook, desc: "Religion and Spirituality"}
- {id: 207, cat: Audio/Audiobook, desc: "Religion & Spirituality"}
- {id: 210, cat: Audio/Audiobook, desc: "Romance"}
- {id: 240, cat: Audio/Audiobook, desc: "Sci-Fi Apocalypse"}
- {id: 220, cat: Audio/Audiobook, desc: "Science"}
@@ -53,6 +53,7 @@ caps:
- {id: 420, cat: Books/EBook, desc: "[E] Arts & Crafts (Hobbies)"}
- {id: 430, cat: Books/EBook, desc: "[E] Biography & Memoirs"}
- {id: 435, cat: Books/EBook, desc: "[E] Business"}
- {id: 720, cat: Books/EBook, desc: "[E] Childrens"}
- {id: 450, cat: Books/EBook, desc: "[E] Computer Learning"}
- {id: 460, cat: Books/EBook, desc: "[E] Cookery"}
- {id: 470, cat: Books/EBook, desc: "[E] Crime & Thriller"}
@@ -80,7 +81,6 @@ caps:
- {id: 690, cat: Books/EBook, desc: "[E] Urban Fantasy & Paranormal"}
- {id: 700, cat: Books/EBook, desc: "[E] Western"}
- {id: 710, cat: Books/EBook, desc: "[E] Young Adult"}
- {id: 720, cat: Books/EBook, desc: "[E] Young Children"}
modes:
search: [q]

View File

@@ -152,7 +152,7 @@ search:
keywordsfilters:
# drop the year from searches since site titles do not include year
- name: re_replace
args: ["(\\b((19|20)\\d{2})\\b)", ""]
args: ["(\\s*\\b((19|20)\\d{2})\\b)", ""]
rows:
selector: "div#fancy-list-group ul.list-group li.list-group-item{{ if .Config.freeleech }}:has(span.badge-success:contains(\"FREE\")){{ else }}{{ end }}"

View File

@@ -151,8 +151,10 @@ search:
selector: td.rowfollow.rowfollow:nth-child(6)
leechers:
selector: td.rowfollow:nth-child(7)
optional: true
grabs:
selector: td.rowfollow:nth-child(8)
optional: true
downloadvolumefactor:
case:
img.pro_free: 0

View File

@@ -94,8 +94,6 @@ search:
selector: details_link
download:
selector: download_link
infohash:
selector: info_hash
files:
selector: num_file
seeders:
@@ -145,4 +143,4 @@ search:
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.5 (custom)
# json UNIT3D 9.1.7 (custom)

View File

@@ -188,10 +188,10 @@ search:
True: 2 # double
uploadvolumefactor:
text: "{{ if .Result._featured }}2{{ else }}{{ .Result.uploadvolumefactor_double_upload }}{{ end }}"
# global MR is 0.4 but torrents must be seeded for 3 days or 1:1
# global MR is 0.8 but torrents must be seeded for 6 days or 1:1
minimumratio:
text: 0.8
text: 1.0
minimumseedtime:
# 3 days (as seconds = 3 x 24 x 60 x 60)
text: 259200
# 6 days (as seconds = 6 x 24 x 60 x 60)
text: 518400
# json UNIT3D 9.1.7

View File

@@ -0,0 +1,144 @@
---
id: dasunerwartete-api
name: Das Unerwartete (API)
description: "Das Unerwartete (D-U) is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL. This is the API version."
language: de-DE
type: private
encoding: UTF-8
links:
- https://dasunerwartete.biz/
caps:
categorymappings:
- {id: 145, cat: Movies, desc: "Filme > DRG"}
- {id: 28, cat: Movies/SD, desc: "Filme > SD"}
- {id: 32, cat: Movies/HD, desc: "Filme > HD"}
- {id: 114, cat: Movies/UHD, desc: "Filme > UHD"}
- {id: 140, cat: Movies/BluRay, desc: "Filme > BluRay"}
- {id: 143, cat: TV/Anime, desc: "Filme > Anime"}
- {id: 138, cat: Movies, desc: "Filme > Packs"}
- {id: 148, cat: Movies, desc: "Filme > Packs UHD"}
- {id: 60, cat: TV/SD, desc: "Serien > SD"}
- {id: 57, cat: TV/HD, desc: "Serien > HD"}
- {id: 139, cat: TV/UHD, desc: "Serien > UHD"}
- {id: 144, cat: TV/Anime, desc: "Serien > Anime"}
- {id: 59, cat: TV, desc: "Serien > Packs"}
- {id: 147, cat: TV, desc: "Serien > Packs UHD"}
- {id: 110, cat: Audio/MP3, desc: "Audio > MP3"}
- {id: 48, cat: Audio/Lossless, desc: "Audio > Flac"}
- {id: 52, cat: Audio, desc: "Audio > Pack"}
- {id: 63, cat: Audio/Audiobook, desc: "Audio > Hörbuch"}
- {id: 120, cat: Audio/Video, desc: "Audio > Videos"}
- {id: 12, cat: PC/0day, desc: "Apps > Windows"}
- {id: 125, cat: PC/Mac, desc: "Apps > Mac-OSX"}
- {id: 11, cat: PC/Mobile-Other, desc: "Apps > Mobil"}
- {id: 141, cat: PC, desc: "Apps > Other"}
- {id: 15, cat: TV/Documentary, desc: "Doku > SD"}
- {id: 14, cat: TV/Documentary, desc: "Doku > HD"}
- {id: 123, cat: TV/Documentary, desc: "Doku > Reihe"}
- {id: 126, cat: PC/Mobile-Other, desc: "Spiel > Mobil"}
- {id: 17, cat: PC/Games, desc: "Spiel > PC"}
- {id: 24, cat: Console, desc: "Spiel > Konsole"}
- {id: 121, cat: Console, desc: "Spiel > Wimmelbild"}
- {id: 61, cat: TV/Sport, desc: "Sport > HD"}
- {id: 62, cat: TV/Sport, desc: "Sport > SD"}
- {id: 96, cat: Books/Mags, desc: "ePaper > Zeitungen"}
- {id: 136, cat: Books/EBook, desc: "ePaper > E-Book"}
- {id: 137, cat: Books/Comics, desc: "ePaper > Comics"}
- {id: 76, cat: XXX/SD, desc: "XXX > SD"}
- {id: 73, cat: XXX/x264, desc: "XXX > HD"}
- {id: 75, cat: XXX/Pack, desc: "XXX > Pack"}
- {id: 142, cat: XXX/ImageSet, desc: "XXX > Pic´s"}
- {id: 129, cat: Movies/SD, desc: "Internal > Film SD"}
- {id: 128, cat: Movies/HD, desc: "Internal > Film HD"}
- {id: 131, cat: TV/SD, desc: "Internal > Serien SD"}
- {id: 130, cat: TV/HD, desc: "Internal > Serien HD"}
- {id: 132, cat: Other, desc: "Internal > Sonstiges"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tmdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
book-search: [q]
settings:
- name: apikey
type: text
label: APIKey
- name: info_key
type: info
label: About your API key
default: "Find your API Key by accessing your <a href=\"https://dasunerwartete.biz/\" target=\"_blank\">Das Unerwartete</a> profile page and look for the <b>API-Key:</b> tag."
- name: onlyupload
type: checkbox
label: Search OnlyUpload
default: false
- name: info_free
type: info
label: About OnlyUpload at D-U
default: "OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Jackett dashboard search results these are tagged as Freeleech)."
search:
paths:
- path: api.php
method: get
response:
type: xml
inputs:
apikey: "{{ .Config.apikey }}"
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
q: "{{ .Query.Keywords }}"
imdbid: "{{ .Query.IMDBID }}"
tmdbid: "{{ .Query.TMDBID }}"
free: "{{ if .Config.onlyupload }}yes{{ else }}{{ end }}"
page: 1
rows:
selector: item
fields:
category:
selector: category
title:
selector: title
_id:
selector: guid
details:
text: "details.php?id={{ .Result._id }}"
download:
selector: link
filters:
- name: replace
args: ["&amp;", "&"]
size:
selector: size
date:
# Thu, 30 Oct 2025 00:19:02 +0100
selector: pubDate
filters:
- name: replace
args: ["+0100", "+01:00"]
- name: dateparse
args: "ddd, dd MMM yyyy HH:mm:ss zzz"
seeders:
selector: seeders
leechers:
selector: leechers
imdbid:
selector: imdb
tmdbid:
selector: tmdb
_onlyup:
selector: free_button:contains(Only Upload)
optional: true
downloadvolumefactor:
text: "{{ if .Result._onlyup }}0{{ else }}1{{ end }}"
uploadvolumefactor:
text: 1
minimumratio:
text: 1.0
minimumseedtime:
# 1.5 days (as seconds = 1.5 x 24 x 60 x 60)
text: 129600
# API XML

View File

@@ -81,6 +81,7 @@ caps:
- {id: 329, cat: Books/EBook, desc: "Motorcars/Repairs"}
- {id: 330, cat: Books/EBook, desc: "D.I.Y"}
- {id: 332, cat: Books/EBook, desc: "Trivia/Quiz"}
- {id: 367, cat: Books/EBook, desc: "Health & Fitness"}
# Non Fict/Ref
- {id: 285, cat: Books/EBook, desc: "General Non-fiction"}
- {id: 289, cat: Books/EBook, desc: "Autobiography/Memoir"}
@@ -92,6 +93,7 @@ caps:
- {id: 351, cat: Books/EBook, desc: "Religion"}
- {id: 358, cat: Books/EBook, desc: "History"}
- {id: 362, cat: Books/EBook, desc: "Politics"}
- {id: 368, cat: Books/EBook, desc: "Music"}
# Military
- {id: 287, cat: Books/EBook, desc: "WW1"}
- {id: 288, cat: Books/EBook, desc: "WW2"}

View File

@@ -44,6 +44,7 @@ caps:
- {id: Magazines, cat: XXX/Other, desc: Adult Magazines}
- {id: Movie clips, cat: Movies, desc: Movies clips}
- {id: Movies, cat: Movies, desc: Movies}
- {id: Music, cat: Audio, desc: Music}
- {id: Music videos, cat: Audio/Video, desc: Music Videos}
- {id: NDS, cat: Console/NDS, desc: Games NDS}
- {id: Other Applications, cat: PC, desc: Other Applications}

View File

@@ -5,6 +5,8 @@ description: "ExtremeBits is a Private Torrent Tracker for EXTREME SPORTS"
language: en-US
type: private
encoding: UTF-8
certificates:
- 0e7f0e9c468938a43058d72c69ffdb9a98e24eab # Expired 26th Nov 2025
links:
- https://extremebits.net/

View File

@@ -13,12 +13,12 @@ caps:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: Audio, desc: "Music"}
- {id: 6, cat: TV/Anime, desc: "Anime"}
- {id: 10, cat: TV, desc: "TV Pack"}
- {id: 4, cat: PC/Games, desc: "Games"}
- {id: 5, cat: PC/0day, desc: "Apps"}
- {id: 6, cat: TV/Anime, desc: "Anime"}
- {id: 9, cat: TV/Sport, desc: "Sport"}
- {id: 11, cat: Other, desc: "Miscellaneous"}
- {id: 14, cat: Other, desc: "Tutorials"}
- {id: 11, cat: Other, desc: "Assorted"}
modes:
search: [q]

View File

@@ -231,4 +231,4 @@ search:
filters:
- name: prepend
args: "{{ .Result.description_verified }} "
# NexusPHP v1.9.9 2025-10-02
# NexusPHP v1.9.11 2025-11-02

View File

@@ -19,7 +19,6 @@ caps:
tv-search: [q, season, ep, imdbid, tvdbid, tmdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
book-search: [q]
settings:
- name: apikey

View File

@@ -5,8 +5,6 @@ description: "HDGalaKtik is a RUSSIAN Semi-Private tracker for MOVIES / TV / GEN
language: ru-RU
type: semi-private
encoding: UTF-8
certificates:
- 89cb539248b0d0cb0e92aa3f286ddfdd8347c3be # CN=mail.trackerpmr.com
links:
- https://www.trackerpmr.com/
- https://freetmd.com/
@@ -16,20 +14,20 @@ legacylinks:
caps:
categorymappings:
- {id: 13, cat: Movies, desc: "Фильмы (Movies)"}
- {id: 6, cat: TV, desc: "Мультфильмы (Cartoons)"}
- {id: 10, cat: Audio, desc: "Музыка (Music)"}
- {id: 26, cat: PC, desc: "Программы (Programs)"}
- {id: 5, cat: Console, desc: "Игры (Games)"}
- {id: 25, cat: Other, desc: "Картинки (Pictures)"}
- {id: 11, cat: TV, desc: "Сериалы (TV Series)"}
- {id: 12, cat: TV/Anime, desc: "Аниме (Anime)"}
- {id: 16, cat: Books, desc: "Книги (Books)"}
- {id: 18, cat: Audio/Video, desc: "Клипы / Ролики (Clips / Trailers)"}
- {id: 22, cat: TV, desc: "ТВ / Передачи (TV)"}
- {id: 27, cat: PC/Mobile-Other, desc: "Игры - Мобила / КПК (Mobile)"}
- {id: 1, cat: PC/ISO, desc: "Образы (ISO)"}
- {id: 4, cat: Other, desc: "Другое (Other)"}
- {id: 13, cat: Movies, desc: "Фильмы"}
- {id: 11, cat: TV, desc: "Сериалы"}
- {id: 6, cat: TV, desc: "Мультфильмы"}
- {id: 10, cat: Audio, desc: "Музыка"}
- {id: 26, cat: PC, desc: "Программы"}
- {id: 5, cat: Console, desc: "Игры"}
- {id: 25, cat: Other, desc: "Картинки"}
- {id: 12, cat: TV/Anime, desc: "Аниме"}
- {id: 16, cat: Books, desc: "Книги"}
- {id: 18, cat: Audio/Video, desc: "Клипы / Ролики"}
- {id: 22, cat: TV, desc: "ТВ / Передачи"}
- {id: 27, cat: PC/Mobile-Other, desc: "Игры - Мобила / КПК"}
- {id: 1, cat: PC/ISO, desc: "Образы"}
- {id: 4, cat: Other, desc: "Другое"}
modes:
search: [q]
@@ -117,24 +115,20 @@ search:
args: ["[^a-zA-Z0-9]+", "%"]
rows:
selector: table.table > tbody > tr.torcontduo
selector: div.torrent-card
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
categorydesc:
selector: div.category-badge
optional: true
default: 4
default: Другое
filters:
- name: querystring
args: cat
- name: replace
args: ["---", "Другое"]
title:
selector: a[href^="details.php?id="]
selector: a.torrent-title-link
attribute: title
filters:
- name: regexp
args: \'>(.+?)</div
- name: htmldecode
# normalize to SXXEYY format
- name: re_replace
args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"]
@@ -193,16 +187,19 @@ search:
- name: append
args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}"
details:
selector: a[href^="details.php?id="]
selector: a.torrent-title-link
attribute: href
# there is either a magnet or a download link
magnet:
selector: a[href^="magnet:?xt="]
attribute: href
optional: true
download:
selector: a[href^="details.php?id="]
selector: a[href^="download.php?id="]
attribute: href
filters:
- name: replace
args: ["details", "download"]
optional: true
poster:
selector: img.s
selector: img.torrent-poster
attribute: src
imdbid:
selector: a[href^="browse.php?imdb="]
@@ -211,46 +208,26 @@ search:
- name: querystring
args: imdb
size:
selector: td:nth-child(4)
selector: div.size-section
seeders:
selector: span[title="Раздают"]
selector: span.peers-seeders
leechers:
selector: span[title="Качают"]
date_day:
# Сегодня в 18:22
# Вчера в 20:52
selector: a[href^="browse.php?date="]:contains("Сегодня"), a[href^="browse.php?date="]:contains("Вчера")
optional: true
filters:
- name: regexp
args: "((Вчера в|Сегодня в)( \\d{2}:\\d{2}))"
- name: replace
args: ["Сегодня в", "Today"]
- name: replace
args: ["Вчера в", "Yesterday"]
- name: fuzzytime
date_year:
# 23:48 24/07
selector: a[href^="browse.php?date="]:contains("/")
optional: true
filters:
- name: regexp
args: "(\\d{2}:\\d{2} \\d{2}/\\d{2})"
- name: append
args: " +03:00" # MSK
- name: dateparse
args: "HH:mm dd/MM zzz"
selector: span.peers-leechers
grabs:
selector: span:has(i.fa-download)
date:
text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}"
selector: div.added-date
filters:
- name: timeago
downloadvolumefactor:
case:
img[src="/pic/freedownload.gif"]: 0
span.bg-success: 0
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 1.0
description:
selector: a[href*="?tag="]
selector: a.tag
attribute: title
# engine n/a

View File

@@ -0,0 +1,181 @@
---
id: huntorrent-bithorlo
name: HunTorrent-bithorlo
description: "HunTorrent-bithorlo is a HUNGARIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
language: hu-HU
type: semi-private
encoding: UTF-8
requestDelay: 2
links:
- https://huntorrent.org/
legacylinks:
- https://huntorrent.net/
caps:
categorymappings:
- {id: 51, cat: Movies/SD, desc: "Cam/Eng", default: true}
- {id: 50, cat: Movies/SD, desc: "Cam/Hun", default: true}
- {id: 2, cat: Movies/DVD, desc: "DVD/Eng", default: true}
- {id: 1, cat: Movies/DVD, desc: "DVD/Hun", default: true}
- {id: 42, cat: Movies/DVD, desc: "Dvd9/Eng", default: true}
- {id: 41, cat: Movies/DVD, desc: "Dvd9/Hun", default: true}
- {id: 40, cat: Books, desc: "E-book/Eng", default: true}
- {id: 19, cat: Books, desc: "E-book/Hun", default: true}
- {id: 29, cat: Movies/HD, desc: "HD/Eng", default: true}
- {id: 28, cat: Movies/HD, desc: "HD/Hun", default: true}
- {id: 15, cat: PC/Games, desc: "Játék/ISO", default: true}
- {id: 38, cat: Console, desc: "Játék/Konzol", default: true}
- {id: 37, cat: PC/Games, desc: "Játék/Rip", default: true}
- {id: 20, cat: Other, desc: "Képek", default: true}
- {id: 21, cat: PC/Mobile-Other, desc: "Mobil", default: true}
- {id: 54, cat: PC/ISO, desc: "Prog/ISO", default: true}
- {id: 23, cat: PC/0day, desc: "Prog/Rip", default: true}
- {id: 33, cat: TV/SD, desc: "Sorozat/Eng", default: true}
- {id: 52, cat: TV/HD, desc: "Sorozat/Eng/HD", default: true}
- {id: 5, cat: TV/SD, desc: "Sorozat/Hun", default: true}
- {id: 53, cat: TV/HD, desc: "Sorozat/Hun/HD", default: true}
- {id: 4, cat: Movies/SD, desc: "Xvid/Eng", default: true}
- {id: 3, cat: Movies/SD, desc: "Xvid/Hun", default: true}
- {id: 12, cat: Audio, desc: "Zene/Eng", default: true}
- {id: 13, cat: Audio, desc: "Zene/Hun", default: true}
- {id: 9, cat: XXX/x264, desc: "XXX/Film", default: false}
- {id: 10, cat: XXX/ImageSet, desc: "XXX/Kép", default: false}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: info_about
type: info
label: About this HunTorrent-bithorlo indexer
default: This indexer accesses the HunTorrent WebSite with a focus on only the <b>bithorlo</b> torrent browser pages.
- name: cookie
type: text
label: Cookie
- name: info_cookie
type: info_cookie
- name: useragent
type: text
label: User-Agent
- name: info_useragent
type: info_useragent
- name: sort
type: select
label: Sort requested from site
default: 4
options:
4: created
7: seeders
5: size
1: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
- name: info_tpp
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.
login:
method: cookie
# using cookie method because login page has embedded Google reCAPTCHA
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: browse.php
selector: a[href^="logout.php?k="]
search:
headers:
User-Agent: ["{{ .Config.useragent }}"]
paths:
# https://huntorrent.net/browse.php?&korhatar=0&incldead=1&xyz=yes&c28=1&c27=1&c6=1&c5=1&sort=4&type=desc
- path: browse.php
categories: [51, 50, 2, 1, 42, 41, 40, 19, 29, 28, 15, 38, 37, 20, 21, 54, 23, 33, 52, 53, 4, 3, 12, 13]
inputs:
viewMode: bithorlo
- path: browse.php
categories: [9, 10]
inputs:
viewMode: bithorloxxx
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
xyz: yes
search: "{{ .Keywords }}"
# Age Limit: 0 all, 1 no, 5 6, 2 12, 3 16, 4 18
korhatar: 0
# 0 active, 1 active+dead, 2 dead, 3 my uploads, 4 waiting for seed, 7 my bookmarks, 12 reseeded by me
incldead: 1
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
rows:
selector: table.torrent-table > tbody > tr[id^="torrent-main-"]
fields:
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title:
selector: a.torrent-title-link
details:
selector: a.torrent-title-link
attribute: href
filters:
- name: replace
args: ["&hit=1", ""]
download:
selector: a[href^="download.php?"]
attribute: href
genre:
selector: a[data-mufaj]
attribute: data-mufaj
description:
selector: div.torrent-subtitle
filters:
- name: append
args: "{{ if .Result.genre }}</br>{{ .Result.genre }}{{ else }}{{ end }}"
imdbid:
selector: a[href*="imdb.com/title/tt"]
attribute: href
poster:
selector: a[data-poster]
attribute: data-poster
date:
selector: a[data-added]
attribute: data-added
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "yyyy-MM-dd HH:mm zzz"
size:
selector: a[data-size]
attribute: data-size
grabs:
selector: td:nth-last-child(3)
seeders:
selector: td:nth-last-child(2)
leechers:
selector: td:nth-last-child(1)
downloadvolumefactor:
text: 1
uploadvolumefactor:
text: 2
minimumratio:
text: 1.0
minimumseedtime:
# 32 hours (as seconds = 32 x 60 x 60)
text: 115200
# engine n/a

View File

@@ -5,6 +5,7 @@ description: "HunTorrent is a HUNGARIAN Semi-Private Torrent Tracker for MOVIES
language: hu-HU
type: semi-private
encoding: UTF-8
requestDelay: 2
links:
- https://huntorrent.org/
legacylinks:
@@ -12,36 +13,36 @@ legacylinks:
caps:
categorymappings:
- {id: 28, cat: Movies/SD, desc: "Cam/ENG"}
- {id: 27, cat: Movies/SD, desc: "Cam/HUN"}
- {id: 4, cat: Movies/DVD, desc: "DVDR/ENG"}
- {id: 3, cat: Movies/DVD, desc: "DVDR/HUN"}
- {id: 6, cat: Movies/HD, desc: "HD/ENG"}
- {id: 5, cat: Movies/HD, desc: "HD/HUN"}
- {id: 2, cat: Movies/SD, desc: "XviD/ENG"}
- {id: 1, cat: Movies/SD, desc: "XviD/HUN"}
- {id: 17, cat: PC/Games, desc: "Játék/ISO"}
- {id: 18, cat: PC/Games, desc: "Játék/RIP"}
- {id: 19, cat: Console, desc: "Konzol"}
- {id: 25, cat: Other, desc: "Kép"}
- {id: 24, cat: Books, desc: "eBook/ENG"}
- {id: 23, cat: Books, desc: "eBook/HUN"}
- {id: 38, cat: Audio/Audiobook, desc: "Hangoskönyv"}
- {id: 26, cat: PC/Mobile-Other, desc: "Mobil"}
- {id: 20, cat: PC/ISO, desc: "Program/ISO"}
- {id: 21, cat: PC/0day, desc: "Program/RIP"}
- {id: 31, cat: TV/HD, desc: "Sorozat/HD/ENG"}
- {id: 9, cat: TV/HD, desc: "Sorozat/HD/HUN"}
- {id: 8, cat: TV/SD, desc: "Sorozat/ENG"}
- {id: 7, cat: TV/SD, desc: "Sorozat/HUN"}
- {id: 13, cat: Audio/Video, desc: "Klip/ENG"}
- {id: 12, cat: Audio/Video, desc: "Klip/HUN"}
- {id: 11, cat: Audio/MP3, desc: "MP3/ENG"}
- {id: 10, cat: Audio/MP3, desc: "MP3/HUN"}
- {id: 16, cat: XXX/DVD, desc: "XXX/DVD"}
- {id: 32, cat: XXX/x264, desc: "XXX/HD"}
- {id: 14, cat: XXX/ImageSet, desc: "XXX/Kép"}
- {id: 15, cat: XXX/SD, desc: "XXX/XVID"}
- {id: 28, cat: Movies/SD, desc: "Cam/Külföldi", default: true}
- {id: 27, cat: Movies/SD, desc: "Cam/Magyar", default: true}
- {id: 4, cat: Movies/DVD, desc: "DVDR/Külföldi", default: true}
- {id: 3, cat: Movies/DVD, desc: "DVDR/Magyar", default: true}
- {id: 6, cat: Movies/HD, desc: "HD/Külföldi", default: true}
- {id: 5, cat: Movies/HD, desc: "HD/Magyar", default: true}
- {id: 2, cat: Movies/SD, desc: "XviD/Külföldi", default: true}
- {id: 1, cat: Movies/SD, desc: "XviD/Magyar", default: true}
- {id: 17, cat: PC/Games, desc: "Játék/ISO", default: true}
- {id: 18, cat: PC/Games, desc: "Játék/RIP", default: true}
- {id: 19, cat: Console, desc: "Konzol", default: true}
- {id: 25, cat: Other, desc: "Kép", default: true}
- {id: 24, cat: Books, desc: "eBook/Külföldi", default: true}
- {id: 23, cat: Books, desc: "eBook/Magyar", default: true}
- {id: 38, cat: Audio/Audiobook, desc: "Hangoskönyv", default: true}
- {id: 26, cat: PC/Mobile-Other, desc: "Mobil", default: true}
- {id: 20, cat: PC/ISO, desc: "Program/ISO", default: true}
- {id: 21, cat: PC/0day, desc: "Program/RIP", default: true}
- {id: 31, cat: TV/HD, desc: "Sorozat/HD/Külföldi", default: true}
- {id: 9, cat: TV/HD, desc: "Sorozat/HD/Magyar", default: true}
- {id: 8, cat: TV/SD, desc: "Sorozat/Külföldi", default: true}
- {id: 7, cat: TV/SD, desc: "Sorozat/Magyar", default: true}
- {id: 13, cat: Audio/Video, desc: "Klip/Külföldi", default: true}
- {id: 12, cat: Audio/Video, desc: "Klip/Külföldi", default: true}
- {id: 11, cat: Audio/MP3, desc: "MP3/Külföldi", default: true}
- {id: 10, cat: Audio/MP3, desc: "MP3/Magyar", default: true}
- {id: 16, cat: XXX/DVD, desc: "XXX/DVD", default: false}
- {id: 32, cat: XXX/x264, desc: "XXX/HD", default: false}
- {id: 14, cat: XXX/ImageSet, desc: "XXX/Kép", default: false}
- {id: 15, cat: XXX/SD, desc: "XXX/XVID", default: false}
modes:
search: [q]
@@ -51,6 +52,10 @@ caps:
book-search: [q]
settings:
- name: info_about
type: info
label: About this HunTorrent indexer
default: This indexer does not include the <b>bithorlo</b> torrent pages. Use the HunTorrent-bithorlo indexer to access those.
- name: cookie
type: text
label: Cookie
@@ -95,21 +100,25 @@ search:
headers:
User-Agent: ["{{ .Config.useragent }}"]
paths:
# https://huntorrent.net/browse.php?time=1616615308&korhatar=0&incldead=1&xyz=yes&c28=1&c27=1&c6=1&c5=1&sort=4&type=desc
# https://huntorrent.net/browse.php?&korhatar=0&incldead=1&xyz=yes&c28=1&c27=1&c6=1&c5=1&sort=4&type=desc
- path: browse.php
categories: [28, 27, 4, 3, 6, 5, 2, 1, 17, 18, 19, 25, 24, 23, 38, 26, 20, 21, 31, 9, 8, 7, 13, 12, 11, 10]
inputs:
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
- path: browse.php
categories: [16, 32, 14, 15]
inputs:
viewMode: xxx
search: "{{ .Keywords }}"
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
viewMode: ""
xyz: yes
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
# Age Limit: 0 all, 1 no, 5 6, 2 12, 3 16, 4 18
korhatar: 0
# 0 active, 1 active+dead, 2 dead, 3 my uploads, 4 waiting for seed, 7 my bookmarks, 12 reseeded by me
incldead: 1
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
# no freeleech atm
# can search by genre but you need to know the id. &mufaj[]=20 for Romantikus
rows:
selector: table.torrent-table > tbody > tr[id^="torrent-main-"]
@@ -130,16 +139,11 @@ search:
- name: replace
args: ["&hit=1", ""]
download:
selector: a.download-link
selector: a[href^="download.php?"]
attribute: href
filters:
- name: replace
args: ["please_wait=1&", ""]
- name: replace
args: ["&please_wait=1", ""]
genre:
selector: span[title]
attribute: title
selector: a[data-mufaj]
attribute: data-mufaj
description:
selector: div.torrent-subtitle
filters:
@@ -149,17 +153,19 @@ search:
selector: a[href*="imdb.com/title/tt"]
attribute: href
poster:
selector: img.torrent-hover-card-image
attribute: src
selector: a[data-poster]
attribute: data-poster
date:
selector: td:nth-last-child(5)
selector: a[data-added]
attribute: data-added
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "yyyy-MM-dd HH:mm:ss zzz"
args: "yyyy-MM-dd HH:mm zzz"
size:
selector: td:nth-last-child(4)
selector: a[data-size]
attribute: data-size
grabs:
selector: td:nth-last-child(3)
seeders:

View File

@@ -5,6 +5,7 @@ description: "ilCorSaRoNeRo is an ITALIAN Public site for MOVIES / TV / GENERAL"
language: it-IT
type: public
encoding: UTF-8
# current (official?) domains list https://loiflix.shop/ilcorsaronero/
links:
- https://ilcorsaronero.link/
- https://ilcorsaronero.torrentbay.st/

View File

@@ -1,187 +0,0 @@
---
id: ilolicon
name: ilolicon PT
description: "ilolicon PT is a CHINESE Private Torrent Tracker for LOLICON / MOVIES / 3X"
language: zh-CN
type: private
encoding: UTF-8
requestDelay: 2
links:
- https://share.ilolicon.com/
caps:
# dont forget to update the path categories in the search block
categorymappings:
- {id: 401, cat: Movies, desc: "电影 (Movie)", default: true}
- {id: 402, cat: TV, desc: "电视剧(TV Series)", default: true}
- {id: 430, cat: TV, desc: "综艺(TV Show)", default: true}
- {id: 405, cat: TV/Anime, desc: "动画 (Animation)", default: true}
- {id: 408, cat: Audio, desc: "音乐 (Music)", default: true}
- {id: 410, cat: Audio/Video, desc: "舞台演出 (Stage Performance)", default: true}
- {id: 404, cat: TV/Documentary, desc: "纪录片 (Documentary)", default: true}
- {id: 412, cat: Console, desc: "游戏 (Game)", default: true}
- {id: 413, cat: PC, desc: "软件 (Software)", default: true}
- {id: 411, cat: Other, desc: "漫画/CG杂图/动漫杂志 (Photo)", default: true}
- {id: 418, cat: XXX/ImageSet, desc: "写真 (Photography)", default: false}
- {id: 429, cat: XXX/Other, desc: "音声 (Audio)", default: false}
- {id: 428, cat: XXX/Other, desc: "H-游戏 (H-Games)", default: false}
- {id: 427, cat: XXX/ImageSet, desc: "H-CG杂图 (H-CG Miscellaneous Pictures)", default: false}
- {id: 426, cat: XXX/Other, desc: "H-3D同人动画 (H-3D Doujin Animation)", default: false}
- {id: 425, cat: XXX/Other, desc: "H-2D同人动画 (H-2D Doujin Animation)", default: false}
- {id: 424, cat: XXX/Other, desc: "H-漫画 (H-Manga)", default: false}
- {id: 423, cat: XXX/Other, desc: "里番 (Riban)", default: false}
- {id: 420, cat: XXX, desc: "AV有码 (AV Censored)", default: false}
- {id: 419, cat: XXX, desc: "AV无码 (AV uncensored)", default: false}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, doubanid]
movie-search: [q, imdbid, doubanid]
music-search: [q]
settings:
- name: cookie
type: text
label: Cookie
- name: info_cookie
type: info_cookie
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: 4
options:
4: created
7: seeders
5: size
1: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
- name: info_tpp
type: info
label: Results Per Page
default: For best results, change the <b>Torrents per page:</b> setting to <b>100</b> on your account profile.</br>Choosing more may cause the web site to fail to deliver complete results.
- name: info_activity
type: info
label: Account Inactivity
default: "Cherish your user account. Inactive accounts would be deleted based on the following rules:<ol><li>Veteran User or above would never be deleted.</li><li>Elite User or above would never be deleted if parked (at User CP).</li><li>Parked accounts would be deleted if users have not logged in for more than 400 days in a row.</li><li>Unparked accounts would be deleted if users have not logged in for more than 150 days in a row.</li><li>Accounts with both uploaded and downloaded amount being 0 would be deleted if users have not logged in for more than 100 days in a row.</li></ol>"
login:
# using cookie method because I could not get the form method to work when I first created the indexer, some hidden security check
method: cookie
inputs:
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
categories: [401, 402, 430, 405, 408, 410, 404, 412, 413, 411]
- path: special.php
categories: [418, 429, 428, 427, 426, 425, 424, 423, 422, 420, 419]
inputs:
$raw: "{{ range .Categories }}cat{{.}}=1&{{end}}"
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}"
# 0 incldead, 1 active, 2 dead
incldead: 0
# 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%
spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
# 0 title, 1 descr, 3 uploader, 4 imdburl
search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}"
# 0 AND, 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
notnewword: 1
rows:
selector: table.torrents > tbody > tr:has(a[href^="details.php?id="])
fields:
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_default:
selector: a[href^="details.php?id="]
title:
selector: a[title][href^="details.php?id="]
attribute: title
optional: true
default: "{{ .Result.title_default }}"
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
poster:
selector: img[data-src]
attribute: data-src
imdbid:
# site currently only has a badge and rating, the id is not present. just in case a future update.
selector: a[href*="imdb.com/title/tt"]
attribute: href
doubanid:
# site currently only has a badge and rating, the id is not present. just in case a future update.
selector: a[href*="movie.douban.com/subject/"]
attribute: href
date_elapsed:
# time type: time elapsed (default)
selector: td.rowfollow:nth-child(4) > span[title]
attribute: title
optional: true
filters:
- name: append
args: " +08:00" # CST
- name: dateparse
args: "yyyy-MM-dd HH:mm:ss zzz"
date_added:
# time added
selector: td.rowfollow:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
args: " +08:00" # CST
- name: dateparse
args: "yyyy-MM-ddHH:mm:ss zzz"
date:
text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}"
size:
selector: td.rowfollow:nth-child(5)
seeders:
selector: td.rowfollow:nth-child(6)
leechers:
selector: td.rowfollow:nth-child(7)
grabs:
selector: td.rowfollow:nth-child(8)
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
description:
selector: td.rowfollow:nth-child(2) td:nth-child(2)
remove: a, b, font, img
# NexusPHP v1.9.6 2025-06-25

View File

@@ -0,0 +1,193 @@
---
id: infinityhd-api
name: InfinityHD (API)
description: "InfinityHD is a Private Torrent Tracker for MOVIES / TV / ANIME"
language: en-US
type: private
encoding: UTF-8
links:
- https://infinityhd.net/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
- {id: 3, cat: TV/Anime, desc: "Anime"}
- {id: 4, cat: Movies/Other, desc: "Anime Movie"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tvdbid, tmdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
settings:
- name: apikey
type: text
label: APIKey
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://infinityhd.net/\" target=\"_blank\">InfinityHD</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: single_file_release_use_filename
type: checkbox
label: Use filename as title for single file releases
default: true
- name: sort
type: select
label: Sort requested from site
default: created_at
options:
created_at: created
seeders: seeders
size: size
name: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
- name: info_activity
type: info
label: Account Inactivity
default: "Your account will be automatically disabled after 90 days of inactivity. After 120 days your account will be pruned and is permanently deleted."
login:
path: /api/torrents
method: get
error:
- selector: a[href*="/login"]
message:
text: "The API key was not accepted by {{ .Config.sitelink }}."
- selector: :root:contains("Account is Banned")
search:
paths:
# https://hdinnovations.github.io/UNIT3D/torrent_api.html
# https://github.com/HDInnovations/UNIT3D/blob/master/app/Http/Controllers/API/TorrentController.php#L657
- path: api/torrents/filter
response:
type: json
headers:
Authorization: ["Bearer {{ .Config.apikey }}"]
inputs:
# if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6
$raw: "{{ range .Categories }}&categories[]={{.}}{{end}}"
name: "{{ .Keywords }}"
seasonNumber: "{{ .Query.Season }}"
episodeNumber: "{{ .Query.Ep }}"
imdbId: "{{ .Query.IMDBIDShort }}"
tmdbId: "{{ .Query.TMDBID }}"
tvdbId: "{{ .Query.TVDBID }}"
"free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
keywordsfilters:
- name: re_replace
args: ["\\.", " "]
rows:
selector: data
attribute: attributes
fields:
category:
selector: category_id
title_optional:
selector: name
title_filename:
selector: "files[0].name"
optional: true
files:
selector: num_file
title:
text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
details:
selector: details_link
download:
selector: download_link
poster:
selector: meta.poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
imdbid:
selector: imdb_id
tmdbid:
selector: tmdb_id
tvdbid:
selector: tvdb_id
genre:
selector: meta.genres
filters:
- name: re_replace
args: ["(?i)(Science Fiction)", "Science_Fiction"]
- name: re_replace
args: ["(?i)(TV Movie)", "TV_Movie"]
- name: replace
args: [" & ", "_&_"]
_internal:
selector: internal
case:
False: "{{ .False }}"
True: "{{ .True }}"
description:
text: "{{ if .Result._internal }}Internal{{ else }}{{ end }}{{ if and .Result._internal .Result.genre }} | {{ else }}{{ end }}{{ .Result.genre }}"
seeders:
selector: seeders
leechers:
selector: leechers
grabs:
selector: times_completed
date:
# "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50
selector: created_at
filters:
- name: append
args: " +00:00" # GMT
- name: dateparse
args: "MM/dd/yyyy HH:mm:ss zzz"
size:
selector: size
_featured:
selector: featured
case:
False: "{{ .False }}"
True: "{{ .True }}"
downloadvolumefactor_freeleech:
# api returns 0%, 25%, 50%, 75%, 100%
selector: freeleech
case:
0%: 1 # not free
25%: 0.75
50%: 0.5
75%: 0.25
100%: 0 # freeleech
"*": 0 # catch errors
downloadvolumefactor:
text: "{{ if .Result._featured }}0{{ else }}{{ .Result.downloadvolumefactor_freeleech }}{{ end }}"
uploadvolumefactor_double_upload:
# api returns False, True
selector: double_upload
case:
False: 1 # normal
True: 2 # double
uploadvolumefactor:
text: "{{ if .Result._featured }}2{{ else }}{{ .Result.uploadvolumefactor_double_upload }}{{ end }}"
# global MR is 0.4 but torrents must be seeded for 5 days regardless of ratio
# minimumratio:
# text: 0.4
minimumseedtime:
# 5 days (as seconds = 5 x 24 x 60 x 60)
text: 432000
# json UNIT3D 9.1.7

View File

@@ -35,10 +35,12 @@ caps:
- {id: Anime, cat: TV/Anime, desc: Anime}
- {id: AnimeAudioLossless, cat: Audio/Lossless, desc: "Anime Audio Lossless"}
- {id: "AnimeAudio[Lossless]", cat: Audio/Lossless, desc: "Anime Audio Lossless"}
- {id: "AnimeAudio[Lossy]", cat: Audio/MP3, desc: "Anime Audio Lossy"}
- {id: AnimeEnglish-translated, cat: TV/Anime, desc: "Anime English-translated"}
- {id: "AnimeLiveAction[English-translated]", cat: TV/Anime, desc: "Anime Live Action English-translated"}
- {id: "AnimeLiveAction[Non-English]", cat: TV/Anime, desc: "Anime Live Action Non-English"}
- {id: "AnimeLiveAction[Raw]", cat: TV/Anime, desc: "Anime Live Action Raw"}
- {id: AnimePictures, cat: Other, desc: Anime Pictures}
- {id: AnimeRaw, cat: TV/Anime, desc: Anime Raw}
- {id: AnimeSubs, cat: TV/Anime, desc: Anime Subs}
- {id: Apps, cat: PC, desc: Apps}

View File

@@ -281,6 +281,7 @@ caps:
- {id: 2281, cat: PC/ISO, desc: "Web Security Dojo"}
- {id: 2246, cat: PC/ISO, desc: "Whonix"}
- {id: 2155, cat: PC/ISO, desc: "Wifislax"}
- {id: 2229, cat: PC/ISO, desc: "XiVa Studio"}
- {id: 2251, cat: PC/ISO, desc: "XigmaNAS"}
- {id: 607, cat: PC/ISO, desc: "Xubuntu"}
- {id: 612, cat: PC/ISO, desc: "Zen"}

View File

@@ -182,4 +182,4 @@ search:
description:
selector: td.rowfollow:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.9.9 2025-10-02
# NexusPHP v1.9.11 2025-11-02

View File

@@ -9,15 +9,12 @@ encoding: UTF-8
links:
- https://magnetcatcat.com/
- https://clmclm.com/
- https://www.8800517.xyz/
- https://www.8800518.xyz/
- https://www.8800519.xyz/
- https://www.8800520.xyz/
- https://www.8800521.xyz/
- https://www.8800522.xyz/
- https://www.8800523.xyz/
legacylinks:
- https://www.clm472.sbs/
- https://www.8800498.xyz/
- https://www.8800497.xyz/
- https://www.8800499.xyz/
- https://www.8800500.xyz/
- https://www.8800503.xyz/
- https://www.8800504.xyz/
@@ -31,6 +28,9 @@ legacylinks:
- https://www.8800514.xyz/
- https://www.8800515.xyz/
- https://www.8800516.xyz/
- https://www.8800517.xyz/
- https://www.8800518.xyz/
- https://www.8800520.xyz/
caps:
categorymappings:

View File

@@ -0,0 +1,61 @@
---
id: magnetz
name: Magnetz
description: "Magnetz is a Public torrent meta-search engine"
language: en-US
type: public
encoding: UTF-8
links:
- https://magnetz.eu/
caps:
categorymappings:
- {id: Other, cat: Other, desc: Other}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: info_category_8000
type: info_category_8000
download:
selectors:
- selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
- path: search
inputs:
query: "{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}"
rows:
selector: a.list-group-item
fields:
category:
text: Other
title:
selector: h5
details:
selector: a
attribute: href
download:
selector: a
attribute: href
date:
text: now
size:
selector: small
seeders:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -31,7 +31,7 @@ caps:
- {id: 62, cat: Movies/UHD, desc: "Film/HU/UHD"}
- {id: 4, cat: PC/Games, desc: "Játékok/ISO"}
- {id: 39, cat: PC/Games, desc: "Játékok/Rip/Dox"}
# - {id: 47, cat: Other, desc: "Klippek"}
- {id: 47, cat: Other, desc: "Klippek"}
- {id: 30, cat: Audio/Lossless, desc: "Lossless/EN"}
# - {id: 29, cat: Audio/Lossless, desc: "Lossless/HU"}
- {id: 25, cat: Audio/MP3, desc: "MP3/EN"}
@@ -141,7 +141,7 @@ search:
img[src="/pic/categories/uhd_hun.png"]: 62
img[src="/pic/categories/021.png"]: 4
img[src="/pic/categories/cat_games.gif"]: 39
# img[]: 47
img[src="/pic/categories/026.png"]: 47
img[src="/pic/categories/024.png"]: 30
# img[]: 29
img[src="/pic/categories/023.png"]: 25

View File

@@ -26,6 +26,8 @@ settings:
- name: password
type: password
label: Password
- name: info_flaresolverr
type: info_flaresolverr
- name: info_category_8000
type: info_category_8000
- name: hidef

View File

@@ -26,6 +26,8 @@ settings:
- name: password
type: password
label: Password
- name: info_flaresolverr
type: info_flaresolverr
- name: info_category_8000
type: info_category_8000
- name: hidef

View File

@@ -150,8 +150,17 @@ search:
filters:
- name: querystring
args: dir
title:
title_default:
selector: a[href*="index.php?strWebValue=torrent&strWebAction=details&id="]
title_optional:
selector: a[href*="index.php?strWebValue=torrent&strWebAction=details&id="][onmouseover]
attribute: onmouseover
filters:
- name: regexp
args: "return buildTable\\('([^']+)',"
optional: true
title:
text: "{{ if .Result.title_optional }}{{ .Result.title_optional }}{{ else }}{{ .Result.title_default }}{{ end }}"
details:
selector: a[href*="index.php?strWebValue=torrent&strWebAction=details&id="]
attribute: href

View File

@@ -23,19 +23,11 @@ caps:
search: [q]
settings:
- name: username
- name: cookie
type: text
label: Username
- name: password
type: password
label: Password
- name: 2facode
type: text
label: 2FA code
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the NicePT Web Site. Otherwise just leave it empty."
label: Cookie
- name: info_cookie
type: info_cookie
- name: freeleech
type: checkbox
label: Search freeleech only
@@ -66,20 +58,10 @@ settings:
default: "Account retention rules:<ol><li>Veteran Users users and above will be retained forever</li><li>Elite Users and above will not have their account deleted after parking (in the Control Panel)</li><li>Users with a parked account will be deleted if they do not log in for 400 consecutive days</li><li>Users with a non-parked account will be banned if they do not log in for 40 consecutive days</li><li>Users with no traffic (ie, upload/download data are both 0) will be banned if they do not log in for 7 consecutive days.</li></ol>"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
# using cookie method because site does a JS call to API/Challenge via JQuery to load response parm required for takelogin.php
method: cookie
inputs:
secret: ""
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
two_step_code: "{{ .Config.2facode }}"
error:
- selector: td.embedded:has(h2:contains("失败"))
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
@@ -187,4 +169,4 @@ search:
filters:
- name: prepend
args: "{{ .Result.description_verified }} "
# NexusPHP v1.9.4 2025-06-01
# NexusPHP v1.9.11 2025-11-02

View File

@@ -709,6 +709,7 @@ caps:
# temp, archive
- {id: 892, cat: Other, desc: " |- Архив Мультфильмов"}
- {id: 91, cat: Other, desc: " |- Архив Видео. Кино, Театра"}
- {id: 150, cat: Other, desc: " |- Архив неактуальных Экранок и любого видео с Рекламой"}
- {id: 668, cat: Other, desc: " |- Архив Классики кино и Старых фильмов до 90-х"}
- {id: 1143, cat: Other, desc: " |- Архив Музыкального Видео"}
- {id: 802, cat: Other, desc: " |- Архив Сериалов и Архив Старого многосерийного кино до 90-х"}
@@ -724,6 +725,15 @@ caps:
- {id: 184, cat: Other, desc: " |- Архив КПК и Мобильных устройств"}
- {id: 1080, cat: Other, desc: " |- Архив 4Apple"}
- {id: 180, cat: Other, desc: " |- Архив Медиа-Диз-Графика"}
- {id: 145, cat: Other, desc: " |- Видео (temp)"}
- {id: 146, cat: Other, desc: " |- Аниме (temp)"}
- {id: 161, cat: Other, desc: " |- Книги (temp)"}
- {id: 147, cat: Other, desc: " |- Музыка (temp)"}
- {id: 148, cat: Other, desc: " |- Игры (temp)"}
- {id: 149, cat: Other, desc: " |- Программы (temp)"}
- {id: 183, cat: Other, desc: " |- КПК и Мобильные устройства (temp)"}
- {id: 1145, cat: Other, desc: " |- 4Apple (temp)"}
- {id: 171, cat: Other, desc: " |- Медиа-Диз-Графика (temp)"}
modes:
search: [q]

View File

@@ -8,12 +8,12 @@ description: "NorTorrent is a FRENCH Public tracker for MOVIES / TV / GENERAL"
language: fr-FR
type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.my/
# to fetch current domain use https://www.rantop.org/
links:
- https://www.nortorrent.town/
- https://ww1-nortorrent.me/
legacylinks:
# latest domains list
- https://www.rantop.my/
- https://www.rantop.org/
- https://www.site-torrent.cc/
- https://www.torrent-site.com/
# domain lists no longer working
@@ -22,12 +22,10 @@ legacylinks:
- https://www.protege-liens.com/
- https://www.protege-liens.net/
- https://www.torrent.onl/
- https://www.rantop.org/
- https://torrent9.news/
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.torrent9.run/
- https://www.torrent9.cv/
- https://www.torrent9.ke/
- https://www.torrent9.gdn/
- https://www.torrent9.men/
@@ -41,6 +39,8 @@ legacylinks:
- https://www.nortorrent5.com/
- https://www.nortorrent6.com/
- https://www.nortorrent.net/
- https://www.nortorrent.town/
- https://nortorrent-proxy.site/
caps:
categorymappings:

View File

@@ -1,178 +0,0 @@
---
id: oxtorrent-vip
replaces:
- oxtorrent
- torrent911
name: OxTorrent-vip
description: "OxTorrent-vip is a FRENCH Public site for MOVIES / TV / GENERAL"
language: fr-FR
type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.my/
links:
- https://www.oxtorrent.town/
- https://www.zone-torrent.town/
- https://www.mega-torrent.town/
legacylinks:
# latest domains list
- https://www.rantop.my/
- https://www.site-torrent.cc/
- https://www.torrent-site.com/
# domain lists no longer working
- https://www.protege-torrent.com/
- https://www.torrent.ws/
- https://www.protege-liens.com/
- https://www.protege-liens.net/
- https://www.torrent.onl/
- https://www.rantop.org/
- https://oxtorrent.blog/
- https://www.site-torrent.com/
# actual legacylinks
- https://www.zone-torrent.com/
- https://www.mega-torrent3.com/
- https://www.mega-torrent4.com/
- https://www.oxtorrent3.com/
- https://www.oxtorrent4.com/
- https://www.mega-torrent5.com/
- https://www.zone-torrent1.com/
- https://www.oxtorrent5.com/
- hhttps://www.zone-torrent2.com/
- https://www.zone-torrent2.com/
- https://www.oxtorrent7.com/
- https://www.mega-torrent6.com/
- https://www.zone-torrent3.com/
- https://www.oxtorrent8.com/
- https://www.oxtorrent.diy/
- https://www.zone-torrent.me/
- https://www.mega-torrent.net/
- https://www.oxtorrent.fyi/
- https://www.zone-torrent4.com/
- https://www.mega-torrent7.com/
- https://www.oxtorrent10.com/
caps:
categorymappings:
- {id: Films, cat: Movies, desc: "Movies"}
- {id: Animes, cat: TV/Anime, desc: "Anime"}
- {id: Documentaires, cat: TV/Documentary, desc: "Documentaires"}
- {id: Séries, cat: TV, desc: "TV"}
- {id: Musiques, cat: Audio, desc: "Music"}
- {id: Ebooks, cat: Books, desc: "Books"}
- {id: Livres, cat: Books, desc: "Livres"}
- {id: Logiciels, cat: PC, desc: "Software"}
- {id: Applications, cat: PC, desc: "Applications"}
- {id: Jeux-PC, cat: PC/Games, desc: "PC Games"}
- {id: Jeux-Consoles, cat: Console/XBox 360, desc: "Console Games"}
- {id: Porno, cat: XXX, desc: "Porno"}
- {id: Spectacles, cat: TV/Other, desc: "Spectacles"}
- {id: Sports, cat: TV/Sport, desc: "Sports"}
- {id: Formations, cat: Other, desc: "Formations"}
- {id: Vidéos, cat: TV, desc: "Vidéos"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
allowrawsearch: true
settings:
- 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 and SUBFRENCH with ENGLISH
default: false
download:
selectors:
- selector: a[href^="magnet:?"]
attribute: href
- selector: script:contains("magnet:?")
filters:
- name: regexp
args: "\\s'(magnet:\\?.+?)';"
search:
paths:
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}derniers{{ end }}"
keywordsfilters:
# if searching for season packs swith S01 to saison 1 #9712
- name: re_replace
args: ["(?i)(S0)(\\d{1,2})$", "saison $2"]
- name: re_replace
args: ["(?i)(S)(\\d{1,3})$", "saison $2"]
rows:
selector: table.table-hover > tbody > tr:has(td a[href])
filters:
- name: andmatch
fields:
category:
selector: td:nth-child(1) i
attribute: class
title_phase1:
selector: td:nth-child(1) a
filters:
- name: re_replace
args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b((19|20)\\d{2})\\b)$", "$3 $1$2"]
title_vostfr:
text: "{{ .Result.title_phase1 }}"
filters:
- name: re_replace
args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"]
title_phase2:
text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}"
title_multilang:
text: "{{ .Result.title_phase2 }}"
filters:
- name: re_replace
args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"]
title:
text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}"
details_href:
selector: td:nth-child(1) a[href]
attribute: href
optional: true
filters:
- name: regexp
args: (/?detail/\d+)
details_onclick:
selector: td:nth-child(1) a[onclick]
attribute: onclick
optional: true
filters:
- name: regexp
args: (/?detail/\d+)
details:
text: "{{ or .Result.details_href .Result.details_onclick }}"
download:
text: "{{ .Result.details }}"
size:
selector: td:nth-child(2)
date:
text: now
seeders:
selector: td:nth-child(3)
leechers:
selector: td:nth-child(4)
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -0,0 +1,139 @@
---
id: phoenixproject
name: Phoenix Project
description: "Phoenix Project is a Private MacOS software tracker"
language: en-US
type: private
encoding: UTF-8
links:
- https://phoenixproject.app/
caps:
categorymappings:
- {id: 1, cat: PC/Mac, desc: Applications}
- {id: 2, cat: PC/Games, desc: Games}
- {id: 3, cat: PC/Mobile-iOS, desc: IOS Applications}
- {id: 4, cat: PC/Mobile-iOS, desc: IOS Games}
- {id: 5, cat: Other, desc: Graphics}
- {id: 6, cat: Audio, desc: Audio}
- {id: 7, cat: Other, desc: Tutorials}
- {id: 8, cat: Other, desc: Other}
modes:
search: [q]
music-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: 2fa_code
type: text
label: 2FA code
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Phoenix Project Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: time
options:
time: created
seeders: seeders
size: size
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
login:
path: login.php
method: post
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
twofa: "{{ .Config.2fa_code }}"
keeplogged: 1
error:
- selector: div.main div.warning-login
test:
path: torrents.php
selector: a[href^="logout.php?auth="]
search:
paths:
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
searchstr: "{{ .Keywords }}"
# freetorrent: 0 normal, 1 freeleech, 2 neutral leech
freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
group_results: 0
action: advanced
order: "{{ .Config.sort }}"
sort: "{{ .Config.type }}"
searchsubmit: 1
rows:
selector: table.torrent_table tr.torrent:has(a[title="Download"])
fields:
category:
selector: a[href*="filter_cat"]
attribute: href
filters:
- name: regexp
args: "\\[(\\d+?)\\]"
title:
selector: a[href^="torrents.php?id="]
details:
selector: a[href^="torrents.php?id="]
attribute: href
genre:
selector: div.tags a[href*="taglist"]
download:
selector: span > a[href^="torrents.php?action=download&id="]
attribute: href
poster:
selector: div.group_image > img
attribute: src
description:
text: "{{ .Result.genre }}"
date:
selector: span.time.tooltip
attribute: title
filters:
- name: append
args: " +00:00" # GMT
- name: dateparse
args: "MMM dd yyyy, HH:mm zzz"
size:
selector: td.td_size
files:
selector: td.td_file_count
seeders:
selector: td.td_seeders
leechers:
selector: td.td_leechers
grabs:
selector: td.td_snatched
downloadvolumefactor:
case:
strong.torrent_label.tl_free: 0
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 0.6
# Gazelle

View File

@@ -124,9 +124,14 @@ search:
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
_id:
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: querystring
args: id
download:
text: "download.php?id={{ .Result._id }}"
poster:
selector: img[data-src]
attribute: data-src

View File

@@ -183,4 +183,4 @@ search:
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.9.6 2025-06-25
# NexusPHP v1.9.11 2025-11-02

View File

@@ -194,4 +194,4 @@ search:
description:
selector: td.rowfollow:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.9.6 2025-06-25
# NexusPHP v1.9.11 2025-11-02

View File

@@ -34,6 +34,7 @@ caps:
- {id: 78, cat: TV/Sport, desc: "Porsche Supercup"}
- {id: 32, cat: TV/Sport, desc: "Stock Car Brazil"}
- {id: 63, cat: TV/Sport, desc: "Supercars"}
- {id: 83, cat: TV/Sport, desc: "Super GT"}
- {id: 80, cat: TV/Sport, desc: "Touring Cars"}
- {id: 57, cat: TV/Sport, desc: "WEC"}
- {id: 50, cat: TV/Sport, desc: "WRC"}

View File

@@ -227,4 +227,4 @@ search:
filters:
- name: prepend
args: "{{ .Result.description_verified }} "
# NexusPHP v1.9.3 2025-05-24
# NexusPHP v1.9.11 2025-11-02

View File

@@ -9,38 +9,38 @@ type: semi-private
encoding: windows-1251
followredirect: true
links:
- https://oct31.rudub.homes/
- https://nov27.rudub.world/
legacylinks:
- https://oct16.rudub.mom/
- http://oct17.rudub.mom/
- https://oct17.rudub.mom/
- http://oct18.rudub.mom/
- https://oct18.rudub.mom/
- http://oct19.rudub.homes/
- https://oct19.rudub.homes/
- http://oct20.rudub.homes/
- https://oct20.rudub.homes/
- http://oct21.rudub.homes/
- https://oct21.rudub.homes/
- http://oct22.rudub.homes/
- https://oct22.rudub.homes/
- http://oct23.rudub.homes/
- https://oct23.rudub.homes/
- http://oct24.rudub.homes/
- https://oct24.rudub.homes/
- http://oct25.rudub.homes/
- https://oct25.rudub.homes/
- http://oct26.rudub.homes/
- https://oct26.rudub.homes/
- http://oct27.rudub.homes/
- https://oct27.rudub.homes/
- http://oct28.rudub.homes/
- https://oct28.rudub.homes/
- http://oct29.rudub.homes/
- https://oct29.rudub.homes/
- http://oct30.rudub.homes/
- https://oct30.rudub.homes/
- http://oct31.rudub.homes/
- https://nov12.rudub.pics/
- http://nov13.rudub.pics/
- https://nov13.rudub.pics/
- http://nov14.rudub.pics/
- https://nov14.rudub.pics/
- http://nov15.rudub.pics/
- https://nov15.rudub.pics/
- http://nov16.rudub.pics/
- https://nov16.rudub.pics/
- http://nov17.rudub.pics/
- https://nov17.rudub.pics/
- http://nov18.rudub.pics/
- https://nov18.rudub.pics/
- http://nov19.rudub.pics/
- https://nov19.rudub.pics/
- http://nov20.rudub.pics/
- https://nov20.rudub.pics/
- http://nov21.rudub.pics/
- https://nov21.rudub.pics/
- http://nov22.rudub.pics/
- https://nov22.rudub.pics/
- http://nov23.rudub.pics/
- https://nov23.rudub.pics/
- http://nov24.rudub.pics/
- https://nov24.rudub.pics/
- http://nov25.rudub.world/
- https://nov25.rudub.world/
- http://nov26.rudub.world/
- https://nov26.rudub.world/
- http://nov27.rudub.world/
caps:
categorymappings:
- {id: 1, cat: TV, desc: "TV"}

View File

@@ -0,0 +1,209 @@
---
id: sextorrent-api
name: SexTorrent (API)
description: "SexTorrent is a Private Torrent Tracker for 3X"
language: en-US
type: private
encoding: UTF-8
links:
- https://sextorrent.myds.me/
caps:
categorymappings:
- {id: 3, cat: XXX, desc: "Amateur"}
- {id: 4, cat: XXX, desc: "Anal"}
- {id: 5, cat: XXX, desc: "Asian"}
- {id: 6, cat: XXX, desc: "BDSM"}
- {id: 7, cat: XXX, desc: "Big-Tits"}
- {id: 8, cat: XXX, desc: "Busty"}
- {id: 9, cat: XXX, desc: "Creampie"}
- {id: 10, cat: XXX, desc: "Fetish"}
- {id: 11, cat: XXX, desc: "Mature"}
- {id: 12, cat: XXX, desc: "Hardcore"}
- {id: 13, cat: XXX, desc: "Old and Young"}
- {id: 14, cat: XXX, desc: "Milf"}
- {id: 15, cat: XXX, desc: "Oral"}
- {id: 16, cat: XXX, desc: "Orgy Gang Bang"}
- {id: 17, cat: XXX, desc: "Lesbian"}
- {id: 18, cat: XXX, desc: "Teen"}
- {id: 19, cat: XXX, desc: "HD - High.Definition"}
- {id: 20, cat: XXX, desc: "Hentai"}
- {id: 21, cat: XXX, desc: "Interracial"}
- {id: 22, cat: XXX, desc: "Masturbate"}
- {id: 23, cat: XXX, desc: "Music Video"}
- {id: 24, cat: XXX, desc: "POV"}
- {id: 25, cat: XXX, desc: "Shemale -TS- TransSex"}
- {id: 26, cat: XXX, desc: "Straight"}
- {id: 27, cat: XXX, desc: "Mega.Pack"}
- {id: 28, cat: XXX, desc: "V.R. -Porn-"}
- {id: 30, cat: XXX/ImageSet, desc: "Pictures"}
- {id: 29, cat: XXX, desc: "SiteRip"}
- {id: 31, cat: XXX, desc: "Foreign"}
- {id: 32, cat: XXX, desc: "Latina"}
- {id: 33, cat: XXX/Other, desc: "Games"}
- {id: 34, cat: XXX, desc: "Magazines"}
- {id: 35, cat: XXX, desc: "Feature"}
- {id: 36, cat: XXX, desc: "Big-Ass"}
- {id: 37, cat: XXX/Other, desc: "Other"}
- {id: 38, cat: XXX, desc: "Cumshot"}
- {id: 39, cat: XXX, desc: "Black"}
- {id: 40, cat: XXX, desc: "Piss"}
- {id: 41, cat: XXX, desc: "Homemade"}
- {id: 42, cat: XXX, desc: "Pregnant"}
- {id: 43, cat: XXX, desc: "Gay"}
- {id: 45, cat: XXX, desc: "Classic"}
- {id: 44, cat: XXX, desc: "SiteFan"}
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
settings:
- name: apikey
type: text
label: APIKey
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://sextorrent.myds.me/\" target=\"_blank\">SexTorrent</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: single_file_release_use_filename
type: checkbox
label: Use filename as title for single file releases
default: true
- name: sort
type: select
label: Sort requested from site
default: created_at
options:
created_at: created
seeders: seeders
size: size
name: title
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
login:
path: /api/torrents
method: get
error:
- selector: a[href*="/login"]
message:
text: "The API key was not accepted by {{ .Config.sitelink }}."
- selector: :root:contains("Account is Banned")
search:
paths:
# https://hdinnovations.github.io/UNIT3D/torrent_api.html
# https://github.com/HDInnovations/UNIT3D/blob/master/app/Http/Controllers/API/TorrentController.php#L657
- path: api/torrents/filter
response:
type: json
headers:
Authorization: ["Bearer {{ .Config.apikey }}"]
inputs:
# if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6
$raw: "{{ range .Categories }}&categories[]={{.}}{{end}}"
name: "{{ .Keywords }}"
"free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
keywordsfilters:
- name: re_replace
args: ["\\.", " "]
rows:
selector: data
attribute: attributes
fields:
category:
selector: category_id
title_optional:
selector: name
title_filename:
selector: "files[0].name"
optional: true
files:
selector: num_file
title:
text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
details:
selector: details_link
download:
selector: download_link
poster:
selector: meta.poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
_internal:
selector: internal
case:
False: "{{ .False }}"
True: "{{ .True }}"
description:
text: "{{ if .Result._internal }}Internal{{ else }}{{ end }}{{ if and .Result._internal .Result.genre }} | {{ else }}{{ end }}{{ .Result.genre }}"
seeders:
selector: seeders
leechers:
selector: leechers
grabs:
selector: times_completed
date:
# "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50
selector: created_at
filters:
- name: append
args: " +00:00" # GMT
- name: dateparse
args: "MM/dd/yyyy HH:mm:ss zzz"
size:
selector: size
_featured:
selector: featured
case:
False: "{{ .False }}"
True: "{{ .True }}"
downloadvolumefactor_freeleech:
# api returns 0%, 25%, 50%, 75%, 100%
selector: freeleech
case:
0%: 1 # not free
25%: 0.75
50%: 0.5
75%: 0.25
100%: 0 # freeleech
"*": 0 # catch errors
downloadvolumefactor:
text: "{{ if .Result._featured }}0{{ else }}{{ .Result.downloadvolumefactor_freeleech }}{{ end }}"
uploadvolumefactor_double_upload:
# api returns False, True
selector: double_upload
case:
False: 1 # normal
True: 2 # double
uploadvolumefactor:
text: "{{ if .Result._featured }}2{{ else }}{{ .Result.uploadvolumefactor_double_upload }}{{ end }}"
# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio
# minimumratio:
# text: 0.4
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.7

View File

@@ -128,7 +128,7 @@ search:
text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
filters:
- name: re_replace # replace special characters with " " (space)
args: ["[\\[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]", " "]
args: ["[\\[!\"#$%&'()*+,\\/:;<=>?@\\^`{|}~]", " "]
- name: diacritics
args: replace
- name: re_replace # replace multiple spaces

View File

@@ -6,10 +6,11 @@ language: ru-RU
type: public
encoding: UTF-8
links:
- https://sosulki.com/
- https://sosulki.hlom.ru/
legacylinks:
- http://sosulki.net/
- http://sosulki.com/ # site forces https
- https://sosulki.com/
caps:
categorymappings:
- {id: 12, cat: XXX, desc: "Порно категории"}
@@ -46,7 +47,7 @@ search:
- path: "{{ if .Keywords }}?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story={{ .Keywords }}&titleonly=3&catlist[]=0&searchdate=0&resorder=desc{{ else }}lastnews/{{ end }}"
rows:
selector: tr.fr_viewn_in:has(td.frs:contains("B"))
selector: tr.fr_viewn_in
fields:
category:

View File

@@ -40,6 +40,10 @@ settings:
type: checkbox
label: Search freeleech only
default: false
- name: tmdbidonly
type: checkbox
label: Disable IMDB and TVDB ID search (only support TMDB ID) to potentially improve Sonarr and Radarr results
default: false
- name: multilang
type: checkbox
label: Replace MULTi by another language in release name
@@ -110,9 +114,9 @@ search:
name: "{{ .Keywords }}"
seasonNumber: "{{ .Query.Season }}"
episodeNumber: "{{ .Query.Ep }}"
imdbId: "{{ .Query.IMDBIDShort }}"
imdbId: "{{ if .Config.tmdbidonly }}{{ else }}{{ .Query.IMDBIDShort }}{{ end }}"
tmdbId: "{{ .Query.TMDBID }}"
tvdbId: "{{ .Query.TVDBID }}"
tvdbId: "{{ if .Config.tmdbidonly }}{{ else }}{{ .Query.TVDBID }}{{ end }}"
"free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"

View File

@@ -1,175 +0,0 @@
---
id: thepiratedship
name: ThePiratedShip
description: "ThePiratedShip is a Private Torrent Tracker for MOVIES / TV / GENERAL"
language: en-US
type: private
encoding: UTF-8
links:
- https://thepiratedship.co.uk/
caps:
categorymappings:
# - {id: 8, cat: Movies/Other, desc: "Torrent Releases"}
# - {id: 32, cat: Movies, desc: "Movies"}
- {id: 10, cat: Movies/SD, desc: "Cams TS & TC/PPV/VOD/HDTV *Ratio Free*"}
- {id: 11, cat: Movies/SD, desc: "Screeners/R3/R5/R6/HDRip/Webrip/WEB-DL/Recodes"}
- {id: 13, cat: Movies/HD, desc: "DVDRip/BRRip/BDRip"}
- {id: 14, cat: Movies/DVD, desc: "DVDR"}
- {id: 15, cat: Movies/UHD, desc: "High Definition MKV/MP4"}
- {id: 16, cat: Movies/UHD, desc: "4k Ultra High Definition *Ratio Free*"}
- {id: 107, cat: Movies, desc: "Boxsets"}
- {id: 17, cat: Movies/Other, desc: "Movies Requests"}
# - {id: 20, cat: TV, desc: "TV Shows"}
- {id: 21, cat: TV, desc: "Sci-Fi / Supernatural / Horror"}
- {id: 22, cat: TV, desc: "Comedy"}
- {id: 23, cat: TV, desc: "Action/Adventure"}
- {id: 24, cat: TV, desc: "Drama"}
- {id: 25, cat: TV/Documentary, desc: "Documentaries"}
- {id: 26, cat: TV, desc: "Cartoons/Animation"}
- {id: 27, cat: TV/Sport, desc: "Sport TV"}
- {id: 28, cat: TV/Other, desc: "Misc TV"}
- {id: 29, cat: TV/Other, desc: "TV Shows Requests"}
# - {id: 33, cat: Audio, desc: "Music"}
- {id: 34, cat: Audio, desc: "Rock/Heavy Metal/Alternative"}
- {id: 38, cat: Audio, desc: "Album & Singles Packs"}
- {id: 35, cat: Audio, desc: "Singles"}
- {id: 36, cat: Audio, desc: "Pop albums"}
- {id: 37, cat: Audio, desc: "Trance/Dance/House"}
- {id: 39, cat: Audio, desc: "Drum & Bass/Breakbeat/Garage/Hardcore"}
- {id: 40, cat: Audio, desc: "Golden Oldies/Easy Listening"}
- {id: 41, cat: Audio, desc: "Reggae/DUB/SKA/2 Tone"}
- {id: 42, cat: Audio, desc: "Hip-Hop/RnB/Soul"}
- {id: 43, cat: Audio, desc: "Country/Folk"}
- {id: 44, cat: Audio, desc: "Jazz 'n' Blues"}
- {id: 45, cat: Audio, desc: "Classical"}
- {id: 46, cat: Audio, desc: "Soundtracks"}
- {id: 47, cat: Audio, desc: "Amateur Creations/Live DJ Sets etc/Karaoke"}
- {id: 48, cat: Audio/Video, desc: "Music DVD & Videos"}
- {id: 49, cat: Audio, desc: "Misc/Compilation albums"}
- {id: 50, cat: Audio/Lossless, desc: "Lossless Format Albums"}
# - {id: 54, cat: PC/Games, desc: "Games"}
- {id: 55, cat: PC/Games, desc: "PC Games"}
- {id: 56, cat: Console/XBox, desc: "X BOX"}
- {id: 57, cat: Console/Other, desc: "Nintendo Switch"}
- {id: 58, cat: Console/PS3, desc: "Playstation"}
- {id: 59, cat: Console/PSP, desc: "SONY PSP"}
- {id: 60, cat: Console/NDS, desc: "Nintendo DS"}
- {id: 61, cat: PC/Games, desc: "DVDR Interactive Games & Quizzes"}
- {id: 62, cat: PC/Mac, desc: "Mac & Other OS Games"}
- {id: 63, cat: Console/Other, desc: "All Other Console Roms & Emulators"}
# - {id: 67, cat: PC, desc: "Applications"}
- {id: 68, cat: PC, desc: "Artistry"}
- {id: 69, cat: PC, desc: "Internet & Web"}
- {id: 70, cat: PC, desc: "Utilities"}
- {id: 71, cat: PC, desc: "Sound & Vision"}
- {id: 72, cat: PC, desc: "Misc Applications"}
- {id: 73, cat: PC, desc: "Windows Operating Systems & MS Apps"}
- {id: 74, cat: PC, desc: "Applications Requests"}
# - {id: 97, cat: Other, desc: "Comics/Books/eBooks"}
- {id: 100, cat: Books/Comics, desc: "Comics/Magazines"}
- {id: 99, cat: Books/EBook, desc: "E Books"}
- {id: 98, cat: Audio/Audiobook, desc: "Audio Books"}
- {id: 109, cat: PC/Mobile-Other, desc: "Phone Applications"}
- {id: 103, cat: Other, desc: "Inactive Torrents"}
# - {id: 78, cat: Other, desc: "Practice Area"}
- {id: 89, cat: Other, desc: "Test"}
# undocumented
- {id: 96, cat: Movies, desc: "Animation Releases"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: info_activity
type: info
label: Account Inactivity
default: "You must login at least once a month. Also, not downloading anything is considered being inactive (except if you're an uploader or VIP). Accounts that are inactive for 30 days are deleted unless you have told staff in advance."
login:
path: index.php
method: form
form: form
inputs:
login: "{{ .Config.username }}"
password: "{{ .Config.password }}"
remember: 1
_xfRedirect: ""
selectorinputs:
_xfToken:
selector: input[name="_xfToken"]
attribute: value
error:
- selector: div.blockMessage--error:contains(" not be found")
- selector: div.blockMessage--error:contains("Incorrect password")
test:
path: index.php
selector: a[href="/index.php?account/preferences"]
search:
paths:
# supports only single cat search, so defaulting to all
- path: "index.php?torrents/&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}&filename={{ .Keywords }}"
# imdb and tmdb not supported
keywordsfilters:
- name: re_replace
args: ["\\.", " "]
rows:
selector: table.dataList-table > tbody.normal-torrents > tr
fields:
category:
selector: a[href^="/index.php?forums/"]
attribute: href
filters:
- name: regexp
args: (\d+)/$
title:
selector: div.structItem-title a
details:
selector: li.structItem-startDate a
attribute: href
download:
selector: a[href^="/index.php?attachments/"]
attribute: href
description:
selector: a[href^="/index.php?forums/"]
date:
selector: time
attribute: datetime
size:
selector: td:nth-last-child(4)
grabs:
selector: td:nth-last-child(3)
seeders:
selector: td:nth-last-child(2)
leechers:
selector: td:nth-last-child(1)
downloadvolumefactor:
case:
span.label--accent: 0
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 1.0
minimumseedtime:
# 3 day (as seconds = 3 x 24 x 60 x 60)
text: 259200
# XenForo

View File

@@ -33,30 +33,37 @@ caps:
- {id: 185, cat: TV/Documentary, desc: "TV/Documentary"}
- {id: 168, cat: TV/Other, desc: "TV/Other"}
- {id: 169, cat: TV/Other, desc: "TV/Boxset"}
- {id: 191, cat: TV, desc: "TV/BluTv"}
- {id: 192, cat: TV, desc: "TV/BluTv Series"}
- {id: 193, cat: Movies, desc: "Movies/BluTv Film"}
- {id: 188, cat: TV, desc: "TV/Netflix"}
- {id: 189, cat: TV, desc: "TV/Netflix Series"}
- {id: 190, cat: Movies, desc: "Movies/Netflix Film"}
- {id: 195, cat: TV, desc: "TV/Exxen"}
- {id: 199, cat: TV, desc: "TV/GAİN"}
- {id: 201, cat: TV, desc: "TV/Tabii"}
- {id: 171, cat: Audio, desc: "Music"}
- {id: 172, cat: Audio, desc: "Music/Turkish"}
- {id: 173, cat: Audio, desc: "Music/Foreign"}
- {id: 184, cat: Audio, desc: "Music/Discography"}
- {id: 174, cat: Audio/Video, desc: "Music/Video"}
- {id: 191, cat: TV, desc: "TV/Max"}
- {id: 192, cat: TV, desc: "TV/Max Series"}
- {id: 193, cat: Movies, desc: "Movies/Max Film"}
- {id: 188, cat: TV, desc: "TV/Netflix"}
- {id: 189, cat: TV, desc: "TV/Netflix Series"}
- {id: 190, cat: Movies, desc: "Movies/Netflix Film"}
- {id: 195, cat: TV, desc: "TV/Exxen"}
- {id: 195, cat: Movies, desc: "TV/Exxen"}
- {id: 201, cat: TV, desc: "TV/Tabii"}
- {id: 201, cat: Movies, desc: "TV/Tabii"}
- {id: 199, cat: TV, desc: "TV/GAİN"}
- {id: 199, cat: Movies, desc: "TV/GAİN"}
- {id: 200, cat: TV, desc: "Movies/Disney+"}
- {id: 200, cat: Movies, desc: "Movies/Disney+"}
- {id: 198, cat: TV, desc: "Movies/Amazon Prime"}
- {id: 198, cat: Movies, desc: "Movies/Amazon Prime"}
- {id: 202, cat: TV, desc: "TV/Apple TV+"}
- {id: 202, cat: Movies, desc: "TV/Apple TV+"}
- {id: 175, cat: PC, desc: "Apps / Game / Graphics"}
- {id: 176, cat: PC, desc: "Apps"}
- {id: 177, cat: Other, desc: "Pictures"}
- {id: 183, cat: Books/EBook, desc: "EBook"}
- {id: 178, cat: Books/Technical, desc: "Training Sets"}
- {id: 181, cat: Console, desc: "Playstation"}
- {id: 179, cat: PC, desc: "OS"}
- {id: 180, cat: PC/Games, desc: "PC/Games"}
- {id: 181, cat: Console, desc: "Playstation"}
- {id: 198, cat: Movies, desc: "Movies/Amazon Prime"}
- {id: 200, cat: Movies, desc: "Movies/Disney+"}
modes:
search: [q]

View File

@@ -1,126 +0,0 @@
---
id: torrentcontrol
name: TorrentControl (API)
description: "TorrentControl (API) is a Public Torrent Tracker for MOVIES / TV / ANIME"
language: en-US
type: public
encoding: UTF-8
requestDelay: 2
links:
- https://torrentcontrol.pw/
caps:
categorymappings:
- {id: movie, cat: Movies, desc: Movies, default: true}
- {id: series, cat: TV, desc: Series, default: true}
- {id: anime, cat: TV/Anime, desc: Anime, default: true}
modes:
search: [q]
movie-search: [q]
tv-search: [q, season, ep]
settings: []
search:
# docs: https://torrentcontrol.pw/en/api-docs
paths:
# since per_page is only 20 we needs to query all 3 cats separately to ensure we get hits for keywordless
- path: "api/v1/torrents?type=movie&search={{ .Keywords }}"
response:
type: json
categories: [movie]
- path: "api/v1/torrents?type=series&search={{ .Keywords }}"
response:
type: json
categories: [series]
- path: "api/v1/torrents?type=anime&search={{ .Keywords }}"
response:
type: json
categories: [anime]
rows:
selector: data
fields:
category:
selector: type
_id:
selector: content_id
details:
text: "contents/{{ .Result._id }}"
_language:
selector: language
case:
fr: French
es: Spanish
it: Italian
latino: Latino
ru: Russian
"*": ""
title_default:
selector: title
title_file_name:
selector: file_name
optional: true
title_magnet:
selector: magnet_uri:contains(&dn=)
optional: true
filters:
- name: htmldecode
- name: querystring
args: dn
title:
text: "{{ if or .Result.title_file_name .Result.title_magnet }}{{ or .Result.title_file_name .Result.title_magnet }}{{ else }}{{ .Result.title_default }}{{ end }}"
filters:
- name: append
args: "{{ if .Result._language }} {{ .Result._language }}{{ else }}{{ end }}"
magnet:
selector: magnet_uri
filters:
- name: htmldecode
poster:
selector: poster_url
imdbid:
selector: imdb_id
tmdbid:
selector: tmdb_id
seeders_zero:
selector: seeders
seeders:
selector: seeders
filters:
- name: append
args: "{{ if eq .Result.seeders_zero \"0\" }}1{{ else }}{{ end }}"
leechers_zero:
selector: leechers
leechers:
selector: leechers
filters:
- name: append
args: "{{ if eq .Result.leechers_zero \"0\" }}1{{ else }}{{ end }}"
date:
# 2025-10-12T21:59:04.000000Z
selector: created_at
size_default:
selector: type
case:
movie: 9GB
series: 2GB
size_in_mb:
selector: size_in_mb
optional: true
size:
text: "{{ if .Result.size_in_mb }}{{ .Result.size_in_mb }}MB{{ else }}{{ .Result.size_default }}{{ end }}"
description:
selector: provider
filters:
- name: prepend
args: "provider: "
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# json api v1

View File

@@ -36,7 +36,7 @@ settings:
search:
paths:
- path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}"
- path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}/"
rows:
selector: table#archiveResult tbody tr:has(a[href^="magnet:?xt="])

View File

@@ -7,15 +7,11 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq392.com/
- https://torrentegg82.com/
- https://torrentqq395.com/
- https://torrentegg83.com/
legacylinks:
- https://torrentegg67.com/
- https://torrentegg68.com/
- https://torrentqq377.com/
- https://torrentqq378.com/
- https://torrentegg69.com/
- https://torrentqq379.com/
- https://torrentegg70.com/
- https://torrentqq380.com/
- https://torrentegg71.com/
@@ -40,6 +36,10 @@ legacylinks:
- https://torrentegg80.com/
- https://torrentqq391.com/
- https://torrentegg81.com/
- https://torrentqq392.com/
- https://torrentegg82.com/
- https://torrentqq393.com/
- https://torrentqq394.com/
caps:
categorymappings:

View File

@@ -1,126 +0,0 @@
---
id: torrentsir
name: TorrentSir
description: "TorrentSir (토렌트썰) is a Public KOREAN tracker for Korean media."
language: ko-KR
type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentsir176.com/
legacylinks:
- http://torrentsir165.com/
- https://torrentsir165.com/
- http://torrentsir166.com/
- https://torrentsir166.com/
- http://torrentsir167.com/
- https://torrentsir167.com/
- http://torrentsir168.com/
- https://torrentsir168.com/
- http://torrentsir169.com/
- https://torrentsir169.com/
- http://torrentsir170.com/
- https://torrentsir170.com/
- http://torrentsir171.com/
- https://torrentsir171.com/
- http://torrentsir172.com/
- https://torrentsir172.com/
- http://torrentsir173.com/
- https://torrentsir173.com/
- http://torrentsir174.com/
- https://torrentsir174.com/
- http://torrentsir175.com/
- https://torrentsir175.com/
- http://torrentsir176.com/
caps:
categorymappings:
- {id: "gallery", cat: XXX, desc: "+19 (Adult)"}
- {id: "ani", cat: TV, desc: "동영상 (Video)"}
- {id: "game", cat: Console, desc: "기타 (Games)"}
- {id: "tv", cat: TV, desc: "시사/교양 (TV)"}
- {id: "netflix", cat: TV, desc: "넷플시리즈 (Netflix)"}
- {id: "movie", cat: Movies, desc: "영화 (Movie)"}
- {id: "drama", cat: TV, desc: "드라마 (Drama)"}
- {id: "entertain", cat: TV, desc: "예능/오락 (Entertainment)"}
- {id: "music", cat: Audio, desc: "음악 (Music)"}
- {id: "notice", cat: Other, desc: "고객센터 (Notice)"}
- {id: "child", cat: Other, desc: "고객센터 (Child)"}
- {id: "lecture", cat: Books, desc: "도서/강좌 (Books)"}
- {id: "util", cat: PC, desc: "유틸 (Software)"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
book-search: [q]
settings:
- name: info_flaresolverr
type: info_flaresolverr
download:
infohash:
hash:
selector: a[href^="magnet:?xt="]
attribute: href
filters:
- name: regexp
args: ([A-F|a-f|0-9]{40})
title:
selector: h3.panel-title
filters:
- name: trim
- name: validfilename
search:
paths:
# https://torrentsir171.com/bbs/search.php?srows=100&gr_id=&sfl=wr_subject&stx=2025&sop=and
- path: bbs/search.php
allowEmptyInputs: true
inputs:
srows: 100
gr_id: ""
# wr_subject||wr_content, wr_subject, wr_content, mb_id, wr_name
sfl: wr_subject
stx: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}"
# or, and
sop: and
rows:
selector: div.search-media div.media
fields:
category:
selector: div.media-heading a
attribute: href
filters:
- name: querystring
args: bo_table
title:
selector: div.media-heading a
details:
selector: div.media-heading a
attribute: href
download:
selector: div.media-heading a
attribute: href
poster:
selector: div.photo img
attribute: src
date:
# 2021-01-29T20:44:20+09:00
selector: time
attribute: datetime
size:
text: "512 MB"
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -9,12 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrentsome219.com/
- https://torrentsome223.com/
legacylinks:
- https://torrentsome204.com/
- https://torrentsome205.com/
- https://torrentsome206.com/
- https://torrentsome207.com/
- https://torrentsome208.com/
- https://torrentsome209.com/
- https://torrentsome210.com/
@@ -26,6 +22,10 @@ legacylinks:
- https://torrentsome216.com/
- https://torrentsome217.com/
- https://torrentsome218.com/
- https://torrentsome219.com/
- https://torrentsome220.com/
- https://torrentsome221.com/
- https://torrentsome222.com/
caps:
categorymappings:

View File

@@ -1,135 +0,0 @@
---
id: torrentssg
name: torrentssg
description: "torrentssg (토렌트쓱) is a Public KOREAN tracker for Korean media."
language: ko-KR
type: public
encoding: UTF-8
# to fetch current domain use https://xn--sm2bw9uj0jb6a.com/
links:
- https://ssg1.torrentssg8.com/
legacylinks:
- https://torrentssg7.com/
- https://torrentssg8.com/
caps:
categorymappings:
- {id: "st01", cat: Movies, desc: "영화 (Movies)"}
- {id: "st02", cat: Movies/Foreign, desc: "해외영화 (Foreign Movies)"}
- {id: "st02_n", cat: Other, desc: "개봉예정작 (Upcoming Releases)"}
- {id: "st03", cat: XXX, desc: "성인(19+)영화 (Adult Movies)"}
- {id: "st04", cat: TV, desc: "드라마 (Drama)"}
- {id: "st05", cat: TV/Foreign, desc: "해외드라마 (Foreign Drama)"}
- {id: "st06", cat: TV, desc: "드라마완결 (Completed Drama)"}
- {id: "st07", cat: TV, desc: "예능·방송 (Entertainment)"}
- {id: "st09", cat: TV/Documentary, desc: "시사·다큐·교양 (Documentary)"}
- {id: "st10", cat: TV/Sport, desc: "스포츠 (Sport)"}
- {id: "st11", cat: TV, desc: "OTT·자막 (OTT-Subtitles)"}
# - {id: "st12", cat: Other, desc: "자막 (Subtitles)"} # these are direct text files not torrents
- {id: "st13", cat: TV/Anime, desc: "애니·만화 (Animation)"}
- {id: "st14", cat: TV/Anime, desc: "애니완결 (Completed Animation)"}
- {id: "st15", cat: TV, desc: "극장판 (Theatrical Version)"}
- {id: "st16", cat: TV, desc: "키즈 (Kids)"}
- {id: "st18", cat: Audio, desc: "음악 (Music)"}
- {id: "st19", cat: Console, desc: "게임·유틸 (Games)"}
- {id: "st20", cat: PC, desc: "유틸 (Software)"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
settings:
- name: ip_filtering
type: info
label: "IP Filtering"
default: "torrentssg (토렌트쓱) blocks Non-South Korean IP addresses. A <b>FlareSolverr</b> error means your IP was not accepted."
- name: info_flaresolverr
type: info_flaresolverr
download:
selectors:
- selector: a[href*="/bbs/download.php?"]
attribute: href
search:
paths:
# https://ssg1.torrentssg8.com/bbs/search.php?bo_table=&sca=&sop=and&sfl=wr_subject%7C%7Cwr_content&stx=2025
- path: bbs/search.php
allowEmptyInputs: true
inputs:
bo_table: ""
sca: ""
# or, and
sop: and
# wr_subject||wr_content, wr_subject, wr_content, mb_id, wr_name
sfl: "wr_subject"
stx: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}"
srows: 100
gr_id: ""
rows:
selector: div.search-media div.table-responsive table.table tbody tr:not(:has(a[href*="bo_table=st12"]))
fields:
category:
selector: td.list-img a
attribute: href
filters:
- name: querystring
args: bo_table
title:
selector: td.list-subject a
details:
selector: td.list-subject a
attribute: href
download:
selector: td.list-subject a
attribute: href
poster:
selector: img
attribute: src
size:
selector: td:nth-child(5)
filters:
- name: append
args: B
date_ago:
# time ago
selector: td:last-child:contains("전")
optional: true
filters:
- name: replace
args: ["전", " ago"]
- name: replace
args: ["초", " seconds"]
- name: replace
args: ["분", " minutes"]
- name: replace
args: ["시간", " hours"]
- name: replace
args: ["일", " days"]
- name: replace
args: ["개월", " months"]
- name: replace
args: ["년", " years"]
- name: timeago
date_month:
# 02.24
selector: td:last-child:not(:contains("전"))
optional: true
filters:
- name: dateparse
args: "MM.dd"
date:
text: "{{ if or .Result.date_ago .Result.date_month }}{{ or .Result.date_ago .Result.date_month }}{{ else }}now{{ end }}"
seeders:
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# engine n/a

View File

@@ -9,12 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrenttip200.top/
- https://torrenttip204.top/
legacylinks:
- https://torrenttip185.top/
- https://torrenttip186.top/
- https://torrenttip187.top/
- https://torrenttip188.top/
- https://torrenttip189.top/
- https://torrenttip190.top/
- https://torrenttip191.top/
@@ -26,6 +22,10 @@ legacylinks:
- https://torrenttip197.top/
- https://torrenttip198.top/
- https://torrenttip199.top/
- https://torrenttip200.top/
- https://torrenttip201.top/
- https://torrenttip202.top/
- https://torrenttip203.top/
caps:
categorymappings:

View File

@@ -1,218 +0,0 @@
---
id: uhdtorrent
name: uHDTorrent
description: "uHDTorrent is a TURKISH Private Torrent Tracker for HD MOVIES / TV / GENERAL"
language: tr-TR
type: private
encoding: UTF-8
links:
- https://uhdtorrent.club/
caps:
categorymappings:
- {id: 32, cat: Movies, desc: "Digital Platform İçerikleri"}
- {id: 32, cat: TV, desc: "Digital Platform İçerikleri"}
- {id: 39, cat: Movies, desc: "NETFLİX"}
- {id: 39, cat: TV, desc: "NETFLİX"}
- {id: 38, cat: Movies, desc: "AMAZON PRİME"}
- {id: 38, cat: TV, desc: "AMAZON PRİME"}
- {id: 41, cat: Movies, desc: "DİSNEY+"}
- {id: 41, cat: TV, desc: "DİSNEY+"}
- {id: 37, cat: Movies, desc: "HBOMAX"}
- {id: 37, cat: TV, desc: "HBOMAX"}
- {id: 40, cat: Movies, desc: "TOD"}
- {id: 40, cat: TV, desc: "TOD"}
- {id: 42, cat: Movies, desc: "GAİN"}
- {id: 42, cat: TV, desc: "GAİN"}
- {id: 43, cat: Movies, desc: "MUBI"}
- {id: 43, cat: TV, desc: "MUBI"}
- {id: 44, cat: Movies, desc: "TV+"}
- {id: 44, cat: TV, desc: "TV+"}
- {id: 45, cat: Movies, desc: "EXXEN"}
- {id: 45, cat: TV, desc: "EXXEN"}
- {id: 46, cat: Movies, desc: "TABİİ"}
- {id: 46, cat: TV, desc: "TABİİ"}
- {id: 47, cat: Movies, desc: "ATVP"}
- {id: 47, cat: TV, desc: "ATVP"}
- {id: 59, cat: Movies, desc: "DİĞER"}
- {id: 59, cat: TV, desc: "DİĞER"}
- {id: 48, cat: TV, desc: "Diziler"}
- {id: 49, cat: TV, desc: "Yerli Diziler"}
- {id: 50, cat: TV, desc: "Yerli Dizi Boxset"}
- {id: 52, cat: Audio, desc: "Müzikler"}
- {id: 53, cat: Audio, desc: "Müzikler Yerli"}
- {id: 54, cat: Audio, desc: "Müzikler Yabancı"}
- {id: 55, cat: PC/0day, desc: "Programlar"}
- {id: 56, cat: PC/0day, desc: "Programlar Windows"}
- {id: 57, cat: PC/Games, desc: "Oyunlar"}
- {id: 58, cat: PC/Games, desc: "Oyunla PC"}
modes:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: freeleech
type: checkbox
label: Filter freeleech only
default: false
- name: info
type: info
label: Layout
default: "<ul><li>Only the English Classic profile is supported.</li><li>Make sure to set the <b>Torrent Listing (Torrent Listes)</b> option in your profile to <b>Classic</b></li><li>Using the <i>Modern</i> theme will prevent results.</li></ul>"
- name: sort
type: select
label: Sort requested from site
default: added
options:
added: created
seeders: seeders
size: size
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
- name: info_results
type: info
label: Search results
default: "If you are getting the error <b>Found no results while trying to browse this tracker</b> then first access the site with your browser and check that you are not being forced to change your password because it has expired after 365 days."
login:
path: ?p=home&pid=1
method: form
form: form#loginbox_form
submitpath: ajax/login.php
inputs:
action: login
loginbox_membername: "{{ .Config.username }}"
loginbox_password: "{{ .Config.password }}"
loginbox_remember: 1
selectorinputs:
securitytoken:
selector: "script:contains(\"stKey: \")"
filters:
- name: regexp
args: "stKey: \"(.+?)\","
error:
- selector: ":contains(\"-ERROR-\")"
test:
path: ?p=home&pid=1
selector: a[href*="/?p=logout&"]
search:
paths:
- path: /
keywordsfilters:
- name: re_replace
args: ["[^a-zA-Z0-9]+", "%25"]
inputs:
p: torrents
pid: 32
$raw: "{{ range .Categories }}cid[]={{.}}&{{end}}"
keywords: "{{ .Keywords }}"
# name, description, both, uploader
search_type: name
"sortOptions[sortBy]": "{{ .Config.sort }}"
"sortOptions[sortOrder]": "{{ .Config.type }}"
rows:
selector: "table#torrents_table_classic tr:has(td.torrent_name){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}"
fields:
title:
selector: a[href*="?p=torrents&pid=10&action=details"]
category:
selector: div.category_image > a
attribute: href
filters:
- name: querystring
args: cid
details:
selector: a[href*="?p=torrents&pid=10&action=details"]
attribute: href
download:
selector: a[href*="?p=torrents&pid=10&action=download"]
attribute: href
date_day:
# Yüklendi Bugün saat 05:11 by
# Yüklendi Dün saat 05:11 by
# Yüklendi Cumartesi at 23:57 by
selector: td.torrent_name:contains("at"):not(:has(abbr[data-time]))
# auto adjusted by site account profile
optional: true
filters:
- name: regexp
args: "Yüklendi (.+?) by"
- name: replace
args: ["Bugün saat", "today"]
- name: replace
args: ["Dün saat", "yesterday"]
- name: replace
args: ["Pazartesi", "monday"]
- name: replace
args: ["Salı", "tuesday"]
- name: replace
args: ["Çarşamba", "wednesday"]
- name: replace
args: ["Perşembe", "thursday"]
- name: replace
args: ["Cumartesi", "saturday"]
- name: replace
args: ["Cuma", "friday"]
- name: replace
args: ["Pazar", "sunday"]
- name: fuzzytime
date_year:
# Yüklendi 20-10-2025 11:15 by
selector: td.torrent_name:not(:contains("at")):not(:has(abbr[data-time]))
# auto adjusted by site account profile
optional: true
filters:
- name: regexp
args: "Yüklendi (.+?) by"
- name: dateparse
args: "dd-MM-yyyy HH:mm"
date_unix:
# within the hour (unix)
selector: abbr[data-time]
attribute: data-time
optional: true
date:
text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}"
size:
selector: a[rel="torrent_size"]
seeders:
selector: a[rel="torrent_seeders"]
leechers:
selector: a[rel="torrent_leechers"]
grabs:
selector: a[rel="times_completed"]
poster:
selector: a[rel="fancybox"]
attribute: href
downloadvolumefactor:
case:
"img[src$=\"/silver.gif\"]": 0.5
"img[src$=\"/freedownload.gif\"]": 0
"*": 1
uploadvolumefactor:
case:
"img[src$=\"/torrent_x2.png\"]": 2
"*": 1
minimumratio:
text: 0.8
minimumseedtime:
# 3 day (as seconds = 3 x 24 x 60 x 60)
text: 259200
# TSUE 2.2

View File

@@ -171,4 +171,4 @@ search:
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.9.9 2025-10-02
# NexusPHP v1.9.11 2025-11-02

View File

@@ -31,10 +31,8 @@ caps:
- {id: 190, cat: Movies, desc: " |- Фильмы в 4K и 3D"}
- {id: 34, cat: Movies, desc: " |- Перевод на узбекский"}
- {id: 25, cat: Movies, desc: "Узбекские кинофильмы"}
- {id: 32, cat: Movies, desc: " |- Новинки"}
- {id: 30, cat: Movies, desc: " |- Фильмы 2011-2024 годов"}
- {id: 29, cat: Movies, desc: " |- Фильмы 2000-2010 годов"}
- {id: 26, cat: Movies, desc: " |- Фильмы до 2000 года"}
- {id: 32, cat: Movies, desc: " |- Пр-во Узбекфильм (на русском)"}
- {id: 30, cat: Movies, desc: " |- Пр-во Узбекфильм (на узбекском языке)"}
# Сериалы, Видео и ТВ # Series, Videos and TV
- {id: 97, cat: TV, desc: "Сериалы"}
- {id: 333, cat: TV, desc: " |- Игра престолов / Game of Thrones"}
@@ -85,12 +83,14 @@ caps:
- {id: 132, cat: Audio, desc: " |- Классическая музыа"}
- {id: 125, cat: Audio, desc: " |- New Age, Relax, Meditative & Flamenco"}
- {id: 124, cat: Audio, desc: " |- Фольклор, Народная и Этническая музыка"}
- {id: 338, cat: Audio, desc: " |- Country"}
- {id: 231, cat: Audio, desc: " |- Сборники и альбомы выходившие неофициальными изданиями."}
- {id: 144, cat: Audio, desc: "♫ ROCK & METAL ♫"}
- {id: 201, cat: Audio, desc: " |- Русский Rock, Metal (mp3)"}
- {id: 202, cat: Audio, desc: " |- Сборники Русского рока (mp3)"}
- {id: 323, cat: Audio, desc: " |- Русский Rock, Metal (Lossless)"}
- {id: 214, cat: Audio, desc: " |- Soft & Pop-Rock"}
- {id: 334, cat: Audio, desc: " |- Progressive & Art-Rock"}
- {id: 156, cat: Audio, desc: " |- Progressive, Art, Classic & Hard Rock"}
- {id: 213, cat: Audio, desc: " |- Melodic & Folk Rock"}
- {id: 212, cat: Audio, desc: " |- Instrumental & Guitar Rock"}
@@ -150,11 +150,13 @@ caps:
- {id: 173, cat: Books, desc: " |- Художественная литература"}
- {id: 314, cat: Books, desc: " |- Учебно-техническая литература"}
- {id: 167, cat: Books, desc: "Аудиокниги"}
- {id: 232, cat: Audio/Audiobook, desc: " |- Детективы, приключения, триллеры (Audiobook)"}
- {id: 210, cat: Audio/Audiobook, desc: " |- Романы, повести, рассказы (Audiobook)"}
- {id: 233, cat: Audio/Audiobook, desc: " |- Любовные романы (Audiobook)"}
- {id: 176, cat: Audio/Audiobook, desc: " |- Мистика, фантастика, ужасы (Audiobook)"}
- {id: 175, cat: Audio/Audiobook, desc: " |- Любовно-фантастический роман (Audiobook)"}
- {id: 335, cat: Audio/Audiobook, desc: " |- ♫ Русская литература ХХ-ХХI века"}
- {id: 232, cat: Audio/Audiobook, desc: " |- ♫ Детективы, приключения, триллеры"}
- {id: 337, cat: Audio/Audiobook, desc: " |- ♫ Детективы Дарьи Донцовой"}
- {id: 210, cat: Audio/Audiobook, desc: " |- ♫ Зарубежные авторы. Романы, повести, рассказы"}
- {id: 233, cat: Audio/Audiobook, desc: " |- Любовные романы"}
- {id: 176, cat: Audio/Audiobook, desc: " |- ♫ Мистика, фантастика, ужасы"}
- {id: 175, cat: Audio/Audiobook, desc: " |- ♫ Любовно-фантастический роман"}
- {id: 174, cat: Audio, desc: " |- Аудиокниги на других языках (Audio)"}
- {id: 319, cat: Books, desc: " |- Аудиокниги для детей"}
# Игры # Games
@@ -167,6 +169,7 @@ caps:
- {id: 289, cat: PC/Games, desc: " |- Horror"}
- {id: 307, cat: PC/Games, desc: " |- Logic"}
- {id: 304, cat: PC/Games, desc: " |- Lifestyle"}
- {id: 336, cat: PC/Games, desc: " |- Sports"}
- {id: 306, cat: PC/Games, desc: " |- Exploration"}
- {id: 305, cat: PC/Games, desc: " |- Management"}
- {id: 115, cat: PC/Games, desc: " |- Аркады"}

View File

@@ -8,8 +8,8 @@ encoding: UTF-8
requestDelay: 2.5 # 2.5 requests per second (2 causes problems)
links:
# if the primary domain changes then don't forget to update the details, download and poster replace args
- https://yts.mx/
# official domain list are at https://yifystatus.com/ and official proxies list are at https://ytsproxies.com/
- https://yts.lt/
# official domain list are at https://yifystatus.com/ and official proxies list are at https://ytsproxies.com/
- https://yts.unblockninja.com/
- https://yts.ninjaproxy1.com/
- https://yts.proxyninja.org/
@@ -17,9 +17,9 @@ links:
- https://yts.torrentbay.st/
- https://yts.torrentsbay.org/
legacylinks:
- https://yts.lt/
- https://yts.am/
- https://yts.ag/
- https://yts.mx/
- https://yts.mrunblock.bond/
- https://yts.nocensor.cloud/
- https://yts.unblockit.download/
@@ -104,19 +104,19 @@ search:
selector: ..url
filters:
- name: re_replace
args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494
args: ["^https?:\\/\\/yts\\.(mx|lt)\\/", "{{ .Config.sitelink }}"] # fix for 12494
download:
selector: url
filters:
- name: re_replace
args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494
args: ["^https?:\\/\\/yts\\.(mx|lt)\\/", "{{ .Config.sitelink }}"] # fix for 12494
infohash:
selector: hash
poster:
selector: ..large_cover_image
filters:
- name: re_replace
args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494
args: ["^https?:\\/\\/yts\\.(mx|lt)\\/", "{{ .Config.sitelink }}"] # fix for 12494
imdbid:
selector: ..imdb_code
date:

View File

@@ -5,12 +5,13 @@ description: "zetorrents is a FRENCH Public site for MOVIES / TV / GENERAL"
language: fr-FR
type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.my/
# to fetch current domain use https://www.rantop.org/
links:
- https://www.zetorrents.town/
- https://zetorrents-proxy.site/
legacylinks:
# latest domains list
- https://www.rantop.my/
- https://www.rantop.org/
- https://www.site-torrent.cc/
- https://www.torrent-site.com/
# domain lists no longer working
@@ -19,8 +20,8 @@ legacylinks:
- https://www.protege-liens.com/
- https://www.protege-liens.net/
- https://www.torrent.onl/
- https://www.rantop.org/
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.zetorrents.nl/
- https://www.zetorrents.biz/
@@ -80,7 +81,7 @@ download:
search:
paths:
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}home{{ end }}"
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}{{ end }}"
keywordsfilters:
# if searching for season packs swith S01 to saison 1 #9712
- name: re_replace

View File

@@ -7,12 +7,12 @@ description: "ZkTorrent is a FRENCH Public site for MOVIES / TV / GENERAL"
language: fr-FR
type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.my/
# to fetch current domain use https://www.rantop.org/
links:
- https://www.zktorrent.town/
- https://ww1-zktorrent.me/
legacylinks:
# latest domains list
- https://www.rantop.my/
- https://www.rantop.org/
- https://www.site-torrent.cc/
- https://www.torrent-site.com/
# domain lists no longer working
@@ -21,12 +21,10 @@ legacylinks:
- https://www.protege-liens.com/
- https://www.protege-liens.net/
- https://www.torrent.onl/
- https://www.rantop.org/
- https://gktorrent.news/
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.gktorrent.si/
- https://www.gktorrent.my/
- https://www.gktorrent.cz/
- https://www.gktorrent.ke/
- https://www.gktorrent.cv/
@@ -40,6 +38,8 @@ legacylinks:
- https://www.zktorrent5.com/
- https://www.zktorrent.net/
- https://www.zktorrent6.com/
- https://www.zktorrent.town/
- https://zktorrent-proxy.site/
caps:
categorymappings:
@@ -100,7 +100,7 @@ download:
search:
paths:
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}home{{ end }}"
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}{{ end }}"
keywordsfilters:
# if searching for season packs swith S01 to saison 1 #9712
- name: re_replace

View File

@@ -6,9 +6,10 @@ language: hu-HU
type: semi-private
encoding: ISO-8859-2
links:
- http://ztracker.cc/ # site does not support https invalid certificate
- https://ztracker.cc/
legacylinks:
- http://ztracker.org/
- http://ztracker.cc/
caps:
categorymappings:

View File

@@ -0,0 +1,34 @@
using System.Security.Cryptography;
using System.Text;
namespace Jackett.Common.Extensions
{
public static class HashingExtensions
{
public static string SHA1Hash(this string input)
{
using var hash = SHA1.Create();
return GetHash(hash.ComputeHash(Encoding.UTF8.GetBytes(input)));
}
public static string SHA256Hash(this string input)
{
using var hash = SHA256.Create();
return GetHash(hash.ComputeHash(Encoding.UTF8.GetBytes(input)));
}
private static string GetHash(byte[] bytes)
{
var stringBuilder = new StringBuilder();
foreach (var b in bytes)
{
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}
}
}

View File

@@ -8,10 +8,8 @@ using System.Xml.Linq;
using Jackett.Common.Extensions;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Serializer;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
@@ -204,44 +202,36 @@ namespace Jackett.Common.Indexers.Definitions
seasonPart = Regex.Replace(seasonPart, @"\b\d{4}\b$", "");
var hasPartNumber = Regex.IsMatch(seasonPart, @"\bPart\s+\d+\b", RegexOptions.IgnoreCase);
var seasonMatch = Regex.Match(seasonPart,
@"\b(?:Season|S|Series)\s*(\d+)|\b(\d+)(?:st|nd|rd|th)?\s*Season\b|\b([IVXLCDM]+)\b|\b(\d+)\b",
@"\b(?:Season|S|Series)\s*(?<season_number>\d+)|\b(?<season_number>\d+)(?:st|nd|rd|th)?\s*Season\b|\b(?<roman_number>M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))\b|\b(?<season_number>\d+)\b",
RegexOptions.IgnoreCase);
var season = "S01";
if (seasonMatch.Success && !hasPartNumber)
{
if (!string.IsNullOrEmpty(seasonMatch.Groups[1].Value))
if (seasonMatch.Groups["season_number"].Success
&& !string.IsNullOrWhiteSpace(seasonMatch.Groups["season_number"].Value)
&& int.TryParse(seasonMatch.Groups["season_number"].Value, out var seasonNumber))
{
season = $"S{int.Parse(seasonMatch.Groups[1].Value):D2}";
season = $"S{seasonNumber:D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[2].Value))
{
season = $"S{int.Parse(seasonMatch.Groups[2].Value):D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[3].Value))
else if (seasonMatch.Groups["roman_number"].Success && !string.IsNullOrWhiteSpace(seasonMatch.Groups["roman_number"].Value))
{
season = $"S{RomanToArabic(seasonMatch.Groups[3].Value):D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[4].Value))
{
season = $"S{int.Parse(seasonMatch.Groups[4].Value):D2}";
}
}
var episodes = string.Empty;
var epMatch = Regex.Match(episodesPart, @"(\d+)(?:[-–—](\d+))?");
if (epMatch.Success)
if (epMatch.Success && int.TryParse(epMatch.Groups[1].Value, out var episodeStartNumber))
{
var start = int.Parse(epMatch.Groups[1].Value);
if (epMatch.Groups[2].Success)
{
var end = int.Parse(epMatch.Groups[2].Value);
episodes = $"E{start:D2}-E{end:D2}";
episodes = $"E{episodeStartNumber:D2}-E{int.Parse(epMatch.Groups[2].Value):D2}";
}
else
{
episodes = $"E{start:D2}";
episodes = $"E{episodeStartNumber:D2}";
}
}
@@ -250,11 +240,12 @@ namespace Jackett.Common.Indexers.Definitions
private static int RomanToArabic(string roman)
{
int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
string[] numerals = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
roman = roman.ToUpperInvariant();
var values = new[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
var numerals = new[] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
var result = 0;
var i = 0;
roman = roman.ToUpper();
while (roman.Length > 0)
{
if (roman.StartsWith(numerals[i]))

View File

@@ -130,7 +130,7 @@ namespace Jackett.Common.Indexers.Definitions
{ "total", "146" }, // Assuming the total number of pages
{ "cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0") },
{ "page", page.ToString() },
{ "searchin", "filename" },
{ "searchin", "filedisc" },
{ "search", searchString }
};

View File

@@ -249,13 +249,14 @@ namespace Jackett.Common.Indexers.Definitions
var details = new Uri(qDetailsLink.GetAttribute("href"));
var qPosterLink = row.QuerySelector("img[src*=\"/torrents/images/\"]");
var qMagnetLink = row.QuerySelector("a[href^=\"magnet:?xt=\"]");
var size = ParseUtil.GetBytes(row.QuerySelector("td:nth-last-child(5)").TextContent);
var matchDateAdded = Regex.Match(row.QuerySelector(" td:nth-child(2)").TextContent, @"(\d{2}-\d{2}-\d{4} \d{2}:\d{2})", RegexOptions.IgnoreCase);
var publishDate = matchDateAdded.Groups[1].Success && DateTime.TryParseExact(matchDateAdded.Groups[1].Value, "dd-MM-yyyy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var parsedDate) ? parsedDate : DateTime.Now;
var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-last-child(4)").TextContent);
var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-last-child(3)").TextContent);
var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-last-child(2)").TextContent) + seeders;
var grabs = ParseUtil.CoerceLong(row.QuerySelector("td:nth-last-child(4)").TextContent);
var seeders = ParseUtil.CoerceLong(row.QuerySelector("td:nth-last-child(3)").TextContent);
var leechers = ParseUtil.CoerceLong(row.QuerySelector("td:nth-last-child(2)").TextContent) + seeders;
var dlVolumeFactor = 1.0;
var upVolumeFactor = 1.0;
@@ -287,6 +288,10 @@ namespace Jackett.Common.Indexers.Definitions
{
release.Poster = new Uri(qPosterLink.GetAttribute("src"));
}
if (qMagnetLink != null)
{
release.MagnetUri = new Uri(qMagnetLink.GetAttribute("href"));
}
releases.Add(release);
}

View File

@@ -29,19 +29,16 @@ namespace Jackett.Common.Indexers.Definitions
public override string Name => "DonTorrent";
public override string Description => "DonTorrent is a SPANISH Public tracker for MOVIES / TV / GENERAL";
// in the event the redirect is inactive https://t.me/s/dontorrent should have the latest working domain
public override string SiteLink { get; protected set; } = "https://dontorrent.phd/";
public override string SiteLink { get; protected set; } = "https://todotorrents.org/";
public override string[] AlternativeSiteLinks => new[]
{
"https://dontorrent.phd/",
"https://todotorrents.org/",
"https://tomadivx.net/",
"https://seriesblanco.one/",
"https://verdetorrent.com/",
"https://naranjatorrent.com/"
};
public override string[] LegacySiteLinks => new[]
{
"https://dontorrent.homes/",
"https://dontorrent.haus/",
"https://dontorrent.news/",
"https://dontorrent.institute/",
@@ -56,6 +53,9 @@ namespace Jackett.Common.Indexers.Definitions
"https://dontorrent.kids/",
"https://dontorrent.kiwi/",
"https://dontorrent.live/",
"https://dontorrent.phd/",
"https://seriesblanco.one/",
"https://dontorrent.gripe/", // no longer compatible, switched to JS download
};
public override string Language => "es-ES";
public override string Type => "public";

View File

@@ -104,7 +104,7 @@ namespace Jackett.Common.Indexers.Definitions
var maxPages = 2; // we scrape only 2 pages for recent torrents
if (!string.IsNullOrWhiteSpace(query.GetQueryString()))
{
searchString = Uri.EscapeUriString(query.GetQueryString());
searchString = Uri.EscapeDataString(query.GetQueryString());
maxPages = MaxSearchPageLimit;
}

View File

@@ -86,35 +86,37 @@ namespace Jackett.Common.Indexers.Definitions
TvSearchImdbAvailable = true
};
caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesSD, "Filme SD");
caps.Categories.AddCategoryMapping(24, TorznabCatType.TVAnime, "Anime");
caps.Categories.AddCategoryMapping(11, TorznabCatType.Audio, "Audio");
caps.Categories.AddCategoryMapping(29, TorznabCatType.Books, "Books");
caps.Categories.AddCategoryMapping(30, TorznabCatType.Other, "Courses");
caps.Categories.AddCategoryMapping(15, TorznabCatType.TV, "Desene");
caps.Categories.AddCategoryMapping(18, TorznabCatType.Other, "Diverse");
caps.Categories.AddCategoryMapping(16, TorznabCatType.Books, "Docs");
caps.Categories.AddCategoryMapping(25, TorznabCatType.Movies3D, "Filme 3D");
caps.Categories.AddCategoryMapping(6, TorznabCatType.MoviesUHD, "Filme 4K");
caps.Categories.AddCategoryMapping(26, TorznabCatType.MoviesBluRay, "Filme 4K Blu-Ray");
caps.Categories.AddCategoryMapping(20, TorznabCatType.MoviesBluRay, "Filme Blu-Ray");
caps.Categories.AddCategoryMapping(2, TorznabCatType.MoviesDVD, "Filme DVD");
caps.Categories.AddCategoryMapping(3, TorznabCatType.MoviesForeign, "Filme DVD-RO");
caps.Categories.AddCategoryMapping(4, TorznabCatType.MoviesHD, "Filme HD");
caps.Categories.AddCategoryMapping(5, TorznabCatType.AudioLossless, "FLAC");
caps.Categories.AddCategoryMapping(6, TorznabCatType.MoviesUHD, "Filme 4K");
caps.Categories.AddCategoryMapping(7, TorznabCatType.XXX, "XXX");
caps.Categories.AddCategoryMapping(8, TorznabCatType.PC, "Programe");
caps.Categories.AddCategoryMapping(9, TorznabCatType.PCGames, "Jocuri PC");
caps.Categories.AddCategoryMapping(10, TorznabCatType.Console, "Jocuri Console");
caps.Categories.AddCategoryMapping(11, TorznabCatType.Audio, "Audio");
caps.Categories.AddCategoryMapping(12, TorznabCatType.AudioVideo, "Videoclip");
caps.Categories.AddCategoryMapping(13, TorznabCatType.TVSport, "Sport");
caps.Categories.AddCategoryMapping(15, TorznabCatType.TV, "Desene");
caps.Categories.AddCategoryMapping(16, TorznabCatType.Books, "Docs");
caps.Categories.AddCategoryMapping(17, TorznabCatType.PC, "Linux");
caps.Categories.AddCategoryMapping(18, TorznabCatType.Other, "Diverse");
caps.Categories.AddCategoryMapping(19, TorznabCatType.MoviesForeign, "Filme HD-RO");
caps.Categories.AddCategoryMapping(20, TorznabCatType.MoviesBluRay, "Filme Blu-Ray");
caps.Categories.AddCategoryMapping(21, TorznabCatType.TVHD, "Seriale HD");
caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesSD, "Filme SD");
caps.Categories.AddCategoryMapping(5, TorznabCatType.AudioLossless, "FLAC");
caps.Categories.AddCategoryMapping(10, TorznabCatType.Console, "Jocuri Console");
caps.Categories.AddCategoryMapping(9, TorznabCatType.PCGames, "Jocuri PC");
caps.Categories.AddCategoryMapping(31, TorznabCatType.TVForeign, "K-Drama");
caps.Categories.AddCategoryMapping(17, TorznabCatType.PC, "Linux");
caps.Categories.AddCategoryMapping(22, TorznabCatType.PCMobileOther, "Mobile");
caps.Categories.AddCategoryMapping(23, TorznabCatType.TVSD, "Seriale SD");
caps.Categories.AddCategoryMapping(24, TorznabCatType.TVAnime, "Anime");
caps.Categories.AddCategoryMapping(25, TorznabCatType.Movies3D, "Filme 3D");
caps.Categories.AddCategoryMapping(26, TorznabCatType.MoviesBluRay, "Filme 4K Blu-Ray");
caps.Categories.AddCategoryMapping(27, TorznabCatType.TVUHD, "Seriale 4K");
caps.Categories.AddCategoryMapping(8, TorznabCatType.PC, "Programe");
caps.Categories.AddCategoryMapping(28, TorznabCatType.MoviesForeign, "RO Dubbed");
caps.Categories.AddCategoryMapping(28, TorznabCatType.TVForeign, "RO Dubbed");
caps.Categories.AddCategoryMapping(31, TorznabCatType.TVForeign, "K-Drama");
caps.Categories.AddCategoryMapping(27, TorznabCatType.TVUHD, "Seriale 4K");
caps.Categories.AddCategoryMapping(21, TorznabCatType.TVHD, "Seriale HD");
caps.Categories.AddCategoryMapping(23, TorznabCatType.TVSD, "Seriale SD");
caps.Categories.AddCategoryMapping(13, TorznabCatType.TVSport, "Sport");
caps.Categories.AddCategoryMapping(12, TorznabCatType.AudioVideo, "Videoclip");
caps.Categories.AddCategoryMapping(7, TorznabCatType.XXX, "XXX");
return caps;
}

View File

@@ -163,15 +163,18 @@ namespace Jackett.Common.Indexers.Definitions
{
throw new Exception("Error, the Download link at the requested path does not exist.");
}
var wmDoc = new HtmlParser().ParseDocument(wmPage.ContentString);
var wmHtmlParser = new HtmlParser();
var wmDoc = await wmHtmlParser.ParseDocumentAsync(wmPage.ContentString);
var enlacitoUrl = wmDoc.QuerySelector(".app-message a:not(.buttonPassword)")?.GetAttribute("href");
var enlacitoPage = await RequestWithCookiesAndRetryAsync(enlacitoUrl, referer: SiteLink);
var enlacitoDoc = new HtmlParser().ParseDocument(enlacitoPage.ContentString);
var enlacitoHtmlParser = new HtmlParser();
var enlacitoDoc = await enlacitoHtmlParser.ParseDocumentAsync(enlacitoPage.ContentString);
var enlacitoFormUrl = enlacitoDoc.QuerySelector("form").GetAttribute("action");
var enlacitoFormLinkser = enlacitoDoc.QuerySelector("input[name=\"linkser\"]").GetAttribute("value");
var body = new Dictionary<string, string>
{
{ "linkser", enlacitoFormLinkser }
@@ -182,7 +185,7 @@ namespace Jackett.Common.Indexers.Definitions
var linkOut = v.Groups[1].ToString();
var slink = Encoding.UTF8.GetString(Convert.FromBase64String(linkOut));
var ulink = OpenSSLDecrypt(slink, TorrentLinkEncryptionKey);
var ulink = await OpenSSLDecryptAsync(slink, TorrentLinkEncryptionKey);
var result = await RequestWithCookiesAndRetryAsync(ulink);
return result.ContentBytes;
@@ -463,7 +466,7 @@ namespace Jackett.Common.Indexers.Definitions
}
// Thanks to https://stackoverflow.com/a/5454692/2078070 !!!
private string OpenSSLDecrypt(string encrypted, string passphrase)
private async Task<string> OpenSSLDecryptAsync(string encrypted, string passphrase)
{
// base 64 decode
var encryptedBytesWithSalt = Convert.FromBase64String(encrypted);
@@ -477,7 +480,7 @@ namespace Jackett.Common.Indexers.Definitions
// get key and iv
DeriveKeyAndIV(passphrase, salt, out var key, out var iv);
return DecryptStringFromBytesAes(encryptedBytes, key, iv);
return await DecryptStringFromBytesAesAsync(encryptedBytes, key, iv);
}
private void DeriveKeyAndIV(string passphrase, byte[] salt, out byte[] key, out byte[] iv)
@@ -518,7 +521,7 @@ namespace Jackett.Common.Indexers.Definitions
md5 = null;
}
private string DecryptStringFromBytesAes(byte[] cipherText, byte[] key, byte[] iv)
private static async Task<string> DecryptStringFromBytesAesAsync(byte[] cipherText, byte[] key, byte[] iv)
{
if (cipherText == null || cipherText.Length <= 0)
{
@@ -535,44 +538,17 @@ namespace Jackett.Common.Indexers.Definitions
throw new ArgumentNullException(nameof(iv));
}
// Declare the RijndaelManaged object
// used to decrypt the data.
RijndaelManaged aesAlg = null;
using var aesAlg = Aes.Create();
aesAlg.Key = key;
aesAlg.IV = iv;
// Declare the string used to hold
// the decrypted text.
string plaintext;
var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
try
{
// Create a RijndaelManaged object
// with the specified key and IV.
aesAlg = new RijndaelManaged { Mode = CipherMode.CBC, KeySize = 256, BlockSize = 128, Key = key, IV = iv };
using var msDecrypt = new MemoryStream(cipherText);
using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
using var srDecrypt = new StreamReader(csDecrypt);
// Create a decrytor to perform the stream transform.
var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for decryption.
using (var msDecrypt = new MemoryStream(cipherText))
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
srDecrypt.Close();
}
}
}
}
finally
{
// Clear the RijndaelManaged object.
aesAlg?.Clear();
}
return plaintext;
return await srDecrypt.ReadToEndAsync();
}
}

View File

@@ -4,12 +4,11 @@ using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using AngleSharp.Html.Parser;
using Jackett.Common.Extensions;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
@@ -253,11 +252,13 @@ namespace Jackett.Common.Indexers.Definitions
if (string.IsNullOrWhiteSpace(sessionId))
throw new ExceptionWithConfigData("Error getting the Session ID", configData);
await Task.Delay(3000);
// The second page send the login with the hash
// The hash is reverse engineering from https://www.zonaq.pw/retorno/2/smf/Themes/smf_ZQ/scripts/script.js
// doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id);
Thread.Sleep(3000);
var hashPassword = Sha1Hash(Sha1Hash(configData.Username.Value.ToLower() + configData.Password.Value) + sessionId);
var hashPassword = $"{(configData.Username.Value.ToLowerInvariant() + configData.Password.Value).SHA1Hash()}{sessionId}".SHA1Hash();
var pairs = new Dictionary<string, string> {
{ "user", configData.Username.Value },
{ "passwrd", configData.Password.Value },
@@ -288,11 +289,5 @@ namespace Jackett.Common.Indexers.Definitions
Thread.Sleep(3000);
await RequestWithCookiesAsync(Login4Url);
}
private static string Sha1Hash(string input)
{
var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
return string.Concat(hash.Select(b => b.ToString("x2")));
}
}
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFrameworks>netstandard2.0;net9.0</TargetFrameworks>
<Version>0.0.0</Version>
<LangVersion>9</LangVersion>
<NoWarn />
@@ -10,7 +10,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AngleSharp" Version="1.3.0" />
<PackageReference Include="AngleSharp" Version="1.3.1" />
<PackageReference Include="AngleSharp.Xml" Version="1.0.0" />
<PackageReference Include="Autofac" Version="8.0.0" />
<PackageReference Include="BencodeNET" Version="4.0.0" />
@@ -23,12 +23,12 @@
<PackageReference Include="MimeMapping" Version="1.0.1.50" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="Polly" Version="8.6.3" />
<PackageReference Include="Polly" Version="8.6.4" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="9.0.9" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.9" />
<PackageReference Include="System.Text.Json" Version="9.0.9" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="9.0.11" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.11" />
<PackageReference Include="System.Text.Json" Version="9.0.11" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>

View File

@@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using Jackett.Common.Extensions;
using Jackett.Common.Indexers;
using Jackett.Common.Models;
using Jackett.Common.Models.Config;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Newtonsoft.Json;
using NLog;
@@ -36,8 +34,7 @@ namespace Jackett.Common.Services
{
private readonly Logger _logger;
private readonly ServerConfig _serverConfig;
private readonly SHA256Managed _sha256 = new SHA256Managed();
private readonly Dictionary<string, TrackerCache> _cache = new Dictionary<string, TrackerCache>();
private readonly Dictionary<string, TrackerCache> _cache = new();
public CacheService(Logger logger, ServerConfig serverConfig)
{
@@ -236,11 +233,11 @@ namespace Jackett.Common.Services
}
}
private string GetQueryHash(TorznabQuery query)
private static string GetQueryHash(TorznabQuery query)
{
var json = GetSerializedQuery(query);
// Compute the hash
return BitConverter.ToString(_sha256.ComputeHash(Encoding.UTF8.GetBytes(json)));
return json.SHA256Hash();
}
private static string GetSerializedQuery(TorznabQuery query)

View File

@@ -51,7 +51,8 @@ namespace Jackett.Common.Services
if (!Directory.Exists(GetAppDataFolder()))
{
var dir = Directory.CreateDirectory(GetAppDataFolder());
if (Environment.OSVersion.Platform != PlatformID.Unix)
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var access = dir.GetAccessControl();
var directorySecurity = new DirectorySecurity(GetAppDataFolder(), AccessControlSections.All);
@@ -126,7 +127,7 @@ namespace Jackett.Common.Services
if (!Directory.Exists(destFolder))
{
var dir = Directory.CreateDirectory(destFolder);
if (Environment.OSVersion.Platform != PlatformID.Unix)
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var directorySecurity = new DirectorySecurity(destFolder, AccessControlSections.All);
directorySecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));
@@ -137,7 +138,7 @@ namespace Jackett.Common.Services
{
File.Copy(file, destPath);
// The old files were created when running as admin so make sure they are editable by normal users / services.
if (Environment.OSVersion.Platform != PlatformID.Unix)
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var fileInfo = new FileInfo(destFolder);
var fileSecurity = new FileSecurity(destPath, AccessControlSections.All);

View File

@@ -74,8 +74,6 @@ namespace Jackett.Common.Services
}
}
private bool AcceptCert(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true;
private async Task CheckForUpdates()
{
logger.Info($"Checking for updates... Jackett variant: {variant}");
@@ -180,14 +178,7 @@ namespace Jackett.Common.Services
}
catch (Exception e)
{
logger.Error($"Error checking for updates.\n{e}");
}
finally
{
if (!isWindows)
{
System.Net.ServicePointManager.ServerCertificateValidationCallback -= AcceptCert;
}
logger.Error(e, $"Error checking for updates.\n{e}");
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Versioning;
using System.ServiceProcess;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
@@ -9,6 +10,9 @@ using NLog;
namespace Jackett.Common.Services
{
#if NET5_0_OR_GREATER
[SupportedOSPlatform("windows")]
#endif
public class WindowsServiceConfigService : IServiceConfigService
{
private const string NAME = "Jackett";

View File

@@ -29,8 +29,13 @@ namespace Jackett.Common.Utils.Clients
}
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
public static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
public bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (serverConfig.RuntimeSettings.IgnoreSslErrors == true)
{
return true;
}
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;
@@ -51,24 +56,11 @@ namespace Jackett.Common.Utils.Clients
public override void SetTimeout(int seconds) => ClientTimeout = seconds;
public override void Init()
{
base.Init();
// custom handler for our own internal certificates
if (serverConfig.RuntimeSettings.IgnoreSslErrors == true)
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
else
ServicePointManager.ServerCertificateValidationCallback += ValidateCertificate;
}
protected override async Task<WebResult> Run(WebRequest webRequest)
{
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
var cookies = new CookieContainer
{
PerDomainCapacity = 100 // By default only 20 cookies are allowed per domain
PerDomainCapacity = 100 // By default, only 20 cookies are allowed per domain
};
if (!string.IsNullOrWhiteSpace(webRequest.Cookies))
{
@@ -86,14 +78,17 @@ namespace Jackett.Common.Utils.Clients
clearanceHandlr.ProxyUrl = serverConfig.GetProxyUrl(false);
clearanceHandlr.ProxyUsername = serverConfig.ProxyUsername;
clearanceHandlr.ProxyPassword = serverConfig.ProxyPassword;
using (var clientHandlr = new HttpClientHandler
{
CookieContainer = cookies,
AllowAutoRedirect = false, // Do not use this - Bugs ahoy! Lost cookies and more.
UseCookies = true,
Proxy = webProxy,
UseProxy = (webProxy != null),
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
UseProxy = webProxy != null,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
MaxConnectionsPerServer = 20,
ServerCertificateCustomValidationCallback = ValidateCertificate,
})
{
clearanceHandlr.InnerHandler = clientHandlr;

View File

@@ -33,14 +33,19 @@ namespace Jackett.Common.Utils.Clients
{
cookies = new CookieContainer
{
PerDomainCapacity = 100 // By default only 20 cookies are allowed per domain
PerDomainCapacity = 100 // By default, only 20 cookies are allowed per domain
};
CreateClient();
}
[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
public static bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
public bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (serverConfig.RuntimeSettings.IgnoreSslErrors == true)
{
return true;
}
var hash = certificate.GetCertHashString();
trustedCertificates.TryGetValue(hash, out var hosts);
@@ -70,16 +75,12 @@ namespace Jackett.Common.Utils.Clients
AllowAutoRedirect = false, // Do not use this - Bugs ahoy! Lost cookies and more.
UseCookies = true,
Proxy = webProxy,
UseProxy = (webProxy != null),
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
UseProxy = webProxy != null,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
MaxConnectionsPerServer = 20,
ServerCertificateCustomValidationCallback = ValidateCertificate,
};
// custom certificate validation handler (netcore version)
if (serverConfig.RuntimeSettings.IgnoreSslErrors == true)
clientHandlr.ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
else
clientHandlr.ServerCertificateCustomValidationCallback = ValidateCertificate;
clearanceHandlr.InnerHandler = clientHandlr;
client = new HttpClient(clearanceHandlr);
@@ -103,13 +104,6 @@ namespace Jackett.Common.Utils.Clients
client.Timeout = TimeSpan.FromSeconds(ClientTimeout);
}
public override void Init()
{
base.Init();
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
}
protected override async Task<WebResult> Run(WebRequest webRequest)
{
var request = new HttpRequestMessage();

View File

@@ -220,11 +220,7 @@ namespace Jackett.Common.Utils.Clients
return result;
}
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
protected virtual async Task<WebResult> Run(WebRequest webRequest) => throw new NotImplementedException();
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
public virtual void Init() => ServicePointManager.DefaultConnectionLimit = 1000;
protected virtual Task<WebResult> Run(WebRequest webRequest) => throw new NotImplementedException();
public virtual void OnCompleted() => throw new NotImplementedException();

View File

@@ -1,4 +1,5 @@
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using Jackett.Common.Utils.Clients;
@@ -75,7 +76,11 @@ namespace Jackett.Common.Utils
public static bool IsUserAdministrator()
{
//bool value to hold our return value
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return false;
}
bool isAdmin;
try
{

View File

@@ -1,104 +0,0 @@
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace Jackett.Common.Utils
{
public static class StringCipher
{
// This constant is used to determine the keysize of the encryption algorithm in bits.
// We divide this by 8 within the code below to get the equivalent number of bytes.
private const int Keysize = 256;
// This constant determines the number of iterations for the password bytes generation function.
private const int DerivationIterations = 1000;
public static string Encrypt(string plainText, string passPhrase)
{
// Salt and IV is randomly generated each time, but is preprended to encrypted cipher text
// so that the same Salt and IV values can be used when decrypting.
var saltStringBytes = Generate256BitsOfRandomEntropy();
var ivStringBytes = Generate256BitsOfRandomEntropy();
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
{
var keyBytes = password.GetBytes(Keysize / 8);
using (var symmetricKey = new RijndaelManaged())
{
symmetricKey.BlockSize = 256;
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.Padding = PaddingMode.PKCS7;
using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
{
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
// Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes.
var cipherTextBytes = saltStringBytes;
cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
memoryStream.Close();
cryptoStream.Close();
return Convert.ToBase64String(cipherTextBytes);
}
}
}
}
}
}
public static string Decrypt(string cipherText, string passPhrase)
{
// Get the complete stream of bytes that represent:
// [32 bytes of Salt] + [32 bytes of IV] + [n bytes of CipherText]
var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
// Get the saltbytes by extracting the first 32 bytes from the supplied cipherText bytes.
var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray();
// Get the IV bytes by extracting the next 32 bytes from the supplied cipherText bytes.
var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray();
// Get the actual cipher text bytes by removing the first 64 bytes from the cipherText string.
var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray();
using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
{
var keyBytes = password.GetBytes(Keysize / 8);
using (var symmetricKey = new RijndaelManaged())
{
symmetricKey.BlockSize = 256;
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.Padding = PaddingMode.PKCS7;
using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes))
{
using (var memoryStream = new MemoryStream(cipherTextBytes))
{
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
var plainTextBytes = new byte[cipherTextBytes.Length];
var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close();
cryptoStream.Close();
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}
}
}
}
}
}
private static byte[] Generate256BitsOfRandomEntropy()
{
var randomBytes = new byte[32]; // 32 Bytes will give us 256 bits.
using (var rngCsp = new RNGCryptoServiceProvider())
{
// Fill the array with cryptographically secure random bytes.
rngCsp.GetBytes(randomBytes);
}
return randomBytes;
}
}
}

View File

@@ -189,16 +189,11 @@ namespace Jackett.Common.Utils
{
var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
var randBytes = new byte[length];
using (var rngCsp = new RNGCryptoServiceProvider())
{
rngCsp.GetBytes(randBytes);
var key = "";
foreach (var b in randBytes)
{
key += chars[b % chars.Length];
}
return key;
}
using var rngCsp = RandomNumberGenerator.Create();
rngCsp.GetBytes(randBytes);
return randBytes.Aggregate(string.Empty, (current, b) => current + chars[b % chars.Length]);
}
public static IEnumerable<int> AllIndexesOf(this string source, char value)

View File

@@ -35,9 +35,9 @@
<!-- Conditionally obtain references for the .NET 9.0 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.9" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.9" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="9.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.11" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.11" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="9.0.11" />
</ItemGroup>
<!-- Conditionally obtain references for the .NET471 target -->
@@ -59,8 +59,8 @@
<PackageReference Include="Mono.Posix" Version="7.1.0-final.1.21458.1" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.4.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="9.0.9" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.9" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="9.0.11" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.11" />
</ItemGroup>
<ItemGroup>

View File

@@ -29,9 +29,7 @@ namespace Jackett.Server.Services
return null;
var ue = new UnicodeEncoding();
#pragma warning disable SYSLIB0021
var hashString = new SHA512Managed();
#pragma warning restore SYSLIB0021
var hashString = SHA512.Create();
// Append key as salt
input += _serverConfig.APIKey;

View File

@@ -341,7 +341,6 @@ namespace Jackett.Server.Services
// Load indexers
indexerService.InitIndexers(configService.GetCardigannDefinitionsFolders());
client.Init();
updater.CleanupTempDir();
updater.CheckUpdaterLock();

View File

@@ -68,6 +68,7 @@ namespace Jackett.Server
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.16.0.0"), 12));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.0.0"), 16));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("fc00::"), 7));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("fe80::"), 10));
});
#if NET471

View File

@@ -25,14 +25,14 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" Version="6.12.1" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="9.0.9" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="9.0.11" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.10.4" />
<PackageReference Include="MSTest.TestFramework" Version="3.10.4" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit.ConsoleRunner" Version="3.17.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.9" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.11" />
</ItemGroup>
<ItemGroup>

View File

@@ -48,9 +48,5 @@ namespace Jackett.Test.TestHelpers
});
throw new Exception($"You have to mock the URL {request.Url} with RegisterRequestCallback");
}
public override void Init()
{
}
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using CommandLine;
using CommandLine.Text;
using Jackett.Common.Models.Config;
@@ -15,7 +16,6 @@ namespace Jackett.Updater
public class Program
{
private IProcessService processService;
private IServiceConfigService windowsService;
public static Logger logger;
private Variants.JackettVariant variant = Variants.JackettVariant.NotFound;
@@ -27,7 +27,7 @@ namespace Jackett.Updater
private void Run(string[] args)
{
var runtimeSettings = new RuntimeSettings()
var runtimeSettings = new RuntimeSettings
{
CustomLogFileName = "updater.txt"
};
@@ -42,7 +42,8 @@ namespace Jackett.Updater
variant = variants.GetVariant();
logger.Info("Jackett variant: " + variant.ToString());
var isWindows = Environment.OSVersion.Platform == PlatformID.Win32NT;
var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
if (isWindows)
{
//The updater starts before Jackett closes
@@ -51,18 +52,13 @@ namespace Jackett.Updater
}
processService = new ProcessService(logger);
windowsService = new WindowsServiceConfigService(processService, logger);
var commandLineParser = new Parser(settings => settings.CaseSensitive = false);
try
{
var optionsResult = commandLineParser.ParseArguments<UpdaterConsoleOptions>(args);
optionsResult.WithParsed(options =>
{
ProcessUpdate(options);
}
);
optionsResult.WithParsed(ProcessUpdate);
optionsResult.WithNotParsed(errors =>
{
logger.Error(HelpText.AutoBuild(optionsResult));
@@ -135,10 +131,10 @@ namespace Jackett.Updater
if (options.KillPids != null)
{
var pidsStr = options.KillPids.Split(',').Where(pid => !string.IsNullOrWhiteSpace(pid)).ToArray();
pids = Array.ConvertAll(pidsStr, pid => int.Parse(pid));
pids = Array.ConvertAll(pidsStr, int.Parse);
}
var isWindows = Environment.OSVersion.Platform == PlatformID.Win32NT;
var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
var trayRunning = false;
var trayProcesses = Process.GetProcessesByName("JackettTray");
if (isWindows)
@@ -508,6 +504,7 @@ namespace Jackett.Updater
"Definitions/idopeclone.yml",
"Definitions/ihdbits.yml",
"Definitions/ilcorsaroverde.yml",
"Definitions/ilolicon.yml",
"Definitions/iloveclassics.yml",
"Definitions/infinityt.yml",
"Definitions/inperil.yml",
@@ -609,6 +606,7 @@ namespace Jackett.Updater
"Definitions/onlyscene.yml",
"Definitions/ostwiki.yml",
"Definitions/oxtorrent.yml",
"Definitions/oxtorrent-vip.yml",
"Definitions/p2pelite.yml",
"Definitions/pandahd.yml",
"Definitions/parabellumhd.yml",
@@ -735,6 +733,7 @@ namespace Jackett.Updater
"Definitions/theleachzone.yml", // switch to *-API #11185
"Definitions/the-madhouse.yml",
"Definitions/themoviecave.yml",
"Definitions/thepiratedship.yml",
"Definitions/therebels-api.yml",
"Definitions/theresurrection.yml",
"Definitions/thesceneplace.yml",
@@ -760,6 +759,7 @@ namespace Jackett.Updater
"Definitions/torrent-paradise-ml.yml",
"Definitions/torrent4you.yml",
"Definitions/torrentbomb.yml",
"Definitions/torrentcontrol.yml",
"Definitions/torrentcouch.yml",
"Definitions/torrentdb.yml",
"Definitions/torrentfactory.yml",
@@ -779,7 +779,9 @@ namespace Jackett.Updater
"Definitions/torrentseed.yml", // renamed to latinop2p #9065
"Definitions/torrentseeds.yml",
"Definitions/torrentseeds-api.yml",
"Definitions/torrentsir.yml",
"Definitions/torrentsmd.yml",
"Definitions/torrentssg.yml",
"Definitions/torrent-town.yml",
"Definitions/torrentslocal.yml",
"Definitions/torrentsurf.yml", // renamed xtremebytes #9951
@@ -813,6 +815,7 @@ namespace Jackett.Updater
"Definitions/twisted-music.yml",
"Definitions/u-torrents.yml",
"Definitions/uhd-heaven.yml",
"Definitions/uhdtorrent.yml",
"Definitions/ultimategamerclub.yml",
"Definitions/ultra-hd.yml",
"Definitions/ultrahdclub.yml",
@@ -890,7 +893,9 @@ namespace Jackett.Updater
// kill pids after the update on UNIX
if (!isWindows)
{
KillPids(pids);
}
if (!options.NoRestart)
{
@@ -906,6 +911,8 @@ namespace Jackett.Updater
logger.Info("Starting Tray: " + startInfo.FileName + " " + startInfo.Arguments);
Process.Start(startInfo);
var windowsService = new WindowsServiceConfigService(processService, logger);
if (!windowsService.ServiceExists())
{
//User was running the tray icon, but not using the Windows service, starting Tray icon will start JackettConsole as well
@@ -913,10 +920,12 @@ namespace Jackett.Updater
}
}
if (string.Equals(options.Type, "WindowsService", StringComparison.OrdinalIgnoreCase))
if (isWindows && string.Equals(options.Type, "WindowsService", StringComparison.OrdinalIgnoreCase))
{
logger.Info("Starting Windows service");
var windowsService = new WindowsServiceConfigService(processService, logger);
try
{
windowsService.Start();