Compare commits

..

164 Commits

Author SHA1 Message Date
jackettbot[bot]
f218144b5f Update rudub 2025-12-20 01:29:02 +00:00
jackettbot[bot]
2da2923356 Update rudub 2025-12-19 01:29:24 +00:00
ilike2burnthing
5ae6f96f7e ptsbao: update layout
https://github.com/Prowlarr/Indexers/issues/714
2025-12-18 22:28:16 +00:00
Garfield69
b4ab5172bb arabp2p: remove duplicates #16349 2025-12-19 05:58:10 +13:00
Shady Boukhary
ac27e1d7aa ArabP2P: fix result parsing for series (#16349) 2025-12-18 16:44:37 +00:00
Garfield69
51b310b16f rockethd: -> 9.2.0 drop info_hash #15237 2025-12-19 05:30:42 +13:00
Garfield69
d63b02eb87 kickasstorrents-to: new cat 2025-12-19 04:41:38 +13:00
Garfield69
b42d73a48f mejortorrent: bump domain 2025-12-19 04:14:46 +13:00
Garfield69
07dc412bbe torrentqq: bump domain 2025-12-19 04:14:19 +13:00
Garfield69
b6ceab2c86 nortorrent: new domain 2025-12-18 18:32:44 +13:00
Garfield69
8716293647 bitporn: bump engine tag 2025-12-18 15:48:59 +13:00
jackettbot[bot]
bc3c088235 Update rudub 2025-12-18 01:29:12 +00:00
Garfield69
da4749874f krazyzone: update cats 2025-12-18 04:55:33 +13:00
Garfield69
2387f4824f torrenttip: bump domani 2025-12-18 04:27:46 +13:00
Garfield69
a8c1cc6bd0 torrentsome: bump domain 2025-12-18 04:27:34 +13:00
jackettbot[bot]
1f2dfa6946 Update rudub 2025-12-17 01:29:07 +00:00
Garfield69
cc17f2a1c8 reelflix: bump engine tag 2025-12-17 13:36:35 +13:00
Garfield69
d3a929ed6f bitpalace: add new domain 2025-12-17 13:07:28 +13:00
Garfield69
09cd60c6f4 assorted nexus: correct typo on 2fa notice 2025-12-17 13:02:54 +13:00
Garfield69
37ae398120 ggpt: bump engine tag 2025-12-17 11:51:47 +13:00
Garfield69
5e515bfd12 cdfile: bump engine tag 2025-12-17 11:51:34 +13:00
ilike2burnthing
d0d84794f4 ptgtk: update domain, version & typo 2025-12-16 22:25:25 +00:00
Garfield69
b56db6cad3 zktorrent: new domain 2025-12-17 04:28:59 +13:00
Garfield69
8310bdf050 magnetcatcat: bump alternate domain 2025-12-17 04:28:44 +13:00
Luka Perović
0b4f8e5c0e thepiratebay: make files optional (#16346)
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-12-16 14:51:02 +00:00
ilike2burnthing
3f50a89ef9 pornolab: update cats. resolves #16345 Open 2025-12-16 14:43:46 +00:00
jackettbot[bot]
1ec83cd58a Update rudub 2025-12-16 01:29:35 +00:00
ilike2burnthing
79271d2954 zonaq: removed per site policy #10022 (#16343) 2025-12-15 21:15:47 +00:00
ilike2burnthing
10d7e7a7d8 readme: update links. resolves #16342 2025-12-15 14:21:03 +00:00
jackettbot[bot]
4da1aa9915 Update rudub 2025-12-15 01:29:38 +00:00
ilike2burnthing
8119b31655 ncore: add rawsearch capability. resolves #16339 2025-12-15 01:02:21 +00:00
Garfield69
8a59aaebd6 pornlab: update cats 2025-12-15 04:12:38 +13:00
Garfield69
7b11313e51 YggTorrent: new TLD 2025-12-15 03:41:25 +13:00
jackettbot[bot]
51ad79f099 Update rudub 2025-12-14 01:29:43 +00:00
Garfield69
58558dc8d4 tvchaosuk: update cats 2025-12-14 04:40:47 +13:00
Garfield69
f139c47a36 yggtorrent: update login. resolves #16334 2025-12-14 04:02:10 +13:00
Garfield69
96f76dc8c4 nusantarare: removed. resolves #15669 2025-12-13 17:32:00 +13:00
jackettbot[bot]
de5089b148 Update rudub 2025-12-13 01:29:16 +00:00
ilike2burnthing
b9e2e64194 anilibria: update domain 2025-12-12 12:32:30 +00:00
Garfield69
aa5826a34a lat-team: -> 9.2.0 drop info_hash 2025-12-12 19:05:06 +13:00
jackettbot[bot]
331aaa7df0 Update rudub 2025-12-12 01:29:32 +00:00
Garfield69
3c3ce1d06f aither: bump engine tag 2025-12-12 13:29:39 +13:00
Garfield69
d201b762b7 polskie-torrenty: new layout resolves #15712 2025-12-12 13:19:24 +13:00
Garfield69
601400970d torrentqq: bump domains 2025-12-12 05:55:30 +13:00
jackettbot[bot]
18774c7452 Update rudub 2025-12-11 01:29:24 +00:00
Garfield69
34c7b27743 ptchina: removed. resolves #13895 2025-12-11 05:19:43 +13:00
Garfield69
fc87f88397 ebooks-shares: update cats 2025-12-11 05:06:48 +13:00
Garfield69
9af424a5e8 zktorrent; add home to path for keywordless search 2025-12-11 04:41:36 +13:00
Garfield69
5b5c032024 torrenttip: bump domain 2025-12-11 04:40:54 +13:00
Garfield69
83e3ed3d40 torrentsome: bump domain 2025-12-11 04:40:43 +13:00
Garfield69
65d8e81bd6 ptvicomo: removed. resolves #15288 2025-12-11 04:40:28 +13:00
ilike2burnthing
de9415e1a0 seedpool-api: restore imdbid & tvdbid. resolves #16329 2025-12-10 11:39:49 +00:00
jackettbot[bot]
e537f18f50 Update rudub 2025-12-10 01:29:24 +00:00
Garfield69
efa332ab30 bitsexy: removed. resolves #12070 2025-12-10 06:07:29 +13:00
ilike2burnthing
72eb28d5b3 torrent-heaven: update cat descriptions 2025-12-09 15:16:32 +00:00
ilike2burnthing
b2b2d36a08 homeporntorrents: removed, tracker down. resolves #14522 (#16328) 2025-12-09 13:58:44 +00:00
Garfield69
5045b3f07d magnetcat: bump alt domain 2025-12-09 18:35:01 +13:00
jackettbot[bot]
39539efa51 Update rudub 2025-12-09 01:29:31 +00:00
Garfield69
adaa5b7cb6 animelovers: removed. resolves #15517 2025-12-09 06:09:52 +13:00
Garfield69
3ead938788 rudub: add comment about alternate TLDs #5673 2025-12-09 05:37:47 +13:00
Garfield69
f9781dcee5 rudub: new domain. #5673 2025-12-08 19:56:50 +13:00
Garfield69
8fed3a0ee4 zetorrents: new domain 2025-12-08 18:33:24 +13:00
jackettbot[bot]
a815ad1361 Update rudub 2025-12-08 01:29:22 +00:00
Garfield69
68f06565b6 matrix: update detection for cat 45 2025-12-08 05:21:13 +13:00
Garfield69
d6ca844550 zktorrent: new domain 2025-12-08 04:51:02 +13:00
Garfield69
5c8047659a extratorrent-st: new cat 2025-12-08 04:49:12 +13:00
Garfield69
f4981623f6 nortorrent: new domain 2025-12-08 04:45:39 +13:00
jackettbot[bot]
255995f5a3 Update rudub 2025-12-07 01:29:33 +00:00
Garfield69
7a58b2ede9 darkpeers: bump engine tag 2025-12-07 14:27:49 +13:00
Garfield69
96a5e66da5 xspeeds: new cat 2025-12-07 05:36:41 +13:00
Garfield69
205cf83789 zktorrent: new domain 2025-12-07 04:50:00 +13:00
Garfield69
f64f4b10ba zetorrents: new domain 2025-12-07 04:49:48 +13:00
Garfield69
5a9e735e54 Update nortorrent.yml 2025-12-07 04:49:35 +13:00
GDBlaster
f736ac6e32 nortorrent: update link to new domain (#16326)
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-12-06 12:10:45 +00:00
jackettbot[bot]
2bc401e1eb Update rudub 2025-12-06 01:29:13 +00:00
Garfield69
96cbc37919 fappaizuri: fix freeleech. resolves #16325 2025-12-06 12:28:55 +13:00
Garfield69
50026d456e torrentdosfilmes: new domains 2025-12-06 04:36:10 +13:00
Garfield69
387758f2dd bludv: new domain 2025-12-06 04:35:47 +13:00
Garfield69
c14a95e182 52bt: bump domains 2025-12-06 04:25:37 +13:00
Garfield69
a0d1131ec4 torrentqq: bump domains 2025-12-05 18:32:45 +13:00
jackettbot[bot]
218306fdf8 Update rudub 2025-12-05 01:29:34 +00:00
jackettbot[bot]
e93b8c32a5 Update rudub 2025-12-04 01:29:29 +00:00
Garfield69
98f3df5ffd assorted unit3d: bump engine tag 2025-12-04 10:54:29 +13:00
Garfield69
a0f47761cc torrenttip: bump domain 2025-12-04 05:17:11 +13:00
Garfield69
37d5526afb torrentsome: bump domain 2025-12-04 05:16:59 +13:00
Antonio R.
57676f6f85 emuwarez: new tld from .it to .com (#16320) 2025-12-03 16:49:30 +13:00
jackettbot[bot]
5e560554fd Update rudub 2025-12-03 01:29:14 +00:00
ilike2burnthing
5735caf11c sktorrent: more specific row selector 2025-12-02 09:27:15 +00:00
ilike2burnthing
7b116f24f3 futuretorrent: add new cat 2025-12-02 05:22:36 +00:00
ilike2burnthing
bb2c656f85 infire: add flaresolverr info 2025-12-02 05:18:22 +00:00
jackettbot[bot]
9491d40061 Update rudub 2025-12-02 01:29:26 +00:00
ilike2burnthing
02523164b1 Update README.md 2025-12-02 00:21:56 +00:00
Garfield69
02bb0db7ac sktorrent: switch to torrents.php resolves #16319 2025-12-02 09:03:06 +13:00
Garfield69
6db76043d4 sktorrent: hardcode pubdate CET timezone. resolves #16319 2025-12-02 07:36:03 +13:00
Garfield69
2808319912 infire: update date selector 2025-12-02 06:14:15 +13:00
Garfield69
9cff2d01d4 qbite: removed. resolves #16057 2025-12-02 05:43:43 +13:00
jackettbot[bot]
7ec9cc046e Update rudub 2025-12-01 01:29:47 +00:00
Garfield69
34a4bab4dd hdgalaktik: use .today.year for keywordless. resolves #13186 2025-12-01 12:16:28 +13:00
Garfield69
5af713d70f STC: -> 9.1.7 drop info_hadsh 2025-12-01 05:29:55 +13:00
Garfield69
ab63facd0d abtorrents: update row selector 2025-12-01 05:25:29 +13:00
ilike2burnthing
93cfb32bad 1337x: setting to disable sort, remove artist & album search
https://github.com/Prowlarr/Prowlarr/issues/2557

artist & album search modes seem to be unnecessary
2025-11-30 05:55:50 +00:00
Garfield69
90e9dd4ed5 hdgalaktik: search with cat[]=0 2025-11-30 14:43:49 +13:00
jackettbot[bot]
3f552d8c8f Update rudub 2025-11-30 01:29:36 +00:00
Garfield69
1987555dc5 hdgalakctik: incldead=0 default
presumably 0 means everything, i.e. active + dead
2025-11-30 14:16:50 +13:00
Garfield69
410d0a5ab3 hdgalaktik: new selectors resolves #13186
note cats are still not selectable
2025-11-30 13:54:39 +13:00
garfield69
6ba4a83948 anilbria: trap/ignore failed http GETs (#16315) resolves #16314 2025-11-30 07:49:44 +13:00
Garfield69
2563792909 zelkaorg: CA expired 2025-11-30 04:43:54 +13:00
Garfield69
1f725b078e revolutiontt: minor cat descr typo 2025-11-29 19:51:54 +13:00
Garfield69
a80a42b46f revolutiontt: update cats resolves #16311 2025-11-29 19:00:01 +13:00
Garfield69
b8283d0982 magnetcat: bump alt domains 2025-11-29 18:33:40 +13:00
ilike2burnthing
f07af5dc54 mteamtp: update cats & info (#16313) 2025-11-29 05:31:17 +00:00
Garfield69
8bf22fb3c3 revolutiontt: add new cat. #16311 2025-11-29 16:06:51 +13:00
Garfield69
05c6991783 revolutiontt: add net cat. #16311 2025-11-29 14:57:13 +13:00
jackettbot[bot]
2402ef6c6f Update rudub 2025-11-29 01:29:00 +00:00
Garfield69
d5f1f63486 hdgalaktik: new layout, no cats. resolves #13186 2025-11-29 06:49:26 +13:00
Garfield69
c357a9f4a7 zetorrents: new domain 2025-11-28 18:32:32 +13:00
jackettbot[bot]
0097d823e6 Update rudub 2025-11-28 01:29:07 +00:00
Garfield69
798a4b160f torrentqq: bump domains 2025-11-28 05:07:47 +13:00
jackettbot[bot]
b0dbd475dc Update rudub 2025-11-27 01:29:09 +00:00
Garfield69
14b132e4f3 torrenttip: bump domain 2025-11-26 18:35:37 +13:00
Garfield69
5e78223cdc torrentsome: bump domain 2025-11-26 18:35:26 +13:00
jackettbot[bot]
4cd883d432 Update rudub 2025-11-26 01:29:05 +00:00
ilike2burnthing
a1a98f9836 theoldschool-api: add setting to disable imdbid & tvdbid search
https://github.com/Prowlarr/Indexers/issues/691
2025-11-25 22:46:44 +00:00
Garfield69
0c9c144e5a extremebits: CA expired. 2025-11-26 05:26:58 +13:00
Garfield69
a2da916252 zktorrent: new domain 2025-11-25 18:34:09 +13:00
Garfield69
8d85708721 assorted nexus: bump engine tag 2025-11-25 17:03:30 +13:00
Garfield69
a00ff4703e rudub workflow part 2 of 2 previous domain pics -> world 2025-11-25 16:08:38 +13:00
jackettbot[bot]
fcf7694ae7 Update rudub 2025-11-25 01:29:25 +00:00
Garfield69
503030045f torrentkitty: prevent "could not select database" 2025-11-25 09:11:34 +13:00
Garfield69
5f53bea74a sosulki: new domain + change row selector. resolves #7559 2025-11-25 06:12:49 +13:00
Garfield69
855d89296a nicept: bump engine tag and add cookie comment. completes 7800813aee 2025-11-25 05:11:51 +13:00
ilike2burnthing
7800813aee nicept: change to cookie login
`response` JS input
2025-11-24 15:14:42 +00:00
ilike2burnthing
2151dba5d1 rudub workflow part 1 of 2 current domain pics -> world 2025-11-24 14:27:09 +00:00
ilike2burnthing
8e1887a133 Revert "matrix: update cat 26 detection"
This reverts commit aa0ae46fd9.
2025-11-24 14:13:24 +00:00
Garfield69
587bef69d4 nortorrent: new domain 2025-11-24 18:34:15 +13:00
ilike2burnthing
32863c2aa9 matrix: add cat 2025-11-24 04:53:08 +00:00
jackettbot[bot]
6e0a3ea759 Update rudub 2025-11-24 01:29:27 +00:00
Garfield69
7de44d8c9e ArabicSource: add magnet. resolves #15996 2025-11-24 08:45:38 +13:00
Garfield69
53646c28de arabicsource: grabs/seed/leech are long not int 2025-11-24 07:36:20 +13:00
Garfield69
aa0ae46fd9 matrix: update cat 26 detection 2025-11-24 07:15:23 +13:00
Bogdan
535f199e84 anilibria: use TryParse in season and episode parsing 2025-11-23 15:05:12 +02:00
Bogdan
64dd9c6897 anilibria: fix roman to arabic regex
Fixes #16303
2025-11-23 14:58:12 +02:00
jackettbot[bot]
eb3898a961 Update rudub 2025-11-23 01:29:45 +00:00
dependabot[bot]
75bf8d7078 build(deps): bump actions/checkout from 5 to 6 (#16305)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
(skip definitions update job for dependabot)
2025-11-22 02:46:28 +00:00
jackettbot[bot]
390b1714f4 Update rudub 2025-11-22 01:28:49 +00:00
Garfield69
6254d62c23 torrentqq: bump domain 2025-11-21 18:32:28 +13:00
jackettbot[bot]
08773ae3c9 Update rudub 2025-11-21 01:28:59 +00:00
jackettbot[bot]
7b7f77e06f Update rudub 2025-11-20 01:29:17 +00:00
Bogdan
64fc61f777 core: refactor remaining obsolete calls (#16301) 2025-11-19 19:41:26 +02:00
Garfield69
dee082ead3 torrenttip: bump domain 2025-11-20 05:39:38 +13:00
Garfield69
6347fdff66 torrentsome: bump domain 2025-11-20 05:39:28 +13:00
Garfield69
cdeac3c0ef kickasstorrents-to: new cat 2025-11-20 05:39:13 +13:00
Bogdan
6d568a4059 yts: update links
Closes #16297
2025-11-19 17:50:18 +02:00
jackettbot[bot]
3dd5b1e5f0 Update rudub 2025-11-19 01:29:18 +00:00
Garfield69
fb9845d1e3 magnetz: q -> query 2025-11-19 13:03:56 +13:00
Garfield69
70b0aa1f67 linuxtracker: new cat 2025-11-19 06:10:10 +13:00
Garfield69
368afcfc5a hdgalaktik: new size selector. resolves dd11b7e6cd 2025-11-18 16:42:57 +13:00
jackettbot[bot]
29d28e2607 Update rudub 2025-11-18 01:29:11 +00:00
Garfield69
b023e8fe6d clearjav: -> 9.1.7 drop info_hash 2025-11-18 06:56:48 +13:00
Garfield69
d51752f682 kickasstorrents-to: new cat 2025-11-18 06:36:40 +13:00
Garfield69
ec40699cdc hdgalaktik: restore previous size selector. reverts dd11b7e6cd 2025-11-18 06:36:24 +13:00
jackettbot[bot]
3c798127c5 Update rudub 2025-11-17 01:29:17 +00:00
Bogdan
61b263dd98 core: refactor obsolete calls (#16290)
* core: refactor obsolete hashing calls

* core: delete cert callback validation removal in update service

* core: remove deprecated ServicePointManager calls

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

* core: avoid is only supported on windows warnings
2025-11-16 22:05:22 +02:00
ilike2burnthing
dd11b7e6cd hdgalaktik: update size selector & remove cert exception 2025-11-16 19:05:54 +00:00
105 changed files with 573 additions and 2165 deletions

View File

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

View File

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

View File

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

View File

@@ -104,7 +104,6 @@ Prior versions of Jackett are no longer supported.
* PornoTorrent
* PornRips
* Postman
* Qbite (Hubite)
* RedeTorrent
* RinTorNeT
* RuTor
@@ -208,7 +207,7 @@ Prior versions of Jackett are no longer supported.
* RuTracker.org
* seleZen
* Sharewood
* SkTorrent
* Sk-CzTorrent
* SkTorrent-org
* themixingbowl (TMB)
* Toloka
@@ -242,7 +241,6 @@ Prior versions of Jackett are no longer supported.
* AlphaRatio (AR)
* AmigosShareClub (ASC)
* AnimeBytes (AB)
* AnimeLovers
* AnimeTorrents (AnT)
* AnimeTorrents.ro (Anime Torrents Romania)
* AnimeWorld (AW)
@@ -272,7 +270,6 @@ Prior versions of Jackett are no longer supported.
* BitHUmen
* Bitpalace
* BitPorn
* BitSexy
* BitTorrentFiles
* BiTTuRK
* BJ-Share (BJ) [![(invite needed)][inviteneeded]](#)
@@ -390,7 +387,6 @@ Prior versions of Jackett are no longer supported.
* HELLENIC-HD
* HHanClub
* HHD
* HomePornTorrents (HPT)
* House of Devil
* HQMusic
* HUDBT (蝴蝶) [![(invite needed)][inviteneeded]](#)
@@ -431,7 +427,7 @@ Prior versions of Jackett are no longer supported.
* LosslessClub [![(invite needed)][inviteneeded]](#)
* LST
* LuckPT [![(invite needed)][inviteneeded]](#)
* M-Team TP (MTTP) [![(invite needed)][inviteneeded]](#)
* M-Team - TP (MTTP)
* MaDs Revolution
* Majomparádé (TurkDepo)
* Making Off
@@ -457,7 +453,6 @@ Prior versions of Jackett are no longer supported.
* Nirvana
* NorBits
* NordicQuality
* Nusanta(RA.RE)
* OKPT
* Old Greek Tracker (OGT)
* Old Toons World (OTW)
@@ -486,7 +481,6 @@ Prior versions of Jackett are no longer supported.
* PT GTK
* PT分享站 (itzmx)
* PTCafe (咖啡)
* PTChina (铂金学院)
* PTerClub (PT之友俱乐部)
* PTFans
* PTFiles (PTF)
@@ -494,7 +488,6 @@ Prior versions of Jackett are no longer supported.
* PTSBAO (烧包) [![(invite needed)][inviteneeded]](#)
* PTSKIT
* PTtime
* PTVicomo
* Punk's Horror Tracker
* PuntoTorrent [![(invite needed)][inviteneeded]](#)
* PuTao (葡萄)
@@ -621,7 +614,6 @@ Prior versions of Jackett are no longer supported.
* Zappateers
* Zelka.org
* ZmPT (织梦)
* ZonaQ [![(invite needed)][inviteneeded]](#)
</details>
Trackers marked with [![(invite needed)][inviteneeded]](#) have no active maintainer and may be broken or missing features. If you have an invite please send it to jacketttest [at] gmail [dot] com or garfieldsixtynine [at] gmail [dot] com get them fixed/improved.
@@ -728,7 +720,7 @@ Jackett can also be run from the command line if you would like to see log messa
## Installation on Linux (AMDx64)
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to the [.NET Required Packages](https://github.com/dotnet/core/blob/main/release-notes/9.0/os-packages.md) page.
### Install as service
A) Command to download and install the latest package and run the Jackett service:
@@ -748,7 +740,7 @@ If you want to run it with a user without a /home directory you need to add `Env
## Installation on Linux (ARMv7 or above)
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to this page https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md
On most operating systems all the required dependencies will already be present. In case they are not, you can refer to the [.NET Required Packages](https://github.com/dotnet/core/blob/main/release-notes/9.0/os-packages.md) page.
### Install as service
1. Download and extract the latest `Jackett.Binaries.LinuxARM32.tar.gz` or `Jackett.Binaries.LinuxARM64.tar.gz` (32 bit is the most common on ARM) release from the [releases](https://github.com/Jackett/Jackett/releases/latest) page

View File

@@ -1,7 +1,7 @@
---
id: 1337x
name: 1337x
description: "1337X is a Public torrent site that offers verified torrent downloads"
description: "1337x is a Public torrent site that offers verified torrent downloads"
language: en-US
type: public
encoding: UTF-8
@@ -115,7 +115,7 @@ caps:
search: [q]
tv-search: [q, season, ep]
movie-search: [q]
music-search: [q, album, artist]
music-search: [q]
book-search: [q]
allowrawsearch: true
@@ -147,6 +147,10 @@ settings:
type: info
label: About the Download links
default: As the iTorrents .torrent download link on this site is known to fail from time to time, we suggest using the magnet link as a fallback. The BTCache and Torrage services are not supported because they require additional user interaction (a captcha for BTCache and a download button on Torrage.)
- name: disablesort
type: checkbox
label: Disable sorting - 1337x prevents sorting searches during high server load, which breaks the indexer when performing a keyword search - disable if you get zero results
default: false
- name: sort
type: select
label: Sort requested from site
@@ -174,10 +178,10 @@ download:
search:
paths:
# present first page of movies tv and music results if there are no search parms supplied (20 hits per page)
- path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Movies{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/1/"
- path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/TV{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}2{{ else }}1{{ end }}/"
- path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Music{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}3{{ else }}1{{ end }}/"
- path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Other{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}4{{ else }}1{{ end }}/"
- path: "{{ if and (.Keywords) (eq .Config.disablesort .False) }}sort-{{ else }}{{ end }}{{ if .Keywords }}search/{{ .Keywords }}{{ else }}cat/Movies{{ end }}{{ if and (.Keywords) (eq .Config.disablesort .False) }}/{{ .Config.sort }}/{{ .Config.type }}{{ else }}{{ end }}/1/"
- path: "{{ if and (.Keywords) (eq .Config.disablesort .False) }}sort-{{ else }}{{ end }}{{ if .Keywords }}search/{{ .Keywords }}{{ else }}cat/TV{{ end }}{{ if and (.Keywords) (eq .Config.disablesort .False)) }}/{{ .Config.sort }}/{{ .Config.type }}{{ else }}{{ end }}/{{ if .Keywords }}2{{ else }}1{{ end }}/"
- path: "{{ if and (.Keywords) (eq .Config.disablesort .False) }}sort-{{ else }}{{ end }}{{ if .Keywords }}search/{{ .Keywords }}{{ else }}cat/Music{{ end }}{{ if and (.Keywords) (eq .Config.disablesort .False) }}/{{ .Config.sort }}/{{ .Config.type }}{{ else }}{{ end }}/{{ if .Keywords }}3{{ else }}1{{ end }}/"
- path: "{{ if and (.Keywords) (eq .Config.disablesort .False) }}sort-{{ else }}{{ end }}{{ if .Keywords }}search/{{ .Keywords }}{{ else }}cat/Other{{ end }}{{ if and (.Keywords) (eq .Config.disablesort .False) }}/{{ .Config.sort }}/{{ .Config.type }}{{ else }}{{ end }}/{{ if .Keywords }}4{{ else }}1{{ end }}/"
keywordsfilters:
- name: re_replace # daily standard S2023 > 2023

View File

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

View File

@@ -8,11 +8,9 @@ encoding: UTF-8
requestDelay: 2
links:
# Send any content to 52btbtbt@gmail.com to get the latest address. or visit https://52btbt.icu/
- https://www.529069.xyz/
- https://www.529067.xyz/
- https://www.529070.xyz/
- https://www.529071.xyz/
legacylinks:
- https://www.529052.xyz/
- https://www.529053.xyz/
- https://www.529055.xyz/
- https://www.529057.xyz/
- https://www.529056.xyz/
@@ -27,6 +25,8 @@ legacylinks:
- https://www.529066.xyz/
- https://www.529065.xyz/
- https://www.529068.xyz/
- https://www.529069.xyz/
- https://www.529067.xyz/
caps:
categorymappings:

View File

@@ -128,7 +128,7 @@ search:
only_free: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}"
rows:
selector: table.table-striped > tbody > tr:has(a[href^="download.php?torrent="])
selector: table.browse.table.striped > tbody > tr:has(a[href^="download.php?torrent="])
fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features
categorydesc:

View File

@@ -190,4 +190,4 @@ search:
minimumseedtime:
# 5 days (as seconds = 5 x 24 x 60 x 60)
text: 432000
# json UNIT3D 9.1.7
# json UNIT3D 9.2.0

View File

@@ -1,201 +0,0 @@
---
id: animelovers-api
name: AnimeLovers (API)
description: "AnimeLovers is a Private tracker for ANIME / MANGA / DOUNGUA / MANHWA"
language: en-US
type: private
encoding: UTF-8
links:
- https://animelovers.club/
caps:
categorymappings:
- {id: 1, cat: Movies/Other, desc: "Anime Movies"}
- {id: 2, cat: TV/Anime, desc: "Anime Series"}
- {id: 3, cat: TV/Anime, desc: "Anime OVA"}
- {id: 11, cat: TV/Anime, desc: "Donghua Anime"}
- {id: 9, cat: XXX, desc: "Doujinshi"}
- {id: 4, cat: Books/Comics, desc: "Manhua/Manhwa"}
- {id: 8, cat: Books/Comics, desc: "Manga"}
- {id: 7, cat: XXX, desc: "Hentai"}
- {id: 10, cat: Audio/Lossless, desc: "Lossless Music"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, tvdbid, 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 or Generate a new API Token by accessing your <a href=\"https://animelovers.club/\" target=\"_blank\">AnimeLovers</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: "In order to not be disabled, you are required to login to AnimeLovers at least once every 90 days."
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
infohash:
selector: info_hash
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 7 days regardless of ratio
# minimumratio:
# text: 0.4
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.5

View File

@@ -124,6 +124,20 @@ search:
order: "{{ .Config.sort }}"
by: "{{ .Config.type }}"
# does not support imdbid search or provide imdb link in results
keywordsfilters:
# Keep SxxEyy format for tv-search (Sonarr/Radarr). ArabP2P search does not reliably match
# when we convert to the Arabic bracket format unless the Arabic title is also present.
- name: re_replace # normalize "1x09" => "S1E09" (then pad below)
args: ["(?i)\\b(\\d{1,2})x(\\d{1,3})\\b", "S$1E$2"]
- name: re_replace # normalize "S01 E09" => "S01E09"
args: ["(?i)\\bS(\\d{1,2})\\s+E(\\d{1,3})\\b", "S$1E$2"]
- name: re_replace # pad season: S1E09 => S01E09
args: ["(?i)\\bS(\\d)(?=E)", "S0$1"]
- name: re_replace # pad episode: S01E9 => S01E09
args: ["(?i)E(\\d)\\b", "E0$1"]
- name: re_replace
args: ["\\s{2,}", " "]
- name: trim
rows:
selector: table#torrents_list_p > tbody > tr:has(a[href^="download.php?id="]), table#torrents_list_p > tbody > tr:has(a[href^="magnet:?xt="])
@@ -139,6 +153,28 @@ search:
args: category
title:
selector: a[href^="index.php?page=torrent-details"]
filters:
- name: re_replace
args: ["(?<=\\d)\\s+(?=\\d)", " "]
- name: re_replace
args: ["\\[(\\d+(?:[\\s-]+\\d+)*)\\]\\s*\\[(\\d{4})\\]\\s*\\[م(\\d+)\\]", "S$3E$1 [$2]"]
- name: re_replace
args: ["\\[(\\d+(?:[\\s-]+\\d+)*)\\]\\s*\\[م(\\d+)\\]", "S$2E$1"]
- name: re_replace
args: ["^\\[(\\d+(?:[\\s-]+\\d+)*)\\](?!\\s*\\[م)", "S01E$1"]
- name: re_replace
args: ["E(\\d+)[\\s-]+(\\d+)", "E$1-E$2"]
- name: re_replace
args: ["\\[\\s*\\]", ""]
- name: re_replace
args: ["(?<=\\S)(\\[)", " $1"]
- name: re_replace
args: ["S(\\d)(?=E)", "S0$1"]
- name: re_replace
args: ["E(\\d)(?=\\D)", "E0$1"]
- name: re_replace
args: ["\\s{2,}", " "]
- name: trim
details:
selector: a[href^="index.php?page=torrent-details"]
attribute: href

View File

@@ -6,6 +6,7 @@ language: hu-HU
type: private
encoding: UTF-8
links:
- https://bitpalace.hu/
- https://bitpalace.cc/
caps:

View File

@@ -191,4 +191,4 @@ search:
minimumseedtime:
# 48 hours (as seconds = 2 x 24 x 60 x 60)
text: 172800
# json UNIT3D 9.1.7 (custom)
# json UNIT3D 9.2.0 (custom)

View File

@@ -1,181 +0,0 @@
---
id: bitsexy-api
name: BitSexy (API)
description: "BitSexy is a Private Torrent Tracker for 3X"
language: en-US
type: private
encoding: UTF-8
links:
- https://bitsexy.cc/
caps:
categorymappings:
- {id: 1, cat: XXX/x264, desc: "Movies"}
- {id: 2, cat: XXX/Pack, desc: "Pack"}
- {id: 3, cat: XXX/ImageSet, desc: "Images"}
- {id: 4, cat: Console, desc: "Games"}
- {id: 5, cat: Books, desc: "Books"}
modes:
search: [q]
movie-search: [q]
book-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://bitsexy.cc/\" target=\"_blank\">BitSexy</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: "<ul><li>You must log in once every 60 days or seed at least 1 torrent to not get disabled</li><li>Once disabled, you have another 60 days to log back in and have your account re-activated. You may need to contact Helpdesk to do so</li><li>Disabled account will be deleted after 180 days of inactivity</li><ul>"
login:
path: /api/torrents
method: get
error:
- selector: a[href*="/login"]
message:
text: "The API key was not accepted by {{ .Config.sitelink }}."
- selector: :root:contains("Account is Banned")
search:
paths:
# https://hdinnovations.github.io/UNIT3D/torrent_api.html
# https://github.com/HDInnovations/UNIT3D/blob/master/app/Http/Controllers/API/TorrentController.php#L657
- path: api/torrents/filter
response:
type: json
headers:
Authorization: ["Bearer {{ .Config.apikey }}"]
inputs:
# if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6
$raw: "{{ range .Categories }}&categories[]={{.}}{{end}}"
name: "{{ .Keywords }}"
"free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}"
sortField: "{{ .Config.sort }}"
sortDirection: "{{ .Config.type }}"
perPage: 100
keywordsfilters:
- name: re_replace
args: ["\\.", " "]
rows:
selector: data
attribute: attributes
fields:
category:
selector: category_id
title_optional:
selector: name
title_filename:
selector: "files[0].name"
optional: true
files:
selector: num_file
title:
text: "{{ if and (.Config.single_file_release_use_filename) (eq .Result.files \"1\") (.Result.title_filename) }}{{ .Result.title_filename }}{{ else }}{{ .Result.title_optional }}{{ end }}"
details:
selector: details_link
download:
selector: download_link
poster:
selector: meta.poster
filters:
- name: replace
args: ["https://via.placeholder.com/90x135", ""]
imdbid:
selector: imdb_id
tmdbid:
selector: tmdb_id
tvdbid:
selector: tvdb_id
genre:
selector: meta.genres
filters:
- 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 }}"
minimumseedtime:
# 2 days (as seconds = 2 x 24 x 60 x 60)
text: 172800
# json UNIT3D 9.1.7 (custom)

View File

@@ -194,4 +194,4 @@ search:
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.7
# json UNIT3D 9.2.0

View File

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

View File

@@ -193,4 +193,4 @@ search:
minimumseedtime:
# 3 days (as seconds = 3 x 24 x 60 x 60)
text: 259200
# json UNIT3D 9.1.7
# json UNIT3D 9.2.0

View File

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

View File

@@ -194,4 +194,4 @@ search:
minimumseedtime:
# 6 days (as seconds = 6 x 24 x 60 x 60)
text: 518400
# json UNIT3D 9.1.7
# json UNIT3D 9.2.0

View File

@@ -82,6 +82,7 @@ caps:
- {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"}
- {id: 369, cat: Books/EBook, desc: "Woodworking"}
# Non Fict/Ref
- {id: 285, cat: Books/EBook, desc: "General Non-fiction"}
- {id: 289, cat: Books/EBook, desc: "Autobiography/Memoir"}
@@ -93,7 +94,6 @@ caps:
- {id: 351, cat: Books/EBook, desc: "Religion"}
- {id: 358, cat: Books/EBook, desc: "History"}
- {id: 362, cat: Books/EBook, desc: "Politics"}
- {id: 368, cat: Books/EBook, desc: "Music"}
# Military
- {id: 287, cat: Books/EBook, desc: "WW1"}
- {id: 288, cat: Books/EBook, desc: "WW2"}

View File

@@ -6,6 +6,8 @@ language: es-ES
type: private
encoding: UTF-8
links:
- https://emuwarez.com/
legacylinks:
- https://emuwarez.it/
caps:
@@ -30,7 +32,7 @@ settings:
- name: info_key
type: info
label: About your API key
default: "Find or Generate a new API Token by accessing your <a href=\"https://emuwarez.it/\" target=\"_blank\">eMuwarez</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
default: "Find or Generate a new API Token by accessing your <a href=\"https://emuwarez.com/\" target=\"_blank\">eMuwarez</a> account <i>My Settings</i> page and clicking on the <b>API Key</b> tab."
- name: freeleech
type: checkbox
label: Search freeleech only

View File

@@ -30,6 +30,7 @@ caps:
- {id: Dubbed Movies, cat: Movies/Foreign, desc: Movies Dubbed}
- {id: Ebooks, cat: Books/EBook, desc: Books Ebook}
- {id: English-translated, cat: TV/Anime, desc: Anime English-translated}
- {id: Episodes HD, cat: TV/HD, desc: Episodes HD}
- {id: Games, cat: XXX/Other, desc: Adult Games}
- {id: Hentai, cat: XXX/Other, desc: Adult Hentai}
- {id: Highres Movies, cat: Movies/HD, desc: Movies HD}

View File

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

View File

@@ -92,7 +92,7 @@ search:
# 0 active, 1 incldead, 2 onlydead
incldead: 1
# 0 all, 1 notfree, 2 onlyfree
freeleech: "{{ if .Config.freeleech }}{{ .Config.freeleech }}2{{ else }}0{{ end }}"
freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}"
lang: "{{ .Config.lang }}"
sort: "{{ .Config.sort }}"
order: "{{ .Config.type }}"

View File

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

View File

@@ -53,6 +53,7 @@ caps:
- {id: 41, cat: PC/Games, desc: " |-- Pc"}
- {id: 42, cat: Console/PS3, desc: " |-- Ps3"}
- {id: 43, cat: Console/PS4, desc: " |-- Ps4"}
- {id: 67, cat: Console/PS4, desc: " |-- Ps5"}
- {id: 44, cat: Console/Wii, desc: " |-- Wii"}
- {id: 45, cat: Console/WiiU, desc: " |-- Wii-U"}
- {id: 46, cat: Console/XBox, desc: " |-- Xbox"}

View File

@@ -163,4 +163,4 @@ search:
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.8.11 2024-03-27
# NexusPHP v1.9.11 2025-11-02

View File

@@ -5,8 +5,6 @@ description: "HDGalaKtik is a RUSSIAN Semi-Private tracker for MOVIES / TV / GEN
language: ru-RU
type: semi-private
encoding: UTF-8
certificates:
- 89cb539248b0d0cb0e92aa3f286ddfdd8347c3be # CN=mail.trackerpmr.com
links:
- https://www.trackerpmr.com/
- https://freetmd.com/
@@ -64,7 +62,7 @@ settings:
4: created
1: title
5: size
8: seeders
7: seeders
- name: type
type: select
label: Order requested from site
@@ -87,22 +85,16 @@ login:
selector: a[href="mybonus.php"]
search:
# https://www.trackerpmr.com/browse.php?search=&stype=0&s=0&cat=0&gr=0&kp=0&im=0&incldead=1&sort=0&type=desc
# https://www.trackerpmr.com/browse.php?cat[]=0&shw_incl_cats=0&incldead=0&search=the+fix&tag=#results
paths:
- path: browse.php
inputs:
$raw: "{{ range .Categories }}c{{.}}=1&{{end}}"
search: "{{ .Keywords }}"
# 0 title, 1 descr, 2 filename, 4 infohash
stype: 0
# 0 AND 1 OR
s: 0
# release group
gr: 0
# ratings
kp: 0
# 1 active, 2 dead, 3 gold, 4 sticky, lots of others
incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}"
# $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}"
cat[]: 0
shw_incl_cats: 0
# 0 default, 1 active, 2 dead, 3 gold, 4 sticky, lots of others
incldead: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}"
search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}"
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
@@ -117,18 +109,25 @@ search:
args: ["[^a-zA-Z0-9]+", "%"]
rows:
selector: div.torrent-card
selector: div.tr-torrent-card-compact:not(:has(div.tr-sticky-highlight))
dateheaders:
selector: a[href*="date="]
attribute: href
filters:
- name: querystring
args: date
- name: dateparse
args: "yyyy-MM-dd"
fields:
categorydesc:
selector: div.category-badge
optional: true
default: Другое
category:
selector: a[href^="browse.php?cat="]
attribute: href
filters:
- name: replace
args: ["---", "Другое"]
- name: querystring
args: cat
title:
selector: a.torrent-title-link
selector: a.tr-title-link-compact
attribute: title
filters:
# normalize to SXXEYY format
@@ -189,47 +188,32 @@ search:
- name: append
args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}"
details:
selector: a.torrent-title-link
selector: a.tr-title-link-compact
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^="download.php?id="]
attribute: href
optional: true
optional: true # for users that do not have DL access
poster:
selector: img.torrent-poster
selector: img.tr-main-poster-compact
attribute: src
imdbid:
selector: a[href^="browse.php?imdb="]
attribute: href
filters:
- name: querystring
args: imdb
size:
selector: a.download-link
selector: div.tr-stat-block-compact:nth-child(3)
seeders:
selector: span.peers-seeders
selector: div.tr-stat-block-compact:nth-child(4)
leechers:
selector: span.peers-leechers
selector: div.tr-stat-block-compact:nth-child(5)
grabs:
selector: span:has(i.fa-download)
date:
selector: div.added-date
filters:
- name: timeago
selector: div.tr-meta-info-compact span:has(i.fa-download)
downloadvolumefactor:
case:
span.bg-success: 0
span.tr-badge-free: 0
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 1.0
description:
selector: a.tag
selector: a.tr-tag-item-compact
attribute: title
# engine n/a

View File

@@ -1,168 +0,0 @@
---
id: homeporntorrents
name: HomePornTorrents
description: "HomePornTorrents (HPT) is a Private Torrent Tracker for Amateur 3X"
language: en-US
type: private
encoding: UTF-8
links:
- https://www.homeporntorrents.club/
caps:
categorymappings:
- {id: 1, cat: XXX, desc: "Anal"}
- {id: 3, cat: XXX, desc: "Asian"}
- {id: 4, cat: XXX, desc: "BBW"}
- {id: 2, cat: XXX, desc: "BDSM"}
- {id: 31, cat: XXX, desc: "Big Boobs"}
- {id: 5, cat: XXX, desc: "Black"}
- {id: 7, cat: XXX, desc: "Creampie"}
- {id: 8, cat: XXX, desc: "Cumshot"}
- {id: 9, cat: XXX, desc: "Fetish"}
- {id: 32, cat: XXX, desc: "Fisting"}
- {id: 10, cat: XXX, desc: "Gangbang"}
- {id: 11, cat: XXX, desc: "Gay"}
- {id: 25, cat: XXX, desc: "Hardcore"}
- {id: 12, cat: XXX, desc: "Interracial"}
- {id: 13, cat: XXX, desc: "Latina"}
- {id: 14, cat: XXX, desc: "Lesbian"}
- {id: 26, cat: XXX, desc: "Masturbation"}
- {id: 15, cat: XXX, desc: "Mature"}
- {id: 16, cat: XXX, desc: "Oral"}
- {id: 19, cat: XXX, desc: "Other"}
- {id: 24, cat: XXX, desc: "Pictures"}
- {id: 27, cat: XXX, desc: "Pissing"}
- {id: 21, cat: XXX, desc: "Pregnant"}
- {id: 28, cat: XXX, desc: "Softcore"}
- {id: 22, cat: XXX, desc: "Squirt"}
- {id: 18, cat: XXX, desc: "Teen (18+)"}
- {id: 17, cat: XXX, desc: "Transsexual"}
- {id: 30, cat: XXX, desc: "VIP"}
- {id: 23, cat: XXX, desc: "Voyeur"}
- {id: 29, cat: XXX, desc: "Webcam"}
modes:
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: sort
type: select
label: Sort requested from site
default: time
options:
time: created
seeders: seeders
size: size
- name: type
type: select
label: Order requested from site
default: desc
options:
desc: desc
asc: asc
- 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 User Settings. The default is <i>25</i>.
login:
path: login
method: form
form: form[action="/login"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
keeplogged: 1
cinfo: "1920|1080|24|-60"
selectorinputs:
token:
selector: input[name="token"]
attribute: value
error:
- selector: div.flash.error
test:
path: index.php
selector: "li#nav_logout"
search:
paths:
# https://www.homeporntorrents.club/torrents.php?order_by=time&order_way=desc&filter_freeleech=1&searchtext=&search_type=0&taglist=&tags_type=0
- path: torrents.php
inputs:
$raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}"
title: "{{ .Keywords }}"
order_by: "{{ .Config.sort }}"
order_way: "{{ .Config.type }}"
action: advanced
filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}"
rows:
# exclude redbar torrents
selector: table#torrent_table > tbody > tr.torrent.shaded_row
fields:
category:
selector: a[href*="filter_cat"]
attribute: href
filters:
- name: regexp
args: \[(\d+?)\]
title:
selector: a[href^="/torrents.php?id="]
details:
selector: a[href^="/torrents.php?id="]
attribute: href
download:
selector: a[href^="/torrents.php?action=download&id="]
attribute: href
description:
selector: div.tags
poster:
# src=\"https:\/\/fapping.empornium.sx\/images\/2023\/05\/30\/MrLuckyPOV2023AlexisFawxXXX720pHEVCx265PRTmp4snapshot0950.jpg\">
selector: td:nth-child(2) > script
filters:
- name: regexp
args: "src=(.*?)>"
- name: re_replace
args: ["[\\\\\"]", ""]
- name: replace
args: ["/static/common/noartwork/noimage.png", ""]
files:
selector: td:nth-child(3)
date:
selector: td:nth-child(5) > span
attribute: title
filters:
# auto adjusted by site account profile
- name: append
args: " +00:00" # GMT
- name: dateparse
args: "MMM dd yyyy, HH:mm zzz"
size:
selector: td:nth-child(6)
grabs:
selector: td:nth-child(7)
seeders:
selector: td:nth-child(8)
leechers:
selector: td:nth-child(9)
downloadvolumefactor:
case:
span.icon[title*="Freeleech"]: 0
img[alt="Freeleech"]: 0
"*": 1
uploadvolumefactor:
text: 1
minimumratio:
text: 0.7
# Luminance

View File

@@ -125,6 +125,8 @@ settings:
options:
DESC: desc
ASC: asc
- name: info_flaresolverr
type: info_flaresolverr
- name: info_activity
type: info
label: Account Inactivity
@@ -187,7 +189,7 @@ search:
# auto adjusted by site account profile
filters:
- name: dateparse
args: "dd/MM/yyyy HH:mm:ss"
args: "dd/MM/yyyyHH:mm:ss"
seeders:
selector: td:nth-last-child(3)
leechers:

View File

@@ -35,10 +35,12 @@ caps:
- {id: Anime, cat: TV/Anime, desc: Anime}
- {id: AnimeAudioLossless, cat: Audio/Lossless, desc: "Anime Audio Lossless"}
- {id: "AnimeAudio[Lossless]", cat: Audio/Lossless, desc: "Anime Audio Lossless"}
- {id: "AnimeAudio[Lossy]", cat: Audio/MP3, desc: "Anime Audio Lossy"}
- {id: AnimeEnglish-translated, cat: TV/Anime, desc: "Anime English-translated"}
- {id: "AnimeLiveAction[English-translated]", cat: TV/Anime, desc: "Anime Live Action English-translated"}
- {id: "AnimeLiveAction[Non-English]", cat: TV/Anime, desc: "Anime Live Action Non-English"}
- {id: "AnimeLiveAction[Raw]", cat: TV/Anime, desc: "Anime Live Action Raw"}
- {id: AnimePictures, cat: Other, desc: Anime Pictures}
- {id: AnimeRaw, cat: TV/Anime, desc: Anime Raw}
- {id: AnimeSubs, cat: TV/Anime, desc: Anime Subs}
- {id: Apps, cat: PC, desc: Apps}
@@ -85,6 +87,7 @@ caps:
- {id: MoviesHighresMovies, cat: Movies/HD, desc: "Movies Highres"}
- {id: MoviesMP4, cat: Movies/HD, desc: "Movies MP4"}
- {id: MoviesMusicvideos, cat: Audio/Video, desc: "Movies Music videos"}
- {id: MoviesMovieclips, cat: Other, desc: "Movies Movie clips"}
- {id: MoviesOtherMovies, cat: Movies/Other, desc: "Movies Other"}
- {id: MoviesUltraHD, cat: Movies/UHD, desc: "Movies UltraHD"}
- {id: Music, cat: Audio, desc: Music}

View File

@@ -16,8 +16,8 @@ caps:
- {id: 80, cat: Audio, desc: "DMC: DMC"}
- {id: 49, cat: Audio/MP3, desc: "KZN MP3 Weekly: Ex-Vip"}
- {id: 76, cat: Audio, desc: "KZN-Exclusive: Exclusive "}
- {id: 77, cat: Audio, desc: "KZN: Out Of VIP"}
- {id: 98, cat: Audio/MP3, desc: "Other Mp3 Weeky: Mp3"}
- {id: 77, cat: Audio, desc: "KZN: Out Of VIP"}
- {id: 99, cat: Audio/MP3, desc: "KZ Internal: KZ Internal"}
- {id: 74, cat: Audio, desc: "Discography: Collection"}
- {id: 82, cat: Audio/Lossless, desc: "Flac: Flac-Flac Packs"}
@@ -29,16 +29,17 @@ caps:
- {id: 24, cat: Audio, desc: "Karaoke: All Karaoke"}
- {id: 47, cat: Movies/BluRay, desc: "Movies: Bluray-HD"}
- {id: 52, cat: Movies, desc: "Pre 90s Movies: Pre90s"}
- {id: 28, cat: Movies, desc: "Movies: 2025"}
- {id: 25, cat: Movies/WEB-DL, desc: "Movies: Web-DL"}
- {id: 28, cat: Movies, desc: "Movies: 2026"}
- {id: 102, cat: Movies/HD, desc: "Movies MP4: Movie MP4"}
- {id: 25, cat: Movies/WEB-DL, desc: "Movies: Web-DL"}
- {id: 105, cat: Movies, desc: "Pre 2000 MP4 Movies: Pre 2000 Mp4"}
- {id: 48, cat: Movies/SD, desc: "Movies: Xvid-Dvd-Webrip"}
- {id: 23, cat: Movies/Other, desc: "Movie: Kids-Anime-Family"}
- {id: 41, cat: Movies/3D, desc: "Remux-3D: Remux-3D"}
- {id: 86, cat: Movies/HD, desc: "1440P QHD: 1440P QHD"}
- {id: 9, cat: Movies/DVD, desc: "Movies: Ntsc Dvdr-ISO"}
- {id: 22, cat: Movies/Foreign, desc: "Movies: Foreign"}
- {id: 27, cat: Movies/UHD, desc: "Movies: 4K"}
- {id: 22, cat: Movies/Foreign, desc: "Movies: Foreign"}
- {id: 53, cat: Movies, desc: "Movie Packs: Movie Pks"}
- {id: 54, cat: Movies, desc: "Movie Pack: Pre-90s"}
- {id: 6, cat: Movies/Other, desc: "Kids Movie Pk: Movie Pks"}

View File

@@ -135,8 +135,6 @@ search:
selector: details_link
download:
selector: download_link
infohash:
selector: info_hash
poster:
selector: meta.poster
filters:
@@ -211,4 +209,4 @@ search:
minimumseedtime:
# 3 days (as seconds = 3 x 24 x 60 x 60)
text: 259200
# json UNIT3D 9.1.5 (custom)
# json UNIT3D 9.2.0 (custom)

View File

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

View File

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

View File

@@ -9,17 +9,12 @@ encoding: UTF-8
links:
- https://magnetcatcat.com/
- https://clmclm.com/
- https://www.8800519.xyz/
- https://www.8800521.xyz/
- https://www.8800522.xyz/
- https://www.8800523.xyz/
- https://www.8800525.xyz/
- https://www.8800528.xyz/
- https://www.8800527.xyz/
- https://www.8800529.xyz/
legacylinks:
- https://www.clm472.sbs/
- https://www.8800500.xyz/
- https://www.8800503.xyz/
- https://www.8800504.xyz/
- https://www.8800505.xyz/
- https://www.8800506.xyz/
- https://www.8800507.xyz/
- https://www.8800508.xyz/
- https://www.8800509.xyz/
@@ -31,6 +26,12 @@ legacylinks:
- https://www.8800517.xyz/
- https://www.8800518.xyz/
- https://www.8800520.xyz/
- https://www.8800519.xyz/
- https://www.8800521.xyz/
- https://www.8800522.xyz/
- https://www.8800523.xyz/
- https://www.8800526.xyz/
- https://www.8800524.xyz/
caps:
categorymappings:

View File

@@ -32,7 +32,7 @@ search:
paths:
- path: search
inputs:
q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}"
query: "{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}"
rows:
selector: a.list-group-item

View File

@@ -15,7 +15,7 @@ caps:
- {id: 23, cat: Movies/Other, desc: "Animációk"}
# - {id: 61, cat: Movies/Other, desc: "Cam/EN"}
- {id: 60, cat: Movies/Other, desc: "Cam/HU"}
# - {id: 45, cat: Books/EBook, desc: "eBook/EN"}
- {id: 45, cat: Books/EBook, desc: "eBook/EN"}
- {id: 40, cat: Books/EBook, desc: "eBook/HU"}
# - {id: 20, cat: Movies/DVD, desc: "Film/DVD9"}
- {id: 48, cat: Movies/HD, desc: "Film/EN/1080p"}
@@ -31,7 +31,7 @@ caps:
- {id: 62, cat: Movies/UHD, desc: "Film/HU/UHD"}
- {id: 4, cat: PC/Games, desc: "Játékok/ISO"}
- {id: 39, cat: PC/Games, desc: "Játékok/Rip/Dox"}
# - {id: 47, cat: Other, desc: "Klippek"}
- {id: 47, cat: Other, desc: "Klippek"}
- {id: 30, cat: Audio/Lossless, desc: "Lossless/EN"}
# - {id: 29, cat: Audio/Lossless, desc: "Lossless/HU"}
- {id: 25, cat: Audio/MP3, desc: "MP3/EN"}
@@ -125,7 +125,7 @@ search:
img[src="/pic/categories/cat_anime.gif"]: 23
# img[src="/pic/categories/061.png"]: 61
img[src="/pic/categories/061.png"]: 60
# img[]: 45
img[src="/pic/categories/017.png"]: 45
img[src="/pic/categories/016.png"]: 40
# img[]: 20
img[src="/pic/categories/010.png"]: 48
@@ -141,7 +141,7 @@ search:
img[src="/pic/categories/uhd_hun.png"]: 62
img[src="/pic/categories/021.png"]: 4
img[src="/pic/categories/cat_games.gif"]: 39
# img[]: 47
img[src="/pic/categories/026.png"]: 47
img[src="/pic/categories/024.png"]: 30
# img[]: 29
img[src="/pic/categories/023.png"]: 25

View File

@@ -57,6 +57,7 @@ caps:
movie-search: [q, imdbid, genre]
music-search: [q, genre]
book-search: [q, genre]
allowrawsearch: true
settings:
- name: username

View File

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

View File

@@ -10,8 +10,7 @@ type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.org/
links:
- https://www.nortorrent.town/
- https://nortorrent-proxy.site/
- https://www.nortorrent7.com/
legacylinks:
# latest domains list
- https://www.rantop.org/
@@ -27,11 +26,6 @@ legacylinks:
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.torrent9.run/
- https://www.torrent9.cv/
- https://www.torrent9.ke/
- https://www.torrent9.gdn/
- https://www.torrent9.men/
- https://www.torrent9.icu/
- https://www-torrent9.com/
- https://www.nortorrent.com/
@@ -42,6 +36,11 @@ legacylinks:
- https://www.nortorrent5.com/
- https://www.nortorrent6.com/
- https://www.nortorrent.net/
- https://www.nortorrent.town/
- https://nortorrent-proxy.site/
- https://ww1-nortorrent.me/
- https://www.nortorrent.rent/
- https://ww1-nortorrent.town/
caps:
categorymappings:

View File

@@ -1,184 +0,0 @@
---
id: nusantarare
name: Nusanta(RA.RE)
description: "Nusanta(RA.RE) is a MALAYSIAN Private Torrent Tracker for MOVIES / TV"
language: en-US
type: private
encoding: UTF-8
links:
- https://nusantara.re/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies"}
- {id: 413, cat: Movies, desc: "Malay Movie"}
- {id: 412, cat: Movies, desc: "Asia Movie"}
- {id: 420, cat: Movies, desc: "Movies Packs"}
- {id: 402, cat: TV, desc: "TV Series"}
- {id: 419, cat: TV, desc: "TV Drama"}
- {id: 403, cat: TV, desc: "TV Shows"}
- {id: 411, cat: TV, desc: "TV Packs"}
- {id: 410, cat: TV, desc: "Islamic"}
- {id: 406, cat: Audio/Video, desc: "Music Videos"}
- {id: 405, cat: TV/Anime, desc: "Animations"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries"}
- {id: 409, cat: Books/EBook, desc: "E-Books"}
- {id: 407, cat: TV/Sport, desc: "Sports"}
- {id: 417, cat: PC/Games, desc: "Games"}
- {id: 418, cat: PC/0day, desc: "Apps & Software"}
- {id: 421, cat: PC/Mobile-iOS, desc: "Apple Apps"}
- {id: 423, cat: Audio, desc: "Audio"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, doubanid]
movie-search: [q, imdbid, doubanid]
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: novip
type: checkbox
label: Hide VIP releases
default: true
- 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.
- name: info_activity
type: info
label: Account Inactivity
default: "Note your account will be DISABLED for the reason below:<ol><li>NOT log in your account in 365 days in a row. Except! VIP and VVIP users.</li><li>Park account or NO new download or other activity on the site in 365 days. Except! VIP and VVIP users.</li></ol>"
login:
path: takelogin.php
method: post
form: form[action="takelogin.php"]
inputs:
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
error:
- selector: td.embedded:has(h2:contains("Login failed"))
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
# https://nusantara.re/torrents.php?incldead=0&inclbookmarked=0&search=&search_area=0&search_mode=0
# https://nusantara.re/torrents.php?incldead=0&inclbookmarked=0&search=tt0171484&search_area=4&search_mode=0
- path: torrents.php
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, 1 OR, 2 exact
search_mode: 0
sort: "{{ .Config.sort }}"
type: "{{ .Config.type }}"
notnewword: 1
rows:
selector: "table.torrents > tbody > tr:has(table.torrentname){{ if .Config.novip }}:not(:has(img[src=\"pic/ico_exclu.gif\"])){{ else }}{{ end }}"
fields:
category:
selector: a[href^="?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_default:
selector: a[href^="details.php?id="]
title_title:
selector: a[title][href^="details.php?id="]
attribute: title
optional: true
default: "{{ .Result.title_default }}"
_isvip:
selector: table.torrentname:has(img[src="pic/ico_exclu.gif"])
optional: true
title:
text: "{{ .Result.title_title }}{{ if .Result._isvip }} [VIP]{{ else }}{{ end }}"
details:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
date_elapsed:
# time type: time elapsed (default)
selector: td.rowfollow:nth-last-of-type(6) > 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-last-of-type(6):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-last-of-type(5)
seeders:
selector: td.rowfollow:nth-last-of-type(4)
leechers:
selector: td.rowfollow:nth-last-of-type(3)
grabs:
selector: td.rowfollow:nth-last-of-type(2)
downloadvolumefactor:
case:
img[src="pic/ico_free.gif"]: 0
img[src="pic/ico_half.gif"]: 0.5
img[src="pic/ico_third.gif"]: 0.3
"*": 1
uploadvolumefactor:
case:
img[src="pic/2x.gif"]: 2
"*": 1
minimumratio:
text: 1.0
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
# Nexus (custom)

View File

@@ -45,7 +45,7 @@ settings:
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Kufei Web Site. Otherwise just leave it empty."
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Panda Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only

View File

@@ -143,7 +143,7 @@ search:
# does not support sorting results, or imdbid searching, or have imdb in results
rows:
selector: div.boxcontent > table > tbody > tr:has(a.link1)
selector: div.boxcontent > table:has(a.link2)
fields:
categorydesc:
@@ -151,13 +151,7 @@ search:
optional: true
default: Pozostale
title_phase1:
selector: a.link1
attribute: href
filters:
- name: regexp
args: f=(.+?)\.torrent
- name: urldecode
- name: htmldecode
selector: a.link2[href^="details.php?id="]
title_multilang:
text: "{{ .Result.title_phase1 }}"
filters:
@@ -171,10 +165,13 @@ search:
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a.link1
selector: a[href^="details.php?id="]
attribute: href
filters:
- name: replace
args: ["details.php?id=", "download.php?torrent="]
poster:
selector: img
selector: img.poster-torrent
attribute: src
date:
selector: td.pole
@@ -187,7 +184,7 @@ search:
selector: td.pole
filters:
- name: regexp
args: "Rozmiar: (\\d+\\.\\d+ [T|G|M|K|k]B)"
args: "(\\d+\\.\\d+ [T|G|M|K|k]B)"
seeders:
selector: td.pole
filters:

View File

@@ -21,16 +21,16 @@ caps:
- {id: 508, cat: XXX, desc: "Классические фильмы / Classic"}
- {id: 555, cat: XXX, desc: "Фильмы с сюжетом / Feature & Vignettes"}
- {id: 1845, cat: XXX, desc: "Гонзо-фильмы 1991-2010 / Gonzo 1991-2010"}
- {id: 1673, cat: XXX, desc: "Гонзо-фильмы 2011-2025 / Gonzo 2011-2025"}
- {id: 1673, cat: XXX, desc: "Гонзо-фильмы 2011-2026 / Gonzo 2011-2026"}
- {id: 1112, cat: XXX, desc: "Фильмы без сюжета 1991-2010 / All Sex & Amateur 1991-2010"}
- {id: 1718, cat: XXX, desc: "Фильмы без сюжета 2011-2025 / All Sex & Amateur 2011-2025"}
- {id: 1718, cat: XXX, desc: "Фильмы без сюжета 2011-2026 / All Sex & Amateur 2011-2026"}
- {id: 553, cat: XXX, desc: "Лесбо-фильмы / All Girl & Solo"}
- {id: 1143, cat: XXX, desc: "Этнические фильмы / Ethnic-Themed"}
- {id: 1646, cat: XXX, desc: "Видео для телефонов и КПК / Pocket РС & Phone Video"}
- {id: 1717, cat: XXX, desc: "Зарубежные фильмы в высоком качестве (DVD&HD) / Full Length Movies High-Quality"}
- {id: 1851, cat: XXX/DVD, desc: "Эротические и Документальные видео (DVD) / Erotic, Documentary & Reality (DVD)"}
- {id: 1713, cat: XXX/DVD, desc: "Фильмы с сюжетом, Классические (DVD) / Feature & Vignetts, Classic (DVD)"}
- {id: 1713, cat: XXX/DVD, desc: "Фильмы с сюжетом, Классические (DVD) / Feature & Vignettes, Classic (DVD)"}
- {id: 512, cat: XXX/DVD, desc: "Гонзо, Лесбо и Фильмы без сюжета (DVD) / Gonzo, All Girl & Solo, All Sex (DVD)"}
- {id: 1712, cat: XXX, desc: "Эротические и Документальные видео (HD Video) / Erotic, Documentary & Reality (HD Video)"}
- {id: 1775, cat: XXX, desc: "Фильмы с сюжетом, Классические (HD Video) / Feature & Vignettes, Classic (HD Video)"}
@@ -43,6 +43,8 @@ caps:
- {id: 1830, cat: XXX, desc: "Сайтрипы с русскими актрисами 1991-2015 (HD Video) / Russian SiteRip's 1991-2015 (HD Video)"}
- {id: 1803, cat: XXX, desc: "Сайтрипы с русскими актрисами 2016-2025 / Russian SiteRip's 2016-2025"}
- {id: 1831, cat: XXX, desc: "Сайтрипы с русскими актрисами 2016-2025 (HD Video) / Russian SiteRip's 2016-2025 (HD Video)"}
- {id: 1877, cat: XXX, desc: "Сайтрипы с русскими актрисами 2026 / Russian SiteRip's 2026"}
- {id: 1878, cat: XXX, desc: "Сайтрипы с русскими актрисами 2026 (HD Video) / Russian SiteRip's 2026 (HD Video)"}
- {id: 1741, cat: XXX, desc: "Русские Порноролики Разное / Russian Clips (various)"}
- {id: 1676, cat: XXX, desc: "Русское любительское видео / Russian Amateur Video"}
@@ -65,6 +67,7 @@ caps:
- {id: 1861, cat: XXX, desc: "Сайтрипы 2023 (HD Video) / SiteRip's 2023 (HD Video)"}
- {id: 1867, cat: XXX, desc: "Сайтрипы 2024 (HD Video) / SiteRip's 2024 (HD Video)"}
- {id: 1872, cat: XXX, desc: "Сайтрипы 2025 (HD Video) / SiteRip's 2025 (HD Video)"}
- {id: 1875, cat: XXX, desc: "Сайтрипы 2026 (HD Video) / SiteRip's 2026 (HD Video)"}
- {id: 1451, cat: XXX, desc: "Сайтрипы 1991-2010 / SiteRip's 1991-2010"}
- {id: 1788, cat: XXX, desc: "Сайтрипы 2011-2012 / SiteRip's 2011-2012"}
- {id: 1789, cat: XXX, desc: "Сайтрипы 2013 / SiteRip's 2013"}
@@ -80,7 +83,9 @@ caps:
- {id: 1862, cat: XXX, desc: "Сайтрипы 2023 / SiteRip's 2023"}
- {id: 1868, cat: XXX, desc: "Сайтрипы 2024 / SiteRip's 2024"}
- {id: 1873, cat: XXX, desc: "Сайтрипы 2025 / SiteRip's 2025"}
- {id: 1876, cat: XXX, desc: "Сайтрипы 2026 / SiteRip's 2026"}
- {id: 1707, cat: XXX, desc: "Сцены из фильмов / Movie Scenes (кроме SiteRip)"}
- {id: 1874, cat: XXX, desc: "Порноролики с переводом / Clips with translation"}
- {id: 284, cat: XXX, desc: "Порноролики Разное / Clips (various)"}
- {id: 1853, cat: XXX, desc: "Компиляции и Музыкальные порно клипы / Compilations & Porn Music Video (PMV)"}
- {id: 1823, cat: XXX, desc: "Порноролики в 3D и Virtual Reality (VR) / 3D & Virtual Reality Videos"}
@@ -89,9 +94,8 @@ caps:
- {id: 1801, cat: XXX/Pack, desc: "Паки японских фильмов и сайтрипов / Full Length Japanese Movies Packs & SiteRip's Packs"}
- {id: 1719, cat: XXX, desc: "Японские фильмы и сайтрипы (DVD и HD Video) / Japanese Movies & SiteRip's (DVD & HD Video)"}
- {id: 997, cat: XXX, desc: "Японские фильмы и сайтрипы 1991-2014 / Japanese Movies & SiteRip's 1991-2014"}
- {id: 1818, cat: XXX, desc: "Японские фильмы и сайтрипы 2015-2025 / Japanese Movies & SiteRip's 2015-2025"}
- {id: 1818, cat: XXX, desc: "Японские фильмы и сайтрипы 2015-2026 / Japanese Movies & SiteRip's 2015-2026"}
- {id: 1849, cat: XXX, desc: "Китайские фильмы и сайтрипы (DVD и HD Video) / Chinese Movies & SiteRip's (DVD & HD Video)"}
- {id: 1815, cat: XXX, desc: "Архив (Японское и китайское порно)"}
- {id: 1723, cat: XXX, desc: "Фото и журналы / Photos & Magazines"}
- {id: 1726, cat: XXX, desc: "MetArt & MetModels"}
@@ -102,7 +106,6 @@ caps:
- {id: 1757, cat: XXX/ImageSet, desc: "Подборки сетов / Picture Sets Packs"}
- {id: 1735, cat: XXX/ImageSet, desc: "Тематическое и нетрадиционное фото / Misc & Special Interest Picture Packs"}
- {id: 1731, cat: XXX/ImageSet, desc: "Журналы / Magazines"}
- {id: 1802, cat: XXX, desc: "Архив (Фото)"}
- {id: 1745, cat: XXX, desc: "Хентай и Манга, Мультфильмы и Комиксы, Рисунки, Аудио / Hentai & Manga, Cartoons & Comics, Artwork & Audio"}
- {id: 1679, cat: XXX, desc: "Хентай: основной подраздел / Hentai: main subsection"}
@@ -114,19 +117,17 @@ caps:
- {id: 1711, cat: XXX, desc: "Мультфильмы / Cartoons"}
- {id: 1296, cat: XXX, desc: "Комиксы, рисунки, аудио / Comics, Artwork & Audio"}
- {id: 1863, cat: XXX, desc: "Обсуждение / Discussion"}
- {id: 1864, cat: XXX, desc: "Архив (Хентай и Манга, Мультфильмы и Комиксы, Рисунки, А.."}
- {id: 1838, cat: XXX, desc: "Игры / Games"}
- {id: 1750, cat: XXX, desc: "Игры: основной подраздел / Games: main subsection"}
- {id: 1756, cat: XXX, desc: "Игры: визуальные новеллы (профессиональная студия) / Games: Visual Novels (Pro)"}
- {id: 1869, cat: XXX, desc: "Игры: визуальные новеллы (независимый разработчик) / Games: Visual Novels (Indie)"}
- {id: 1785, cat: XXX, desc: "Игры: ролевые / Games: role-playing (RPG Maker and WOLF RPG Editor)"}
- {id: 1785, cat: XXX, desc: "Игры: ролевые / Games: role-playing [RPG Maker / WOLF RPG Editor]"}
- {id: 1790, cat: XXX, desc: "Игры и Софт: Анимация / Software: Animation"}
- {id: 1827, cat: XXX, desc: "Игры: В разработке и Демо (основной подраздел) / Games: In Progress and Demo (main subsection)"}
- {id: 1870, cat: XXX, desc: "Игры: В разработке и Демо (визуальные новеллы - независимый разработчик) / Games: In Progress and Demo (visual novels - Indie)"}
- {id: 1828, cat: XXX, desc: "Игры: В разработке и Демо (ролевые) / Games: In Progress and Demo (role-playing - RPG Maker and WOLF RPG Editor)"}
- {id: 1828, cat: XXX, desc: "Игры: В разработке и Демо (ролевые) / Games: In Progress and Demo (role-playing) [RPG Maker / WOLF RPG Editor]"}
- {id: 1829, cat: XXX, desc: "Обсуждение игр / Games Discussion"}
- {id: 1865, cat: XXX, desc: "Архив (Игры)"}
- {id: 11, cat: XXX, desc: "Нетрадиционное порно / Special Interest Movies & Clips"}
- {id: 1715, cat: XXX, desc: "Транссексуалы (DVD и HD) / Transsexual (DVD & HD)"}
@@ -142,11 +143,10 @@ caps:
- {id: 1685, cat: XXX, desc: "Мочеиспускание / Peeing"}
- {id: 1762, cat: XXX, desc: "Фетиш / Fetish"}
- {id: 1681, cat: XXX, desc: "Дефекация / Scat"}
- {id: 1683, cat: XXX, desc: "Архив (общий)"}
- {id: 1688, cat: XXX, desc: "Гей-порно / Gay Forum"}
- {id: 903, cat: XXX, desc: "Полнометражные гей-фильмы / Full Length Movies (Gay)"}
- {id: 1765, cat: XXX, desc: "Полнометражные азиатские гей-фильмы / Full-length Asian (Gay)"}
- {id: 1765, cat: XXX, desc: "Полнометражные азиатские гей-фильмы / Full-length Asian Films (Gay)"}
- {id: 1767, cat: XXX, desc: "Классические гей-фильмы (до 1990 года) / Classic Gay Films (Pre-1990's)"}
- {id: 1755, cat: XXX, desc: "Гей-фильмы в высоком качестве (DVD и HD) / High-Quality Full Length Movies (Gay DVD & HD)"}
- {id: 1787, cat: XXX, desc: "Азиатские гей-фильмы в высоком качестве (DVD и HD) / High-Quality Full Length Asian Movies (Gay DVD & HD)"}
@@ -154,7 +154,6 @@ caps:
- {id: 1777, cat: XXX, desc: "Гей-ролики в высоком качестве (HD Video) / Gay Clips (HD Video)"}
- {id: 1691, cat: XXX, desc: "Ролики, SiteRip'ы и сцены из гей-фильмов / Clips & Movie Scenes (Gay)"}
- {id: 1692, cat: XXX/ImageSet, desc: "Гей-журналы, фото, разное / Magazines, Photo, Rest (Gay)"}
- {id: 1720, cat: XXX, desc: "Архив (Гей-порно)"}
modes:
search: [q]

View File

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

View File

@@ -1,200 +0,0 @@
---
id: ptchina
name: PTChina (铂金学院)
description: "PTChina (铂金学院) is a CHINESE Private Torrent Tracker for MOVIES / TV"
language: zh-CN
type: private
encoding: UTF-8
links:
- https://ptchina.org/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "Movies/电影"}
- {id: 402, cat: TV, desc: "TV Series/电视剧"}
- {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, doubanid]
movie-search: [q, imdbid, doubanid]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: 2facode
type: text
label: 2FA code
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the PTChina Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: 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.
- name: info_activity
type: info
label: Account Inactivity
default: "Account retention rules:<ol><li>Veteran User and above will be retained forever</li><li>Elite User and above will not be deleted after parking (in the control panel)</li><li>Users with a parked account will be deleted if they do not log in for 400 consecutive days</li><li>Users with a non-parked account will be deleted if they do not log in for 150 consecutive days</li><li>Users with no traffic (ie, upload/download data are both 0) will be deleted if they do not log in for 100 consecutive days.</li></ol>"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
secret: ""
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
two_step_code: "{{ .Config.2facode }}"
logout: ""
securelogin: ""
ssl: yes
trackerssl: yes
error:
- selector: td.embedded:has(h2:contains("失败"))
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
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 (not working)
search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}"
# 0 AND, 1 OR, 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="]):has(a[href^="download.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
# site does not have posters enabled. just in case a future update.
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
minimumratio:
text: 1.0
minimumseedtime:
# 1 day (as seconds = 24 x 60 x 60)
text: 86400
description_verified:
case:
span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:"
span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:"
span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:"
description:
selector: td.rowfollow:nth-child(2)
remove: a, b, font, img, span
filters:
- name: prepend
args: "{{ .Result.description_verified }} "
# NexusPHP v1.8.15 2024-12-23

View File

@@ -6,8 +6,10 @@ language: zh-CN
type: private
encoding: UTF-8
links:
- https://pt.gtk.pw/
# backup domain - https://pt1.gtkpw.xyz/
- https://pt.gtkpw.xyz/
legacylinks:
- https://pt.gtk.pw/
caps:
categorymappings:
@@ -44,7 +46,7 @@ settings:
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Uploads Web Site. Otherwise just leave it empty."
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the PT GTK Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only
@@ -195,4 +197,4 @@ search:
description:
selector: td:nth-child(2)
remove: a, b, font, img, span
# NexusPHP v1.8.15 2024-12-23
# NexusPHP v1.9.11 2025-11-02

View File

@@ -91,33 +91,33 @@ search:
fields:
category:
selector: a[href^="torrents.php?cat="]
selector: a[href*="torrents.php?cat="]
attribute: href
filters:
- name: querystring
args: cat
title_default:
selector: table.torrentname td a[href^="details.php?id="]
selector: table.torrentname td a[href*="details.php?id="]
title:
selector: a[title][href^="details.php?id="]
selector: a[title][href*="details.php?id="]
attribute: title
optional: true
default: "{{ .Result.title_default }}"
details:
selector: a[href^="details.php?id="]
selector: a[href*="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
selector: a[href*="download.php?id="]
attribute: href
poster:
selector: img.tooltip
attribute: src
selector: img[data-src]
attribute: data-src
filters:
- name: replace
args: ["pic/imdb_pic/nophoto.gif", ""]
date_elapsed:
# time type: time elapsed (default)
selector: td.rowfollow:nth-child(5) > span[title]
selector: td.rowfollow:nth-child(4) > span[title]
attribute: title
optional: true
filters:
@@ -127,7 +127,7 @@ search:
args: "yyyy-MM-dd HH:mm:ss zzz"
date_added:
# time added
selector: td.rowfollow:nth-child(5):not(:has(span))
selector: td.rowfollow:nth-child(4):not(:has(span))
optional: true
filters:
- name: append
@@ -137,13 +137,13 @@ search:
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(6)
selector: td.rowfollow:nth-child(5)
seeders:
selector: td.rowfollow:nth-child(7)
selector: td.rowfollow:nth-child(6)
leechers:
selector: td.rowfollow:nth-child(8)
selector: td.rowfollow:nth-child(7)
grabs:
selector: td.rowfollow:nth-child(9)
selector: td.rowfollow:nth-child(8)
downloadvolumefactor:
case:
img.pro_free: 0
@@ -158,4 +158,4 @@ search:
img.pro_free2up: 2
img.pro_2up: 2
"*": 1
# NexusPHP custom 22082802
# NexusPHP v1.9.11 2025-11-02

View File

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

View File

@@ -1,208 +0,0 @@
---
id: ptvicomo
name: PTVicomo
description: "PTVicomo is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL"
language: zh-CN
type: private
encoding: UTF-8
links:
- https://ptvicomo.net/
caps:
categorymappings:
- {id: 401, cat: Movies, desc: "电影"}
- {id: 402, cat: TV, desc: "剧集"}
- {id: 415, cat: TV, desc: "短剧"}
- {id: 404, cat: TV/Documentary, desc: "纪录片"}
- {id: 405, cat: TV/Anime, desc: "动漫"}
- {id: 416, cat: TV/Other, desc: "儿童动画"}
- {id: 403, cat: TV, desc: "综艺"}
- {id: 409, cat: Audio, desc: "音乐"}
- {id: 406, cat: Audio/Video, desc: "MV"}
modes:
search: [q]
tv-search: [q, season, ep, imdbid, doubanid]
movie-search: [q, imdbid, doubanid]
music-search: [q]
settings:
- name: username
type: text
label: Username
- name: password
type: password
label: Password
- name: 2facode
type: text
label: 2FA code
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the PTVicomo Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only
default: false
- name: sort
type: select
label: Sort requested from site
default: 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.
- name: info_activity
type: info
label: Account Inactivity
default: "Account retention rules:<ol><li>Extreme User (county road) and above will be retained forever</li><li>Veteran User (rural rank) and above will be retained forever if parked</li><li>Users with a parked account will be banned if they do not log in for 0 consecutive days</li><li><li>Users with no traffic (ie, upload/download data are both 0) will be banned if they do not log in for 90 consecutive days.</li></ol>"
login:
path: login.php
method: form
form: form[action="takelogin.php"]
captcha:
type: image
selector: img[alt="CAPTCHA"]
input: imagestring
inputs:
secret: ""
username: "{{ .Config.username }}"
password: "{{ .Config.password }}"
two_step_code: "{{ .Config.2facode }}"
logout: ""
securelogin: ""
ssl: yes
trackerssl: yes
error:
- selector: td.embedded:has(h2:contains("失败"))
test:
path: index.php
selector: a[href="logout.php"]
search:
paths:
- path: torrents.php
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 (working but not for douban)
search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ 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
# site does not have posters enabled. just in case a future update.
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
# the number of comments do not show up despite user web settings option to enable, throws child count off by 1
date_elapsed:
# time type: time elapsed (default)
selector: td.rowfollow:nth-child(3) 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(3):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(4)
seeders:
selector: td.rowfollow:nth-child(5)
leechers:
selector: td.rowfollow:nth-child(6)
grabs:
selector: td.rowfollow:nth-child(7)
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
minimumratio:
text: 1.0
minimumseedtime:
# 1 day (as seconds = 24 x 60 x 60)
text: 86400
description_verified:
case:
span[title="通过"], span[title="Allowed"]: "Verified:"
span[title="未审"], span[title="Not reviewed"]: "Unverified:"
span[title="拒绝"], span[title="Denied"]: "Banned:"
description:
selector: td.rowfollow:nth-child(2)
remove: a, b, font, img, span
filters:
- name: prepend
args: "{{ .Result.description_verified }} "
# NexusPHP v1.8.13 2024-09-13 (custom)

View File

@@ -1,71 +0,0 @@
---
id: qbite
name: Qbite (Hubite)
description: "Qbite (Hubite) is a Public Torrent Tracker for 3X"
language: en-US
type: public
encoding: UTF-8
links:
- https://qbite.top/
caps:
categorymappings:
- {id: XXX, cat: XXX, desc: "XXX"}
modes:
search: [q]
settings: []
download:
selectors:
- selector: a[href^="magnet:?xt="]
attribute: href
search:
paths:
# https://qbite.top/?do=search&subaction=search&story=2025
- path: /
inputs:
do: search
subaction: search
story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}"
rows:
selector: div.modelCard-box
fields:
category:
text: XXX
title:
selector: a.modelCard-image
attribute: title
details:
selector: a.modelCard-image
attribute: href
download:
selector: a.modelCard-image
attribute: href
poster:
# will often fails with 429 Too Many Request so not sure if its worth including
selector: img[src*="/poster/"]
attribute: src
date:
selector: div.media-item > span
filters:
- name: append
args: " +03:00" # MSK
- name: dateparse
args: "d-MM-yyyy zzz"
size:
selector: a.modelCard-profileTag
seeders:
# site uses a JS random number generator 1-1000 for seed/leech
text: 1
leechers:
text: 1
downloadvolumefactor:
text: 0
uploadvolumefactor:
text: 1
# Engine n/a

View File

@@ -44,7 +44,7 @@ settings:
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Rain Web Site. Otherwise just leave it empty."
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the RailgunPT Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only

View File

@@ -186,4 +186,4 @@ search:
text: "{{ if .Result._featured }}2{{ else }}{{ .Result.uploadvolumefactor_double_upload }}{{ end }}"
minimumratio:
text: 0.8
# json UNIT3D 9.1.7
# json UNIT3D 9.2.0

View File

@@ -115,8 +115,6 @@ search:
selector: details_link
download:
selector: download_link
infohash:
selector: info_hash
poster:
selector: meta.poster
filters:
@@ -186,4 +184,4 @@ search:
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.5
# json UNIT3D 9.2.0

View File

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

View File

@@ -8,39 +8,40 @@ language: ru-RU
type: semi-private
encoding: windows-1251
followredirect: true
# alternate TLDs are: buzz, homes, mom, online, shop, top and xyz
links:
- https://nov16.rudub.pics/
- https://dec20.rudub.bet/
legacylinks:
- https://nov01.rudub.homes/
- http://nov02.rudub.homes/
- https://nov02.rudub.homes/
- http://nov03.rudub.homes/
- https://nov03.rudub.homes/
- http://nov04.rudub.homes/
- https://nov04.rudub.homes/
- http://nov05.rudub.homes/
- https://nov05.rudub.homes/
- http://nov06.rudub.homes/
- https://nov06.rudub.homes/
- http://nov07.rudub.pics/
- https://nov07.rudub.pics/
- http://nov08.rudub.pics/
- https://nov08.rudub.pics/
- http://nov09.rudub.pics/
- https://nov09.rudub.pics/
- http://nov10.rudub.pics/
- https://nov10.rudub.pics/
- http://nov11.rudub.pics/
- https://nov11.rudub.pics/
- http://nov12.rudub.pics/
- https://nov12.rudub.pics/
- http://nov13.rudub.pics/
- https://nov13.rudub.pics/
- http://nov14.rudub.pics/
- https://nov14.rudub.pics/
- http://nov15.rudub.pics/
- https://nov15.rudub.pics/
- http://nov16.rudub.pics/
- http://dec06.rudub.world/
- https://dec06.rudub.world/
- http://dec07.rudub.world/
- https://dec07.rudub.world/
- http://dec08.rudub.world/
- https://dec08.rudub.world/
- https://dec08.rudub.bet/
- http://dec09.rudub.bet/
- https://dec09.rudub.bet/
- http://dec10.rudub.bet/
- https://dec10.rudub.bet/
- http://dec11.rudub.bet/
- https://dec11.rudub.bet/
- http://dec12.rudub.bet/
- https://dec12.rudub.bet/
- http://dec13.rudub.bet/
- https://dec13.rudub.bet/
- http://dec14.rudub.bet/
- https://dec14.rudub.bet/
- http://dec15.rudub.bet/
- https://dec15.rudub.bet/
- http://dec16.rudub.bet/
- https://dec16.rudub.bet/
- http://dec17.rudub.bet/
- https://dec17.rudub.bet/
- http://dec18.rudub.bet/
- https://dec18.rudub.bet/
- http://dec19.rudub.bet/
- https://dec19.rudub.bet/
- http://dec20.rudub.bet/
caps:
categorymappings:
- {id: 1, cat: TV, desc: "TV"}

View File

@@ -39,7 +39,7 @@ settings:
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Rain Web Site. Otherwise just leave it empty."
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the SBPT Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only

View File

@@ -40,8 +40,8 @@ caps:
modes:
search: [q]
tv-search: [q, season, ep, tmdbid]
movie-search: [q, tmdbid]
tv-search: [q, season, ep, imdbid, tvdbid, tmdbid]
movie-search: [q, imdbid, tmdbid]
music-search: [q]
book-search: [q]
@@ -104,7 +104,9 @@ search:
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 }}"
@@ -141,8 +143,12 @@ search:
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:
@@ -206,4 +212,4 @@ search:
minimumseedtime:
# 10 days (as seconds = 10 x 24 x 60 x 60)
text: 864000
# json UNIT3D 9.1.5 (custom)
# json UNIT3D 9.1.5

View File

@@ -115,8 +115,6 @@ search:
selector: details_link
download:
selector: download_link
infohash:
selector: info_hash
poster:
selector: meta.poster
filters:
@@ -188,4 +186,4 @@ search:
minimumseedtime:
# 7 days (as seconds = 7 x 24 x 60 x 60)
text: 604800
# json UNIT3D 9.1.5
# json UNIT3D 9.1.7

View File

@@ -1,7 +1,7 @@
---
id: sktorrent
name: SkTorrent
description: "SkTorrent is a CZECH/SLOVAK Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
name: Sk-CzTorrent
description: "Sk-CzTorrent is a CZECH/SLOVAK Semi-Private Torrent Tracker for MOVIES / TV / GENERAL"
language: cs-CZ
type: semi-private
encoding: UTF-8
@@ -74,14 +74,9 @@ login:
path: torrent/index.php
selector: a[href^="usercp.php"]
download:
selectors:
- selector: a[href^="download.php?id="]
attribute: href
search:
paths:
- path: torrent/torrents_v2.php
- path: torrent/torrents.php
inputs:
search: "{{ .Keywords }}"
category: "{{ range .Categories }}{{.}};{{end}}"
@@ -93,17 +88,18 @@ search:
args: replace
rows:
selector: table.lista > tbody > tr > td > table.lista > tbody > tr > td:has(a[href^="details.php?name="])
selector: table.lista > tbody > tr > td > table.lista > tbody > tr:has(a[href^="download.php?id="])
fields:
category:
selector: a[href^="torrents_v2.php?category="]
selector: a[href^="torrents.php?category="]
attribute: href
filters:
- name: querystring
args: category
title:
selector: a[href^="details.php?name="]
selector: a[href^="details.php?id="]
attribute: title
filters:
- name: re_replace
args: ["^VA\\s*\\|", "VA -"]
@@ -188,39 +184,43 @@ search:
- name: re_replace
args: ["(?i)komplet (\\d{1})\\-(\\d{1})", "komplet S0$1-S0$2"]
details:
selector: a[href^="details.php?name="]
selector: a[href^="details.php?id="]
attribute: href
download:
selector: a[href^="download.php?id="]
attribute: href
poster:
selector: img[class="lozad"]
attribute: data-src
download:
selector: a[href^="details.php?name="]
attribute: href
selector: a[href^="#"]
attribute: onmouseover
filters:
- name: regexp
args: "src=(.+?) width"
- name: prepend
args: "https:"
size:
selector: div:has(a)
selector: td:nth-child(3)
filters:
- name: regexp
args: "Velkost (.+?) \\|"
date:
selector: div:has(a)
# auto adjusted by site account profile
selector: td:nth-child(3)
filters:
- name: regexp
args: "Pridany (\\d{2}/\\d{2}/\\d{4})"
args: "Pridany (\\d{2}/\\d{2}/\\d{4} o \\d{2}:\\d{2})"
- name: replace
args: [" o ", " "]
- name: append
args: " +01:00" # CET
- name: dateparse
args: "dd/MM/yyyy"
args: "dd/MM/yyyy HH:mm zzz"
seeders:
selector: div:has(a)
filters:
- name: regexp
args: "Odosielaju : (\\d+)"
selector: td:nth-child(5)
leechers:
selector: div:has(a)
filters:
- name: regexp
args: "Stahuju : (\\d+)"
selector: td:nth-child(6)
grabs:
selector: td:nth-child(7)
genre:
selector: div:has(a)
selector: td:nth-child(3)
filters:
- name: replace
args: ["\n", ""]

View File

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

View File

@@ -40,7 +40,7 @@ settings:
- name: info_2fa
type: info
label: "About 2FA code"
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the cyanbug Web Site. Otherwise just leave it empty."
default: "Only fill in the <b>2FA code</b> box if you have enabled <b>2FA</b> on the Tangmen Web Site. Otherwise just leave it empty."
- name: freeleech
type: checkbox
label: Search freeleech only

View File

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

View File

@@ -205,6 +205,7 @@ search:
selector: size
files:
selector: num_files
optional: true
seeders:
selector: seeders
leechers:

View File

@@ -10,20 +10,20 @@ links:
caps:
categorymappings:
- {id: 129, cat: Movies/HD, desc: "Hd DVD"}
- {id: 123, cat: Movies/HD, desc: "MKV/X265"}
- {id: 129, cat: Movies/HD, desc: "HD MKV"}
- {id: 123, cat: Movies/HD, desc: "X265/HEVC"}
- {id: 130, cat: Movies/UHD, desc: "4K Films"}
- {id: 10, cat: Movies/DVD, desc: "Dvd rip"}
- {id: 10, cat: Movies/DVD, desc: "Dvd Retail"}
- {id: 111, cat: Movies/SD, desc: "HD2DVD / BR2DVD"}
- {id: 125, cat: Movies/SD, desc: "Xvid rip"}
- {id: 143, cat: Movies/HD, desc: "Divx 720P"}
- {id: 125, cat: Movies/SD, desc: "HD rip"}
- {id: 143, cat: Movies/HD, desc: "Bluray/UHD"}
- {id: 132, cat: TV, desc: "complete seizoen serie"}
- {id: 139, cat: TV, desc: "Losse afleveringen"}
- {id: 140, cat: Books/EBook, desc: "E-Book"}
- {id: 114, cat: Audio/MP3, desc: "Muziek MP3"}
- {id: 105, cat: TV/Documentary, desc: "Documentaire"}
- {id: 142, cat: Audio/Lossless, desc: "Muziek Flac"}
- {id: 115, cat: PC, desc: "pc apps"}
- {id: 105, cat: TV/Documentary, desc: "Documentaire"}
- {id: 120, cat: PC/Games, desc: "Pc Games"}
- {id: 106, cat: Other, desc: "Overig"}
- {id: 131, cat: Books/Comics, desc: "Stripboeken"}

View File

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

View File

@@ -7,20 +7,12 @@ type: public
encoding: UTF-8
followredirect: true
links:
- https://torrentqq394.com/
- https://torrentegg83.com/
- https://torrentqq399.com/
- https://torrentegg86.com/
legacylinks:
- https://torrentegg68.com/
- https://torrentegg69.com/
- https://torrentqq379.com/
- https://torrentegg70.com/
- https://torrentqq380.com/
- https://torrentegg71.com/
- https://torrentqq381.com/
- https://torrentqq382.com/
- https://torrentegg72.com/
- https://torrentegg73.com/
- https://torrentqq383.com/
- https://torrentqq384.com/
- https://torrentegg74.com/
- https://torrentqq385.com/
@@ -40,6 +32,14 @@ legacylinks:
- https://torrentqq392.com/
- https://torrentegg82.com/
- https://torrentqq393.com/
- https://torrentqq394.com/
- https://torrentqq395.com/
- https://torrentegg83.com/
- https://torrentqq396.com/
- https://torrentegg84.com/
- https://torrentqq397.com/
- https://torrentegg85.com/
- https://torrentqq398.com/
caps:
categorymappings:

View File

@@ -9,13 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrentsome221.com/
- https://torrentsome226.com/
legacylinks:
- https://torrentsome206.com/
- https://torrentsome207.com/
- https://torrentsome208.com/
- https://torrentsome209.com/
- https://torrentsome210.com/
- https://torrentsome211.com/
- https://torrentsome212.com/
- https://torrentsome213.com/
@@ -26,6 +21,11 @@ legacylinks:
- https://torrentsome218.com/
- https://torrentsome219.com/
- https://torrentsome220.com/
- https://torrentsome221.com/
- https://torrentsome222.com/
- https://torrentsome223.com/
- https://torrentsome224.com/
- https://torrentsome225.com/
caps:
categorymappings:

View File

@@ -9,13 +9,8 @@ followredirect: true
requestDelay: 2
# to fetch current domain use https://tzip.top/
links:
- https://torrenttip202.top/
- https://torrenttip207.top/
legacylinks:
- https://torrenttip187.top/
- https://torrenttip188.top/
- https://torrenttip189.top/
- https://torrenttip190.top/
- https://torrenttip191.top/
- https://torrenttip192.top/
- https://torrenttip193.top/
- https://torrenttip194.top/
@@ -26,6 +21,11 @@ legacylinks:
- https://torrenttip199.top/
- https://torrenttip200.top/
- https://torrenttip201.top/
- https://torrenttip202.top/
- https://torrenttip203.top/
- https://torrenttip204.top/
- https://torrenttip205.top/
- https://torrenttip206.top/
caps:
categorymappings:

View File

@@ -11,14 +11,15 @@ links:
caps:
categorymappings:
- {id: 29, cat: TV, desc: "Comedy"}
- {id: 45, cat: TV, desc: "Current Affairs"}
- {id: 5, cat: TV/Documentary, desc: "Documentary"}
- {id: 11, cat: TV, desc: "Drama"}
- {id: 14, cat: TV, desc: "Entertainment"}
- {id: 19, cat: TV, desc: "Factual"}
- {id: 43, cat: TV, desc: "Foreign"}
- {id: 32, cat: TV, desc: "Kids/Family"}
- {id: 32, cat: TV, desc: "Kids & Family"}
- {id: 44, cat: Movies, desc: "Movies"}
- {id: 45, cat: TV, desc: "News & Current Affairs"}
- {id: 54, cat: TV, desc: "News"}
- {id: 51, cat: Audio, desc: "Radio"}
- {id: 52, cat: TV, desc: "Reality"}
- {id: 30, cat: TV, desc: "Soaps"}

View File

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

View File

@@ -7,10 +7,10 @@ type: private
encoding: UTF-8
followredirect: true
requestDelay: 4
# status https://www.yggtorrent.org/engine/domains
links:
- https://www.yggtorrent.top/
- https://www.yggtorrent.org/
legacylinks:
- https://www2.yggtorrent.si/
- https://www.yggtorrent.li/
- https://www4.yggtorrent.li/
- https://www3.yggtorrent.nz/
@@ -25,6 +25,7 @@ legacylinks:
- https://www3.yggtorrent.qa/
- https://www3.yggtorrent.cool/
- https://www.ygg.re/
- https://www.yggtorrent.top/
caps:
# dont forget to update the search fields category case block

View File

@@ -7,10 +7,10 @@ type: private
encoding: UTF-8
followredirect: true
requestDelay: 4
# status https://www.yggtorrent.org/engine/domains
links:
- https://www.yggtorrent.top/
- https://www.yggtorrent.org/
legacylinks:
- https://www2.yggtorrent.si/
- https://www.yggtorrent.li/
- https://www4.yggtorrent.li/
- https://www3.yggtorrent.nz/
@@ -25,6 +25,7 @@ legacylinks:
- https://www3.yggtorrent.qa/
- https://www3.yggtorrent.cool/
- https://www.ygg.re/
- https://www.yggtorrent.top/
caps:
# dont forget to update the search fields category case block
@@ -168,11 +169,12 @@ settings:
login:
method: form
path: /auth/login
form: form.login-form
form: form.auth-form
inputs:
id: "{{ .Config.username }}"
pass: "{{ .Config.password }}"
error:
- selector: :root:contains("Bad credentials.")
- selector: p.error-form
- selector: a[href$="/user/disabled"]
message:

View File

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

View File

@@ -5,6 +5,8 @@ description: "Zelka (Zamunda) is a BULGARIAN Private Torrent Tracker for 0DAY /
language: bg-BG
type: private
encoding: windows-1251
certificates:
- 996dbb1ef245699bdd5ea796b704c220c684b626 # Expired 29th Nov 2025
links:
- https://zelka.org/
- https://zamunda.se/

View File

@@ -7,8 +7,7 @@ type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.org/
links:
- https://www.zetorrents.town/
- https://zetorrents-proxy.site/
- https://ww1-zetorrents.town/
legacylinks:
# latest domains list
- https://www.rantop.org/
@@ -23,12 +22,6 @@ legacylinks:
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.zetorrents.nl/
- https://www.zetorrents.biz/
- https://www.zetorrents.ch/
- https://zetorrents.mrunblock.bond/
- https://zetorrents.nocensor.cloud/
- https://www.zetorrents.pw/
- https://www.zetorrents.tw/
- https://www.zetorrents.in/
- https://www.zetorrents.vg/
@@ -40,6 +33,10 @@ legacylinks:
- https://www.zetorrents1.com/
- https://www.zetorrents.diy/
- https://www.zetorrents2.com/
- https://www.zetorrents.town/
- https://zetorrents-proxy.site/
- https://ww1-zetorrents.me/
- https://www.zetorrents.rent/
caps:
categories:

View File

@@ -9,8 +9,7 @@ type: public
encoding: UTF-8
# to fetch current domain use https://www.rantop.org/
links:
- https://www.zktorrent.town/
- https://zktorrent-proxy.site/
- https://www.zktorrent7.com/
legacylinks:
# latest domains list
- https://www.rantop.org/
@@ -26,11 +25,6 @@ legacylinks:
- https://www.site-torrent.com/
- https://www.rantop.my/
# actual legacylinks
- https://www.gktorrent.si/
- https://www.gktorrent.my/
- https://www.gktorrent.cz/
- https://www.gktorrent.ke/
- https://www.gktorrent.cv/
- https://wvw-gktorrent.com/
- https://www-gktorrent.com/
- https://www.zktorrent.com/
@@ -41,6 +35,11 @@ legacylinks:
- https://www.zktorrent5.com/
- https://www.zktorrent.net/
- https://www.zktorrent6.com/
- https://www.zktorrent.town/
- https://zktorrent-proxy.site/
- https://ww1-zktorrent.me/
- https://www.zktorrent.rent/
- https://ww1-zktorrent.town/
caps:
categorymappings:
@@ -101,7 +100,7 @@ download:
search:
paths:
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}{{ end }}"
- path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}home{{ end }}"
keywordsfilters:
# if searching for season packs swith S01 to saison 1 #9712
- name: re_replace

View File

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

View File

@@ -8,10 +8,8 @@ using System.Xml.Linq;
using Jackett.Common.Extensions;
using Jackett.Common.Models;
using Jackett.Common.Models.IndexerConfig.Bespoke;
using Jackett.Common.Serializer;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils.Clients;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
@@ -25,12 +23,13 @@ namespace Jackett.Common.Indexers.Definitions
public override string Id => "anilibria";
public override string Name => "Anilibria";
public override string Description => "Anilibria is a russian-language anime distribution platform";
public override string SiteLink { get; protected set; } = "https://anilibria.top/";
public override string SiteLink { get; protected set; } = "https://aniliberty.top/";
public override string[] LegacySiteLinks => new[]
{
"https://www.anilibria.tv/",
"https://anilibria.top/",
};
// API DOCS at https://anilibria.top/api/docs/v1
// API DOCS at https://aniliberty.top/api/docs/v1
private string ApiBase => $"{SiteLink}api/v1/";
public override string Language => "ru-RU";
public override string Type => "public";
@@ -106,8 +105,16 @@ namespace Jackett.Common.Indexers.Definitions
foreach (var releaseId in torrentIds)
{
var torrentsResponse = await RequestWithCookiesAsync($"{ApiBase}anime/torrents/{releaseId}");
releases.AddRange(MapToReleaseInfo(torrentsResponse));
var url = $"{ApiBase}anime/torrents/{releaseId}";
try
{
var torrentsResponse = await RequestWithCookiesAsync(url);
releases.AddRange(MapToReleaseInfo(torrentsResponse));
}
catch (Exception ex)
{
logger.Error(ex, "Anilibria: Failed to load url [{0}]: {1}", url, ex.Message);
}
}
return releases;
@@ -123,8 +130,16 @@ namespace Jackett.Common.Indexers.Definitions
foreach (var releaseId in releaseIds)
{
var torrentsResponse = await RequestWithCookiesAsync($"{ApiBase}anime/torrents/release/{releaseId}");
releases.AddRange(MapToReleaseInfo(torrentsResponse));
var url = $"{ApiBase}anime/torrents/release/{releaseId}";
try
{
var torrentsResponse = await RequestWithCookiesAsync(url);
releases.AddRange(MapToReleaseInfo(torrentsResponse));
}
catch (Exception ex)
{
logger.Error(ex, "Anilibria: Failed to load url [{0}]: {1}", url, ex.Message);
}
}
return releases;
@@ -204,44 +219,36 @@ namespace Jackett.Common.Indexers.Definitions
seasonPart = Regex.Replace(seasonPart, @"\b\d{4}\b$", "");
var hasPartNumber = Regex.IsMatch(seasonPart, @"\bPart\s+\d+\b", RegexOptions.IgnoreCase);
var seasonMatch = Regex.Match(seasonPart,
@"\b(?:Season|S|Series)\s*(\d+)|\b(\d+)(?:st|nd|rd|th)?\s*Season\b|\b([IVXLCDM]+)\b|\b(\d+)\b",
@"\b(?:Season|S|Series)\s*(?<season_number>\d+)|\b(?<season_number>\d+)(?:st|nd|rd|th)?\s*Season\b|\b(?<roman_number>M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))\b|\b(?<season_number>\d+)\b",
RegexOptions.IgnoreCase);
var season = "S01";
if (seasonMatch.Success && !hasPartNumber)
{
if (!string.IsNullOrEmpty(seasonMatch.Groups[1].Value))
if (seasonMatch.Groups["season_number"].Success
&& !string.IsNullOrWhiteSpace(seasonMatch.Groups["season_number"].Value)
&& int.TryParse(seasonMatch.Groups["season_number"].Value, out var seasonNumber))
{
season = $"S{int.Parse(seasonMatch.Groups[1].Value):D2}";
season = $"S{seasonNumber:D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[2].Value))
{
season = $"S{int.Parse(seasonMatch.Groups[2].Value):D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[3].Value))
else if (seasonMatch.Groups["roman_number"].Success && !string.IsNullOrWhiteSpace(seasonMatch.Groups["roman_number"].Value))
{
season = $"S{RomanToArabic(seasonMatch.Groups[3].Value):D2}";
}
else if (!string.IsNullOrEmpty(seasonMatch.Groups[4].Value))
{
season = $"S{int.Parse(seasonMatch.Groups[4].Value):D2}";
}
}
var episodes = string.Empty;
var epMatch = Regex.Match(episodesPart, @"(\d+)(?:[-–—](\d+))?");
if (epMatch.Success)
if (epMatch.Success && int.TryParse(epMatch.Groups[1].Value, out var episodeStartNumber))
{
var start = int.Parse(epMatch.Groups[1].Value);
if (epMatch.Groups[2].Success)
{
var end = int.Parse(epMatch.Groups[2].Value);
episodes = $"E{start:D2}-E{end:D2}";
episodes = $"E{episodeStartNumber:D2}-E{int.Parse(epMatch.Groups[2].Value):D2}";
}
else
{
episodes = $"E{start:D2}";
episodes = $"E{episodeStartNumber:D2}";
}
}
@@ -250,11 +257,12 @@ namespace Jackett.Common.Indexers.Definitions
private static int RomanToArabic(string roman)
{
int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
string[] numerals = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
roman = roman.ToUpperInvariant();
var values = new[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
var numerals = new[] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
var result = 0;
var i = 0;
roman = roman.ToUpper();
while (roman.Length > 0)
{
if (roman.StartsWith(numerals[i]))

View File

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

View File

@@ -19,10 +19,11 @@ namespace Jackett.Common.Indexers.Definitions
{
public override string Id => "bludv";
public override string Name => "BluDV";
public override string SiteLink { get; protected set; } = "https://bludv.org/";
public override string SiteLink { get; protected set; } = "https://bludv-v1.xyz/";
public override string[] LegacySiteLinks { get; protected set; } = {
"https://bludv.xyz/",
"https://bludv.org/",
};
public BluDV(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps, ICacheService cs)

View File

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

View File

@@ -26,7 +26,7 @@ namespace Jackett.Common.Indexers.Definitions
public override string Id => "mteamtp";
public override string[] Replaces => new[] { "mteamtp2fa" };
public override string Name => "M-Team - TP";
public override string Description => "M-Team TP (MTTP) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / 3X";
public override string Description => "M-Team - TP (MTTP) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL";
public override string SiteLink { get; protected set; } = "https://kp.m-team.cc/";
public override string[] AlternativeSiteLinks => new[]
{
@@ -39,7 +39,7 @@ namespace Jackett.Common.Indexers.Definitions
public override TorznabCapabilities TorznabCaps => SetCapabilities();
private readonly int[] _trackerAdultCategories = { 410, 429, 424, 430, 426, 437, 431, 432, 436, 425, 433, 411, 412, 413, 440 };
private readonly int[] _trackerAdultCategories = { 410, 424, 437, 431, 429, 430, 426, 432, 436, 440, 425, 433, 411, 412, 413 };
private new ConfigurationDataMTeamTp configData => (ConfigurationDataMTeamTp)base.configData;
@@ -83,39 +83,37 @@ namespace Jackett.Common.Indexers.Definitions
caps.Categories.AddCategoryMapping(439, TorznabCatType.MoviesHD, "Movie(電影)/Remux");
caps.Categories.AddCategoryMapping(403, TorznabCatType.TVSD, "TV Series(影劇/綜藝)/SD");
caps.Categories.AddCategoryMapping(402, TorznabCatType.TVHD, "TV Series(影劇/綜藝)/HD");
caps.Categories.AddCategoryMapping(435, TorznabCatType.TVSD, "TV Series(影劇/綜藝)/DVDiSo");
caps.Categories.AddCategoryMapping(438, TorznabCatType.TVHD, "TV Series(影劇/綜藝)/BD");
caps.Categories.AddCategoryMapping(435, TorznabCatType.TVSD, "TV Series(影劇/綜藝)/DVDiSo");
caps.Categories.AddCategoryMapping(404, TorznabCatType.TVDocumentary, "紀錄教育");
caps.Categories.AddCategoryMapping(434, TorznabCatType.Audio, "Music(無損)");
caps.Categories.AddCategoryMapping(406, TorznabCatType.AudioVideo, "MV(演唱)");
caps.Categories.AddCategoryMapping(423, TorznabCatType.PCGames, "PCGame(PC遊戲)");
caps.Categories.AddCategoryMapping(448, TorznabCatType.ConsoleOther, "TvGame(TV遊戲)");
caps.Categories.AddCategoryMapping(405, TorznabCatType.TVAnime, "Anime(動畫)");
caps.Categories.AddCategoryMapping(407, TorznabCatType.TVSport, "Sports(運動)");
caps.Categories.AddCategoryMapping(422, TorznabCatType.PC0day, "Software(軟體)");
caps.Categories.AddCategoryMapping(423, TorznabCatType.PCGames, "PCGame(PC遊戲)");
caps.Categories.AddCategoryMapping(427, TorznabCatType.BooksEBook, "Study/Edu ebook(教育書面)");
caps.Categories.AddCategoryMapping(441, TorznabCatType.BooksOther, "Study/Edu video(教育影片)");
caps.Categories.AddCategoryMapping(422, TorznabCatType.PC0day, "Software(軟體)");
caps.Categories.AddCategoryMapping(442, TorznabCatType.AudioAudiobook, "Study/Edu audio(教育音檔)");
caps.Categories.AddCategoryMapping(451, TorznabCatType.MoviesOther, "教育影片");
caps.Categories.AddCategoryMapping(409, TorznabCatType.Other, "Misc(其他)");
// music
caps.Categories.AddCategoryMapping(406, TorznabCatType.AudioVideo, "MV(演唱)");
caps.Categories.AddCategoryMapping(408, TorznabCatType.AudioOther, "Music(AAC/ALAC)");
caps.Categories.AddCategoryMapping(434, TorznabCatType.Audio, "Music(無損)");
// adult
caps.Categories.AddCategoryMapping(410, TorznabCatType.XXX, "AV(有碼)/HD Censored");
caps.Categories.AddCategoryMapping(429, TorznabCatType.XXX, "AV(無碼)/HD Uncensored");
caps.Categories.AddCategoryMapping(424, TorznabCatType.XXXSD, "AV(有碼)/SD Censored");
caps.Categories.AddCategoryMapping(430, TorznabCatType.XXXSD, "AV(無碼)/SD Uncensored");
caps.Categories.AddCategoryMapping(426, TorznabCatType.XXXDVD, "AV(無碼)/DVDiSo Uncensored");
caps.Categories.AddCategoryMapping(437, TorznabCatType.XXXDVD, "AV(有碼)/DVDiSo Censored");
caps.Categories.AddCategoryMapping(431, TorznabCatType.XXX, "AV(有碼)/Blu-Ray Censored");
caps.Categories.AddCategoryMapping(429, TorznabCatType.XXX, "AV(無碼)/HD Uncensored");
caps.Categories.AddCategoryMapping(430, TorznabCatType.XXXSD, "AV(無碼)/SD Uncensored");
caps.Categories.AddCategoryMapping(426, TorznabCatType.XXXDVD, "AV(無碼)/DVDiSo Uncensored");
caps.Categories.AddCategoryMapping(432, TorznabCatType.XXX, "AV(無碼)/Blu-Ray Uncensored");
caps.Categories.AddCategoryMapping(436, TorznabCatType.XXX, "AV(網站)/0Day");
caps.Categories.AddCategoryMapping(440, TorznabCatType.XXX, "AV(Gay)/HD");
caps.Categories.AddCategoryMapping(425, TorznabCatType.XXX, "IV(寫真影集)/Video Collection");
caps.Categories.AddCategoryMapping(433, TorznabCatType.XXXImageSet, "IV(寫真圖集)/Picture Collection");
caps.Categories.AddCategoryMapping(411, TorznabCatType.XXX, "H-Game(遊戲)");
caps.Categories.AddCategoryMapping(412, TorznabCatType.XXX, "H-Anime(動畫)");
caps.Categories.AddCategoryMapping(413, TorznabCatType.XXX, "H-Comic(漫畫)");
caps.Categories.AddCategoryMapping(440, TorznabCatType.XXX, "AV(Gay)/HD");
return caps;
}

View File

@@ -27,10 +27,9 @@ namespace Jackett.Common.Indexers.Definitions
public override string Id => "mejortorrent";
public override string Name => "MejorTorrent";
public override string Description => "MejorTorrent is a Public site - Hay veces que un torrent viene mejor! :)";
public override string SiteLink { get; protected set; } = "https://www38.mejortorrent.eu/";
public override string SiteLink { get; protected set; } = "https://www39.mejortorrent.eu/";
public override string[] LegacySiteLinks => new[]
{
"https://www21.mejortorrent.zip/",
"https://www22.mejortorrent.zip/",
"https://www23.mejortorrent.zip/",
"https://www24.mejortorrent.zip/",
@@ -46,6 +45,7 @@ namespace Jackett.Common.Indexers.Definitions
"https://www35.mejortorrent.eu/",
"https://www36.mejortorrent.eu/",
"https://www37.mejortorrent.eu/",
"https://www38.mejortorrent.eu/",
};
public override string Language => "es-ES";
public override string Type => "public";

View File

@@ -72,38 +72,38 @@ namespace Jackett.Common.Indexers.Definitions
}
};
caps.Categories.AddCategoryMapping("23", TorznabCatType.TVAnime);
caps.Categories.AddCategoryMapping("22", TorznabCatType.PC0day);
caps.Categories.AddCategoryMapping("1", TorznabCatType.PCISO);
caps.Categories.AddCategoryMapping("36", TorznabCatType.Books);
caps.Categories.AddCategoryMapping("36", TorznabCatType.BooksEBook);
caps.Categories.AddCategoryMapping("4", TorznabCatType.PCGames);
caps.Categories.AddCategoryMapping("21", TorznabCatType.PCGames);
caps.Categories.AddCategoryMapping("16", TorznabCatType.ConsolePS3);
caps.Categories.AddCategoryMapping("40", TorznabCatType.ConsoleWii);
caps.Categories.AddCategoryMapping("39", TorznabCatType.ConsoleXBox360);
caps.Categories.AddCategoryMapping("35", TorznabCatType.ConsoleNDS);
caps.Categories.AddCategoryMapping("34", TorznabCatType.ConsolePSP);
caps.Categories.AddCategoryMapping("2", TorznabCatType.PCMac);
caps.Categories.AddCategoryMapping("10", TorznabCatType.MoviesBluRay);
caps.Categories.AddCategoryMapping("20", TorznabCatType.MoviesDVD);
caps.Categories.AddCategoryMapping("12", TorznabCatType.MoviesHD);
caps.Categories.AddCategoryMapping("44", TorznabCatType.MoviesOther);
caps.Categories.AddCategoryMapping("11", TorznabCatType.MoviesSD);
caps.Categories.AddCategoryMapping("19", TorznabCatType.MoviesSD);
caps.Categories.AddCategoryMapping("6", TorznabCatType.Audio);
caps.Categories.AddCategoryMapping("8", TorznabCatType.AudioLossless);
caps.Categories.AddCategoryMapping("46", TorznabCatType.AudioOther);
caps.Categories.AddCategoryMapping("29", TorznabCatType.AudioVideo);
caps.Categories.AddCategoryMapping("43", TorznabCatType.TVOther);
caps.Categories.AddCategoryMapping("42", TorznabCatType.TVHD);
caps.Categories.AddCategoryMapping("45", TorznabCatType.TVOther);
caps.Categories.AddCategoryMapping("41", TorznabCatType.TVSD);
caps.Categories.AddCategoryMapping("7", TorznabCatType.TVSD);
caps.Categories.AddCategoryMapping("9", TorznabCatType.XXX);
caps.Categories.AddCategoryMapping("49", TorznabCatType.XXX);
caps.Categories.AddCategoryMapping("47", TorznabCatType.XXXDVD);
caps.Categories.AddCategoryMapping("48", TorznabCatType.XXX);
caps.Categories.AddCategoryMapping("23", TorznabCatType.TVAnime, "Anime");
caps.Categories.AddCategoryMapping("2", TorznabCatType.PCMac, "Appz-Mac/Linux");
caps.Categories.AddCategoryMapping("1", TorznabCatType.PCISO, "Appz-Win/PC");
caps.Categories.AddCategoryMapping("22", TorznabCatType.AudioAudiobook, "Book-Audio");
caps.Categories.AddCategoryMapping("36", TorznabCatType.BooksEBook, "Book-Ebook");
caps.Categories.AddCategoryMapping("40", TorznabCatType.ConsoleWii, "Games-Nin");
caps.Categories.AddCategoryMapping("16", TorznabCatType.ConsolePS3, "Games-PS");
caps.Categories.AddCategoryMapping("4", TorznabCatType.PCGames, "Games-Win");
caps.Categories.AddCategoryMapping("39", TorznabCatType.ConsoleXBox360, "Games-XBOX");
caps.Categories.AddCategoryMapping("35", TorznabCatType.ConsoleNDS, "Handheld/NDS");
caps.Categories.AddCategoryMapping("34", TorznabCatType.PCMobileOther, "Mobile");
caps.Categories.AddCategoryMapping("51", TorznabCatType.MoviesUHD, "Movies/4K");
caps.Categories.AddCategoryMapping("10", TorznabCatType.MoviesBluRay, "Movies/BluRay");
caps.Categories.AddCategoryMapping("20", TorznabCatType.MoviesDVD, "Movies/DVDR");
caps.Categories.AddCategoryMapping("12", TorznabCatType.MoviesHD, "Movies/HDx264");
caps.Categories.AddCategoryMapping("44", TorznabCatType.MoviesOther, "Movies/Packs");
caps.Categories.AddCategoryMapping("11", TorznabCatType.MoviesHD, "Movies/x265");
caps.Categories.AddCategoryMapping("19", TorznabCatType.MoviesSD, "Movies/XviD");
caps.Categories.AddCategoryMapping("6", TorznabCatType.Audio, "Music");
caps.Categories.AddCategoryMapping("8", TorznabCatType.AudioLossless, "Music/FLAC");
caps.Categories.AddCategoryMapping("46", TorznabCatType.AudioOther, "Music/Packs");
caps.Categories.AddCategoryMapping("29", TorznabCatType.AudioVideo, "MusicVideos");
caps.Categories.AddCategoryMapping("21", TorznabCatType.TVSport, "Sports");
caps.Categories.AddCategoryMapping("43", TorznabCatType.TVOther, "TV/DVDR");
caps.Categories.AddCategoryMapping("42", TorznabCatType.TVHD, "TV/HDx264");
caps.Categories.AddCategoryMapping("45", TorznabCatType.TVOther, "TV/Packs");
caps.Categories.AddCategoryMapping("41", TorznabCatType.TVSD, "TV/SDx264");
caps.Categories.AddCategoryMapping("7", TorznabCatType.TVSD, "TV/XViD");
caps.Categories.AddCategoryMapping("9", TorznabCatType.XXX, "XXX");
caps.Categories.AddCategoryMapping("49", TorznabCatType.XXX, "XXX/0DAY");
caps.Categories.AddCategoryMapping("47", TorznabCatType.XXXDVD, "XXX/DVDR");
caps.Categories.AddCategoryMapping("48", TorznabCatType.XXX, "XXX/HDx264");
return caps;
}

View File

@@ -21,17 +21,19 @@ namespace Jackett.Common.Indexers.Definitions
{
public override string Id => "torrentdosfilmes";
public override string Name => "TorrentDosFilmes";
public override string SiteLink { get; protected set; } = "https://torrentdosfilmes.net/";
public override string SiteLink { get; protected set; } = "https://torrentdosfilmes1.net/";
public override string[] AlternativeSiteLinks { get; protected set; } = {
"https://torrentdosfilmes.net/",
"https://comando4kfilmes.xyz/",
"https://torrentdosfilmes1.net/",
"https://comando4kfilmes-v1.xyz/",
};
public override string[] LegacySiteLinks { get; protected set; } = {
"https://torrentdosfilmes.site/",
"https://torrentsdosfilmes.to/",
"https://ComandoFilmes.xyz/",
"https://torrentdosfilmes.net/",
"https://comando4kfilmes.xyz/",
};
public TorrentDosFilmes(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps,

View File

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

View File

@@ -96,6 +96,7 @@ namespace Jackett.Common.Indexers.Definitions
caps.Categories.AddCategoryMapping(112, TorznabCatType.MoviesOther, "Anime Movies");
caps.Categories.AddCategoryMapping(111, TorznabCatType.MoviesOther, "Anime TV");
caps.Categories.AddCategoryMapping(150, TorznabCatType.PC, "Apps");
caps.Categories.AddCategoryMapping(166, TorznabCatType.PCMac, "Apps MacOS");
caps.Categories.AddCategoryMapping(153, TorznabCatType.Books, "Books");
caps.Categories.AddCategoryMapping(154, TorznabCatType.AudioAudiobook, "Books Audiobooks");
caps.Categories.AddCategoryMapping(155, TorznabCatType.Books, "Books eBooks & Magazines");

View File

@@ -1,298 +0,0 @@
using System;
using System.Collections.Generic;
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.Models;
using Jackett.Common.Models.IndexerConfig;
using Jackett.Common.Services.Interfaces;
using Jackett.Common.Utils;
using Jackett.Common.Utils.Clients;
using Newtonsoft.Json.Linq;
using NLog;
using WebClient = Jackett.Common.Utils.Clients.WebClient;
namespace Jackett.Common.Indexers.Definitions
{
[ExcludeFromCodeCoverage]
public class ZonaQ : IndexerBase
{
public override string Id => "zonaq";
public override string Name => "ZonaQ";
public override string Description => "ZonaQ is a SPANISH Private Torrent Tracker for MOVIES / TV";
public override string SiteLink { get; protected set; } = "https://www.zonaq.pw/";
public override string Language => "es-ES";
public override string Type => "private";
public override TorznabCapabilities TorznabCaps => SetCapabilities();
private string Login1Url => SiteLink + "index.php";
private string Login2Url => SiteLink + "paDentro.php";
private string Login3Url => SiteLink + "retorno/include/puerta_8_ajax.php";
private string Login4Url => SiteLink + "retorno/index.php";
private string SearchUrl => SiteLink + "retorno/2/index.php";
private new ConfigurationDataBasicLogin configData => (ConfigurationDataBasicLogin)base.configData;
public ZonaQ(IIndexerConfigurationService configService, WebClient wc, Logger l, IProtectionService ps, ICacheService cs)
: base(configService: configService,
client: wc,
logger: l,
p: ps,
cacheService: cs,
configData: new ConfigurationDataBasicLogin("For best results, change the 'Torrents por página' option to 100 in 'Mi Panel' page."))
{
}
private TorznabCapabilities SetCapabilities()
{
var caps = new TorznabCapabilities
{
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
},
MovieSearchParams = new List<MovieSearchParam>
{
MovieSearchParam.Q
}
};
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=1", TorznabCatType.MoviesDVD, "Películas/DVD");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=2", TorznabCatType.MoviesDVD, "Películas/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=3", TorznabCatType.MoviesBluRay, "Películas/BD");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=4", TorznabCatType.MoviesUHD, "Películas/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=5", TorznabCatType.Movies3D, "Películas/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=6", TorznabCatType.MoviesBluRay, "Películas/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=7", TorznabCatType.MoviesHD, "Películas/MKV");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=8", TorznabCatType.MoviesUHD, "Películas/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=1&subcat[]=9", TorznabCatType.MoviesUHD, "Películas/BD Remux 4K");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=1", TorznabCatType.MoviesDVD, "Animación/DVD");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=2", TorznabCatType.MoviesDVD, "Animación/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=3", TorznabCatType.MoviesBluRay, "Animación/BD");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=4", TorznabCatType.MoviesUHD, "Animación/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=5", TorznabCatType.Movies3D, "Animación/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=6", TorznabCatType.MoviesBluRay, "Animación/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=7", TorznabCatType.MoviesHD, "Animación/MKV");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=8", TorznabCatType.MoviesUHD, "Animación/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=2&subcat[]=9", TorznabCatType.MoviesUHD, "Animación/BD Remux 4K");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=1", TorznabCatType.AudioVideo, "Música/DVD");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=2", TorznabCatType.AudioVideo, "Música/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=3", TorznabCatType.AudioVideo, "Música/BD");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=4", TorznabCatType.AudioVideo, "Música/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=5", TorznabCatType.AudioVideo, "Música/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=6", TorznabCatType.AudioVideo, "Música/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=7", TorznabCatType.AudioVideo, "Música/MKV");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=8", TorznabCatType.AudioVideo, "Música/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=3&subcat[]=9", TorznabCatType.AudioVideo, "Música/BD Remux 4K");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=1", TorznabCatType.TVSD, "Series/DVD");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=2", TorznabCatType.TVSD, "Series/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=3", TorznabCatType.TVHD, "Series/BD");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=4", TorznabCatType.TVUHD, "Series/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=5", TorznabCatType.TVOther, "Series/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=6", TorznabCatType.TVHD, "Series/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=7", TorznabCatType.TVHD, "Series/MKV");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=8", TorznabCatType.TVUHD, "Series/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=4&subcat[]=9", TorznabCatType.TVUHD, "Series/BD Remux 4K");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=1", TorznabCatType.TVDocumentary, "Docus/DVD");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=2", TorznabCatType.TVDocumentary, "Docus/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=3", TorznabCatType.TVDocumentary, "Docus/BD");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=4", TorznabCatType.TVDocumentary, "Docus/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=5", TorznabCatType.TVDocumentary, "Docus/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=6", TorznabCatType.TVDocumentary, "Docus/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=7", TorznabCatType.TVDocumentary, "Docus/MKV");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=8", TorznabCatType.TVDocumentary, "Docus/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=5&subcat[]=9", TorznabCatType.TVDocumentary, "Docus/BD Remux 4K");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=1", TorznabCatType.OtherMisc, "Deportes y Otros/DVD");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=2", TorznabCatType.OtherMisc, "Deportes y Otros/BDVD + Autorías");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=3", TorznabCatType.OtherMisc, "Deportes y Otros/BD");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=4", TorznabCatType.OtherMisc, "Deportes y Otros/BD 4K");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=5", TorznabCatType.OtherMisc, "Deportes y Otros/BD 3D");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=6", TorznabCatType.OtherMisc, "Deportes y Otros/BD Remux");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=7", TorznabCatType.OtherMisc, "Deportes y Otros/MKV");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=8", TorznabCatType.OtherMisc, "Deportes y Otros/MKV 4K");
caps.Categories.AddCategoryMapping("cat[]=6&subcat[]=9", TorznabCatType.OtherMisc, "Deportes y Otros/BD Remux 4K");
return caps;
}
public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
{
LoadValuesFromJson(configJson);
try
{
await DoLogin();
var results = await PerformQuery(new TorznabQuery());
if (!results.Any())
throw new Exception("Found 0 results in the tracker");
IsConfigured = true;
SaveConfig();
return IndexerConfigurationStatus.Completed;
}
catch (Exception e)
{
IsConfigured = false;
throw new Exception("Login error: " + e.Message);
}
}
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
{
var releases = new List<ReleaseInfo>();
var qc = new NameValueCollection
{
{"page", "torrents"},
{"search", query.GetQueryString()},
{"active", "0"}
};
var searchUrl = SearchUrl + "?" + qc.GetQueryString();
foreach (var cat in MapTorznabCapsToTrackers(query)) // categories are already encoded
searchUrl += "&" + cat;
var response = await RequestWithCookiesAsync(searchUrl);
var results = response.ContentString;
if (results == null || !results.Contains("/index.php?action=logout;"))
{
logger.Info("ZonaQ re-login");
await DoLogin(); // re-login
response = await RequestWithCookiesAsync(searchUrl);
results = response.ContentString;
}
try
{
var parser = new HtmlParser();
using var doc = parser.ParseDocument(results);
var rows = doc.QuerySelectorAll("table.torrent_list > tbody > tr");
foreach (var row in rows.Skip(1))
{
var qTitleLink = row.QuerySelector("a[href*=\"?page=torrent-details\"]");
if (qTitleLink == null) // no results
continue;
var title = qTitleLink.TextContent.Trim();
title += " SPANiSH"; // fix for Radarr
title = Regex.Replace(title, "4k", "2160p", RegexOptions.IgnoreCase);
var detailsStr = qTitleLink.GetAttribute("href");
var details = new Uri(detailsStr);
var link = new Uri(detailsStr.Replace("/index.php?page=torrent-details&", "/download.php?"));
var qPoster = qTitleLink.GetAttribute("title");
var poster = qPoster != null ? new Uri(qPoster) : null;
var publishDateStr = row.Children[4].InnerHtml.Split('>').Last();
var publishDate = DateTime.ParseExact(publishDateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture);
var size = ParseUtil.GetBytes(row.Children[5].TextContent);
var seeders = ParseUtil.CoerceInt(row.Children[6].TextContent);
var leechers = ParseUtil.CoerceInt(row.Children[7].TextContent);
var grabs = ParseUtil.CoerceInt(row.Children[8].TextContent);
var cat1 = row.Children[0].FirstElementChild.GetAttribute("href").Split('=').Last();
var cat2 = row.Children[1].FirstElementChild.GetAttribute("href").Split('=').Last();
var cat = MapTrackerCatToNewznab($"cat[]={cat1}&subcat[]={cat2}");
var dlVolumeFactor = row.QuerySelector("img[src*=\"/gold.png\"]") != null ? 0 :
row.QuerySelector("img[src*=\"/silver.png\"]") != null ? 0.5 : 1;
var ulVolumeFactor = row.QuerySelector("img[src*=\"/por3.gif\"]") != null ? 3 :
row.QuerySelector("img[src*=\"/por2.gif\"]") != null ? 2 : 1;
var release = new ReleaseInfo
{
Title = title,
Details = details,
Guid = details,
Link = link,
PublishDate = publishDate,
Poster = poster,
Category = cat,
Size = size,
Grabs = grabs,
Seeders = seeders,
Peers = seeders + leechers,
DownloadVolumeFactor = dlVolumeFactor,
UploadVolumeFactor = ulVolumeFactor,
MinimumRatio = 1,
MinimumSeedTime = 259200 // 72 hours
};
releases.Add(release);
}
}
catch (Exception ex)
{
OnParseError(results, ex);
}
return releases;
}
private async Task DoLogin()
{
// The first page set the cookies and the session_id
CookieHeader = "";
var result = await RequestWithCookiesAsync(Login1Url, "");
var parser = new HtmlParser();
using var dom = parser.ParseDocument(result.ContentString);
var sessionId = dom.QuerySelector("input#session_id")?.GetAttribute("value");
if (string.IsNullOrWhiteSpace(sessionId))
throw new ExceptionWithConfigData("Error getting the Session ID", configData);
// 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 pairs = new Dictionary<string, string> {
{ "user", configData.Username.Value },
{ "passwrd", configData.Password.Value },
{ "hash_passwrd", hashPassword }
};
var headers = new Dictionary<string, string>
{
{"X-Requested-With", "XMLHttpRequest"}
};
result = await RequestWithCookiesAsync(Login2Url, method: RequestType.POST, data: pairs, headers: headers);
var message = JObject.Parse(result.ContentString)["msg"]?.ToString();
if (message == "puerta_2")
{
// The third page sets the cookie duration
Thread.Sleep(3000);
pairs = new Dictionary<string, string> {
{ "passwd", "" },
{ "cookielength", "43200" }, // 1 month
{ "respuesta", "" }
};
result = await RequestWithCookiesAsync(Login3Url, method: RequestType.POST, data: pairs, headers: headers);
message = JObject.Parse(result.ContentString)["msg"]?.ToString();
}
if (message != "last_door")
throw new ExceptionWithConfigData($"Login error: {message}", configData);
// The forth page sets the last cookie
Thread.Sleep(3000);
await RequestWithCookiesAsync(Login4Url);
}
private static string Sha1Hash(string input)
{
var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
return string.Concat(hash.Select(b => b.ToString("x2")));
}
}
}

View File

@@ -12,7 +12,7 @@ namespace Jackett.Common.Models.IndexerConfig.Bespoke
public ConfigurationDataMTeamTp()
{
ApiKey = new StringConfigurationItem("API Key");
ApiKeyInfo = new DisplayInfoConfigurationItem("ApiKey Info", "The API key can be obtained by accessing your M-Team-TP User Control Panel > Security > Laboratory.");
ApiKeyInfo = new DisplayInfoConfigurationItem("ApiKey Info", "The API key can be obtained by accessing your M-Team - TP User CP > Laboratory.");
FreeleechOnly = new BoolConfigurationItem("Search freeleech only") { Value = false };
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More