Skip to content

贡献一条规则

目标是一条可审查、可安装、可搜索、可列出剧集,并能返回真实可读媒体的规则。只通过 JSON 语法检查还不够。

1编写明文
anx-rule/2
2静态校验
结构与参数
3真实验证
search → play
4登记索引
更新 rev
5客户端安装
缓存与更新

1. 确认站点契约

在写 JSON 前先记录:

  • 搜索入口、方法、参数和响应类型。
  • 搜索结果中的稳定 id、标题、封面和详情链接。
  • 详情页线路与剧集的结构。
  • 播放器页面、API 或 iframe 的跳转链。
  • 媒体是否需要 Referer、User-Agent、Cookie 或定时授权。
  • 是否依赖 JavaScript challenge / WebView。
  • token 请求与媒体请求是否必须走同一网络出口。

优先选择公开 JSON API,其次是稳定的 HTML 结构,最后才是 WebView 嗅探。

2. 创建规则文件

rule/ 下创建与稳定 id 同名的 UTF-8 JSON:

text
rule/example.json

先写最小元数据与三段管线。id、文件名与索引 key 应一致。

json
{
  "format": "anx-rule/2",
  "id": "example",
  "name": "Example",
  "baseUrl": "https://example.com",
  "iconUrl": "https://example.com/favicon.ico",
  "search": [],
  "detail": [],
  "play": []
}

3. 分阶段实现

不要一次写完再猜问题位置。

  1. 先让 search 返回正确的 Series
  2. 再让 detail 对一个已知条目返回非空线路和剧集。
  3. 最后实现 play,并验证媒体请求。

对常见 MacCMS 可以从配方开始:

json
{
  "recipes": ["maccms"]
}

只有默认阶段不适用时才显式覆盖对应管线。

4. 添加到订阅索引

rule/index.json 增加条目:

json
{
  "key": "example",
  "title": "Example",
  "by": "your-name",
  "rev": 1,
  "intro": "一句话说明规则用途。",
  "site": "https://example.com/",
  "badge": "https://example.com/favicon.ico",
  "labels": ["anime", "高清"],
  "ref": "example.json",
  "engine": "anx-rule/2"
}

修改已有规则时递增 revbadge 应与规则 iconUrl 保持一致。

5. 静态测试

至少执行规则相关测试:

bash
flutter test test/source/pipeline_engine_test.dart
flutter test test/source/bundled_rules_test.dart
flutter test test/source/source_codec_test.dart

如果新增了通用操作符或改变解释器语义,为该行为添加使用 FakeHost 的确定性测试。

6. 添加 live probe

test/source/live_new_rules_test.dart 增加规则案例:

dart
test(
  'example',
  () => _probe(
    'example.json',
    '可稳定命中的番剧关键词',
    verifyMedia: true,
  ),
  timeout: const Timeout(Duration(minutes: 2)),
);

运行单条测试:

bash
flutter test test/source/live_new_rules_test.dart \
  --dart-define=LIVE=true \
  --plain-name example

verifyMedia: true 会继续检查 HLS 清单与媒体分片。对 WebView-only 规则,测试环境无法嗅探时可以使用 strictPlay: false,但必须在真实 App 中补做播放验证并在 PR 中说明。

7. 提交前清单

  • [ ] 文件为 UTF-8、JSON 可解析、formatanx-rule/2
  • [ ] id、文件名、索引 key 一致。
  • [ ] iconUrl 与索引 badge 一致且为 HTTP(S) URL。
  • [ ] search → detail → play 真实链路通过。
  • [ ] 播放验证检查了媒体内容,而非只看 URL 非空。
  • [ ] 必要的 Header、Cookie 与 Referer 已显式传递。
  • [ ] 没有个人 Cookie、Token、账户信息或抓包隐私数据。
  • [ ] 修改旧规则时已递增 rev
  • [ ] 没有无关格式化或生成文件改动。

何时扩展引擎

只有满足以下条件才考虑新增操作符:

  1. 现有操作符无法可靠表达。
  2. 能明确描述输入、输出与失败语义。
  3. 至少两个规则可复用,或协议本身足够稳定。
  4. 能提供无网络的单元测试和真实站点验证。

新增操作符需同步修改解释器、静态校验器、测试和本页参考文档。

文档内容采用项目许可证约束;第三方站点与内容不由 AniBaka 提供。