Compare commits

...

123 Commits

Author SHA1 Message Date
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
Garfield69
7c4a08c7cc dontorrent: new tld 2025-10-31 18:38:41 +13:00
jackettbot[bot]
547dcc3bde Update rudub 2025-10-31 01:29:09 +00:00
Garfield69
4ca10e45e5 pterclub: switch domains com -> net. resolves #7950 2025-10-31 13:37:57 +13:00
ilike2burnthing
13458a16eb core: add IPv6 ULAs to known networks
follow up to 23eb6ff754
2025-10-30 18:01:37 +00:00
Garfield69
f779b3ac80 uhdtorrent: fix cats 2025-10-31 06:23:02 +13:00
Garfield69
d85a2f84f3 r4e: new cat 2025-10-31 06:22:42 +13:00
Garfield69
8acdcfb935 huntorrent: update cats 2025-10-31 06:22:19 +13:00
Garfield69
aecfe64819 torrentqq: bump domains 2025-10-31 05:31:52 +13:00
jackettbot[bot]
47113d3037 Update rudub 2025-10-30 01:29:31 +00:00
Bogdan
23eb6ff754 core: use known networks in RFC 1918 ranges
Co-authored-by: markus101 <mark@mcdowall.ca>
2025-10-30 01:15:55 +02:00
Garfield69
1d031c5ab1 huntorrent: new selectors 2025-10-30 07:02:06 +13:00
Garfield69
e497312bc0 cdfile: login now uses api/challenge so switching to cookie method
and unlike other nexus that use the api, I also need UA for it to work %-/
2025-10-30 07:01:47 +13:00
Garfield69
686ff21061 torrenttip: bump domain 2025-10-30 05:29:53 +13:00
Garfield69
f330c9c0d7 torrentsome: bump domain 2025-10-30 05:29:42 +13:00
jackettbot[bot]
2e4c88a577 Update rudub 2025-10-29 01:29:29 +00:00
Garfield69
1fd58faac1 noname-club: update cats 2025-10-29 06:54:20 +13:00
Garfield69
99255b7ce9 matrix: new selectors 2025-10-29 06:07:57 +13:00
Garfield69
829368c080 ebooks-shares: new cat 2025-10-29 06:07:29 +13:00
Garfield69
84146a9c2a Update magnetcat.yml 2025-10-29 05:52:35 +13:00
Garfield69
479d5147dc magnetcat: bump alternate domains 2025-10-29 05:46:05 +13:00
ilike2burnthing
d35c767769 uhdtorrent: remove silver.gif comment
because of course they add some right after we publish :P
2025-10-28 10:03:38 +00:00
jackettbot[bot]
89109259c5 Update rudub 2025-10-28 01:29:01 +00:00
Garfield69
7a391b598f lostfilm: fix for #16263 2025-10-28 07:53:55 +13:00
Garfield69
7910b8dfea zetorrents: new domain 2025-10-28 05:41:25 +13:00
Garfield69
da88b95496 magnetcat: bump alternate domains 2025-10-28 05:41:07 +13:00
Garfield69
8b809e8edc bitturk: drop redundant search parm 2025-10-27 21:41:44 +13:00
Garfield69
6d95e354aa add uhdtorrent a Turkish private site. resolves #16262 2025-10-27 21:41:10 +13:00
jackettbot[bot]
1657f12bed Update rudub 2025-10-27 01:29:39 +00:00
ilike2burnthing
4038a0d430 shareisland-api: update cats
https://github.com/Prowlarr/Indexers/pull/676
2025-10-26 22:22:28 +00:00
Garfield69
a8a8701ab0 Update hellenic-hd-api.yml 2025-10-27 09:51:18 +13:00
Garfield69
52d432be52 add hellenic-hd a Greek private site. resolves #16261 2025-10-27 07:48:44 +13:00
Garfield69
0518d30f9d uztracker: new cat 2025-10-27 06:00:53 +13:00
jackettbot[bot]
c66e4be3b7 Update rudub 2025-10-26 01:29:20 +00:00
sirelgit
82931b31cf Add HDRTorrent a public Brazillian site (resolves #16100) (#16257) 2025-10-26 08:22:03 +13:00
Garfield69
1bc41f396e abtorrents: update cats 2025-10-26 07:06:13 +13:00
Garfield69
6b4ff3a368 siambit: new selectors
also the site appears to be pay2dl as all torrents not have a VIP only tag
added posters
2025-10-26 06:26:15 +13:00
82 changed files with 1893 additions and 1546 deletions

View File

@@ -40,8 +40,8 @@ jobs:
- 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.pics" >> $GITHUB_ENV
echo "PREVIOUS_RUDUB_DOMAIN=$(date --date='yesterday' +'%b%d' | tr '[:upper:]' '[:lower:]').rudub.pics" >> $GITHUB_ENV
- name: Update rudub definition
uses: mikefarah/yq@master

View File

@@ -70,6 +70,7 @@ Prior versions of Jackett are no longer supported.
* Frozen Layer
* GamesTorrents
* GTorrent.pro
* HDRTorrent
* Idope
* ilCorSaRoNeRo
* Internet Archive (archive.org)
@@ -82,6 +83,7 @@ Prior versions of Jackett are no longer supported.
* Mac Torrents Download
* Magnet Cat
* MagnetDownload
* Magnetz
* MegaPeer
* MejorTorrent
* Mikan
@@ -95,7 +97,6 @@ Prior versions of Jackett are no longer supported.
* Nyaa.si
* OneJAV
* OxTorrent
* OxTorrent-vip
* OpenSharing
* PC-torrent
* Pirate's Paradise
@@ -124,7 +125,6 @@ Prior versions of Jackett are no longer supported.
* torrent.by
* torrent-pirat
* Torrent9
* TorrentControl
* TorrentDosFilmes
* TorrentDownload
* TorrentGalaxyClone
@@ -132,9 +132,7 @@ Prior versions of Jackett are no longer supported.
* TorrentProject2
* TorrentQQ (토렌트큐큐)
* Torrents.csv
* TorrentSir (토렌트썰)
* Torrentsome (토렌트썸)
* torrentssg (토렌트쓱)
* Torrenttip (토렌트팁)
* TrahT
* U3C3
@@ -389,17 +387,18 @@ Prior versions of Jackett are no longer supported.
* HDU
* Hebits (HB)
* HellasHut
* HELLENIC-HD
* HHanClub
* HHD
* HomePornTorrents (HPT)
* 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)
@@ -473,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]](#)
@@ -523,11 +523,12 @@ 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
* Shazbat
* SiamBIT
* SiamBIT [PAY2DL]
* SkipTheCommercials
* SnowPT (SSPT)
* SoulVoice (聆音Club) [![(invite needed)][inviteneeded]](#)
@@ -561,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]](#)
@@ -831,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.10 2025-10-30

View File

@@ -15,13 +15,13 @@ legacylinks:
caps:
categorymappings:
- {id: 10, cat: Audio/Audiobook, desc: "Action/Adventure"}
- {id: 80, cat: Audio/Audiobook, desc: "Adult/Erotica"}
- {id: 20, cat: Audio/Audiobook, desc: "Biography/Memoirs"}
- {id: 10, cat: Audio/Audiobook, desc: "Action & Adventure"}
- {id: 80, cat: Audio/Audiobook, desc: "Adult & Erotica"}
- {id: 20, cat: Audio/Audiobook, desc: "Biography & Memoirs"}
- {id: 30, cat: Audio/Audiobook, desc: "Business"}
- {id: 40, cat: Audio/Audiobook, desc: "Childrens"}
- {id: 70, cat: Audio/Audiobook, desc: "Computers"}
- {id: 260, cat: Audio/Audiobook, desc: "Crime/Thriller"}
- {id: 260, cat: Audio/Audiobook, desc: "Crime & Thriller"}
- {id: 90, cat: Audio/Audiobook, desc: "Fantasy-General"}
- {id: 100, cat: Audio/Audiobook, desc: "Fantasy-Youth"}
- {id: 130, cat: Audio/Audiobook, desc: "General Fiction"}
@@ -32,57 +32,55 @@ caps:
- {id: 170, cat: Audio/Audiobook, desc: "Literature"}
- {id: 175, cat: Audio/Audiobook, desc: "LitRPG"}
- {id: 180, cat: Audio/Audiobook, desc: "Mystery"}
- {id: 190, cat: Audio/Audiobook, desc: "Non-Fiction"}
- {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: 205, cat: Audio/Audiobook, desc: "Reference & Educational"}
- {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"}
- {id: 230, cat: Audio/Audiobook, desc: "Science Fiction"}
- {id: 250, cat: Audio/Audiobook, desc: "Self Improvement"}
- {id: 265, cat: Audio/Audiobook, desc: "Sports/Fitness"}
- {id: 265, cat: Audio/Audiobook, desc: "Sports & Fitness"}
- {id: 270, cat: Audio/Audiobook, desc: "Suspense"}
- {id: 280, cat: Audio/Audiobook, desc: "Talk Radio"}
- {id: 285, cat: Audio/Audiobook, desc: "Travel"}
- {id: 290, cat: Audio/Audiobook, desc: "Urban Fantasy/Paranormal"}
- {id: 290, cat: Audio/Audiobook, desc: "Urban Fantasy & Paranormal"}
- {id: 300, cat: Audio/Audiobook, desc: "Western"}
- {id: 310, cat: Audio/Audiobook, desc: "Young Adult"}
- {id: 400, cat: Books/EBook, desc: "[E] Action/Adventure"}
- {id: 410, cat: Books/EBook, desc: "[E] Adult/Erotica"}
- {id: 400, cat: Books/EBook, desc: "[E] Action & Adventure"}
- {id: 410, cat: Books/EBook, desc: "[E] Adult & Erotica"}
- {id: 420, cat: Books/EBook, desc: "[E] Arts & Crafts (Hobbies)"}
- {id: 430, cat: Books/EBook, desc: "[E] Biography/Memoirs"}
- {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"}
- {id: 470, cat: Books/EBook, desc: "[E] Crime & Thriller"}
- {id: 480, cat: Books/EBook, desc: "[E] Fantasy"}
- {id: 490, cat: Books/EBook, desc: "[E] Fantasy-Youth"}
- {id: 500, cat: Books/EBook, desc: "[E] General Fiction"}
- {id: 510, cat: Books/EBook, desc: "[E] Historical Fiction"}
- {id: 520, cat: Books/EBook, desc: "[E] History/Documentary"}
- {id: 520, cat: Books/EBook, desc: "[E] History & Documentary"}
- {id: 530, cat: Books/EBook, desc: "[E] Horror"}
- {id: 540, cat: Books/EBook, desc: "[E] Humor (Comedy)"}
- {id: 560, cat: Books/EBook, desc: "[E] Literary Fiction"}
- {id: 565, cat: Books/EBook, desc: "[E] LitRPG"}
- {id: 570, cat: Books/EBook, desc: "[E] Mystery"}
- {id: 580, cat: Books/EBook, desc: "[E] Non-Fiction"}
- {id: 590, cat: Books/EBook, desc: "[E] Paranormal Romance"}
- {id: 600, cat: Books/EBook, desc: "[E] Reference/Educational"}
- {id: 610, cat: Books/EBook, desc: "[E] Religion and Spirituality"}
- {id: 600, cat: Books/EBook, desc: "[E] Reference & Educational"}
- {id: 610, cat: Books/EBook, desc: "[E] Religion & Spirituality"}
- {id: 620, cat: Books/EBook, desc: "[E] Romance"}
- {id: 630, cat: Books/EBook, desc: "[E] Sci-Fi"}
- {id: 640, cat: Books/EBook, desc: "[E] Sci-Fi/Apocalyptic"}
- {id: 640, cat: Books/EBook, desc: "[E] Sci-Fi & Apocalyptic"}
- {id: 645, cat: Books/EBook, desc: "[E] Science"}
- {id: 650, cat: Books/EBook, desc: "[E] Self-Help"}
- {id: 660, cat: Books/EBook, desc: "[E] Sports/Fitness"}
- {id: 660, cat: Books/EBook, desc: "[E] Sports & Fitness"}
- {id: 665, cat: Books/EBook, desc: "[E] Suspense"}
- {id: 670, cat: Books/EBook, desc: "[E] Travel"}
- {id: 690, cat: Books/EBook, desc: "[E] Urban Fantasy/Paranormal"}
- {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]
@@ -134,7 +132,7 @@ search:
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
categorydesc:
selector: div[data-tid] > img
selector: img[src^="./pic/caticons"]
attribute: alt
title:
selector: a[href^="details.php?id="]

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

@@ -108,7 +108,6 @@ search:
keywords: "{{ .Keywords }}"
# name, description, both, uploader
search_type: name
searchin: title
"sortOptions[sortBy]": "{{ .Config.sort }}"
"sortOptions[sortOrder]": "{{ .Config.type }}"
# Drop error trap to stop Sonarr disabling indexer, see https://github.com/Jackett/Jackett/issues/1415

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

@@ -27,19 +27,16 @@ caps:
music-search: [q]
settings:
- name: username
- name: cookie
type: text
label: Username
- name: password
type: password
label: Password
- name: 2facode
label: Cookie
- name: info_cookie
type: info_cookie
- name: useragent
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 cyanbug Web Site. Otherwise just leave it empty."
label: User-Agent
- name: info_useragent
type: info_useragent
- name: freeleech
type: checkbox
label: Search freeleech only
@@ -70,26 +67,10 @@ settings:
default: "Account retention rules:<ol><li>Veteran User and above will be retained forever</li><li>Elite User 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 180 consecutive days</li><li>Users with a non-parked account will be deleted if they do not log in for 90 consecutive days</li><li>Users who have no traffic (i.e. upload/download data are both 0) will be deleted 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 }}"
logout: ""
securelogin: ""
ssl: yes
trackerssl: yes
error:
- selector: td.embedded:has(h2:contains("失败"))
message:
selector: td.text
cookie: "{{ .Config.cookie }}"
test:
path: index.php
selector: a[href="logout.php"]
@@ -112,6 +93,9 @@ search:
type: "{{ .Config.type }}"
notnewword: 1
headers:
User-Agent: ["{{ .Config.useragent }}"]
rows:
selector: table.torrents > tbody > tr:has(table.torrentname)

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

@@ -67,6 +67,7 @@ caps:
- {id: 347, cat: Books/EBook, desc: "Medical"}
- {id: 348, cat: Books/EBook, desc: "Mathematics"}
- {id: 363, cat: Books/EBook, desc: "Sheet Music"}
- {id: 366, cat: Books/EBook, desc: "Astronomy"}
# Tech/Computers
- {id: 331, cat: Books/EBook, desc: "Electronics"}
- {id: 336, cat: Books/EBook, desc: "Video Games"}
@@ -80,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"}
@@ -91,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

@@ -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.10 2025-10-30

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,190 @@
---
id: hellenic-hd-api
name: HELLENIC-HD (API)
description: "HELLENIC-HD is a GREEK Private Torrent Tracker for MOVIES / TV"
language: el-GR
type: private
encoding: UTF-8
links:
- https://hellenic-hd.cc/
caps:
categorymappings:
- {id: 1, cat: Movies, desc: "Movies"}
- {id: 2, cat: TV, desc: "TV"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tvdbid, tmdbid]
movie-search: [q, imdbid, tmdbid]
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://hellenic-hd.cc/\" target=\"_blank\">HELLENIC-HD</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: "Accounts that have not logged in for 60 days will be disabled, and may be deleted shortly afterwards."
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 14 days regardless of ratio
# minimumratio:
# text: 0.4
minimumseedtime:
# 14 days (as seconds = 14 x 24 x 60 x 60)
text: 1209600
# json UNIT3D 9.1.6

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,34 +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: 29, cat: Movies, desc: "Mese/ENG"}
- {id: 30, cat: Movies, desc: "Mese/HUN"}
- {id: 8, cat: TV/SD, desc: "Sorozat/ENG"}
- {id: 31, cat: TV/HD, desc: "Sorozat/HD/ENG"}
- {id: 9, cat: TV/HD, desc: "Sorozat/HD/HUN"}
- {id: 7, cat: TV/SD, desc: "Sorozat/HUN"}
- {id: 2, cat: Movies/SD, desc: "XviD/ENG"}
- {id: 1, cat: Movies/SD, desc: "XviD/HUN"}
- {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: 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: 26, cat: PC/Mobile-Other, desc: "Mobil"}
- {id: 20, cat: PC/ISO, desc: "Program/ISO"}
- {id: 21, cat: PC/0day, desc: "Program/RIP"}
- {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: 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]
@@ -49,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
@@ -93,29 +100,30 @@ 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[align="center"][cellpadding="5"] > tbody > tr[id^="torrent-main-"]
selector: table.torrent-table > tbody > tr[id^="torrent-main-"]
fields:
_id:
selector: a.download-link
attribute: data-id
category:
selector: a[href^="browse.php?cat="]
attribute: href
@@ -123,25 +131,21 @@ search:
- name: querystring
args: cat
title:
selector: a[href^="#details_tr_"]
attribute: title
filters:
- name: replace
args: ["Név: ", ""]
selector: a.torrent-title-link
details:
text: "details.php?id={{ .Result._id }}"
download:
selector: a.download-link
selector: a.torrent-title-link
attribute: href
filters:
- name: replace
args: ["please_wait=1&", ""]
- name: replace
args: ["&please_wait=1", ""]
args: ["&hit=1", ""]
download:
selector: a[href^="download.php?"]
attribute: href
genre:
selector: "span[style=\"font-size: 6pt; font-weight: bold;\"]"
selector: a[data-mufaj]
attribute: data-mufaj
description:
selector: td:nth-child(2) div:nth-child(2)
selector: div.torrent-subtitle
filters:
- name: append
args: "{{ if .Result.genre }}</br>{{ .Result.genre }}{{ else }}{{ end }}"
@@ -149,21 +153,23 @@ search:
selector: a[href*="imdb.com/title/tt"]
attribute: href
poster:
selector: a[href^="torrents_data/posters/"]
attribute: href
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) b
selector: a[data-size]
attribute: data-size
grabs:
selector: td:nth-last-child(3)
seeders:
selector: td:nth-last-child(2) a b
selector: td:nth-last-child(2)
leechers:
selector: td:nth-last-child(1)
downloadvolumefactor:

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

@@ -39,6 +39,7 @@ caps:
- {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

@@ -9,30 +9,28 @@ encoding: UTF-8
links:
- https://magnetcatcat.com/
- https://clmclm.com/
- https://www.8800508.xyz/
- https://www.8800509.xyz/
- https://www.8800510.xyz/
- https://www.8800511.xyz/
- https://www.8800519.xyz/
- https://www.8800521.xyz/
- https://www.8800522.xyz/
- https://www.8800523.xyz/
legacylinks:
- https://www.clm472.sbs/
- https://www.8800485.xyz
- https://www.8800481.xyz
- https://www.8800483.xyz
- https://www.8800486.xyz
- https://www.8800487.xyz
- https://www.8800492.xyz/
- https://www.8800493.xyz/
- https://www.8800494.xyz/
- https://www.8800490.xyz/
- https://www.8800498.xyz/
- https://www.8800497.xyz/
- https://www.8800499.xyz/
- https://www.8800500.xyz/
- https://www.8800503.xyz/
- https://www.8800504.xyz/
- https://www.8800505.xyz/
- https://www.8800506.xyz/
- https://www.8800507.xyz/
- https://www.8800508.xyz/
- https://www.8800509.xyz/
- https://www.8800510.xyz/
- https://www.8800511.xyz/
- 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:
q: "{{ 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

@@ -156,7 +156,7 @@ search:
img[src="/pic/categories/6.png"]: 44
# img[src="/pic/categories/6.png"]: 43
title:
selector: td:nth-child(2) > div > a
selector: a[onclick]
_id:
selector: a[onclick]
attribute: onclick
@@ -177,20 +177,20 @@ search:
selector: a[href*="imdb.com/title/tt"]
attribute: href
date:
selector: td:nth-child(3)
selector: td:nth-child(4)
filters:
- name: append
args: " +01:00" # CET
- name: dateparse
args: "yyyy-MM-ddHH:mm:ss zzz"
size:
selector: td:nth-child(4)
grabs:
selector: td:nth-child(5)
seeders:
grabs:
selector: td:nth-child(6)
leechers:
seeders:
selector: td:nth-child(7)
leechers:
selector: td:nth-child(8)
_verified:
selector: span.torrent-ok, span.torrent-unchecked
case:

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

@@ -326,13 +326,12 @@ caps:
- {id: 931, cat: Books, desc: " |- Собрания книг русскоязычных авторов"}
- {id: 1152, cat: Books, desc: " |- Собрания книг иностранных авторов"}
- {id: 455, cat: Books, desc: " |- Сатира, Юмор"}
- {id: 1153, cat: Books, desc: " |- Боевики"}
- {id: 453, cat: Books, desc: " |- Детективы"}
- {id: 453, cat: Books, desc: " |- Боевики, Детективы, Триллеры"}
- {id: 1063, cat: Books, desc: " |- Приключенческая проза "}
- {id: 452, cat: Books, desc: " |- Исторические книги"}
- {id: 449, cat: Books, desc: " |- Классика, Проза, Поэзия"}
- {id: 1063, cat: Books, desc: " |- Приключенческая литература"}
- {id: 452, cat: Books, desc: " |- Историческая проза, Мифы и Легенды"}
- {id: 451, cat: Books, desc: " |- Фантастика, Фэнтези"}
- {id: 449, cat: Books, desc: " |- Современная поэзия и проза"}
- {id: 1153, cat: Books, desc: " |- Классическая поэзия и проза"}
- {id: 1347, cat: Books, desc: "Книги вне издательств, самиздат (все жанры)"}
- {id: 482, cat: Books, desc: "Комиксы и Артбуки"}
- {id: 483, cat: Books, desc: " |- Комиксы на русском языке"}
@@ -450,6 +449,7 @@ caps:
- {id: 1356, cat: Audio, desc: " |- Alternative, Punk (Hi-Res)"}
- {id: 965, cat: Audio/Lossless, desc: " |- Alternative, Punk (Lossless)"}
- {id: 336, cat: Audio, desc: " |- Alternative, Punk"}
- {id: 1362, cat: Audio, desc: " |- Hard Rock (Hi Res)"}
- {id: 337, cat: Audio/Lossless, desc: " |- Hard Rock (Lossless)"}
- {id: 338, cat: Audio, desc: " |- Hard Rock"}
- {id: 1351, cat: Audio, desc: " |- Metal (Hi-Res)"}
@@ -459,6 +459,7 @@ caps:
- {id: 961, cat: Audio/Lossless, desc: " |- Русский Рок (Lossless)"}
- {id: 332, cat: Audio, desc: " |- Русский рок"}
- {id: 325, cat: Audio, desc: "Pop"}
- {id: 1354, cat: Audio, desc: " |- Pop (Hi-Res)"}
- {id: 1165, cat: Audio/Lossless, desc: " |- Eurodance, Euro-House, Technopop (Lossless)"}
- {id: 1166, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop"}
- {id: 1168, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG"}
@@ -474,26 +475,32 @@ caps:
- {id: 1328, cat: Audio, desc: " |- Psybient, Psychill, Psydub"}
- {id: 1325, cat: Audio/Lossless, desc: " |- Downtempo, Trip-Hop, Lounge (Lossless)"}
- {id: 1326, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge"}
- {id: 1365, cat: Audio, desc: " |- Downtempo, Ambient (Hi-Res)"}
- {id: 1366, cat: Audio, desc: " |- Experimental, Industrial (Hi-Res)"}
- {id: 1323, cat: Audio/Lossless, desc: " |- Ambient, Experimental, Modern Classical (Lossless)"}
- {id: 1324, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical"}
- {id: 976, cat: Audio/Lossless, desc: " |- Trance (Lossless)"}
- {id: 346, cat: Audio, desc: " |- Trance"}
- {id: 1243, cat: Audio, desc: " |- Label-Packs"}
- {id: 1363, cat: Audio, desc: " |- Trance, House, Techno (Hi-Res)"}
- {id: 977, cat: Audio/Lossless, desc: " |- House, Techno, Electro, Minimal (Lossless)"}
- {id: 345, cat: Audio, desc: " |- House"}
- {id: 349, cat: Audio, desc: " |- Techno, Electro, Minimal"}
- {id: 1243, cat: Audio, desc: " |- Label-Packs"}
- {id: 347, cat: Audio, desc: " |- Easy listening"}
- {id: 979, cat: Audio/Lossless, desc: " |- Industrial, EBM, Dark Electro (Lossless)"}
- {id: 673, cat: Audio, desc: " |- Experimental Electronic"}
- {id: 671, cat: Audio, desc: " |- Industrial, EBM, Dark Electro"}
- {id: 1224, cat: Audio/Lossless, desc: " |- IDM (Lossless)"}
- {id: 1225, cat: Audio, desc: " |- IDM"}
- {id: 1367, cat: Audio, desc: " |- Synthpop, New Wave, Retro (Hi-Res)"}
- {id: 980, cat: Audio/Lossless, desc: " |- Synthpop, New Wave (Lossless)"}
- {id: 672, cat: Audio, desc: " |- Synthpop, New Wave"}
- {id: 1316, cat: Audio/Lossless, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage (Lossless)"}
- {id: 1317, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage"}
- {id: 1364, cat: Audio, desc: " |- Drum'n'Bass, Breakbeat (Hi-Res)"}
- {id: 981, cat: Audio/Lossless, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat (Lossless)"}
- {id: 344, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat"}
- {id: 1368, cat: Audio, desc: " |- Hardcore, Extreme (Hi-Res)"}
- {id: 983, cat: Audio/Lossless, desc: " |- Hardstyle, Jumpstyle, Hardcore (Lossless)"}
- {id: 984, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore"}
- {id: 982, cat: Audio/Lossless, desc: " |- Psychedelic, psytrance, fullon (Lossless)"}
@@ -507,6 +514,7 @@ caps:
- {id: 1185, cat: Audio/Lossless, desc: " |- RnB, Reggae (Lossless)"}
- {id: 341, cat: Audio, desc: " |- RnB, Reggae"}
- {id: 329, cat: Audio, desc: "East Asian Music"}
- {id: 1361, cat: Audio, desc: " |- Asian Music (Hi-Res)"}
- {id: 369, cat: Audio/Lossless, desc: " |- Asian Traditional, Ethnic (Lossless)"}
- {id: 368, cat: Audio, desc: " |- Asian Traditional, Ethnic"}
- {id: 1218, cat: Audio/Lossless, desc: " |- Asian Pop (Lossless)"}
@@ -523,10 +531,12 @@ caps:
- {id: 711, cat: Audio, desc: " |- Instrumental"}
- {id: 1159, cat: Audio/Lossless, desc: " |- New Age/Meditative/Relax (Lossless)"}
- {id: 378, cat: Audio, desc: " |- New Age/Meditative/Relax"}
- {id: 1359, cat: Audio, desc: " |- Folk (Hi-Res)"}
- {id: 1158, cat: Audio/Lossless, desc: " |- Folk (Lossless)"}
- {id: 379, cat: Audio, desc: " |- Folk"}
- {id: 380, cat: Audio/Lossless, desc: " |- Other (Lossless)"}
- {id: 1178, cat: Audio, desc: " |- Other"}
- {id: 1360, cat: Audio, desc: " |- OST (Hi-Res)"}
- {id: 361, cat: Audio/Lossless, desc: " |- OST (Lossless)"}
- {id: 360, cat: Audio, desc: " |- OST"}
- {id: 327, cat: Audio, desc: "Неофициальные сборники"}
@@ -701,7 +711,6 @@ 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-х"}
@@ -717,15 +726,6 @@ 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

@@ -324,13 +324,12 @@ caps:
- {id: 931, cat: Books, desc: " |- Собрания книг русскоязычных авторов"}
- {id: 1152, cat: Books, desc: " |- Собрания книг иностранных авторов"}
- {id: 455, cat: Books, desc: " |- Сатира, Юмор"}
- {id: 1153, cat: Books, desc: " |- Боевики"}
- {id: 453, cat: Books, desc: " |- Детективы"}
- {id: 453, cat: Books, desc: " |- Боевики, Детективы, Триллеры"}
- {id: 1063, cat: Books, desc: " |- Приключенческая проза "}
- {id: 452, cat: Books, desc: " |- Исторические книги"}
- {id: 449, cat: Books, desc: " |- Классика, Проза, Поэзия"}
- {id: 1063, cat: Books, desc: " |- Приключенческая литература"}
- {id: 452, cat: Books, desc: " |- Историческая проза, Мифы и Легенды"}
- {id: 451, cat: Books, desc: " |- Фантастика, Фэнтези"}
- {id: 449, cat: Books, desc: " |- Современная поэзия и проза"}
- {id: 1153, cat: Books, desc: " |- Классическая поэзия и проза"}
- {id: 1347, cat: Books, desc: "Книги вне издательств, самиздат (все жанры)"}
- {id: 482, cat: Books, desc: "Комиксы и Артбуки"}
- {id: 483, cat: Books, desc: " |- Комиксы на русском языке"}
@@ -448,6 +447,7 @@ caps:
- {id: 1356, cat: Audio, desc: " |- Alternative, Punk (Hi-Res)"}
- {id: 965, cat: Audio/Lossless, desc: " |- Alternative, Punk (Lossless)"}
- {id: 336, cat: Audio, desc: " |- Alternative, Punk"}
- {id: 1362, cat: Audio, desc: " |- Hard Rock (Hi Res)"}
- {id: 337, cat: Audio/Lossless, desc: " |- Hard Rock (Lossless)"}
- {id: 338, cat: Audio, desc: " |- Hard Rock"}
- {id: 1351, cat: Audio, desc: " |- Metal (Hi-Res)"}
@@ -457,6 +457,7 @@ caps:
- {id: 961, cat: Audio/Lossless, desc: " |- Русский Рок (Lossless)"}
- {id: 332, cat: Audio, desc: " |- Русский рок"}
- {id: 325, cat: Audio, desc: "Pop"}
- {id: 1354, cat: Audio, desc: " |- Pop (Hi-Res)"}
- {id: 1165, cat: Audio/Lossless, desc: " |- Eurodance, Euro-House, Technopop (Lossless)"}
- {id: 1166, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop"}
- {id: 1168, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG"}
@@ -472,26 +473,32 @@ caps:
- {id: 1328, cat: Audio, desc: " |- Psybient, Psychill, Psydub"}
- {id: 1325, cat: Audio/Lossless, desc: " |- Downtempo, Trip-Hop, Lounge (Lossless)"}
- {id: 1326, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge"}
- {id: 1365, cat: Audio, desc: " |- Downtempo, Ambient (Hi-Res)"}
- {id: 1366, cat: Audio, desc: " |- Experimental, Industrial (Hi-Res)"}
- {id: 1323, cat: Audio/Lossless, desc: " |- Ambient, Experimental, Modern Classical (Lossless)"}
- {id: 1324, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical"}
- {id: 976, cat: Audio/Lossless, desc: " |- Trance (Lossless)"}
- {id: 346, cat: Audio, desc: " |- Trance"}
- {id: 1243, cat: Audio, desc: " |- Label-Packs"}
- {id: 1363, cat: Audio, desc: " |- Trance, House, Techno (Hi-Res)"}
- {id: 977, cat: Audio/Lossless, desc: " |- House, Techno, Electro, Minimal (Lossless)"}
- {id: 345, cat: Audio, desc: " |- House"}
- {id: 349, cat: Audio, desc: " |- Techno, Electro, Minimal"}
- {id: 1243, cat: Audio, desc: " |- Label-Packs"}
- {id: 347, cat: Audio, desc: " |- Easy listening"}
- {id: 979, cat: Audio/Lossless, desc: " |- Industrial, EBM, Dark Electro (Lossless)"}
- {id: 673, cat: Audio, desc: " |- Experimental Electronic"}
- {id: 671, cat: Audio, desc: " |- Industrial, EBM, Dark Electro"}
- {id: 1224, cat: Audio/Lossless, desc: " |- IDM (Lossless)"}
- {id: 1225, cat: Audio, desc: " |- IDM"}
- {id: 1367, cat: Audio, desc: " |- Synthpop, New Wave, Retro (Hi-Res)"}
- {id: 980, cat: Audio/Lossless, desc: " |- Synthpop, New Wave (Lossless)"}
- {id: 672, cat: Audio, desc: " |- Synthpop, New Wave"}
- {id: 1316, cat: Audio/Lossless, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage (Lossless)"}
- {id: 1317, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage"}
- {id: 1364, cat: Audio, desc: " |- Drum'n'Bass, Breakbeat (Hi-Res)"}
- {id: 981, cat: Audio/Lossless, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat (Lossless)"}
- {id: 344, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat"}
- {id: 1368, cat: Audio, desc: " |- Hardcore, Extreme (Hi-Res)"}
- {id: 983, cat: Audio/Lossless, desc: " |- Hardstyle, Jumpstyle, Hardcore (Lossless)"}
- {id: 984, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore"}
- {id: 982, cat: Audio/Lossless, desc: " |- Psychedelic, psytrance, fullon (Lossless)"}
@@ -505,6 +512,7 @@ caps:
- {id: 1185, cat: Audio/Lossless, desc: " |- RnB, Reggae (Lossless)"}
- {id: 341, cat: Audio, desc: " |- RnB, Reggae"}
- {id: 329, cat: Audio, desc: "East Asian Music"}
- {id: 1361, cat: Audio, desc: " |- Asian Music (Hi-Res)"}
- {id: 369, cat: Audio/Lossless, desc: " |- Asian Traditional, Ethnic (Lossless)"}
- {id: 368, cat: Audio, desc: " |- Asian Traditional, Ethnic"}
- {id: 1218, cat: Audio/Lossless, desc: " |- Asian Pop (Lossless)"}
@@ -521,10 +529,12 @@ caps:
- {id: 711, cat: Audio, desc: " |- Instrumental"}
- {id: 1159, cat: Audio/Lossless, desc: " |- New Age/Meditative/Relax (Lossless)"}
- {id: 378, cat: Audio, desc: " |- New Age/Meditative/Relax"}
- {id: 1359, cat: Audio, desc: " |- Folk (Hi-Res)"}
- {id: 1158, cat: Audio/Lossless, desc: " |- Folk (Lossless)"}
- {id: 379, cat: Audio, desc: " |- Folk"}
- {id: 380, cat: Audio/Lossless, desc: " |- Other (Lossless)"}
- {id: 1178, cat: Audio, desc: " |- Other"}
- {id: 1360, cat: Audio, desc: " |- OST (Hi-Res)"}
- {id: 361, cat: Audio/Lossless, desc: " |- OST (Lossless)"}
- {id: 360, cat: Audio, desc: " |- OST"}
- {id: 327, cat: Audio, desc: "Неофициальные сборники"}

View File

@@ -8,12 +8,13 @@ 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://nortorrent-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
@@ -22,9 +23,9 @@ 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/

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

@@ -6,8 +6,9 @@ language: zh-CN
type: private
encoding: UTF-8
links:
- https://pterclub.com/
- https://pterclub.net/
legacylinks:
- https://pterclub.com/
caps:
categorymappings:

View File

@@ -27,12 +27,14 @@ caps:
- {id: 23, cat: TV/Sport, desc: "Formula E"}
- {id: 62, cat: TV/Sport, desc: "Indycar Series"}
- {id: 26, cat: TV/Sport, desc: "MotoGP-2-3-E"}
- {id: 82, cat: TV/Sport, desc: "Motorcycle Speedway"}
- {id: 31, cat: TV/Sport, desc: "Nascar"}
- {id: 25, cat: TV/Sport, desc: "Other Bikes"}
- {id: 69, cat: TV/Sport, desc: "Other Cars"}
- {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

@@ -9,38 +9,38 @@ type: semi-private
encoding: windows-1251
followredirect: true
links:
- https://oct25.rudub.homes/
- https://nov18.rudub.pics/
legacylinks:
- https://oct10.rudub.mom/
- http://oct11.rudub.mom/
- https://oct11.rudub.mom/
- http://oct12.rudub.mom/
- https://oct12.rudub.mom/
- http://oct13.rudub.mom/
- https://oct13.rudub.mom/
- http://oct14.rudub.mom/
- https://oct14.rudub.mom/
- http://oct15.rudub.mom/
- https://oct15.rudub.mom/
- http://oct16.rudub.mom/
- 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://nov03.rudub.homes/
- http://nov04.rudub.homes/
- https://nov04.rudub.homes/
- http://nov05.rudub.homes/
- https://nov05.rudub.homes/
- http://nov06.rudub.homes/
- https://nov06.rudub.homes/
- http://nov07.rudub.pics/
- https://nov07.rudub.pics/
- http://nov08.rudub.pics/
- https://nov08.rudub.pics/
- http://nov09.rudub.pics/
- https://nov09.rudub.pics/
- http://nov10.rudub.pics/
- https://nov10.rudub.pics/
- http://nov11.rudub.pics/
- https://nov11.rudub.pics/
- http://nov12.rudub.pics/
- 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/
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

@@ -17,11 +17,10 @@ caps:
- {id: 2, cat: TV, desc: "Serie TV"}
- {id: 15, cat: Books/EBook, desc: "Ebook"}
- {id: 17, cat: Books/Mags, desc: "Riviste e Giornali"}
- {id: 19, cat: XXX, desc: "XXX"}
- {id: 3, cat: Audio, desc: "Music"}
- {id: 7, cat: PC/Games, desc: "Games"}
- {id: 23, cat: PC, desc: "Software"}
- {id: 24, cat: TV/Sport, desc: "EVENTI SPORTIVI"}
- {id: 24, cat: TV/Sport, desc: "Eventi Sportivi"}
- {id: 25, cat: Other, desc: "Misc"}
modes:
@@ -129,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

@@ -1,7 +1,7 @@
---
id: siambit
name: SiamBIT
description: "SiamBIT is a THAI Private Torrent Tracker for GENERAL"
description: "SiamBIT is a THAI PAY2DL Private Torrent Tracker for GENERAL"
language: th-TH
type: private
encoding: tis-620
@@ -148,8 +148,7 @@ search:
fields:
category:
# the last selector is temporary as the site has apparently not yet updated their html for the cat links ;-)
selector: a[href^="viewno18sbx.php?cat="], a[href^="viewbrsb.php?cat="], a[href^="viewno18sb.php?cat="]
selector: a[href*=".php?cat="]
attribute: href
filters:
- name: querystring
@@ -162,59 +161,62 @@ search:
download:
selector: a[href^="details.php?id="]
attribute: href
poster:
selector: img[alt="Poster"]
attribute: src
imdbid:
selector: a[href*="imdb.com/title/tt"]
attribute: href
files:
selector: td:nth-child(5)
selector: td:nth-child(6)
date:
selector: td:nth-child(7)
selector: td:nth-child(8)
filters:
- name: append
args: " +07:00" # ICT
- name: dateparse
args: "dd-MM-yyyyHH:mm:ss zzz"
size:
selector: td:nth-child(8)
grabs:
selector: td:nth-child(9)
seeders:
grabs:
selector: td:nth-child(10)
leechers:
seeders:
selector: td:nth-child(11)
leechers:
selector: td:nth-child(12)
downloadvolumefactor:
case:
"td:nth-child(3):contains(\"100%\")": 0
"td:nth-child(3):contains(\"95%\")": 0.05
"td:nth-child(3):contains(\"90%\")": 0.1
"td:nth-child(3):contains(\"85%\")": 0.15
"td:nth-child(3):contains(\"80%\")": 0.2
"td:nth-child(3):contains(\"75%\")": 0.25
"td:nth-child(3):contains(\"70%\")": 0.3
"td:nth-child(3):contains(\"65%\")": 0.35
"td:nth-child(3):contains(\"60%\")": 0.4
"td:nth-child(3):contains(\"55%\")": 0.45
"td:nth-child(3):contains(\"50%\")": 0.5
"td:nth-child(3):contains(\"45%\")": 0.55
"td:nth-child(3):contains(\"40%\")": 0.6
"td:nth-child(3):contains(\"35%\")": 0.65
"td:nth-child(3):contains(\"30%\")": 0.7
"td:nth-child(3):contains(\"25%\")": 0.75
"td:nth-child(3):contains(\"20%\")": 0.8
"td:nth-child(3):contains(\"15%\")": 0.85
"td:nth-child(3):contains(\"10%\")": 0.9
"td:nth-child(3):contains(\"5%\")": 0.95
"td:nth-child(4):contains(\"100%\")": 0
"td:nth-child(4):contains(\"95%\")": 0.05
"td:nth-child(4):contains(\"90%\")": 0.1
"td:nth-child(4):contains(\"85%\")": 0.15
"td:nth-child(4):contains(\"80%\")": 0.2
"td:nth-child(4):contains(\"75%\")": 0.25
"td:nth-child(4):contains(\"70%\")": 0.3
"td:nth-child(4):contains(\"65%\")": 0.35
"td:nth-child(4):contains(\"60%\")": 0.4
"td:nth-child(4):contains(\"55%\")": 0.45
"td:nth-child(4):contains(\"50%\")": 0.5
"td:nth-child(4):contains(\"45%\")": 0.55
"td:nth-child(4):contains(\"40%\")": 0.6
"td:nth-child(4):contains(\"35%\")": 0.65
"td:nth-child(4):contains(\"30%\")": 0.7
"td:nth-child(4):contains(\"25%\")": 0.75
"td:nth-child(4):contains(\"20%\")": 0.8
"td:nth-child(4):contains(\"15%\")": 0.85
"td:nth-child(4):contains(\"10%\")": 0.9
"td:nth-child(4):contains(\"5%\")": 0.95
"*": 1
uploadvolumefactor:
case:
"td:nth-child(4):contains(\"x2\")": 2
"td:nth-child(4):contains(\"x3\")": 3
"td:nth-child(4):contains(\"x4\")": 4
"td:nth-child(4):contains(\"x5\")": 5
"td:nth-child(4):contains(\"x6\")": 6
"td:nth-child(4):contains(\"x7\")": 7
"td:nth-child(4):contains(\"x8\")": 8
"td:nth-child(4):contains(\"x9\")": 9
"td:nth-child(5):contains(\"x2\")": 2
"td:nth-child(5):contains(\"x3\")": 3
"td:nth-child(5):contains(\"x4\")": 4
"td:nth-child(5):contains(\"x5\")": 5
"td:nth-child(5):contains(\"x6\")": 6
"td:nth-child(5):contains(\"x7\")": 7
"td:nth-child(5):contains(\"x8\")": 8
"td:nth-child(5):contains(\"x9\")": 9
"*": 1
minimumratio:
text: 1.0

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

@@ -7,14 +7,10 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq391.com/
- https://torrentegg81.com/
- https://torrentqq394.com/
- https://torrentegg83.com/
legacylinks:
- https://torrentegg67.com/
- https://torrentqq376.com/
- https://torrentegg68.com/
- https://torrentqq377.com/
- https://torrentqq378.com/
- https://torrentegg69.com/
- https://torrentqq379.com/
- https://torrentegg70.com/
@@ -39,6 +35,11 @@ legacylinks:
- https://torrentegg79.com/
- https://torrentqq390.com/
- https://torrentegg80.com/
- https://torrentqq391.com/
- https://torrentegg81.com/
- https://torrentqq392.com/
- https://torrentegg82.com/
- https://torrentqq393.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,11 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrentsome218.com/
- https://torrentsome221.com/
legacylinks:
- https://torrentsome203.com/
- https://torrentsome204.com/
- https://torrentsome205.com/
- https://torrentsome206.com/
- https://torrentsome207.com/
- https://torrentsome208.com/
@@ -26,6 +23,9 @@ legacylinks:
- https://torrentsome215.com/
- https://torrentsome216.com/
- https://torrentsome217.com/
- https://torrentsome218.com/
- https://torrentsome219.com/
- https://torrentsome220.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,11 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrenttip199.top/
- https://torrenttip202.top/
legacylinks:
- https://torrenttip184.top/
- https://torrenttip185.top/
- https://torrenttip186.top/
- https://torrenttip187.top/
- https://torrenttip188.top/
- https://torrenttip189.top/
@@ -26,6 +23,9 @@ legacylinks:
- https://torrenttip196.top/
- https://torrenttip197.top/
- https://torrenttip198.top/
- https://torrenttip199.top/
- https://torrenttip200.top/
- https://torrenttip201.top/
caps:
categorymappings:

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.10 2025-10-30

View File

@@ -31,12 +31,11 @@ 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"}
- {id: 313, cat: TV, desc: " |- Секретные материалы \ The X-Files"}
- {id: 103, cat: TV, desc: " |- Зарубежные сериалы"}
- {id: 102, cat: TV, desc: " |- Российские сериалы"}
@@ -84,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"}
@@ -149,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
@@ -166,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

@@ -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.zetorrents2.com/
- 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,10 +20,9 @@ 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.bz/
- https://www.zetorrents.nl/
- https://www.zetorrents.biz/
- https://www.zetorrents.ch/
@@ -39,6 +39,7 @@ legacylinks:
- https://www-zetorrents.com/
- https://www.zetorrents1.com/
- https://www.zetorrents.diy/
- https://www.zetorrents2.com/
caps:
categories:
@@ -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,13 @@ 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://zktorrent-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
@@ -21,9 +22,9 @@ 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/
@@ -100,7 +101,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

@@ -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

@@ -29,20 +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.live/";
public override string SiteLink { get; protected set; } = "https://todotorrents.org/";
public override string[] AlternativeSiteLinks => new[]
{
"https://dontorrent.live/",
"https://todotorrents.org/",
"https://tomadivx.net/",
"https://seriesblanco.one/",
"https://verdetorrent.com/",
"https://naranjatorrent.com/"
};
public override string[] LegacySiteLinks => new[]
{
"https://dontorrent.report/",
"https://dontorrent.homes/",
"https://dontorrent.haus/",
"https://dontorrent.news/",
"https://dontorrent.institute/",
@@ -56,6 +52,10 @@ namespace Jackett.Common.Indexers.Definitions
"https://dontorrent.onl/",
"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

@@ -0,0 +1,209 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using AngleSharp.Dom;
using AngleSharp.Html.Parser;
using Jackett.Common.Extensions;
using Jackett.Common.Indexers.Definitions.Abstract;
using Jackett.Common.Models;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers.Definitions
{
public class HDRTorrent : PublicBrazilianIndexerBase
{
public override string Id => "hdrtorrent";
public override string Name => "HDRTorrent";
public override string SiteLink { get; protected set; } = "https://hdrtorrent.com/";
public HDRTorrent(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps, ICacheService cs)
: base(configService, wc, l, ps, cs)
{
}
public override IParseIndexerResponse GetParser() => new HDRTorrentParser(webclient);
public override IIndexerRequestGenerator GetRequestGenerator() => new SimpleRequestGenerator(SiteLink, searchQueryParamsKey: "index.php?s=");
}
public class HDRTorrentParser : PublicBrazilianParser
{
private readonly WebClient _webclient;
protected string Tracker;
public HDRTorrentParser(WebClient webclient)
{
_webclient = webclient;
Tracker = "HDRTorrent";
}
private Dictionary<string, string> ExtractFileInfo(IDocument detailsDom)
{
var fileInfo = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var infoSection = detailsDom.QuerySelector("div.infos p");
if (infoSection == null)
return fileInfo;
var lines = infoSection.InnerHtml.Split(new[] { "<br>" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
if (line.Contains("<b>") && line.Contains(":"))
{
var parts = line.Split(new[] { ':' }, 2);
if (parts.Length == 2)
{
var key = parts[0].Replace("<b>", "").Replace("</b>", "").Trim();
var value = parts[1]
.Replace("<b>", "")
.Replace("</b>", "")
.Replace("<strong>", "")
.Replace("</strong>", "")
.Trim();
if (value.Contains("<"))
{
var tempDoc = new HtmlParser().ParseDocument(value);
value = tempDoc.Body.TextContent.Trim();
}
value = value switch
{
var v when v.Contains("Dual Áudio") => v.Replace("Dual Áudio", "Dual"),
var v when v.Contains("Dual Audio") => v.Replace("Dual Audio", "Dual"),
var v when v.Contains("Full HD") => v.Replace("Full HD", "1080p"),
var v when v.Contains("4K") => v.Replace("4K", "2160p"),
var v when v.Contains("SD") => v.Replace("SD", "480p"),
var v when v.Contains("WEB") => v.Replace("WEB", "WEB-DL"),
_ => value
};
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
fileInfo[key] = value;
}
}
}
}
return fileInfo;
}
public override IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
{
var releases = new List<ReleaseInfo>();
var parser = new HtmlParser();
var dom = parser.ParseDocument(indexerResponse.Content);
var rows = dom.QuerySelectorAll("div.capa-img");
foreach (var row in rows)
{
var h2Anchor = row.QuerySelector("h2 a");
if (h2Anchor == null)
continue;
var title = h2Anchor.TextContent.Trim();
var detailUrlStr = h2Anchor.GetAttribute("href")?.Trim();
if (string.IsNullOrEmpty(detailUrlStr))
continue;
var detailUrl = new Uri(detailUrlStr);
var releaseCommonInfo = new ReleaseInfo
{
Title = CleanTitle(title),
Details = detailUrl,
Guid = detailUrl,
Seeders = 1
};
var detailsPage = _webclient.GetResultAsync(new WebRequest(detailUrl.ToString())).Result;
var detailsDom = parser.ParseDocument(detailsPage.ContentString);
var fileInfoDict = ExtractFileInfo(detailsDom);
var fileInfo = PublicBrazilianIndexerBase.FileInfo.FromDictionary(fileInfoDict);
var publishedMeta = detailsDom.QuerySelector("meta[property='article:published_time']")?.GetAttribute("content");
if (!string.IsNullOrEmpty(publishedMeta) && DateTime.TryParse(publishedMeta, out var parsedDate))
{
releaseCommonInfo.PublishDate = parsedDate;
}
else
{
releaseCommonInfo.PublishDate = DateTime.Today;
}
var magnetLinks = detailsDom.QuerySelectorAll("a[href^='magnet:?']");
foreach (var magnetLink in magnetLinks)
{
var magnet = magnetLink.GetAttribute("href");
if (string.IsNullOrEmpty(magnet))
continue;
var release = releaseCommonInfo.Clone() as ReleaseInfo;
release.Guid = release.MagnetUri = new Uri(magnet);
var parentText = magnetLink.ParentElement?.TextContent?.Trim();
if (!string.IsNullOrEmpty(parentText))
{
parentText = Regex.Replace(parentText, "DOWNLOAD TORRENT", "", RegexOptions.IgnoreCase)
.Replace("DUAL ÁUDIO", "Dual")
.Replace("DUAL AUDIO", "Dual")
.Replace("ÁUDIO", "Audio")
.Replace("AUDIO", "Audio")
.Replace("DUBLADO", "Dubbed")
.Replace("LEGENDADO", "Subbed")
.Replace("MKV", "")
.Replace("MP4", "")
.Replace("MAGNET", "")
.Replace("TORRENT", "")
.Replace("LINK", "")
.Trim();
if (!string.IsNullOrEmpty(parentText))
{
release.Title = $"{release.Title} {parentText}".Trim();
}
}
var resolution = fileInfo.Quality ?? fileInfo.VideoQuality ?? string.Empty;
if (!string.IsNullOrEmpty(resolution))
release.Title = $"{release.Title} {resolution}".Trim();
release.Category = magnetLink.ExtractCategory(release.Title);
var size = RowParsingExtensions.GetBytes(fileInfo.Size ?? string.Empty);
release.Size = size > 0 ? size : ExtractSizeByResolution(release.Title);
release.DownloadVolumeFactor = 0;
release.UploadVolumeFactor = 1;
release.Languages = fileInfo.Audio?.ToList() ?? release.Languages;
release.Genres = fileInfo.Genres?.ToList() ?? release.Genres;
release.Subs = string.IsNullOrEmpty(fileInfo.Subtitle) ? release.Subs : new[] { fileInfo.Subtitle };
if (release.Title.IsNotNullOrWhiteSpace())
releases.Add(release);
}
}
return releases;
}
protected override INode GetTitleElementOrNull(IElement downloadButton)
{
var description = downloadButton.PreviousSibling;
while (description != null && description.NodeType != NodeType.Text)
{
description = description.PreviousSibling;
}
return description;
}
}
}

View File

@@ -696,8 +696,8 @@ namespace Jackett.Common.Indexers.Definitions
var meta = document.QuerySelector("meta");
var metaContent = meta.GetAttribute("content");
// Follow redirection defined by async url.replace
var redirectionUrl = metaContent.Substring(metaContent.IndexOf("http"));
// Follow redirection defined by async url.replace and prepend sitelink
var redirectionUrl = SiteLink + metaContent.Substring(metaContent.IndexOf("url=") + 5);
return await FollowTrackerRedirection(redirectionUrl, details);
}
catch (Exception ex)

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

@@ -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

@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using Autofac;
using Autofac.Extensions.DependencyInjection;
@@ -22,6 +23,7 @@ using Microsoft.AspNetCore.Rewrite;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Serialization;
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
#if !NET471
using Microsoft.Extensions.Hosting;
#endif
@@ -62,8 +64,11 @@ namespace Jackett.Server
// See https://github.com/Jackett/Jackett/issues/3517
options.ForwardLimit = 10;
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8));
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

@@ -508,6 +508,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 +610,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 +737,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 +763,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 +783,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 +819,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",