pt-plugins/pt-depiler/ptd-site-definition
- community
Checking that the SKILL.md file is still in the repository.
为 PT-depiler 仓库新增或修改 PT/BT 站点定义文件(src/packages/site/definitions/*.ts)时使用。覆盖:判定站点所属引擎、编写 siteMetadata(id/urls/version/category/search/userInfo/levelRequirements)、编写选择器与 filters、覆写引擎类方法、以及提交前的类型检查与静态校验。Use when adding support for a new tracker site, editing an existing site definition, adapting a NexusPHP / Unit3D / Gazelle / GazelleJSONAPI / AvistazNetwork / Luminance / Rartracker / TCG site, or when the task mentions definitions/、schemas/、siteMetadata、search selectors、userInfo process。
Install
npx vskill@latest install pt-plugins/pt-depiler/ptd-site-definitionSKILL.md
PT-depiler 站点定义(site definition)编写
目标产物是 src/packages/site/definitions/<id>.ts:一个文件定义一个站点,导出 siteMetadata: ISiteMetadata,按需再导出一个覆写引擎行为的 default class。本 skill 只讲「如何写这个文件」;修改 types/ 公共类型或 schemas/ 引擎实现属于另一层次的工作,除非用户明确要求,不要顺手改动。
先理解加载机制(决定了哪些东西必须写、哪些不用写)
src/packages/site/index.ts:21-29用import.meta.glob自动收集schemas/*.ts与definitions/*.ts。新增定义文件不需要注册到任何列表,文件名(去扩展名)就是 siteId。- 实例构造顺序见
index.ts:79-102:
- definition 导出了
default class→ 直接用它; - 否则取
siteMetadata.schema指向的 schema 类; schema值在schemas/里没有对应实现 → 按type回落AbstractPrivateSite(private)或AbstractBittorrentSite(public)。
index.ts:41-42:siteMetadata.schema缺省时同样按type回落,所以不写 `schema` 也合法。- `SchemaMetadata` 不会被自动合并:
index.ts:100-101从 schema 模块只取default class。definition 必须自己写...SchemaMetadata才能拿到引擎默认值(如search/userInfo/detail),否则该站点的这些配置就是空的。 index.ts:53-59:urls/legacyUrls/trackerUrls会做 rot13 还原后再使用(只有这三个字段会还原,其它字段里写uggcf://不会被解出来)。index.ts:59-60:tags缺省为[];timezoneOffset缺省为NexusPHP站点+0800、其余+0000。
工作流
- 判定引擎:先确定目标站点由哪个 schema 承载(NexusPHP / Unit3D / Gazelle / GazelleJSONAPI / AvistazNetwork / Luminance / Rartracker / TCG / 仅基类)。判定依据写在各个引擎文档的「判定站点是否属于该引擎」一节。
- 读该引擎的 reference:见下方「按需读取」。不要凭记忆套模板,不同 schema 的
SchemaMetadata默认值差异很大。 - 收集事实:category 的 value→name、搜索入口、选择器、等级要求必须来自真实页面、接口响应或站点规则页。拿不到就明确写出假设并向用户确认,严禁为了让文件"看起来完整"而编造数值、选择器或接口路径。
- 写文件:以同引擎既有定义文件为骨架(
...SchemaMetadata展开 + 覆写差异项),只写与默认值不同的部分。 - 校验:跑
pnpm check(vue-tsc --noEmit+ 站点定义的静态校验,见下),必要时跑pnpm format。 - 交付:说明改了什么、依据是什么、哪些值来自真实站点、哪些是待确认的假设。
硬性规则
- id = 文件名,必须匹配
/[0-9a-z]+/(无大写、无特殊字符,见types/site.ts:36-44)。若 Jackett 有同名站点配置,优先与其命名一致。 - version:必填数字,既有定义全部显式声明(2026-09 的 master 上 301 个定义文件无一例外)。
types/site.ts:46-54的约定是「模板类-1;NexusPHP/Unit3D/Gazelle/GazelleJSONAPI/AvistaZ系0且无需递增;其余站点 >0」。
但仓库现状与文字约定不一致:引擎类定义普遍写 1(2026-09 统计:NexusPHP 164 个定义里 158 个写 1、Unit3D 35 个里 31 个、GazelleJSONAPI 14 个里 12 个),模板类站点也常写 1。 实际做法:跟随同引擎既有文件的取值(绝大多数是 1),同一站点内保持一致;修改既有站点时不要顺手改这个字段(除非该站点本来就用 YYYYMMDD 式自定义版本号)。
- urls:第一个是默认使用地址;支持 https 就优先 https;敏感站点网址可写成 rot13(
uggc:///uggcf://,类型见types/base.ts:11-21,还原见utils/html.ts:49)。 - 成人站点(`tags` 含 `成人` / `XXX` / `Adult`,大小写不敏感)的 `urls` / `legacyUrls` / `trackerUrls` 必须全部写成 rot13,由
vite/scripts/checkSiteDefinition.ts强制(error)。配套约束: - 这三个字段是唯一会被
restoreSecureLink还原的地方,所以favicon(不还原)、Origin/Referer请求头、绝对的search.requestConfig.url等字段里也不得再出现本站域名的明文 —— 改成从restoreSecureLink("uggcf://...")派生的模块级常量、本地图标(./x.png),或者省略该字段(favicon 省略后会由utils/favicon.ts从首页自动解析)。校验器会按「明文地址的 host 是否命中本站已收录域名」来报错。 - 站点登录态/请求头需要明文域名时,范例见
definitions/pussytorrents.ts的SITE_ORIGIN。 - legacyUrls:更换域名时不要删
urls里的旧地址,把它移入legacyUrls;若该域名曾出现在 ptpp 中而未出现在urls中,必须补进legacyUrls(types/site.ts:88-96)。 - favicon(
types/site.ts:98-106):可写完整https://.../favicon.ico、./<name>.png(public/icons/site/下的文件)或data:image/...;若public/icons/site/已存在{id}.{png,ico,svg}则无需声明。 - isDead:只在站点彻底死亡、无恢复可能时写
isDead: true;临时不可用应交给用户配置,不要写进 metadata(types/site.ts:108-115)。 - prettier:printWidth 120、分号、trailing comma all(根
package.json的 prettier 配置)。 - `userInfo.process[*]` 的字段声明按层分工(
types/site.ts:355-363):每步要取的字段是[...fields, ...Object.keys(selectors)],二选一即可,不要两处都写。 - schema(`schemas/*.ts`)优先用 `process[*].fields`:字段清单写在步骤里,具体选择器放在全局
userInfo.selectors;这样 definition 只需覆写选择器就能快速适配站点改版,不必重写请求流程(NexusPHP / Luminance / Gazelle 等引擎都是这个形态)。 - definition(`definitions/*.ts`)自己掌控 `process` 时优先用 `process[*].selectors`:选择器的键本身就说明了「这次请求要取哪些内容」,字段与选择器不会各写一份而对不上(范例:
definitions/myanonamouse.ts、definitions/cgpeers.ts)。 - 若同时修改了公共类型/schema,必须同步检查其余定义文件是否受影响(
definitions/下 300+ 个定义文件、10 个 schema)。
按需读取
| 场景 | 读取 | |
|---|---|---|
| 从零新增一个站点、想知道完整流程与交付前检查 | references/workflow.md | |
不确定 ISiteMetadata 各字段的含义、默认值与约束 | references/metadata-fields.md | |
| 写 selectors、filters、category、searchEntry、userInfo process | references/selectors-and-filters.md | |
| 排查"搜不到/解析为空/提示未登录/结果字段错误" | references/debugging.md | |
| 目标站点是 NexusPHP 系(国内 HDSky/OurBits 类结构) | references/engines/nexusphp.md | |
| 目标站点是 Unit3D 系(Laravel + API) | references/engines/unit3d.md | |
| 目标站点是 Gazelle 系(音乐 tracker,网页解析) | references/engines/gazelle.md | |
| 目标站点是 Gazelle 的 JSON API 变体 | references/engines/gazelle-json-api.md | |
| 目标站点属于 AvistaZ 网络(AvistaZ/AsiaTorrents/CinemaZ/PrivateHD 等) | references/engines/avistaz-network.md | |
| 目标站点是 Luminance 引擎 | references/engines/luminance.md | |
| 目标站点是 Rartracker 引擎 | references/engines/rartracker.md | |
| 目标站点是 TCG 引擎 | references/engines/tcg.md | |
| 私有站但没有现成引擎,直接用私有站模板 | references/engines/abstract-private-site.md | |
| 公共 BT 站(type: "public")与基类提供的通用能力 | references/engines/abstract-bittorrent-site.md |
静态校验
站点定义的结构与正则校验已内置进 pnpm check(实现:vite/scripts/checkSiteDefinition.ts),不需要单独跑脚本,也不在构建里跑:
守卫检查:文件名与 id 是否一致、id 是否合法且不与其他定义重复、必填字段是否齐全、type 取值、urls 是否非空且可 rot13 还原、成人站点(`tags` 含 `成人`/`XXX`/`Adult`)的 `urls` / `legacyUrls` / `trackerUrls` 是否全部 rot13、以及文件里是否还有本站域名的其它明文地址、timezoneOffset 格式、category 的 key 是否重复、levelRequirements 的 id 是否重复或非递增、以及所有会被 `new RegExp(pattern, "i")` 编译的 pattern 字段(`urlPattern` / `excludeUrlPattern` / `urlPatterns` / `refreshHeaderPattern` / `officialGroupPattern`)里的字符串能否编译;并对 schema 命名、version 口径、明文 http 给出警告。
错误(error)会让命令以非 0 退出(`pnpm check` 随之失败);警告与提示不影响退出码。 它只做静态结构检查,不能替代真机运行验证。
交付前检查清单
- [ ]
id与文件名一致,且只含小写字母与数字 - [ ]
version与同引擎既有文件取值一致(新增站点通常为1) - [ ]
urls至少一项,首个为默认地址,可用 https 就用 https;旧域名进了legacyUrls - [ ] 若
tags含成人/XXX/Adult:urls/legacyUrls/trackerUrls全部是 rot13,且文件里没有本站域名的其它明文地址(favicon/Origin/Referer/ 绝对 URL 都要处理掉) - [ ]
type与schema匹配;schema若填的是schemas/里没有的名字,则该文件必须导出default class承载它 - [ ] 展开了
...SchemaMetadata(而不是手抄引擎默认值),只额外写与默认不同的部分 - [ ]
category的每个 key 在站点内唯一,value 与站点真实分类一致 - [ ]
userInfo.process[*]的字段声明符合分层约定:definition 侧用selectors(键即字段清单),没有和fields重复声明;覆写引擎步骤时展开了...SchemaMetadata.userInfo!.process![n] - [ ] 所有选择器/接口路径都有真实依据,没有猜测值
- [ ]
pnpm check通过(含站点定义的结构与 pattern 编译校验) - [ ] 若覆写了类方法,确认签名与基类一致(
override关键字、参数个数与类型)
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.dsh/skills/ptd-site-definition/SKILL.md
Popularity
- Repository stars
- 2,638
- Repository forks
- 188
- 7-day trend score
- 39
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/pt-plugins/pt-depiler/ptd-site-definition)