Snapshot differential tests (known deviations registered, current state passes): - title/path recognition: 216 samples vs MP MetaInfo/MetaInfoPath - filter rules: 42 rules x 28 torrents vs MP FilterModule - RSS/indexer parsing: 15 feeds, 72 indexer samples - zhconv: 69 samples Generator: scripts/mp-sync/gen-differential.py; report: docs/porting/mp-rust-logic-parity.md Co-Authored-By: Claude Opus 5.5 <[email protected]>
1063 lines
34 KiB
JSON
1063 lines
34 KiB
JSON
{
|
|
"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": "<b>Atom.Entry.Two</b>",
|
|
"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": "<b>Atom.Entry.Two</b>",
|
|
"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 `</title>`, but `</item>` was found"
|
|
}
|
|
},
|
|
{
|
|
"id": "hw-rss-cdata",
|
|
"input": {
|
|
"file": "inputs/rss/hw-rss-cdata.xml",
|
|
"sha256": "ab3d319aec7b1cd8775b7144c7ebf848178d7cc3cfe6210d938b098ba7560cfa"
|
|
},
|
|
"mp": {
|
|
"status": "ok",
|
|
"items": [
|
|
{
|
|
"title": "[BDMV] 奥本海默 Oppenheimer 2023 <UHD> & more",
|
|
"description": "<p>Size: 78.42 GB</p><img src=\"x.jpg\"/>",
|
|
"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 <Title> 中文",
|
|
"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 脱敏。"
|
|
}
|
|
}
|
|
}
|