diff --git a/docs/porting/mp-rust-logic-parity.md b/docs/porting/mp-rust-logic-parity.md new file mode 100644 index 00000000..aa40f944 --- /dev/null +++ b/docs/porting/mp-rust-logic-parity.md @@ -0,0 +1,222 @@ +# MoviePilot Rust 加速函数:产品逻辑迁移核对(差分测试) + +> 上游 `/opt/moviepilot-plus/upstream/MoviePilot` @ `e6820a8`,`moviepilot_rust` 0.3.3。函数清单见 `moviepilot-rust-transfer.md` §1。 +> 方法:用 MP 自己的 venv 调用上游实现生成期望值(`scripts/mp-sync/gen-differential.py`),我们的 TS 实现跑同样的输入,逐字段比较。已知差异写进快照的 `deviations`,测试断言"实际差异集合等于登记集合"。所以现在测试是通过的;以后补迁消掉一条差异,测试会失败,提醒删掉对应登记。 +> 差异分类:**一致** / **intentional**(故意偏离,README 或 porting 文档有记录)/ **missing**(漏迁)/ **our_bug**(疑似我们的 bug)/ **mp_bug**(疑似 MP 的缺陷,我们的结果更好)/ **representation**(只是表示方式不同)/ **not_expressible**(Slot 表达不了)。 + +## 0. 结论 + +| Rust 函数 | 业务链路 | 差分规模 | 一致率 | missing / our_bug / mp_bug | +| --- | --- | --- | --- | --- | +| `parse_metainfo_fast` / `parse_metainfo_path_fast` | 搜索/订阅/RSS 的标题识别;整理规划(MetaInfoPath);过滤器按集算体积 | 216 条(标题 186、路径 30)× 18 字段 | 字段级 92.9%;扣掉 intentional/representation/mp_bug 后 97.5%;整条完全一致 84 条(38.9%),产品等价 177 条(81.9%) | 14 条 / 27 条 / 28 条样本 | +| `find_metainfo_fast` | 标题中的显式 ID 标签 | 11 条带标签 | 8/11 | 2 / 0 / 1 | +| `parse_filter_rule_fast` / `filter_torrents(_with_trace)_fast` | 搜索、订阅匹配、洗版、工作流过滤、下载排序 | 43 条规则;28 种子 × 23 条可完整表达规则 = 644 case | 95.5%(615/644);另有 3 条只能近似表达的规则,84 case 里 31 处不一致,全是能力缺口 | 26 / 14 / 7(另 not_expressible 13) | +| `parse_rss_items_fast` | 订阅刷新(站点 RSS 模式)、工作流 fetch_rss、插件 | 15 份 Feed / 36 条,245 字段 | 95.5%(234/245) | 0 / 0 / 4(另 intentional 12) | +| `parse_indexer_torrents_fast` / `parse_indexer_subtitles_fast` | 站点搜索/浏览(SiteSpider.parse);字幕搜索 | 72 样本 / 127 行,2108 字段 | 98.1%(2069/2108) | 1(字幕分支)/ 4 / 35 | +| `zhconv_fast` | 识别查询名简体化、中文别名判定、音乐元数据 | 69 条 | 84.1%(58/69) | 10 / 0 / 1 | +| `jieba_cut` | 仅用于"整理历史按标题模糊搜索"(含 Agent 工具) | 静态对照 | — | 不需要迁 | + +MP 自身两条路径也不一致:标题识别的 Python 实现和 Rust 快路径在 4 条样本上输出不同(`meta-mp.json#rustMismatch`:T-06、A-03、Z-06、Z-08);索引解析在 **40/72** 个样本上不同(`indexer.json` 的 `mp_rust`);RSS 的 Atom/RDF 命名空间也不同(Python 0 条,Rust 有结果)。过滤器的 Python 和 Rust 交叉核对 0 处不一致。我们的对照基准一律用 **Python 参考实现**。 + +## 1. 产物与复现 + +| 文件 | 内容 | +| --- | --- | +| `scripts/mp-sync/gen-differential.py {meta,zhconv,filter,rss,indexer,all}` | 生成器,必须用 `$MP_ROOT/.venv/bin/python` 运行。只读调用上游,不复制上游源码 | +| `packages/domain/test/differential/meta-{samples,mp,deviations}.json` + `meta-map.ts` + `meta.test.ts` | 标题识别。`meta-map.ts` 把双方输出规范化到同一形式(名称忽略大小写和标点、来源归到 REMUX/BluRay/WEB-DL/…、HDR 集合、编码族、音频去分隔符、发布组集合) | +| `packages/domain/test/differential/filter-cases.json` + `filter.test.ts` | 过滤规则 | +| `packages/domain/test/differential/zhconv-*.json` + `zhconv.test.ts` | 繁简转换 | +| `packages/adapters/test/differential/{rss,indexer}.{json,test.ts}`、`diff-util.ts`、`inputs/**`、`export-inputs.ts` | RSS 和索引解析(§4、§5)。生成前先跑 `deno run -A packages/adapters/test/differential/export-inputs.ts` 导出 testkit fixture;生成器把时区固定为 UTC,并冻结 dateparser 的 now,重跑结果逐字节相同 | + +样本来源:我们已有的 107 条(`release-parser.test.ts` 91 条标题加 16 条路径)、MP `tests/cases/meta.py` 的 76 条(只用标题字符串作输入语料,属于事实数据;这份语料的来源**待登记进 ledger**)、补充 33 条(综艺、动漫、多集、合集、国配、特效字幕、显式 ID)。 + +## 2. parse_metainfo_fast / parse_metainfo_path_fast(标题与路径识别) + +**用途**:`MetaInfo()` 用于种子标题、站点副标题和文件名,在搜索、订阅匹配、RSS 刷新、过滤器按集算体积(`total_episode`)时调用。`MetaInfoPath()` 用于整理链路(`transfer/request.py _build_path_meta`)。Rust 只是快路径,返回 None 时回退 Python。 + +**分组结果**(216 条): + +| 来源 | 条数 | 完全一致 | 产品等价 | 说明 | +| --- | --- | --- | --- | --- | +| 我们已有样本 | 107 | 46 | 106 | 差异几乎都是 README 登记的故意偏离 | +| MP 自带用例 | 76 | 29 | 43 | **our_bug 65 处里有 57 处在这里**,主要是动漫/字幕组命名 | +| 补充 | 33 | 9 | 28 | — | + +按字段看一致率:resource_effect 和 edition 100%;part 99.1%;year 98.6%;video_encode 96.8%;audio_encode 96.3%;begin_episode 89.8%;type 88.9%;begin_season 84.3%;name 81.9%;resource_team 72.7%(59 处差异中 52 处是故意兜底)。`customization` 双方都没配置,不参与比较。 + +### 2.1 our_bug(27 条样本,按根因归并) + +| # | 输入(节选) | MP | 我们 | 建议 | +| --- | --- | --- | --- | --- | +| B1 | `【爪爪字幕组】★7月新番[欢迎来到…教室 第二季/…]`(MP-03/17/18/20/32/45/56/63) | cn=`欢迎来到实力至上主义的教室` | cn=`★7月新番欢迎来到…` / `国漫寻剑` / `22年日剧据…` | 剥离动漫前缀标签:`★N月新番★`、`N年日剧`、`国漫`、`新番` | +| B2 | `[桜都字幕组] 异世界归来的舅舅 / Isekai Ojisan [01][1080p]`(MP-44/45、Z-07/27) | E=1,T=TV | en=`Isekai Ojisan 01`,无集号 | 名称后紧跟的 `[NN]` / `[NN][分辨率]` 识别为集号(我们已支持 `[Group][Name][05]`,不支持 `Name [05]`) | +| B3 | `[秋叶原冥途战争][Akiba Maid Sensou][2022]…[LeagueWEB]`(MP-05/13/27/57) | grp=LeagueWEB | grp=`秋叶原冥途战争` | 开头方括号含中文或能解析成片名时不当作组;末尾 `[已知组]` 优先 | +| B4 | `[Caligula.The.Ultimate.Cut.2023.2160p…-BHYS@OurBits][DIY中字原盘][…].iso`(MP-74) | 正常解析出 en、y、2160p、UHD BluRay、HEVC、DTS-HD MA 5.1 | 名称取成 `DIY`,技术字段全丢 | 迁 MP 的 `BRACKET_DOT_TITLE_RE`:方括号内是"点分隔发布名 + 年份 + 资源词"时去括号保留内容 | +| B5 | `The Long Season 2017 2160p…`(MP-01) | en=`The Long Season` y=2017 | 第 2017 季,年份被吞 | `Season` 后的数字 ≥1900 时按年份处理(MP 限制 Season 后 <3 位) | +| B6 | `2022.8.2.Twelve.Monkeys.1995…`(MP-52),父目录 `…Collection.20240501.FRDS`(MP-73) | 电影 | 按 airDate 判成 TV | 标题**开头**的日期、以及和年份同时出现的日期,不当作播出日期;父目录的 airDate 不参与类型合并 | +| B7 | `[YTS.MX] …`(MP-76)、`[Hall_of_C] 诛仙 …`(MP-60) | 名称干净 | 组名混进英文名 | 开头方括号里是单个 token(含 `.`/`_`)时当作组名剥离 | +| B8 | `组长女儿与照料专员 / 组长女儿与保姆 …`(MP-21);`传颂之物/Utawarerumono/うたわれるもの`(MP-55) | 取其一 | 两个中文名被拼接,或三段没拆开 | `/` 分隔的多名称按语言拆分,中文取一个 | +| B9 | `哆啦A梦:大雄的宇宙小战争`(MP-06) | cn 含 A | `A` 被拆成英文名 | 中文词中夹的单个拉丁字母并入中文名 | +| B10 | `[Gal to Kyouryuu][02][BDRIP]`(MP-24) | en=`Gal To Kyouryuu` | en=`BDRIP` | 资源词不能当名称 | +| B11 | `DTS-HD MA5.1`(MP-48)、`E13-14`(MP-51)、`【极影字幕社】…GB`(MP-63) | `DTS-HD MA 5.1`、E13-14、组=极影字幕社 | `DTSHD`、只有 E13、组缺失且 GB 进了名称 | 各补一条词元规则 | + +### 2.2 missing(14 条样本) + +| # | 输入 | MP | 我们 | 建议 | +| --- | --- | --- | --- | --- | +| M1 | `{[tmdbid=94997;type=tv;s=1;e=3-4]}House.of.the.Dragon…`(Z-31) | tmdb:94997,S1,E3-4,TV | 整块进名称 | 迁 `{[k=v;…]}` 显式身份块(也见 §3) | +| M2 | `[bangumiid=400602]`(Z-32) | bangumi:400602 | 无 | ExplicitId 增加 bangumi/anilist | +| M3 | `#13`(MP-25)、`[TV 04]`(MP-57)、`西部世界 12.mkv`(MP-29)、`S01 13-14`(MP-50) | 能识别集号 | 集号为空 | 补充 4 种集号写法 | +| M4 | `Mai Xiang S01 …`,副标题 `麦香 \| 全36集`(MP-64) | cn=麦香 | 无中文名 | 迁"英文名是拼音时从副标题第一个词取中文名" | +| M5 | `[1080]`(MP-05)、`[5.1]`(MP-12) | 1080p、5.1 | 空 | 补方括号内的裸分辨率和裸声道 | +| M6 | `iP`(T-13)、`B-Global`(MP-10) | BBC iPlayer、B-Global | 空 | 流媒体平台表补齐(MP 有约 270 条) | +| M7 | `cXcY@FRDS`(MP-49/54)、`指环王三部曲合集`(Z-12) | 两个组都识别;去掉"合集" | 只有 FRDS;保留"合集" | 支持 `£` 分隔符;"合集/三部曲合集"列为干扰词 | + +### 2.3 intentional(与 README 偏离表一致,125 处) + +未知发布组兜底 52 条;第 N 期记为 `issue` 12 条;有集号无季号时推定第 1 季 23 条;播出日期 → airDate 且判为 TV 6 条;路径合并(文件无剧集信号、目录是剧集)3 条;辅助词字幕文件(P-07);附加内容目录(P-05);`CD1`/`D02` 作为 part;`第八季 全12期` 保留季号;先导片。**每一条都能在 `packages/domain/README.md` 的偏离表或 `moviepilot-metadata-recognition.md` 里找到依据,没有发现未经记录的故意偏离。** + +### 2.4 mp_bug(28 条样本,保留我们的行为) + +- MetaAnime(anitopy 路径)不输出来源和编码(15 条)。 +- 不认 `1x05`、`S01D02`、`Season.2`、`BD50`、`{doubanid=}`。 +- 丢中文名(MP-13/44/55、Z-07)。 +- 把 `[Sub]` 当成名称。 +- `AC3£` 没切开,音频丢失。 +- 把 `7³` 拼进音频。 +- `AVC-8bit` 的结果 Python 和 Rust 不一致(Z-06)。 + +representation 共 10 处:`name` 的取法(我们有中文名就取中文,MP 只在中文名全是汉字时才取);`HMAX` 映射成 Max 还是 HBO Max;`2Audio(s)`;`flac_ac3` 记成一条还是两条。 + +## 3. find_metainfo_fast(显式 ID 标签) + +**用途**:从标题里剥离 `[tmdbid=…]`、`{tmdb-…}`、`{[k=v;…]}`、`[bangumiid=…]`,得到 media_source/media_id 以及季、集、类型。在 `_prepare_meta_input` 里调用。差分并入 §2 的 `media_id` 字段:8 条 Emby 风格的 TMDB 标签(`[tmdbid=]`、`[tmdbid-]`、`[tmdb=]`、`{tmdb=}`、`{tmdb-}`)**全部一致**。不一致的 3 条:M1、M2 是漏迁;`{doubanid=}` 是 mp_bug,我们能认。另外我们多支持 imdb 和 tvdb,MP 不认。**建议**:把 `{[…]}` 块(含 `type/s/e/g`)和 bangumi 补上。按不变量 1,它们仍只作为证据加一级,不直接确认身份。 + +## 4. parse_rss_items_fast(RSS/Atom) + +**用途**:`RssHelper._parse_impl`(`application/rss.py`)先走 Rust(最多 1001 条,截到 1000),返回 None 时回退 lxml。调用方:`TorrentsChain.rss(domain)`(订阅刷新的站点 RSS 模式)、工作流 `fetch_rss`、插件。解析失败时触发 `__renew_rss_url` 重新生成地址。 + +**MP 字段语义**:title 取第一个后代 `title` 的文本(不 strip,为空就跳过);description 取 `description|summary`;link 取文本,没有就取 href;enclosure 取 `@url`,缺失回退到 link;**size 只取 `enclosure@length` 的纯数字**(description 里的大小、Torznab/nyaa 的 size 都不读);pubDate/published/updated 用 `dateutil.parse` 后 `astimezone(None)`(不带时区的按宿主本地时区);`dc:creator` 输出为 nickname;不输出 guid 和 category。促销、HR、做种这些字段 RSS 路径都没有。 + +**差分**:15 份输入(testkit 2 份、手写 13 份),MP Python 解析出 36 条,逐字段比较标题、描述、链接、enclosure、大小、pubdate、作者,共 245 个字段,一致 234 个。登记 16 条(`packages/adapters/test/differential/rss.json#deviations`): + +| 输入 | MP | 我们 | 分类 | 建议 | +| --- | --- | --- | --- | --- | +| 带 xmlns 的标准 Atom、RSS 1.0(RDF) | Python 0 条(Rust 有) | 3 条 / 1 条 | mp_bug | 保持 | +| 纯文本"RSS 已过期"提示 | 在"不以 `<` 开头"处就提前返回,过期判断走不到,续期永远不触发 | `FeedError('expired')` | mp_bug | 保持;续期逻辑我们自己做 | +| 条目内 `` 排在前面 | 取到来源标题 | 取直接子元素 `title` | mp_bug | 保持 | +| enclosure 带 passkey | 原样 | `[REDACTED]` | intentional(SA5) | — | +| 带 DTD | `[]` | 整份拒绝 `forbidden_dtd` | intentional | — | +| 值里有换行缩进、`length=" 2048 "` | 保留空白,大小为 0 | trim 后大小为 2048 | intentional | 在 `rss/README` 补登记 | +| ` ` 实体 | 在此截断,标题变成 "Nbsp" | 保留字面量 | intentional | P3:补 HTML 命名实体解码表 | +| 未闭合标签 | 容错恢复 2 条 | 1 条 | intentional | — | +| pubDate `… CST`、纯日期 `2026-09-26` | 按宿主本地时区解释 | 按美国中部 -6 / UTC 午夜 | intentional(两边都可能错) | P2:不带时区的时间按站点 `timezone` 解释 | + +RFC822、ISO、无秒、星期写错这几类两边一致;中文日期、"3 小时前"、纯数字两边都不解析。 + +## 5. parse_indexer_torrents_fast / parse_indexer_subtitles_fast(站点列表页) + +**用途**:`SiteSpider.parse`(`modules/indexer/spider/__init__.py`)先走 Rust,返回 None 时回退 PyQuery 的 `get_info`。链路是 `IndexerModule.search_torrents`(关键词搜索)和 `refresh_torrents`(浏览 `browse.list/fields`);字幕分支 `search_type=="subtitles"` 走 `get_subtitle_info` 和 `__fill_subtitle_ids`,由 `/api/search` 字幕接口经 `SearchChain.search_subtitles_*` 调用。 + +**MP 字段语义**:size 用 `parse_size`(二进制单位,Python 银行家舍入);做种、下载、完成数取 `/` 前的部分,去掉逗号,不是纯数字时为 0;促销 case 按声明顺序取第一个命中(另有 selector 模式,用 `int()`);freedate 是原样文本;HR 配置了就输出 bool;category 投影成电影/电视剧/音乐/未知;pubdate 是站点墙上时间;imdbid 用 `re_search`;labels 是列表。 + +**能否独立调用**:`SiteSpider(indexer).parse(html)` 和 `RssHelper` 注入假 HTTP 端口后可以离线调用。**但 MP 的内置站点定义调不出来**:它们在 Cython `app/application/site/sites.*.so` 和加密的 `user.sites.v3.bin` 里,未认证时 `get_indexer()` 返回 `{}`,`SitesHelper()` 还依赖数据库事务执行器。所以双方共用我们的 `definitions/*.json`(与 MP 同一 schema,来自 MovieClaw)作为输入,**MP 真实站点的选择器只能静态对照**。 + +**差分**:72 个样本(21 个 NexusPHP 定义 × 3 个列表页、2 个登录页、3 个手写 DSL 配置、1 个字幕页),MP 解析出 127 行,比较 title、description、size、seeders、peers、grabs、促销系数、freedate、HR、分类、pubdate、链接、imdbid、labels 共 2108 个字段,一致 2069 个。登记 41 条(`indexer.json#deviations`): + +| 输入 | MP | 我们 | 分类 | 建议 | +| --- | --- | --- | --- | --- | +| hdarea、hddolby、hdfans 等 9 个定义的列表选择器命中表头行 | Jinja 把 None 渲染成标题 "None" | 空串 | mp_bug ×32 | 两边都会产出垃圾行:**收紧这 9 个定义** | +| 相对时间 "2天"、"3小时前" | 用 dateparser 按当前时刻换算,结果随抓取时间漂移 | 不写 pubdate | mp_bug | 保持(生成时冻结了 now) | +| 促销 selector 取到 "0.5" | `int()` 报错,整行丢失 | 保留 | intentional(SA4) | — | +| `"2.5 B"` | 2(银行家舍入) | 3 | our_bug | P3:10 分钟 | +| 行元素自身带 `free_bg`/`sticky` class | PyQuery 查询包含行自身,得到 dl=0、hr=true、labels | `.find` 只查后代 | our_bug ×3 | **P1:先决定跟 Python 还是 Rust**(MP 的 Rust 和我们一样),再改 `spider/spider.ts` 或在 README 登记 | +| 字幕页 | 解析出 3 条 | 没有这个分支 | missing | P1:补字幕分支,期望数据已在 `indexer.json` | + +**静态发现(差分之外)**:`table.torrents > tr:has(...)` 这种写法在显式带 `<tbody>` 的页面上,我们和 MP Python 都取到 0 行,MP Rust 能取到 5 行。受影响的定义有 agsvpt、chdbits、hdhome、keepfrds、ourbits、pter、pthome、ssd、tjupt。建议在 `scripts/mp-sync/movieclaw-overrides/` 统一补 `, table.torrents > tbody > tr` 这一支(audiences 已经这样写)。 + +## 6. parse_filter_rule_fast / filter_torrents(_with_trace)_fast(过滤规则) + +**调用点**:`FilterModule.filter_torrents(rule_groups, torrents, mediainfo)`。先走 Rust,它返回 None 时回退 Python(规则解析在 `app/application/rules.py`,基于 pyparsing)。 + +- **搜索**:`chain/search/result.py`,按站点过滤。规则组用 `SearchFilterRuleGroups`。 +- **订阅匹配 / RSS 刷新**:`chain/subscribe/match.py`,每个种子单独过滤。规则组依次取 `subscribe.filter_groups`、`BestVersionFilterRuleGroups`(洗版)、`SubscribeFilterRuleGroups`。洗版时 `pri_order <= current_priority` 的种子会被拒;`current_priority == 100` 表示已完成。 +- **其他调用**:订阅搜索、工作流 filter 动作、规则测试接口、下载排序(把 pri_order 当排序键)。 +- **规则组选取**:按 `media_type` 和 `category` 选组;多个组之间是 AND 关系。 + +**语法**:用 `>` 切出优先层,第 1 层 pri_order=100,依次递减。层内运算优先级为 `!` > `&` > `|`,可以加括号。规则名不存在时视为不匹配。单条规则的判定顺序是:tmdb 条件命中就直接放行;然后在 `title+description+labels` 上跑 include/exclude 正则;接着检查 `size_range`(单位 MB,**按每集算**,即总大小除以 MetaInfo 得到的 `total_episode`)、`seeders`、`downloadvolumefactor`、`publish_time`(延迟 N 分钟)。 + +**内置关键字 → Slot**: + +| 能表达 ✔ | 近似 ~ | 不能 ✗ | +| --- | --- | --- | +| `4K/1080P/720P` → `hard.resolutions`;`BLU/REMUX/WEBDL` 及其取反 → `sources` 允许列表加 `unknownPolicy`;`BLURAY & !BLU` → `requireEncode` | `CNSUB` → `requiredSubtitles:["zh"]`(缺华语片由 tmdb 放行这条);体积区间用总量而非每集;`A > B` 用多个 Slot 或 `rankForSlot`(按来源等级优先,不按层级) | `UHD`、`H265/H264`(只有软偏好)、`HDR/DOLBY/SDR`(只有软偏好)、`ATMOS/60FPS/3D`、`SPECSUB`(特效字幕)、`CNVOI/HKVOI`(国配/粤配;我们把"国语"当音轨词剔掉)、`GZ`(官方标签)、`FREE`、做种数、`publish_time`、跨字段 OR、音乐的 13 条规则 | + +**43 条规则样例的结论**:✔ 22、~ 6、✗ 15。完整表格见 `filter-cases.json#rules`,其中 `verdict` 和 `note` 是逐条结论。有代表性的几条: + +- `4K & !REMUX > 1080P & WEBDL` ✔,用两层 Slot 表达。 +- `SPECSUB & CNSUB & !BLU` ~,SPECSUB 那部分丢了。 +- `!DOLBY & !REMUX` ~,只能表达 `!REMUX`。 +- `CNSUB | 4K` ✗,属于跨字段 OR。 +- `FREE`、`SEED5`、`GZ` ✗,这些是站点元数据。 + +**差异**(不一致共 61 处已登记,完整在 `filter-cases.json#deviations`): + +| 输入 | MP | 我们 | 分类 | 建议 | +| --- | --- | --- | --- | --- | +| `2160p UHD Blu-ray HEVC … -BeyondHD`、`1080p Blu-ray AVC DTS-HD MA` | BLU(原盘) | BluRay 压制(isEncode) | our_bug ×12 | Blu-ray 加 AVC/HEVC/VC-1、且没有 x26x 时,判为 `BluRay-Disc` | +| 副标题 `CHS/ENG` | 中字 | 不识别 | our_bug ×2 | 字幕词元补 CHS/CHT/GB/BIG5 | +| `S03 全10集 60G` 配体积规则 | 按每集 6G 判 | 按总量 60G 判 | missing ×8 | Slot 加 `sizeBasis: per_episode` | +| 华语片 + CNSUB | tmdb 放行 18 个种子 | 拒绝 | missing | 允许条件依赖媒体上下文 | +| `2160p.HDR.HEVC-NOSRC`(没有来源) | 误命中 BLU | 来源未知 | mp_bug ×5 | 保持我们的做法 | +| 副标题只有 `国语` | 算作中字 | 当作音轨 | mp_bug ×2 | 保持;以后另加 audioLang 条件 | +| 单 Slot 的 `4K > 1080P > 720P` | 4K 总排在前面 | 先比来源等级,共 44 个逆序对 | intentional | 要复现 MP 的语义,就用多层 Slot 或优先级阶梯 | + +**trace 对比**:MP 的 `filter_torrents_with_trace_fast` 返回 `([(index, pri_order)], [str])`,trace 是中文自由文本,只写进 debug 日志。例如 `种子 X 不包含任何项 [...]`、`大小 5G 不在范围 10000-50000MB`、`做种人数 3 小于 5`、`规则 X 不存在`。它不区分"字段未知"和"不满足";OR 分支里失败的原子也会被打印出来。我们的 `SlotEvaluation` 是结构化的:`violations[{field, code, expected, actual}]` 会列出全部违规,`unknown_field` 单独给出,accept 时带 `tier/softRank/reasons`。**缺两样**:命中的是第几层(对应 pri_order),以及逐层的失败原因。 + +## 7. zhconv_fast(繁简转换) + +**用途**:`app/foundation/text.py convert()` 直接调用 `moviepilot_rust.zhconv_fast`,**没有 Python 回退**,原生扩展是硬依赖。调用点: + +- TMDB/豆瓣/IMDb 识别时,把 `cn_name` 简体化后加入查询名(`themoviedb/__init__.py:285` 等)。 +- TMDB 中文别名的"是否已是简体"判定(`tmdbapi.py:981`)。 +- MetaAnime 分类标签判定。 +- 音乐元数据简体化。 + +用的是 MediaWiki 词表,**有词组级转换**。 + +**差分**:69 条(动漫、港台片名、一对多字)中 58 条一致。 + +- missing 10 条:其中 6 条是字表缺字(迴、滾、魷、瑯、臥、駭);4 条是一对多字(乾杯、瞭解、頭髮、理髮),我们刻意不收,MP 靠词组表处理。 +- mp_bug 1 条:`慶餘年` 转成了 `庆馀年`,官方简体片名是 `庆余年`。 + +**我们的替代**:`identity/zh-map.ts` 大约 930 对单字映射,只在 `normalizeTitle` 里用于召回比较。召回本来就会再经过 pg_trgm 相似度和别名表,一两个字不同不会直接失败。 +**建议**:暂不引入 `opencc-js`(约 1 MB 词典,MIT 许可,需要按需加载)。先把字表补到覆盖 TMDB 中文标题的常用繁体字(把本差分的 missing 清零,约 0.5 小时)。等到要把"简体化后的查询名"作为 TMDB 查询词时(对应 MP `_prepare_search_names`)再评估 opencc。它能提供词组转换和台湾/香港用词转换(如 蜘蛛人 → 蜘蛛侠),代价是包体积和冷启动。 + +## 8. jieba_cut(中文分词) + +**用途**:只有两处,都是"整理历史按标题模糊搜索":`application/history.py:712` 用 `"%".join(jieba_cut(title))` 生成 SQL LIKE 模式,另一处是 Agent 工具 `query_transfer_history`。**不参与识别、匹配和过滤。**同样没有 Python 回退。 +**我们的替代**:资产和别名检索用 pg_trgm(`0004_content`、`0006_sources` 迁移)加 `normalizeTitle`。三元组相似度天然不依赖分词,对中文短标题的召回不比"分词后 LIKE"差。 +**结论**:**不引入 `jieba-wasm`**。它的代价是 wasm 约 4 MB、词典加载 100 ms 级,而收益只落在历史搜索这一个次要功能上。以后如果要做全文检索,优先考虑 PG 的 `zhparser` 或 `pg_bigm`,而不是在应用层分词。 + +## 9. 补迁清单(按优先级) + +| 优先级 | 项 | 涉及文件 | 工作量 | 消除的登记 | +| --- | --- | --- | --- | --- | +| P0 | 原盘判定:Blu-ray 加 AVC/HEVC/VC-1 且无 x26x → `BluRay-Disc`;`BDMV/BD25/50/66/100`、`COMPLETE BLURAY` | `release-parser/parse.ts` | 0.5 天 | filter our_bug ×12 | +| P0 | 动漫/字幕组命名:前缀标签剥离(B1)、`Name [NN]` 集号(B2)、开头方括号是片名还是组名(B3、B7)、`/` 多名称拆分(B8) | `release-parser/parse.ts`、`release-groups.ts` | 1.5 天 | meta our_bug 约 40 处 | +| P0 | `[点分隔发布名][…]` 去括号(B4);`Season 2017` 按年份处理(B5);开头日期和目录日期不当 airDate(B6) | `parse.ts`、`path.ts` | 0.5 天 | meta our_bug 约 15 处 | +| P1 | Slot 硬条件扩展:`excludeSources`、hdr require/exclude、codec 硬条件、`sizeBasis: per_episode`、`requireUhd` | `slot/types.ts`、`slot/evaluate.ts` | 1 天 | filter missing ×8,规则可表达数 22 → 约 30 | +| P1 | 字幕和音轨语言:CHS/CHT/GB/BIG5 识别为中字;国语、粤语作为 `audioLanguages`;特效字幕标记 | `parse.ts`、`types.ts`、Slot | 1 天 | filter our_bug ×2,SPECSUB/CNVOI 可表达 | +| P1 | 显式身份块 `{[tmdbid;type;s;e;g]}`,以及 bangumi/anilist | `parse.ts`(`explicitIds`) | 0.5 天 | meta missing ×2 | +| P1 | 优先级阶梯:`SlotSpec.tiers[]`,评估结果带 `level`,洗版时按 level 比较 | `slot/*`、server `acquisition.ts` | 1–1.5 天 | filter R05 intentional | +| P2 | 集号写法 `#13`、`[TV 04]`、`名称 12.mkv`、`S01 13-14`;裸 `[1080]`、`[5.1]`;`MA5.1`、`E13-14` | `parse.ts` | 0.5 天 | meta missing/our_bug 约 10 处 | +| P2 | 站点元数据条件:minSeeders、freeOnly、publishDelay、labels(需要改 `evaluateCandidate` 的签名) | `slot/*`、server | 1 天 | FREE/SEED/GZ 可表达 | +| P2 | 流媒体平台表补齐;`£` 多组分隔;"合集"作干扰词;拼音英文名从副标题取中文名 | `parse.ts`、`release-groups.ts` | 0.5 天 | meta missing 约 6 处 | +| P1 | 站点定义:9 个定义补 `tbody` 分支,9 个定义收紧表头 | `movieclaw-overrides/*.json` | 0.5 天 | indexer mp_bug ×32 的根因 | +| P1 | 选择器是否包含行元素自身的语义(case/hr/labels) | `sites/spider/spider.ts` | 0.5 天 | indexer our_bug ×3 | +| P1 | 字幕页解析分支(`get_subtitle_info`、`__fill_subtitle_ids`) | `spider/spider.ts`、`spider/schema.ts`、adapter 接口 | 1–1.5 天 | indexer missing ×1 | +| P2 | RSS 中不带时区的时间按站点时区解释 | `rss/parse.ts` | 0.5 天 | rss intentional ×2 | +| P3 | zh-map 补字(§7);`parseSizeMp` 改银行家舍入;RSS 补 HTML 命名实体 | `identity/zh-map.ts`、`sites/spider`、`rss/parse.ts` | 2 小时 | zhconv missing ×6、indexer our_bug ×1 | + +**不迁**:MetaAnime 不输出来源和编码的行为(mp_bug);期号当集号、日期删除、未知组置空(与 README 偏离表一致);jieba。 diff --git a/packages/adapters/test/differential/diff-util.ts b/packages/adapters/test/differential/diff-util.ts new file mode 100644 index 00000000..68b77d1f --- /dev/null +++ b/packages/adapters/test/differential/diff-util.ts @@ -0,0 +1,89 @@ +/** + * MP 差分测试共用工具:读取 scripts/mp-sync/gen-differential.py 生成的期望 JSON,登记偏差集合与实际偏差集合比对。 + * 偏差 key:`<sampleId>.status` / `<sampleId>.count` / `<sampleId>#<行号>.<字段>`。 + */ +import { readFileSync, writeFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +export const HERE = dirname(fileURLToPath(import.meta.url)); + +export type DeviationKind = "intentional" | "missing" | "our_bug" | "mp_bug"; +export interface Deviation { + kind: DeviationKind; + note: string; + /** 仅在条件成立时才出现的偏差;local_tz_not_utc = 宿主本地时区偏移非 0 */ + condition?: "local_tz_not_utc"; +} + +function conditionHolds(d: Deviation): boolean { + if (d.condition === "local_tz_not_utc") { + return new Date("2026-09-26T00:00:00").getTimezoneOffset() !== 0; + } + return true; +} + +export interface DifferentialDoc<S> { + kind: string; + generatedFrom: Record<string, string>; + fields: string[]; + samples: S[]; + deviations: Record<string, Deviation>; +} + +export function loadDoc<S>(name: string): DifferentialDoc<S> { + return JSON.parse(readFileSync(join(HERE, name), "utf8")) as DifferentialDoc<S>; +} + +export function readInput(rel: string): string { + return readFileSync(join(HERE, rel), "utf8"); +} + +export interface Mismatch { + key: string; + mp: unknown; + ours: unknown; +} + +/** null / undefined 视为同一"缺省";其余按 JSON 结构比较 */ +export function sameValue(a: unknown, b: unknown): boolean { + if (a == null && b == null) return true; + return JSON.stringify(a) === JSON.stringify(b); +} + +export class FieldCollector { + readonly mismatches: Mismatch[] = []; + compared = 0; + equal = 0; + check(key: string, mp: unknown, ours: unknown): void { + this.compared++; + if (sameValue(mp, ours)) this.equal++; + else this.mismatches.push({ key, mp, ours }); + } +} + +/** 实际不一致集合 vs 登记集合:返回两个方向的差集(均为空才通过)。 */ +export function diffAgainstRegistry( + actual: Mismatch[], + registry: Record<string, Deviation>, +): { unregistered: Mismatch[]; stale: string[] } { + const actualKeys = new Set(actual.map((m) => m.key)); + return { + unregistered: actual.filter((m) => !(m.key in registry)), + stale: Object.entries(registry) + .filter(([k, d]) => !actualKeys.has(k) && conditionHolds(d)) + .map(([k]) => k), + }; +} + +/** 设置环境变量 DIFF_DUMP_DIR 时把实际不一致写成 <name>.mismatches.json(整理 deviations 用) */ +export function dumpMismatches(name: string, ms: Mismatch[], stats?: { compared: number; equal: number }): void { + const dir = process.env.DIFF_DUMP_DIR; + if (dir) { + writeFileSync(join(dir, `${name}.mismatches.json`), `${JSON.stringify({ stats, mismatches: ms }, null, 2)}\n`); + } +} + +export function formatMismatches(ms: Mismatch[]): string { + return ms.map((m) => `${m.key}\n mp: ${JSON.stringify(m.mp)}\n ours: ${JSON.stringify(m.ours)}`).join("\n"); +} diff --git a/packages/adapters/test/differential/export-inputs.ts b/packages/adapters/test/differential/export-inputs.ts new file mode 100644 index 00000000..b68e370d --- /dev/null +++ b/packages/adapters/test/differential/export-inputs.ts @@ -0,0 +1,73 @@ +/** + * 把 @umt/testkit 的 mock RSS / NexusPHP fixture 导出成文件,供 MP 差分生成脚本(scripts/mp-sync/gen-differential.py rss|indexer)读取。 + * 运行:deno run -A packages/adapters/test/differential/export-inputs.ts + * 只写 `inputs/rss/tk-*.xml` 与 `inputs/indexer/tk-*.html.txt`;手写样本(hw-*)不受影响。 + */ +import { mkdirSync, writeFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { + AUDIENCES_FIXTURE_RELEASES, + CHDBITS_LIST_PAGE, + CHDBITS_LOGIN_PAGE, + createMockNexusPhpSite, + HHANCLUB_LIST_PAGE, + type MockFeedItem, + renderAtom, + renderRss, +} from "@umt/testkit"; + +const here = dirname(fileURLToPath(import.meta.url)); +const rssDir = join(here, "inputs", "rss"); +const idxDir = join(here, "inputs", "indexer"); +mkdirSync(rssDir, { recursive: true }); +mkdirSync(idxDir, { recursive: true }); + +const items: MockFeedItem[] = [ + { + guid: "audiences-812345", + title: "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + link: "https://audiences.me/details.php?id=812345", + enclosureUrl: "https://audiences.me/download.php?id=812345&passkey=0123456789abcdef", + size: 84203386470, + pubDate: new Date(Date.UTC(2026, 8, 26, 13, 14, 3)), + categories: ["电影", "401"], + description: "沙丘2 / 沙丘:第二部 | <b>杜比视界</b> 国英双语 中字", + }, + { + guid: "audiences-812346", + title: "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friends", + link: "https://audiences.me/details.php?id=812346", + enclosureUrl: "https://audiences.me/download.php?id=812346", + size: 5497558138, + pubDate: new Date(Date.UTC(2026, 8, 26, 12, 0, 0)), + }, + { + guid: "audiences-812347", + title: "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + link: "https://audiences.me/details.php?id=812347", + }, +]; +writeFileSync(join(rssDir, "tk-rss-basic.xml"), renderRss("观众 Torrents", items)); +writeFileSync(join(rssDir, "tk-atom-basic.xml"), renderAtom("观众 Atom", items)); + +const site = await createMockNexusPhpSite({ + releases: AUDIENCES_FIXTURE_RELEASES, +}); +try { + const res = await fetch(`${site.baseUrl}/torrents.php?page=0`, { + headers: { cookie: site.cookie }, + }); + writeFileSync(join(idxDir, "tk-audiences-list.html.txt"), await res.text()); + site.setLoggedIn(false); + const login = await fetch(`${site.baseUrl}/torrents.php`, { + headers: { cookie: site.cookie }, + }); + writeFileSync(join(idxDir, "tk-audiences-login.html.txt"), await login.text()); +} finally { + await site.close(); +} +writeFileSync(join(idxDir, "tk-hhanclub-list.html.txt"), HHANCLUB_LIST_PAGE); +writeFileSync(join(idxDir, "tk-chdbits-list.html.txt"), CHDBITS_LIST_PAGE); +writeFileSync(join(idxDir, "tk-chdbits-login.html.txt"), CHDBITS_LOGIN_PAGE); +console.log("exported to", here); diff --git a/packages/adapters/test/differential/indexer.json b/packages/adapters/test/differential/indexer.json new file mode 100644 index 00000000..cb5f7659 --- /dev/null +++ b/packages/adapters/test/differential/indexer.json @@ -0,0 +1,6640 @@ +{ + "kind": "indexer", + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a83ab05e8a00eb0e14adf0f357faa965c7e", + "function": "app/modules/indexer/spider/__init__.py SiteSpider.parse (PyQuery fallback)", + "rust": "moviepilot_rust.parse_indexer_torrents_fast / parse_indexer_subtitles_fast (reference only)", + "definitions": "packages/adapters/src/sites/definitions/*.json (MP 内置定义加密且需认证,不可用)", + "tz": "UTC", + "dateparserNow": "2026-09-27T12:00:00", + "generator": "gen-differential.py indexer" + }, + "fields": [ + "title", + "description", + "page_url", + "enclosure", + "size", + "seeders", + "peers", + "grabs", + "downloadvolumefactor", + "uploadvolumefactor", + "freedate", + "hit_and_run", + "category", + "pubdate", + "date_elapsed", + "imdbid", + "labels" + ], + "samples": [ + { + "id": "agsvpt@tk-audiences-list", + "definition": { + "source": "definition", + "id": "agsvpt", + "file": "packages/adapters/src/sites/definitions/agsvpt.json", + "sha256": "cc1768875372be54ed1c6f4a505e572957eed0c8abddb9cdb2fbf8c220b24d0d" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "description": "沙丘2 / 沙丘:第二部 | 杜比视界 国英双语 中字", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.agsvpt.com/download.php?id=812345", + "grabs": 3388, + "page_url": "https://www.agsvpt.com/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "description": "奔跑吧 第十二季 第1期", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.agsvpt.com/download.php?id=812346", + "grabs": 410, + "page_url": "https://www.agsvpt.com/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "description": "熊家餐馆 第三季", + "downloadvolumefactor": 0.5, + "enclosure": "https://www.agsvpt.com/download.php?id=812347", + "grabs": 120, + "page_url": "https://www.agsvpt.com/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.agsvpt.com/download.php?id=812348", + "grabs": 44, + "page_url": "https://www.agsvpt.com/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "description": "地球脉动 第三季", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.agsvpt.com/download.php?id=812349", + "grabs": 9, + "page_url": "https://www.agsvpt.com/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "agsvpt@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "agsvpt", + "file": "packages/adapters/src/sites/definitions/agsvpt.json", + "sha256": "cc1768875372be54ed1c6f4a505e572957eed0c8abddb9cdb2fbf8c220b24d0d" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "agsvpt@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "agsvpt", + "file": "packages/adapters/src/sites/definitions/agsvpt.json", + "sha256": "cc1768875372be54ed1c6f4a505e572957eed0c8abddb9cdb2fbf8c220b24d0d" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "[限时]", + "page_url": "https://www.agsvpt.com/details.php?id=555001&hit=1", + "enclosure": "https://www.agsvpt.com/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://www.agsvpt.com/details.php?id=555002&hit=1", + "enclosure": "https://www.agsvpt.com/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "2天", + "description": "[限时]", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.agsvpt.com/download.php?id=555001", + "grabs": 100, + "page_url": "https://www.agsvpt.com/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.agsvpt.com/download.php?id=555002", + "grabs": 55, + "page_url": "https://www.agsvpt.com/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "audiences@tk-audiences-list", + "definition": { + "source": "definition", + "id": "audiences", + "file": "packages/adapters/src/sites/definitions/audiences.json", + "sha256": "fcf0aa51d84d2a192a149b802613f79163bc961f97fc8e576288627cb3d1bb08" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "沙丘2 / 沙丘:第二部 | 杜比视界 国英双语 中字", + "page_url": "https://audiences.me/details.php?id=812345&hit=1", + "enclosure": "https://audiences.me/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "freedate": "2026-10-01 12:00:00", + "labels": [], + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "奔跑吧 第十二季 第1期", + "page_url": "https://audiences.me/details.php?id=812346&hit=1", + "enclosure": "https://audiences.me/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "freedate": null, + "labels": [], + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "熊家餐馆 第三季", + "page_url": "https://audiences.me/details.php?id=812347&hit=1", + "enclosure": "https://audiences.me/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "freedate": "2026-09-29 08:30:00", + "labels": [], + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://audiences.me/details.php?id=812348&hit=1", + "enclosure": "https://audiences.me/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "freedate": null, + "labels": [], + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "地球脉动 第三季", + "page_url": "https://audiences.me/details.php?id=812349&hit=1", + "enclosure": "https://audiences.me/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "freedate": "", + "labels": [], + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "沙丘2 / 沙丘:第二部 | 杜比视界 国英双语 中字", + "page_url": "https://audiences.me/details.php?id=812345&hit=1", + "enclosure": "https://audiences.me/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "freedate": "2026-10-01 12:00:00", + "labels": [], + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "奔跑吧 第十二季 第1期", + "page_url": "https://audiences.me/details.php?id=812346&hit=1", + "enclosure": "https://audiences.me/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "freedate": null, + "labels": [], + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "熊家餐馆 第三季", + "page_url": "https://audiences.me/details.php?id=812347&hit=1", + "enclosure": "https://audiences.me/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "freedate": "2026-09-29 08:30:00", + "labels": [], + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://audiences.me/details.php?id=812348&hit=1", + "enclosure": "https://audiences.me/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "freedate": null, + "labels": [], + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "地球脉动 第三季", + "page_url": "https://audiences.me/details.php?id=812349&hit=1", + "enclosure": "https://audiences.me/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "freedate": "", + "labels": [], + "category": "未知" + } + ] + } + }, + { + "id": "audiences@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "audiences", + "file": "packages/adapters/src/sites/definitions/audiences.json", + "sha256": "fcf0aa51d84d2a192a149b802613f79163bc961f97fc8e576288627cb3d1bb08" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "audiences@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "audiences", + "file": "packages/adapters/src/sites/definitions/audiences.json", + "sha256": "fcf0aa51d84d2a192a149b802613f79163bc961f97fc8e576288627cb3d1bb08" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": null, + "page_url": "https://audiences.me/details.php?id=555001&hit=1", + "enclosure": "https://audiences.me/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "freedate": null, + "labels": ["中字"], + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://audiences.me/details.php?id=555002&hit=1", + "enclosure": "https://audiences.me/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "freedate": null, + "labels": [], + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": null, + "page_url": "https://audiences.me/details.php?id=555001&hit=1", + "enclosure": "https://audiences.me/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "freedate": null, + "labels": ["中字"], + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://audiences.me/details.php?id=555002&hit=1", + "enclosure": "https://audiences.me/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "freedate": null, + "labels": [], + "category": "电影" + } + ] + } + }, + { + "id": "chdbits@tk-audiences-list", + "definition": { + "source": "definition", + "id": "chdbits", + "file": "packages/adapters/src/sites/definitions/chdbits.json", + "sha256": "7fe7b0101d9fc5bcd852915b9c2543ded200297707241737847c2c4a58d5d70f" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://ptchdbits.co/download.php?id=812345", + "grabs": 3388, + "page_url": "https://ptchdbits.co/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ptchdbits.co/download.php?id=812346", + "grabs": 410, + "page_url": "https://ptchdbits.co/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://ptchdbits.co/download.php?id=812347", + "grabs": 120, + "page_url": "https://ptchdbits.co/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ptchdbits.co/download.php?id=812348", + "grabs": 44, + "page_url": "https://ptchdbits.co/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ptchdbits.co/download.php?id=812349", + "grabs": 9, + "page_url": "https://ptchdbits.co/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "chdbits@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "chdbits", + "file": "packages/adapters/src/sites/definitions/chdbits.json", + "sha256": "7fe7b0101d9fc5bcd852915b9c2543ded200297707241737847c2c4a58d5d70f" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "chdbits@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "chdbits", + "file": "packages/adapters/src/sites/definitions/chdbits.json", + "sha256": "7fe7b0101d9fc5bcd852915b9c2543ded200297707241737847c2c4a58d5d70f" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "最后生还者 第二季 中字", + "page_url": "https://ptchdbits.co/details.php?id=555001&hit=1", + "enclosure": "https://ptchdbits.co/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "freedate": "2026-09-30 12:00:00", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": "奥本海默", + "page_url": "https://ptchdbits.co/details.php?id=555002&hit=1", + "enclosure": "https://ptchdbits.co/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "freedate": null, + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "2天", + "description": "最后生还者 第二季 中字", + "downloadvolumefactor": 0.0, + "enclosure": "https://ptchdbits.co/download.php?id=555001", + "freedate": "2026-09-30 12:00:00", + "grabs": 100, + "page_url": "https://ptchdbits.co/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "description": "奥本海默", + "downloadvolumefactor": 1.0, + "enclosure": "https://ptchdbits.co/download.php?id=555002", + "grabs": 55, + "page_url": "https://ptchdbits.co/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdarea@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdarea", + "file": "packages/adapters/src/sites/definitions/hdarea.json", + "sha256": "276d2f920081bce7cb3f24a8b7d40507ebca87179c6a707eae31e2db136b046c" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=812345&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=812345", + "grabs": 0, + "peers": 3388, + "seeders": 17, + "size": 1204, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "date_elapsed": "78.42 GB", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=812346&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=812346", + "grabs": 0, + "peers": 410, + "seeders": 2, + "size": 88, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "5.12 GB", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=812347&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=812347", + "grabs": 0, + "peers": 120, + "seeders": 0, + "size": 35, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "1,234.56 MiB", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=812348&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=812348", + "grabs": 0, + "peers": 44, + "seeders": 1, + "size": 12, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "2.1 TB", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=812349&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=812349", + "grabs": 0, + "peers": 9, + "seeders": 0, + "size": 5, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "850 KB", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "78.42 GB", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.hdarea.club/download.php?id=812345", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=812345&hit=1", + "peers": 3388, + "seeders": 17, + "size": 1204, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "5.12 GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hdarea.club/download.php?id=812346", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=812346&hit=1", + "peers": 410, + "seeders": 2, + "size": 88, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "1,234.56 MiB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hdarea.club/download.php?id=812347", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=812347&hit=1", + "peers": 120, + "seeders": 0, + "size": 35, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2.1 TB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hdarea.club/download.php?id=812348", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=812348&hit=1", + "peers": 44, + "seeders": 1, + "size": 12, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "850 KB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hdarea.club/download.php?id=812349", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=812349&hit=1", + "peers": 9, + "seeders": 0, + "size": 5, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdarea@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdarea", + "file": "packages/adapters/src/sites/definitions/hdarea.json", + "sha256": "276d2f920081bce7cb3f24a8b7d40507ebca87179c6a707eae31e2db136b046c" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdarea@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdarea", + "file": "packages/adapters/src/sites/definitions/hdarea.json", + "sha256": "276d2f920081bce7cb3f24a8b7d40507ebca87179c6a707eae31e2db136b046c" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=555001&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=555001", + "grabs": 0, + "peers": 100, + "seeders": 3, + "size": 42, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "date_elapsed": "45.20\nGB", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": null, + "page_url": "https://www.hdarea.club/details.php?id=555002&hit=1", + "enclosure": "https://www.hdarea.club/download.php?id=555002", + "grabs": 0, + "peers": 55, + "seeders": 0, + "size": 7, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "80.00\nGB", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "45.20GB", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.hdarea.club/download.php?id=555001", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=555001&hit=1", + "peers": 100, + "seeders": 3, + "size": 42, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "80.00GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hdarea.club/download.php?id=555002", + "grabs": 0, + "page_url": "https://www.hdarea.club/details.php?id=555002&hit=1", + "peers": 55, + "seeders": 0, + "size": 7, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hddolby@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hddolby", + "file": "packages/adapters/src/sites/definitions/hddolby.json", + "sha256": "55a0c394e5732f6aa7b5db51d84b63146b3916f5aa8dc888f0e1b1f3a4837578" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=812345&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=812346&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=812347&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=812348&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=812349&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.hddolby.com/download.php?id=812345", + "grabs": 3388, + "page_url": "https://www.hddolby.com/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hddolby.com/download.php?id=812346", + "grabs": 410, + "page_url": "https://www.hddolby.com/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hddolby.com/download.php?id=812347", + "grabs": 120, + "page_url": "https://www.hddolby.com/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hddolby.com/download.php?id=812348", + "grabs": 44, + "page_url": "https://www.hddolby.com/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hddolby.com/download.php?id=812349", + "grabs": 9, + "page_url": "https://www.hddolby.com/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hddolby@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hddolby", + "file": "packages/adapters/src/sites/definitions/hddolby.json", + "sha256": "55a0c394e5732f6aa7b5db51d84b63146b3916f5aa8dc888f0e1b1f3a4837578" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hddolby@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hddolby", + "file": "packages/adapters/src/sites/definitions/hddolby.json", + "sha256": "55a0c394e5732f6aa7b5db51d84b63146b3916f5aa8dc888f0e1b1f3a4837578" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=555001&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": null, + "page_url": "https://www.hddolby.com/details.php?id=555002&hit=1", + "enclosure": "https://www.hddolby.com/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.hddolby.com/download.php?id=555001", + "grabs": 100, + "page_url": "https://www.hddolby.com/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.hddolby.com/download.php?id=555002", + "grabs": 55, + "page_url": "https://www.hddolby.com/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdfans@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdfans", + "file": "packages/adapters/src/sites/definitions/hdfans.json", + "sha256": "b554564eb809b93857436b6ee33518ddf646797a83695d94590c22e032d1943e" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "page_url": "https://hdfans.org/details.php?id=812345&hit=1", + "enclosure": "https://hdfans.org/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "", + "page_url": "https://hdfans.org/details.php?id=812346&hit=1", + "enclosure": "https://hdfans.org/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "category": "未知" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "page_url": "https://hdfans.org/details.php?id=812347&hit=1", + "enclosure": "https://hdfans.org/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://hdfans.org/details.php?id=812348&hit=1", + "enclosure": "https://hdfans.org/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "", + "page_url": "https://hdfans.org/details.php?id=812349&hit=1", + "enclosure": "https://hdfans.org/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdfans.org/download.php?id=812345", + "grabs": 3388, + "page_url": "https://hdfans.org/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdfans.org/download.php?id=812346", + "grabs": 410, + "page_url": "https://hdfans.org/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdfans.org/download.php?id=812347", + "grabs": 120, + "page_url": "https://hdfans.org/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdfans.org/download.php?id=812348", + "grabs": 44, + "page_url": "https://hdfans.org/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdfans.org/download.php?id=812349", + "grabs": 9, + "page_url": "https://hdfans.org/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdfans@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdfans", + "file": "packages/adapters/src/sites/definitions/hdfans.json", + "sha256": "b554564eb809b93857436b6ee33518ddf646797a83695d94590c22e032d1943e" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdfans@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdfans", + "file": "packages/adapters/src/sites/definitions/hdfans.json", + "sha256": "b554564eb809b93857436b6ee33518ddf646797a83695d94590c22e032d1943e" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": "", + "page_url": "https://hdfans.org/details.php?id=555001&hit=1", + "enclosure": "https://hdfans.org/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": "", + "page_url": "https://hdfans.org/details.php?id=555002&hit=1", + "enclosure": "https://hdfans.org/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdfans.org/download.php?id=555001", + "grabs": 100, + "page_url": "https://hdfans.org/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdfans.org/download.php?id=555002", + "grabs": 55, + "page_url": "https://hdfans.org/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdhome@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdhome", + "file": "packages/adapters/src/sites/definitions/hdhome.json", + "sha256": "61cca5fc1d849e566afc18d46f480fda369ce4b0387eb007b61637c004d72ecc" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdhome.org/download.php?id=812345", + "grabs": 3388, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdhome.org/download.php?id=812346", + "grabs": 410, + "hit_and_run": true, + "page_url": "https://hdhome.org/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://hdhome.org/download.php?id=812347", + "grabs": 120, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdhome.org/download.php?id=812348", + "grabs": 44, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdhome.org/download.php?id=812349", + "grabs": 9, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "hdhome@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdhome", + "file": "packages/adapters/src/sites/definitions/hdhome.json", + "sha256": "61cca5fc1d849e566afc18d46f480fda369ce4b0387eb007b61637c004d72ecc" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdhome@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdhome", + "file": "packages/adapters/src/sites/definitions/hdhome.json", + "sha256": "61cca5fc1d849e566afc18d46f480fda369ce4b0387eb007b61637c004d72ecc" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "[限时]", + "page_url": "https://hdhome.org/details.php?id=555001&hit=1", + "enclosure": "https://hdhome.org/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://hdhome.org/details.php?id=555002&hit=1", + "enclosure": "https://hdhome.org/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "hit_and_run": false, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "2天", + "description": "[限时]", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdhome.org/download.php?id=555001", + "grabs": 100, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdhome.org/download.php?id=555002", + "grabs": 55, + "hit_and_run": false, + "page_url": "https://hdhome.org/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdsky@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdsky", + "file": "packages/adapters/src/sites/definitions/hdsky.json", + "sha256": "5dcf10dadbd1177d0e4a5f81dd4fe07e8b2d0da4292862e1183401be600f8b4a" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdsky@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdsky", + "file": "packages/adapters/src/sites/definitions/hdsky.json", + "sha256": "5dcf10dadbd1177d0e4a5f81dd4fe07e8b2d0da4292862e1183401be600f8b4a" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdsky@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdsky", + "file": "packages/adapters/src/sites/definitions/hdsky.json", + "sha256": "5dcf10dadbd1177d0e4a5f81dd4fe07e8b2d0da4292862e1183401be600f8b4a" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdtime@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdtime", + "file": "packages/adapters/src/sites/definitions/hdtime.json", + "sha256": "a5ceae3eeaef61a45b168d7507efe1b3fdbc37544c7d07a535804ec5d486fac7" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "page_url": "https://hdtime.org/details.php?id=812345&hit=1", + "enclosure": "https://hdtime.org/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "", + "page_url": "https://hdtime.org/details.php?id=812346&hit=1", + "enclosure": "https://hdtime.org/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "page_url": "https://hdtime.org/details.php?id=812347&hit=1", + "enclosure": "https://hdtime.org/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://hdtime.org/details.php?id=812348&hit=1", + "enclosure": "https://hdtime.org/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "", + "page_url": "https://hdtime.org/details.php?id=812349&hit=1", + "enclosure": "https://hdtime.org/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdtime.org/download.php?id=812345", + "grabs": 3388, + "page_url": "https://hdtime.org/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=812346", + "grabs": 410, + "page_url": "https://hdtime.org/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=812347", + "grabs": 120, + "page_url": "https://hdtime.org/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=812348", + "grabs": 44, + "page_url": "https://hdtime.org/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=812349", + "grabs": 9, + "page_url": "https://hdtime.org/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdtime@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdtime", + "file": "packages/adapters/src/sites/definitions/hdtime.json", + "sha256": "a5ceae3eeaef61a45b168d7507efe1b3fdbc37544c7d07a535804ec5d486fac7" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdtime@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdtime", + "file": "packages/adapters/src/sites/definitions/hdtime.json", + "sha256": "a5ceae3eeaef61a45b168d7507efe1b3fdbc37544c7d07a535804ec5d486fac7" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": "", + "page_url": "https://hdtime.org/details.php?id=555001&hit=1", + "enclosure": "https://hdtime.org/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": "", + "page_url": "https://hdtime.org/details.php?id=555002&hit=1", + "enclosure": "https://hdtime.org/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=555001", + "grabs": 100, + "page_url": "https://hdtime.org/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdtime.org/download.php?id=555002", + "grabs": 55, + "page_url": "https://hdtime.org/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hdvideo@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hdvideo", + "file": "packages/adapters/src/sites/definitions/hdvideo.json", + "sha256": "aff3cd7ebb004bd73d2c36d81a0d97ab804393ff3ebc7fb5ed285eb13ab6ee59" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 1204, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "date_elapsed": "78.42 GB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812345", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 88, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "5.12 GB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812346", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 35, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "date_elapsed": "1,234.56 MiB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812347", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 12, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "2.1 TB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812348", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 5, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "date_elapsed": "850 KB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=812349", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "peers": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "78.42 GB", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdvideo.top/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 1204, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdvideo.top/download.php?id=812345", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "5.12 GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 88, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812346", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "1,234.56 MiB", + "downloadvolumefactor": 0.5, + "enclosure": "https://hdvideo.top/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 35, + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "downloadvolumefactor": 0.5, + "enclosure": "https://hdvideo.top/download.php?id=812347", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "2.1 TB", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 12, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812348", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "850 KB", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 5, + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=812349", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "hdvideo@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hdvideo", + "file": "packages/adapters/src/sites/definitions/hdvideo.json", + "sha256": "aff3cd7ebb004bd73d2c36d81a0d97ab804393ff3ebc7fb5ed285eb13ab6ee59" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hdvideo@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hdvideo", + "file": "packages/adapters/src/sites/definitions/hdvideo.json", + "sha256": "aff3cd7ebb004bd73d2c36d81a0d97ab804393ff3ebc7fb5ed285eb13ab6ee59" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=555001", + "grabs": 100, + "peers": 100, + "seeders": 0, + "size": 42, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "date_elapsed": "45.20\nGB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=555001", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=555002", + "grabs": 0, + "peers": 55, + "seeders": 0, + "size": 7, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "80.00\nGB", + "category": "未知" + }, + { + "title": "None", + "description": null, + "enclosure": "https://hdvideo.top/download.php?id=555002", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": null, + "date_elapsed": null, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "peers": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "45.20GB", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdvideo.top/download.php?id=555001", + "grabs": 100, + "peers": 100, + "size": 42, + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "downloadvolumefactor": 0.0, + "enclosure": "https://hdvideo.top/download.php?id=555001", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "80.00GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=555002", + "peers": 55, + "size": 7, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://hdvideo.top/download.php?id=555002", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hhanclub@tk-audiences-list", + "definition": { + "source": "definition", + "id": "hhanclub", + "file": "packages/adapters/src/sites/definitions/hhanclub.json", + "sha256": "a15c4b4496a22368c85b7cba5bada167c2cc191893b632cbfda4ce9627a161d5" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "hhanclub@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "hhanclub", + "file": "packages/adapters/src/sites/definitions/hhanclub.json", + "sha256": "a15c4b4496a22368c85b7cba5bada167c2cc191893b632cbfda4ce9627a161d5" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "Go.Fighting.S10E01.2026.2160p.WEB-DL.H265.AAC-HHWEB", + "description": "极限挑战 第十季 第1期", + "page_url": "https://hhanclub.net/details.php?id=90001&hit=1", + "enclosure": "https://hhanclub.net/download.php?id=90001", + "grabs": 1024, + "peers": 5, + "seeders": 88, + "size": 6571299963, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-20 20:30:00", + "date_elapsed": "6天23时", + "hit_and_run": true, + "category": "电视剧" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-HHWEB", + "description": "沙丘2", + "page_url": "https://hhanclub.net/details.php?id=90002&hit=1", + "enclosure": "https://hhanclub.net/download.php?id=90002", + "grabs": 300, + "peers": 0, + "seeders": 12, + "size": 84073984819, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": "2026-09-01 08:00:00", + "date_elapsed": "2026-09-01 08:00:00", + "hit_and_run": false, + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "6天23时", + "description": "极限挑战 第十季 第1期", + "downloadvolumefactor": 0.0, + "enclosure": "https://hhanclub.net/download.php?id=90001", + "grabs": 1024, + "hit_and_run": true, + "page_url": "https://hhanclub.net/details.php?id=90001&hit=1", + "peers": 5, + "pubdate": "2026-09-20 20:30:00", + "seeders": 88, + "size": 6571299963, + "title": "Go.Fighting.S10E01.2026.2160p.WEB-DL.H265.AAC-HHWEB", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "2026-09-01 08:00:00", + "description": "沙丘2", + "downloadvolumefactor": 0.5, + "enclosure": "https://hhanclub.net/download.php?id=90002", + "grabs": 300, + "hit_and_run": false, + "page_url": "https://hhanclub.net/details.php?id=90002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 08:00:00", + "seeders": 12, + "size": 84073984819, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-HHWEB", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "hhanclub@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "hhanclub", + "file": "packages/adapters/src/sites/definitions/hhanclub.json", + "sha256": "a15c4b4496a22368c85b7cba5bada167c2cc191893b632cbfda4ce9627a161d5" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "keepfrds@tk-audiences-list", + "definition": { + "source": "definition", + "id": "keepfrds", + "file": "packages/adapters/src/sites/definitions/keepfrds.json", + "sha256": "d9d21a434b50c20c5f6217b58a8155fa36364f87dc397a78c4d26ea69b1e0dcc" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=812345", + "grabs": 3388, + "page_url": "https://pt.keepfrds.com/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=812346", + "grabs": 410, + "page_url": "https://pt.keepfrds.com/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://pt.keepfrds.com/download.php?id=812347", + "grabs": 120, + "page_url": "https://pt.keepfrds.com/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=812348", + "grabs": 44, + "page_url": "https://pt.keepfrds.com/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=812349", + "grabs": 9, + "page_url": "https://pt.keepfrds.com/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "keepfrds@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "keepfrds", + "file": "packages/adapters/src/sites/definitions/keepfrds.json", + "sha256": "d9d21a434b50c20c5f6217b58a8155fa36364f87dc397a78c4d26ea69b1e0dcc" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "keepfrds@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "keepfrds", + "file": "packages/adapters/src/sites/definitions/keepfrds.json", + "sha256": "d9d21a434b50c20c5f6217b58a8155fa36364f87dc397a78c4d26ea69b1e0dcc" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "", + "page_url": "https://pt.keepfrds.com/details.php?id=555001&hit=1", + "enclosure": "https://pt.keepfrds.com/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": "", + "page_url": "https://pt.keepfrds.com/details.php?id=555002&hit=1", + "enclosure": "https://pt.keepfrds.com/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 0.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=555001", + "grabs": 100, + "page_url": "https://pt.keepfrds.com/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.keepfrds.com/download.php?id=555002", + "grabs": 55, + "page_url": "https://pt.keepfrds.com/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "nicept@tk-audiences-list", + "definition": { + "source": "definition", + "id": "nicept", + "file": "packages/adapters/src/sites/definitions/nicept.json", + "sha256": "5b7bad2f8436ef1834643d4bbe0ccdd2070810d96431600dab5b7cd9b1d67545" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=812345&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=812346&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "hit_and_run": true, + "category": "未知" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=812347&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://www.nicept.net/details.php?id=812348&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=812349&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "hit_and_run": false, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "hit_and_run": false, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://www.nicept.net/download.php?id=812345", + "grabs": 3388, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.nicept.net/download.php?id=812346", + "grabs": 410, + "hit_and_run": true, + "page_url": "https://www.nicept.net/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://www.nicept.net/download.php?id=812347", + "grabs": 120, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.nicept.net/download.php?id=812348", + "grabs": 44, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.nicept.net/download.php?id=812349", + "grabs": 9, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "nicept@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "nicept", + "file": "packages/adapters/src/sites/definitions/nicept.json", + "sha256": "5b7bad2f8436ef1834643d4bbe0ccdd2070810d96431600dab5b7cd9b1d67545" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "nicept@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "nicept", + "file": "packages/adapters/src/sites/definitions/nicept.json", + "sha256": "5b7bad2f8436ef1834643d4bbe0ccdd2070810d96431600dab5b7cd9b1d67545" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=555001&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Oppenheimer.2023...", + "description": "", + "page_url": "https://www.nicept.net/details.php?id=555002&hit=1", + "enclosure": "https://www.nicept.net/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "hit_and_run": false, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "hit_and_run": false, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2天", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.nicept.net/download.php?id=555001", + "grabs": 100, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.nicept.net/download.php?id=555002", + "grabs": 55, + "hit_and_run": false, + "page_url": "https://www.nicept.net/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "ourbits@tk-audiences-list", + "definition": { + "source": "definition", + "id": "ourbits", + "file": "packages/adapters/src/sites/definitions/ourbits.json", + "sha256": "74109692ed77f728914fbd5603ef3428dbf6a7b7bc2b4d8e7fe6f59a25e649e0" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://ourbits.club/download.php?id=812345", + "grabs": 3388, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ourbits.club/download.php?id=812346", + "grabs": 410, + "hit_and_run": true, + "page_url": "https://ourbits.club/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://ourbits.club/download.php?id=812347", + "grabs": 120, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ourbits.club/download.php?id=812348", + "grabs": 44, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://ourbits.club/download.php?id=812349", + "grabs": 9, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "ourbits@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "ourbits", + "file": "packages/adapters/src/sites/definitions/ourbits.json", + "sha256": "74109692ed77f728914fbd5603ef3428dbf6a7b7bc2b4d8e7fe6f59a25e649e0" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "ourbits@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "ourbits", + "file": "packages/adapters/src/sites/definitions/ourbits.json", + "sha256": "74109692ed77f728914fbd5603ef3428dbf6a7b7bc2b4d8e7fe6f59a25e649e0" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": null, + "page_url": "https://ourbits.club/details.php?id=555001&hit=1", + "enclosure": "https://ourbits.club/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "hit_and_run": false, + "category": "电影" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://ourbits.club/details.php?id=555002&hit=1", + "enclosure": "https://ourbits.club/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "hit_and_run": false, + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "2天", + "downloadvolumefactor": 0.0, + "enclosure": "https://ourbits.club/download.php?id=555001", + "grabs": 100, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://ourbits.club/download.php?id=555002", + "grabs": 55, + "hit_and_run": false, + "page_url": "https://ourbits.club/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "piggo@tk-audiences-list", + "definition": { + "source": "definition", + "id": "piggo", + "file": "packages/adapters/src/sites/definitions/piggo.json", + "sha256": "a563e5ad444e0e9ae0094b887c8cdbcc168f590da1a029581859dd4fef057c0a" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "page_url": "https://piggo.me/details.php?id=812345&hit=1", + "enclosure": "https://piggo.me/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "", + "page_url": "https://piggo.me/details.php?id=812346&hit=1", + "enclosure": "https://piggo.me/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "page_url": "https://piggo.me/details.php?id=812347&hit=1", + "enclosure": "https://piggo.me/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://piggo.me/details.php?id=812348&hit=1", + "enclosure": "https://piggo.me/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "", + "page_url": "https://piggo.me/details.php?id=812349&hit=1", + "enclosure": "https://piggo.me/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://piggo.me/download.php?id=812345", + "grabs": 3388, + "page_url": "https://piggo.me/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=812346", + "grabs": 410, + "page_url": "https://piggo.me/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=812347", + "grabs": 120, + "page_url": "https://piggo.me/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=812348", + "grabs": 44, + "page_url": "https://piggo.me/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=812349", + "grabs": 9, + "page_url": "https://piggo.me/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "piggo@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "piggo", + "file": "packages/adapters/src/sites/definitions/piggo.json", + "sha256": "a563e5ad444e0e9ae0094b887c8cdbcc168f590da1a029581859dd4fef057c0a" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "piggo@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "piggo", + "file": "packages/adapters/src/sites/definitions/piggo.json", + "sha256": "a563e5ad444e0e9ae0094b887c8cdbcc168f590da1a029581859dd4fef057c0a" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": "", + "page_url": "https://piggo.me/details.php?id=555001&hit=1", + "enclosure": "https://piggo.me/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": "", + "page_url": "https://piggo.me/details.php?id=555002&hit=1", + "enclosure": "https://piggo.me/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=555001", + "grabs": 100, + "page_url": "https://piggo.me/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://piggo.me/download.php?id=555002", + "grabs": 55, + "page_url": "https://piggo.me/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "pter@tk-audiences-list", + "definition": { + "source": "definition", + "id": "pter", + "file": "packages/adapters/src/sites/definitions/pter.json", + "sha256": "12f89b194a68ec518da427555c0d37fb707b3a19c89f3e50b6a5a68001ac96b1" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://pterclub.net/download.php?id=812345", + "grabs": 3388, + "page_url": "https://pterclub.net/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pterclub.net/download.php?id=812346", + "grabs": 410, + "page_url": "https://pterclub.net/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://pterclub.net/download.php?id=812347", + "grabs": 120, + "page_url": "https://pterclub.net/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pterclub.net/download.php?id=812348", + "grabs": 44, + "page_url": "https://pterclub.net/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pterclub.net/download.php?id=812349", + "grabs": 9, + "page_url": "https://pterclub.net/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "pter@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "pter", + "file": "packages/adapters/src/sites/definitions/pter.json", + "sha256": "12f89b194a68ec518da427555c0d37fb707b3a19c89f3e50b6a5a68001ac96b1" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "pter@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "pter", + "file": "packages/adapters/src/sites/definitions/pter.json", + "sha256": "12f89b194a68ec518da427555c0d37fb707b3a19c89f3e50b6a5a68001ac96b1" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "page_url": "https://pterclub.net/details.php?id=555001&hit=1", + "enclosure": "https://pterclub.net/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "未知" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "page_url": "https://pterclub.net/details.php?id=555002&hit=1", + "enclosure": "https://pterclub.net/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "2天", + "downloadvolumefactor": 0.0, + "enclosure": "https://pterclub.net/download.php?id=555001", + "grabs": 100, + "page_url": "https://pterclub.net/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://pterclub.net/download.php?id=555002", + "grabs": 55, + "page_url": "https://pterclub.net/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "pthome@tk-audiences-list", + "definition": { + "source": "definition", + "id": "pthome", + "file": "packages/adapters/src/sites/definitions/pthome.json", + "sha256": "e3274c5bead60f2b796101fce5762684aa38cf012163518f2d5b5d95abc84034" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://pthome.net/download.php?id=812345", + "grabs": 3388, + "page_url": "https://pthome.net/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pthome.net/download.php?id=812346", + "grabs": 410, + "page_url": "https://pthome.net/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 0.5, + "enclosure": "https://pthome.net/download.php?id=812347", + "grabs": 120, + "page_url": "https://pthome.net/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pthome.net/download.php?id=812348", + "grabs": 44, + "page_url": "https://pthome.net/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pthome.net/download.php?id=812349", + "grabs": 9, + "page_url": "https://pthome.net/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "pthome@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "pthome", + "file": "packages/adapters/src/sites/definitions/pthome.json", + "sha256": "e3274c5bead60f2b796101fce5762684aa38cf012163518f2d5b5d95abc84034" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "pthome@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "pthome", + "file": "packages/adapters/src/sites/definitions/pthome.json", + "sha256": "e3274c5bead60f2b796101fce5762684aa38cf012163518f2d5b5d95abc84034" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "[限时]", + "page_url": "https://pthome.net/details.php?id=555001&hit=1", + "enclosure": "https://pthome.net/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://pthome.net/details.php?id=555002&hit=1", + "enclosure": "https://pthome.net/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "2天", + "description": "[限时]", + "downloadvolumefactor": 0.0, + "enclosure": "https://pthome.net/download.php?id=555001", + "grabs": 100, + "page_url": "https://pthome.net/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://pthome.net/download.php?id=555002", + "grabs": 55, + "page_url": "https://pthome.net/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "pttime@tk-audiences-list", + "definition": { + "source": "definition", + "id": "pttime", + "file": "packages/adapters/src/sites/definitions/pttime.json", + "sha256": "3c1fe2abec178ef0a6230406946e0a774d527831a11ad28be54e98e479aa7039" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=812345&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=812345", + "grabs": 0, + "peers": 3388, + "seeders": 17, + "size": 1204, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "78.42 GB", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=812346&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=812346", + "grabs": 0, + "peers": 410, + "seeders": 2, + "size": 88, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "5.12 GB", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=812347&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=812347", + "grabs": 0, + "peers": 120, + "seeders": 0, + "size": 35, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "1,234.56 MiB", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=812348&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=812348", + "grabs": 0, + "peers": 44, + "seeders": 1, + "size": 12, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "2.1 TB", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=812349&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=812349", + "grabs": 0, + "peers": 9, + "seeders": 0, + "size": 5, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "850 KB", + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "78.42 GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=812345", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=812345&hit=1", + "peers": 3388, + "seeders": 17, + "size": 1204, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "5.12 GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=812346", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=812346&hit=1", + "peers": 410, + "seeders": 2, + "size": 88, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "1,234.56 MiB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=812347", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=812347&hit=1", + "peers": 120, + "seeders": 0, + "size": 35, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2.1 TB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=812348", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=812348&hit=1", + "peers": 44, + "seeders": 1, + "size": 12, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "850 KB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=812349", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=812349&hit=1", + "peers": 9, + "seeders": 0, + "size": 5, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "pttime@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "pttime", + "file": "packages/adapters/src/sites/definitions/pttime.json", + "sha256": "3c1fe2abec178ef0a6230406946e0a774d527831a11ad28be54e98e479aa7039" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "pttime@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "pttime", + "file": "packages/adapters/src/sites/definitions/pttime.json", + "sha256": "3c1fe2abec178ef0a6230406946e0a774d527831a11ad28be54e98e479aa7039" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "大小", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=555001&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=555001", + "grabs": 0, + "peers": 100, + "seeders": 3, + "size": 42, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "45.20\nGB", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": null, + "page_url": "https://www.pttime.org/details.php?id=555002&hit=1", + "enclosure": "https://www.pttime.org/download.php?id=555002", + "grabs": 0, + "peers": 55, + "seeders": 0, + "size": 7, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "80.00\nGB", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "大小", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "45.20GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=555001", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=555001&hit=1", + "peers": 100, + "seeders": 3, + "size": 42, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "80.00GB", + "downloadvolumefactor": 1.0, + "enclosure": "https://www.pttime.org/download.php?id=555002", + "grabs": 0, + "page_url": "https://www.pttime.org/details.php?id=555002&hit=1", + "peers": 55, + "seeders": 0, + "size": 7, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "soulvoice@tk-audiences-list", + "definition": { + "source": "definition", + "id": "soulvoice", + "file": "packages/adapters/src/sites/definitions/soulvoice.json", + "sha256": "b354b97131ff23192d563da68601f78db5b31473bc3d4265ae0168627f223b2c" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "存活时间", + "category": "未知" + }, + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=812345&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=812345", + "grabs": 3388, + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": "3小时前", + "category": "电影" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=812346&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=812346", + "grabs": 410, + "peers": 2, + "seeders": 88, + "size": 5497558139, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 20:00:00", + "date_elapsed": "2026-09-26 20:00:00", + "category": "电视剧" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=812347&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=812347", + "grabs": 120, + "peers": 0, + "seeders": 35, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:30:00", + "date_elapsed": "2026-09-25 08:30:00", + "category": "电视剧" + }, + { + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "description": null, + "page_url": "https://pt.soulvoice.club/details.php?id=812348&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=812348", + "grabs": 44, + "peers": 1, + "seeders": 12, + "size": 2308974418330, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-24 10:00:00", + "date_elapsed": "2026-09-24 10:00:00", + "category": "电视剧" + }, + { + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=812349&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=812349", + "grabs": 9, + "peers": 0, + "seeders": 5, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-23 10:00:00", + "date_elapsed": "2026-09-23 10:00:00", + "category": "音乐" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "存活时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "downloadvolumefactor": 0.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=812345", + "grabs": 3388, + "page_url": "https://pt.soulvoice.club/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=812346", + "grabs": 410, + "page_url": "https://pt.soulvoice.club/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=812347", + "grabs": 120, + "page_url": "https://pt.soulvoice.club/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=812348", + "grabs": 44, + "page_url": "https://pt.soulvoice.club/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "音乐", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=812349", + "grabs": 9, + "page_url": "https://pt.soulvoice.club/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "soulvoice@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "soulvoice", + "file": "packages/adapters/src/sites/definitions/soulvoice.json", + "sha256": "b354b97131ff23192d563da68601f78db5b31473bc3d4265ae0168627f223b2c" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "soulvoice@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "soulvoice", + "file": "packages/adapters/src/sites/definitions/soulvoice.json", + "sha256": "b354b97131ff23192d563da68601f78db5b31473bc3d4265ae0168627f223b2c" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "None", + "description": null, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "date_elapsed": "时间", + "category": "未知" + }, + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=555001&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "category": "电视剧" + }, + { + "title": "Oppenheimer.2023...", + "description": "", + "page_url": "https://pt.soulvoice.club/details.php?id=555002&hit=1", + "enclosure": "https://pt.soulvoice.club/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "时间", + "downloadvolumefactor": 1.0, + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "uploadvolumefactor": 1.0 + }, + { + "category": "电视剧", + "date_elapsed": "2天", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=555001", + "grabs": 100, + "page_url": "https://pt.soulvoice.club/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay...", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.soulvoice.club/download.php?id=555002", + "grabs": 55, + "page_url": "https://pt.soulvoice.club/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023...", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "ssd@tk-audiences-list", + "definition": { + "source": "definition", + "id": "ssd", + "file": "packages/adapters/src/sites/definitions/ssd.json", + "sha256": "a4a2e2bd80b9e3a23b5a06ee47290cc6f22d21fa1451d184f95e64981378a6a9" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "3小时前", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=812345", + "grabs": 3388, + "page_url": "https://springsunday.net/details.php?id=812345&hit=1", + "peers": 17, + "pubdate": "2026-09-26 21:14:03", + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-26 20:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=812346", + "grabs": 410, + "page_url": "https://springsunday.net/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-25 08:30:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=812347", + "grabs": 120, + "page_url": "https://springsunday.net/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-24 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=812348", + "grabs": 44, + "page_url": "https://springsunday.net/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "2026-09-23 10:00:00", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=812349", + "grabs": 9, + "page_url": "https://springsunday.net/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "ssd@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "ssd", + "file": "packages/adapters/src/sites/definitions/ssd.json", + "sha256": "a4a2e2bd80b9e3a23b5a06ee47290cc6f22d21fa1451d184f95e64981378a6a9" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "ssd@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "ssd", + "file": "packages/adapters/src/sites/definitions/ssd.json", + "sha256": "a4a2e2bd80b9e3a23b5a06ee47290cc6f22d21fa1451d184f95e64981378a6a9" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": null, + "page_url": "https://springsunday.net/details.php?id=555001&hit=1", + "enclosure": "https://springsunday.net/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-25 08:00:00", + "date_elapsed": "2天", + "freedate": null, + "category": "未知" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://springsunday.net/details.php?id=555002&hit=1", + "enclosure": "https://springsunday.net/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 10:00:00", + "date_elapsed": "26天", + "freedate": null, + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "date_elapsed": "2天", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=555001", + "grabs": 100, + "page_url": "https://springsunday.net/details.php?id=555001&hit=1", + "peers": 3, + "pubdate": "2026-09-25 08:00:00", + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "date_elapsed": "26天", + "downloadvolumefactor": 1.0, + "enclosure": "https://springsunday.net/download.php?id=555002", + "grabs": 55, + "page_url": "https://springsunday.net/details.php?id=555002&hit=1", + "peers": 0, + "pubdate": "2026-09-01 10:00:00", + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "tjupt@tk-audiences-list", + "definition": { + "source": "definition", + "id": "tjupt", + "file": "packages/adapters/src/sites/definitions/tjupt.json", + "sha256": "d2355dce0821891ea1d129cab689c14a7fa6e326b8771d72ff86f7373f7443da" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "description": "沙丘2 / 沙丘:第二部 | 杜比视界 国英双语 中字", + "downloadvolumefactor": 0.0, + "enclosure": "https://tjupt.org/download.php?id=812345", + "grabs": 3388, + "page_url": "https://tjupt.org/details.php?id=812345&hit=1", + "peers": 17, + "seeders": 1204, + "size": 84202833838, + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "description": "奔跑吧 第十二季 第1期", + "downloadvolumefactor": 1.0, + "enclosure": "https://tjupt.org/download.php?id=812346", + "grabs": 410, + "page_url": "https://tjupt.org/details.php?id=812346&hit=1", + "peers": 2, + "pubdate": "2026-09-26 20:00:00", + "seeders": 88, + "size": 5497558139, + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "description": "熊家餐馆 第三季", + "downloadvolumefactor": 0.5, + "enclosure": "https://tjupt.org/download.php?id=812347", + "grabs": 120, + "page_url": "https://tjupt.org/details.php?id=812347&hit=1", + "peers": 0, + "pubdate": "2026-09-25 08:30:00", + "seeders": 35, + "size": 1294529987, + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://tjupt.org/download.php?id=812348", + "grabs": 44, + "page_url": "https://tjupt.org/details.php?id=812348&hit=1", + "peers": 1, + "pubdate": "2026-09-24 10:00:00", + "seeders": 12, + "size": 2308974418330, + "title": "The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…", + "uploadvolumefactor": 1.0 + }, + { + "category": "未知", + "description": "地球脉动 第三季", + "downloadvolumefactor": 1.0, + "enclosure": "https://tjupt.org/download.php?id=812349", + "grabs": 9, + "page_url": "https://tjupt.org/details.php?id=812349&hit=1", + "peers": 0, + "pubdate": "2026-09-23 10:00:00", + "seeders": 5, + "size": 870400, + "title": "Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP", + "uploadvolumefactor": 2.0 + } + ] + } + }, + { + "id": "tjupt@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "tjupt", + "file": "packages/adapters/src/sites/definitions/tjupt.json", + "sha256": "d2355dce0821891ea1d129cab689c14a7fa6e326b8771d72ff86f7373f7443da" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "tjupt@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "tjupt", + "file": "packages/adapters/src/sites/definitions/tjupt.json", + "sha256": "d2355dce0821891ea1d129cab689c14a7fa6e326b8771d72ff86f7373f7443da" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "description": "[限时]", + "page_url": "https://tjupt.org/details.php?id=555001&hit=1", + "enclosure": "https://tjupt.org/download.php?id=555001", + "grabs": 100, + "peers": 3, + "seeders": 42, + "size": 48533130445, + "imdbid": null, + "downloadvolumefactor": 0, + "uploadvolumefactor": 2, + "pubdate": "2026-09-25 12:00:00", + "category": "未知" + }, + { + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "description": null, + "page_url": "https://tjupt.org/details.php?id=555002&hit=1", + "enclosure": "https://tjupt.org/download.php?id=555002", + "grabs": 55, + "peers": 0, + "seeders": 7, + "size": 85899345920, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-01 12:00:00", + "category": "未知" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "未知", + "description": "[限时]", + "downloadvolumefactor": 0.0, + "enclosure": "https://tjupt.org/download.php?id=555001", + "grabs": 100, + "page_url": "https://tjupt.org/details.php?id=555001&hit=1", + "peers": 3, + "seeders": 42, + "size": 48533130445, + "title": "The.Last.of.Us.S02.2025.1080p.BluRay.x264.DTS-HD.MA.5.1-CHD", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "downloadvolumefactor": 1.0, + "enclosure": "https://tjupt.org/download.php?id=555002", + "grabs": 55, + "page_url": "https://tjupt.org/details.php?id=555002&hit=1", + "peers": 0, + "seeders": 7, + "size": 85899345920, + "title": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX-CHD", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "ttg@tk-audiences-list", + "definition": { + "source": "definition", + "id": "ttg", + "file": "packages/adapters/src/sites/definitions/ttg.json", + "sha256": "aa0c93941d007faaa8f0bbcd0ad6aab29bd89f70848195eea77e64dd9511e9de" + }, + "input": { + "file": "inputs/indexer/tk-audiences-list.html.txt", + "sha256": "c9f4e36ea44b1fddb36a90c9906f90e2e303413247efb487f8d296f143ed8f5f" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "ttg@tk-hhanclub-list", + "definition": { + "source": "definition", + "id": "ttg", + "file": "packages/adapters/src/sites/definitions/ttg.json", + "sha256": "aa0c93941d007faaa8f0bbcd0ad6aab29bd89f70848195eea77e64dd9511e9de" + }, + "input": { + "file": "inputs/indexer/tk-hhanclub-list.html.txt", + "sha256": "349b28874e9bbbc14571ed6a8474569f3caa58694548857f83b9c0bd269118db" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "ttg@tk-chdbits-list", + "definition": { + "source": "definition", + "id": "ttg", + "file": "packages/adapters/src/sites/definitions/ttg.json", + "sha256": "aa0c93941d007faaa8f0bbcd0ad6aab29bd89f70848195eea77e64dd9511e9de" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-list.html.txt", + "sha256": "794252be44eb64f33b743bdd13be03e7ff41b62692992b7164d854b1087608b9" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [] + }, + "mp_rust": { + "is_error": false, + "torrents": [] + } + }, + { + "id": "audiences@tk-audiences-login", + "definition": { + "source": "definition", + "id": "audiences", + "file": "packages/adapters/src/sites/definitions/audiences.json", + "sha256": "fcf0aa51d84d2a192a149b802613f79163bc961f97fc8e576288627cb3d1bb08" + }, + "input": { + "file": "inputs/indexer/tk-audiences-login.html.txt", + "sha256": "e97696e6b9b1bfd5b14a7e16b18ca1e0cb98d553ad6363bb8d70a557741de92c" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": true, + "torrents": [] + }, + "mp_rust": { + "is_error": true, + "torrents": [] + } + }, + { + "id": "chdbits@tk-chdbits-login", + "definition": { + "source": "definition", + "id": "chdbits", + "file": "packages/adapters/src/sites/definitions/chdbits.json", + "sha256": "7fe7b0101d9fc5bcd852915b9c2543ded200297707241737847c2c4a58d5d70f" + }, + "input": { + "file": "inputs/indexer/tk-chdbits-login.html.txt", + "sha256": "af2bfc60f0b0e3d525f50134bf7ec7d4597f622aff73a8d0c62a3f947da7722d" + }, + "query": { + "keyword": "x", + "search_type": "torrents" + }, + "mp": { + "is_error": true, + "torrents": [] + }, + "mp_rust": { + "is_error": true, + "torrents": [] + } + }, + { + "id": "hw-dsl-case@hw-dsl-rows", + "definition": { + "source": "inline", + "file": "inputs/indexer/hw-dsl-case.indexer.json", + "config": { + "id": "unit-case", + "name": "Unit(case)", + "domain": "https://pt.example.com/", + "search": { + "paths": [ + { + "path": "torrents.php" + } + ] + }, + "category": { + "movie": [ + { + "id": "401" + } + ], + "tv": [ + { + "id": "402" + } + ] + }, + "torrents": { + "list": { + "selector": "table.torrents > tr:has(\"table.torrentname\")" + }, + "fields": { + "title_default": { + "selector": "a[href*=\"details.php?id=\"]" + }, + "title_optional": { + "selector": "a[title][href*=\"details.php?id=\"]", + "attribute": "title" + }, + "title": { + "text": "{% if fields['title_optional'] %}{{ fields['title_optional'] }}{% else %}{{ fields['title_default'] }}{% endif %}" + }, + "details": { + "selector": "a[href*=\"details.php?id=\"]", + "attribute": "href" + }, + "download": { + "selector": "a[href*=\"download.php?id=\"]", + "attribute": "href" + }, + "imdbid": { + "selector": "a[href*=\"imdb.com/title/tt\"]", + "attribute": "href", + "filters": [ + { + "name": "re_search", + "args": ["tt\\d+", 0] + } + ] + }, + "date_elapsed": { + "selector": "td:nth-child(4) > span" + }, + "date_added": { + "selector": "td:nth-child(4) > span", + "attribute": "title" + }, + "date": { + "text": "{% if fields['date_elapsed'] or fields['date_added'] %}{{ fields['date_added'] if fields['date_added'] else fields['date_elapsed'] }}{% else %}now{% endif %}", + "filters": [ + { + "name": "dateparse", + "args": "%Y-%m-%d %H:%M:%S" + } + ] + }, + "size": { + "selector": "td:nth-child(5)" + }, + "seeders": { + "selector": "td:nth-child(6)" + }, + "leechers": { + "selector": "td:nth-child(7)" + }, + "grabs": { + "selector": "td:nth-child(8)" + }, + "downloadvolumefactor": { + "case": { + "img.pro_free": 0, + "img.pro_50pctdown2up": 0.5, + "*": 1 + } + }, + "uploadvolumefactor": { + "case": { + "img.pro_50pctdown2up": 2, + "img.pro_2up": 2, + "*": 1 + } + }, + "description": { + "selector": "font.subtitle", + "remove": "span, a" + }, + "labels": { + "selector": "span.label" + }, + "freedate": { + "selector": "img[class^=\"pro_\"]", + "attribute": "title", + "filters": [ + { + "name": "re_search", + "args": ["\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", 0] + } + ] + }, + "hr": { + "selector": "img.hitandrun" + }, + "category": { + "selector": "a[href*=\"?cat=\"]", + "attribute": "href", + "filters": [ + { + "name": "querystring", + "args": "cat" + } + ] + } + } + } + } + }, + "input": { + "file": "inputs/indexer/hw-dsl-rows.html.txt", + "sha256": "606a7ed0579f54e9a9d053a72fce4cab46e560c00aff792f4b0c8b4645677979" + }, + "query": { + "keyword": null, + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "Optional.Title", + "description": "Main description", + "page_url": "https://pt.example.com/details.php?id=100", + "enclosure": "https://pt.example.com/download.php?id=100", + "grabs": 9, + "peers": 5, + "seeders": 1234, + "size": 1610612736, + "imdbid": "tt1234567", + "downloadvolumefactor": 0, + "uploadvolumefactor": 1, + "pubdate": "2025-05-01 12:13:14", + "date_elapsed": "1 hour ago", + "freedate": "2026-10-01 12:00:00", + "labels": ["FREE"], + "hit_and_run": true, + "category": "电视剧" + }, + { + "title": "No.Title.Attr.2026", + "description": "第一行\n第二行 多空格", + "page_url": "https://pt.example.com/details.php?id=101", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 1294529987, + "imdbid": null, + "downloadvolumefactor": 0.5, + "uploadvolumefactor": 2, + "pubdate": null, + "date_elapsed": "3小时前", + "freedate": "2026-10-02 08:00:00", + "labels": ["国语", "中字"], + "hit_and_run": false, + "category": "电影" + }, + { + "title": "Slash.Link.Title", + "description": "前后空格", + "page_url": "https://pt.example.com/details.php?id=102", + "enclosure": "https://pt.example.com/download.php?id=102", + "grabs": 1000, + "peers": 0, + "seeders": 0, + "size": 870400, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 2, + "pubdate": "2026-09-26 21:14:00", + "date_elapsed": null, + "freedate": null, + "labels": [], + "hit_and_run": false, + "category": "未知" + }, + { + "title": "Tiny.Size", + "description": null, + "page_url": "https://pt.example.com/details.php?id=103", + "enclosure": "https://pt.example.com/download.php?id=103&passkey=abc", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 2, + "imdbid": null, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "date_elapsed": null, + "freedate": null, + "labels": [], + "hit_and_run": false, + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "category": "电视剧", + "date_elapsed": "1 hour ago", + "description": "Main description", + "downloadvolumefactor": 0.0, + "enclosure": "https://pt.example.com/download.php?id=100", + "freedate": "2026-10-01 12:00:00", + "grabs": 9, + "hit_and_run": true, + "imdbid": "tt1234567", + "labels": ["FREE"], + "page_url": "https://pt.example.com/details.php?id=100", + "peers": 5, + "pubdate": "2025-05-01 12:13:14", + "seeders": 1234, + "size": 1610612736, + "title": "Optional.Title", + "uploadvolumefactor": 1.0 + }, + { + "category": "电影", + "date_elapsed": "3小时前", + "description": "第一行第二行 多空格", + "downloadvolumefactor": 0.5, + "freedate": "2026-10-02 08:00:00", + "grabs": 0, + "hit_and_run": false, + "labels": ["国语", "中字"], + "page_url": "https://pt.example.com/details.php?id=101", + "peers": 0, + "seeders": 0, + "size": 1294529987, + "title": "No.Title.Attr.2026", + "uploadvolumefactor": 2.0 + }, + { + "category": "未知", + "description": "前后空格", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.example.com/download.php?id=102", + "grabs": 1000, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=102", + "peers": 0, + "seeders": 12, + "size": 870400, + "title": "Slash.Link.Title", + "uploadvolumefactor": 2.0 + }, + { + "category": "电影", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.example.com/download.php?id=103&passkey=abc", + "grabs": 0, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=103", + "peers": 0, + "pubdate": "2026-09-26 21:14:03", + "seeders": 0, + "size": 3, + "title": "Tiny.Size", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hw-dsl-selector@hw-dsl-rows", + "definition": { + "source": "inline", + "file": "inputs/indexer/hw-dsl-selector.indexer.json", + "config": { + "id": "unit-selector", + "name": "Unit(selector)", + "domain": "https://pt.example.com", + "media_type": "movie", + "search": { + "paths": [ + { + "path": "torrents.php" + } + ] + }, + "torrents": { + "list": { + "selector": "table.torrents tr:has(table.torrentname)" + }, + "fields": { + "title": { + "selector": "a[href*=\"details.php\"]", + "filters": [ + { + "name": "replace", + "args": [".", " "] + }, + { + "name": "appendleft", + "args": "[U] " + } + ] + }, + "description": { + "selector": "font.subtitle", + "contents": -1 + }, + "details": { + "selector": "a[href*=\"details.php\"]", + "attribute": "href", + "filters": [ + { + "name": "split", + "args": ["?", -1] + }, + { + "name": "appendleft", + "args": "details.php?" + } + ] + }, + "download": { + "selector": "a[href*=\"download.php\"]", + "attribute": "href" + }, + "date_added": { + "selector": "td:nth-child(4)" + }, + "size": { + "selector": "td", + "index": 4 + }, + "seeders": { + "selector": "td:nth-child(6)", + "filters": [ + { + "name": "re_search", + "args": ["(\\d+)\\s*/", 1] + } + ] + }, + "leechers": { + "selector": "td:nth-child(7)" + }, + "grabs": { + "selector": "td:nth-child(8)", + "filters": [ + { + "name": "strip" + } + ] + }, + "downloadvolumefactor": { + "selector": "span.factor" + }, + "uploadvolumefactor": { + "selector": "span.upfactor" + }, + "labels": { + "selector": "span.label", + "attribute": "class" + }, + "hr": { + "selector": "img.nonexistent" + } + } + } + } + }, + "input": { + "file": "inputs/indexer/hw-dsl-rows.html.txt", + "sha256": "606a7ed0579f54e9a9d053a72fce4cab46e560c00aff792f4b0c8b4645677979" + }, + "query": { + "keyword": null, + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "[U] No Title Attr 2026", + "description": "第二行 多空格", + "page_url": "https://pt.example.com/details.php?id=101", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "downloadvolumefactor": 50, + "uploadvolumefactor": 1, + "pubdate": "2026-09-27 09:00:00", + "labels": ["label", "label", "label"], + "hit_and_run": false, + "category": "电影" + }, + { + "title": "[U] Slash", + "description": "前后空格", + "page_url": "https://pt.example.com/details.php?id=102", + "enclosure": "https://pt.example.com/download.php?id=102", + "grabs": 1000, + "peers": 0, + "seeders": 12, + "size": 0, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:00", + "labels": [], + "hit_and_run": false, + "category": "电影" + }, + { + "title": "[U] Tiny", + "description": null, + "page_url": "https://pt.example.com/details.php?id=103", + "enclosure": "https://pt.example.com/download.php?id=103&passkey=abc", + "grabs": 0, + "peers": 0, + "seeders": 0, + "size": 0, + "downloadvolumefactor": 1, + "uploadvolumefactor": 1, + "pubdate": "2026-09-26 21:14:03", + "labels": [], + "hit_and_run": false, + "category": "电影" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "description": "Main description removelink", + "downloadvolumefactor": 0.5, + "enclosure": "https://pt.example.com/download.php?id=100", + "grabs": 9, + "hit_and_run": false, + "labels": ["label"], + "page_url": "https://pt.example.com/details.php?id=100", + "peers": 5, + "seeders": 1234, + "size": 0, + "title": "[U] Default Title", + "uploadvolumefactor": 2.0 + }, + { + "description": "第一行第二行 多空格", + "downloadvolumefactor": 50.0, + "grabs": 0, + "hit_and_run": false, + "labels": ["label", "label", "label"], + "page_url": "https://pt.example.com/details.php?id=101", + "peers": 0, + "seeders": 0, + "size": 0, + "title": "[U] No Title Attr 2026", + "uploadvolumefactor": 1.0 + }, + { + "description": "前后空格", + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.example.com/download.php?id=102", + "grabs": 1000, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=102", + "peers": 0, + "seeders": 12, + "size": 0, + "title": "[U] Slash", + "uploadvolumefactor": 1.0 + }, + { + "downloadvolumefactor": 1.0, + "enclosure": "https://pt.example.com/download.php?id=103&passkey=abc", + "grabs": 0, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=103", + "peers": 0, + "pubdate": "2026-09-26 21:14:03", + "seeders": 0, + "size": 0, + "title": "[U] Tiny", + "uploadvolumefactor": 1.0 + } + ] + } + }, + { + "id": "hw-self-match@hw-self-match", + "definition": { + "source": "inline", + "file": "inputs/indexer/hw-self-match.indexer.json", + "config": { + "id": "unit-self", + "name": "Unit(self)", + "domain": "https://pt.example.com/", + "search": { + "paths": [ + { + "path": "torrents.php" + } + ] + }, + "torrents": { + "list": { + "selector": "table.torrents > tr" + }, + "fields": { + "title": { + "selector": "a[title]", + "attribute": "title" + }, + "details": { + "selector": "a[title]", + "attribute": "href" + }, + "size": { + "selector": "td:nth-child(2)" + }, + "downloadvolumefactor": { + "case": { + "tr.free_bg": 0, + "*": 1 + } + }, + "hr": { + "selector": "tr.sticky" + }, + "labels": { + "selector": "tr.sticky", + "attribute": "class" + } + } + } + } + }, + "input": { + "file": "inputs/indexer/hw-self-match.html.txt", + "sha256": "e7376220b3ac630b20d27f2cb211ae75b0fe86f85391696e5703f49e9c16d801" + }, + "query": { + "keyword": null, + "search_type": "torrents" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "Row.Class.Free", + "page_url": "https://pt.example.com/details.php?id=200", + "size": 1073741824, + "downloadvolumefactor": 0, + "labels": ["sticky free_bg"], + "hit_and_run": true + }, + { + "title": "Row.Plain", + "page_url": "https://pt.example.com/details.php?id=201", + "size": 2147483648, + "downloadvolumefactor": 1, + "labels": [], + "hit_and_run": false + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "downloadvolumefactor": 1.0, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=200", + "size": 1073741824, + "title": "Row.Class.Free" + }, + { + "downloadvolumefactor": 1.0, + "hit_and_run": false, + "labels": [], + "page_url": "https://pt.example.com/details.php?id=201", + "size": 2147483648, + "title": "Row.Plain" + } + ] + } + }, + { + "id": "hhanclub-subtitles@inline", + "definition": { + "source": "inline", + "config": { + "id": "hhanclub-subtitles", + "name": "憨憨(字幕)", + "domain": "https://hhanclub.net/", + "public": false, + "subtitles": { + "list": { + "selector": "#subtitles-table > div" + }, + "fields": { + "language_icon": { + "selector": "div:nth-child(1) img", + "attribute": "src" + }, + "title": { + "selector": "div:nth-child(2) a[href*=\"downloadsubs.php\"]" + }, + "download": { + "selector": "div:nth-child(2) a[href*=\"downloadsubs.php\"]", + "attribute": "href" + }, + "size": { + "selector": "div:nth-child(3)" + }, + "date_added": { + "selector": "div:nth-child(4) span", + "attribute": "title" + }, + "date_elapsed": { + "selector": "div:nth-child(4) span" + }, + "grabs": { + "defualt_value": 0 + }, + "uploader": { + "selector": "div:nth-child(2) a[href*=\"userdetails.php\"]" + }, + "report": { + "selector": "div:nth-child(5) a[href*=\"report.php\"]", + "attribute": "href" + } + } + } + } + }, + "input": { + "inline": "<div id=\"subtitles-table\"><div class=\"grid\"><div><img src=\"pic/flag/china.gif\"></div><div>\n<a href=\"downloadsubs.php?torrentid=0&subid=1000\">Example Show S01E01 1080p WEB-DL CHS</a>\n<a href=\"https://hhanclub.net/userdetails.php?id=0\"><b>tester0</b></a></div>\n<div><div>111.99 KB</div></div><div><span title=\"2026-04-21 20:54:37\">1月18天</span></div>\n<div><a href=\"report.php?subtitle=1000\">举报</a></div></div><div class=\"grid\"><div><img src=\"pic/flag/china.gif\"></div><div>\n<a href=\"downloadsubs.php?torrentid=1&subid=1001\">Example Show S01E02 1080p WEB-DL CHS</a>\n<a href=\"https://hhanclub.net/userdetails.php?id=1\"><b>tester1</b></a></div>\n<div><div>111.99 KB</div></div><div><span title=\"2026-04-21 20:54:37\">1月18天</span></div>\n<div><a href=\"report.php?subtitle=1001\">举报</a></div></div><div class=\"grid\"><div><img src=\"pic/flag/china.gif\"></div><div>\n<a href=\"downloadsubs.php?torrentid=2&subid=1002\">Example Show S01E03 1080p WEB-DL CHS</a>\n<a href=\"https://hhanclub.net/userdetails.php?id=2\"><b>tester2</b></a></div>\n<div><div>111.99 KB</div></div><div><span title=\"2026-04-21 20:54:37\">1月18天</span></div>\n<div><a href=\"report.php?subtitle=1002\">举报</a></div></div></div>", + "sha256": "f2cc7fef45119976647ebd9f27164b3c59f87b1f911bc4aa73290f4132a2dffd" + }, + "query": { + "keyword": "Example Show", + "search_type": "subtitles" + }, + "mp": { + "is_error": false, + "torrents": [ + { + "title": "Example Show S01E01 1080p WEB-DL CHS", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=0&subid=1000", + "size": 114678, + "pubdate": "2026-04-21 20:54:37", + "date_elapsed": "1月18天", + "grabs": 0, + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "report_url": "https://hhanclub.net/report.php?subtitle=1000", + "uploader": "tester0", + "torrent_id": "0", + "subtitle_id": "1000" + }, + { + "title": "Example Show S01E02 1080p WEB-DL CHS", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=1&subid=1001", + "size": 114678, + "pubdate": "2026-04-21 20:54:37", + "date_elapsed": "1月18天", + "grabs": 0, + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "report_url": "https://hhanclub.net/report.php?subtitle=1001", + "uploader": "tester1", + "torrent_id": "1", + "subtitle_id": "1001" + }, + { + "title": "Example Show S01E03 1080p WEB-DL CHS", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=2&subid=1002", + "size": 0, + "pubdate": "2026-04-21 20:54:37", + "date_elapsed": "1月18天", + "grabs": 0, + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "report_url": "https://hhanclub.net/report.php?subtitle=1002", + "uploader": "tester2", + "torrent_id": "2", + "subtitle_id": "1002" + } + ] + }, + "mp_rust": { + "is_error": false, + "torrents": [ + { + "date_elapsed": "1月18天", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=0&subid=1000", + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "pubdate": "2026-04-21 20:54:37", + "report_url": "https://hhanclub.net/report.php?subtitle=1000", + "size": 114678, + "subtitle_id": "1000", + "title": "Example Show S01E01 1080p WEB-DL CHS", + "torrent_id": "0", + "uploader": "tester0" + }, + { + "date_elapsed": "1月18天", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=1&subid=1001", + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "pubdate": "2026-04-21 20:54:37", + "report_url": "https://hhanclub.net/report.php?subtitle=1001", + "size": 114678, + "subtitle_id": "1001", + "title": "Example Show S01E02 1080p WEB-DL CHS", + "torrent_id": "1", + "uploader": "tester1" + }, + { + "date_elapsed": "1月18天", + "enclosure": "https://hhanclub.net/downloadsubs.php?torrentid=2&subid=1002", + "language_icon": "https://hhanclub.net/pic/flag/china.gif", + "pubdate": "2026-04-21 20:54:37", + "report_url": "https://hhanclub.net/report.php?subtitle=1002", + "size": 114678, + "subtitle_id": "1002", + "title": "Example Show S01E03 1080p WEB-DL CHS", + "torrent_id": "2", + "uploader": "tester2" + } + ] + } + } + ], + "deviations": { + "hdarea@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdarea@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hddolby@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hddolby@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdfans@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdfans@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdtime@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdtime@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#1.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#10.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#2.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#3.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#4.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#5.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#6.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#7.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#8.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-audiences-list#9.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-chdbits-list#1.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-chdbits-list#2.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-chdbits-list#3.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hdvideo@tk-chdbits-list#4.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "hhanclub-subtitles@inline.status": { + "kind": "missing", + "note": "本项目 SiteSpider 未移植字幕分支(search_type=subtitles:get_subtitle_info/__fill_subtitle_ids/report/language_icon)。MP 输出保留在本样本 mp 字段,作为补迁期望。" + }, + "hw-dsl-case@hw-dsl-rows#3.size": { + "kind": "our_bug", + "note": "\"2.5 B\":MP parse_size 用 Python round()(银行家舍入)得 2,parseSizeMp 用 Math.round 得 3。仅 .5 字节边界,影响可忽略;要严格对齐可改为 round-half-even。" + }, + "hw-dsl-selector@hw-dsl-rows#0.pubdate": { + "kind": "mp_bug", + "note": "同 tjupt:date_added 选择器直接取到\"3小时前\",MP 经 dateparser 按当前时刻换算为绝对时间;本项目不写 pubdate。" + }, + "hw-dsl-selector@hw-dsl-rows.count": { + "kind": "intentional", + "note": "SA4:系数 selector 模式抽到 \"0.5\"/\"2.0\",MP int() 抛 ValueError 被 get_info 吞掉,整行丢失(3 行);本项目 parseFloat 保留该行(4 行)。" + }, + "hw-self-match@hw-self-match#0.downloadvolumefactor": { + "kind": "our_bug", + "note": "PyQuery 在行元素上查询用 descendant-or-self,行自身(tr.free_bg / tr.sticky)也会命中 case/hr/labels 等选择器;本项目 cheerio .find 只查后代。MP Rust 快路径同本项目(不含自身),MP 两条路径互相不一致。若要跟随 Python 语义,safeQuery/case/hr/labels 需改为 find+filter(self)(见 hhanclub-subtitles 样本第 3 行 size=0 也是同一机制)。" + }, + "hw-self-match@hw-self-match#0.hit_and_run": { + "kind": "our_bug", + "note": "PyQuery 在行元素上查询用 descendant-or-self,行自身(tr.free_bg / tr.sticky)也会命中 case/hr/labels 等选择器;本项目 cheerio .find 只查后代。MP Rust 快路径同本项目(不含自身),MP 两条路径互相不一致。若要跟随 Python 语义,safeQuery/case/hr/labels 需改为 find+filter(self)(见 hhanclub-subtitles 样本第 3 行 size=0 也是同一机制)。" + }, + "hw-self-match@hw-self-match#0.labels": { + "kind": "our_bug", + "note": "PyQuery 在行元素上查询用 descendant-or-self,行自身(tr.free_bg / tr.sticky)也会命中 case/hr/labels 等选择器;本项目 cheerio .find 只查后代。MP Rust 快路径同本项目(不含自身),MP 两条路径互相不一致。若要跟随 Python 语义,safeQuery/case/hr/labels 需改为 find+filter(self)(见 hhanclub-subtitles 样本第 3 行 size=0 也是同一机制)。" + }, + "nicept@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "nicept@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "piggo@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "piggo@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "pttime@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "pttime@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "soulvoice@tk-audiences-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "soulvoice@tk-chdbits-list#0.title": { + "kind": "mp_bug", + "note": "列表选择器命中表头/非种子行时 title_default/title_optional 均为 None,MP Jinja2 把 None 渲染成字符串 \"None\";本项目 nunjucks 渲染为空串。两边都会产出这条垃圾行(定义的 list 选择器过宽,见报告)。" + }, + "tjupt@tk-chdbits-list#0.pubdate": { + "kind": "mp_bug", + "note": "tjupt 定义 date_added 取单元格文本(\"2天\"/\"26天\"相对时间),MP normalize_datetime 用 dateparser 以当前时刻换算成绝对时间(生成时冻结 now=2026-09-27T12:00),结果随抓取时刻漂移;本项目 normalizeDatetime 只接受绝对时间,相对时间不写 pubdate(与 MP __is_relative_pubdate_text 的意图一致)。" + }, + "tjupt@tk-chdbits-list#1.pubdate": { + "kind": "mp_bug", + "note": "tjupt 定义 date_added 取单元格文本(\"2天\"/\"26天\"相对时间),MP normalize_datetime 用 dateparser 以当前时刻换算成绝对时间(生成时冻结 now=2026-09-27T12:00),结果随抓取时刻漂移;本项目 normalizeDatetime 只接受绝对时间,相对时间不写 pubdate(与 MP __is_relative_pubdate_text 的意图一致)。" + } + } +} diff --git a/packages/adapters/test/differential/indexer.test.ts b/packages/adapters/test/differential/indexer.test.ts new file mode 100644 index 00000000..f3b50cb2 --- /dev/null +++ b/packages/adapters/test/differential/indexer.test.ts @@ -0,0 +1,123 @@ +/** + * 站点索引解析差分:MP `SiteSpider.parse`(PyQuery 回退)vs 本项目 `SiteSpider.parse`。 + * 同一 indexer 配置(本项目 definitions/*.json 或内联配置)+ 同一 HTML;期望由 scripts/mp-sync/gen-differential.py rss|indexer 生成(indexer.json)。 + */ +import { describe, expect, it } from "vitest"; +import { BUILTIN_SITE_DEFINITIONS, type IndexerDefinition, SiteSpider } from "../../src/sites/index.ts"; +import { + diffAgainstRegistry, + dumpMismatches, + FieldCollector, + formatMismatches, + loadDoc, + readInput, +} from "./diff-util.ts"; + +interface IndexerSample { + id: string; + definition: + | { source: "definition"; id: string } + | { + source: "inline"; + config: unknown; + }; + input: { file?: string; inline?: string }; + query: { keyword: string | null; search_type: "torrents" | "subtitles" }; + mp: { + is_error?: boolean; + torrents?: Array<Record<string, unknown>>; + status?: string; + error?: string; + }; +} + +const doc = loadDoc<IndexerSample>("indexer.json"); + +function definitionOf(s: IndexerSample): IndexerDefinition { + if (s.definition.source === "definition") { + return BUILTIN_SITE_DEFINITIONS[s.definition.id] as IndexerDefinition; + } + return s.definition.config as IndexerDefinition; +} + +/** + * 行对齐:条数相同按下标;条数不同(MP 整行丢弃等)且双方都有 page_url 时按 page_url 配对, + * 避免一处丢行导致后续所有行错位。行号 i 取 MP 侧下标。 + */ +function alignRows( + mp: Array<Record<string, unknown>>, + ours: Array<Record<string, unknown>>, +): Array<[number, Record<string, unknown>, Record<string, unknown>]> { + const byUrl = mp.length !== ours.length && [...mp, ...ours].every((r) => typeof r.page_url === "string"); + if (!byUrl) { + return mp.slice(0, Math.min(mp.length, ours.length)).map((m, i) => [i, m, ours[i]!]); + } + const index = new Map(ours.map((o) => [o.page_url as string, o])); + const out: Array<[number, Record<string, unknown>, Record<string, unknown>]> = []; + mp.forEach((m, i) => { + const o = index.get(m.page_url as string); + if (o) out.push([i, m, o]); + }); + return out; +} + +describe("站点索引差分(MP SiteSpider Python 回退)", () => { + const c = new FieldCollector(); + for (const s of doc.samples) { + if (s.mp.status === "error") { + throw new Error(`${s.id}: MP 运行失败 ${s.mp.error}`); + } + if (s.query.search_type === "subtitles") { + // 本项目 SiteSpider 未移植字幕分支(parse_indexer_subtitles) + c.mismatches.push({ + key: `${s.id}.status`, + mp: `ok:${s.mp.torrents?.length ?? 0}`, + ours: "unsupported", + }); + continue; + } + const html = s.input.file ? readInput(s.input.file) : (s.input.inline ?? ""); + const spider = new SiteSpider(definitionOf(s), s.query.keyword ? { keyword: s.query.keyword } : {}); + const ours = spider.parse(html); + const mpRows = s.mp.torrents ?? []; + if (Boolean(s.mp.is_error) !== ours.isError) { + c.mismatches.push({ + key: `${s.id}.status`, + mp: s.mp.is_error, + ours: ours.isError, + }); + } + if (mpRows.length !== ours.torrents.length) { + c.mismatches.push({ + key: `${s.id}.count`, + mp: mpRows.length, + ours: ours.torrents.length, + }); + } + for (const [i, m, o] of alignRows(mpRows, ours.torrents as Array<Record<string, unknown>>)) { + for (const f of doc.fields) c.check(`${s.id}#${i}.${f}`, m[f], o[f]); + } + } + + it("有样本且记录了生成来源", () => { + expect(doc.samples.length).toBeGreaterThan(10); + expect(doc.generatedFrom.commit).toMatch(/^[0-9a-f]{40}$/); + }); + + it("实际不一致集合 == 登记的 deviations", () => { + dumpMismatches("indexer", c.mismatches, { + compared: c.compared, + equal: c.equal, + }); + const { unregistered, stale } = diffAgainstRegistry(c.mismatches, doc.deviations); + expect(formatMismatches(unregistered), "未登记的不一致").toBe(""); + expect(stale.join("\n"), "登记了但已不再出现的偏差(请从 indexer.json deviations 删除)").toBe(""); + }); + + it("登记项分类合法", () => { + for (const [key, d] of Object.entries(doc.deviations)) { + expect(["intentional", "missing", "our_bug", "mp_bug"], key).toContain(d.kind); + expect(d.note.length, key).toBeGreaterThan(0); + } + }); +}); diff --git a/packages/adapters/test/differential/inputs/indexer/hw-dsl-case.indexer.json b/packages/adapters/test/differential/inputs/indexer/hw-dsl-case.indexer.json new file mode 100644 index 00000000..a4107192 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/hw-dsl-case.indexer.json @@ -0,0 +1,49 @@ +{ + "id": "unit-case", + "name": "Unit(case)", + "domain": "https://pt.example.com/", + "search": { "paths": [{ "path": "torrents.php" }] }, + "category": { "movie": [{ "id": "401" }], "tv": [{ "id": "402" }] }, + "torrents": { + "list": { "selector": "table.torrents > tr:has(\"table.torrentname\")" }, + "fields": { + "title_default": { "selector": "a[href*=\"details.php?id=\"]" }, + "title_optional": { "selector": "a[title][href*=\"details.php?id=\"]", "attribute": "title" }, + "title": { + "text": "{% if fields['title_optional'] %}{{ fields['title_optional'] }}{% else %}{{ fields['title_default'] }}{% endif %}" + }, + "details": { "selector": "a[href*=\"details.php?id=\"]", "attribute": "href" }, + "download": { "selector": "a[href*=\"download.php?id=\"]", "attribute": "href" }, + "imdbid": { + "selector": "a[href*=\"imdb.com/title/tt\"]", + "attribute": "href", + "filters": [{ "name": "re_search", "args": ["tt\\d+", 0] }] + }, + "date_elapsed": { "selector": "td:nth-child(4) > span" }, + "date_added": { "selector": "td:nth-child(4) > span", "attribute": "title" }, + "date": { + "text": "{% if fields['date_elapsed'] or fields['date_added'] %}{{ fields['date_added'] if fields['date_added'] else fields['date_elapsed'] }}{% else %}now{% endif %}", + "filters": [{ "name": "dateparse", "args": "%Y-%m-%d %H:%M:%S" }] + }, + "size": { "selector": "td:nth-child(5)" }, + "seeders": { "selector": "td:nth-child(6)" }, + "leechers": { "selector": "td:nth-child(7)" }, + "grabs": { "selector": "td:nth-child(8)" }, + "downloadvolumefactor": { "case": { "img.pro_free": 0, "img.pro_50pctdown2up": 0.5, "*": 1 } }, + "uploadvolumefactor": { "case": { "img.pro_50pctdown2up": 2, "img.pro_2up": 2, "*": 1 } }, + "description": { "selector": "font.subtitle", "remove": "span, a" }, + "labels": { "selector": "span.label" }, + "freedate": { + "selector": "img[class^=\"pro_\"]", + "attribute": "title", + "filters": [{ "name": "re_search", "args": ["\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", 0] }] + }, + "hr": { "selector": "img.hitandrun" }, + "category": { + "selector": "a[href*=\"?cat=\"]", + "attribute": "href", + "filters": [{ "name": "querystring", "args": "cat" }] + } + } + } +} diff --git a/packages/adapters/test/differential/inputs/indexer/hw-dsl-rows.html.txt b/packages/adapters/test/differential/inputs/indexer/hw-dsl-rows.html.txt new file mode 100644 index 00000000..36c3256a --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/hw-dsl-rows.html.txt @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html><head><title>Unit :: 种子 +退出 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型标题评论时间大小种子下载完成
TV + + + + +
+ Default.Title + DL + IMDb + Main description removelink + FREE + + + x0.52.0X +
+
1 hour ago1.5 GB1,2345/79
Movie + + + + +
+ No.Title.Attr.2026 + magnet-download.php?id=101 + 第一行
第二行 多空格
+ 国语中字 + + 50% +
+
03小时前1,234.56 MiB-0
Other + + + + +
+ Slash + DL + 前后空格 + +
+
22026/09/26 21:14850 KB12 / 30abc1,000
Movie + + + + +
+ Tiny + DL +
+
02026-09-26 21:14:032.5 B000
+ diff --git a/packages/adapters/test/differential/inputs/indexer/hw-dsl-selector.indexer.json b/packages/adapters/test/differential/inputs/indexer/hw-dsl-selector.indexer.json new file mode 100644 index 00000000..9a0433ab --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/hw-dsl-selector.indexer.json @@ -0,0 +1,32 @@ +{ + "id": "unit-selector", + "name": "Unit(selector)", + "domain": "https://pt.example.com", + "media_type": "movie", + "search": { "paths": [{ "path": "torrents.php" }] }, + "torrents": { + "list": { "selector": "table.torrents tr:has(table.torrentname)" }, + "fields": { + "title": { + "selector": "a[href*=\"details.php\"]", + "filters": [{ "name": "replace", "args": [".", " "] }, { "name": "appendleft", "args": "[U] " }] + }, + "description": { "selector": "font.subtitle", "contents": -1 }, + "details": { + "selector": "a[href*=\"details.php\"]", + "attribute": "href", + "filters": [{ "name": "split", "args": ["?", -1] }, { "name": "appendleft", "args": "details.php?" }] + }, + "download": { "selector": "a[href*=\"download.php\"]", "attribute": "href" }, + "date_added": { "selector": "td:nth-child(4)" }, + "size": { "selector": "td", "index": 4 }, + "seeders": { "selector": "td:nth-child(6)", "filters": [{ "name": "re_search", "args": ["(\\d+)\\s*/", 1] }] }, + "leechers": { "selector": "td:nth-child(7)" }, + "grabs": { "selector": "td:nth-child(8)", "filters": [{ "name": "strip" }] }, + "downloadvolumefactor": { "selector": "span.factor" }, + "uploadvolumefactor": { "selector": "span.upfactor" }, + "labels": { "selector": "span.label", "attribute": "class" }, + "hr": { "selector": "img.nonexistent" } + } + } +} diff --git a/packages/adapters/test/differential/inputs/indexer/hw-self-match.html.txt b/packages/adapters/test/differential/inputs/indexer/hw-self-match.html.txt new file mode 100644 index 00000000..cdb577e7 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/hw-self-match.html.txt @@ -0,0 +1,6 @@ +Unit :: 种子 + + + +
Row1 GB
Row2 GB
+ diff --git a/packages/adapters/test/differential/inputs/indexer/hw-self-match.indexer.json b/packages/adapters/test/differential/inputs/indexer/hw-self-match.indexer.json new file mode 100644 index 00000000..bc7e9e12 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/hw-self-match.indexer.json @@ -0,0 +1,17 @@ +{ + "id": "unit-self", + "name": "Unit(self)", + "domain": "https://pt.example.com/", + "search": { "paths": [{ "path": "torrents.php" }] }, + "torrents": { + "list": { "selector": "table.torrents > tr" }, + "fields": { + "title": { "selector": "a[title]", "attribute": "title" }, + "details": { "selector": "a[title]", "attribute": "href" }, + "size": { "selector": "td:nth-child(2)" }, + "downloadvolumefactor": { "case": { "tr.free_bg": 0, "*": 1 } }, + "hr": { "selector": "tr.sticky" }, + "labels": { "selector": "tr.sticky", "attribute": "class" } + } + } +} diff --git a/packages/adapters/test/differential/inputs/indexer/tk-audiences-list.html.txt b/packages/adapters/test/differential/inputs/indexer/tk-audiences-list.html.txt new file mode 100644 index 00000000..d655a126 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/tk-audiences-list.html.txt @@ -0,0 +1,75 @@ +观众 :: 种子 +
mockuser + 12.5 TB + 3.2 TB + 退出

1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型标题评论存活时间大小种子下载完成发布者
电影 + + +
Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR Free
沙丘2 / 沙丘:第二部 | 杜比视界 国英双语 中字
download
03小时前78.42 GB1,204173,388uploader1
综艺 + + +
Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV H&R
奔跑吧 第十二季 第1期
download
02026-09-26 20:00:005.12 GB882410anonymous
剧集 + + +
The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX 2X 50%
熊家餐馆 第三季
download
02026-09-25 08:30:001,234.56 MiB350120anonymous
剧集 + + +
The.Last.of.Us.S02.2160p.MAX.WEB-DL.DDP5.1.Atmos.D…download
02026-09-24 10:00:002.1 TB12144anonymous
纪录片 + + +
Planet.Earth.III.2023.2160p.BluRay.REMUX.HEVC.DTS-HD.MA.5.1-GRP 2X
地球脉动 第三季
download
02026-09-23 10:00:00850 KB509anonymous
\ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/indexer/tk-audiences-login.html.txt b/packages/adapters/test/differential/inputs/indexer/tk-audiences-login.html.txt new file mode 100644 index 00000000..9bf89b86 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/tk-audiences-login.html.txt @@ -0,0 +1,3 @@ +观众 :: 登录 +

你需要启用cookies才能登录

+
\ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/indexer/tk-chdbits-list.html.txt b/packages/adapters/test/differential/inputs/indexer/tk-chdbits-list.html.txt new file mode 100644 index 00000000..e0a0303b --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/tk-chdbits-list.html.txt @@ -0,0 +1,35 @@ +CHDBits :: 种子 +
carol 退出 +上传量: 25.052 TB 下载量: 1.2 TB
+ + + + + + + + + + + + + + + + + + + + + + + + +
类型标题评论时间大小种子下载完成发布者
TV Series + + +
The.Last.of.Us.S02.2025.1080p.BluRay... + 2X Free [限时]
最后生还者 第二季 中字
download
32天45.20
GB
423100uploader
Movies + + +
Oppenheimer.2023...
奥本海默
download
026天80.00
GB
7055uploader
\ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/indexer/tk-chdbits-login.html.txt b/packages/adapters/test/differential/inputs/indexer/tk-chdbits-login.html.txt new file mode 100644 index 00000000..8e5361c4 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/tk-chdbits-login.html.txt @@ -0,0 +1,3 @@ +CHDBits :: 登录 +
+

未登录!

\ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/indexer/tk-hhanclub-list.html.txt b/packages/adapters/test/differential/inputs/indexer/tk-hhanclub-list.html.txt new file mode 100644 index 00000000..151c79b3 --- /dev/null +++ b/packages/adapters/test/differential/inputs/indexer/tk-hhanclub-list.html.txt @@ -0,0 +1,33 @@ +HHCLUB :: 种子 +
bob 退出
+
+
+
综艺
+ +
极限挑战 第十季 第1期
+ +
6天23时
+
6.12 GB
+
88
+
5
+
1,024
+
anon
+
30
+
+
+
电影
+ +
沙丘2
+ +
2026-09-01 08:00:00
+
78.3 GB
+
12
+
0
+
300
+
anon
+
+
+ + \ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/rss/hw-atom-nons.xml b/packages/adapters/test/differential/inputs/rss/hw-atom-nons.xml new file mode 100644 index 00000000..a3ccb39c --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-atom-nons.xml @@ -0,0 +1,5 @@ + +Atom without namespace +tag:e.x,2026:1Atom.Entry.One2026-09-26T13:14:03Zatom summary +tag:e.x,2026:2<b>Atom.Entry.Two</b>2026-09-26T21:14:03+08:002026-09-27T00:00:00Zcontent only + diff --git a/packages/adapters/test/differential/inputs/rss/hw-expired.txt b/packages/adapters/test/differential/inputs/rss/hw-expired.txt new file mode 100644 index 00000000..ecaf05d3 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-expired.txt @@ -0,0 +1 @@ +RSS Link has expired, You need to get a new one! \ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/rss/hw-rdf.xml b/packages/adapters/test/differential/inputs/rss/hw-rdf.xml new file mode 100644 index 00000000..03daa44e --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rdf.xml @@ -0,0 +1,5 @@ + + +RDF feedhttps://e.x/ +RDF.Item.Onehttps://e.x/1rdf desc2026-09-26T13:14:03Zalice + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-broken.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-broken.xml new file mode 100644 index 00000000..55f263b6 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-broken.xml @@ -0,0 +1,5 @@ + +broken +Good.Onehttps://e.x/1 +Unclosed<link>https://e.x/2</link></item> +</channel> diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-cdata.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-cdata.xml new file mode 100644 index 00000000..107adbcb --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-cdata.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>CDATA feed +<![CDATA[[BDMV] 奥本海默 Oppenheimer 2023 <UHD> & more]]>https://pt.example.com/details.php?id=1Size: 78.42 GB

]]>
Sat, 26 Sep 2026 21:14:03 +0800豆瓣用户Apt-1
+Plain & Escaped <Title> 中文https://pt.example.com/details.php?id=2&hit=1desc & moreSat, 26 Sep 2026 13:14:03 GMT +
diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-dtd.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-dtd.xml new file mode 100644 index 00000000..f795a207 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-dtd.xml @@ -0,0 +1,5 @@ + +]> +dtd +&brand; Titlehttps://e.x/1 + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-entities.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-entities.xml new file mode 100644 index 00000000..3e71915b --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-entities.xml @@ -0,0 +1,5 @@ + +entities +Nbsp Title©2026https://e.x/1 +Normal.After.Badhttps://e.x/2 + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-link-fallback.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-link-fallback.xml new file mode 100644 index 00000000..904b547a --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-link-fallback.xml @@ -0,0 +1,8 @@ + +fallback +Only.Link.Itemhttps://pt.example.com/download.php?id=10 +No.Link.No.Enclosureskip me +https://pt.example.com/details.php?id=11 +https://pt.example.com/details.php?id=12 +Enclosure.Only + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-nested.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-nested.xml new file mode 100644 index 00000000..ca800968 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-nested.xml @@ -0,0 +1,5 @@ + +nested +Source.Title.FirstReal.Titlehttps://e.x/1Media.Title +Two.Enclosures + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-nyaa.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-nyaa.xml new file mode 100644 index 00000000..5393e0a8 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-nyaa.xml @@ -0,0 +1,5 @@ + +Nyaa-like + +[Group] Show - 01 [1080p].mkvhttps://nyaa.example/download/1.torrenthttps://nyaa.example/view/1Sat, 26 Sep 2026 13:14:03 -00001231.2 GiB0123456789abcdef0123456789abcdef01234567#1 | 1.2 GiB]]> + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-pubdate.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-pubdate.xml new file mode 100644 index 00000000..11a163b7 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-pubdate.xml @@ -0,0 +1,16 @@ + +pubdate formats +rfc822-gmthttps://e.x/1Sat, 26 Sep 2026 13:14:03 GMT +rfc822-offsethttps://e.x/2Sat, 26 Sep 2026 21:14:03 +0800 +rfc822-no-secondshttps://e.x/3Sat, 26 Sep 2026 21:14 +0800 +rfc822-csthttps://e.x/4Sat, 26 Sep 2026 21:14:03 CST +iso-zhttps://e.x/52026-09-26T13:14:03Z +iso-offsethttps://e.x/62026-09-26T21:14:03+08:00 +naive-spacehttps://e.x/72026-09-26 21:14:03 +date-onlyhttps://e.x/82026-09-26 +chinesehttps://e.x/92026年09月26日 21:14:03 +garbagehttps://e.x/103小时前 +no-weekdayhttps://e.x/1126 Sep 2026 13:14:03 +0000 +wrong-weekdayhttps://e.x/12Mon, 26 Sep 2026 13:14:03 GMT +epoch-likehttps://e.x/131790428443 + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-size.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-size.xml new file mode 100644 index 00000000..4a4eb1c8 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-size.xml @@ -0,0 +1,9 @@ + +size +Size.In.Descriptionhttps://pt.example.com/d?id=20[Size: 1.50 GB] [Seeders: 12] +Length.NonDigit +Length.Empty +Length.Missing +Length.Big +Length.Negative + diff --git a/packages/adapters/test/differential/inputs/rss/hw-rss-whitespace.xml b/packages/adapters/test/differential/inputs/rss/hw-rss-whitespace.xml new file mode 100644 index 00000000..c6f3d23b --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/hw-rss-whitespace.xml @@ -0,0 +1,19 @@ + +ws + + + Spaced.Title.2026.1080p.WEB-DL + + + https://pt.example.com/details.php?id=3 + + + line one + line two + + + + Sat, 26 Sep 2026 13:14:03 GMT + + + diff --git a/packages/adapters/test/differential/inputs/rss/tk-atom-basic.xml b/packages/adapters/test/differential/inputs/rss/tk-atom-basic.xml new file mode 100644 index 00000000..8117f432 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/tk-atom-basic.xml @@ -0,0 +1,6 @@ + +观众 Atom +audiences-812345Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR2026-09-26T13:14:03.000Z沙丘2 / 沙丘:第二部 | <b>杜比视界</b> 国英双语 中字 +audiences-812346Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friends2026-09-26T12:00:00.000Z +audiences-812347The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX + \ No newline at end of file diff --git a/packages/adapters/test/differential/inputs/rss/tk-rss-basic.xml b/packages/adapters/test/differential/inputs/rss/tk-rss-basic.xml new file mode 100644 index 00000000..dea81688 --- /dev/null +++ b/packages/adapters/test/differential/inputs/rss/tk-rss-basic.xml @@ -0,0 +1,6 @@ + +观众 Torrents +Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToRaudiences-812345https://audiences.me/details.php?id=812345Sat, 26 Sep 2026 13:14:03 GMT电影401杜比视界 国英双语 中字]]> +Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friendsaudiences-812346https://audiences.me/details.php?id=812346Sat, 26 Sep 2026 12:00:00 GMT +The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUXaudiences-812347https://audiences.me/details.php?id=812347 + \ No newline at end of file diff --git a/packages/adapters/test/differential/rss.json b/packages/adapters/test/differential/rss.json new file mode 100644 index 00000000..1ba92dff --- /dev/null +++ b/packages/adapters/test/differential/rss.json @@ -0,0 +1,1062 @@ +{ + "kind": "rss", + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a83ab05e8a00eb0e14adf0f357faa965c7e", + "function": "app/application/rss.py RssHelper._parse_impl (lxml fallback; parser port -> None)", + "rust": "moviepilot_rust.parse_rss_items_fast (reference only)", + "tz": "UTC", + "generator": "gen-differential.py rss" + }, + "fields": ["title", "description", "link", "enclosure", "size", "pubdate", "nickname"], + "samples": [ + { + "id": "hw-atom-nons", + "input": { + "file": "inputs/rss/hw-atom-nons.xml", + "sha256": "688a445573de61dcae4982cfaf1bab6164578ef7d1c7e0d179d6fad2bf132fdd" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Atom.Entry.One", + "description": "atom summary", + "link": "https://e.x/details?id=1", + "enclosure": "https://e.x/details?id=1", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "2026-09-26T13:14:03Z", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "Atom.Entry.Two", + "description": "", + "link": "https://e.x/details?id=2", + "enclosure": "https://e.x/details?id=2", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "2026-09-26T21:14:03+08:00", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Atom.Entry.One", + "enclosure": "https://e.x/details?id=1", + "size": 0, + "description": "atom summary", + "link": "https://e.x/details?id=1", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "Atom.Entry.Two", + "enclosure": "https://e.x/details?id=2", + "size": 0, + "description": "", + "link": "https://e.x/details?id=2", + "pubdate": "2026-09-26T13:14:03+00:00" + } + ] + } + }, + { + "id": "hw-expired", + "input": { + "file": "inputs/rss/hw-expired.txt", + "sha256": "4be5a56cf3dd539992cfaec516a0635e10c8f8c6ee24850dbafa3123bef8cf01" + }, + "mp": { + "status": "false_error", + "items": [] + }, + "mp_rust": { + "status": "not_called", + "note": "RssHelper.__parse_with_rust 对非 < 开头内容直接返回 None" + } + }, + { + "id": "hw-rdf", + "input": { + "file": "inputs/rss/hw-rdf.xml", + "sha256": "a84984a7debba7ce9927f0a0323fbcbd4503f74112e6c7b0441654704ee3464a" + }, + "mp": { + "status": "ok", + "items": [] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "RDF.Item.One", + "enclosure": "https://e.x/1", + "size": 0, + "description": "rdf desc", + "link": "https://e.x/1", + "pubdate": "", + "nickname": "alice" + } + ] + } + }, + { + "id": "hw-rss-broken", + "input": { + "file": "inputs/rss/hw-rss-broken.xml", + "sha256": "dced074189dcf0a871fbd5d4fdec78f3c2310117d1900a7bb629434d12479df1" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Good.One", + "description": "", + "link": "https://e.x/1", + "enclosure": "https://e.x/1", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Unclosed", + "description": "", + "link": "https://e.x/2", + "enclosure": "https://e.x/2", + "size": 0, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "error", + "error": "ValueError: ill-formed document: expected ``, but `` was found" + } + }, + { + "id": "hw-rss-cdata", + "input": { + "file": "inputs/rss/hw-rss-cdata.xml", + "sha256": "ab3d319aec7b1cd8775b7144c7ebf848178d7cc3cfe6210d938b098ba7560cfa" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "[BDMV] 奥本海默 Oppenheimer 2023 & more", + "description": "

Size: 78.42 GB

", + "link": "https://pt.example.com/details.php?id=1", + "enclosure": "https://pt.example.com/download.php?id=1&passkey=abcdef0123456789", + "size": 84203386470, + "nickname": "豆瓣用户A", + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 21:14:03 +0800", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "Plain & Escaped 中文", + "description": "desc & more", + "link": "https://pt.example.com/details.php?id=2&hit=1", + "enclosure": "https://pt.example.com/download.php?id=2", + "size": 1024, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 13:14:03 GMT", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "[BDMV] 奥本海默 Oppenheimer 2023 <UHD> & more", + "enclosure": "https://pt.example.com/download.php?id=1&passkey=abcdef0123456789", + "size": 84203386470, + "description": "<p>Size: 78.42 GB</p><img src=\"x.jpg\"/>", + "link": "https://pt.example.com/details.php?id=1", + "pubdate": "2026-09-26T13:14:03+00:00", + "nickname": "豆瓣用户A" + }, + { + "title": "Plain & Escaped <Title> 中文", + "enclosure": "https://pt.example.com/download.php?id=2", + "size": 1024, + "description": "desc & more", + "link": "https://pt.example.com/details.php?id=2&hit=1", + "pubdate": "2026-09-26T13:14:03+00:00" + } + ] + } + }, + { + "id": "hw-rss-dtd", + "input": { + "file": "inputs/rss/hw-rss-dtd.xml", + "sha256": "b45ee3007c1d8eff9ff1e1f0e262d859826e4dcfaec3ea3a7130508bd1e82c17" + }, + "mp": { + "status": "ok", + "items": [] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "&brand; Title", + "enclosure": "https://e.x/1", + "size": 0, + "description": "", + "link": "https://e.x/1", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-entities", + "input": { + "file": "inputs/rss/hw-rss-entities.xml", + "sha256": "a8a0d91ca3f75dd6b97d5ad1d19f88319f581d3274aefa69d5a0ef8aa85d6898" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Nbsp", + "description": "", + "link": "https://e.x/1", + "enclosure": "https://e.x/1", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Normal.After.Bad", + "description": "", + "link": "https://e.x/2", + "enclosure": "https://e.x/2", + "size": 0, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Nbsp Title©2026", + "enclosure": "https://e.x/1", + "size": 0, + "description": "", + "link": "https://e.x/1", + "pubdate": "" + }, + { + "title": "Normal.After.Bad", + "enclosure": "https://e.x/2", + "size": 0, + "description": "", + "link": "https://e.x/2", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-link-fallback", + "input": { + "file": "inputs/rss/hw-rss-link-fallback.xml", + "sha256": "d46fae0bfc7e3248d368857c8973443a2b65c60a54a1b1069de7ed84c73e3864" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Only.Link.Item", + "description": "", + "link": "https://pt.example.com/download.php?id=10", + "enclosure": "https://pt.example.com/download.php?id=10", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Enclosure.Only", + "description": "", + "link": "", + "enclosure": "magnet:?xt=urn:btih:0123456789abcdef0123456789abcdef01234567&dn=x", + "size": 0, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Only.Link.Item", + "enclosure": "https://pt.example.com/download.php?id=10", + "size": 0, + "description": "", + "link": "https://pt.example.com/download.php?id=10", + "pubdate": "" + }, + { + "title": "Enclosure.Only", + "enclosure": "magnet:?xt=urn:btih:0123456789abcdef0123456789abcdef01234567&dn=x", + "size": 0, + "description": "", + "link": "", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-nested", + "input": { + "file": "inputs/rss/hw-rss-nested.xml", + "sha256": "41559a6d1dfd2ccbf1ecda6bbb10dfc5518aea2fb56ed2c59052d4782c6766cf" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Source.Title.First", + "description": "", + "link": "https://e.x/1", + "enclosure": "https://e.x/1", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Two.Enclosures", + "description": "", + "link": "", + "enclosure": "https://e.x/a.torrent", + "size": 100, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Source.Title.First", + "enclosure": "https://e.x/1", + "size": 0, + "description": "", + "link": "https://e.x/1", + "pubdate": "" + }, + { + "title": "Two.Enclosures", + "enclosure": "https://e.x/a.torrent", + "size": 100, + "description": "", + "link": "", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-nyaa", + "input": { + "file": "inputs/rss/hw-rss-nyaa.xml", + "sha256": "0e7a8b8b0fa321c6e2b5242b3bba8bdb40a005640111b2efe064b737fbbf86df" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "[Group] Show - 01 [1080p].mkv", + "description": "<a href=\"https://nyaa.example/view/1\">#1</a> | 1.2 GiB", + "link": "https://nyaa.example/download/1.torrent", + "enclosure": "https://nyaa.example/download/1.torrent", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 13:14:03 -0000", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "[Group] Show - 01 [1080p].mkv", + "enclosure": "https://nyaa.example/download/1.torrent", + "size": 0, + "description": "<a href=\"https://nyaa.example/view/1\">#1</a> | 1.2 GiB", + "link": "https://nyaa.example/download/1.torrent", + "pubdate": "2026-09-26T13:14:03+00:00" + } + ] + } + }, + { + "id": "hw-rss-pubdate", + "input": { + "file": "inputs/rss/hw-rss-pubdate.xml", + "sha256": "7ce9c000674a73e96ec5408260e4b6292bfecf7578b242706d3d62c7ccd48fb0" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "rfc822-gmt", + "description": "", + "link": "https://e.x/1", + "enclosure": "https://e.x/1", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 13:14:03 GMT", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "rfc822-offset", + "description": "", + "link": "https://e.x/2", + "enclosure": "https://e.x/2", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 21:14:03 +0800", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "rfc822-no-seconds", + "description": "", + "link": "https://e.x/3", + "enclosure": "https://e.x/3", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 21:14 +0800", + "wall": "2026-09-26T21:14:00", + "utc": "2026-09-26T13:14:00.000Z" + } + }, + { + "title": "rfc822-cst", + "description": "", + "link": "https://e.x/4", + "enclosure": "https://e.x/4", + "size": 0, + "pubdate": { + "kind": "naive", + "text": "Sat, 26 Sep 2026 21:14:03 CST", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T21:14:03.000Z" + } + }, + { + "title": "iso-z", + "description": "", + "link": "https://e.x/5", + "enclosure": "https://e.x/5", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "2026-09-26T13:14:03Z", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "iso-offset", + "description": "", + "link": "https://e.x/6", + "enclosure": "https://e.x/6", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "2026-09-26T21:14:03+08:00", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "naive-space", + "description": "", + "link": "https://e.x/7", + "enclosure": "https://e.x/7", + "size": 0, + "pubdate": { + "kind": "naive", + "text": "2026-09-26 21:14:03", + "wall": "2026-09-26T21:14:03", + "utc": "2026-09-26T21:14:03.000Z" + } + }, + { + "title": "date-only", + "description": "", + "link": "https://e.x/8", + "enclosure": "https://e.x/8", + "size": 0, + "pubdate": { + "kind": "naive", + "text": "2026-09-26", + "wall": "2026-09-26T00:00:00", + "utc": "2026-09-26T00:00:00.000Z" + } + }, + { + "title": "chinese", + "description": "", + "link": "https://e.x/9", + "enclosure": "https://e.x/9", + "size": 0, + "pubdate": { + "kind": "unparsed", + "text": "2026年09月26日 21:14:03" + } + }, + { + "title": "garbage", + "description": "", + "link": "https://e.x/10", + "enclosure": "https://e.x/10", + "size": 0, + "pubdate": { + "kind": "unparsed", + "text": "3小时前" + } + }, + { + "title": "no-weekday", + "description": "", + "link": "https://e.x/11", + "enclosure": "https://e.x/11", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "26 Sep 2026 13:14:03 +0000", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "wrong-weekday", + "description": "", + "link": "https://e.x/12", + "enclosure": "https://e.x/12", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "Mon, 26 Sep 2026 13:14:03 GMT", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "epoch-like", + "description": "", + "link": "https://e.x/13", + "enclosure": "https://e.x/13", + "size": 0, + "pubdate": { + "kind": "unparsed", + "text": "1790428443" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "rfc822-gmt", + "enclosure": "https://e.x/1", + "size": 0, + "description": "", + "link": "https://e.x/1", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "rfc822-offset", + "enclosure": "https://e.x/2", + "size": 0, + "description": "", + "link": "https://e.x/2", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "rfc822-no-seconds", + "enclosure": "https://e.x/3", + "size": 0, + "description": "", + "link": "https://e.x/3", + "pubdate": "2026-09-26T13:14:00+00:00" + }, + { + "title": "rfc822-cst", + "enclosure": "https://e.x/4", + "size": 0, + "description": "", + "link": "https://e.x/4", + "pubdate": "2026-09-27T03:14:03+00:00" + }, + { + "title": "iso-z", + "enclosure": "https://e.x/5", + "size": 0, + "description": "", + "link": "https://e.x/5", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "iso-offset", + "enclosure": "https://e.x/6", + "size": 0, + "description": "", + "link": "https://e.x/6", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "naive-space", + "enclosure": "https://e.x/7", + "size": 0, + "description": "", + "link": "https://e.x/7", + "pubdate": "2026-09-26T21:14:03+00:00" + }, + { + "title": "date-only", + "enclosure": "https://e.x/8", + "size": 0, + "description": "", + "link": "https://e.x/8", + "pubdate": "2026-09-26T00:00:00+00:00" + }, + { + "title": "chinese", + "enclosure": "https://e.x/9", + "size": 0, + "description": "", + "link": "https://e.x/9", + "pubdate": "" + }, + { + "title": "garbage", + "enclosure": "https://e.x/10", + "size": 0, + "description": "", + "link": "https://e.x/10", + "pubdate": "" + }, + { + "title": "no-weekday", + "enclosure": "https://e.x/11", + "size": 0, + "description": "", + "link": "https://e.x/11", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "wrong-weekday", + "enclosure": "https://e.x/12", + "size": 0, + "description": "", + "link": "https://e.x/12", + "pubdate": "" + }, + { + "title": "epoch-like", + "enclosure": "https://e.x/13", + "size": 0, + "description": "", + "link": "https://e.x/13", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-size", + "input": { + "file": "inputs/rss/hw-rss-size.xml", + "sha256": "da6e7e28c5a7731d56b56c326fc9809309a5ccdc64a816f013dc10c4cb764898" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Size.In.Description", + "description": "[Size: 1.50 GB] [Seeders: 12]", + "link": "https://pt.example.com/d?id=20", + "enclosure": "https://pt.example.com/d?id=20", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Length.NonDigit", + "description": "", + "link": "", + "enclosure": "https://pt.example.com/dl?id=21", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Length.Empty", + "description": "", + "link": "", + "enclosure": "https://pt.example.com/dl?id=22", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Length.Missing", + "description": "", + "link": "", + "enclosure": "https://pt.example.com/dl?id=23", + "size": 0, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Length.Big", + "description": "", + "link": "", + "enclosure": "https://pt.example.com/dl?id=24", + "size": 2199023255552, + "pubdate": { + "kind": "absent" + } + }, + { + "title": "Length.Negative", + "description": "", + "link": "", + "enclosure": "https://pt.example.com/dl?id=25", + "size": 0, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Size.In.Description", + "enclosure": "https://pt.example.com/d?id=20", + "size": 0, + "description": "[Size: 1.50 GB] [Seeders: 12]", + "link": "https://pt.example.com/d?id=20", + "pubdate": "" + }, + { + "title": "Length.NonDigit", + "enclosure": "https://pt.example.com/dl?id=21", + "size": 0, + "description": "", + "link": "", + "pubdate": "" + }, + { + "title": "Length.Empty", + "enclosure": "https://pt.example.com/dl?id=22", + "size": 0, + "description": "", + "link": "", + "pubdate": "" + }, + { + "title": "Length.Missing", + "enclosure": "https://pt.example.com/dl?id=23", + "size": 0, + "description": "", + "link": "", + "pubdate": "" + }, + { + "title": "Length.Big", + "enclosure": "https://pt.example.com/dl?id=24", + "size": 2199023255552, + "description": "", + "link": "", + "pubdate": "" + }, + { + "title": "Length.Negative", + "enclosure": "https://pt.example.com/dl?id=25", + "size": -1, + "description": "", + "link": "", + "pubdate": "" + } + ] + } + }, + { + "id": "hw-rss-whitespace", + "input": { + "file": "inputs/rss/hw-rss-whitespace.xml", + "sha256": "16a5c3be9b772d946d60714105d36251d0e960b27c44255cef1d020dac3c5de9" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "\n Spaced.Title.2026.1080p.WEB-DL\n ", + "description": "\n line one\n line two\n ", + "link": "\n https://pt.example.com/details.php?id=3\n ", + "enclosure": " https://pt.example.com/download.php?id=3 ", + "size": 0, + "pubdate": { + "kind": "aware", + "text": "\n Sat, 26 Sep 2026 13:14:03 GMT\n ", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Spaced.Title.2026.1080p.WEB-DL", + "enclosure": "https://pt.example.com/download.php?id=3", + "size": 2048, + "description": "line one\n line two", + "link": "https://pt.example.com/details.php?id=3", + "pubdate": "2026-09-26T13:14:03+00:00" + } + ] + } + }, + { + "id": "tk-atom-basic", + "input": { + "file": "inputs/rss/tk-atom-basic.xml", + "sha256": "6546bb85daeda86320216bcdd447461ce294e143950c98d800aa792855197cb9" + }, + "mp": { + "status": "ok", + "items": [] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "enclosure": "https://audiences.me/details.php?id=812345", + "size": 0, + "description": "沙丘2 / 沙丘:第二部 | <b>杜比视界</b> 国英双语 中字", + "link": "https://audiences.me/details.php?id=812345", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friends", + "enclosure": "https://audiences.me/details.php?id=812346", + "size": 0, + "description": "", + "link": "https://audiences.me/details.php?id=812346", + "pubdate": "2026-09-26T12:00:00+00:00" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "enclosure": "https://audiences.me/details.php?id=812347", + "size": 0, + "description": "", + "link": "https://audiences.me/details.php?id=812347", + "pubdate": "" + } + ] + } + }, + { + "id": "tk-rss-basic", + "input": { + "file": "inputs/rss/tk-rss-basic.xml", + "sha256": "89de110d3f33af374eef4e0b7a3c3d1221c44ebb02f5a50f48c9ca143158a8af" + }, + "mp": { + "status": "ok", + "items": [ + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "沙丘2 / 沙丘:第二部 | <b>杜比视界</b> 国英双语 中字", + "link": "https://audiences.me/details.php?id=812345", + "enclosure": "https://audiences.me/download.php?id=812345&passkey=0123456789abcdef", + "size": 84203386470, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 13:14:03 GMT", + "wall": "2026-09-26T13:14:03", + "utc": "2026-09-26T13:14:03.000Z" + } + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friends", + "description": "", + "link": "https://audiences.me/details.php?id=812346", + "enclosure": "https://audiences.me/download.php?id=812346", + "size": 5497558138, + "pubdate": { + "kind": "aware", + "text": "Sat, 26 Sep 2026 12:00:00 GMT", + "wall": "2026-09-26T12:00:00", + "utc": "2026-09-26T12:00:00.000Z" + } + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "description": "", + "link": "https://audiences.me/details.php?id=812347", + "enclosure": "https://audiences.me/details.php?id=812347", + "size": 0, + "pubdate": { + "kind": "absent" + } + } + ] + }, + "mp_rust": { + "status": "ok", + "items": [ + { + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "enclosure": "https://audiences.me/download.php?id=812345&passkey=0123456789abcdef", + "size": 84203386470, + "description": "沙丘2 / 沙丘:第二部 | <b>杜比视界</b> 国英双语 中字", + "link": "https://audiences.me/details.php?id=812345", + "pubdate": "2026-09-26T13:14:03+00:00" + }, + { + "title": "Keep.Running.S12E01.20240426.2160p.WEB-DL.H265.AAC-LelveTV & Friends", + "enclosure": "https://audiences.me/download.php?id=812346", + "size": 5497558138, + "description": "", + "link": "https://audiences.me/details.php?id=812346", + "pubdate": "2026-09-26T12:00:00+00:00" + }, + { + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.H.265-FLUX", + "enclosure": "https://audiences.me/details.php?id=812347", + "size": 0, + "description": "", + "link": "https://audiences.me/details.php?id=812347", + "pubdate": "" + } + ] + } + } + ], + "deviations": { + "hw-expired.status": { + "kind": "mp_bug", + "note": "站点返回纯文本过期提示时,MP _parse_impl 先判\"不是 < 开头\"直接 return False,_rss_expired_msg 只在异常分支比较、实际不可达,调用方 TorrentsChain.rss 永远走不到 None→__renew_rss_url 续期;本项目 parseFeed 先识别过期文案抛 FeedError('expired')。" + }, + "hw-rdf.count": { + "kind": "mp_bug", + "note": "RSS 1.0(RDF)默认命名空间 http://purl.org/rss/1.0/,MP Python 回退的 xpath './/item' 不带命名空间 → 0 条(Rust 快路径能解析出 1 条);本项目 removeNSPrefix 后解析出 1 条。" + }, + "hw-rss-broken.count": { + "kind": "intentional", + "note": "缺少 </rss> 且含未闭合 <title>:MP lxml recover=True 容错解析出 2 条(第二条标题 'Unclosed');本项目 fast-xml-parser 非容错,只得到 1 条(未抛错)。容错恢复会产出错误字段,不跟随。" + }, + "hw-rss-cdata#0.enclosure": { + "kind": "intentional", + "note": "本项目 enclosureUrl 为脱敏形态(passkey=[REDACTED]),真实值由 unredactUrl 在内存还原;MP 原样返回含 passkey 的 URL(SA5/任务书:含 passkey 的 URL 不得入日志/库)。" + }, + "hw-rss-dtd.status": { + "kind": "intentional", + "note": "含内部 DTD/ENTITY 声明:MP resolve_entities=False,标题只剩实体引用前文本为空 → 跳过,返回 [](Rust 快路径返回 1 条);本项目预检直接拒绝整份 Feed(FeedError forbidden_dtd,防 XXE/billion laughs)。" + }, + "hw-rss-entities#0.title": { + "kind": "intentional", + "note": "未声明的 HTML 实体  /©:MP lxml recover 在未知实体处截断,标题变成 'Nbsp';本项目不展开非 XML 预定义实体,原样保留 ' '/'©' 字面量。两边都不是理想结果,本项目不丢信息;可考虑补 HTML 命名实体表。" + }, + "hw-rss-nested#0.title": { + "kind": "mp_bug", + "note": "MP 用 './/title'(后代任意层)取第一个,<item> 内 <source><title> 在前时取到来源标题;本项目只取 item 直接子元素 title。" + }, + "hw-rss-pubdate#3.pubdate": { + "kind": "intentional", + "note": "'... 21:14:03 CST':dateutil 不认识 CST(UnknownTimezoneWarning)返回 naive → 按 MP 宿主本地时区解释;JS Date.parse 按美国中部时间(-06:00)解析。中国站点写 CST 通常指 +08:00,两边都可能错,建议在 RSS 源配置时区后统一处理。" + }, + "hw-rss-pubdate#7.pubdate": { + "kind": "intentional", + "note": "纯日期 '2026-09-26':dateutil → naive 本地午夜;JS Date.parse 按 ISO 规则视为 UTC 午夜。仅宿主时区非 UTC 时出现(condition=local_tz_not_utc)。", + "condition": "local_tz_not_utc" + }, + "hw-rss-whitespace#0.description": { + "kind": "intentional", + "note": "同 hw-rss-whitespace#0.title(首尾空白)。" + }, + "hw-rss-whitespace#0.enclosure": { + "kind": "intentional", + "note": "enclosure@url 两端空格:MP 原样,本项目属性值同样 trim。" + }, + "hw-rss-whitespace#0.link": { + "kind": "intentional", + "note": "同 hw-rss-whitespace#0.title;MP 的 link 带换行,直接用作详情 URL 会失败。" + }, + "hw-rss-whitespace#0.size": { + "kind": "intentional", + "note": "enclosure@length=' 2048 ':MP str.isdigit() 不通过 → 0;本项目属性 trim 后为 2048。" + }, + "hw-rss-whitespace#0.title": { + "kind": "intentional", + "note": "MP 取 lxml .text 不 strip,保留换行与缩进;本项目 fast-xml-parser trimValues=true 去首尾空白(README 尚未登记,建议补)。" + }, + "tk-atom-basic.count": { + "kind": "mp_bug", + "note": "标准 Atom(xmlns=http://www.w3.org/2005/Atom)下 MP Python 回退 './/entry' 匹配不到命名空间元素 → 0 条(Rust 快路径 3 条);本项目 3 条。无命名空间的 Atom 两边一致(见 hw-atom-nons)。" + }, + "tk-rss-basic#0.enclosure": { + "kind": "intentional", + "note": "同 hw-rss-cdata#0.enclosure:passkey 脱敏。" + } + } +} diff --git a/packages/adapters/test/differential/rss.test.ts b/packages/adapters/test/differential/rss.test.ts new file mode 100644 index 00000000..5b05cffb --- /dev/null +++ b/packages/adapters/test/differential/rss.test.ts @@ -0,0 +1,121 @@ +/** + * RSS 解析差分:MP `RssHelper._parse_impl`(lxml 回退)vs 本项目 `parseFeed`。 + * 期望由 scripts/mp-sync/gen-differential.py rss|indexer 生成(rss.json);不一致必须登记在 rss.json `deviations`。 + */ +import { describe, expect, it } from "vitest"; +import { FeedError, type FeedItem, parseFeed } from "../../src/rss/index.ts"; +import { + diffAgainstRegistry, + dumpMismatches, + FieldCollector, + formatMismatches, + loadDoc, + readInput, +} from "./diff-util.ts"; + +interface MpPubdate { + kind: "absent" | "unparsed" | "aware" | "naive"; + text?: string; + wall?: string; + utc?: string; +} +interface MpRssItem { + title: string; + description: string; + link: string; + enclosure: string; + size: number; + nickname?: string; + pubdate: MpPubdate; +} +interface RssSample { + id: string; + input: { file: string; sha256: string }; + mp: { status: "ok" | "false_error" | "none_expired"; items: MpRssItem[] }; +} + +const doc = loadDoc<RssSample>("rss.json"); + +/** MP 字段 → 可与本项目比较的值:空串即缺省;pubdate 统一为 UTC ISO */ +function mpPubdate(p: MpPubdate): string | undefined { + if (p.kind === "aware") return p.utc; + // naive:MP astimezone(None) 以宿主本地时区解释墙上时间;JS 对无偏移的日期时间同样按本地解释 + if (p.kind === "naive") return new Date(p.wall!).toISOString(); + return undefined; +} +const blank = (s: string | null | undefined) => (s === "" || s == null ? undefined : s); + +function runOurs(xml: string): { status: string; items: FeedItem[] } { + try { + return { + status: "ok", + items: parseFeed(xml, { fetchedAt: new Date("2026-09-27T00:00:00Z") }).items, + }; + } catch (e) { + if (e instanceof FeedError) return { status: `error:${e.kind}`, items: [] }; + throw e; + } +} + +function statusEquivalent(mp: RssSample["mp"]["status"], ours: string): boolean { + if (mp === "ok") return ours === "ok"; + if (mp === "none_expired") return ours === "error:expired"; + return ours.startsWith("error:") && ours !== "error:expired"; +} + +describe("RSS 差分(MP RssHelper Python 回退)", () => { + const c = new FieldCollector(); + for (const s of doc.samples) { + const ours = runOurs(readInput(s.input.file)); + if (!statusEquivalent(s.mp.status, ours.status)) { + c.mismatches.push({ + key: `${s.id}.status`, + mp: s.mp.status, + ours: ours.status, + }); + } + if (s.mp.status !== "ok" || ours.status !== "ok") continue; + if (s.mp.items.length !== ours.items.length) { + c.mismatches.push({ + key: `${s.id}.count`, + mp: s.mp.items.length, + ours: ours.items.length, + }); + } + const n = Math.min(s.mp.items.length, ours.items.length); + for (let i = 0; i < n; i++) { + const m = s.mp.items[i]!; + const o = ours.items[i]!; + const k = (f: string) => `${s.id}#${i}.${f}`; + c.check(k("title"), m.title, o.title); + c.check(k("description"), blank(m.description), blank(o.description)); + c.check(k("link"), blank(m.link), blank(o.link)); + c.check(k("enclosure"), blank(m.enclosure), blank(o.enclosureUrl)); + c.check(k("size"), m.size, o.size); + c.check(k("pubdate"), mpPubdate(m.pubdate), o.publishedAt); + c.check(k("nickname"), blank(m.nickname), blank(o.nickname)); + } + } + + it("有样本且记录了生成来源", () => { + expect(doc.samples.length).toBeGreaterThan(10); + expect(doc.generatedFrom.commit).toMatch(/^[0-9a-f]{40}$/); + }); + + it("实际不一致集合 == 登记的 deviations", () => { + dumpMismatches("rss", c.mismatches, { + compared: c.compared, + equal: c.equal, + }); + const { unregistered, stale } = diffAgainstRegistry(c.mismatches, doc.deviations); + expect(formatMismatches(unregistered), "未登记的不一致").toBe(""); + expect(stale.join("\n"), "登记了但已不再出现的偏差(请从 rss.json deviations 删除)").toBe(""); + }); + + it("登记项分类合法", () => { + for (const [key, d] of Object.entries(doc.deviations)) { + expect(["intentional", "missing", "our_bug", "mp_bug"], key).toContain(d.kind); + expect(d.note.length, key).toBeGreaterThan(0); + } + }); +}); diff --git a/packages/domain/test/differential/filter-cases.json b/packages/domain/test/differential/filter-cases.json new file mode 100644 index 00000000..9cfcabdf --- /dev/null +++ b/packages/domain/test/differential/filter-cases.json @@ -0,0 +1,12630 @@ +{ + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a8", + "engine": "python-fallback (app.modules.filter FilterModule, rust_accel disabled)", + "rustCrossCheck": { + "available": true, + "mismatches": [] + }, + "generator": "scripts/mp-sync/gen-differential.py filter", + "semantics": "level = 1-based index of first matching '>' tier; priOrder = 101 - level (MP pri_order)" + }, + "customRules": { + "SIZEMOVIE": { + "size_range": "2000-30000" + }, + "SIZESMALL": { + "size_range": "<8000" + }, + "SIZEBIG": { + "size_range": ">20000" + }, + "SEED5": { + "seeders": "5" + } + }, + "torrents": [ + { + "id": "t01", + "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.Remux.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", + "description": "", + "size": 75161927680, + "seeders": 20 + }, + { + "id": "t02", + "title": "Dune.Part.Two.2024.2160p.BluRay.x265.10bit.DV.HDR-CHD", + "description": "沙丘2 中字 特效", + "size": 26843545600, + "seeders": 12 + }, + { + "id": "t03", + "title": "Dune Part Two 2024 2160p UHD Blu-ray HEVC DV TrueHD 7.1-BeyondHD", + "description": "", + "size": 96636764160, + "seeders": 4 + }, + { + "id": "t04", + "title": "Dune.Part.Two.2024.1080p.WEB-DL.H264.DDP5.1-HHWEB", + "description": "沙丘2 | 国语 中字", + "size": 8589934592, + "seeders": 50 + }, + { + "id": "t05", + "title": "Dune.Part.Two.2024.1080p.BluRay.x264.DTS-HD.MA.5.1-WiKi", + "description": "简繁英字幕", + "size": 16106127360, + "seeders": 9 + }, + { + "id": "t06", + "title": "Dune.Part.Two.2024.720p.WEBRip.x264-GRP", + "description": "", + "size": 2147483648, + "seeders": 1 + }, + { + "id": "t07", + "title": "Dune.Part.Two.2024.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-FLUX", + "description": "", + "size": 21474836480, + "seeders": 30 + }, + { + "id": "t08", + "title": "Movie.2022.2160p.HDR.HEVC-NOSRC", + "description": "", + "size": 19327352832, + "seeders": 2 + }, + { + "id": "t09", + "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.HDR.H.265-NTb", + "description": "熊家餐馆 第三季 全10集 中字", + "size": 64424509440, + "seeders": 15 + }, + { + "id": "t10", + "title": "The.Bear.S03E01.1080p.WEB-DL.H264-NTb", + "description": "", + "size": 2684354560, + "seeders": 8 + }, + { + "id": "t11", + "title": "Movie.2023.1080p.BluRay.REMUX.AVC.DTS-HD.MA.5.1-EPSiLON", + "description": "", + "size": 32212254720, + "seeders": 6 + }, + { + "id": "t12", + "title": "Movie 2023 1080p Blu-ray AVC DTS-HD MA 5.1-AAA", + "description": "", + "size": 42949672960, + "seeders": 3 + }, + { + "id": "t13", + "title": "Movie.2023.COMPLETE.BLURAY-GRP", + "description": "", + "size": 48318382080, + "seeders": 2 + }, + { + "id": "t14", + "title": "Movie.2023.1080i.HDTV.H264-GRP", + "description": "", + "size": 10737418240, + "seeders": 1 + }, + { + "id": "t15", + "title": "[Nekomoe kissaten] Frieren - 01 [WebRip 1080p HEVC-10bit AAC ASSx2].mkv", + "description": "简繁日内封", + "size": 1073741824, + "seeders": 40 + }, + { + "id": "t16", + "title": "The.Wandering.Earth.II.2023.2160p.WEB-DL.H265.HDR.DDP5.1-HDSWEB", + "description": "流浪地球2 国语配音 中文字幕", + "size": 12884901888, + "seeders": 25 + }, + { + "id": "t17", + "title": "Oppenheimer.2023.IMAX.2160p.BluRay.x265.10bit.HDR.DTS-HD.MA.5.1-SWTYBLZ", + "description": "奥本海默 CHS/ENG", + "size": 32212254720, + "seeders": 7 + }, + { + "id": "t18", + "title": "Movie.2022.3840x2160.WEB-DL.HDR10.HEVC-GRP", + "description": "", + "size": 16106127360, + "seeders": 5 + }, + { + "id": "t19", + "title": "Movie.2022.1920x1080.WEB-DL.H264-GRP", + "description": "", + "size": 6442450944, + "seeders": 5 + }, + { + "id": "t20", + "title": "Movie.2022.4K.WEB-DL.H265-GRP", + "description": "", + "size": 15032385536, + "seeders": 5 + }, + { + "id": "t21", + "title": "Movie.2022.1080p.WEB-DL.x264 [GB]", + "description": "", + "size": 4294967296, + "seeders": 5 + }, + { + "id": "t22", + "title": "Movie.2022.1080p.WEB-DL.H264.AAC 39.23 GB", + "description": "", + "size": 4294967296, + "seeders": 5 + }, + { + "id": "t23", + "title": "Some.Show.S01.1080p.BluRay.x264-GRP", + "description": "全12集 简体中字", + "size": 38654705664, + "seeders": 3 + }, + { + "id": "t24", + "title": "Movie.2021.DVDRip.x264-GRP", + "description": "", + "size": 1503238553, + "seeders": 2 + }, + { + "id": "t25", + "title": "Movie 2021 1080p 3D BluRay Half-SBS x264-GRP", + "description": "", + "size": 8589934592, + "seeders": 2 + }, + { + "id": "t26", + "title": "Movie.2021.2160p.WEB-DL.60fps.HEVC-GRP", + "description": "60帧 国语", + "size": 10737418240, + "seeders": 4 + }, + { + "id": "t27", + "title": "Movie.2020.2160p.Remux.HEVC.DoVi-GRP", + "description": "", + "size": 53687091200, + "seeders": 3 + }, + { + "id": "t28", + "title": "Movie.2020.1080p.NF.WEB-DL.DDP5.1.H.264-CHDWEB", + "description": "官方 中字", + "labels": ["官方"], + "size": 5368709120, + "seeders": 10, + "downloadvolumefactor": 0 + } + ], + "rules": [ + { + "id": "R01", + "rule": "4K", + "verdict": "full" + }, + { + "id": "R02", + "rule": "1080P", + "verdict": "full" + }, + { + "id": "R03", + "rule": "720P", + "verdict": "full" + }, + { + "id": "R04", + "rule": "4K | 1080P", + "verdict": "full" + }, + { + "id": "R05", + "rule": "4K > 1080P > 720P", + "verdict": "full" + }, + { + "id": "R06", + "rule": "BLU", + "verdict": "full" + }, + { + "id": "R07", + "rule": "!BLU", + "verdict": "full" + }, + { + "id": "R08", + "rule": "REMUX", + "verdict": "full" + }, + { + "id": "R09", + "rule": "!REMUX", + "verdict": "full" + }, + { + "id": "R10", + "rule": "WEBDL", + "verdict": "full" + }, + { + "id": "R11", + "rule": "!BLU & !REMUX", + "verdict": "full" + }, + { + "id": "R12", + "rule": "4K & !REMUX > 1080P & WEBDL", + "verdict": "full" + }, + { + "id": "R13", + "rule": "CNSUB", + "verdict": "full" + }, + { + "id": "R14", + "rule": "CNSUB & 4K & !BLU", + "verdict": "full" + }, + { + "id": "R15", + "rule": "CNSUB & 1080P > 1080P", + "verdict": "full" + }, + { + "id": "R16", + "rule": "SIZEMOVIE", + "verdict": "full" + }, + { + "id": "R17", + "rule": "SIZESMALL", + "verdict": "full" + }, + { + "id": "R18", + "rule": "4K & SIZEMOVIE", + "verdict": "full" + }, + { + "id": "R19", + "rule": "!BLU & !REMUX & !WEBDL", + "verdict": "full" + }, + { + "id": "R20", + "rule": "BLURAY & !REMUX & !BLU", + "verdict": "full" + }, + { + "id": "R21", + "rule": "4K & !BLU & !REMUX > 1080P & !BLU & !REMUX", + "verdict": "full" + }, + { + "id": "R22", + "rule": "(4K | 1080P) & WEBDL", + "verdict": "full" + }, + { + "id": "R23", + "rule": "CNSUB", + "verdict": "partial", + "mediainfo": { + "original_language": "zh" + }, + "note": "tmdb.original_language=zh 时 CNSUB 对任何种子直接放行" + }, + { + "id": "R24", + "rule": "4K & !DOLBY", + "verdict": "partial", + "note": "硬条件无 HDR 维度,近似为 4K" + }, + { + "id": "R25", + "rule": "SPECSUB & CNSUB & !BLU", + "verdict": "partial", + "note": "无特效字幕维度,近似为 CNSUB & !BLU" + }, + { + "id": "R26", + "rule": "SIZEBIG", + "verdict": "full" + }, + { + "id": "N01", + "rule": "H265", + "verdict": "none", + "note": "编码只有软偏好 soft.codecs" + }, + { + "id": "N02", + "rule": "!DOLBY & !REMUX", + "verdict": "none", + "note": "HDR 只有软偏好" + }, + { + "id": "N03", + "rule": "HDR", + "verdict": "none" + }, + { + "id": "N04", + "rule": "SPECSUB", + "verdict": "none" + }, + { + "id": "N05", + "rule": "CNVOI", + "verdict": "none", + "note": "无音轨语言字段" + }, + { + "id": "N06", + "rule": "60FPS", + "verdict": "none" + }, + { + "id": "N07", + "rule": "!3D", + "verdict": "none" + }, + { + "id": "N08", + "rule": "ATMOS", + "verdict": "none" + }, + { + "id": "N09", + "rule": "GZ", + "verdict": "none", + "note": "站点标签" + }, + { + "id": "N10", + "rule": "FREE", + "verdict": "none", + "note": "站点促销" + }, + { + "id": "N11", + "rule": "SEED5", + "verdict": "none", + "note": "做种数" + }, + { + "id": "N12", + "rule": "CNSUB | 4K", + "verdict": "none", + "note": "跨字段 OR" + }, + { + "id": "N13", + "rule": "!(4K & REMUX)", + "verdict": "none", + "note": "跨字段 NOT(AND) = OR" + }, + { + "id": "N14", + "rule": "UHD", + "verdict": "none", + "note": "ParsedRelease.uhd 有,但硬条件没有" + }, + { + "id": "N15", + "rule": "4K & H265 > 4K", + "verdict": "none", + "note": "level1 需编码硬条件" + }, + { + "id": "N16", + "rule": "NOSUCHRULE | 4K", + "verdict": "none", + "note": "未知规则名视为不匹配" + } + ], + "cases": [ + { + "caseId": "R01:t01", + "ruleId": "R01", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t02", + "ruleId": "R01", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t03", + "ruleId": "R01", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t04", + "ruleId": "R01", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t05", + "ruleId": "R01", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t06", + "ruleId": "R01", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t07", + "ruleId": "R01", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t08", + "ruleId": "R01", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t09", + "ruleId": "R01", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t10", + "ruleId": "R01", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t11", + "ruleId": "R01", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t12", + "ruleId": "R01", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t13", + "ruleId": "R01", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t14", + "ruleId": "R01", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t15", + "ruleId": "R01", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t16", + "ruleId": "R01", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t17", + "ruleId": "R01", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t18", + "ruleId": "R01", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t19", + "ruleId": "R01", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t20", + "ruleId": "R01", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t21", + "ruleId": "R01", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t22", + "ruleId": "R01", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t23", + "ruleId": "R01", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t24", + "ruleId": "R01", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t25", + "ruleId": "R01", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R01:t26", + "ruleId": "R01", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t27", + "ruleId": "R01", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R01:t28", + "ruleId": "R01", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t01", + "ruleId": "R02", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t02", + "ruleId": "R02", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t03", + "ruleId": "R02", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t04", + "ruleId": "R02", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t05", + "ruleId": "R02", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t06", + "ruleId": "R02", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t07", + "ruleId": "R02", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t08", + "ruleId": "R02", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t09", + "ruleId": "R02", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t10", + "ruleId": "R02", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t11", + "ruleId": "R02", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t12", + "ruleId": "R02", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t13", + "ruleId": "R02", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t14", + "ruleId": "R02", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t15", + "ruleId": "R02", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t16", + "ruleId": "R02", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t17", + "ruleId": "R02", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t18", + "ruleId": "R02", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t19", + "ruleId": "R02", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t20", + "ruleId": "R02", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t21", + "ruleId": "R02", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t22", + "ruleId": "R02", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t23", + "ruleId": "R02", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t24", + "ruleId": "R02", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t25", + "ruleId": "R02", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R02:t26", + "ruleId": "R02", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t27", + "ruleId": "R02", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R02:t28", + "ruleId": "R02", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R03:t01", + "ruleId": "R03", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t02", + "ruleId": "R03", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t03", + "ruleId": "R03", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t04", + "ruleId": "R03", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t05", + "ruleId": "R03", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t06", + "ruleId": "R03", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R03:t07", + "ruleId": "R03", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t08", + "ruleId": "R03", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t09", + "ruleId": "R03", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t10", + "ruleId": "R03", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t11", + "ruleId": "R03", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t12", + "ruleId": "R03", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t13", + "ruleId": "R03", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t14", + "ruleId": "R03", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t15", + "ruleId": "R03", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t16", + "ruleId": "R03", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t17", + "ruleId": "R03", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t18", + "ruleId": "R03", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t19", + "ruleId": "R03", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t20", + "ruleId": "R03", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t21", + "ruleId": "R03", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t22", + "ruleId": "R03", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t23", + "ruleId": "R03", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t24", + "ruleId": "R03", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t25", + "ruleId": "R03", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t26", + "ruleId": "R03", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t27", + "ruleId": "R03", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R03:t28", + "ruleId": "R03", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R04:t01", + "ruleId": "R04", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t02", + "ruleId": "R04", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t03", + "ruleId": "R04", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t04", + "ruleId": "R04", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t05", + "ruleId": "R04", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t06", + "ruleId": "R04", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R04:t07", + "ruleId": "R04", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t08", + "ruleId": "R04", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t09", + "ruleId": "R04", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t10", + "ruleId": "R04", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t11", + "ruleId": "R04", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t12", + "ruleId": "R04", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t13", + "ruleId": "R04", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R04:t14", + "ruleId": "R04", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t15", + "ruleId": "R04", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t16", + "ruleId": "R04", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t17", + "ruleId": "R04", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t18", + "ruleId": "R04", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t19", + "ruleId": "R04", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t20", + "ruleId": "R04", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t21", + "ruleId": "R04", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t22", + "ruleId": "R04", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t23", + "ruleId": "R04", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t24", + "ruleId": "R04", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R04:t25", + "ruleId": "R04", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t26", + "ruleId": "R04", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t27", + "ruleId": "R04", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R04:t28", + "ruleId": "R04", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t01", + "ruleId": "R05", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t02", + "ruleId": "R05", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t03", + "ruleId": "R05", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t04", + "ruleId": "R05", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t05", + "ruleId": "R05", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t06", + "ruleId": "R05", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 98, + "level": 3 + } + }, + { + "caseId": "R05:t07", + "ruleId": "R05", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t08", + "ruleId": "R05", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t09", + "ruleId": "R05", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t10", + "ruleId": "R05", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t11", + "ruleId": "R05", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t12", + "ruleId": "R05", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t13", + "ruleId": "R05", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R05:t14", + "ruleId": "R05", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t15", + "ruleId": "R05", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t16", + "ruleId": "R05", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t17", + "ruleId": "R05", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t18", + "ruleId": "R05", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t19", + "ruleId": "R05", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t20", + "ruleId": "R05", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t21", + "ruleId": "R05", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t22", + "ruleId": "R05", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t23", + "ruleId": "R05", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t24", + "ruleId": "R05", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R05:t25", + "ruleId": "R05", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R05:t26", + "ruleId": "R05", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t27", + "ruleId": "R05", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R05:t28", + "ruleId": "R05", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R06:t01", + "ruleId": "R06", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t02", + "ruleId": "R06", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t03", + "ruleId": "R06", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R06:t04", + "ruleId": "R06", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t05", + "ruleId": "R06", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t06", + "ruleId": "R06", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t07", + "ruleId": "R06", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t08", + "ruleId": "R06", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R06:t09", + "ruleId": "R06", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t10", + "ruleId": "R06", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t11", + "ruleId": "R06", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t12", + "ruleId": "R06", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R06:t13", + "ruleId": "R06", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R06:t14", + "ruleId": "R06", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t15", + "ruleId": "R06", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t16", + "ruleId": "R06", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t17", + "ruleId": "R06", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t18", + "ruleId": "R06", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t19", + "ruleId": "R06", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t20", + "ruleId": "R06", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t21", + "ruleId": "R06", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t22", + "ruleId": "R06", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t23", + "ruleId": "R06", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t24", + "ruleId": "R06", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t25", + "ruleId": "R06", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t26", + "ruleId": "R06", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t27", + "ruleId": "R06", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R06:t28", + "ruleId": "R06", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R07:t01", + "ruleId": "R07", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t02", + "ruleId": "R07", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t03", + "ruleId": "R07", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R07:t04", + "ruleId": "R07", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t05", + "ruleId": "R07", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t06", + "ruleId": "R07", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t07", + "ruleId": "R07", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t08", + "ruleId": "R07", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R07:t09", + "ruleId": "R07", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t10", + "ruleId": "R07", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t11", + "ruleId": "R07", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t12", + "ruleId": "R07", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R07:t13", + "ruleId": "R07", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R07:t14", + "ruleId": "R07", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t15", + "ruleId": "R07", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t16", + "ruleId": "R07", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t17", + "ruleId": "R07", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t18", + "ruleId": "R07", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t19", + "ruleId": "R07", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t20", + "ruleId": "R07", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t21", + "ruleId": "R07", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t22", + "ruleId": "R07", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t23", + "ruleId": "R07", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t24", + "ruleId": "R07", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t25", + "ruleId": "R07", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t26", + "ruleId": "R07", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t27", + "ruleId": "R07", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R07:t28", + "ruleId": "R07", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R08:t01", + "ruleId": "R08", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R08:t02", + "ruleId": "R08", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t03", + "ruleId": "R08", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t04", + "ruleId": "R08", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t05", + "ruleId": "R08", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t06", + "ruleId": "R08", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t07", + "ruleId": "R08", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t08", + "ruleId": "R08", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t09", + "ruleId": "R08", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t10", + "ruleId": "R08", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t11", + "ruleId": "R08", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R08:t12", + "ruleId": "R08", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t13", + "ruleId": "R08", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t14", + "ruleId": "R08", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t15", + "ruleId": "R08", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t16", + "ruleId": "R08", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t17", + "ruleId": "R08", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t18", + "ruleId": "R08", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t19", + "ruleId": "R08", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t20", + "ruleId": "R08", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t21", + "ruleId": "R08", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t22", + "ruleId": "R08", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t23", + "ruleId": "R08", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t24", + "ruleId": "R08", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t25", + "ruleId": "R08", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t26", + "ruleId": "R08", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R08:t27", + "ruleId": "R08", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R08:t28", + "ruleId": "R08", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R09:t01", + "ruleId": "R09", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R09:t02", + "ruleId": "R09", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t03", + "ruleId": "R09", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t04", + "ruleId": "R09", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t05", + "ruleId": "R09", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t06", + "ruleId": "R09", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t07", + "ruleId": "R09", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t08", + "ruleId": "R09", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t09", + "ruleId": "R09", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t10", + "ruleId": "R09", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t11", + "ruleId": "R09", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R09:t12", + "ruleId": "R09", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t13", + "ruleId": "R09", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t14", + "ruleId": "R09", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t15", + "ruleId": "R09", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t16", + "ruleId": "R09", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t17", + "ruleId": "R09", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t18", + "ruleId": "R09", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t19", + "ruleId": "R09", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t20", + "ruleId": "R09", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t21", + "ruleId": "R09", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t22", + "ruleId": "R09", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t23", + "ruleId": "R09", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t24", + "ruleId": "R09", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t25", + "ruleId": "R09", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t26", + "ruleId": "R09", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R09:t27", + "ruleId": "R09", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R09:t28", + "ruleId": "R09", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t01", + "ruleId": "R10", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t02", + "ruleId": "R10", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t03", + "ruleId": "R10", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t04", + "ruleId": "R10", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t05", + "ruleId": "R10", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t06", + "ruleId": "R10", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t07", + "ruleId": "R10", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t08", + "ruleId": "R10", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t09", + "ruleId": "R10", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t10", + "ruleId": "R10", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t11", + "ruleId": "R10", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t12", + "ruleId": "R10", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t13", + "ruleId": "R10", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t14", + "ruleId": "R10", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t15", + "ruleId": "R10", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t16", + "ruleId": "R10", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t17", + "ruleId": "R10", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t18", + "ruleId": "R10", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t19", + "ruleId": "R10", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t20", + "ruleId": "R10", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t21", + "ruleId": "R10", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t22", + "ruleId": "R10", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t23", + "ruleId": "R10", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t24", + "ruleId": "R10", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t25", + "ruleId": "R10", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t26", + "ruleId": "R10", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R10:t27", + "ruleId": "R10", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R10:t28", + "ruleId": "R10", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t01", + "ruleId": "R11", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t02", + "ruleId": "R11", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t03", + "ruleId": "R11", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t04", + "ruleId": "R11", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t05", + "ruleId": "R11", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t06", + "ruleId": "R11", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t07", + "ruleId": "R11", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t08", + "ruleId": "R11", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t09", + "ruleId": "R11", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t10", + "ruleId": "R11", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t11", + "ruleId": "R11", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t12", + "ruleId": "R11", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t13", + "ruleId": "R11", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t14", + "ruleId": "R11", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t15", + "ruleId": "R11", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t16", + "ruleId": "R11", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t17", + "ruleId": "R11", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t18", + "ruleId": "R11", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t19", + "ruleId": "R11", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t20", + "ruleId": "R11", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t21", + "ruleId": "R11", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t22", + "ruleId": "R11", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t23", + "ruleId": "R11", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t24", + "ruleId": "R11", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t25", + "ruleId": "R11", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t26", + "ruleId": "R11", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R11:t27", + "ruleId": "R11", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R11:t28", + "ruleId": "R11", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t01", + "ruleId": "R12", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t02", + "ruleId": "R12", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t03", + "ruleId": "R12", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t04", + "ruleId": "R12", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t05", + "ruleId": "R12", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t06", + "ruleId": "R12", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t07", + "ruleId": "R12", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t08", + "ruleId": "R12", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t09", + "ruleId": "R12", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t10", + "ruleId": "R12", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t11", + "ruleId": "R12", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t12", + "ruleId": "R12", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t13", + "ruleId": "R12", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t14", + "ruleId": "R12", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t15", + "ruleId": "R12", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t16", + "ruleId": "R12", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t17", + "ruleId": "R12", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t18", + "ruleId": "R12", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t19", + "ruleId": "R12", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t20", + "ruleId": "R12", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t21", + "ruleId": "R12", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t22", + "ruleId": "R12", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R12:t23", + "ruleId": "R12", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t24", + "ruleId": "R12", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t25", + "ruleId": "R12", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t26", + "ruleId": "R12", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R12:t27", + "ruleId": "R12", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R12:t28", + "ruleId": "R12", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R13:t01", + "ruleId": "R13", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t02", + "ruleId": "R13", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t03", + "ruleId": "R13", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t04", + "ruleId": "R13", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t05", + "ruleId": "R13", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t06", + "ruleId": "R13", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t07", + "ruleId": "R13", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t08", + "ruleId": "R13", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t09", + "ruleId": "R13", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t10", + "ruleId": "R13", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t11", + "ruleId": "R13", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t12", + "ruleId": "R13", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t13", + "ruleId": "R13", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t14", + "ruleId": "R13", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t15", + "ruleId": "R13", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t16", + "ruleId": "R13", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t17", + "ruleId": "R13", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t18", + "ruleId": "R13", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t19", + "ruleId": "R13", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t20", + "ruleId": "R13", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t21", + "ruleId": "R13", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t22", + "ruleId": "R13", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t23", + "ruleId": "R13", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t24", + "ruleId": "R13", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t25", + "ruleId": "R13", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t26", + "ruleId": "R13", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R13:t27", + "ruleId": "R13", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R13:t28", + "ruleId": "R13", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t01", + "ruleId": "R14", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t02", + "ruleId": "R14", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t03", + "ruleId": "R14", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t04", + "ruleId": "R14", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t05", + "ruleId": "R14", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t06", + "ruleId": "R14", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t07", + "ruleId": "R14", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t08", + "ruleId": "R14", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t09", + "ruleId": "R14", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t10", + "ruleId": "R14", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t11", + "ruleId": "R14", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t12", + "ruleId": "R14", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t13", + "ruleId": "R14", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t14", + "ruleId": "R14", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t15", + "ruleId": "R14", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t16", + "ruleId": "R14", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t17", + "ruleId": "R14", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t18", + "ruleId": "R14", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t19", + "ruleId": "R14", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t20", + "ruleId": "R14", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t21", + "ruleId": "R14", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t22", + "ruleId": "R14", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t23", + "ruleId": "R14", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t24", + "ruleId": "R14", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t25", + "ruleId": "R14", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t26", + "ruleId": "R14", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R14:t27", + "ruleId": "R14", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R14:t28", + "ruleId": "R14", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t01", + "ruleId": "R15", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t02", + "ruleId": "R15", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t03", + "ruleId": "R15", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t04", + "ruleId": "R15", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R15:t05", + "ruleId": "R15", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R15:t06", + "ruleId": "R15", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t07", + "ruleId": "R15", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t08", + "ruleId": "R15", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t09", + "ruleId": "R15", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t10", + "ruleId": "R15", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t11", + "ruleId": "R15", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t12", + "ruleId": "R15", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t13", + "ruleId": "R15", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t14", + "ruleId": "R15", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t15", + "ruleId": "R15", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R15:t16", + "ruleId": "R15", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t17", + "ruleId": "R15", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t18", + "ruleId": "R15", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t19", + "ruleId": "R15", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t20", + "ruleId": "R15", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t21", + "ruleId": "R15", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R15:t22", + "ruleId": "R15", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t23", + "ruleId": "R15", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R15:t24", + "ruleId": "R15", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t25", + "ruleId": "R15", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R15:t26", + "ruleId": "R15", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t27", + "ruleId": "R15", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R15:t28", + "ruleId": "R15", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t01", + "ruleId": "R16", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t02", + "ruleId": "R16", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t03", + "ruleId": "R16", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t04", + "ruleId": "R16", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t05", + "ruleId": "R16", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t06", + "ruleId": "R16", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t07", + "ruleId": "R16", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t08", + "ruleId": "R16", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t09", + "ruleId": "R16", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t10", + "ruleId": "R16", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t11", + "ruleId": "R16", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t12", + "ruleId": "R16", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t13", + "ruleId": "R16", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t14", + "ruleId": "R16", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t15", + "ruleId": "R16", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t16", + "ruleId": "R16", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t17", + "ruleId": "R16", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t18", + "ruleId": "R16", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t19", + "ruleId": "R16", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t20", + "ruleId": "R16", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t21", + "ruleId": "R16", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t22", + "ruleId": "R16", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t23", + "ruleId": "R16", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t24", + "ruleId": "R16", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t25", + "ruleId": "R16", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t26", + "ruleId": "R16", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R16:t27", + "ruleId": "R16", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R16:t28", + "ruleId": "R16", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t01", + "ruleId": "R17", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t02", + "ruleId": "R17", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t03", + "ruleId": "R17", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t04", + "ruleId": "R17", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t05", + "ruleId": "R17", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t06", + "ruleId": "R17", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t07", + "ruleId": "R17", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t08", + "ruleId": "R17", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t09", + "ruleId": "R17", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t10", + "ruleId": "R17", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t11", + "ruleId": "R17", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t12", + "ruleId": "R17", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t13", + "ruleId": "R17", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t14", + "ruleId": "R17", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t15", + "ruleId": "R17", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t16", + "ruleId": "R17", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t17", + "ruleId": "R17", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t18", + "ruleId": "R17", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t19", + "ruleId": "R17", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t20", + "ruleId": "R17", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t21", + "ruleId": "R17", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t22", + "ruleId": "R17", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t23", + "ruleId": "R17", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t24", + "ruleId": "R17", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R17:t25", + "ruleId": "R17", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t26", + "ruleId": "R17", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t27", + "ruleId": "R17", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R17:t28", + "ruleId": "R17", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t01", + "ruleId": "R18", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t02", + "ruleId": "R18", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t03", + "ruleId": "R18", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t04", + "ruleId": "R18", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t05", + "ruleId": "R18", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t06", + "ruleId": "R18", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t07", + "ruleId": "R18", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t08", + "ruleId": "R18", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t09", + "ruleId": "R18", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t10", + "ruleId": "R18", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t11", + "ruleId": "R18", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t12", + "ruleId": "R18", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t13", + "ruleId": "R18", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t14", + "ruleId": "R18", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t15", + "ruleId": "R18", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t16", + "ruleId": "R18", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t17", + "ruleId": "R18", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t18", + "ruleId": "R18", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t19", + "ruleId": "R18", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t20", + "ruleId": "R18", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t21", + "ruleId": "R18", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t22", + "ruleId": "R18", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t23", + "ruleId": "R18", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t24", + "ruleId": "R18", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t25", + "ruleId": "R18", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t26", + "ruleId": "R18", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R18:t27", + "ruleId": "R18", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R18:t28", + "ruleId": "R18", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t01", + "ruleId": "R19", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t02", + "ruleId": "R19", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t03", + "ruleId": "R19", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t04", + "ruleId": "R19", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t05", + "ruleId": "R19", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t06", + "ruleId": "R19", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t07", + "ruleId": "R19", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t08", + "ruleId": "R19", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t09", + "ruleId": "R19", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t10", + "ruleId": "R19", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t11", + "ruleId": "R19", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t12", + "ruleId": "R19", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t13", + "ruleId": "R19", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t14", + "ruleId": "R19", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t15", + "ruleId": "R19", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t16", + "ruleId": "R19", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t17", + "ruleId": "R19", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t18", + "ruleId": "R19", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t19", + "ruleId": "R19", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t20", + "ruleId": "R19", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t21", + "ruleId": "R19", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t22", + "ruleId": "R19", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t23", + "ruleId": "R19", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t24", + "ruleId": "R19", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t25", + "ruleId": "R19", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R19:t26", + "ruleId": "R19", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t27", + "ruleId": "R19", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R19:t28", + "ruleId": "R19", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t01", + "ruleId": "R20", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t02", + "ruleId": "R20", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R20:t03", + "ruleId": "R20", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t04", + "ruleId": "R20", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t05", + "ruleId": "R20", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R20:t06", + "ruleId": "R20", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t07", + "ruleId": "R20", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t08", + "ruleId": "R20", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t09", + "ruleId": "R20", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t10", + "ruleId": "R20", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t11", + "ruleId": "R20", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t12", + "ruleId": "R20", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t13", + "ruleId": "R20", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t14", + "ruleId": "R20", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t15", + "ruleId": "R20", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t16", + "ruleId": "R20", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t17", + "ruleId": "R20", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R20:t18", + "ruleId": "R20", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t19", + "ruleId": "R20", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t20", + "ruleId": "R20", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t21", + "ruleId": "R20", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t22", + "ruleId": "R20", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t23", + "ruleId": "R20", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R20:t24", + "ruleId": "R20", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t25", + "ruleId": "R20", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R20:t26", + "ruleId": "R20", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t27", + "ruleId": "R20", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R20:t28", + "ruleId": "R20", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t01", + "ruleId": "R21", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t02", + "ruleId": "R21", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t03", + "ruleId": "R21", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t04", + "ruleId": "R21", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t05", + "ruleId": "R21", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t06", + "ruleId": "R21", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t07", + "ruleId": "R21", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t08", + "ruleId": "R21", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t09", + "ruleId": "R21", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t10", + "ruleId": "R21", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t11", + "ruleId": "R21", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t12", + "ruleId": "R21", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t13", + "ruleId": "R21", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t14", + "ruleId": "R21", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t15", + "ruleId": "R21", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t16", + "ruleId": "R21", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t17", + "ruleId": "R21", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t18", + "ruleId": "R21", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t19", + "ruleId": "R21", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t20", + "ruleId": "R21", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t21", + "ruleId": "R21", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t22", + "ruleId": "R21", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t23", + "ruleId": "R21", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t24", + "ruleId": "R21", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t25", + "ruleId": "R21", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R21:t26", + "ruleId": "R21", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R21:t27", + "ruleId": "R21", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R21:t28", + "ruleId": "R21", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 99, + "level": 2 + } + }, + { + "caseId": "R22:t01", + "ruleId": "R22", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t02", + "ruleId": "R22", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t03", + "ruleId": "R22", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t04", + "ruleId": "R22", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t05", + "ruleId": "R22", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t06", + "ruleId": "R22", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t07", + "ruleId": "R22", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t08", + "ruleId": "R22", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t09", + "ruleId": "R22", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t10", + "ruleId": "R22", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t11", + "ruleId": "R22", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t12", + "ruleId": "R22", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t13", + "ruleId": "R22", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t14", + "ruleId": "R22", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t15", + "ruleId": "R22", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t16", + "ruleId": "R22", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t17", + "ruleId": "R22", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t18", + "ruleId": "R22", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t19", + "ruleId": "R22", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t20", + "ruleId": "R22", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t21", + "ruleId": "R22", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t22", + "ruleId": "R22", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t23", + "ruleId": "R22", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t24", + "ruleId": "R22", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t25", + "ruleId": "R22", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t26", + "ruleId": "R22", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R22:t27", + "ruleId": "R22", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R22:t28", + "ruleId": "R22", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t01", + "ruleId": "R23", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t02", + "ruleId": "R23", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t03", + "ruleId": "R23", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t04", + "ruleId": "R23", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t05", + "ruleId": "R23", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t06", + "ruleId": "R23", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t07", + "ruleId": "R23", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t08", + "ruleId": "R23", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t09", + "ruleId": "R23", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t10", + "ruleId": "R23", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t11", + "ruleId": "R23", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t12", + "ruleId": "R23", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t13", + "ruleId": "R23", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t14", + "ruleId": "R23", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t15", + "ruleId": "R23", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t16", + "ruleId": "R23", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t17", + "ruleId": "R23", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t18", + "ruleId": "R23", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t19", + "ruleId": "R23", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t20", + "ruleId": "R23", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t21", + "ruleId": "R23", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t22", + "ruleId": "R23", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t23", + "ruleId": "R23", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t24", + "ruleId": "R23", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t25", + "ruleId": "R23", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t26", + "ruleId": "R23", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t27", + "ruleId": "R23", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R23:t28", + "ruleId": "R23", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t01", + "ruleId": "R24", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t02", + "ruleId": "R24", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t03", + "ruleId": "R24", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t04", + "ruleId": "R24", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t05", + "ruleId": "R24", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t06", + "ruleId": "R24", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t07", + "ruleId": "R24", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t08", + "ruleId": "R24", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t09", + "ruleId": "R24", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t10", + "ruleId": "R24", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t11", + "ruleId": "R24", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t12", + "ruleId": "R24", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t13", + "ruleId": "R24", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t14", + "ruleId": "R24", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t15", + "ruleId": "R24", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t16", + "ruleId": "R24", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t17", + "ruleId": "R24", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t18", + "ruleId": "R24", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t19", + "ruleId": "R24", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t20", + "ruleId": "R24", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t21", + "ruleId": "R24", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t22", + "ruleId": "R24", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t23", + "ruleId": "R24", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t24", + "ruleId": "R24", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t25", + "ruleId": "R24", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t26", + "ruleId": "R24", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R24:t27", + "ruleId": "R24", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R24:t28", + "ruleId": "R24", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t01", + "ruleId": "R25", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t02", + "ruleId": "R25", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R25:t03", + "ruleId": "R25", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t04", + "ruleId": "R25", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t05", + "ruleId": "R25", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t06", + "ruleId": "R25", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t07", + "ruleId": "R25", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t08", + "ruleId": "R25", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t09", + "ruleId": "R25", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t10", + "ruleId": "R25", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t11", + "ruleId": "R25", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t12", + "ruleId": "R25", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t13", + "ruleId": "R25", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t14", + "ruleId": "R25", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t15", + "ruleId": "R25", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t16", + "ruleId": "R25", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t17", + "ruleId": "R25", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t18", + "ruleId": "R25", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t19", + "ruleId": "R25", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t20", + "ruleId": "R25", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t21", + "ruleId": "R25", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t22", + "ruleId": "R25", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t23", + "ruleId": "R25", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t24", + "ruleId": "R25", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t25", + "ruleId": "R25", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t26", + "ruleId": "R25", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t27", + "ruleId": "R25", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R25:t28", + "ruleId": "R25", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t01", + "ruleId": "R26", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t02", + "ruleId": "R26", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t03", + "ruleId": "R26", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t04", + "ruleId": "R26", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t05", + "ruleId": "R26", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t06", + "ruleId": "R26", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t07", + "ruleId": "R26", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t08", + "ruleId": "R26", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t09", + "ruleId": "R26", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t10", + "ruleId": "R26", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t11", + "ruleId": "R26", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t12", + "ruleId": "R26", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t13", + "ruleId": "R26", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t14", + "ruleId": "R26", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t15", + "ruleId": "R26", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t16", + "ruleId": "R26", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t17", + "ruleId": "R26", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t18", + "ruleId": "R26", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t19", + "ruleId": "R26", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t20", + "ruleId": "R26", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t21", + "ruleId": "R26", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t22", + "ruleId": "R26", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t23", + "ruleId": "R26", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t24", + "ruleId": "R26", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t25", + "ruleId": "R26", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t26", + "ruleId": "R26", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "R26:t27", + "ruleId": "R26", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "R26:t28", + "ruleId": "R26", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t01", + "ruleId": "N01", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t02", + "ruleId": "N01", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t03", + "ruleId": "N01", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t04", + "ruleId": "N01", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t05", + "ruleId": "N01", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t06", + "ruleId": "N01", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t07", + "ruleId": "N01", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t08", + "ruleId": "N01", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t09", + "ruleId": "N01", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t10", + "ruleId": "N01", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t11", + "ruleId": "N01", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t12", + "ruleId": "N01", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t13", + "ruleId": "N01", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t14", + "ruleId": "N01", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t15", + "ruleId": "N01", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t16", + "ruleId": "N01", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t17", + "ruleId": "N01", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t18", + "ruleId": "N01", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t19", + "ruleId": "N01", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t20", + "ruleId": "N01", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t21", + "ruleId": "N01", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t22", + "ruleId": "N01", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t23", + "ruleId": "N01", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t24", + "ruleId": "N01", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t25", + "ruleId": "N01", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N01:t26", + "ruleId": "N01", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t27", + "ruleId": "N01", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N01:t28", + "ruleId": "N01", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t01", + "ruleId": "N02", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t02", + "ruleId": "N02", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t03", + "ruleId": "N02", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t04", + "ruleId": "N02", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t05", + "ruleId": "N02", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t06", + "ruleId": "N02", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t07", + "ruleId": "N02", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t08", + "ruleId": "N02", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t09", + "ruleId": "N02", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t10", + "ruleId": "N02", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t11", + "ruleId": "N02", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t12", + "ruleId": "N02", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t13", + "ruleId": "N02", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t14", + "ruleId": "N02", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t15", + "ruleId": "N02", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t16", + "ruleId": "N02", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t17", + "ruleId": "N02", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t18", + "ruleId": "N02", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t19", + "ruleId": "N02", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t20", + "ruleId": "N02", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t21", + "ruleId": "N02", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t22", + "ruleId": "N02", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t23", + "ruleId": "N02", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t24", + "ruleId": "N02", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t25", + "ruleId": "N02", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t26", + "ruleId": "N02", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N02:t27", + "ruleId": "N02", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N02:t28", + "ruleId": "N02", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t01", + "ruleId": "N03", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t02", + "ruleId": "N03", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t03", + "ruleId": "N03", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t04", + "ruleId": "N03", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t05", + "ruleId": "N03", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t06", + "ruleId": "N03", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t07", + "ruleId": "N03", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t08", + "ruleId": "N03", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t09", + "ruleId": "N03", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t10", + "ruleId": "N03", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t11", + "ruleId": "N03", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t12", + "ruleId": "N03", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t13", + "ruleId": "N03", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t14", + "ruleId": "N03", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t15", + "ruleId": "N03", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t16", + "ruleId": "N03", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t17", + "ruleId": "N03", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t18", + "ruleId": "N03", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N03:t19", + "ruleId": "N03", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t20", + "ruleId": "N03", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t21", + "ruleId": "N03", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t22", + "ruleId": "N03", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t23", + "ruleId": "N03", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t24", + "ruleId": "N03", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t25", + "ruleId": "N03", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t26", + "ruleId": "N03", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t27", + "ruleId": "N03", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N03:t28", + "ruleId": "N03", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t01", + "ruleId": "N04", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t02", + "ruleId": "N04", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N04:t03", + "ruleId": "N04", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t04", + "ruleId": "N04", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t05", + "ruleId": "N04", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t06", + "ruleId": "N04", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t07", + "ruleId": "N04", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t08", + "ruleId": "N04", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t09", + "ruleId": "N04", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t10", + "ruleId": "N04", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t11", + "ruleId": "N04", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t12", + "ruleId": "N04", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t13", + "ruleId": "N04", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t14", + "ruleId": "N04", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t15", + "ruleId": "N04", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t16", + "ruleId": "N04", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t17", + "ruleId": "N04", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t18", + "ruleId": "N04", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t19", + "ruleId": "N04", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t20", + "ruleId": "N04", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t21", + "ruleId": "N04", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t22", + "ruleId": "N04", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t23", + "ruleId": "N04", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t24", + "ruleId": "N04", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t25", + "ruleId": "N04", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t26", + "ruleId": "N04", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t27", + "ruleId": "N04", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N04:t28", + "ruleId": "N04", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t01", + "ruleId": "N05", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t02", + "ruleId": "N05", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t03", + "ruleId": "N05", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t04", + "ruleId": "N05", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N05:t05", + "ruleId": "N05", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t06", + "ruleId": "N05", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t07", + "ruleId": "N05", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t08", + "ruleId": "N05", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t09", + "ruleId": "N05", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t10", + "ruleId": "N05", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t11", + "ruleId": "N05", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t12", + "ruleId": "N05", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t13", + "ruleId": "N05", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t14", + "ruleId": "N05", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t15", + "ruleId": "N05", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t16", + "ruleId": "N05", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N05:t17", + "ruleId": "N05", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t18", + "ruleId": "N05", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t19", + "ruleId": "N05", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t20", + "ruleId": "N05", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t21", + "ruleId": "N05", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t22", + "ruleId": "N05", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t23", + "ruleId": "N05", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t24", + "ruleId": "N05", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t25", + "ruleId": "N05", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t26", + "ruleId": "N05", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N05:t27", + "ruleId": "N05", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N05:t28", + "ruleId": "N05", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t01", + "ruleId": "N06", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t02", + "ruleId": "N06", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t03", + "ruleId": "N06", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t04", + "ruleId": "N06", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t05", + "ruleId": "N06", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t06", + "ruleId": "N06", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t07", + "ruleId": "N06", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t08", + "ruleId": "N06", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t09", + "ruleId": "N06", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t10", + "ruleId": "N06", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t11", + "ruleId": "N06", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t12", + "ruleId": "N06", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t13", + "ruleId": "N06", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t14", + "ruleId": "N06", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t15", + "ruleId": "N06", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t16", + "ruleId": "N06", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t17", + "ruleId": "N06", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t18", + "ruleId": "N06", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t19", + "ruleId": "N06", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t20", + "ruleId": "N06", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t21", + "ruleId": "N06", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t22", + "ruleId": "N06", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t23", + "ruleId": "N06", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t24", + "ruleId": "N06", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t25", + "ruleId": "N06", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t26", + "ruleId": "N06", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N06:t27", + "ruleId": "N06", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N06:t28", + "ruleId": "N06", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N07:t01", + "ruleId": "N07", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t02", + "ruleId": "N07", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t03", + "ruleId": "N07", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t04", + "ruleId": "N07", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t05", + "ruleId": "N07", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t06", + "ruleId": "N07", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t07", + "ruleId": "N07", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t08", + "ruleId": "N07", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t09", + "ruleId": "N07", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t10", + "ruleId": "N07", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t11", + "ruleId": "N07", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t12", + "ruleId": "N07", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t13", + "ruleId": "N07", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t14", + "ruleId": "N07", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t15", + "ruleId": "N07", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t16", + "ruleId": "N07", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t17", + "ruleId": "N07", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t18", + "ruleId": "N07", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t19", + "ruleId": "N07", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t20", + "ruleId": "N07", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t21", + "ruleId": "N07", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t22", + "ruleId": "N07", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t23", + "ruleId": "N07", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t24", + "ruleId": "N07", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t25", + "ruleId": "N07", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N07:t26", + "ruleId": "N07", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t27", + "ruleId": "N07", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N07:t28", + "ruleId": "N07", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N08:t01", + "ruleId": "N08", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N08:t02", + "ruleId": "N08", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t03", + "ruleId": "N08", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t04", + "ruleId": "N08", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t05", + "ruleId": "N08", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t06", + "ruleId": "N08", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t07", + "ruleId": "N08", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N08:t08", + "ruleId": "N08", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t09", + "ruleId": "N08", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t10", + "ruleId": "N08", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t11", + "ruleId": "N08", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t12", + "ruleId": "N08", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t13", + "ruleId": "N08", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t14", + "ruleId": "N08", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t15", + "ruleId": "N08", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t16", + "ruleId": "N08", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t17", + "ruleId": "N08", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t18", + "ruleId": "N08", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t19", + "ruleId": "N08", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t20", + "ruleId": "N08", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t21", + "ruleId": "N08", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t22", + "ruleId": "N08", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t23", + "ruleId": "N08", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t24", + "ruleId": "N08", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t25", + "ruleId": "N08", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t26", + "ruleId": "N08", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t27", + "ruleId": "N08", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N08:t28", + "ruleId": "N08", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t01", + "ruleId": "N09", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t02", + "ruleId": "N09", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t03", + "ruleId": "N09", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t04", + "ruleId": "N09", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t05", + "ruleId": "N09", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t06", + "ruleId": "N09", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t07", + "ruleId": "N09", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t08", + "ruleId": "N09", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t09", + "ruleId": "N09", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t10", + "ruleId": "N09", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t11", + "ruleId": "N09", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t12", + "ruleId": "N09", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t13", + "ruleId": "N09", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t14", + "ruleId": "N09", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t15", + "ruleId": "N09", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t16", + "ruleId": "N09", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t17", + "ruleId": "N09", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t18", + "ruleId": "N09", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t19", + "ruleId": "N09", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t20", + "ruleId": "N09", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t21", + "ruleId": "N09", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t22", + "ruleId": "N09", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t23", + "ruleId": "N09", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t24", + "ruleId": "N09", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t25", + "ruleId": "N09", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t26", + "ruleId": "N09", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t27", + "ruleId": "N09", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N09:t28", + "ruleId": "N09", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N10:t01", + "ruleId": "N10", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t02", + "ruleId": "N10", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t03", + "ruleId": "N10", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t04", + "ruleId": "N10", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t05", + "ruleId": "N10", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t06", + "ruleId": "N10", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t07", + "ruleId": "N10", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t08", + "ruleId": "N10", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t09", + "ruleId": "N10", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t10", + "ruleId": "N10", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t11", + "ruleId": "N10", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t12", + "ruleId": "N10", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t13", + "ruleId": "N10", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t14", + "ruleId": "N10", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t15", + "ruleId": "N10", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t16", + "ruleId": "N10", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t17", + "ruleId": "N10", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t18", + "ruleId": "N10", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t19", + "ruleId": "N10", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t20", + "ruleId": "N10", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t21", + "ruleId": "N10", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t22", + "ruleId": "N10", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t23", + "ruleId": "N10", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t24", + "ruleId": "N10", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t25", + "ruleId": "N10", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t26", + "ruleId": "N10", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t27", + "ruleId": "N10", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N10:t28", + "ruleId": "N10", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t01", + "ruleId": "N11", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t02", + "ruleId": "N11", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t03", + "ruleId": "N11", + "torrentId": "t03", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t04", + "ruleId": "N11", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t05", + "ruleId": "N11", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t06", + "ruleId": "N11", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t07", + "ruleId": "N11", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t08", + "ruleId": "N11", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t09", + "ruleId": "N11", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t10", + "ruleId": "N11", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t11", + "ruleId": "N11", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t12", + "ruleId": "N11", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t13", + "ruleId": "N11", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t14", + "ruleId": "N11", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t15", + "ruleId": "N11", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t16", + "ruleId": "N11", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t17", + "ruleId": "N11", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t18", + "ruleId": "N11", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t19", + "ruleId": "N11", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t20", + "ruleId": "N11", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t21", + "ruleId": "N11", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t22", + "ruleId": "N11", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N11:t23", + "ruleId": "N11", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t24", + "ruleId": "N11", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t25", + "ruleId": "N11", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t26", + "ruleId": "N11", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t27", + "ruleId": "N11", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N11:t28", + "ruleId": "N11", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t01", + "ruleId": "N12", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t02", + "ruleId": "N12", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t03", + "ruleId": "N12", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t04", + "ruleId": "N12", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t05", + "ruleId": "N12", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t06", + "ruleId": "N12", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t07", + "ruleId": "N12", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t08", + "ruleId": "N12", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t09", + "ruleId": "N12", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t10", + "ruleId": "N12", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t11", + "ruleId": "N12", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t12", + "ruleId": "N12", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t13", + "ruleId": "N12", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t14", + "ruleId": "N12", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t15", + "ruleId": "N12", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t16", + "ruleId": "N12", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t17", + "ruleId": "N12", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t18", + "ruleId": "N12", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t19", + "ruleId": "N12", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t20", + "ruleId": "N12", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t21", + "ruleId": "N12", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t22", + "ruleId": "N12", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t23", + "ruleId": "N12", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t24", + "ruleId": "N12", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t25", + "ruleId": "N12", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N12:t26", + "ruleId": "N12", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t27", + "ruleId": "N12", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N12:t28", + "ruleId": "N12", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t01", + "ruleId": "N13", + "torrentId": "t01", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N13:t02", + "ruleId": "N13", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t03", + "ruleId": "N13", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t04", + "ruleId": "N13", + "torrentId": "t04", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t05", + "ruleId": "N13", + "torrentId": "t05", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t06", + "ruleId": "N13", + "torrentId": "t06", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t07", + "ruleId": "N13", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t08", + "ruleId": "N13", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t09", + "ruleId": "N13", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t10", + "ruleId": "N13", + "torrentId": "t10", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t11", + "ruleId": "N13", + "torrentId": "t11", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t12", + "ruleId": "N13", + "torrentId": "t12", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t13", + "ruleId": "N13", + "torrentId": "t13", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t14", + "ruleId": "N13", + "torrentId": "t14", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t15", + "ruleId": "N13", + "torrentId": "t15", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t16", + "ruleId": "N13", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t17", + "ruleId": "N13", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t18", + "ruleId": "N13", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t19", + "ruleId": "N13", + "torrentId": "t19", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t20", + "ruleId": "N13", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t21", + "ruleId": "N13", + "torrentId": "t21", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t22", + "ruleId": "N13", + "torrentId": "t22", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t23", + "ruleId": "N13", + "torrentId": "t23", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t24", + "ruleId": "N13", + "torrentId": "t24", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t25", + "ruleId": "N13", + "torrentId": "t25", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t26", + "ruleId": "N13", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N13:t27", + "ruleId": "N13", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N13:t28", + "ruleId": "N13", + "torrentId": "t28", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N14:t01", + "ruleId": "N14", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N14:t02", + "ruleId": "N14", + "torrentId": "t02", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t03", + "ruleId": "N14", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N14:t04", + "ruleId": "N14", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t05", + "ruleId": "N14", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t06", + "ruleId": "N14", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t07", + "ruleId": "N14", + "torrentId": "t07", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t08", + "ruleId": "N14", + "torrentId": "t08", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t09", + "ruleId": "N14", + "torrentId": "t09", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t10", + "ruleId": "N14", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t11", + "ruleId": "N14", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t12", + "ruleId": "N14", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t13", + "ruleId": "N14", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t14", + "ruleId": "N14", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t15", + "ruleId": "N14", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t16", + "ruleId": "N14", + "torrentId": "t16", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t17", + "ruleId": "N14", + "torrentId": "t17", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t18", + "ruleId": "N14", + "torrentId": "t18", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t19", + "ruleId": "N14", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t20", + "ruleId": "N14", + "torrentId": "t20", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t21", + "ruleId": "N14", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t22", + "ruleId": "N14", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t23", + "ruleId": "N14", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t24", + "ruleId": "N14", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t25", + "ruleId": "N14", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t26", + "ruleId": "N14", + "torrentId": "t26", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t27", + "ruleId": "N14", + "torrentId": "t27", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N14:t28", + "ruleId": "N14", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t01", + "ruleId": "N15", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t02", + "ruleId": "N15", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t03", + "ruleId": "N15", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t04", + "ruleId": "N15", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t05", + "ruleId": "N15", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t06", + "ruleId": "N15", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t07", + "ruleId": "N15", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t08", + "ruleId": "N15", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t09", + "ruleId": "N15", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t10", + "ruleId": "N15", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t11", + "ruleId": "N15", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t12", + "ruleId": "N15", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t13", + "ruleId": "N15", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t14", + "ruleId": "N15", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t15", + "ruleId": "N15", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t16", + "ruleId": "N15", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t17", + "ruleId": "N15", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t18", + "ruleId": "N15", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t19", + "ruleId": "N15", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t20", + "ruleId": "N15", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t21", + "ruleId": "N15", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t22", + "ruleId": "N15", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t23", + "ruleId": "N15", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t24", + "ruleId": "N15", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t25", + "ruleId": "N15", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N15:t26", + "ruleId": "N15", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t27", + "ruleId": "N15", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N15:t28", + "ruleId": "N15", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t01", + "ruleId": "N16", + "torrentId": "t01", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t02", + "ruleId": "N16", + "torrentId": "t02", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t03", + "ruleId": "N16", + "torrentId": "t03", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t04", + "ruleId": "N16", + "torrentId": "t04", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t05", + "ruleId": "N16", + "torrentId": "t05", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t06", + "ruleId": "N16", + "torrentId": "t06", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t07", + "ruleId": "N16", + "torrentId": "t07", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t08", + "ruleId": "N16", + "torrentId": "t08", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t09", + "ruleId": "N16", + "torrentId": "t09", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t10", + "ruleId": "N16", + "torrentId": "t10", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t11", + "ruleId": "N16", + "torrentId": "t11", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t12", + "ruleId": "N16", + "torrentId": "t12", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t13", + "ruleId": "N16", + "torrentId": "t13", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t14", + "ruleId": "N16", + "torrentId": "t14", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t15", + "ruleId": "N16", + "torrentId": "t15", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t16", + "ruleId": "N16", + "torrentId": "t16", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t17", + "ruleId": "N16", + "torrentId": "t17", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t18", + "ruleId": "N16", + "torrentId": "t18", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t19", + "ruleId": "N16", + "torrentId": "t19", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t20", + "ruleId": "N16", + "torrentId": "t20", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t21", + "ruleId": "N16", + "torrentId": "t21", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t22", + "ruleId": "N16", + "torrentId": "t22", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t23", + "ruleId": "N16", + "torrentId": "t23", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t24", + "ruleId": "N16", + "torrentId": "t24", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t25", + "ruleId": "N16", + "torrentId": "t25", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + }, + { + "caseId": "N16:t26", + "ruleId": "N16", + "torrentId": "t26", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t27", + "ruleId": "N16", + "torrentId": "t27", + "mp": { + "matched": true, + "priOrder": 100, + "level": 1 + } + }, + { + "caseId": "N16:t28", + "ruleId": "N16", + "torrentId": "t28", + "mp": { + "matched": false, + "priOrder": null, + "level": null + } + } + ], + "deviations": { + "R06:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": 1, + "ours": null + }, + "R06:t08": { + "kind": "mp_bug", + "note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行", + "mp": 1, + "ours": null + }, + "R06:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": 1, + "ours": null + }, + "R07:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R07:t08": { + "kind": "mp_bug", + "note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行", + "mp": null, + "ours": 1 + }, + "R07:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R11:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R11:t08": { + "kind": "mp_bug", + "note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行", + "mp": null, + "ours": 1 + }, + "R11:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R13:t17": { + "kind": "our_bug", + "note": "副标题「CHS/ENG」:MP CNSUB 命中 chs/cht 词;parseRelease 字幕扫描只认中文关键词,未识别 CHS/CHT/GB/BIG5", + "mp": 1, + "ours": null + }, + "R13:t26": { + "kind": "mp_bug", + "note": "副标题「国语」(音轨语言)被 MP CNSUB 正则当作中文字幕;我们把国语视为音轨,不满足 requiredSubtitles", + "mp": 1, + "ours": null + }, + "R14:t17": { + "kind": "our_bug", + "note": "副标题「CHS/ENG」:MP CNSUB 命中 chs/cht 词;parseRelease 字幕扫描只认中文关键词,未识别 CHS/CHT/GB/BIG5", + "mp": 1, + "ours": null + }, + "R14:t26": { + "kind": "mp_bug", + "note": "副标题「国语」(音轨语言)被 MP CNSUB 正则当作中文字幕;我们把国语视为音轨,不满足 requiredSubtitles", + "mp": 1, + "ours": null + }, + "R16:t09": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": 1, + "ours": null + }, + "R16:t23": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": 1, + "ours": null + }, + "R17:t09": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": 1, + "ours": null + }, + "R17:t23": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": 1, + "ours": null + }, + "R18:t09": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": 1, + "ours": null + }, + "R19:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R19:t08": { + "kind": "mp_bug", + "note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行", + "mp": null, + "ours": 1 + }, + "R19:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R20:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R20:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R21:t03": { + "kind": "our_bug", + "note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 1 + }, + "R21:t08": { + "kind": "mp_bug", + "note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行", + "mp": null, + "ours": 1 + }, + "R21:t12": { + "kind": "our_bug", + "note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc", + "mp": null, + "ours": 2 + }, + "R23:t01": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t03": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t06": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t07": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t08": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t10": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t11": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t12": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t13": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t14": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t17": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t18": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t19": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t20": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t22": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t24": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t25": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t26": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R23:t27": { + "kind": "missing", + "note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件", + "mp": 1, + "ours": null + }, + "R24:t01": { + "kind": "not_expressible", + "note": "!DOLBY 无法表达:HDR 只在 soft.hdr(偏好),硬条件无 HDR/DV 排除", + "mp": null, + "ours": 1 + }, + "R24:t02": { + "kind": "not_expressible", + "note": "!DOLBY 无法表达:HDR 只在 soft.hdr(偏好),硬条件无 HDR/DV 排除", + "mp": null, + "ours": 1 + }, + "R24:t03": { + "kind": "not_expressible", + "note": "!DOLBY 无法表达:HDR 只在 soft.hdr(偏好),硬条件无 HDR/DV 排除", + "mp": null, + "ours": 1 + }, + "R24:t07": { + "kind": "not_expressible", + "note": "!DOLBY 无法表达:HDR 只在 soft.hdr(偏好),硬条件无 HDR/DV 排除", + "mp": null, + "ours": 1 + }, + "R24:t27": { + "kind": "not_expressible", + "note": "!DOLBY 无法表达:HDR 只在 soft.hdr(偏好),硬条件无 HDR/DV 排除", + "mp": null, + "ours": 1 + }, + "R25:t04": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t05": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t09": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t15": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t16": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t21": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t23": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R25:t28": { + "kind": "not_expressible", + "note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件", + "mp": null, + "ours": 1 + }, + "R26:t09": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": null, + "ours": 1 + }, + "R26:t23": { + "kind": "missing", + "note": "MP size_range 按每集大小(总大小 / MetaInfo.total_episode)判断;Slot min/maxSizeBytes 按总大小", + "mp": null, + "ours": 1 + }, + "R05~rank": { + "kind": "intentional", + "note": "单 Slot 允许多分辨率时 rankForSlot 先按来源等级再按分辨率,1080p 蓝光/REMUX 排在 2160p WEB-DL 之前;MP `4K > 1080P` 是用户定义的层级顺序。要复现 MP 语义需多层 Slot(本测试 R05 按层级翻译时一致)或给 Slot 增加用户优先级阶梯", + "pairs": [ + "t07>t05", + "t07>t11", + "t07>t12", + "t07>t23", + "t07>t25", + "t08>t04", + "t08>t05", + "t08>t06", + "t08>t10", + "t08>t11", + "t08>t12", + "t08>t14", + "t08>t15", + "t08>t19", + "t08>t21", + "t08>t22", + "t08>t23", + "t08>t25", + "t08>t28", + "t09>t05", + "t09>t11", + "t09>t12", + "t09>t23", + "t09>t25", + "t16>t05", + "t16>t11", + "t16>t12", + "t16>t23", + "t16>t25", + "t18>t05", + "t18>t11", + "t18>t12", + "t18>t23", + "t18>t25", + "t20>t05", + "t20>t11", + "t20>t12", + "t20>t23", + "t20>t25", + "t26>t05", + "t26>t11", + "t26>t12", + "t26>t23", + "t26>t25" + ] + } + } +} diff --git a/packages/domain/test/differential/filter.test.ts b/packages/domain/test/differential/filter.test.ts new file mode 100644 index 00000000..a339f456 --- /dev/null +++ b/packages/domain/test/differential/filter.test.ts @@ -0,0 +1,207 @@ +/** + * MoviePilot 过滤规则 vs Slot 差分测试。 + * + * filter-cases.json 由 MP 的 Python 回退实现生成(见 generatedFrom)。这里把可表达的规则 + * 手工翻译成 SlotSpec(每个 `>` 优先级层级一个 Slot),用 parseRelease + evaluateCandidate + * 求"首个 accept 的层级",与 MP 的 level 比对。 + * + * 断言:不一致集合 == deviations 登记集合。补迁消除差异后测试会失败,提醒删登记。 + */ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; +import { + evaluateCandidate, + type ParsedRelease, + parseRelease, + type ReleaseSource, + rankForSlot, + type SlotSpec, +} from "../../src/index.ts"; + +interface Torrent { + id: string; + title: string; + description: string; + size: number; + seeders: number; +} +interface Rule { + id: string; + rule: string; + verdict: "full" | "partial" | "none"; +} +interface Case { + caseId: string; + ruleId: string; + torrentId: string; + mp: { matched: boolean; priOrder: number | null; level: number | null }; +} +type DeviationKind = "intentional" | "missing" | "our_bug" | "mp_bug" | "not_expressible"; +interface Deviation { + kind: DeviationKind; + note: string; + pairs?: string[]; +} +interface Fixture { + generatedFrom: { commit: string; rustCrossCheck: { mismatches: unknown[] } }; + torrents: Torrent[]; + rules: Rule[]; + cases: Case[]; + deviations: Record<string, Deviation>; +} + +const fx = JSON.parse(readFileSync(new URL("./filter-cases.json", import.meta.url), "utf8")) as Fixture; + +// ---------------------------------------------------------------- MP 关键字 → Slot 片段 +const MB = 1024 * 1024; // MP size_range 单位 MB = 1024*1024 字节 +const ALL: ReleaseSource[] = ["REMUX", "BluRay", "BluRay-Disc", "WEB-DL", "WEBRip", "HDTV", "HDRip", "DVD", "DVDRip"]; +const without = (...xs: ReleaseSource[]) => ALL.filter((s) => !xs.includes(s)); + +type Frag = Pick<SlotSpec, "hard"> & { unknown?: Partial<Record<string, "reject" | "accept">> }; +const RES_4K: Frag = { hard: { resolutions: ["2160p"] }, unknown: { resolution: "reject" } }; +const RES_1080: Frag = { hard: { resolutions: ["1080p", "1080i"] }, unknown: { resolution: "reject" } }; +const RES_720: Frag = { hard: { resolutions: ["720p"] }, unknown: { resolution: "reject" } }; +/** 正向来源条件:来源未知 = MP 正则不命中 = 拒绝 */ +const srcIs = (...s: ReleaseSource[]): Frag => ({ hard: { sources: s }, unknown: { source: "reject" } }); +/** 取反来源条件:来源未知 = MP 正则不命中 = !X 为真 = 放行 */ +const srcNot = (...s: ReleaseSource[]): Frag => ({ hard: { sources: without(...s) }, unknown: { source: "accept" } }); +const CNSUB: Frag = { hard: { requiredSubtitles: ["zh"] }, unknown: { subtitles: "reject" } }; +const size = (min?: number, max?: number): Frag => ({ + hard: { + minSizeBytes: min !== undefined ? min * MB : undefined, + maxSizeBytes: max !== undefined ? max * MB : undefined, + }, +}); + +/** AND 合并片段(同字段取交集由调用方保证不冲突) */ +function and(...fs: Frag[]): SlotSpec { + const hard: SlotSpec["hard"] = {}; + const unknown: Record<string, "reject" | "accept"> = {}; + for (const f of fs) { + for (const [k, v] of Object.entries(f.hard)) if (v !== undefined) (hard as Record<string, unknown>)[k] = v; + Object.assign(unknown, f.unknown); + } + return { name: "mp", hard, unknownPolicy: { ...unknown } }; +} + +/** 每条规则 → 各优先级层级的 SlotSpec(verdict=none 的规则不翻译) */ +const TRANSLATE: Record<string, SlotSpec[]> = { + R01: [and(RES_4K)], + R02: [and(RES_1080)], + R03: [and(RES_720)], + R04: [and({ hard: { resolutions: ["2160p", "1080p", "1080i"] }, unknown: { resolution: "reject" } })], + R05: [and(RES_4K), and(RES_1080), and(RES_720)], + R06: [and(srcIs("BluRay-Disc"))], + R07: [and(srcNot("BluRay-Disc"))], + R08: [and(srcIs("REMUX"))], + R09: [and(srcNot("REMUX"))], + R10: [and(srcIs("WEB-DL", "WEBRip"))], + R11: [and(srcNot("BluRay-Disc", "REMUX"))], + R12: [and(RES_4K, srcNot("REMUX")), and(RES_1080, srcIs("WEB-DL", "WEBRip"))], + R13: [and(CNSUB)], + R14: [and(CNSUB, RES_4K, srcNot("BluRay-Disc"))], + R15: [and(CNSUB, RES_1080), and(RES_1080)], + R16: [and(size(2000, 30000))], + R17: [and(size(undefined, 8000))], + R18: [and(RES_4K, size(2000, 30000))], + R19: [and(srcNot("BluRay-Disc", "REMUX", "WEB-DL", "WEBRip"))], + R20: [and({ hard: { sources: ["BluRay"], requireEncode: true }, unknown: { source: "reject" } })], + R21: [and(RES_4K, srcNot("BluRay-Disc", "REMUX")), and(RES_1080, srcNot("BluRay-Disc", "REMUX"))], + R22: [ + and( + { hard: { resolutions: ["2160p", "1080p", "1080i"] }, unknown: { resolution: "reject" } }, + srcIs("WEB-DL", "WEBRip"), + ), + ], + // partial:近似翻译 + R23: [and(CNSUB)], // 无 TMDB 原语种放行 + R24: [and(RES_4K)], // 无 !DOLBY + R25: [and(CNSUB, srcNot("BluRay-Disc"))], // 无 SPECSUB + R26: [and(size(20000))], +}; + +const parsed = new Map<string, ParsedRelease>( + fx.torrents.map((t) => [ + t.id, + { ...parseRelease(t.title, t.description ? { subtitle: t.description } : {}), sizeBytes: t.size }, + ]), +); + +function ourLevel(ruleId: string, torrentId: string): number | null { + const levels = TRANSLATE[ruleId]!; + const r = parsed.get(torrentId)!; + for (let i = 0; i < levels.length; i++) if (evaluateCandidate(levels[i]!, r).decision === "accept") return i + 1; + return null; +} + +// ---------------------------------------------------------------- 排序语义:单 Slot + rankForSlot vs MP 优先级 +/** MP `4K > 1080P > 720P` 用单个 Slot(允许三种分辨率)+ rankForSlot 表达时的逆序对 */ +const RANK_CHECKS: Record<string, { rule: string; spec: SlotSpec }> = { + "R05~rank": { + rule: "R05", + spec: and({ hard: { resolutions: ["2160p", "1080p", "1080i", "720p"] }, unknown: { resolution: "reject" } }), + }, +}; + +function rankInversions(key: string): string[] { + const { rule, spec } = RANK_CHECKS[key]!; + const level = new Map(fx.cases.filter((c) => c.ruleId === rule).map((c) => [c.torrentId, c.mp.level])); + const ranked = rankForSlot( + spec, + fx.torrents.map((t) => ({ ...parsed.get(t.id)!, raw: t.id })), + ).filter((e) => e.evaluation.decision === "accept"); + const order = ranked.map((e) => e.candidate.raw); + const out: string[] = []; + for (let i = 0; i < order.length; i++) + for (let j = i + 1; j < order.length; j++) { + const a = level.get(order[i]!); + const b = level.get(order[j]!); + // 我们把 a 排在 b 前,MP 却认为 b 的层级更优 + if (a != null && b != null && b < a) out.push(`${order[j]}>${order[i]}`); + } + return out.sort(); +} + +// ---------------------------------------------------------------- 断言 +describe("MP 过滤规则差分(filter-cases.json)", () => { + it("fixture 完整:≥20 种子,Python/Rust 一致,每条可表达规则都有翻译", () => { + expect(fx.torrents.length).toBeGreaterThanOrEqual(20); + expect(fx.generatedFrom.rustCrossCheck.mismatches).toEqual([]); + const translatable = fx.rules.filter((r) => r.verdict !== "none").map((r) => r.id); + expect(Object.keys(TRANSLATE).sort()).toEqual(translatable.sort()); + }); + + it("不一致集合 == deviations 登记集合", () => { + const actual: Record<string, { mp: number | null; ours: number | null }> = {}; + for (const c of fx.cases) { + if (!TRANSLATE[c.ruleId]) continue; + const ours = ourLevel(c.ruleId, c.torrentId); + if (ours !== c.mp.level) actual[c.caseId] = { mp: c.mp.level, ours }; + } + const registered = Object.keys(fx.deviations).filter((k) => !k.includes("~")); + expect(Object.keys(actual).sort()).toEqual(registered.sort()); + for (const k of registered) + expect(["intentional", "missing", "our_bug", "mp_bug", "not_expressible"]).toContain(fx.deviations[k]!.kind); + }); + + it("单 Slot + rankForSlot 的排序逆序对 == 登记", () => { + for (const key of Object.keys(RANK_CHECKS)) { + const inv = rankInversions(key); + const dev = fx.deviations[key]; + if (inv.length === 0) expect(dev).toBeUndefined(); + else expect(dev?.pairs?.slice().sort()).toEqual(inv); + } + }); +}); + +/** 生成/更新登记时用:UMT_FILTER_DUMP=1 deno task test 打印当前不一致 */ +if (process.env.UMT_FILTER_DUMP) { + const rows: Record<string, unknown> = {}; + for (const c of fx.cases) { + if (!TRANSLATE[c.ruleId]) continue; + const ours = ourLevel(c.ruleId, c.torrentId); + if (ours !== c.mp.level) rows[c.caseId] = { mp: c.mp.level, ours }; + } + for (const key of Object.keys(RANK_CHECKS)) rows[key] = rankInversions(key); + console.log(`UMT_FILTER_DUMP ${JSON.stringify(rows)}`); +} diff --git a/packages/domain/test/differential/meta-deviations.json b/packages/domain/test/differential/meta-deviations.json new file mode 100644 index 00000000..bb44044e --- /dev/null +++ b/packages/domain/test/differential/meta-deviations.json @@ -0,0 +1,1931 @@ +{ + "note": "标题识别差分已知差异快照。key=样本id→字段;mp/ours 为规范形(见 meta-map.ts)。kind: intentional=故意偏离(README/porting 文档有记录) missing=漏迁 our_bug=疑似我们的 bug mp_bug=疑似 MP 的 bug/缺陷(我们更好) representation=表示差异。补迁消除后删除对应条目。", + "deviations": { + "M-01": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "framestor", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "M-05": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "rovers", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "M-11": { + "begin_episode": { + "kind": "intentional", + "mp": "1", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "M-13": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "8", + "note": "第八季 全12期 保留季号(MP 负向前瞻丢季)" + } + }, + "M-14": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.265", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "M-15": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "varyg", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "M-18": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "M-19": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "M-20": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-01": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "sparks", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-03": { + "name": { + "kind": "representation", + "mp": "thewanderingearthii", + "ours": "流浪地球2", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "X-05": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "cinephiles", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-06": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "amiable", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-07": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "ebp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-08": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "surcode", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-09": { + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "BluRay", + "note": "MP 不认 BD50" + } + }, + "X-10": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-11": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "yts", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-12": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-14": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-16": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "sparks", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-17": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "fgt", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-18": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-19": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-20": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "foo", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "X-24": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "T-06": { + "name": { + "kind": "mp_bug", + "mp": "friends1x05", + "ours": "friends", + "note": "MP 不认 1x05 写法" + }, + "en_name": { + "kind": "mp_bug", + "mp": "friends1x05", + "ours": "friends", + "note": "MP 不认 1x05 写法" + }, + "type": { + "kind": "mp_bug", + "mp": "unknown", + "ours": "tv", + "note": "MP 不认 1x05 写法" + }, + "begin_season": { + "kind": "mp_bug", + "mp": null, + "ours": "1", + "note": "MP 不认 1x05 写法" + }, + "begin_episode": { + "kind": "mp_bug", + "mp": null, + "ours": "5", + "note": "MP 不认 1x05 写法" + } + }, + "T-07": { + "type": { + "kind": "mp_bug", + "mp": "unknown", + "ours": "tv", + "note": "MP 未识别 Season.2(点分隔)" + }, + "begin_season": { + "kind": "mp_bug", + "mp": null, + "ours": "2", + "note": "MP 未识别 Season.2(点分隔)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "T-12": { + "name": { + "kind": "mp_bug", + "mp": "showd02", + "ours": "show", + "note": "MP 不认 S01D02,D02 进名称、季号丢失" + }, + "en_name": { + "kind": "mp_bug", + "mp": "showd02", + "ours": "show", + "note": "MP 不认 S01D02,D02 进名称、季号丢失" + }, + "type": { + "kind": "mp_bug", + "mp": "unknown", + "ours": "tv", + "note": "MP 不认 S01D02,D02 进名称、季号丢失" + }, + "begin_season": { + "kind": "mp_bug", + "mp": null, + "ours": "1", + "note": "MP 不认 S01D02,D02 进名称、季号丢失" + }, + "part": { + "kind": "intentional", + "mp": null, + "ours": "DISC2", + "note": "S01D02 识别为 DISC2(MP 无)" + } + }, + "T-13": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + }, + "web_source": { + "kind": "missing", + "mp": "bbciplayer", + "ours": null, + "note": "流媒体平台表缺 iP(BBC iPlayer)" + } + }, + "T-14": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "A-01": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "A-02": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "A-03": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "A-04": { + "name": { + "kind": "mp_bug", + "mp": "sub", + "ours": "show", + "note": "MP 取到方括号组名 Sub 作名称" + }, + "en_name": { + "kind": "mp_bug", + "mp": "sub", + "ours": "show", + "note": "MP 取到方括号组名 Sub 作名称" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "sub", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "V-01": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + } + }, + "V-02": { + "begin_episode": { + "kind": "intentional", + "mp": "5", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-03": { + "begin_episode": { + "kind": "intentional", + "mp": "12", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-04": { + "begin_episode": { + "kind": "intentional", + "mp": "1", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-05": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + } + }, + "V-06": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "V-07": { + "name": { + "kind": "intentional", + "mp": "latenightguestname", + "ours": "latenight", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "en_name": { + "kind": "intentional", + "mp": "latenightguestname", + "ours": "latenight", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "V-08": { + "begin_episode": { + "kind": "intentional", + "mp": "2", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-09": { + "begin_episode": { + "kind": "intentional", + "mp": "2", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-10": { + "begin_episode": { + "kind": "intentional", + "mp": "3", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-11": { + "name": { + "kind": "intentional", + "mp": "某综艺2024年5月3日", + "ours": "某综艺", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "cn_name": { + "kind": "intentional", + "mp": "某综艺2024年5月3日", + "ours": "某综艺", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + } + }, + "V-12": { + "begin_episode": { + "kind": "intentional", + "mp": "1", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-13": { + "name": { + "kind": "intentional", + "mp": "某综艺先导片", + "ours": "某综艺", + "note": "先导片 → contentType=preview,不进名称" + }, + "cn_name": { + "kind": "intentional", + "mp": "某综艺先导片", + "ours": "某综艺", + "note": "先导片 → contentType=preview,不进名称" + } + }, + "V-14": { + "begin_episode": { + "kind": "intentional", + "mp": "3", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-15": { + "begin_episode": { + "kind": "intentional", + "mp": "3", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "V-18": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "P-04": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "rovers", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "P-05": { + "name": { + "kind": "intentional", + "mp": "makingof", + "ours": "oppenheimer", + "note": "附加内容目录归属父作品" + }, + "en_name": { + "kind": "intentional", + "mp": "makingof", + "ours": "oppenheimer", + "note": "附加内容目录归属父作品" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "framestor", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "P-07": { + "name": { + "kind": "intentional", + "mp": "downloads", + "ours": "theglory", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "en_name": { + "kind": "intentional", + "mp": "downloads", + "ours": "theglory", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "year": { + "kind": "intentional", + "mp": null, + "ours": "2022", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "resource_pix": { + "kind": "intentional", + "mp": null, + "ours": "1080p", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "resource_type": { + "kind": "intentional", + "mp": null, + "ours": "WEB-DL", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "hhweb", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + }, + "web_source": { + "kind": "intentional", + "mp": null, + "ours": "netflix", + "note": "辅助词文件名 auxiliaryOnly,取父目录(MP 取到根目录名 Downloads)" + } + }, + "P-08": { + "begin_episode": { + "kind": "intentional", + "mp": "1", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "P-09": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "12", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_pix": { + "kind": "intentional", + "mp": null, + "ours": "1080p", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_type": { + "kind": "intentional", + "mp": null, + "ours": "WEB-DL", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "hhweb", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "P-10": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "12", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_pix": { + "kind": "intentional", + "mp": null, + "ours": "1080p", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_type": { + "kind": "intentional", + "mp": null, + "ours": "WEB-DL", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "hhweb", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "P-11": { + "part": { + "kind": "intentional", + "mp": null, + "ours": "CD1", + "note": "分盘 CD1 保留 part" + } + }, + "P-13": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "P-14": { + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + }, + "resource_pix": { + "kind": "intentional", + "mp": null, + "ours": "1080p", + "note": "文件无剧集信号、目录是剧集时合并(needs_confirm)" + } + }, + "P-17": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-01": { + "name": { + "kind": "our_bug", + "mp": "thelongseason", + "ours": "thelong", + "note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017" + }, + "en_name": { + "kind": "our_bug", + "mp": "thelongseason", + "ours": "thelong", + "note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017" + }, + "year": { + "kind": "our_bug", + "mp": "2017", + "ours": null, + "note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017" + }, + "type": { + "kind": "our_bug", + "mp": "unknown", + "ours": "tv", + "note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017" + }, + "begin_season": { + "kind": "our_bug", + "mp": null, + "ours": "2017", + "note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "xxx", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-02": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "xxx", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-03": { + "name": { + "kind": "our_bug", + "mp": "欢迎来到实力至上主义的教室", + "ours": "★7月新番欢迎来到实力至上主义的教室", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": "欢迎来到实力至上主义的教室", + "ours": "★7月新番欢迎来到实力至上主义的教室", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "爪爪字幕组", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-05": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_pix": { + "kind": "missing", + "mp": "1080p", + "ours": null, + "note": "方括号裸数字 [1080] 不识别为分辨率" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "resource_team": { + "kind": "our_bug", + "mp": "leagueweb", + "ours": "秋叶原冥途战争", + "note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB" + } + }, + "MP-06": { + "name": { + "kind": "our_bug", + "mp": "哆啦a梦大雄的宇宙小战争2021", + "ours": "哆啦梦大雄的宇宙小战争2021", + "note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": "哆啦a梦大雄的宇宙小战争2021", + "ours": "哆啦梦大雄的宇宙小战争2021", + "note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名" + }, + "en_name": { + "kind": "our_bug", + "mp": null, + "ours": "a", + "note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名" + } + }, + "MP-10": { + "web_source": { + "kind": "missing", + "mp": "bglobal", + "ours": null, + "note": "流媒体平台表缺 B-Global" + } + }, + "MP-12": { + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MP 未识别方括号内 [WEBRip]" + }, + "audio_encode": { + "kind": "missing", + "mp": "51", + "ours": null, + "note": "孤立声道 [5.1] 不识别为音频" + } + }, + "MP-13": { + "name": { + "kind": "mp_bug", + "mp": "jadedynasty", + "ours": "诛仙", + "note": "MP 丢中文名(/ 分隔或嵌套方括号)" + }, + "cn_name": { + "kind": "mp_bug", + "mp": null, + "ours": "诛仙", + "note": "MP 丢中文名(/ 分隔或嵌套方括号)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "resource_team": { + "kind": "our_bug", + "mp": "leagueweb", + "ours": "animations(动画片)", + "note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB" + } + }, + "MP-17": { + "name": { + "kind": "our_bug", + "mp": "据幸存的六人所说", + "ours": "22年日剧据幸存的六人所说", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": "据幸存的六人所说", + "ours": "22年日剧据幸存的六人所说", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "MP-18": { + "name": { + "kind": "our_bug", + "mp": "soredemoayumuwayosetekuru", + "ours": "★7月新番即使如此依旧步步进逼", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": null, + "ours": "★7月新番即使如此依旧步步进逼", + "note": "前缀标签混入中文名;MP 丢中文名" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "MP-20": { + "name": { + "kind": "our_bug", + "mp": "swordquest", + "ours": "国漫寻剑", + "note": "动漫标题前缀标签(国漫)未剥离,且 name 取中文" + }, + "cn_name": { + "kind": "our_bug", + "mp": null, + "ours": "国漫寻剑", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + } + }, + "MP-21": { + "name": { + "kind": "our_bug", + "mp": "组长女儿与保姆", + "ours": "组长女儿与照料专员组长女儿与保姆", + "note": "\"A / B\" 两个中文名被拼接;MP 取后者" + }, + "cn_name": { + "kind": "our_bug", + "mp": "组长女儿与保姆", + "ours": "组长女儿与照料专员组长女儿与保姆", + "note": "\"A / B\" 两个中文名被拼接;MP 取后者" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "MP-22": { + "audio_encode": { + "kind": "mp_bug", + "mp": "LPCM7³", + "ours": "LPCM", + "note": "LPCM-7³ ACG:MP 把组名碎片 7³ 拼进音频" + } + }, + "MP-23": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "bordure", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-24": { + "name": { + "kind": "our_bug", + "mp": "galtokyouryuu", + "ours": "bdrip", + "note": "[Name][02][BDRIP] 取到 BDRIP 作名称" + }, + "en_name": { + "kind": "our_bug", + "mp": "galtokyouryuu", + "ours": "bdrip", + "note": "[Name][02][BDRIP] 取到 BDRIP 作名称" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "MP-25": { + "name": { + "kind": "missing", + "mp": "逆境無頼カイジ", + "ours": "逆境無頼カイジ13", + "note": "#13 集号写法不识别" + }, + "cn_name": { + "kind": "missing", + "mp": "逆境無頼カイジ", + "ours": "逆境無頼カイジ13", + "note": "#13 集号写法不识别" + }, + "type": { + "kind": "missing", + "mp": "tv", + "ours": "unknown", + "note": "#13 集号写法不识别" + }, + "begin_season": { + "kind": "missing", + "mp": "1", + "ours": null, + "note": "#13 集号写法不识别" + }, + "begin_episode": { + "kind": "missing", + "mp": "13", + "ours": null, + "note": "#13 集号写法不识别" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "ai-raws", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-27": { + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "resource_team": { + "kind": "our_bug", + "mp": "leagueweb", + "ours": "神印王座", + "note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB" + } + }, + "MP-29": { + "name": { + "kind": "missing", + "mp": "西部世界", + "ours": "西部世界12", + "note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号" + }, + "cn_name": { + "kind": "missing", + "mp": "西部世界", + "ours": "西部世界12", + "note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号" + }, + "type": { + "kind": "missing", + "mp": "tv", + "ours": "unknown", + "note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号" + }, + "begin_episode": { + "kind": "missing", + "mp": "12", + "ours": null, + "note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号" + } + }, + "MP-30": { + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "MP-31": { + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.265", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "MP-32": { + "name": { + "kind": "our_bug", + "mp": "fightsbreakspherev", + "ours": "国漫斗破苍穹", + "note": "动漫标题前缀标签(国漫)未剥离,且 name 取中文" + }, + "cn_name": { + "kind": "our_bug", + "mp": null, + "ours": "国漫斗破苍穹", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + } + }, + "MP-34": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.265", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "MP-35": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEBRip", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.265", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "MP-37": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "tg1r0", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-39": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "MP-41": { + "name": { + "kind": "representation", + "mp": "thegodfatherpartiii", + "ours": "教父3", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "MP-44": { + "name": { + "kind": "our_bug", + "mp": "isekaiojisan", + "ours": "异世界归来的舅舅", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "cn_name": { + "kind": "mp_bug", + "mp": null, + "ours": "异世界归来的舅舅", + "note": "MP 丢中文名" + }, + "en_name": { + "kind": "our_bug", + "mp": "isekaiojisan", + "ours": "isekaiojisan01", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "type": { + "kind": "our_bug", + "mp": "tv", + "ours": "unknown", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "begin_episode": { + "kind": "our_bug", + "mp": "1", + "ours": null, + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + } + }, + "MP-45": { + "name": { + "kind": "our_bug", + "mp": "summertimerendering", + "ours": "★04月新番★夏日重現", + "note": "前缀标签混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": null, + "ours": "★04月新番★夏日重現", + "note": "前缀标签混入中文名;MP 丢中文名" + }, + "en_name": { + "kind": "our_bug", + "mp": "summertimerendering", + "ours": "summertimerendering15", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "type": { + "kind": "our_bug", + "mp": "tv", + "ours": "unknown", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "begin_episode": { + "kind": "our_bug", + "mp": "15", + "ours": null, + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + } + }, + "MP-46": { + "name": { + "kind": "representation", + "mp": "hatarakumaousama", + "ours": "打工吧魔王大人", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "MP-47": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "tg1r0", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "MP-48": { + "audio_encode": { + "kind": "our_bug", + "mp": "DTSHDMA51", + "ours": "DTSHD", + "note": "DTS-HD MA5.1(MA 与声道粘连)只识别到 DTSHD" + } + }, + "MP-49": { + "audio_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "AC3", + "note": "AC3£cXcY:MP 未切开 £ 分隔,音频丢失" + }, + "resource_team": { + "kind": "missing", + "mp": "cxcy@frds", + "ours": "frds", + "note": "£ 分隔的多组 cXcY@FRDS 只取到 FRDS" + } + }, + "MP-50": { + "begin_episode": { + "kind": "missing", + "mp": "13", + "ours": null, + "note": "S01 13-14 裸数字集区间不识别" + }, + "end_episode": { + "kind": "missing", + "mp": "14", + "ours": null, + "note": "S01 13-14 裸数字集区间不识别" + } + }, + "MP-51": { + "end_episode": { + "kind": "our_bug", + "mp": "14", + "ours": null, + "note": "E13-14 只取到起始集" + } + }, + "MP-52": { + "type": { + "kind": "our_bug", + "mp": "unknown", + "ours": "tv", + "note": "开头下载日期 2022.8.2 被当成 airDate → 误判剧集" + } + }, + "MP-54": { + "audio_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "AC3", + "note": "AC3£cXcY:MP 未切开 £ 分隔,音频丢失" + }, + "resource_team": { + "kind": "missing", + "mp": "cxcy@frds", + "ours": "frds", + "note": "£ 分隔的多组 cXcY@FRDS 只取到 FRDS" + } + }, + "MP-55": { + "name": { + "kind": "mp_bug", + "mp": "うたわれるもの", + "ours": "传颂之物", + "note": "MP 丢中文名(/ 分隔或嵌套方括号)" + }, + "cn_name": { + "kind": "mp_bug", + "mp": null, + "ours": "传颂之物", + "note": "MP 丢中文名(/ 分隔或嵌套方括号)" + }, + "en_name": { + "kind": "our_bug", + "mp": "うたわれるもの", + "ours": "utawarerumonoうたわれるもの", + "note": "三段 / 名称(中/罗马字/日文)未拆开" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "BluRay", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.265", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "audio_encode": { + "kind": "representation", + "mp": "FLAC", + "ours": "FLACAC3", + "note": "flac_ac3 我们记两种音轨,MP 只记 FLAC" + } + }, + "MP-56": { + "name": { + "kind": "our_bug", + "mp": "欢迎来到实力至上主义的教室", + "ours": "7月新番欢迎来到实力至上主义的教室", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": "欢迎来到实力至上主义的教室", + "ours": "7月新番欢迎来到实力至上主义的教室", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + } + }, + "MP-57": { + "type": { + "kind": "missing", + "mp": "tv", + "ours": "unknown", + "note": "[TV 04] 集号写法不识别" + }, + "begin_episode": { + "kind": "missing", + "mp": "4", + "ours": null, + "note": "[TV 04] 集号写法不识别" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + }, + "resource_team": { + "kind": "our_bug", + "mp": "leagueweb", + "ours": "诛仙", + "note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB" + } + }, + "MP-58": { + "web_source": { + "kind": "representation", + "mp": "max", + "ours": "hbomax", + "note": "平台显示名表不同:HMAX → MP \"Max\",我们 \"HBO Max\"" + } + }, + "MP-59": { + "web_source": { + "kind": "representation", + "mp": "max", + "ours": "hbomax", + "note": "平台显示名表不同:HMAX → MP \"Max\",我们 \"HBO Max\"" + } + }, + "MP-60": { + "en_name": { + "kind": "our_bug", + "mp": "zhuxianjadedynasty", + "ours": "hallofczhuxianjadedynasty", + "note": "开头 [Hall_of_C] 组名混入英文名" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + } + }, + "MP-63": { + "name": { + "kind": "our_bug", + "mp": "金属口红", + "ours": "★1月新番金属口红", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "cn_name": { + "kind": "our_bug", + "mp": "金属口红", + "ours": "★1月新番金属口红", + "note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名" + }, + "en_name": { + "kind": "our_bug", + "mp": "metallicrouge", + "ours": "metallicrougegb", + "note": "语言标记 GB 未剥离,进英文名" + }, + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_team": { + "kind": "our_bug", + "mp": "极影字幕社", + "ours": null, + "note": "【极影字幕社】全角方括号开头组未取到" + } + }, + "MP-64": { + "name": { + "kind": "missing", + "mp": "麦香", + "ours": "maixiang", + "note": "英文名为拼音时从副标题取中文名(MP metavideo 规则)未迁" + }, + "cn_name": { + "kind": "missing", + "mp": "麦香", + "ours": null, + "note": "英文名为拼音时从副标题取中文名(MP metavideo 规则)未迁" + } + }, + "MP-73": { + "type": { + "kind": "our_bug", + "mp": "unknown", + "ours": "tv", + "note": "父目录 Collection.20240501 的日期被当 airDate,合并后误判剧集" + }, + "audio_encode": { + "kind": "representation", + "mp": "2AUDIO", + "ours": "2AUDIOS", + "note": "2Audio:MP \"2Audio\",我们 \"2Audios\"" + } + }, + "MP-74": { + "name": { + "kind": "our_bug", + "mp": "caligulatheultimatecut", + "ours": "罗马帝国艳情史最终剪辑版澳大利亚版", + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "cn_name": { + "kind": "our_bug", + "mp": null, + "ours": "罗马帝国艳情史最终剪辑版澳大利亚版", + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "en_name": { + "kind": "our_bug", + "mp": "caligulatheultimatecut", + "ours": "diy", + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "year": { + "kind": "our_bug", + "mp": "2023", + "ours": null, + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "resource_pix": { + "kind": "our_bug", + "mp": "2160p", + "ours": null, + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "resource_type": { + "kind": "our_bug", + "mp": "UHD BluRay", + "ours": "UHD ?", + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "video_encode": { + "kind": "our_bug", + "mp": "H.265", + "ours": null, + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + }, + "audio_encode": { + "kind": "our_bug", + "mp": "DTSHDMA51", + "ours": null, + "note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁" + } + }, + "MP-76": { + "name": { + "kind": "our_bug", + "mp": "theshawshankredemption", + "ours": "ytsmxtheshawshankredemption", + "note": "[YTS.MX] 前缀未当作组名剥离" + }, + "en_name": { + "kind": "our_bug", + "mp": "theshawshankredemption", + "ours": "ytsmxtheshawshankredemption", + "note": "[YTS.MX] 前缀未当作组名剥离" + } + }, + "Z-02": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-03": { + "name": { + "kind": "intentional", + "mp": "thedailyshowguest", + "ours": "thedailyshow", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "en_name": { + "kind": "intentional", + "mp": "thedailyshowguest", + "ours": "thedailyshow", + "note": "名称截止于播出日期,日期后的嘉宾/集名不进名称" + }, + "type": { + "kind": "intentional", + "mp": "unknown", + "ours": "tv", + "note": "播出日期 → airDate,视为剧集/综艺单期(MP 删除日期)" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "edith", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-04": { + "begin_episode": { + "kind": "intentional", + "mp": "3", + "ours": null, + "note": "第N期记为 issue,不当 episode(README 偏离表)" + } + }, + "Z-05": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "resource_type": { + "kind": "mp_bug", + "mp": null, + "ours": "WEB-DL", + "note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出" + } + }, + "Z-06": { + "video_encode": { + "kind": "mp_bug", + "mp": null, + "ours": "H.264", + "note": "Python 路径漏 AVC-8bit,Rust 路径识别为 AVC(MP 自身两路径不一致)" + } + }, + "Z-07": { + "name": { + "kind": "our_bug", + "mp": "dungeonmeshi", + "ours": "迷宫饭", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "cn_name": { + "kind": "mp_bug", + "mp": null, + "ours": "迷宫饭", + "note": "MP 丢中文名" + }, + "en_name": { + "kind": "our_bug", + "mp": "dungeonmeshi", + "ours": "dungeonmeshi13", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "type": { + "kind": "our_bug", + "mp": "tv", + "ours": "unknown", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "begin_episode": { + "kind": "our_bug", + "mp": "13", + "ours": null, + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + } + }, + "Z-08": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "vcb-studio", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-10": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-11": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-12": { + "name": { + "kind": "missing", + "mp": "指环王三部曲", + "ours": "指环王三部曲合集", + "note": "\"合集\" 干扰词未剥离" + }, + "cn_name": { + "kind": "missing", + "mp": "指环王三部曲", + "ours": "指环王三部曲合集", + "note": "\"合集\" 干扰词未剥离" + }, + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-13": { + "name": { + "kind": "representation", + "mp": "thewanderingearthii", + "ours": "流浪地球2", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "Z-14": { + "name": { + "kind": "representation", + "mp": "kungfupanda4", + "ours": "功夫熊猫4", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "Z-16": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "swtyblz", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-17": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "epsilon", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-18": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "hidt", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-22": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "killers", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-23": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-24": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-27": { + "name": { + "kind": "our_bug", + "mp": "shingekinokyojin", + "ours": "shingekinokyojin05ma10p", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "en_name": { + "kind": "our_bug", + "mp": "shingekinokyojin", + "ours": "shingekinokyojin05ma10p", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "type": { + "kind": "our_bug", + "mp": "tv", + "ours": "unknown", + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + }, + "begin_episode": { + "kind": "our_bug", + "mp": "5", + "ours": null, + "note": "名称后的方括号集号 [01] 未识别,拼进英文名" + } + }, + "Z-28": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + } + }, + "Z-29": { + "name": { + "kind": "representation", + "mp": "thewanderingearthii", + "ours": "流浪地球2", + "note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)" + } + }, + "Z-31": { + "name": { + "kind": "missing", + "mp": "houseofthedragon", + "ours": "{tmdbid=94997type=tvs=1e=34}houseofthedragon", + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "en_name": { + "kind": "missing", + "mp": "houseofthedragon", + "ours": "{tmdbid=94997type=tvs=1e=34}houseofthedragon", + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "type": { + "kind": "missing", + "mp": "tv", + "ours": "unknown", + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "begin_season": { + "kind": "missing", + "mp": "1", + "ours": null, + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "begin_episode": { + "kind": "missing", + "mp": "3", + "ours": null, + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "end_episode": { + "kind": "missing", + "mp": "4", + "ours": null, + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + }, + "media_id": { + "kind": "missing", + "mp": "themoviedb:94997", + "ours": null, + "note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)" + } + }, + "Z-32": { + "begin_season": { + "kind": "intentional", + "mp": null, + "ours": "1", + "note": "有集号无季号推定第 1 季(seasonInferred)" + }, + "media_id": { + "kind": "missing", + "mp": "bangumi:400602", + "ours": null, + "note": "[bangumiid=..] 未迁(我们只认 tmdb/imdb/douban/tvdb)" + } + }, + "Z-33": { + "resource_team": { + "kind": "intentional", + "mp": null, + "ours": "grp", + "note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None" + }, + "media_id": { + "kind": "mp_bug", + "mp": null, + "ours": "douban:35593344", + "note": "MP 不认 {doubanid=..} 花括号写法,我们认" + } + } + } +} diff --git a/packages/domain/test/differential/meta-map.ts b/packages/domain/test/differential/meta-map.ts new file mode 100644 index 00000000..34a29e6c --- /dev/null +++ b/packages/domain/test/differential/meta-map.ts @@ -0,0 +1,233 @@ +/** + * 标题识别差分:把 MP MetaInfo 输出与我们的 ParsedRelease 映射到同一"规范形",逐字段比较。 + * 规范化只抹平表示差异(大小写、分隔符、同义写法),不抹平语义差异;语义差异登记在 meta-deviations.json。 + */ +import { readFileSync } from "node:fs"; +import { type ParsedRelease, parseRelease, parseReleasePath } from "../../src/release-parser/index.ts"; + +export interface MetaSample { + id: string; + kind: "title" | "path"; + input: string; + subtitle?: string; + source: string; + ourNote?: string; +} + +export type MpMeta = Record<string, string | number | null> & { error?: string }; + +export type DeviationKind = "intentional" | "missing" | "our_bug" | "mp_bug" | "representation"; +export interface Deviation { + kind: DeviationKind; + mp: string | null; + ours: string | null; + note: string; +} + +/** 参与比较的字段(media_id = find_metainfo 显式 ID 标签;edition = resource_type + resource_effect,由这两项覆盖;customization 双方均未配置) */ +export const FIELDS = [ + "name", + "cn_name", + "en_name", + "year", + "type", + "begin_season", + "end_season", + "begin_episode", + "end_episode", + "resource_pix", + "resource_type", + "resource_effect", + "video_encode", + "audio_encode", + "resource_team", + "part", + "web_source", + "media_id", +] as const; +export type Field = (typeof FIELDS)[number]; +export type Canon = Record<Field, string | null>; + +const readJson = <T>(name: string): T => JSON.parse(readFileSync(new URL(`./${name}`, import.meta.url), "utf8")) as T; + +export function loadMeta() { + const samples = readJson<{ samples: MetaSample[] }>("meta-samples.json").samples; + const mp = readJson<{ python: Record<string, MpMeta>; rustMismatch: Record<string, unknown> }>("meta-mp.json"); + const deviations = readJson<{ deviations: Record<string, Partial<Record<Field, Deviation>>> }>( + "meta-deviations.json", + ).deviations; + return { samples, mp, deviations }; +} + +const str = (v: unknown): string | null => (v === null || v === undefined || v === "" ? null : String(v)); +/** 名称:忽略大小写与标点/空白(MP 英文名做 Title Case,我们保留原大小写) */ +const canonName = (v: unknown) => { + const s = str(v); + return s === null + ? null + : s + .normalize("NFKC") + .toLowerCase() + .replace(/[\s._\-::·'’!!??,,&]+/g, "") || null; +}; + +function canonSource(v: string | null): string | null { + if (!v) return null; + const u = v.toUpperCase(); + const cls = /REMUX/.test(u) + ? "REMUX" + : /BLURAY|BDRIP|\bBD\b|BLU/.test(u) + ? "BluRay" + : /WEB-?DL|^WEB$|\bWEB\b(?!RIP)/.test(u) + ? "WEB-DL" + : /WEBRIP/.test(u) + ? "WEBRip" + : /HDTV|UHDTV/.test(u) + ? "HDTV" + : /HDRIP/.test(u) + ? "HDRip" + : /DVD/.test(u) + ? "DVD" + : /HDDVD/.test(u) + ? "HDDVD" + : null; + const uhd = /\bUHD\b/.test(u.replace(/UHDTV/g, "")) ? "UHD " : ""; + return `${uhd}${cls ?? `?${u}`}`.trim(); +} + +const HDR_CANON: Record<string, string> = { + HDR: "HDR10", + HDR10: "HDR10", + "HDR10+": "HDR10+", + HDR10PLUS: "HDR10+", + HDR10P: "HDR10+", + DV: "DV", + DOVI: "DV", + HLG: "HLG", + HDRVIVID: "HDR Vivid", + VIVID: "HDR Vivid", + "HDR VIVID": "HDR Vivid", +}; +function canonHdrList(tokens: string[]): string | null { + const set = new Set<string>(); + for (const t of tokens) { + const k = t.toUpperCase().replace(/\s+/g, ""); + set.add(HDR_CANON[k] ?? HDR_CANON[t.toUpperCase()] ?? `?${t}`); + } + return set.size ? [...set].sort().join(",") : null; +} + +function canonCodec(v: string | null): string | null { + if (!v) return null; + const u = v.toUpperCase().replace(/[\s.]/g, ""); + if (/265|HEVC/.test(u)) return "H.265"; + if (/264|AVC/.test(u)) return "H.264"; + if (/AV1/.test(u)) return "AV1"; + if (/VC-?1/.test(u)) return "VC-1"; + if (/MPEG-?2/.test(u)) return "MPEG-2"; + if (/XVID/.test(u)) return "XVID"; + if (/DIVX/.test(u)) return "DIVX"; + return `?${u}`; +} + +const canonAudio = (v: string | null) => + v + ? v + .toUpperCase() + .replace(/DD\+/g, "DDP") + .replace(/[\s\-_.]/g, "") || null + : null; + +const canonGroups = (v: string | null) => + v + ? v + .split(/[@&]/) + .map((g) => g.trim().toLowerCase()) + .filter(Boolean) + .sort() + .join("@") + : null; + +function canonPix(v: string | null): string | null { + if (!v) return null; + const u = v.toLowerCase(); + return ({ "4k": "2160p", "8k": "4320p", "2k": "1440p" } as Record<string, string>)[u] ?? u; +} + +const canonPart = (v: string | null) => (v ? v.toUpperCase().replace(/[\s._-]/g, "") : null); +const canonType = (v: string | null) => + v === "电视剧" ? "tv" : v === "电影" ? "movie" : v === "未知" || v === null ? "unknown" : v; + +export function canonMp(m: MpMeta): Canon { + const effect = str(m.resource_effect); + const hdrTokens = effect ? effect.split(/\s+/).filter((t) => /^(HDR|DV|DOVI|HLG|VIVID|HDRVIVID)/i.test(t)) : []; + return { + name: canonName(m.name), + cn_name: canonName(m.cn_name), + en_name: canonName(m.en_name), + year: str(m.year), + type: canonType(str(m.type)), + begin_season: str(m.begin_season), + end_season: str(m.end_season), + begin_episode: str(m.begin_episode), + end_episode: str(m.end_episode), + resource_pix: canonPix(str(m.resource_pix)), + resource_type: canonSource(str(m.resource_type)), + resource_effect: canonHdrList(hdrTokens), + video_encode: canonCodec(str(m.video_encode)), + audio_encode: canonAudio(str(m.audio_encode)), + resource_team: canonGroups(str(m.resource_team)), + part: canonPart(str(m.part)), + web_source: canonName(m.web_source), + media_id: m.media_id ? `${m.media_source}:${m.media_id}` : null, + }; +} + +const PROVIDER: Record<string, string> = { tmdb: "themoviedb", douban: "douban", imdb: "imdb", tvdb: "tvdb" }; + +export function oursParse(s: MetaSample): ParsedRelease { + return s.kind === "path" + ? parseReleasePath(s.input) + : parseRelease(s.input, s.subtitle ? { subtitle: s.subtitle } : {}); +} + +export function canonOurs(r: ParsedRelease): Canon { + const src = r.source + ? `${r.uhd ? "UHD " : ""}${r.source === "BluRay-Disc" ? "BluRay" : r.source === "DVDRip" ? "DVD" : r.source}` + : r.uhd + ? "UHD ?" + : null; + const eps = r.episodes; + return { + name: canonName(r.title), + cn_name: canonName(r.titleCn), + en_name: canonName(r.titleEn), + year: str(r.year), + type: r.mediaTypeHint, + begin_season: str(r.season), + end_season: str(r.seasonEnd), + begin_episode: str(eps?.start), + end_episode: eps && eps.end !== eps.start ? String(eps.end) : null, + resource_pix: canonPix(str(r.resolution)), + resource_type: src, + resource_effect: r.hdr.length ? canonHdrList(r.hdr) : null, + video_encode: canonCodec(str(r.videoCodec)), + audio_encode: r.audio.length ? canonAudio(r.audio.join(" ")) : null, + resource_team: canonGroups(str(r.releaseGroup?.name)), + part: canonPart(str(r.part)), + web_source: canonName(r.webSource), + media_id: r.explicitIds[0] ? `${PROVIDER[r.explicitIds[0].provider]}:${r.explicitIds[0].id}` : null, + }; +} + +/** 逐字段差异(规范形不等) */ +export function diffSample( + s: MetaSample, + mp: MpMeta, +): Partial<Record<Field, { mp: string | null; ours: string | null }>> { + const a = canonMp(mp); + const b = canonOurs(oursParse(s)); + const out: Partial<Record<Field, { mp: string | null; ours: string | null }>> = {}; + for (const f of FIELDS) if (a[f] !== b[f]) out[f] = { mp: a[f], ours: b[f] }; + return out; +} diff --git a/packages/domain/test/differential/meta-mp.json b/packages/domain/test/differential/meta-mp.json new file mode 100644 index 00000000..40874681 --- /dev/null +++ b/packages/domain/test/differential/meta-mp.json @@ -0,0 +1,6109 @@ +{ + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a8", + "entry": "app.domain.metainfo.MetaInfo/MetaInfoPath", + "rust": { + "available": true, + "enabled": true, + "required": false, + "import_error": "" + } + }, + "python": { + "M-01": { + "name": "Oppenheimer", + "cn_name": null, + "en_name": "Oppenheimer", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": "HDR DV", + "video_encode": "HEVC", + "audio_encode": "TrueHD 7.1 Atmos", + "resource_team": null, + "edition": "UHD BluRay REMUX HDR DV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-02": { + "name": "奥本海默", + "cn_name": "奥本海默", + "en_name": "Oppenheimer", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": "DV", + "video_encode": "HEVC", + "audio_encode": "TrueHD 7.1", + "resource_team": "MTeam", + "edition": "UHD BluRay DV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-03": { + "name": "The Last Of Us", + "cn_name": null, + "en_name": "The Last Of Us", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-04": { + "name": "The Last Of Us", + "cn_name": null, + "en_name": "The Last Of Us", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR DV", + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "FLUX", + "edition": "WEB-DL HDR DV", + "part": null, + "customization": null, + "web_source": "Max", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-05": { + "name": "Breaking Bad", + "cn_name": null, + "en_name": "Breaking Bad", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": 5, + "total_season": 5, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-06": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": "Joy Of Life", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": 60, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-07": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": "Joy Of Life", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 6, + "total_episode": 6, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-08": { + "name": "The Lord Of The Rings The Fellowship Of The Ring", + "cn_name": null, + "en_name": "The Lord Of The Rings The Fellowship Of The Ring", + "year": "2001", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": "HDR", + "video_encode": "x265 10bit", + "audio_encode": "DTS-HD MA 6.1", + "resource_team": "CHD", + "edition": "UHD BluRay HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-09": { + "name": "Kill Bill Vol 1", + "cn_name": null, + "en_name": "Kill Bill Vol 1", + "year": "2003", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": "CHD", + "edition": "BluRay", + "part": "Part1", + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-10": { + "name": "Avatar The Way Of Water", + "cn_name": null, + "en_name": "Avatar The Way Of Water", + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR10Plus", + "video_encode": "HEVC", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "CMCT", + "edition": "WEB-DL HDR10Plus", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-11": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 12, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-12": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": "Keep Running", + "year": null, + "type": "电视剧", + "begin_season": 12, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-13": { + "name": "向往的生活", + "cn_name": "向往的生活", + "en_name": null, + "year": "2024", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 12, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-14": { + "name": "葬送的芙莉莲", + "cn_name": "葬送的芙莉莲", + "en_name": "Sousou No Frieren", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 12, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "AAC", + "resource_team": "喵萌奶茶屋@LoliHouse", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "M-15": { + "name": "Frieren", + "cn_name": null, + "en_name": "Frieren", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 12, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "DDP 2.0", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Netflix", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-16": { + "name": "黑暗荣耀", + "cn_name": "黑暗荣耀", + "en_name": "The Glory", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 8, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DDP 5.1", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Netflix", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-17": { + "name": "Dune Part Two", + "cn_name": null, + "en_name": "Dune Part Two", + "year": "2024", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": "HDR", + "video_encode": "HEVC", + "audio_encode": "Atmos", + "resource_team": "MTeam", + "edition": "UHD BluRay REMUX HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-18": { + "name": "Some Show", + "cn_name": null, + "en_name": "Some Show", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": 6, + "total_episode": 2, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-19": { + "name": "狂飙", + "cn_name": "狂飙", + "en_name": "The Knockout", + "year": "2023", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 39, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "OurTV", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-20": { + "name": "Some Show", + "cn_name": null, + "en_name": "Some Show", + "year": "2019", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": 10, + "total_episode": 10, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-21": { + "name": "Oshi No Ko", + "cn_name": null, + "en_name": "Oshi No Ko", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": 11, + "total_episode": 11, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "Nekomoe kissaten", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "M-22": { + "name": "Show Name", + "cn_name": null, + "en_name": "Show Name", + "year": "2019", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-01": { + "name": "Blade Runner 2049", + "cn_name": null, + "en_name": "Blade Runner 2049", + "year": "2017", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-02": { + "name": "Dune Part Two", + "cn_name": null, + "en_name": "Dune Part Two", + "year": "2024", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS-HD MA 7.1", + "resource_team": "ADE", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-03": { + "name": "The Wandering Earth Ii", + "cn_name": "流浪地球2", + "en_name": "The Wandering Earth Ii", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": "DV", + "video_encode": "HEVC", + "audio_encode": "TrueHD 7.1 Atmos", + "resource_team": "MTeam", + "edition": "UHD BluRay REMUX DV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-04": { + "name": "Interstellar", + "cn_name": null, + "en_name": "Interstellar", + "year": "2014", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": "HDS", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-05": { + "name": "Blade Runner", + "cn_name": null, + "en_name": "Blade Runner", + "year": "1982", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": "HDR", + "video_encode": "x265 10bit", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": null, + "edition": "UHD BluRay HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-06": { + "name": "Apocalypse Now", + "cn_name": null, + "en_name": "Apocalypse Now", + "year": "1979", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-07": { + "name": "Oppenheimer", + "cn_name": null, + "en_name": "Oppenheimer", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DD+ 5.1", + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-08": { + "name": "Oppenheimer", + "cn_name": null, + "en_name": "Oppenheimer", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": "UHD BluRay", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "UHD BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-09": { + "name": "Some Movie", + "cn_name": null, + "en_name": "Some Movie", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-10": { + "name": "Some Movie", + "cn_name": null, + "en_name": "Some Movie", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "HDTV", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "HDTV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-11": { + "name": "Some Movie", + "cn_name": null, + "en_name": "Some Movie", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "720p", + "resource_type": "WEBRip", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEBRip", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-12": { + "name": "Some Movie", + "cn_name": null, + "en_name": "Some Movie", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": "DVDRip", + "resource_effect": null, + "video_encode": "XVID", + "audio_encode": null, + "resource_team": null, + "edition": "DVDRip", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-13": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-14": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "4k", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-15": { + "name": "Mission Impossible Dead Reckoning Part One", + "cn_name": null, + "en_name": "Mission Impossible Dead Reckoning Part One", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": "HDR", + "video_encode": "x265 10bit", + "audio_encode": "TrueHD 7.1 Atmos", + "resource_team": "MTeam", + "edition": "UHD BluRay HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-16": { + "name": "Harry Potter And The Deathly Hallows Part 2", + "cn_name": null, + "en_name": "Harry Potter And The Deathly Hallows Part 2", + "year": "2011", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-17": { + "name": "Movie Title", + "cn_name": null, + "en_name": "Movie Title", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay REMUX", + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": null, + "edition": "BluRay REMUX", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-18": { + "name": "The Matrix", + "cn_name": null, + "en_name": "The Matrix", + "year": "1999", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-19": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-20": { + "name": "Movie Name", + "cn_name": null, + "en_name": "Movie Name", + "year": "2019", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-21": { + "name": "银翼杀手", + "cn_name": "银翼杀手", + "en_name": null, + "year": "1982", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-22": { + "name": "让子弹飞", + "cn_name": "让子弹飞", + "en_name": "Let The Bullets Fly", + "year": "2010", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS", + "resource_team": "CMCT", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-23": { + "name": "长安三万里", + "cn_name": "长安三万里", + "en_name": "Chang An", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR", + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "OurTV", + "edition": "WEB-DL HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-24": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-25": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-26": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-27": { + "name": "Movie", + "cn_name": null, + "en_name": "Movie", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-28": { + "name": "The Movie", + "cn_name": null, + "en_name": "The Movie", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "X-29": { + "name": "The Movie", + "cn_name": null, + "en_name": "The Movie", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-01": { + "name": "三体", + "cn_name": "三体", + "en_name": "Three Body", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "OurTV", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-02": { + "name": "Loki", + "cn_name": null, + "en_name": "Loki", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR DV", + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "FLUX", + "edition": "WEB-DL HDR DV", + "part": null, + "customization": null, + "web_source": "Disney+", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-03": { + "name": "The Bear", + "cn_name": null, + "en_name": "The Bear", + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "DDP 5.1", + "resource_team": "MWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Disney+", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-04": { + "name": "Beyond The Clouds", + "cn_name": null, + "en_name": "Beyond The Clouds", + "year": "2024", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-05": { + "name": "The Office Us", + "cn_name": null, + "en_name": "The Office Us", + "year": null, + "type": "电视剧", + "begin_season": 5, + "end_season": null, + "total_season": 1, + "begin_episode": 13, + "end_episode": 14, + "total_episode": 2, + "resource_pix": "720p", + "resource_type": "HDTV", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "HDTV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-06": { + "name": "Friends 1X05", + "cn_name": null, + "en_name": "Friends 1X05", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "720p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-07": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-08": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-09": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-10": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 3, + "total_episode": 3, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-11": { + "name": "Show Name", + "cn_name": null, + "en_name": "Show Name", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-12": { + "name": "Showd02", + "cn_name": null, + "en_name": "Showd02", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-13": { + "name": "Planet Earth Iii", + "cn_name": null, + "en_name": "Planet Earth Iii", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HLG", + "video_encode": "H265", + "audio_encode": "AAC 2.0", + "resource_team": null, + "edition": "WEB-DL HLG", + "part": null, + "customization": null, + "web_source": "BBC iPlayer", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-14": { + "name": "天下长河", + "cn_name": "天下长河", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-15": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "T-16": { + "name": "House Of The Dragon", + "cn_name": null, + "en_name": "House Of The Dragon", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "94997", + "class": "MetaVideo" + }, + "T-17": { + "name": "Foo", + "cn_name": null, + "en_name": "Foo", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "A-01": { + "name": "葬送的芙莉蓮", + "cn_name": "葬送的芙莉蓮", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "ANi", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "A-02": { + "name": "Sousou No Frieren", + "cn_name": null, + "en_name": "Sousou No Frieren", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "Lilith-Raws", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "A-03": { + "name": "Some Anime", + "cn_name": null, + "en_name": "Some Anime", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "UnknownSub", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "A-04": { + "name": "Sub", + "cn_name": null, + "en_name": "Sub", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 26, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "A-05": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": 26, + "total_episode": 26, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-01": { + "name": "快乐大本营", + "cn_name": "快乐大本营", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-02": { + "name": "乘风2024", + "cn_name": "乘风2024", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-03": { + "name": "披荆斩棘", + "cn_name": "披荆斩棘", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": 12, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-04": { + "name": "歌手2024", + "cn_name": "歌手2024", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-05": { + "name": "声生不息", + "cn_name": "声生不息", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-06": { + "name": "The Voice", + "cn_name": null, + "en_name": "The Voice", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": null, + "resource_team": null, + "edition": "WEB", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-07": { + "name": "Late Night Guest Name", + "cn_name": null, + "en_name": "Late Night Guest Name", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": null, + "resource_team": null, + "edition": "WEB", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-08": { + "name": "极限挑战", + "cn_name": "极限挑战", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 10, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-09": { + "name": "声生不息", + "cn_name": "声生不息", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-10": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 12, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-11": { + "name": "某综艺 2024年5月3日", + "cn_name": "某综艺 2024年5月3日", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-12": { + "name": "某综艺", + "cn_name": "某综艺", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-13": { + "name": "某综艺 先导片", + "cn_name": "某综艺 先导片", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-14": { + "name": "某综艺", + "cn_name": "某综艺", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-15": { + "name": "某综艺", + "cn_name": "某综艺", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-16": { + "name": "某剧", + "cn_name": "某剧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": 3, + "total_season": 3, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-17": { + "name": "某剧", + "cn_name": "某剧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": 3, + "total_season": 3, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "V-18": { + "name": "某剧", + "cn_name": "某剧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": 10, + "total_episode": 10, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-01": { + "name": "The Last Of Us", + "cn_name": null, + "en_name": "The Last Of Us", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-02": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": "Joy Of Life", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-03": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": "Joy Of Life", + "year": "2024", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-04": { + "name": "Breaking Bad", + "cn_name": null, + "en_name": "Breaking Bad", + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": 7, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-05": { + "name": "Making Of", + "cn_name": null, + "en_name": "Making Of", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "UHD BluRay REMUX", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-07": { + "name": "Downloads", + "cn_name": null, + "en_name": "Downloads", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-08": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 12, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-09": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-10": { + "name": "奔跑吧", + "cn_name": "奔跑吧", + "en_name": null, + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-11": { + "name": "Kill Bill", + "cn_name": null, + "en_name": "Kill Bill", + "year": "2003", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": "CHD", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-12": { + "name": "庆余年", + "cn_name": "庆余年", + "en_name": null, + "year": "2019", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-13": { + "name": "Sousou No Frieren", + "cn_name": null, + "en_name": "Sousou No Frieren", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "LoliHouse", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "P-14": { + "name": "Making Of Special", + "cn_name": null, + "en_name": "Making Of Special", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-15": { + "name": "The Matrix Reloaded", + "cn_name": null, + "en_name": "The Matrix Reloaded", + "year": "2003", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-16": { + "name": "The Matrix Reloaded", + "cn_name": null, + "en_name": "The Matrix Reloaded", + "year": "2003", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "P-17": { + "name": "Show", + "cn_name": null, + "en_name": "Show", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-01": { + "name": "The Long Season", + "cn_name": null, + "en_name": "The Long Season", + "year": "2017", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": 120, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-02": { + "name": "Cherry Season", + "cn_name": null, + "en_name": "Cherry Season", + "year": "2014", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": 60, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-03": { + "name": "欢迎来到实力至上主义的教室", + "cn_name": "欢迎来到实力至上主义的教室", + "en_name": "Youkoso Jitsuryoku Shijou Shugi No Kyoushitsu E", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 11, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-04": { + "name": "National Parks Adventure", + "cn_name": null, + "en_name": "National Parks Adventure", + "year": "2016", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": "3D", + "video_encode": "AVC", + "audio_encode": "TrueHD 7.1", + "resource_team": null, + "edition": "BluRay 3D", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-05": { + "name": "Akiba Maid Sensou", + "cn_name": null, + "en_name": "Akiba Maid Sensou", + "year": "2022", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "LeagueWEB", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-06": { + "name": "哆啦A梦:大雄的宇宙小战争 2021", + "cn_name": "哆啦A梦:大雄的宇宙小战争 2021", + "en_name": null, + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-07": { + "name": "新精武门1991", + "cn_name": "新精武门1991", + "en_name": null, + "year": "1991", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-08": { + "name": "24", + "cn_name": null, + "en_name": "24", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC 2.0", + "resource_team": "BTN", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-09": { + "name": "Qi Refining For 3000 Years", + "cn_name": null, + "en_name": "Qi Refining For 3000 Years", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 6, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "AAC", + "resource_team": "AdWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-10": { + "name": "Noumin Kanren No Skill Bakka Agetetara Naze Ka Tsuyoku Natta", + "cn_name": null, + "en_name": "Noumin Kanren No Skill Bakka Agetetara Naze Ka Tsuyoku Natta", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "B-Global", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-11": { + "name": "Dou Luo Da Lu", + "cn_name": null, + "en_name": "Dou Luo Da Lu", + "year": "2018", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 229, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-12": { + "name": "Thor Love And Thunder", + "cn_name": null, + "en_name": "Thor Love And Thunder", + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "5.1", + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-13": { + "name": "Jade Dynasty", + "cn_name": null, + "en_name": "Jade Dynasty", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 8, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "LeagueWEB", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-14": { + "name": "钢铁侠2", + "cn_name": "钢铁侠2", + "en_name": null, + "year": "2010", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "AC3", + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-15": { + "name": "Wonder Woman 1984", + "cn_name": null, + "en_name": "Wonder Woman 1984", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "Atmos TrueHD 7.1", + "resource_team": "EPiC", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-16": { + "name": "9 1 1", + "cn_name": null, + "en_name": "9 1 1", + "year": null, + "type": "电视剧", + "begin_season": 4, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-17": { + "name": "据幸存的六人所说", + "cn_name": "据幸存的六人所说", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 4, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "幻月字幕组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-18": { + "name": "Soredemo Ayumu Wa Yosetekuru", + "cn_name": null, + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 9, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": "爪爪字幕组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-19": { + "name": "不死者之王", + "cn_name": "不死者之王", + "en_name": "Overlord Ⅳ", + "year": null, + "type": "电视剧", + "begin_season": 4, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "猎户不鸽发布组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-20": { + "name": "Sword Quest", + "cn_name": null, + "en_name": "Sword Quest", + "year": "2002", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": null, + "resource_team": "GM-Team", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-21": { + "name": "组长女儿与保姆", + "cn_name": "组长女儿与保姆", + "en_name": "Kumichou Musume To Sewagakari", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 9, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "猎户不鸽发布组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-22": { + "name": "Nande Koko Ni Sensei Ga!?", + "cn_name": null, + "en_name": "Nande Koko Ni Sensei Ga!?", + "year": "2019", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay REMUX", + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "LPCM 7³", + "resource_team": null, + "edition": "BluRay REMUX", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-23": { + "name": "30 Rock", + "cn_name": null, + "en_name": "30 Rock", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "UHD BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "UHD BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-24": { + "name": "Gal To Kyouryuu", + "cn_name": null, + "en_name": "Gal To Kyouryuu", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "FLAC", + "resource_team": "Gal to Kyouryuu", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-25": { + "name": "逆境無頼カイジ", + "cn_name": "逆境無頼カイジ", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "BD", + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": "FLAC", + "resource_team": null, + "edition": "BD", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-26": { + "name": "Mr Robot", + "cn_name": null, + "en_name": "Mr Robot", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 6, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-27": { + "name": "Throne Of Seal", + "cn_name": null, + "en_name": "Throne Of Seal", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 22, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "LeagueWEB", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-28": { + "name": null, + "cn_name": null, + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1000, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-29": { + "name": "西部世界", + "cn_name": "西部世界", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 12, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-30": { + "name": "Overlord", + "cn_name": null, + "en_name": "Overlord", + "year": null, + "type": "电视剧", + "begin_season": 4, + "end_season": null, + "total_season": 1, + "begin_episode": 4, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "ANi", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-31": { + "name": "Made In Abyss", + "cn_name": null, + "en_name": "Made In Abyss", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "AAC", + "resource_team": "SweetSub@LoliHouse", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-32": { + "name": "Fights Break Sphere V", + "cn_name": null, + "en_name": "Fights Break Sphere V", + "year": "2022", + "type": "电视剧", + "begin_season": 5, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": null, + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": "GM-Team", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-33": { + "name": "Ousama Ranking", + "cn_name": null, + "en_name": "Ousama Ranking", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "BDRIP", + "resource_effect": null, + "video_encode": "x265", + "audio_encode": "FLAC", + "resource_team": null, + "edition": "BDRIP", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-34": { + "name": "Soredemo Ayumu Wa Yosetekuru", + "cn_name": null, + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "EAC3", + "resource_team": "Nekomoe kissaten@LoliHouse", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-35": { + "name": "金装的薇尔梅", + "cn_name": "金装的薇尔梅", + "en_name": "Kinsou No Vermeil", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "AAC", + "resource_team": "喵萌奶茶屋@LoliHouse", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-36": { + "name": "Hataraku Maou Sama", + "cn_name": null, + "en_name": "Hataraku Maou Sama", + "year": "2022", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Crunchyroll", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-37": { + "name": "The Witch Part 2:The Other One", + "cn_name": null, + "en_name": "The Witch Part 2:The Other One", + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC 5.1", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-38": { + "name": "一夜新娘", + "cn_name": "一夜新娘", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 7, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-39": { + "name": "處刑少女的生存之道", + "cn_name": "處刑少女的生存之道", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 7, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "ANi", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-40": { + "name": "Stand Up Comedy", + "cn_name": null, + "en_name": "Stand Up Comedy", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "TJUPT", + "edition": "WEB-DL", + "part": "PartA", + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-41": { + "name": "The Godfather Part Iii", + "cn_name": "教父3", + "en_name": "The Godfather Part Iii", + "year": "1990", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEBRip", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "DDP 5.1", + "resource_team": "PTerWEB", + "edition": "WEBRip", + "part": null, + "customization": null, + "web_source": "Netflix", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-42": { + "name": "A Quiet Place Part Ii", + "cn_name": null, + "en_name": "A Quiet Place Part Ii", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "UHD BluRay", + "resource_effect": "DoVi", + "video_encode": "x265", + "audio_encode": "DD+ 7.1", + "resource_team": "PuTao", + "edition": "UHD BluRay DoVi", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-43": { + "name": "Childhood In A Capsule", + "cn_name": null, + "en_name": "Childhood In A Capsule", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 16, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "KKTV", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-44": { + "name": "Isekai Ojisan", + "cn_name": null, + "en_name": "Isekai Ojisan", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "桜都字幕组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-45": { + "name": "Summer Time Rendering", + "cn_name": null, + "en_name": "Summer Time Rendering", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 15, + "end_episode": null, + "total_episode": 1, + "resource_pix": "720p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "喵萌奶茶屋", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-46": { + "name": "Hataraku Maou-Sama!!", + "cn_name": "打工吧!魔王大人", + "en_name": "Hataraku Maou-Sama!!", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 2, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": "AAC", + "resource_team": "NC-Raws", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-47": { + "name": "The Witch Part 2 The Other One", + "cn_name": null, + "en_name": "The Witch Part 2 The Other One", + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC 5.1", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-48": { + "name": "The 355", + "cn_name": null, + "en_name": "The 355", + "year": "2022", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x265 10bit", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": "BeiTai", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-49": { + "name": "Sense8", + "cn_name": null, + "en_name": "Sense8", + "year": "2015", + "type": "电视剧", + "begin_season": 1, + "end_season": 2, + "total_season": 2, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x265", + "audio_encode": null, + "resource_team": "cXcY@FRDS", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-50": { + "name": "The Heart Of Genius", + "cn_name": null, + "en_name": "The Heart Of Genius", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 13, + "end_episode": 14, + "total_episode": 2, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-51": { + "name": "The Heart Of Genius", + "cn_name": null, + "en_name": "The Heart Of Genius", + "year": "2022", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": 14, + "total_episode": 2, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-52": { + "name": "Twelve Monkeys", + "cn_name": null, + "en_name": "Twelve Monkeys", + "year": "1995", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "4k", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS", + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-53": { + "name": "王者天下", + "cn_name": "王者天下", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 4, + "end_season": null, + "total_season": 1, + "begin_episode": 17, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "NC-Raws", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-54": { + "name": "Sense8", + "cn_name": null, + "en_name": "Sense8", + "year": "2015", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "x265", + "audio_encode": null, + "resource_team": "cXcY@FRDS", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-55": { + "name": "うたわれるもの", + "cn_name": null, + "en_name": "うたわれるもの", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 1, + "end_episode": 26, + "total_episode": 26, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "flac", + "resource_team": "xyx98", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-56": { + "name": "欢迎来到实力至上主义的教室", + "cn_name": "欢迎来到实力至上主义的教室", + "en_name": null, + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "X264", + "audio_encode": null, + "resource_team": "云歌字幕组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-57": { + "name": "Jade Dynasty", + "cn_name": null, + "en_name": "Jade Dynasty", + "year": "2022", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 4, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "LeagueWEB", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "MP-58": { + "name": "Rick And Morty", + "cn_name": null, + "en_name": "Rick And Morty", + "year": null, + "type": "电视剧", + "begin_season": 6, + "end_season": null, + "total_season": 1, + "begin_episode": 6, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEBRip", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DD 5.1", + "resource_team": "NTb", + "edition": "WEBRip", + "part": null, + "customization": null, + "web_source": "Max", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-59": { + "name": "Rick And Morty", + "cn_name": null, + "en_name": "Rick And Morty", + "year": null, + "type": "电视剧", + "begin_season": 6, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEBRip", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DD 5.1", + "resource_team": "NTb", + "edition": "WEBRip", + "part": null, + "customization": null, + "web_source": "Max", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-60": { + "name": "诛仙", + "cn_name": "诛仙", + "en_name": "Zhu Xian Jade Dynasty", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 19, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-61": { + "name": "I Woke Up A Vampire", + "cn_name": null, + "en_name": "I Woke Up A Vampire", + "year": "2023", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 8, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Netflix", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-62": { + "name": "Shadows Of The Void", + "cn_name": null, + "en_name": "Shadows Of The Void", + "year": "2024", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 2, + "total_episode": 2, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-63": { + "name": "金属口红", + "cn_name": "金属口红", + "en_name": "Metallic Rouge", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "极影字幕社", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-64": { + "name": "麦香", + "cn_name": "麦香", + "en_name": "Mai Xiang", + "year": "2019", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 36, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "DDP 2.0", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-65": { + "name": "西部世界", + "cn_name": "西部世界", + "en_name": null, + "year": "2016", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-66": { + "name": "The Vampire Diaries", + "cn_name": null, + "en_name": "The Vampire Diaries", + "year": "2009", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "18165", + "class": "MetaVideo" + }, + "MP-67": { + "name": "Inception", + "cn_name": null, + "en_name": "Inception", + "year": "2010", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "27205", + "class": "MetaVideo" + }, + "MP-68": { + "name": "Breaking Bad", + "cn_name": null, + "en_name": "Breaking Bad", + "year": "2008", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "1396", + "class": "MetaVideo" + }, + "MP-69": { + "name": "Breaking Bad", + "cn_name": null, + "en_name": "Breaking Bad", + "year": "2008", + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": null, + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "1396", + "class": "MetaVideo" + }, + "MP-70": { + "name": "Breaking Bad", + "cn_name": null, + "en_name": "Breaking Bad", + "year": "2008", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "1396", + "class": "MetaVideo" + }, + "MP-71": { + "name": "Game Of Thrones", + "cn_name": null, + "en_name": "Game Of Thrones", + "year": "2011", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "1399", + "class": "MetaVideo" + }, + "MP-72": { + "name": "Avatar", + "cn_name": null, + "en_name": "Avatar", + "year": "2009", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "19995", + "class": "MetaVideo" + }, + "MP-73": { + "name": "12 Years A Slave", + "cn_name": null, + "en_name": "12 Years A Slave", + "year": "2013", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x265 10bit", + "audio_encode": "2Audio", + "resource_team": "FRDS", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-74": { + "name": "Caligula The Ultimate Cut", + "cn_name": null, + "en_name": "Caligula The Ultimate Cut", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": "OurBits", + "edition": "UHD BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-75": { + "name": "The Shawshank Redemption", + "cn_name": null, + "en_name": "The Shawshank Redemption", + "year": "1994", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "MP-76": { + "name": "The Shawshank Redemption", + "cn_name": null, + "en_name": "The Shawshank Redemption", + "year": "1994", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-01": { + "name": "乘风破浪的姐姐", + "cn_name": "乘风破浪的姐姐", + "en_name": "Sisters Who Make Waves", + "year": "2024", + "type": "电视剧", + "begin_season": 5, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-02": { + "name": "Running Man", + "cn_name": null, + "en_name": "Running Man", + "year": "2024", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 0, + "begin_episode": 700, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": null, + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-03": { + "name": "The Daily Show Guest", + "cn_name": null, + "en_name": "The Daily Show Guest", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "WEB", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": null, + "resource_team": null, + "edition": "WEB", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-04": { + "name": "中国好声音", + "cn_name": "中国好声音", + "en_name": null, + "year": "2024", + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "AAC", + "resource_team": "OurTV", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-05": { + "name": "Sousou No Frieren", + "cn_name": null, + "en_name": "Sousou No Frieren", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 28, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "AAC", + "resource_team": "Lilith-Raws", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "Z-06": { + "name": "Spy X Family", + "cn_name": null, + "en_name": "Spy X Family", + "year": null, + "type": "电视剧", + "begin_season": 2, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 12, + "total_episode": 12, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": "AAC", + "resource_team": "Sakurato", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "8bit", + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "Z-07": { + "name": "Dungeon Meshi", + "cn_name": null, + "en_name": "Dungeon Meshi", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 13, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "桜都字幕组", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "Z-08": { + "name": "Shingeki No Kyojin Ma10P", + "cn_name": null, + "en_name": "Shingeki No Kyojin Ma10P", + "year": null, + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-09": { + "name": "Fargo", + "cn_name": null, + "en_name": "Fargo", + "year": "2023", + "type": "电视剧", + "begin_season": 5, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 3, + "total_episode": 3, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "H264", + "audio_encode": "DDP 5.1", + "resource_team": "NTb", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": "Amazon", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-10": { + "name": "Friends", + "cn_name": null, + "en_name": "Friends", + "year": "1994", + "type": "电视剧", + "begin_season": 1, + "end_season": 10, + "total_season": 10, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x265 10bit", + "audio_encode": "AAC 5.1", + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-11": { + "name": "Harry Potter 1 8 Collection", + "cn_name": null, + "en_name": "Harry Potter 1 8 Collection", + "year": "2001", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS", + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-12": { + "name": "指环王三部曲", + "cn_name": "指环王三部曲", + "en_name": "The Lord Of The Rings Trilogy", + "year": "2001", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": "DV HDR", + "video_encode": null, + "audio_encode": "TrueHD 7.1 Atmos", + "resource_team": null, + "edition": "UHD BluRay REMUX DV HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-13": { + "name": "The Wandering Earth Ii", + "cn_name": "流浪地球2", + "en_name": "The Wandering Earth Ii", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR", + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "HDSWEB", + "edition": "WEB-DL HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-14": { + "name": "Kung Fu Panda 4", + "cn_name": "功夫熊猫4", + "en_name": "Kung Fu Panda 4", + "year": "2024", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DTS-HD MA 7.1", + "resource_team": "CMCT", + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-15": { + "name": "Dune Part Two", + "cn_name": null, + "en_name": "Dune Part Two", + "year": "2024", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR10 DV", + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "FLUX", + "edition": "WEB-DL HDR10 DV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-16": { + "name": "The Matrix", + "cn_name": null, + "en_name": "The Matrix", + "year": "1999", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay", + "resource_effect": "HDR", + "video_encode": "x265 10bit", + "audio_encode": "TrueHD 7.1 Atmos", + "resource_team": null, + "edition": "UHD BluRay HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": "10bit", + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-17": { + "name": "Blade Runner 2049", + "cn_name": null, + "en_name": "Blade Runner 2049", + "year": "2017", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "UHD BluRay REMUX", + "resource_effect": "HDR", + "video_encode": "HEVC", + "audio_encode": "TrueHD Atmos", + "resource_team": null, + "edition": "UHD BluRay REMUX HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-18": { + "name": "Parasite", + "cn_name": null, + "en_name": "Parasite", + "year": "2019", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": "DD+ 5.1", + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-19": { + "name": "Avengers Endgame", + "cn_name": null, + "en_name": "Avengers Endgame", + "year": "2019", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR DV", + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "HHWEB", + "edition": "WEB-DL HDR DV", + "part": null, + "customization": null, + "web_source": "Disney+", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-20": { + "name": "三体", + "cn_name": "三体", + "en_name": "Three Body", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 30, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR10+", + "video_encode": "HEVC", + "audio_encode": "DDP 5.1", + "resource_team": "OurTV", + "edition": "WEB-DL HDR10+", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-21": { + "name": "繁花", + "cn_name": "繁花", + "en_name": "Blossoms Shanghai", + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 1, + "end_episode": 10, + "total_episode": 10, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR", + "video_encode": "H265", + "audio_encode": "AAC", + "resource_team": "ADWeb", + "edition": "WEB-DL HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-22": { + "name": "Show Name", + "cn_name": null, + "en_name": "Show Name", + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": 7, + "end_episode": null, + "total_episode": 1, + "resource_pix": "720p", + "resource_type": "HDTV", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "HDTV", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-23": { + "name": "Movie Title", + "cn_name": null, + "en_name": "Movie Title", + "year": "2021", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "576p", + "resource_type": "DVDRip", + "resource_effect": null, + "video_encode": "XVID", + "audio_encode": "AC3", + "resource_team": null, + "edition": "DVDRip", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-24": { + "name": "Movie Title", + "cn_name": null, + "en_name": "Movie Title", + "year": "2020", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay DIY", + "resource_effect": null, + "video_encode": "AVC", + "audio_encode": "DTS-HD MA 5.1", + "resource_team": null, + "edition": "BluRay DIY", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-25": { + "name": "The Mandalorian", + "cn_name": null, + "en_name": "The Mandalorian", + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR DV", + "video_encode": "H265", + "audio_encode": "DDP 5.1 Atmos", + "resource_team": "FLUX", + "edition": "WEB-DL HDR DV", + "part": null, + "customization": null, + "web_source": "Disney+", + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-26": { + "name": "乘风破浪的姐姐", + "cn_name": "乘风破浪的姐姐", + "en_name": null, + "year": "2024", + "type": "电视剧", + "begin_season": 5, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": "HHWEB", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-27": { + "name": "Shingeki No Kyojin", + "cn_name": null, + "en_name": "Shingeki No Kyojin", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": "x265", + "audio_encode": "flac", + "resource_team": "VCB-Studio", + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaAnime" + }, + "Z-28": { + "name": "Friends", + "cn_name": null, + "en_name": "Friends", + "year": null, + "type": "电视剧", + "begin_season": 3, + "end_season": null, + "total_season": 1, + "begin_episode": 12, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x265", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-29": { + "name": "The Wandering Earth Ii", + "cn_name": "流浪地球2", + "en_name": "The Wandering Earth Ii", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": "HDR", + "video_encode": "H265", + "audio_encode": "DDP 5.1", + "resource_team": "HDSWEB", + "edition": "WEB-DL HDR", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-30": { + "name": "三体", + "cn_name": "三体", + "en_name": null, + "year": "2023", + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "2160p", + "resource_type": "WEB-DL", + "resource_effect": null, + "video_encode": "HEVC", + "audio_encode": null, + "resource_team": "OurTV", + "edition": "WEB-DL", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + }, + "Z-31": { + "name": "House Of The Dragon", + "cn_name": null, + "en_name": "House Of The Dragon", + "year": null, + "type": "电视剧", + "begin_season": 1, + "end_season": null, + "total_season": 1, + "begin_episode": 3, + "end_episode": 4, + "total_episode": 2, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "themoviedb", + "media_id": "94997", + "class": "MetaVideo" + }, + "Z-32": { + "name": "Sousou No Frieren", + "cn_name": null, + "en_name": "Sousou No Frieren", + "year": null, + "type": "电视剧", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": 5, + "end_episode": null, + "total_episode": 1, + "resource_pix": "1080p", + "resource_type": null, + "resource_effect": null, + "video_encode": null, + "audio_encode": null, + "resource_team": null, + "edition": null, + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": "bangumi", + "media_id": "400602", + "class": "MetaAnime" + }, + "Z-33": { + "name": "Oppenheimer", + "cn_name": null, + "en_name": "Oppenheimer", + "year": "2023", + "type": "未知", + "begin_season": null, + "end_season": null, + "total_season": 0, + "begin_episode": null, + "end_episode": null, + "total_episode": 0, + "resource_pix": "1080p", + "resource_type": "BluRay", + "resource_effect": null, + "video_encode": "x264", + "audio_encode": null, + "resource_team": null, + "edition": "BluRay", + "part": null, + "customization": null, + "web_source": null, + "fps": null, + "video_bit": null, + "media_source": null, + "media_id": null, + "class": "MetaVideo" + } + }, + "rustMismatch": { + "T-06": { + "name": { + "python": "Friends 1X05", + "rust": "Friends 1x05" + }, + "en_name": { + "python": "Friends 1X05", + "rust": "Friends 1x05" + } + }, + "A-03": { + "name": { + "python": "Some Anime", + "rust": "Unknownsub" + }, + "en_name": { + "python": "Some Anime", + "rust": "Unknownsub" + } + }, + "Z-06": { + "end_episode": { + "python": 12, + "rust": null + }, + "total_episode": { + "python": 12, + "rust": 1 + }, + "video_encode": { + "python": null, + "rust": "AVC" + } + }, + "Z-08": { + "name": { + "python": "Shingeki No Kyojin Ma10P", + "rust": "Shingeki No Kyojin Ma10p" + }, + "en_name": { + "python": "Shingeki No Kyojin Ma10P", + "rust": "Shingeki No Kyojin Ma10p" + } + } + } +} diff --git a/packages/domain/test/differential/meta-samples.json b/packages/domain/test/differential/meta-samples.json new file mode 100644 index 00000000..2c25d4c3 --- /dev/null +++ b/packages/domain/test/differential/meta-samples.json @@ -0,0 +1,1323 @@ +{ + "note": "标题识别差分样本:我们已有样本 + MP tests/cases/meta.py(标题字符串为事实数据,仅作输入语料) + 补充样本", + "samples": [ + { + "id": "M-01", + "kind": "title", + "input": "Oppenheimer.2023.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-FraMeSToR", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 发布组表无 FraMeSToR 时 grp=None;本项目种子表收录" + }, + { + "id": "M-02", + "kind": "title", + "input": "奥本海默 Oppenheimer 2023 2160p UHD Blu-ray HEVC DV TrueHD 7.1-MTeam", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-03", + "kind": "title", + "input": "The.Last.of.Us.S01.2023.1080p.WEB-DL.H264.DDP5.1.Atmos-ADWeb", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-04", + "kind": "title", + "input": "The.Last.of.Us.S01E03.Long.Long.Time.2160p.MAX.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-FLUX", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-05", + "kind": "title", + "input": "Breaking.Bad.S01-S05.Complete.1080p.BluRay.x264-ROVERS", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-06", + "kind": "title", + "input": "庆余年 第二季 Joy of Life S02 2024 2160p WEB-DL H265 60fps DDP5.1-HHWEB", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-07", + "kind": "title", + "input": "庆余年.Joy.of.Life.S02E01-E06.2024.2160p.WEB-DL.H265.AAC-ADWeb", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-08", + "kind": "title", + "input": "The.Lord.of.the.Rings.The.Fellowship.of.the.Ring.2001.Extended.Edition.2160p.UHD.BluRay.x265.10bit.HDR.DTS-HD.MA.6.1-CHD", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 把 Extended.Edition 当干扰词删除;本项目保留为 cut" + }, + { + "id": "M-09", + "kind": "title", + "input": "Kill.Bill.Vol.1.2003.Part.1.1080p.BluRay.x264-CHD", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-10", + "kind": "title", + "input": "Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.HDR10Plus.HEVC-CMCT", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-11", + "kind": "title", + "input": "奔跑吧 第十二季 20240426 第1期 1080p WEB-DL H264 AAC-HHWEB", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 把第1期当 episode、忽略 20240426;本项目 issue/airDate 分开保存" + }, + { + "id": "M-12", + "kind": "title", + "input": "奔跑吧.Keep.Running.S12.2024.04.26.1080p.WEB-DL.H264.AAC-HHWEB", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 删除日期后判成整季包;本项目有日期即单期" + }, + { + "id": "M-13", + "kind": "title", + "input": "向往的生活 第八季 全12期 2024 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 负向前瞻导致季号丢失" + }, + { + "id": "M-14", + "kind": "title", + "input": "[喵萌奶茶屋&LoliHouse] 葬送的芙莉莲 / Sousou no Frieren - 12 [WebRip 1080p HEVC-10bit AAC][简繁日内封字幕]", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 季号为空;本项目推定 1 并标 seasonInferred" + }, + { + "id": "M-15", + "kind": "title", + "input": "Frieren.S01E12.1080p.NF.WEB-DL.DDP2.0.H.264-VARYG", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-16", + "kind": "title", + "input": "黑暗荣耀 The Glory 2022 S01 Complete 1080p NF WEB-DL x264 DDP5.1-HHWEB", + "subtitle": "黑暗荣耀 第一季 全8集 宋慧乔", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-17", + "kind": "title", + "input": "Dune.Part.Two.2024.2160p.UHD.BluRay.REMUX.HDR.HEVC.Atmos-MTeam", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-18", + "kind": "title", + "input": "Some.Show.S02E05E06.1080p.WEB-DL-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-19", + "kind": "title", + "input": "狂飙 The Knockout 2023 全39集 1080p WEB-DL H264 AAC-OurTV", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-20", + "kind": "title", + "input": "Some.Show.2019.1080p.WEB-DL-GRP", + "subtitle": "第1-10集 全10集", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-21", + "kind": "title", + "input": "[Nekomoe kissaten][Oshi no Ko][01-11 Fin][1080p]", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "M-22", + "kind": "title", + "input": "Show.Name.2019-2020.1080p.WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-01", + "kind": "title", + "input": "Blade.Runner.2049.2017.1080p.BluRay.x264-SPARKS", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-02", + "kind": "title", + "input": "Dune.Part.Two.2024.1080p.BluRay.x264.DTS-HD.MA.7.1-ADE", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-03", + "kind": "title", + "input": "流浪地球2 The Wandering Earth II 2023 2160p UHD BluRay REMUX HEVC DV TrueHD 7.1 Atmos-MTeam", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-04", + "kind": "title", + "input": "Interstellar.2014.IMAX.1080p.BluRay.x264.DTS-HD.MA.5.1-HDS", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-05", + "kind": "title", + "input": "Blade.Runner.1982.The.Final.Cut.2160p.UHD.BluRay.x265.10bit.HDR.DTS-HD.MA.5.1-CiNEPHiLES", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-06", + "kind": "title", + "input": "Apocalypse.Now.1979.Theatrical.Cut.1080p.BluRay.x264-AMIABLE", + "source": "domain/test/release-parser.test.ts", + "ourNote": "未知组 MP 为 None;本项目末段兜底" + }, + { + "id": "X-07", + "kind": "title", + "input": "Oppenheimer.2023.1080p.BluRay.DD+5.1.x264-EbP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-08", + "kind": "title", + "input": "Oppenheimer.2023.COMPLETE.UHD.BLURAY-SURCODE", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-09", + "kind": "title", + "input": "Some.Movie.2021.BD50.1080p.AVC.DTS-HD.MA.5.1", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-10", + "kind": "title", + "input": "Some.Movie.2021.1080p.HDTV.x264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-11", + "kind": "title", + "input": "Some.Movie.2021.720p.WEBRip.x264.AAC-YTS", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-12", + "kind": "title", + "input": "Some.Movie.2021.DVDRip.XviD-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-13", + "kind": "title", + "input": "Movie.2020.3840x2160.WEB-DL.HEVC", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-14", + "kind": "title", + "input": "Movie.2020.4K.WEB-DL.HEVC-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-15", + "kind": "title", + "input": "Mission.Impossible.Dead.Reckoning.Part.One.2023.2160p.UHD.BluRay.x265.10bit.HDR.TrueHD.7.1.Atmos-MTeam", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-16", + "kind": "title", + "input": "Harry.Potter.and.the.Deathly.Hallows.Part.2.2011.1080p.BluRay.x264-SPARKS", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-17", + "kind": "title", + "input": "Movie.Title.2021.1080p.BluRay.Remux.AVC.DTS-HD.MA.5.1-FGT", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-18", + "kind": "title", + "input": "The.Matrix.1999.Remastered.1080p.BluRay.x264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-19", + "kind": "title", + "input": "Movie.2020.Unrated.1080p.BluRay.x264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-20", + "kind": "title", + "input": "Movie.Name.2019.Directors.Cut.1080p.BluRay.x264-FOO", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-21", + "kind": "title", + "input": "银翼杀手 导演剪辑版 1982 1080p BluRay x264", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-22", + "kind": "title", + "input": "让子弹飞.Let.the.Bullets.Fly.2010.1080p.BluRay.x264.DTS-CMCT", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-23", + "kind": "title", + "input": "长安三万里.Chang.An.2023.2160p.WEB-DL.H265.HDR.DDP5.1-OurTV", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-24", + "kind": "title", + "input": "Movie.2020.1080p.BluRay.x264-GRP 12.5GB", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-25", + "kind": "title", + "input": "Movie 2020 1080p WEB-DL 中英字幕", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-26", + "kind": "title", + "input": "Movie 2020 1080p 国语中字 WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-27", + "kind": "title", + "input": "[简繁英字幕] Movie 2020 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-28", + "kind": "title", + "input": "The Movie 2021", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "X-29", + "kind": "title", + "input": "The Movie 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-01", + "kind": "title", + "input": "三体 Three-Body S01E05 2023 1080p WEB-DL H264 AAC-OurTV", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-02", + "kind": "title", + "input": "Loki.S02E01.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-FLUX", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-03", + "kind": "title", + "input": "The.Bear.S03.1080p.DSNP.WEB-DL.DDP5.1.H.264-MWeb", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-04", + "kind": "title", + "input": "Beyond.the.Clouds.2024.S01.1080p.WEB-DL.H264.AAC-ADWeb", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-05", + "kind": "title", + "input": "The.Office.US.S05E13-E14.720p.HDTV.x264", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-06", + "kind": "title", + "input": "Friends.1x05.720p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-07", + "kind": "title", + "input": "Show.Season.2.1080p.BluRay.x264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-08", + "kind": "title", + "input": "Show.S01E01.Pilot.1080p.WEB-DL.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-09", + "kind": "title", + "input": "Show.S01E01.chs.srt", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-10", + "kind": "title", + "input": "Show.S01E01E02E03.1080p.WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-11", + "kind": "title", + "input": "Show.Name.S01.E01.1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-12", + "kind": "title", + "input": "Show.S01D02.1080p.BluRay", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-13", + "kind": "title", + "input": "Planet.Earth.III.S01.2160p.iP.WEB-DL.AAC2.0.HLG.H.265-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-14", + "kind": "title", + "input": "天下长河 第1集 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-15", + "kind": "title", + "input": "庆余年 第二季 第1集 范闲入京 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-16", + "kind": "title", + "input": "[tmdbid=94997] House.of.the.Dragon.S01E03.1080p.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "T-17", + "kind": "title", + "input": "[tmdbid=0]Foo.2020", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "A-01", + "kind": "title", + "input": "[ANi] 葬送的芙莉蓮 - 13 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "A-02", + "kind": "title", + "input": "[Lilith-Raws] Sousou no Frieren - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "A-03", + "kind": "title", + "input": "[UnknownSub][Some Anime][05][1080p]", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "A-04", + "kind": "title", + "input": "[Sub] Show - 26 Fin [1080p]", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "A-05", + "kind": "title", + "input": "Show 01-26 Fin 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-01", + "kind": "title", + "input": "快乐大本营 20210903 1080p WEB-DL H264 AAC-HHWEB", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-02", + "kind": "title", + "input": "乘风2024 第5期 下 20240524 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-03", + "kind": "title", + "input": "披荆斩棘 第三季 第12期 加更版 1080p WEB-DL-HHWEB", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-04", + "kind": "title", + "input": "歌手2024 第1期 会员版 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-05", + "kind": "title", + "input": "声生不息 纯享版 20220501 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-06", + "kind": "title", + "input": "The.Voice.2024.05.03.1080p.WEB.h264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-07", + "kind": "title", + "input": "Late.Night.2024.05.03.Guest.Name.1080p.WEB.h264-GRP", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-08", + "kind": "title", + "input": "极限挑战 第十季 20240505 第2期 上 1080p WEB-DL", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-09", + "kind": "title", + "input": "声生不息 第2期(上) 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-10", + "kind": "title", + "input": "奔跑吧 第十二季 第3期 下 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-11", + "kind": "title", + "input": "某综艺 2024年5月3日 完整版 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-12", + "kind": "title", + "input": "某综艺 第1期 花絮", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-13", + "kind": "title", + "input": "某综艺 先导片", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-14", + "kind": "title", + "input": "某综艺 第3期 陪看", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-15", + "kind": "title", + "input": "某综艺 第3期 正片", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-16", + "kind": "title", + "input": "某剧 全3季 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-17", + "kind": "title", + "input": "某剧 第1-3季 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "V-18", + "kind": "title", + "input": "某剧 第1-10集 1080p", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-01", + "kind": "path", + "input": "/downloads/The.Last.of.Us.S01.2023.1080p.WEB-DL-ADWeb/The.Last.of.Us.S01E03.1080p.WEB-DL-ADWeb.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-02", + "kind": "path", + "input": "/downloads/庆余年 第二季 Joy of Life S02 2024 2160p WEB-DL H265 DDP5.1-HHWEB/01.mp4", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-03", + "kind": "path", + "input": "/downloads/庆余年 第二季 Joy of Life S02 2024 2160p WEB-DL H265 DDP5.1-HHWEB/第02集.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-04", + "kind": "path", + "input": "/downloads/Breaking.Bad.S01-S05.1080p.BluRay.x264-ROVERS/S03/07.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-05", + "kind": "path", + "input": "/d/Oppenheimer.2023.2160p.UHD.BluRay.REMUX-FraMeSToR/Featurettes/Making.Of.mkv", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 把附加内容识别成名为 Making Of 的电影" + }, + { + "id": "P-07", + "kind": "path", + "input": "/downloads/The Glory 2022 S01 1080p NF WEB-DL-HHWEB/简体.srt", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 取到根目录名 Downloads" + }, + { + "id": "P-08", + "kind": "path", + "input": "/downloads/奔跑吧 第十二季 1080p WEB-DL-HHWEB/奔跑吧.20240426.第1期.mp4", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-09", + "kind": "path", + "input": "/downloads/奔跑吧 第十二季 1080p WEB-DL-HHWEB/奔跑吧.2024.05.03.mp4", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 文件无类型、不与 TV 目录合并" + }, + { + "id": "P-10", + "kind": "path", + "input": "/downloads/奔跑吧 第十二季 1080p WEB-DL-HHWEB/奔跑吧.20240503.加更版.mp4", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-11", + "kind": "path", + "input": "/downloads/Kill.Bill.2003.1080p.BluRay.x264-CHD/CD1.mkv", + "source": "domain/test/release-parser.test.ts", + "ourNote": "MP 因 Part 门槛丢失 CD1" + }, + { + "id": "P-12", + "kind": "path", + "input": "/media/tv/庆余年 (2019)/Season 2/庆余年 - S02E03 - 第 3 集.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-13", + "kind": "path", + "input": "/dl/[LoliHouse] Sousou no Frieren [01-28][WebRip 1080p]/[LoliHouse] Sousou no Frieren - 13 [WebRip 1080p].mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-14", + "kind": "path", + "input": "/dl/Some.Show.S01.1080p/Making.Of.Special.mkv", + "source": "domain/test/release-parser.test.ts", + "ourNote": "文件无剧集信号、目录是剧集:合并但降级为 needs_confirm" + }, + { + "id": "P-15", + "kind": "path", + "input": "/dl/Collection.1080p/The.Matrix.Reloaded.2003.1080p.BluRay.x264.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-16", + "kind": "path", + "input": "/dl/The.Matrix.1999.1080p/The.Matrix.Reloaded.2003.1080p.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "P-17", + "kind": "path", + "input": "/dl/Show.S01.1080p.WEB-DL-GRP/Sample/show.s01e01.sample.mkv", + "source": "domain/test/release-parser.test.ts" + }, + { + "id": "MP-01", + "kind": "title", + "input": "The Long Season 2017 2160p WEB-DL H265 120FPS AAC-XXX", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-02", + "kind": "title", + "input": "Cherry Season S01 2014 2160p 60fps WEB-DL H265 AAC-XXX", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-03", + "kind": "title", + "input": "【爪爪字幕组】★7月新番[欢迎来到实力至上主义的教室 第二季/Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e S2][11][1080p][HEVC][GB][MP4][招募翻译校对]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-04", + "kind": "title", + "input": "National.Parks.Adventure.AKA.America.Wild:.National.Parks.Adventure.3D.2016.1080p.Blu-ray.AVC.TrueHD.7.1", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-05", + "kind": "title", + "input": "[秋叶原冥途战争][Akiba Maid Sensou][2022][WEB-DL][1080][TV Series][第01话][LeagueWEB]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-06", + "kind": "title", + "input": "哆啦A梦:大雄的宇宙小战争 2021 (2022) - 1080p.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-07", + "kind": "title", + "input": "新精武门1991 (1991).mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-08", + "kind": "title", + "input": "24 S01 1080p WEB-DL AAC2.0 H.264-BTN", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-09", + "kind": "title", + "input": "Qi Refining for 3000 Years S01E06 2022 1080p B-Blobal WEB-DL X264 AAC-AnimeS@AdWeb", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-10", + "kind": "title", + "input": "Noumin Kanren no Skill Bakka Agetetara Naze ka Tsuyoku Natta S01E02 2022 1080p B-Global WEB-DL X264 AAC-AnimeS@ADWeb[2022年10月新番]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-11", + "kind": "title", + "input": "dou luo da lu S01E229 2018 2160p WEB-DL H265 AAC-ADWeb[[国漫连载] 斗罗大陆 第229集 4k | 国语中字]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-12", + "kind": "title", + "input": "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-13", + "kind": "title", + "input": "[Animations(动画片)][[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 08][LeagueWEB]][诛仙/诛仙动画 第一季 第08集 | 类型:动画 [国语中字]][680.12 MB]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-14", + "kind": "title", + "input": "钢铁侠2 (2010) 1080p AC3.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-15", + "kind": "title", + "input": "Wonder Woman 1984 2020 BluRay 1080p Atmos TrueHD 7.1 X264-EPiC", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-16", + "kind": "title", + "input": "9-1-1 - S04E03 - Future Tense WEBDL-1080p.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-17", + "kind": "title", + "input": "【幻月字幕组】【22年日剧】【据幸存的六人所说】【04】【1080P】【中日双语】", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-18", + "kind": "title", + "input": "【爪爪字幕组】★7月新番[即使如此依旧步步进逼/Soredemo Ayumu wa Yosetekuru][09][1080p][HEVC][GB][MP4][招募翻译校对]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-19", + "kind": "title", + "input": "[猎户不鸽发布组] 不死者之王 第四季 OVERLORD Ⅳ [02] [1080p] [简中内封] [2022年7月番]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-20", + "kind": "title", + "input": "[GM-Team][国漫][寻剑 第1季][Sword Quest Season 1][2002][02][AVC][GB][1080P]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-21", + "kind": "title", + "input": " [猎户不鸽发布组] 组长女儿与照料专员 / 组长女儿与保姆 Kumichou Musume to Sewagakari [09] [1080p+] [简中内嵌] [2022年7月番]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-22", + "kind": "title", + "input": "Nande Koko ni Sensei ga!? 2019 Blu-ray Remux 1080p AVC LPCM-7³ ACG", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-23", + "kind": "title", + "input": "30.Rock.S02E01.1080p.UHD.BluRay.X264-BORDURE.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-24", + "kind": "title", + "input": "[Gal to Kyouryuu][02][BDRIP][1080P][H264_FLAC].mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-25", + "kind": "title", + "input": "[AI-Raws] 逆境無頼カイジ #13 (BD HEVC 1920x1080 yuv444p10le FLAC)[7CFEE642].mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-26", + "kind": "title", + "input": "Mr. Robot - S02E06 - eps2.4_m4ster-s1ave.aes SDTV.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-27", + "kind": "title", + "input": "[神印王座][Throne of Seal][2022][WEB-DL][2160][TV Series][TV 22][LeagueWEB] 神印王座 第一季 第22集 | 类型:动画 [国语中字][967.44 MB]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-28", + "kind": "title", + "input": "S02E1000.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-29", + "kind": "title", + "input": "西部世界 12.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-30", + "kind": "title", + "input": "[ANi] OVERLORD 第四季 - 04 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-31", + "kind": "title", + "input": "[SweetSub&LoliHouse] Made in Abyss S2 - 03v2 [WebRip 1080p HEVC-10bit AAC ASSx2].mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-32", + "kind": "title", + "input": "[GM-Team][国漫][斗破苍穹 第5季][Fights Break Sphere V][2022][05][HEVC][GB][4K]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-33", + "kind": "title", + "input": "Ousama Ranking S01E02-[1080p][BDRIP][X265.FLAC].mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-34", + "kind": "title", + "input": "[Nekomoe kissaten&LoliHouse] Soredemo Ayumu wa Yosetekuru - 01v2 [WebRip 1080p HEVC-10bit EAC3 ASSx2].mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-35", + "kind": "title", + "input": "[喵萌奶茶屋&LoliHouse] 金装的薇尔梅 / Kinsou no Vermeil - 01 [WebRip 1080p HEVC-10bit AAC][简繁内封字幕]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-36", + "kind": "title", + "input": "Hataraku.Maou-sama.S02E05.2022.1080p.CR.WEB-DL.X264.AAC-ADWeb.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-37", + "kind": "title", + "input": "The Witch Part 2:The Other One 2022 1080p WEB-DL AAC5.1 H264-tG1R0", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-38", + "kind": "title", + "input": "一夜新娘 - S02E07 - 第 7 集.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-39", + "kind": "title", + "input": "[ANi] 處刑少女的生存之道 - 07 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-40", + "kind": "title", + "input": "Stand-up.Comedy.S01E01.PartA.2022.1080p.WEB-DL.H264.AAC-TJUPT.mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-41", + "kind": "title", + "input": "教父3.The.Godfather.Part.III.1990.1080p.NF.WEBRip.H264.DDP5.1-PTerWEB.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-42", + "kind": "title", + "input": "A.Quiet.Place.Part.II.2020.1080p.UHD.BluRay.DD+7.1.DoVi.X265-PuTao", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-43", + "kind": "title", + "input": "Childhood.In.A.Capsule.S01E16.2022.1080p.KKTV.WEB-DL.X264.AAC-ADWeb.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-44", + "kind": "title", + "input": "[桜都字幕组] 异世界归来的舅舅 / Isekai Ojisan [01][1080p][简体内嵌]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-45", + "kind": "title", + "input": "【喵萌奶茶屋】★04月新番★[夏日重現/Summer Time Rendering][15][720p][繁日雙語][招募翻譯片源]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-46", + "kind": "title", + "input": "[NC-Raws] 打工吧!魔王大人 第二季 / Hataraku Maou-sama!! - 02 (B-Global 1920x1080 HEVC AAC MKV)", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-47", + "kind": "title", + "input": "The Witch Part 2 The Other One 2022 1080p WEB-DL AAC5.1 H.264-tG1R0", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-48", + "kind": "title", + "input": "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-49", + "kind": "title", + "input": "Sense8 s01-s02 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-50", + "kind": "title", + "input": "The Heart of Genius S01 13-14 2022 1080p WEB-DL H264 AAC", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-51", + "kind": "title", + "input": "The Heart of Genius E13-14 2022 1080p WEB-DL H264 AAC", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-52", + "kind": "title", + "input": "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS [3.4 GB]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-53", + "kind": "title", + "input": "[NC-Raws] 王者天下 第四季 - 17 (Baha 1920x1080 AVC AAC MP4) [3B1AA7BB].mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-54", + "kind": "title", + "input": "Sense8 S2E1 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-55", + "kind": "title", + "input": "[xyx98]传颂之物/Utawarerumono/うたわれるもの[BDrip][1920x1080][TV 01-26 Fin][hevc-yuv420p10 flac_ac3][ENG PGS]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-56", + "kind": "title", + "input": "[云歌字幕组][7月新番][欢迎来到实力至上主义的教室 第二季][01][X264 10bit][1080p][简体中文].mp4", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-57", + "kind": "title", + "input": "[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 04][LeagueWEB]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-58", + "kind": "title", + "input": "Rick and Morty.S06E06.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-59", + "kind": "title", + "input": "rick and Morty.S06E05.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-60", + "kind": "title", + "input": "[Hall_of_C] 诛仙 Zhu Xian (Jade Dynasty) - Episode 19", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-61", + "kind": "title", + "input": "I Woke Up a Vampire S02 2023 2160p NF WEB-DL DDP5.1 Atmos H 265-HHWEB", + "source": "mp:tests/cases/meta.py", + "subtitle": "醒来变成吸血鬼 第二季 | 全8集 | 4K | 类型: 喜剧/家庭/奇幻 | 导演: TommyLynch | 主演: NikoCeci/ZebastinBorjeau/安娜·阿劳约/KaileenAngelicChang/KrisSiddiqi" + }, + { + "id": "MP-62", + "kind": "title", + "input": "Shadows of the Void S01 2024 1080p WEB-DL H264 AAC-HHWEB", + "source": "mp:tests/cases/meta.py", + "subtitle": "虚无边境 | 第01-02集 | 1080p | 类型: 动画 | 导演: 巴西 | 主演: 山新/周一菡/皇贞季/Kenz/李佳怡 [内嵌中字]" + }, + { + "id": "MP-63", + "kind": "title", + "input": "【极影字幕社】★1月新番 Metallic Rouge/金属口红 第13话 GB 1080P MP4(字幕社招人内详)", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-64", + "kind": "title", + "input": "Mai Xiang S01 2019 2160p WEB-DL H.265 DDP2.0-HHWEB", + "source": "mp:tests/cases/meta.py", + "subtitle": "麦香 | 全36集 | 4K | 类型:剧情/爱情/家庭 | 主演:傅晶/章呈赫/王伟/沙景昌/何音" + }, + { + "id": "MP-65", + "kind": "path", + "input": "/volume1/电视剧/西部世界 第二季 (2016)/5.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-66", + "kind": "path", + "input": "/movies/The Vampire Diaries (2009) [tmdbid=18165]/The.Vampire.Diaries.S01E01.1080p.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-67", + "kind": "path", + "input": "/movies/Inception (2010) [tmdbid-27205]/Inception.2010.1080p.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-68", + "kind": "path", + "input": "/movies/Breaking Bad (2008) [tmdb=1396]/Season 2/", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-69", + "kind": "path", + "input": "/movies/Breaking Bad (2008) [tmdb=1396]/S2/", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-70", + "kind": "path", + "input": "/movies/Breaking Bad (2008) [tmdb=1396]/Season 1/Breaking.Bad.S01E01.1080p.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-71", + "kind": "path", + "input": "/tv/Game of Thrones (2011) {tmdb=1399}/Season 1/Game.of.Thrones.S01E01.1080p.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-72", + "kind": "path", + "input": "/movies/Avatar (2009) {tmdb-19995}/Avatar.2009.1080p.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-73", + "kind": "path", + "input": "/movies/DouBan_IMDB.TOP250.Movies.Mixed.Collection.20240501.FRDS/为奴十二年.12.Years.a.Slave.2013.BluRay.1080p.x265.10bit.2Audio.MNHD-FRDS/12.Years.a.Slave.2013.BluRay.1080p.x265.10bit.2Audio.MNHD-FRDS.mkv", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-74", + "kind": "title", + "input": "[Caligula.The.Ultimate.Cut.2023.2160p.UHD.Blu-ray.HEVC.DTS-HD.MA.5.1-BHYS@OurBits][DIY中字原盘] [罗马帝国艳情史:最终剪辑版][澳大利亚版UHD原盘 DIY 简体简英字幕][91.86GB].iso", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-75", + "kind": "title", + "input": "[The.Shawshank.Redemption.1994.1080p.BluRay.x264-GROUP][中文字幕]", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "MP-76", + "kind": "title", + "input": "[YTS.MX] The Shawshank Redemption 1994 1080p BluRay x264", + "source": "mp:tests/cases/meta.py" + }, + { + "id": "Z-01", + "kind": "title", + "input": "乘风破浪的姐姐 第五季 Sisters Who Make Waves S05 2024 2160p WEB-DL H265 AAC-HHWEB", + "subtitle": "乘风2024 | 全13期 | 国语中字", + "source": "supplement" + }, + { + "id": "Z-02", + "kind": "title", + "input": "Running Man E700 2024 1080p WEB-DL H264 AAC-GRP", + "source": "supplement" + }, + { + "id": "Z-03", + "kind": "title", + "input": "The.Daily.Show.2024.05.03.Guest.1080p.WEB.h264-EDITH", + "source": "supplement" + }, + { + "id": "Z-04", + "kind": "title", + "input": "中国好声音 2024 第03期 20240726 1080p WEB-DL H264 AAC-OurTV", + "source": "supplement" + }, + { + "id": "Z-05", + "kind": "title", + "input": "[Lilith-Raws] Sousou no Frieren - 28 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]", + "source": "supplement" + }, + { + "id": "Z-06", + "kind": "title", + "input": "[Sakurato] Spy x Family Season 2 [01-12][AVC-8bit 1080p AAC][CHS]", + "source": "supplement" + }, + { + "id": "Z-07", + "kind": "title", + "input": "[桜都字幕组] 迷宫饭 / Dungeon Meshi [13][1080P][简繁内封]", + "source": "supplement" + }, + { + "id": "Z-08", + "kind": "title", + "input": "[VCB-Studio] Shingeki no Kyojin [Ma10p_1080p]", + "source": "supplement" + }, + { + "id": "Z-09", + "kind": "title", + "input": "Fargo.S05E01-E03.2023.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb", + "source": "supplement" + }, + { + "id": "Z-10", + "kind": "title", + "input": "Friends.S01-S10.Complete.1994-2004.1080p.BluRay.x265.10bit.AAC5.1-GRP", + "source": "supplement" + }, + { + "id": "Z-11", + "kind": "title", + "input": "Harry Potter 1-8 Collection 2001-2011 1080p BluRay x264 DTS-GRP", + "source": "supplement" + }, + { + "id": "Z-12", + "kind": "title", + "input": "指环王三部曲合集 The Lord of the Rings Trilogy 2001-2003 Extended 2160p UHD BluRay REMUX HDR DV TrueHD 7.1 Atmos-GRP", + "source": "supplement" + }, + { + "id": "Z-13", + "kind": "title", + "input": "流浪地球2 The Wandering Earth II 2023 2160p WEB-DL H265 HDR 国英双语 DDP5.1-HDSWEB", + "source": "supplement" + }, + { + "id": "Z-14", + "kind": "title", + "input": "功夫熊猫4 Kung Fu Panda 4 2024 1080p BluRay x264 国粤英三语 DTS-HD MA 7.1-CMCT", + "source": "supplement" + }, + { + "id": "Z-15", + "kind": "title", + "input": "Dune.Part.Two.2024.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.H.265-FLUX", + "subtitle": "沙丘2 | 官方中字 | 特效字幕", + "source": "supplement" + }, + { + "id": "Z-16", + "kind": "title", + "input": "The.Matrix.1999.2160p.UHD.BluRay.x265.10bit.HDR.TrueHD.7.1.Atmos-SWTYBLZ", + "subtitle": "黑客帝国 | 特效中英字幕 | 国配", + "source": "supplement" + }, + { + "id": "Z-17", + "kind": "title", + "input": "Blade.Runner.2049.2017.2160p.UHD.BluRay.REMUX.HDR.HEVC.TrueHD.Atmos-EPSiLON", + "source": "supplement" + }, + { + "id": "Z-18", + "kind": "title", + "input": "Parasite.2019.1080p.BluRay.DD+5.1.x264-HiDt", + "source": "supplement" + }, + { + "id": "Z-19", + "kind": "title", + "input": "Avengers.Endgame.2019.IMAX.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-HHWEB", + "source": "supplement" + }, + { + "id": "Z-20", + "kind": "title", + "input": "三体 Three-Body S01 2023 2160p WEB-DL HEVC HDR10+ DDP5.1-OurTV", + "subtitle": "三体 | 全30集 | 4K高码 | 国语中字", + "source": "supplement" + }, + { + "id": "Z-21", + "kind": "title", + "input": "繁花 Blossoms Shanghai S01E01-E10 2023 2160p WEB-DL H265 HDR AAC-ADWeb", + "source": "supplement" + }, + { + "id": "Z-22", + "kind": "title", + "input": "Show.Name.S03E07.Episode.Title.720p.HDTV.x264-KILLERS", + "source": "supplement" + }, + { + "id": "Z-23", + "kind": "title", + "input": "Movie.Title.2021.576p.DVDRip.XviD.AC3-GRP", + "source": "supplement" + }, + { + "id": "Z-24", + "kind": "title", + "input": "Movie Title 2020 1080p BluRay AVC DTS-HD MA 5.1-GRP", + "subtitle": "原盘 DIY 简繁特效字幕", + "source": "supplement" + }, + { + "id": "Z-25", + "kind": "title", + "input": "The.Mandalorian.S03.2160p.DSNP.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-FLUX", + "source": "supplement" + }, + { + "id": "Z-26", + "kind": "path", + "input": "/downloads/乘风破浪的姐姐 第五季 2024 1080p WEB-DL-HHWEB/乘风破浪的姐姐.S05E03.20240524.1080p.mp4", + "source": "supplement" + }, + { + "id": "Z-27", + "kind": "path", + "input": "/downloads/[VCB-Studio] Shingeki no Kyojin [Ma10p_1080p]/[VCB-Studio] Shingeki no Kyojin [05][Ma10p_1080p][x265_flac].mkv", + "source": "supplement" + }, + { + "id": "Z-28", + "kind": "path", + "input": "/downloads/Friends.S01-S10.1080p.BluRay.x265-GRP/Season 03/Friends.S03E12.1080p.BluRay.x265-GRP.mkv", + "source": "supplement" + }, + { + "id": "Z-29", + "kind": "path", + "input": "/media/movies/流浪地球2 (2023)/流浪地球2.The.Wandering.Earth.II.2023.2160p.WEB-DL.H265.HDR.DDP5.1-HDSWEB.mkv", + "source": "supplement" + }, + { + "id": "Z-30", + "kind": "path", + "input": "/downloads/三体 Three-Body S01 2023 2160p WEB-DL HEVC-OurTV/三体.EP05.2160p.mp4", + "source": "supplement" + }, + { + "id": "Z-31", + "kind": "title", + "input": "{[tmdbid=94997;type=tv;s=1;e=3-4]}House.of.the.Dragon.1080p.mkv", + "source": "supplement" + }, + { + "id": "Z-32", + "kind": "title", + "input": "Sousou no Frieren - 05 [1080p] [bangumiid=400602].mkv", + "source": "supplement" + }, + { + "id": "Z-33", + "kind": "title", + "input": "Oppenheimer.2023.1080p.BluRay.x264-GRP {doubanid=35593344}", + "source": "supplement" + } + ] +} diff --git a/packages/domain/test/differential/meta.test.ts b/packages/domain/test/differential/meta.test.ts new file mode 100644 index 00000000..1bc3e9ee --- /dev/null +++ b/packages/domain/test/differential/meta.test.ts @@ -0,0 +1,35 @@ +/** + * 标题识别差分测试:MP MetaInfo/MetaInfoPath(Python 参考实现)vs parseRelease/parseReleasePath。 + * 期望输出由 `scripts/mp-sync/gen-differential.py meta` 生成(meta-mp.json),已知差异登记在 meta-deviations.json。 + * 断言:实际差异集合 == 登记集合,且规范形取值与快照一致。补迁某条后测试会失败,提示删除对应登记。 + */ +import { describe, expect, it } from "vitest"; +import { diffSample, loadMeta } from "./meta-map.ts"; + +const { samples, mp, deviations } = loadMeta(); + +describe("标题识别差分(MP MetaInfo ↔ parseRelease)", () => { + it("样本 ≥ 150 且每条都有 MP 输出", () => { + expect(samples.length).toBeGreaterThanOrEqual(150); + for (const s of samples) { + expect(mp.python[s.id], s.id).toBeDefined(); + expect(mp.python[s.id]?.error, s.id).toBeUndefined(); + } + }); + + it("登记项都对应存在的样本", () => { + const ids = new Set(samples.map((s) => s.id)); + for (const id of Object.keys(deviations)) expect(ids.has(id), id).toBe(true); + }); + + for (const s of samples) { + it(`${s.id} ${s.input}`, () => { + const actual = diffSample(s, mp.python[s.id]!); + const registered = deviations[s.id] ?? {}; + const snapshot = Object.fromEntries( + Object.entries(registered).map(([f, d]) => [f, { mp: d!.mp, ours: d!.ours }]), + ); + expect(actual, `${s.id} 差异与 meta-deviations.json 登记不一致`).toEqual(snapshot); + }); + } +}); diff --git a/packages/domain/test/differential/zhconv-deviations.json b/packages/domain/test/differential/zhconv-deviations.json new file mode 100644 index 00000000..76e8ab30 --- /dev/null +++ b/packages/domain/test/differential/zhconv-deviations.json @@ -0,0 +1,21 @@ +{ + "note": "繁→简差分已知差异:key=输入。kind 同 meta-deviations.json。", + "deviations": { + "咒術迴戰": { "kind": "missing", "mp": "咒术回战", "ours": "咒术迴战", "note": "字表缺 迴→回" }, + "孤獨搖滾": { "kind": "missing", "mp": "孤独摇滚", "ours": "孤独摇滾", "note": "字表缺 滾→滚" }, + "魷魚遊戲": { "kind": "missing", "mp": "鱿鱼游戏", "ours": "魷鱼游戏", "note": "字表缺 魷→鱿" }, + "瑯琊榜": { "kind": "missing", "mp": "琅琊榜", "ours": "瑯琊榜", "note": "字表缺 瑯→琅(异体)" }, + "慶餘年": { + "kind": "mp_bug", + "mp": "庆馀年", + "ours": "庆余年", + "note": "MediaWiki 词表把 餘 转成 馀,官方简体片名为 庆余年" + }, + "臥虎藏龍": { "kind": "missing", "mp": "卧虎藏龙", "ours": "臥虎藏龙", "note": "字表缺 臥→卧" }, + "駭客任務": { "kind": "missing", "mp": "骇客任务", "ours": "駭客任务", "note": "字表缺 駭→骇" }, + "乾杯": { "kind": "missing", "mp": "干杯", "ours": "乾杯", "note": "一对多字 乾 刻意不收;MP 有词组表" }, + "瞭解": { "kind": "missing", "mp": "了解", "ours": "瞭解", "note": "一对多字 瞭 刻意不收;MP 有词组表" }, + "頭髮": { "kind": "missing", "mp": "头发", "ours": "头髮", "note": "髮→发 未收(发/發 合并字)" }, + "理髮": { "kind": "missing", "mp": "理发", "ours": "理髮", "note": "髮→发 未收" } + } +} diff --git a/packages/domain/test/differential/zhconv-mp.json b/packages/domain/test/differential/zhconv-mp.json new file mode 100644 index 00000000..a882a42d --- /dev/null +++ b/packages/domain/test/differential/zhconv-mp.json @@ -0,0 +1,78 @@ +{ + "generatedFrom": { + "repo": "MoviePilot", + "commit": "e6820a8", + "entry": "moviepilot_rust.zhconv_fast(text, 'zh-hans')" + }, + "hans": { + "葬送的芙莉蓮": "葬送的芙莉莲", + "處刑少女的生存之道": "处刑少女的生存之道", + "夏日重現": "夏日重现", + "間諜家家酒": "间谍家家酒", + "進擊的巨人": "进击的巨人", + "鬼滅之刃": "鬼灭之刃", + "咒術迴戰": "咒术回战", + "我的英雄學院": "我的英雄学院", + "藥師少女的獨語": "药师少女的独语", + "無職轉生": "无职转生", + "關於我轉生變成史萊姆這檔事": "关于我转生变成史莱姆这档事", + "輝夜姬想讓人告白": "辉夜姬想让人告白", + "排球少年!!": "排球少年!!", + "鏈鋸人": "链锯人", + "孤獨搖滾": "孤独摇滚", + "黑暗榮耀": "黑暗荣耀", + "與神同行": "与神同行", + "魷魚遊戲": "鱿鱼游戏", + "機智醫生生活": "机智医生生活", + "請回答1988": "请回答1988", + "陽光先生": "阳光先生", + "鬼怪": "鬼怪", + "來自星星的你": "来自星星的你", + "後宮甄嬛傳": "后宫甄嬛传", + "瑯琊榜": "琅琊榜", + "慶餘年": "庆馀年", + "琅琊榜之風起長林": "琅琊榜之风起长林", + "甄嬛傳": "甄嬛传", + "雍正王朝": "雍正王朝", + "乾隆王朝": "乾隆王朝", + "康熙王朝": "康熙王朝", + "大明王朝1566": "大明王朝1566", + "頭文字D": "头文字D", + "無間道": "无间道", + "少林足球": "少林足球", + "功夫": "功夫", + "臥虎藏龍": "卧虎藏龙", + "英雄本色": "英雄本色", + "倩女幽魂": "倩女幽魂", + "喋血雙雄": "喋血双雄", + "阿飛正傳": "阿飞正传", + "花樣年華": "花样年华", + "重慶森林": "重庆森林", + "復仇者聯盟:終局之戰": "复仇者联盟:终局之战", + "蜘蛛人:無家日": "蜘蛛人:无家日", + "星際效應": "星际效应", + "全面啟動": "全面启动", + "駭客任務": "骇客任务", + "魔戒首部曲:魔戒現身": "魔戒首部曲:魔戒现身", + "神隱少女": "神隐少女", + "霍爾的移動城堡": "霍尔的移动城堡", + "乾杯": "干杯", + "著作": "著作", + "瞭解": "了解", + "頭髮": "头发", + "理髮": "理发", + "發現": "发现", + "後來": "后来", + "皇后": "皇后", + "範圍": "范围", + "姓范": "姓范", + "裡面": "里面", + "計畫": "计画", + "週末": "周末", + "臺灣": "台湾", + "台灣": "台湾", + "麵包": "面包", + "鬱金香": "郁金香", + "舞台劇": "舞台剧" + } +} diff --git a/packages/domain/test/differential/zhconv-samples.json b/packages/domain/test/differential/zhconv-samples.json new file mode 100644 index 00000000..de6677fb --- /dev/null +++ b/packages/domain/test/differential/zhconv-samples.json @@ -0,0 +1,74 @@ +{ + "note": "繁→简差分样本(影视标题/人名/常见一对多字)。期望由 MP moviepilot_rust.zhconv_fast(text, 'zh-hans') 生成", + "samples": [ + "葬送的芙莉蓮", + "處刑少女的生存之道", + "夏日重現", + "間諜家家酒", + "進擊的巨人", + "鬼滅之刃", + "咒術迴戰", + "我的英雄學院", + "藥師少女的獨語", + "無職轉生", + "關於我轉生變成史萊姆這檔事", + "輝夜姬想讓人告白", + "排球少年!!", + "鏈鋸人", + "孤獨搖滾", + "黑暗榮耀", + "與神同行", + "魷魚遊戲", + "機智醫生生活", + "請回答1988", + "陽光先生", + "鬼怪", + "來自星星的你", + "後宮甄嬛傳", + "瑯琊榜", + "慶餘年", + "琅琊榜之風起長林", + "甄嬛傳", + "雍正王朝", + "乾隆王朝", + "康熙王朝", + "大明王朝1566", + "頭文字D", + "無間道", + "少林足球", + "功夫", + "臥虎藏龍", + "英雄本色", + "倩女幽魂", + "喋血雙雄", + "阿飛正傳", + "花樣年華", + "重慶森林", + "復仇者聯盟:終局之戰", + "蜘蛛人:無家日", + "星際效應", + "全面啟動", + "駭客任務", + "魔戒首部曲:魔戒現身", + "神隱少女", + "霍爾的移動城堡", + "乾杯", + "著作", + "瞭解", + "頭髮", + "理髮", + "發現", + "後來", + "皇后", + "範圍", + "姓范", + "裡面", + "計畫", + "週末", + "臺灣", + "台灣", + "麵包", + "鬱金香", + "舞台劇" + ] +} diff --git a/packages/domain/test/differential/zhconv.test.ts b/packages/domain/test/differential/zhconv.test.ts new file mode 100644 index 00000000..38011a1f --- /dev/null +++ b/packages/domain/test/differential/zhconv.test.ts @@ -0,0 +1,22 @@ +/** + * 繁→简差分:MP moviepilot_rust.zhconv_fast(zh-hans) vs identity/toSimplified。 + * 期望由 `scripts/mp-sync/gen-differential.py zhconv` 生成;已知差异登记在 zhconv-deviations.json。 + */ +import { readFileSync } from "node:fs"; +import { expect, it } from "vitest"; +import { toSimplified } from "../../src/identity/index.ts"; + +const read = (n: string) => JSON.parse(readFileSync(new URL(`./${n}`, import.meta.url), "utf8")); +const mp: Record<string, string> = read("zhconv-mp.json").hans; +const dev: Record<string, { mp: string; ours: string }> = read("zhconv-deviations.json").deviations; + +it("toSimplified 与 MP zhconv 的差异集合 == 登记集合", () => { + const actual: Record<string, { mp: string; ours: string }> = {}; + for (const [src, want] of Object.entries(mp)) { + const ours = toSimplified(src); + if (ours !== want) actual[src] = { mp: want, ours }; + } + const snapshot = Object.fromEntries(Object.entries(dev).map(([k, d]) => [k, { mp: d.mp, ours: d.ours }])); + expect(actual).toEqual(snapshot); + expect(Object.keys(mp).length).toBeGreaterThanOrEqual(60); +}); diff --git a/scripts/mp-sync/gen-differential.py b/scripts/mp-sync/gen-differential.py new file mode 100644 index 00000000..267f0c0f --- /dev/null +++ b/scripts/mp-sync/gen-differential.py @@ -0,0 +1,760 @@ +#!/usr/bin/env python3 +"""用 MoviePilot 的实现生成差分测试的期望输出(只读调用上游,不复制源码)。 + +用法(必须用 MP 自己的 venv 解释器,工作目录无要求): + + MP_ROOT=/opt/moviepilot-plus/upstream/MoviePilot \ + $MP_ROOT/.venv/bin/python scripts/mp-sync/gen-differential.py meta + ... gen-differential.py filter # 过滤规则 + ... gen-differential.py rss # RSS / 站点索引解析 + ... gen-differential.py all + +meta:读 packages/domain/test/differential/meta-samples.json,分别以 +accelerator=None(Python 参考实现)与 accelerator=rust(moviepilot_rust 快路径) +调用 MetaInfo / MetaInfoPath,写 meta-mp.json。两条路径不一致的样本记在 rustMismatch。 + +生成后执行 `deno task fmt`(biome 统一 JSON 格式),再跑差分测试;新出现的差异需人工分类后 +登记进对应 *-deviations.json / deviations 字段(kind 见 docs/porting/mp-rust-logic-parity.md)。 +""" +from __future__ import annotations + +import glob +import hashlib +import json +import os +import subprocess +import sys +import tempfile +import time +from pathlib import Path +from types import SimpleNamespace +from typing import Any, Optional + +REPO = Path(__file__).resolve().parents[2] +MP_ROOT = Path(os.environ.setdefault("MP_ROOT", "/opt/moviepilot-plus/upstream/MoviePilot")) +DOMAIN_DIFF = REPO / "packages/domain/test/differential" +ADAPTERS_DIFF = REPO / "packages/adapters/test/differential" + + +def _bootstrap_mp() -> str: + """把 MP 放进 sys.path,隔离 CONFIG_DIR,返回上游提交号。""" + os.environ.setdefault("CONFIG_DIR", tempfile.mkdtemp(prefix="mp-diff-cfg-")) + if str(MP_ROOT) not in sys.path: + sys.path.insert(0, str(MP_ROOT)) + os.chdir(MP_ROOT) + try: + return subprocess.check_output(["git", "-C", str(MP_ROOT), "rev-parse", "--short", "HEAD"], text=True).strip() + except Exception: # noqa: BLE001 + return "unknown" + + +META_FIELDS = ( + "name", "cn_name", "en_name", "year", "type", "begin_season", "end_season", "total_season", + "begin_episode", "end_episode", "total_episode", "resource_pix", "resource_type", "resource_effect", + "video_encode", "audio_encode", "resource_team", "edition", "part", "customization", "web_source", + "fps", "video_bit", "media_source", "media_id", +) + + +def _meta_to_dict(meta) -> dict: + out = {} + for key in META_FIELDS: + value = getattr(meta, key, None) + if key == "type": + value = value.value if value is not None else None + elif key == "media_source" and value is not None: + value = getattr(value, "value", str(value)) + if value == "": + value = None + out[key] = value + out["class"] = type(meta).__name__ + return out + + +def gen_meta() -> None: + commit = _bootstrap_mp() + from pathlib import Path as P + + from app.adapters.system import rust + from app.domain.meta.runtime import configure_recognition_runtime + from app.domain.metainfo import MetaInfo, MetaInfoPath, clear_rust_parse_options_cache + from app.runtime.config import settings + + samples = json.loads((DOMAIN_DIFF / "meta-samples.json").read_text("utf-8"))["samples"] + + def run(accelerator) -> dict: + configure_recognition_runtime( + media_extensions_provider=lambda: (*settings.RMT_MEDIAEXT, *settings.RMT_SUBEXT, *settings.RMT_AUDIOEXT), + audio_extensions_provider=lambda: settings.RMT_AUDIOEXT, + accelerator=accelerator, + ) + clear_rust_parse_options_cache() + res = {} + for s in samples: + try: + if s["kind"] == "path": + meta = MetaInfoPath(P(s["input"])) + else: + meta = MetaInfo(title=s["input"], subtitle=s.get("subtitle")) + res[s["id"]] = _meta_to_dict(meta) + except Exception as err: # noqa: BLE001 + res[s["id"]] = {"error": f"{type(err).__name__}: {err}"} + return res + + python_out = run(None) + rust_out = run(rust) if rust.is_available() else {} + mismatch = {} + for sid, py in python_out.items(): + rs = rust_out.get(sid) + if rs is None: + continue + diff = {k: {"python": py.get(k), "rust": rs.get(k)} for k in py if py.get(k) != rs.get(k)} + if diff: + mismatch[sid] = diff + out = { + "generatedFrom": {"repo": "MoviePilot", "commit": commit, "entry": "app.domain.metainfo.MetaInfo/MetaInfoPath", + "rust": rust.status() if rust.is_available() else None}, + "python": python_out, + "rustMismatch": mismatch, + } + (DOMAIN_DIFF / "meta-mp.json").write_text(json.dumps(out, ensure_ascii=False, indent=1) + "\n", "utf-8") + print(f"meta: {len(python_out)} samples, rust≠python: {len(mismatch)}") + + +def gen_zhconv() -> None: + """繁→简:moviepilot_rust.zhconv_fast 无 Python 回退(app/foundation/text.py 直接调用原生扩展)。""" + commit = _bootstrap_mp() + import moviepilot_rust + + samples = json.loads((DOMAIN_DIFF / "zhconv-samples.json").read_text("utf-8"))["samples"] + out = { + "generatedFrom": {"repo": "MoviePilot", "commit": commit, "entry": "moviepilot_rust.zhconv_fast(text, 'zh-hans')"}, + "hans": {s: moviepilot_rust.zhconv_fast(s, "zh-hans") for s in samples}, + } + (DOMAIN_DIFF / "zhconv-mp.json").write_text(json.dumps(out, ensure_ascii=False, indent=1) + "\n", "utf-8") + print(f"zhconv: {len(samples)} samples") + + + +# ---------------------------------------------------------------- filter:过滤规则 +# 用 MP 的 Python 回退实现(FilterModule,rust_accel 关闭)对 TORRENTS x RULES 求匹配与优先级, +# 并用 Rust filter_torrents_fast 交叉核对。无需数据库:规则组/规则集直接注入。 +# 已知差异登记(deviations)不由本脚本生成,重新生成时从已有 filter-cases.json 保留。 + +GiB = 1024 ** 3 +MiB = 1024 ** 2 + +# ---------------------------------------------------------------- 样本 +# size 为站点报告的总大小(字节);labels 为站点标签 +TORRENTS: list[dict[str, Any]] = [ + {"id": "t01", "title": "Dune.Part.Two.2024.2160p.UHD.BluRay.Remux.DV.HDR.HEVC.TrueHD.Atmos.7.1-FraMeSToR", "description": "", "size": 70 * GiB, "seeders": 20}, + {"id": "t02", "title": "Dune.Part.Two.2024.2160p.BluRay.x265.10bit.DV.HDR-CHD", "description": "沙丘2 中字 特效", "size": 25 * GiB, "seeders": 12}, + {"id": "t03", "title": "Dune Part Two 2024 2160p UHD Blu-ray HEVC DV TrueHD 7.1-BeyondHD", "description": "", "size": 90 * GiB, "seeders": 4}, + {"id": "t04", "title": "Dune.Part.Two.2024.1080p.WEB-DL.H264.DDP5.1-HHWEB", "description": "沙丘2 | 国语 中字", "size": 8 * GiB, "seeders": 50}, + {"id": "t05", "title": "Dune.Part.Two.2024.1080p.BluRay.x264.DTS-HD.MA.5.1-WiKi", "description": "简繁英字幕", "size": 15 * GiB, "seeders": 9}, + {"id": "t06", "title": "Dune.Part.Two.2024.720p.WEBRip.x264-GRP", "description": "", "size": 2 * GiB, "seeders": 1}, + {"id": "t07", "title": "Dune.Part.Two.2024.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR.H.265-FLUX", "description": "", "size": 20 * GiB, "seeders": 30}, + {"id": "t08", "title": "Movie.2022.2160p.HDR.HEVC-NOSRC", "description": "", "size": 18 * GiB, "seeders": 2}, + {"id": "t09", "title": "The.Bear.S03.2160p.DSNP.WEB-DL.DDP5.1.HDR.H.265-NTb", "description": "熊家餐馆 第三季 全10集 中字", "size": 60 * GiB, "seeders": 15}, + {"id": "t10", "title": "The.Bear.S03E01.1080p.WEB-DL.H264-NTb", "description": "", "size": int(2.5 * GiB), "seeders": 8}, + {"id": "t11", "title": "Movie.2023.1080p.BluRay.REMUX.AVC.DTS-HD.MA.5.1-EPSiLON", "description": "", "size": 30 * GiB, "seeders": 6}, + {"id": "t12", "title": "Movie 2023 1080p Blu-ray AVC DTS-HD MA 5.1-AAA", "description": "", "size": 40 * GiB, "seeders": 3}, + {"id": "t13", "title": "Movie.2023.COMPLETE.BLURAY-GRP", "description": "", "size": 45 * GiB, "seeders": 2}, + {"id": "t14", "title": "Movie.2023.1080i.HDTV.H264-GRP", "description": "", "size": 10 * GiB, "seeders": 1}, + {"id": "t15", "title": "[Nekomoe kissaten] Frieren - 01 [WebRip 1080p HEVC-10bit AAC ASSx2].mkv", "description": "简繁日内封", "size": 1 * GiB, "seeders": 40}, + {"id": "t16", "title": "The.Wandering.Earth.II.2023.2160p.WEB-DL.H265.HDR.DDP5.1-HDSWEB", "description": "流浪地球2 国语配音 中文字幕", "size": 12 * GiB, "seeders": 25}, + {"id": "t17", "title": "Oppenheimer.2023.IMAX.2160p.BluRay.x265.10bit.HDR.DTS-HD.MA.5.1-SWTYBLZ", "description": "奥本海默 CHS/ENG", "size": 30 * GiB, "seeders": 7}, + {"id": "t18", "title": "Movie.2022.3840x2160.WEB-DL.HDR10.HEVC-GRP", "description": "", "size": 15 * GiB, "seeders": 5}, + {"id": "t19", "title": "Movie.2022.1920x1080.WEB-DL.H264-GRP", "description": "", "size": 6 * GiB, "seeders": 5}, + {"id": "t20", "title": "Movie.2022.4K.WEB-DL.H265-GRP", "description": "", "size": 14 * GiB, "seeders": 5}, + {"id": "t21", "title": "Movie.2022.1080p.WEB-DL.x264 [GB]", "description": "", "size": 4 * GiB, "seeders": 5}, + {"id": "t22", "title": "Movie.2022.1080p.WEB-DL.H264.AAC 39.23 GB", "description": "", "size": 4 * GiB, "seeders": 5}, + {"id": "t23", "title": "Some.Show.S01.1080p.BluRay.x264-GRP", "description": "全12集 简体中字", "size": 36 * GiB, "seeders": 3}, + {"id": "t24", "title": "Movie.2021.DVDRip.x264-GRP", "description": "", "size": int(1.4 * GiB), "seeders": 2}, + {"id": "t25", "title": "Movie 2021 1080p 3D BluRay Half-SBS x264-GRP", "description": "", "size": 8 * GiB, "seeders": 2}, + {"id": "t26", "title": "Movie.2021.2160p.WEB-DL.60fps.HEVC-GRP", "description": "60帧 国语", "size": 10 * GiB, "seeders": 4}, + {"id": "t27", "title": "Movie.2020.2160p.Remux.HEVC.DoVi-GRP", "description": "", "size": 50 * GiB, "seeders": 3}, + {"id": "t28", "title": "Movie.2020.1080p.NF.WEB-DL.DDP5.1.H.264-CHDWEB", "description": "官方 中字", "labels": ["官方"], "size": 5 * GiB, "seeders": 10, "downloadvolumefactor": 0}, +] + +# 自定义规则(对应 MP「自定义规则」页:include/exclude 为单个正则字符串,size_range 单位 MB) +CUSTOM_RULES: dict[str, dict[str, Any]] = { + "SIZEMOVIE": {"size_range": "2000-30000"}, + "SIZESMALL": {"size_range": "<8000"}, + "SIZEBIG": {"size_range": ">20000"}, + "SEED5": {"seeders": "5"}, +} + +# verdict: full=可完整表达 / partial=近似表达(测试按近似翻译比对,差异登记 not_expressible) / none=不可表达(只生成 MP 结果) +RULES: list[dict[str, Any]] = [ + {"id": "R01", "rule": "4K", "verdict": "full"}, + {"id": "R02", "rule": "1080P", "verdict": "full"}, + {"id": "R03", "rule": "720P", "verdict": "full"}, + {"id": "R04", "rule": "4K | 1080P", "verdict": "full"}, + {"id": "R05", "rule": "4K > 1080P > 720P", "verdict": "full"}, + {"id": "R06", "rule": "BLU", "verdict": "full"}, + {"id": "R07", "rule": "!BLU", "verdict": "full"}, + {"id": "R08", "rule": "REMUX", "verdict": "full"}, + {"id": "R09", "rule": "!REMUX", "verdict": "full"}, + {"id": "R10", "rule": "WEBDL", "verdict": "full"}, + {"id": "R11", "rule": "!BLU & !REMUX", "verdict": "full"}, + {"id": "R12", "rule": "4K & !REMUX > 1080P & WEBDL", "verdict": "full"}, + {"id": "R13", "rule": "CNSUB", "verdict": "full"}, + {"id": "R14", "rule": "CNSUB & 4K & !BLU", "verdict": "full"}, + {"id": "R15", "rule": "CNSUB & 1080P > 1080P", "verdict": "full"}, + {"id": "R16", "rule": "SIZEMOVIE", "verdict": "full"}, + {"id": "R17", "rule": "SIZESMALL", "verdict": "full"}, + {"id": "R18", "rule": "4K & SIZEMOVIE", "verdict": "full"}, + {"id": "R19", "rule": "!BLU & !REMUX & !WEBDL", "verdict": "full"}, + {"id": "R20", "rule": "BLURAY & !REMUX & !BLU", "verdict": "full"}, + {"id": "R21", "rule": "4K & !BLU & !REMUX > 1080P & !BLU & !REMUX", "verdict": "full"}, + {"id": "R22", "rule": "(4K | 1080P) & WEBDL", "verdict": "full"}, + {"id": "R23", "rule": "CNSUB", "verdict": "partial", "mediainfo": {"original_language": "zh"}, + "note": "tmdb.original_language=zh 时 CNSUB 对任何种子直接放行"}, + {"id": "R24", "rule": "4K & !DOLBY", "verdict": "partial", "note": "硬条件无 HDR 维度,近似为 4K"}, + {"id": "R25", "rule": "SPECSUB & CNSUB & !BLU", "verdict": "partial", "note": "无特效字幕维度,近似为 CNSUB & !BLU"}, + {"id": "R26", "rule": "SIZEBIG", "verdict": "full"}, + # ---- 以下不可表达,只记录 MP 行为供报告/将来补迁 + {"id": "N01", "rule": "H265", "verdict": "none", "note": "编码只有软偏好 soft.codecs"}, + {"id": "N02", "rule": "!DOLBY & !REMUX", "verdict": "none", "note": "HDR 只有软偏好"}, + {"id": "N03", "rule": "HDR", "verdict": "none"}, + {"id": "N04", "rule": "SPECSUB", "verdict": "none"}, + {"id": "N05", "rule": "CNVOI", "verdict": "none", "note": "无音轨语言字段"}, + {"id": "N06", "rule": "60FPS", "verdict": "none"}, + {"id": "N07", "rule": "!3D", "verdict": "none"}, + {"id": "N08", "rule": "ATMOS", "verdict": "none"}, + {"id": "N09", "rule": "GZ", "verdict": "none", "note": "站点标签"}, + {"id": "N10", "rule": "FREE", "verdict": "none", "note": "站点促销"}, + {"id": "N11", "rule": "SEED5", "verdict": "none", "note": "做种数"}, + {"id": "N12", "rule": "CNSUB | 4K", "verdict": "none", "note": "跨字段 OR"}, + {"id": "N13", "rule": "!(4K & REMUX)", "verdict": "none", "note": "跨字段 NOT(AND) = OR"}, + {"id": "N14", "rule": "UHD", "verdict": "none", "note": "ParsedRelease.uhd 有,但硬条件没有"}, + {"id": "N15", "rule": "4K & H265 > 4K", "verdict": "none", "note": "level1 需编码硬条件"}, + {"id": "N16", "rule": "NOSUCHRULE | 4K", "verdict": "none", "note": "未知规则名视为不匹配"}, +] + + +def _filter_mp_root(mp_root: Optional[str]) -> Path: + root = mp_root or os.environ.get("MP_ROOT") or "/opt/moviepilot-plus/upstream/MoviePilot" + return Path(root).resolve() + + +def _filter_mp_commit(root: Path) -> str: + try: + return subprocess.check_output(["git", "-C", str(root), "rev-parse", "--short", "HEAD"], text=True).strip() + except Exception: # noqa: BLE001 + return "unknown" + + +def gen_filter(out_path: str, mp_root: Optional[str] = None) -> dict: + root = _filter_mp_root(mp_root) + if str(root) not in sys.path: + sys.path.insert(0, str(root)) + old_cwd = os.getcwd() + os.chdir(root) + try: + from unittest.mock import patch + + from app.adapters.system import rust as rust_accel + from app.application.rules import BUILTIN_RULE_SET + from app.domain.context import TorrentInfo + from app.modules.filter import FilterModule + finally: + os.chdir(old_cwd) + + rule_set = {**BUILTIN_RULE_SET, **CUSTOM_RULES} + + class _RuleHelper: + def __init__(self, groups): + self._groups = groups + + def get_rule_group_by_media(self, media=None, group_names=None): # noqa: ARG002 + return self._groups + + def mk(t: dict) -> Any: + return TorrentInfo( + site_name="S", title=t["title"], description=t.get("description") or "", + size=t["size"], seeders=t.get("seeders") or 0, labels=t.get("labels") or [], + downloadvolumefactor=t.get("downloadvolumefactor", 1.0), + ) + + def run(rule: dict, python: bool) -> list[Optional[int]]: + module = FilterModule() + module.rulehelper = _RuleHelper([SimpleNamespace(name=rule["id"], rule_string=rule["rule"])]) + module.rule_set = rule_set + mi = SimpleNamespace(**rule["mediainfo"]) if rule.get("mediainfo") else None + out: list[Optional[int]] = [] + for t in TORRENTS: # 逐条过滤,和订阅匹配链路(单种子列表)一致 + ti = mk(t) + if python: + with patch("app.modules.filter.rust_accel.is_enabled", return_value=False): + res = module.filter_torrents(rule_groups=[rule["id"]], torrent_list=[ti], mediainfo=mi) + else: + res = module.filter_torrents(rule_groups=[rule["id"]], torrent_list=[ti], mediainfo=mi) + out.append(res[0].pri_order if res else None) + return out + + rust_ok = rust_accel.is_enabled() + cases = [] + rust_mismatch = [] + for rule in RULES: + py = run(rule, python=True) + rs = run(rule, python=False) if rust_ok else py + for t, p, r in zip(TORRENTS, py, rs): + cid = f"{rule['id']}:{t['id']}" + if p != r: + rust_mismatch.append({"caseId": cid, "python": p, "rust": r}) + cases.append({ + "caseId": cid, "ruleId": rule["id"], "torrentId": t["id"], + "mp": {"matched": p is not None, "priOrder": p, "level": (101 - p) if p is not None else None}, + }) + + out = Path(out_path) + deviations: dict = {} + if out.exists(): + try: + deviations = json.loads(out.read_text("utf-8")).get("deviations", {}) + except Exception: # noqa: BLE001 + deviations = {} + doc = { + "generatedFrom": { + "repo": "MoviePilot", "commit": _filter_mp_commit(root), + "engine": "python-fallback (app.modules.filter FilterModule, rust_accel disabled)", + "rustCrossCheck": {"available": rust_ok, "mismatches": rust_mismatch}, + "generator": "scripts/mp-sync/gen-differential.py filter", + "semantics": "level = 1-based index of first matching '>' tier; priOrder = 101 - level (MP pri_order)", + }, + "customRules": CUSTOM_RULES, + "torrents": TORRENTS, + "rules": RULES, + "cases": cases, + "deviations": deviations, + } + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(json.dumps(doc, ensure_ascii=False, indent=1) + "\n", "utf-8") + return doc + + +def gen_filter_cmd() -> None: + d = gen_filter(str(DOMAIN_DIFF / "filter-cases.json"), str(MP_ROOT)) + print(f"filter: cases={len(d['cases'])} rust≠python={len(d['generatedFrom']['rustCrossCheck']['mismatches'])}") + + + +# ---------------------------------------------------------------- rss / indexer:RSS 与站点列表页解析 +# MoviePilot RSS / 站点索引解析 差分期望生成器。 +# +# 用 MoviePilot(MP_ROOT,须用其 .venv 的 python 运行)的 **Python 回退路径** 解析本项目的 fixture, +# 把输入、MP 输出(同时附带 Rust 快路径输出作参考)写成 JSON,供 +# `packages/adapters/test/differential/{rss,indexer}.test.ts` 与本项目解析器逐字段比对。 +# +# - RSS:`app/application/rss.py RssHelper._parse_impl`(注入假 HTTP/解析端口,解析端口返回 None 强制走 +# lxml 回退;`parse_rss_items_fast` 另行直接调用记录到 `mp_rust`)。 +# - 站点索引:`app/modules/indexer/spider/__init__.py SiteSpider.parse`(把 `rust_accel.parse_indexer_torrents/ +# parse_indexer_subtitles` 打桩为 None 强制走 PyQuery 回退;再恢复原函数跑一次记录 `mp_rust`)。 +# MP 自带站点定义在加密资源 `user.sites.v3.bin`(Cython `SitesHelper`),未认证用户 `get_indexer()` 返回 {}, +# `get_indexsites()` 只含 id/name/url,因此 indexer 配置改用本项目 `definitions/*.json`(同 MP schema)。 +# 输入先由 `deno run -A packages/adapters/test/differential/export-inputs.ts` 导出 tk-* fixture。 + +UMT_ROOT = REPO +DEFAULT_OUT = UMT_ROOT / "packages/adapters/test/differential" +DEFINITIONS_DIR = UMT_ROOT / "packages/adapters/src/sites/definitions" + +_BOOTSTRAPPED = False + + +def _mp_root() -> Path: + root = os.environ.get("MP_ROOT") + if not root: + raise SystemExit("需要环境变量 MP_ROOT(MoviePilot 源码根目录)") + return Path(root).resolve() + + +def _bootstrap() -> Path: + """隔离 CONFIG_DIR 并建表(复用 MP 测试引导),固定进程时区为 UTC,返回 MP_ROOT。""" + global _BOOTSTRAPPED + root = _mp_root() + if _BOOTSTRAPPED: + return root + # 时区固定为 UTC:RSS 的 astimezone(None) 与站点 normalize_datetime 结果与宿主时区无关 + os.environ["TZ"] = "UTC" + time.tzset() + if str(root) not in sys.path: + sys.path.insert(0, str(root)) + cwd = os.getcwd() + os.chdir(root) + try: + from app.testing.bootstrap import prepare_backend # noqa: WPS433 + + prepare_backend() + # 同 MP tests/conftest.py configure_plugin_system_services:装配类型化配置快照与 runtime setting + from app.application.configuration import ( + RuntimeConfiguration, + RuntimeSettingsService, + configure_runtime_configuration, + configure_runtime_settings, + ) + from app.runtime.config import settings + from app.runtime.settings import configure_runtime_setting_provider + from app.startup.composition.configuration import ( + build_api_runtime_config, + build_chain_runtime_config, + build_scheduler_runtime_config, + ) + + configure_runtime_configuration(RuntimeConfiguration( + api=lambda: build_api_runtime_config(settings), + scheduler=lambda: build_scheduler_runtime_config(settings), + chain=lambda: build_chain_runtime_config(settings), + )) + configure_runtime_settings(RuntimeSettingsService(settings)) + configure_runtime_setting_provider(lambda key: getattr(settings, key)) + _freeze_dateparser_now() + finally: + os.chdir(cwd) + _BOOTSTRAPPED = True + return root + + +# MP normalize_datetime 用 dateparser.parse(value) 无 settings,相对时间("3小时前")按当前时刻换算; +# 为使期望文件可复现,冻结其相对基准。 +FROZEN_NOW = "2026-09-27T12:00:00" + + +def _freeze_dateparser_now() -> None: + import datetime as _dt + + import dateparser as _real + from app.foundation import temporal + + base = _dt.datetime.fromisoformat(FROZEN_NOW) + + class _Shim: + @staticmethod + def parse(value, *args, **kwargs): + settings = dict(kwargs.pop("settings", None) or {}) + settings.setdefault("RELATIVE_BASE", base) + return _real.parse(value, *args, settings=settings, **kwargs) + + temporal.dateparser = _Shim() + + +def _mp_commit(root: Path) -> str: + try: + return subprocess.check_output(["git", "-C", str(root), "rev-parse", "HEAD"], text=True).strip() + except Exception: # noqa: BLE001 + return "unknown" + + +def _sha256(data: bytes) -> str: + return hashlib.sha256(data).hexdigest() + + +def _load_existing(path: Path) -> dict: + if path.exists(): + try: + return json.loads(path.read_text("utf-8")) + except Exception: # noqa: BLE001 + return {} + return {} + + +def _jsonable(v: Any) -> Any: + import datetime as _dt + + if isinstance(v, _dt.datetime): + return v.isoformat() + if isinstance(v, dict): + return {k: _jsonable(x) for k, x in v.items()} + if isinstance(v, (list, tuple)): + return [_jsonable(x) for x in v] + return v + + +# --------------------------------------------------------------------------- RSS + + +def _run_mp_rss_python(xml_text: str) -> dict: + """走 RssHelper._parse_impl 的 lxml 回退分支;返回 {status, items}。""" + import datetime as _dt + + from app.adapters.network.http import RequestUtils + from app.application.rss import RssHelper, configure_rss_ports, reset_rss_ports + + raw = xml_text.encode("utf-8") + + class _Http: + def get(self, **_kw): + return SimpleNamespace(status_code=200, content=raw, text=xml_text, + apparent_encoding="utf-8", encoding="utf-8", headers={}) + + def post(self, **_kw): # pragma: no cover + raise AssertionError("不应 POST") + + @staticmethod + def decode_xml(response, **kw): + return RequestUtils.get_decoded_xml_content(response, **kw) + + class _Browser: + @staticmethod + def render(**_kw): # pragma: no cover + raise AssertionError("不应访问浏览器") + + class _Parser: + @staticmethod + def parse(_content, _max): + return None # 关闭 Rust,强制 Python 回退 + + calls: list = [] + original = RssHelper._parse_publish_time + + def _spy(value): + dt = original(value) + calls.append({"text": value, "naive": bool(dt is not None and dt.tzinfo is None), + "wall": dt.replace(tzinfo=None).isoformat() if dt is not None else None}) + return dt + + RssHelper._parse_publish_time = staticmethod(_spy) + configure_rss_ports(http=_Http(), browser=_Browser(), parser=_Parser()) + try: + result = RssHelper().parse("https://differential.invalid/rss") + finally: + reset_rss_ports() + RssHelper._parse_publish_time = staticmethod(original) + + if result is None: + return {"status": "none_expired", "items": []} + if result is False: + return {"status": "false_error", "items": []} + items = [] + for it in result: + out = {k: it.get(k) for k in ("title", "description", "link", "enclosure", "size")} + if "nickname" in it: + out["nickname"] = it["nickname"] + pd = it.get("pubdate") + if pd == "": + out["pubdate"] = {"kind": "absent"} + else: + call = calls.pop(0) if calls else {"text": None, "naive": False, "wall": None} + if pd is None: + out["pubdate"] = {"kind": "unparsed", "text": call["text"]} + else: + utc = pd.astimezone(_dt.timezone.utc) + out["pubdate"] = { + "kind": "naive" if call["naive"] else "aware", + "text": call["text"], + # naive:MP 以宿主本地时区解释(astimezone(None));wall 为墙上时间 + "wall": call["wall"], + "utc": utc.strftime("%Y-%m-%dT%H:%M:%S.") + f"{utc.microsecond // 1000:03d}Z", + } + items.append(out) + return {"status": "ok", "items": items} + + +def _run_mp_rss_rust(xml_text: str) -> Optional[dict]: + try: + import moviepilot_rust # type: ignore + except Exception as err: # noqa: BLE001 + return {"status": "unavailable", "error": str(err)} + stripped = xml_text.strip() + if not stripped or not stripped.startswith("<"): + return {"status": "not_called", "note": "RssHelper.__parse_with_rust 对非 < 开头内容直接返回 None"} + try: + return {"status": "ok", "items": _jsonable(moviepilot_rust.parse_rss_items_fast(xml_text, 1001))} + except BaseException as err: # noqa: BLE001 + return {"status": "error", "error": f"{type(err).__name__}: {err}"} + + +def gen_rss(out_dir: Optional[str] = None) -> Path: + """生成 <out_dir>/rss.json;返回文件路径。""" + root = _bootstrap() + out = Path(out_dir).resolve() if out_dir else DEFAULT_OUT + inputs = sorted(glob.glob(str(out / "inputs/rss/*.xml")) + glob.glob(str(out / "inputs/rss/*.txt"))) + target = out / "rss.json" + existing = _load_existing(target) + samples = [] + for f in inputs: + p = Path(f) + data = p.read_bytes() + text = data.decode("utf-8") + samples.append({ + "id": p.stem, + "input": {"file": f"inputs/rss/{p.name}", "sha256": _sha256(data)}, + "mp": _run_mp_rss_python(text), + "mp_rust": _run_mp_rss_rust(text), + }) + doc = { + "kind": "rss", + "generatedFrom": { + "repo": "MoviePilot", "commit": _mp_commit(root), + "function": "app/application/rss.py RssHelper._parse_impl (lxml fallback; parser port -> None)", + "rust": "moviepilot_rust.parse_rss_items_fast (reference only)", + "tz": "UTC", "generator": "gen-differential.py rss", + }, + "fields": ["title", "description", "link", "enclosure", "size", "pubdate", "nickname"], + "samples": samples, + "deviations": existing.get("deviations", {}), + } + target.write_text(json.dumps(doc, ensure_ascii=False, indent=2) + "\n", "utf-8") + return target + + +# --------------------------------------------------------------------------- 站点索引 + + +def _run_mp_spider(indexer: dict, html: str, keyword: Optional[str], search_type: str, use_rust: bool) -> dict: + from app.adapters.system import rust as rust_accel + from app.modules.indexer.spider import SiteSpider + + orig_t, orig_s = rust_accel.parse_indexer_torrents, rust_accel.parse_indexer_subtitles + if not use_rust: + rust_accel.parse_indexer_torrents = lambda **_kw: None + rust_accel.parse_indexer_subtitles = lambda **_kw: None + try: + spider = SiteSpider(indexer, keyword=keyword, search_type=search_type) + rows = spider.parse(html) + return {"is_error": bool(spider.is_error), "torrents": _jsonable(rows)} + except BaseException as err: # noqa: BLE001 + return {"status": "error", "error": f"{type(err).__name__}: {err}"} + finally: + rust_accel.parse_indexer_torrents, rust_accel.parse_indexer_subtitles = orig_t, orig_s + + +SUBTITLE_INDEXER = { + # 取自 MP tests/test_rust_accel.py::test_rust_subtitle_parser_is_several_times_faster_than_python + "id": "hhanclub-subtitles", "name": "憨憨(字幕)", "domain": "https://hhanclub.net/", "public": False, + "subtitles": { + "list": {"selector": "#subtitles-table > div"}, + "fields": { + "language_icon": {"selector": "div:nth-child(1) img", "attribute": "src"}, + "title": {"selector": 'div:nth-child(2) a[href*="downloadsubs.php"]'}, + "download": {"selector": 'div:nth-child(2) a[href*="downloadsubs.php"]', "attribute": "href"}, + "size": {"selector": "div:nth-child(3)"}, + "date_added": {"selector": "div:nth-child(4) span", "attribute": "title"}, + "date_elapsed": {"selector": "div:nth-child(4) span"}, + "grabs": {"defualt_value": 0}, + "uploader": {"selector": 'div:nth-child(2) a[href*="userdetails.php"]'}, + "report": {"selector": 'div:nth-child(5) a[href*="report.php"]', "attribute": "href"}, + }, + }, +} + + +def _subtitle_html() -> str: + rows = [] + for i in range(3): + rows.append(f"""<div class="grid"><div><img src="pic/flag/china.gif"></div><div> +<a href="downloadsubs.php?torrentid={i}&subid={i + 1000}">Example Show S01E0{i + 1} 1080p WEB-DL CHS</a> +<a href="https://hhanclub.net/userdetails.php?id={i}"><b>tester{i}</b></a></div> +<div><div>111.99 KB</div></div><div><span title="2026-04-21 20:54:37">1月18天</span></div> +<div><a href="report.php?subtitle={i + 1000}">举报</a></div></div>""") + return f'<div id="subtitles-table">{"".join(rows)}</div>' + + +def gen_indexer(out_dir: Optional[str] = None) -> Path: + """生成 <out_dir>/indexer.json;返回文件路径。""" + root = _bootstrap() + out = Path(out_dir).resolve() if out_dir else DEFAULT_OUT + target = out / "indexer.json" + existing = _load_existing(target) + idx_dir = out / "inputs/indexer" + + defs = {} + for f in sorted(DEFINITIONS_DIR.glob("*.json")): + d = json.loads(f.read_text("utf-8")) + if (d.get("umt") or {}).get("kind") == "nexusphp": + defs[d["id"]] = (f, d) + + def page(name: str) -> tuple[str, dict]: + data = (idx_dir / name).read_bytes() + return data.decode("utf-8"), {"file": f"inputs/indexer/{name}", "sha256": _sha256(data)} + + runs: list[tuple[str, dict, dict, str, dict, Optional[str], str]] = [] + list_pages = ["tk-audiences-list.html.txt", "tk-hhanclub-list.html.txt", "tk-chdbits-list.html.txt"] + for site_id, (f, d) in defs.items(): + for pg in list_pages: + sid = f"{site_id}@{pg.removesuffix(".html.txt")}" + runs.append((sid, d, {"source": "definition", "id": site_id, + "file": str(f.relative_to(UMT_ROOT)), "sha256": _sha256(f.read_bytes())}, + pg, {}, "x", "torrents")) + for site_id, pg in (("audiences", "tk-audiences-login.html.txt"), ("chdbits", "tk-chdbits-login.html.txt")): + f, d = defs[site_id] + runs.append((f"{site_id}@{pg.removesuffix(".html.txt")}", d, {"source": "definition", "id": site_id, + "file": str(f.relative_to(UMT_ROOT)), + "sha256": _sha256(f.read_bytes())}, + pg, {}, "x", "torrents")) + for cfg in sorted(idx_dir.glob("*.indexer.json")): + d = json.loads(cfg.read_text("utf-8")) + name = cfg.name.replace(".indexer.json", "") + # 同名 <name>.html.txt 优先,否则用共享的 hw-dsl-rows.html.txt(.txt 后缀避免 biome 按 HTML 做 a11y lint) + pg = f"{name}.html.txt" if (idx_dir / f"{name}.html.txt").exists() else "hw-dsl-rows.html.txt" + runs.append((f"{name}@{pg.removesuffix(".html.txt")}", d, {"source": "inline", "file": f"inputs/indexer/{cfg.name}", + "config": d}, pg, {}, None, "torrents")) + + samples = [] + for sid, indexer, def_meta, pg, _extra, keyword, stype in runs: + html, meta = page(pg) + samples.append({ + "id": sid, + "definition": def_meta, + "input": meta, + "query": {"keyword": keyword, "search_type": stype}, + "mp": _run_mp_spider(indexer, html, keyword, stype, use_rust=False), + "mp_rust": _run_mp_spider(indexer, html, keyword, stype, use_rust=True), + }) + # 字幕:本项目未移植(静态登记),仍记录 MP 输出作为将来补迁的期望 + sub_html = _subtitle_html() + samples.append({ + "id": "hhanclub-subtitles@inline", + "definition": {"source": "inline", "config": SUBTITLE_INDEXER}, + "input": {"inline": sub_html, "sha256": _sha256(sub_html.encode())}, + "query": {"keyword": "Example Show", "search_type": "subtitles"}, + "mp": _run_mp_spider(SUBTITLE_INDEXER, sub_html, "Example Show", "subtitles", use_rust=False), + "mp_rust": _run_mp_spider(SUBTITLE_INDEXER, sub_html, "Example Show", "subtitles", use_rust=True), + }) + doc = { + "kind": "indexer", + "generatedFrom": { + "repo": "MoviePilot", "commit": _mp_commit(root), + "function": "app/modules/indexer/spider/__init__.py SiteSpider.parse (PyQuery fallback)", + "rust": "moviepilot_rust.parse_indexer_torrents_fast / parse_indexer_subtitles_fast (reference only)", + "definitions": "packages/adapters/src/sites/definitions/*.json (MP 内置定义加密且需认证,不可用)", + "tz": "UTC", "dateparserNow": FROZEN_NOW, "generator": "gen-differential.py indexer", + }, + "fields": ["title", "description", "page_url", "enclosure", "size", "seeders", "peers", "grabs", + "downloadvolumefactor", "uploadvolumefactor", "freedate", "hit_and_run", "category", + "pubdate", "date_elapsed", "imdbid", "labels"], + "samples": samples, + "deviations": existing.get("deviations", {}), + } + target.write_text(json.dumps(doc, ensure_ascii=False, indent=2) + "\n", "utf-8") + return target + + +def gen_rss_cmd() -> None: + print("rss: wrote", gen_rss(None)) + + +def gen_indexer_cmd() -> None: + print("indexer: wrote", gen_indexer(None)) + + +COMMANDS = {"meta": gen_meta, "zhconv": gen_zhconv, "filter": gen_filter_cmd, "rss": gen_rss_cmd, "indexer": gen_indexer_cmd} + + +def main(argv: list[str]) -> int: + cmd = argv[1] if len(argv) > 1 else "all" + if cmd == "all": + # MP 运行时配置是进程级全局状态,每个子命令独立进程执行 + for name in COMMANDS: + subprocess.run([sys.executable, __file__, name], check=True) + return 0 + if cmd not in COMMANDS: + print(f"unknown command {cmd}; choose from {', '.join(COMMANDS)} / all", file=sys.stderr) + return 2 + COMMANDS[cmd]() + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv))