mirror of
https://github.com/Jackett/Jackett.git
synced 2025-12-15 03:41:12 +01:00
Compare commits
86 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7b7f77e06f | ||
|
|
64fc61f777 | ||
|
|
dee082ead3 | ||
|
|
6347fdff66 | ||
|
|
cdeac3c0ef | ||
|
|
6d568a4059 | ||
|
|
3dd5b1e5f0 | ||
|
|
fb9845d1e3 | ||
|
|
70b0aa1f67 | ||
|
|
368afcfc5a | ||
|
|
29d28e2607 | ||
|
|
b023e8fe6d | ||
|
|
d51752f682 | ||
|
|
ec40699cdc | ||
|
|
3c798127c5 | ||
|
|
61b263dd98 | ||
|
|
dd11b7e6cd | ||
|
|
bec42c4ac0 | ||
|
|
9b08d7ad46 | ||
|
|
9311af24b5 | ||
|
|
9e5d79d2a4 | ||
|
|
15c64f9f66 | ||
|
|
f1f8f0f756 | ||
|
|
b3d4ec6f23 | ||
|
|
7f33664f97 | ||
|
|
43aaaf4142 | ||
|
|
20a0bedc3b | ||
|
|
31e0a19eeb | ||
|
|
ccb98cbe48 | ||
|
|
6560931e42 | ||
|
|
46082db9b9 | ||
|
|
89f4a9fb89 | ||
|
|
3e2411865f | ||
|
|
74b2f9e670 | ||
|
|
78b538d2be | ||
|
|
e92e9d168e | ||
|
|
e32053b153 | ||
|
|
7eabdec5b0 | ||
|
|
76a61e67c4 | ||
|
|
b9834455ed | ||
|
|
2f3f86bf25 | ||
|
|
05918d22c1 | ||
|
|
cae5c818df | ||
|
|
84b258a3bb | ||
|
|
887c5bafe6 | ||
|
|
eb933878ec | ||
|
|
3116dcce2b | ||
|
|
459bc4683e | ||
|
|
37ef94e8a5 | ||
|
|
7bbc63ddb8 | ||
|
|
e25370d959 | ||
|
|
46d6cf7ca1 | ||
|
|
b8f4caddc2 | ||
|
|
2cfd55b325 | ||
|
|
5f37536783 | ||
|
|
c0994d7a5e | ||
|
|
7455f3aec6 | ||
|
|
832184afaf | ||
|
|
f8bd4cd479 | ||
|
|
9e1d4af15e | ||
|
|
052d4ab3e2 | ||
|
|
86ba95ceb6 | ||
|
|
15e81d14c9 | ||
|
|
fd3731c429 | ||
|
|
adcbd5389c | ||
|
|
995ce3ee84 | ||
|
|
ecdb32e57f | ||
|
|
dd49233d41 | ||
|
|
2df84ce82d | ||
|
|
1b00e38094 | ||
|
|
42ec7db599 | ||
|
|
ad60961347 | ||
|
|
c2bb44dfb6 | ||
|
|
f218af30b9 | ||
|
|
d8f0a876d5 | ||
|
|
eb8279fd00 | ||
|
|
f554ba36c2 | ||
|
|
9c3d105705 | ||
|
|
da1a0cd98e | ||
|
|
98cc4f0f99 | ||
|
|
8e0a583296 | ||
|
|
d40019fc86 | ||
|
|
1eebcdffca | ||
|
|
458c1c9420 | ||
|
|
3db9c65fe0 | ||
|
|
8be39359d9 |
4
.github/workflows/definitions-update.yml
vendored
4
.github/workflows/definitions-update.yml
vendored
@@ -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
|
||||
|
||||
10
README.md
10
README.md
@@ -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:
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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 }}"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
144
src/Jackett.Common/Definitions/dasunerwartete-api.yml
Normal file
144
src/Jackett.Common/Definitions/dasunerwartete-api.yml
Normal 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: ["&", "&"]
|
||||
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
|
||||
@@ -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"}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
181
src/Jackett.Common/Definitions/huntorrent-bithorlo.yml
Normal file
181
src/Jackett.Common/Definitions/huntorrent-bithorlo.yml
Normal 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
|
||||
@@ -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:
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
193
src/Jackett.Common/Definitions/infinityhd-api.yml
Normal file
193
src/Jackett.Common/Definitions/infinityhd-api.yml
Normal 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
|
||||
@@ -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}
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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:
|
||||
|
||||
61
src/Jackett.Common/Definitions/magnetz.yml
Normal file
61
src/Jackett.Common/Definitions/magnetz.yml
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: " |- Аркады"}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
34
src/Jackett.Common/Extensions/HashingExtensions.cs
Normal file
34
src/Jackett.Common/Extensions/HashingExtensions.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -341,7 +341,6 @@ namespace Jackett.Server.Services
|
||||
|
||||
// Load indexers
|
||||
indexerService.InitIndexers(configService.GetCardigannDefinitionsFolders());
|
||||
client.Init();
|
||||
|
||||
updater.CleanupTempDir();
|
||||
updater.CheckUpdaterLock();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user