Compare commits

...

86 Commits

Author SHA1 Message Date
jackettbot[bot]
7b7f77e06f Update rudub 2025-11-20 01:29:17 +00:00
Bogdan
64fc61f777 core: refactor remaining obsolete calls (#16301) 2025-11-19 19:41:26 +02:00
Garfield69
dee082ead3 torrenttip: bump domain 2025-11-20 05:39:38 +13:00
Garfield69
6347fdff66 torrentsome: bump domain 2025-11-20 05:39:28 +13:00
Garfield69
cdeac3c0ef kickasstorrents-to: new cat 2025-11-20 05:39:13 +13:00
Bogdan
6d568a4059 yts: update links
Closes #16297
2025-11-19 17:50:18 +02:00
jackettbot[bot]
3dd5b1e5f0 Update rudub 2025-11-19 01:29:18 +00:00
Garfield69
fb9845d1e3 magnetz: q -> query 2025-11-19 13:03:56 +13:00
Garfield69
70b0aa1f67 linuxtracker: new cat 2025-11-19 06:10:10 +13:00
Garfield69
368afcfc5a hdgalaktik: new size selector. resolves dd11b7e6cd 2025-11-18 16:42:57 +13:00
jackettbot[bot]
29d28e2607 Update rudub 2025-11-18 01:29:11 +00:00
Garfield69
b023e8fe6d clearjav: -> 9.1.7 drop info_hash 2025-11-18 06:56:48 +13:00
Garfield69
d51752f682 kickasstorrents-to: new cat 2025-11-18 06:36:40 +13:00
Garfield69
ec40699cdc hdgalaktik: restore previous size selector. reverts dd11b7e6cd 2025-11-18 06:36:24 +13:00
jackettbot[bot]
3c798127c5 Update rudub 2025-11-17 01:29:17 +00:00
Bogdan
61b263dd98 core: refactor obsolete calls (#16290)
* core: refactor obsolete hashing calls

* core: delete cert callback validation removal in update service

* core: remove deprecated ServicePointManager calls

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

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

@@ -83,6 +83,7 @@ Prior versions of Jackett are no longer supported.
* Mac Torrents Download
* Magnet Cat
* MagnetDownload
* Magnetz
* MegaPeer
* MejorTorrent
* Mikan
@@ -96,7 +97,6 @@ Prior versions of Jackett are no longer supported.
* Nyaa.si
* OneJAV
* OxTorrent
* OxTorrent-vip
* OpenSharing
* PC-torrent
* Pirate's Paradise
@@ -125,7 +125,6 @@ Prior versions of Jackett are no longer supported.
* torrent.by
* torrent-pirat
* Torrent9
* TorrentControl
* TorrentDosFilmes
* TorrentDownload
* TorrentGalaxyClone
@@ -133,9 +132,7 @@ Prior versions of Jackett are no longer supported.
* TorrentProject2
* TorrentQQ (토렌트큐큐)
* Torrents.csv
* TorrentSir (토렌트썰)
* Torrentsome (토렌트썸)
* torrentssg (토렌트쓱)
* Torrenttip (토렌트팁)
* TrahT
* U3C3
@@ -397,11 +394,11 @@ Prior versions of Jackett are no longer supported.
* House of Devil
* HQMusic
* HUDBT (蝴蝶) [![(invite needed)][inviteneeded]](#)
* ilolicon PT
* ImmortalSeed (iS)
* Immortuos
* Indietorrents [![(invite needed)][inviteneeded]](#)
* INFINITY [PAY2DL] [![(invite needed)][inviteneeded]](#)
* InfinityHD
* Infire
* Insane Tracker
* IPTorrents (IPT)
@@ -565,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]](#)
@@ -835,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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

@@ -39,37 +39,10 @@ caps:
- {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: 51bithorlo, cat: Movies/SD, desc: "Cam/Eng", default: true}
- {id: 50bithorlo, cat: Movies/SD, desc: "Cam/Hun", default: true}
- {id: 2bithorlo, cat: Movies/DVD, desc: "DVD/Eng", default: true}
- {id: 1bithorlo, cat: Movies/DVD, desc: "DVD/Hun", default: true}
- {id: 42bithorlo, cat: Movies/DVD, desc: "Dvd9/Eng", default: true}
- {id: 41bithorlo, cat: Movies/DVD, desc: "Dvd9/Hun", default: true}
- {id: 40bithorlo, cat: Books, desc: "E-book/Eng", default: true}
- {id: 19bithorlo, cat: Books, desc: "E-book/Hun", default: true}
- {id: 29bithorlo, cat: Movies/HD, desc: "HD/Eng", default: true}
- {id: 28bithorlo, cat: Movies/HD, desc: "HD/Hun", default: true}
- {id: 15bithorlo, cat: PC/Games, desc: "Játék/ISO", default: true}
- {id: 38bithorlo, cat: Console, desc: "Játék/Konzol", default: true}
- {id: 37bithorlo, cat: PC/Games, desc: "Játék/Rip", default: true}
- {id: 20bithorlo, cat: Other, desc: "Képek", default: true}
- {id: 21bithorlo, cat: PC/Mobile-Other, desc: "Mobil", default: true}
- {id: 54bithorlo, cat: PC/ISO, desc: "Prog/ISO", default: true}
- {id: 23bithorlo, cat: PC/0day, desc: "Prog/Rip", default: true}
- {id: 33bithorlo, cat: TV/SD, desc: "Sorozat/Eng", default: true}
- {id: 52bithorlo, cat: TV/HD, desc: "Sorozat/Eng/HD", default: true}
- {id: 5bithorlo, cat: TV/SD, desc: "Sorozat/Hun", default: true}
- {id: 53bithorlo, cat: TV/HD, desc: "Sorozat/Hun/HD", default: true}
- {id: 4bithorlo, cat: Movies/SD, desc: "Xvid/Eng", default: true}
- {id: 3bithorlo, cat: Movies/SD, desc: "Xvid/Hun", default: true}
- {id: 12bithorlo, cat: Audio, desc: "Zene/Eng", default: true}
- {id: 13bithorlo, cat: Audio, desc: "Zene/Hun", default: true}
- {id: 16xxx, cat: XXX/DVD, desc: "XXX/DVD", default: false}
- {id: 32xxx, cat: XXX/x264, desc: "XXX/HD", default: false}
- {id: 14xxx, cat: XXX/ImageSet, desc: "XXX/Kép", default: false}
- {id: 15xxx, cat: XXX/SD, desc: "XXX/XVID", default: false}
- {id: 9bithorloxxx, cat: XXX/x264, desc: "XXX/Film, default: false"}
- {id: 10bithorloxxx, cat: XXX/ImageSet, desc: "XXX/Kép", default: false}
- {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]
@@ -79,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
@@ -126,54 +103,33 @@ search:
# 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]
- path: browse.php
categories: [51bithorlo, 50bithorlo, 2bithorlo, 1bithorlo, 42bithorlo, 41bithorlo, 40bithorlo, 19bithorlo, 29bithorlo, 28bithorlo, 15bithorlo, 38bithorlo, 37bithorlo, 20bithorlo, 21bithorlo, 54bithorlo, 23bithorlo, 33bithorlo, 52bithorlo, 53bithorlo, 4bithorlo, 3bithorlo, 12bithorlo, 13bithorlo]
inputs:
viewMode: bithorlo
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
- path: browse.php
categories: [16xxx, 32xxx, 14xxx, 15xxx]
categories: [16, 32, 14, 15]
inputs:
viewMode: xxx
- path: browse.php
categories: [9bithorloxxx, 10bithorloxxx]
inputs:
viewMode: bithorloxxx
search: "{{ .Keywords }}"
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
xyz: yes
search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}"
# Age Limit: 0 all, 1 no, 5 6, 2 12, 3 16, 4 18
korhatar: 0
# 0 active, 1 active+dead, 2 dead, 3 my uploads, 4 waiting for seed, 7 my bookmarks, 12 reseeded by me
incldead: 1
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
# no freeleech atm
# can search by genre but you need to know the id. &mufaj[]=20 for Romantikus
rows:
selector: table.torrent-table > tbody > tr[id^="torrent-main-"]
fields:
category_view:
# browse.php?cat=9&viewMode=
# browse.php?cat=9&viewMode=xxx
# browse.php?cat=9&viewMode=bithorlo
# browse.php?cat=9&viewMode=bithorloxxx
selector: a[href^="browse.php?cat="]
attribute: href
optional: true
filters:
- name: querystring
args: viewMode
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
- name: append
args: "{{ if .Result.category_view }}{{ .Result.category_view }}{{ else }}{{ end }}"
title:
selector: a.torrent-title-link
details:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

@@ -8,12 +8,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

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

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

View File

@@ -9,38 +9,38 @@ type: semi-private
encoding: windows-1251
followredirect: true
links:
- https://nov03.rudub.homes/
- https://nov20.rudub.pics/
legacylinks:
- https://oct19.rudub.homes/
- http://oct20.rudub.homes/
- https://oct20.rudub.homes/
- http://oct21.rudub.homes/
- https://oct21.rudub.homes/
- http://oct22.rudub.homes/
- https://oct22.rudub.homes/
- http://oct23.rudub.homes/
- https://oct23.rudub.homes/
- http://oct24.rudub.homes/
- https://oct24.rudub.homes/
- http://oct25.rudub.homes/
- https://oct25.rudub.homes/
- http://oct26.rudub.homes/
- https://oct26.rudub.homes/
- http://oct27.rudub.homes/
- https://oct27.rudub.homes/
- http://oct28.rudub.homes/
- https://oct28.rudub.homes/
- http://oct29.rudub.homes/
- https://oct29.rudub.homes/
- http://oct30.rudub.homes/
- https://oct30.rudub.homes/
- http://oct31.rudub.homes/
- https://oct31.rudub.homes/
- http://nov01.rudub.homes/
- https://nov01.rudub.homes/
- http://nov02.rudub.homes/
- https://nov02.rudub.homes/
- http://nov03.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/
- https://nov18.rudub.pics/
- http://nov19.rudub.pics/
- https://nov19.rudub.pics/
- http://nov20.rudub.pics/
caps:
categorymappings:
- {id: 1, cat: TV, desc: "TV"}

View File

@@ -51,8 +51,10 @@ caps:
- {id: 41, cat: XXX, desc: "Homemade"}
- {id: 42, cat: XXX, desc: "Pregnant"}
- {id: 43, cat: XXX, desc: "Gay"}
- {id: 1, cat: Movies, desc: "Movie"}
- {id: 2, cat: TV, desc: "TV Show"}
- {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]

View File

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

View File

@@ -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,13 +7,10 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq392.com/
- https://torrentegg82.com/
- https://torrentqq394.com/
- https://torrentegg83.com/
legacylinks:
- https://torrentegg67.com/
- https://torrentegg68.com/
- https://torrentqq377.com/
- https://torrentqq378.com/
- https://torrentegg69.com/
- https://torrentqq379.com/
- https://torrentegg70.com/
@@ -40,6 +37,9 @@ legacylinks:
- 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://torrentsome219.com/
- https://torrentsome222.com/
legacylinks:
- https://torrentsome204.com/
- https://torrentsome205.com/
- https://torrentsome206.com/
- https://torrentsome207.com/
- https://torrentsome208.com/
- https://torrentsome209.com/
@@ -26,6 +23,9 @@ legacylinks:
- https://torrentsome216.com/
- https://torrentsome217.com/
- https://torrentsome218.com/
- https://torrentsome219.com/
- https://torrentsome220.com/
- https://torrentsome221.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://torrenttip200.top/
- https://torrenttip203.top/
legacylinks:
- https://torrenttip185.top/
- https://torrenttip186.top/
- https://torrenttip187.top/
- https://torrenttip188.top/
- https://torrenttip189.top/
- https://torrenttip190.top/
@@ -26,6 +23,9 @@ legacylinks:
- https://torrenttip197.top/
- https://torrenttip198.top/
- https://torrenttip199.top/
- https://torrenttip200.top/
- https://torrenttip201.top/
- https://torrenttip202.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,10 +31,8 @@ caps:
- {id: 190, cat: Movies, desc: " |- Фильмы в 4K и 3D"}
- {id: 34, cat: Movies, desc: " |- Перевод на узбекский"}
- {id: 25, cat: Movies, desc: "Узбекские кинофильмы"}
- {id: 32, cat: Movies, desc: " |- Новинки"}
- {id: 30, cat: Movies, desc: " |- Фильмы 2011-2024 годов"}
- {id: 29, cat: Movies, desc: " |- Фильмы 2000-2010 годов"}
- {id: 26, cat: Movies, desc: " |- Фильмы до 2000 года"}
- {id: 32, cat: Movies, desc: " |- Пр-во Узбекфильм (на русском)"}
- {id: 30, cat: Movies, desc: " |- Пр-во Узбекфильм (на узбекском языке)"}
# Сериалы, Видео и ТВ # Series, Videos and TV
- {id: 97, cat: TV, desc: "Сериалы"}
- {id: 333, cat: TV, desc: " |- Игра престолов / Game of Thrones"}
@@ -85,12 +83,14 @@ caps:
- {id: 132, cat: Audio, desc: " |- Классическая музыа"}
- {id: 125, cat: Audio, desc: " |- New Age, Relax, Meditative & Flamenco"}
- {id: 124, cat: Audio, desc: " |- Фольклор, Народная и Этническая музыка"}
- {id: 338, cat: Audio, desc: " |- Country"}
- {id: 231, cat: Audio, desc: " |- Сборники и альбомы выходившие неофициальными изданиями."}
- {id: 144, cat: Audio, desc: "♫ ROCK & METAL ♫"}
- {id: 201, cat: Audio, desc: " |- Русский Rock, Metal (mp3)"}
- {id: 202, cat: Audio, desc: " |- Сборники Русского рока (mp3)"}
- {id: 323, cat: Audio, desc: " |- Русский Rock, Metal (Lossless)"}
- {id: 214, cat: Audio, desc: " |- Soft & Pop-Rock"}
- {id: 334, cat: Audio, desc: " |- Progressive & Art-Rock"}
- {id: 156, cat: Audio, desc: " |- Progressive, Art, Classic & Hard Rock"}
- {id: 213, cat: Audio, desc: " |- Melodic & Folk Rock"}
- {id: 212, cat: Audio, desc: " |- Instrumental & Guitar Rock"}
@@ -150,11 +150,13 @@ caps:
- {id: 173, cat: Books, desc: " |- Художественная литература"}
- {id: 314, cat: Books, desc: " |- Учебно-техническая литература"}
- {id: 167, cat: Books, desc: "Аудиокниги"}
- {id: 232, cat: Audio/Audiobook, desc: " |- Детективы, приключения, триллеры (Audiobook)"}
- {id: 210, cat: Audio/Audiobook, desc: " |- Романы, повести, рассказы (Audiobook)"}
- {id: 233, cat: Audio/Audiobook, desc: " |- Любовные романы (Audiobook)"}
- {id: 176, cat: Audio/Audiobook, desc: " |- Мистика, фантастика, ужасы (Audiobook)"}
- {id: 175, cat: Audio/Audiobook, desc: " |- Любовно-фантастический роман (Audiobook)"}
- {id: 335, cat: Audio/Audiobook, desc: " |- ♫ Русская литература ХХ-ХХI века"}
- {id: 232, cat: Audio/Audiobook, desc: " |- ♫ Детективы, приключения, триллеры"}
- {id: 337, cat: Audio/Audiobook, desc: " |- ♫ Детективы Дарьи Донцовой"}
- {id: 210, cat: Audio/Audiobook, desc: " |- ♫ Зарубежные авторы. Романы, повести, рассказы"}
- {id: 233, cat: Audio/Audiobook, desc: " |- Любовные романы"}
- {id: 176, cat: Audio/Audiobook, desc: " |- ♫ Мистика, фантастика, ужасы"}
- {id: 175, cat: Audio/Audiobook, desc: " |- ♫ Любовно-фантастический роман"}
- {id: 174, cat: Audio, desc: " |- Аудиокниги на других языках (Audio)"}
- {id: 319, cat: Books, desc: " |- Аудиокниги для детей"}
# Игры # Games
@@ -167,6 +169,7 @@ caps:
- {id: 289, cat: PC/Games, desc: " |- Horror"}
- {id: 307, cat: PC/Games, desc: " |- Logic"}
- {id: 304, cat: PC/Games, desc: " |- Lifestyle"}
- {id: 336, cat: PC/Games, desc: " |- Sports"}
- {id: 306, cat: PC/Games, desc: " |- Exploration"}
- {id: 305, cat: PC/Games, desc: " |- Management"}
- {id: 115, cat: PC/Games, desc: " |- Аркады"}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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