565 lines
124 KiB
HTML
565 lines
124 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Spider 校验 HTML 报告</title>
|
|
<style>
|
|
:root {
|
|
color-scheme: light;
|
|
--bg: #eef3f1;
|
|
--panel: #ffffff;
|
|
--text: #102027;
|
|
--muted: #57707d;
|
|
--accent: #0f766e;
|
|
--accent-soft: #d7f3ee;
|
|
--danger: #b42318;
|
|
--danger-soft: #fde7e4;
|
|
--border: #d8e3df;
|
|
--shadow: 0 16px 40px rgba(16, 32, 39, 0.08);
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
font-family: "Segoe UI", "PingFang SC", "Noto Sans SC", sans-serif;
|
|
background:
|
|
radial-gradient(circle at top left, rgba(15, 118, 110, 0.12), transparent 28%),
|
|
linear-gradient(180deg, #f7faf9 0%, var(--bg) 100%);
|
|
color: var(--text);
|
|
}
|
|
|
|
a {
|
|
color: var(--accent);
|
|
text-decoration: none;
|
|
}
|
|
|
|
a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.page {
|
|
width: min(1600px, calc(100vw - 32px));
|
|
margin: 0 auto;
|
|
padding: 24px 0 40px;
|
|
}
|
|
|
|
.hero {
|
|
display: grid;
|
|
gap: 18px;
|
|
margin-bottom: 18px;
|
|
padding: 24px;
|
|
border: 1px solid rgba(15, 118, 110, 0.16);
|
|
border-radius: 20px;
|
|
background: linear-gradient(135deg, rgba(255, 255, 255, 0.96), rgba(231, 245, 241, 0.96));
|
|
box-shadow: var(--shadow);
|
|
}
|
|
|
|
.hero h1 {
|
|
margin: 0;
|
|
font-size: clamp(30px, 5vw, 42px);
|
|
line-height: 1.05;
|
|
letter-spacing: -0.03em;
|
|
}
|
|
|
|
.hero p {
|
|
margin: 0;
|
|
color: var(--muted);
|
|
font-size: 15px;
|
|
}
|
|
|
|
.summary-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
|
gap: 12px;
|
|
}
|
|
|
|
.summary-card {
|
|
padding: 14px 16px;
|
|
border: 1px solid var(--border);
|
|
border-radius: 16px;
|
|
background: rgba(255, 255, 255, 0.84);
|
|
}
|
|
|
|
.summary-card span {
|
|
display: block;
|
|
font-size: 12px;
|
|
color: var(--muted);
|
|
margin-bottom: 6px;
|
|
}
|
|
|
|
.summary-card strong {
|
|
font-size: 24px;
|
|
letter-spacing: -0.03em;
|
|
}
|
|
|
|
.panel {
|
|
margin-top: 18px;
|
|
padding: 20px;
|
|
border: 1px solid var(--border);
|
|
border-radius: 20px;
|
|
background: var(--panel);
|
|
box-shadow: var(--shadow);
|
|
}
|
|
|
|
.panel h2 {
|
|
margin: 0 0 12px;
|
|
font-size: 18px;
|
|
}
|
|
|
|
.filters {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
gap: 12px;
|
|
align-items: end;
|
|
}
|
|
|
|
.filter {
|
|
display: grid;
|
|
gap: 6px;
|
|
}
|
|
|
|
.filter label {
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: var(--muted);
|
|
}
|
|
|
|
.filter input,
|
|
.filter select,
|
|
.filter button {
|
|
width: 100%;
|
|
min-height: 42px;
|
|
padding: 10px 12px;
|
|
border: 1px solid var(--border);
|
|
border-radius: 12px;
|
|
background: #fff;
|
|
color: var(--text);
|
|
font: inherit;
|
|
}
|
|
|
|
.filter button {
|
|
background: var(--accent);
|
|
color: #fff;
|
|
border-color: var(--accent);
|
|
cursor: pointer;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.filter button:hover {
|
|
filter: brightness(0.97);
|
|
}
|
|
|
|
#summary-line {
|
|
margin: 14px 0 0;
|
|
color: var(--muted);
|
|
font-size: 14px;
|
|
}
|
|
|
|
.table-wrap {
|
|
overflow: auto;
|
|
border: 1px solid var(--border);
|
|
border-radius: 16px;
|
|
}
|
|
|
|
table {
|
|
width: 100%;
|
|
min-width: 1300px;
|
|
border-collapse: collapse;
|
|
background: #fff;
|
|
}
|
|
|
|
thead {
|
|
background: #f4faf8;
|
|
}
|
|
|
|
th,
|
|
td {
|
|
padding: 12px 14px;
|
|
border-bottom: 1px solid var(--border);
|
|
vertical-align: top;
|
|
text-align: left;
|
|
font-size: 13px;
|
|
}
|
|
|
|
td {
|
|
line-height: 1.45;
|
|
word-break: break-word;
|
|
}
|
|
|
|
th button {
|
|
all: unset;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
cursor: pointer;
|
|
font-weight: 700;
|
|
color: var(--text);
|
|
}
|
|
|
|
th button .sort-indicator {
|
|
color: var(--muted);
|
|
font-size: 11px;
|
|
}
|
|
|
|
.status {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 4px 10px;
|
|
border-radius: 999px;
|
|
font-weight: 700;
|
|
font-size: 12px;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.status.success {
|
|
color: var(--accent);
|
|
background: var(--accent-soft);
|
|
}
|
|
|
|
.status.failed {
|
|
color: var(--danger);
|
|
background: var(--danger-soft);
|
|
}
|
|
|
|
.empty {
|
|
padding: 28px 14px;
|
|
text-align: center;
|
|
color: var(--muted);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.page {
|
|
width: min(100vw - 20px, 1600px);
|
|
padding-top: 16px;
|
|
}
|
|
|
|
.hero,
|
|
.panel {
|
|
padding: 16px;
|
|
border-radius: 16px;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="page">
|
|
<section class="hero">
|
|
<div>
|
|
<h1>Spider 校验 HTML 报告</h1>
|
|
<p>本地静态报告,支持前端即时筛选与表头排序。 <a href="spiders_v2.json" target="_blank">spiders_v2.json</a></p>
|
|
<p><a href="https://github.com/har01d5/tvbox" target="_blank">GitHub仓库地址</a></p>
|
|
</div>
|
|
<div class="summary-grid">
|
|
<div class="summary-card"><span>生成时间</span><strong id="generated-at"></strong></div>
|
|
<div class="summary-card"><span>并发线程</span><strong id="max-workers"></strong></div>
|
|
<div class="summary-card"><span>总数</span><strong id="total-count"></strong></div>
|
|
<div class="summary-card"><span>成功</span><strong id="success-count"></strong></div>
|
|
<div class="summary-card"><span>失败</span><strong id="failed-count"></strong></div>
|
|
<div class="summary-card"><span>总耗时</span><strong id="total-duration"></strong></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>筛选</h2>
|
|
<div class="filters">
|
|
<div class="filter">
|
|
<label for="status-filter">状态</label>
|
|
<select id="status-filter"></select>
|
|
</div>
|
|
<div class="filter">
|
|
<label for="stage-filter">失败阶段</label>
|
|
<select id="stage-filter"></select>
|
|
</div>
|
|
<div class="filter">
|
|
<label for="keyword-filter">爬虫名 / 文件名关键字</label>
|
|
<input id="keyword-filter" type="search" placeholder="例如 alpha / 4K指南" />
|
|
</div>
|
|
<div class="filter">
|
|
<label for="duration-min-filter">最小耗时(ms)</label>
|
|
<input id="duration-min-filter" type="number" min="0" />
|
|
</div>
|
|
<div class="filter">
|
|
<label for="duration-max-filter">最大耗时(ms)</label>
|
|
<input id="duration-max-filter" type="number" min="0" />
|
|
</div>
|
|
<div class="filter">
|
|
<label for="reset-filters">操作</label>
|
|
<button id="reset-filters" type="button">重置筛选</button>
|
|
</div>
|
|
</div>
|
|
<p id="summary-line">当前显示 0 / 0 条</p>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>明细结果</h2>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th><button type="button" data-sort-key="spider">爬虫 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="status">状态 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="failed_stage">失败阶段 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="total">总耗时 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="module_load">模块加载 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="init">初始化 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="home">首页分类 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="category">分类列表 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="detail">视频详情 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="player">播放地址 <span class="sort-indicator"></span></button></th>
|
|
<th><button type="button" data-sort-key="url_check">地址校验 <span class="sort-indicator"></span></button></th>
|
|
<th>返回地址</th>
|
|
<th>错误信息</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="results-body"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<script>
|
|
const report = {"generated_at": "2026-07-22T09:05:03+08:00", "max_workers": 16, "total_duration_ms": 24133.437, "summary": {"total": 119, "success": 91, "failed": 28, "success_rate": 0.7647, "stage_failures": {"module_load": 0, "init": 0, "home": 6, "category": 14, "detail": 3, "player": 1, "url_check": 1, "unexpected": 3}}, "results": [{"spider": "4KVM", "file": "4KVM.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 208.935, "init": 0.001, "home": 559.251, "category": 0.025, "detail": 362.351, "player": 748.558, "url_check": 432.427, "total": 2353.547}, "counts": {"classes": 6, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "-1", "vod_id": "ch4cnej9w", "flag": "alists", "play_id": "36394|ch4cnej9w"}, "player": {"parse": 0, "url": "https://oss.douyinbit.com/m3u8/d26f573c366b17d3d5a3fedfe49b219f.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://oss.douyinbit.com/m3u8/d26f573c366b17d3d5a3fedfe49b219f.m3u8", "reason": null}}, {"spider": "4K指南", "file": "4K指南.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 213.468, "init": 0.001, "home": 0.003, "category": 742.84, "detail": 752.069, "player": 0.006, "url_check": 148.625, "total": 1894.335}, "counts": {"classes": 5, "category_videos": 50, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "zuixin", "vod_id": "20505", "flag": "夸克网盘", "play_id": "push://https://pan.quark.cn/s/36102771ee20"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/36102771ee20", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/36102771ee20", "reason": null}}, {"spider": "6V磁力", "file": "6V磁力.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 209.69, "init": 0.006, "home": 0.001, "category": 757.496, "detail": 886.446, "player": 0.004, "url_check": 0.055, "total": 3542.146}, "counts": {"classes": 12, "category_videos": 18, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "dianshiju/rihanju", "vod_id": "/dianshiju/rihanju/29186.html", "flag": "全集打包.1080p.HD中字.mp4", "play_id": "magnet:?xt=urn:btih:ddf38b5a37f1592e50da986dd44beaf5357e2e58&dn=%E9%AC%BC%E8%B0%9C%E4%B8%9C%E5%AE%AB.6v%E7%94%B5%E5%BD%B1%20%E5%9C%B0%E5%9D%80%E5%8F%91%E5%B8%83%E9%A1%B5%20www.6v123.net%20%E6%94%B6%E8%97%8F%E4%B8%8D%E8%BF%B7%E8%B7%AF"}, "player": {"parse": 0, "url": "magnet:?xt=urn:btih:ddf38b5a37f1592e50da986dd44beaf5357e2e58&dn=%E9%AC%BC%E8%B0%9C%E4%B8%9C%E5%AE%AB.6v%E7%94%B5%E5%BD%B1%20%E5%9C%B0%E5%9D%80%E5%8F%91%E5%B8%83%E9%A1%B5%20www.6v123.net%20%E6%94%B6%E8%97%8F%E4%B8%8D%E8%BF%B7%E8%B7%AF", "valid": true, "reachable": null, "status_code": null, "final_url": "magnet:?xt=urn:btih:ddf38b5a37f1592e50da986dd44beaf5357e2e58&dn=%E9%AC%BC%E8%B0%9C%E4%B8%9C%E5%AE%AB.6v%E7%94%B5%E5%BD%B1%20%E5%9C%B0%E5%9D%80%E5%8F%91%E5%B8%83%E9%A1%B5%20www.6v123.net%20%E6%94%B6%E8%97%8F%E4%B8%8D%E8%BF%B7%E8%B7%AF", "reason": "非 HTTP 地址,按协议格式通过"}}, {"spider": "AAZ音乐", "file": "AAZ音乐.txt", "success": false, "failed_stage": "unexpected", "error": "('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))", "traceback": "Traceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 787, in urlopen\n response = self._make_request(\n conn,\n ...<10 lines>...\n **response_kw,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 534, in _make_request\n response = conn.getresponse()\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connection.py\", line 571, in getresponse\n httplib_response = super().getresponse()\n File \"/home/harold/.local/share/uv/python/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/http/client.py\", line 1450, in getresponse\n response.begin()\n ~~~~~~~~~~~~~~^^\n File \"/home/harold/.local/share/uv/python/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/http/client.py\", line 336, in begin\n version, status, reason = self._read_status()\n ~~~~~~~~~~~~~~~~~^^\nhttp.client.RemoteDisconnected: Remote end closed connection without response\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/requests/adapters.py\", line 645, in send\n resp = conn.urlopen(\n method=request.method,\n ...<9 lines>...\n chunked=chunked,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 841, in urlopen\n retries = retries.increment(\n method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/retry.py\", line 490, in increment\n raise reraise(type(error), error, _stacktrace)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/util.py\", line 38, in reraise\n raise value.with_traceback(tb)\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 787, in urlopen\n response = self._make_request(\n conn,\n ...<10 lines>...\n **response_kw,\n )\nurllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 756, in validate_spider_file\n home_result = _run_timed(result[\"timings_ms\"], \"home\", spider.homeContent, clock, False)\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 318, in _run_timed\n return func(*args, **kwargs)\n File \"/home/harold/workspace/tvbox-resources/py/AAZ音乐.txt\", line 220, in homeContent\n File \"/home/harold/workspace/tvbox-resources/py/AAZ音乐.txt\", line 57, in _fetch_html\n File \"/home/harold/workspace/atv-spiders/py/base/spider.py\", line 145, in fetch\n rsp = requests.get(url, params=params, cookies=cookies, headers=headers, timeout=timeout, verify=verify,\n stream=stream, allow_redirects=allow_redirects)\nrequests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))\n", "timings_ms": {"module_load": 201.309, "init": 0.001, "home": 196.867, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 447.31}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "APP影院", "file": "APP影院.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 208.638, "init": 0.004, "home": 0.003, "category": 289.007, "detail": 180.788, "player": 256.493, "url_check": 867.249, "total": 1849.14}, "counts": {"classes": 8, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "596611", "flag": "闪电播放", "play_id": "596611~2~1"}, "player": {"parse": 0, "url": "https://v13.qqqrst.com/yyv13/202607/21/cUYa8dtrEb27/video/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v13.qqqrst.com/yyv13/202607/21/cUYa8dtrEb27/video/index.m3u8", "reason": null}}, {"spider": "BT影视", "file": "BT影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 208.909, "init": 0.069, "home": 0.003, "category": 439.392, "detail": 364.72, "player": 374.882, "url_check": 0.06, "total": 1433.354}, "counts": {"classes": 2, "category_videos": 32, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movies", "vod_id": "47969096", "flag": "Disclosure.Day.2026.2160p.iT.WEB-DL.DV.HDR10.DDP5.1.Atmos.H265.MP4-BTM[ext.to]", "play_id": "847749992"}, "player": {"parse": 0, "url": "magnet:?xt=urn:btih:a1ad8f2ea70254e145a91aae9a24140feea37a84", "valid": true, "reachable": null, "status_code": null, "final_url": "magnet:?xt=urn:btih:a1ad8f2ea70254e145a91aae9a24140feea37a84", "reason": "非 HTTP 地址,按协议格式通过"}}, {"spider": "PPnix", "file": "PPnix.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 197.368, "init": 0.001, "home": 0.002, "category": 505.419, "detail": 465.668, "player": 0.009, "url_check": 181.941, "total": 1400.755}, "counts": {"classes": 2, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "movie/8329.html", "flag": "PPnix", "play_id": "8329|1080P"}, "player": {"parse": 0, "url": "https://www.ppnix.com/info/m3u8/8329/1080P.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.ppnix.com/info/m3u8/8329/1080P.m3u8", "reason": null}}, {"spider": "Pomo", "file": "Pomo.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 206.634, "init": 0.001, "home": 0.004, "category": 260.758, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 863.739}, "counts": {"classes": 7, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "huayurm", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "QQ音乐", "file": "QQ音乐.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 198.326, "init": 0.023, "home": 0.008, "category": 309.806, "detail": 326.968, "player": 1003.498, "url_check": 60.031, "total": 1952.295}, "counts": {"classes": 6, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "playlist", "vod_id": "playlist:7757834782", "flag": "QQ音乐", "play_id": "qqmusic:0013TCdl37SVzP:235175529|Cruel Summer - Taylor Swift"}, "player": {"parse": 0, "url": "https://isure.stream.qqmusic.qq.com/F0000040rOp00lZYHC.flac?guid=f072172ba842da1258c2a2487ff8992a&vkey=23BD48E5888B923B1886D8BD5D2ED99868EA22DE44E0B4DB65CEBA9BE36DF63840C8F001A3DEA817A88353C46387CFD71F10F9F5D28B581A__v2b9ab543&uin=1152921504846230218&fromtag=119114&redirect=1", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://isure.stream.qqmusic.qq.com/F0000040rOp00lZYHC.flac?guid=f072172ba842da1258c2a2487ff8992a&vkey=23BD48E5888B923B1886D8BD5D2ED99868EA22DE44E0B4DB65CEBA9BE36DF63840C8F001A3DEA817A88353C46387CFD71F10F9F5D28B581A__v2b9ab543&uin=1152921504846230218&fromtag=119114&redirect=1", "reason": null}}, {"spider": "YouTube", "file": "YouTube.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 222.215, "init": 0.008, "home": 0.085, "category": 768.344, "detail": 1808.241, "player": 0.005, "url_check": 761.086, "total": 3591.811}, "counts": {"classes": 29, "category_videos": 17, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "cat_recommend", "vod_id": "yt:playlist:PLvOO0btloRntAi-VnV06M1Bu0X1xljUUP", "flag": "YouTube", "play_id": "yt:entry:PLvOO0btloRntAi-VnV06M1Bu0X1xljUUP:5dTOPen28ts"}, "player": {"parse": 0, "url": "https://www.youtube.com/watch?v=5dTOPen28ts&list=PLvOO0btloRntAi-VnV06M1Bu0X1xljUUP", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.youtube.com/watch?v=5dTOPen28ts&list=PLvOO0btloRntAi-VnV06M1Bu0X1xljUUP", "reason": null}}, {"spider": "libvio", "file": "libvio.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 200.509, "init": 0.001, "home": 0.002, "category": 216.638, "detail": 218.791, "player": 0.005, "url_check": 171.109, "total": 854.084}, "counts": {"classes": 6, "category_videos": 48, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "index", "vod_id": "714893574", "flag": "夸克", "play_id": "https://pan.quark.cn/s/ecaada49455b"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/ecaada49455b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/ecaada49455b", "reason": null}}, {"spider": "mifun", "file": "mifun.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 241.731, "init": 0.007, "home": 1230.86, "category": 763.338, "detail": 567.845, "player": 538.54, "url_check": 240.38, "total": 3590.539}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "19792", "flag": "快看云", "play_id": "快看云@@direct@@ba11073ae57ba0eede130eeda148f635,v0ddadg10001d99t2ivog65vkuq2dsvg,token+,1,1"}, "player": {"parse": 0, "url": "https://v9.douyinvod.com/94860ac56b3da444772de84a8799d02e/6a6070e1/video/tos/cn/tos-cn-v-5f73e7/oserepQRCfnovTaU1tKX05AIM8OOXBozbCsU6I/?a=0&ch=0&cr=0&dr=2&er=0&lr=test&cd=0%7C0%7C0%7C0&br=1657&bt=1657&cs=0&ds=4&ft=S9lstHiHH_Myq8ZAUKN_e2NvjTQ&mime_type=video_mp4&qs=13&rc=anY1eHk5cmx3PDQzNGdnM0BpanY1eHk5cmx3PDQzNGdnM0BzYW5oMmRzLzZhLS1kXmFzYSNzYW5oMmRzLzZhLS1kXmFzcw%3D%3D&btag=c0000e00038000&dy_q=1784682227&l=20260722090347514E07B6B3798EF3417D", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v9.douyinvod.com/94860ac56b3da444772de84a8799d02e/6a6070e1/video/tos/cn/tos-cn-v-5f73e7/oserepQRCfnovTaU1tKX05AIM8OOXBozbCsU6I/?a=0&ch=0&cr=0&dr=2&er=0&lr=test&cd=0%7C0%7C0%7C0&br=1657&bt=1657&cs=0&ds=4&ft=S9lstHiHH_Myq8ZAUKN_e2NvjTQ&mime_type=video_mp4&qs=13&rc=anY1eHk5cmx3PDQzNGdnM0BpanY1eHk5cmx3PDQzNGdnM0BzYW5oMmRzLzZhLS1kXmFzYSNzYW5oMmRzLzZhLS1kXmFzcw%3D%3D&btag=c0000e00038000&dy_q=1784682227&l=20260722090347514E07B6B3798EF3417D", "reason": null}}, {"spider": "youknow", "file": "youknow.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 236.758, "init": 0.001, "home": 0.001, "category": 2116.488, "detail": 1661.451, "player": 1144.845, "url_check": 468.594, "total": 5642.21}, "counts": {"classes": 7, "category_videos": 223, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "index", "vod_id": "205003", "flag": "YouKnowTV", "play_id": "eyJ2b2RfaWQiOiIyMDUwMDMiLCJlcGlzb2RlX2luZGV4IjoxLCJ0aXRsZSI6IuesrDHpm4YiLCJjYW5kaWRhdGVzIjpbeyJzb3VyY2UiOiLnur_ot68xIiwic291cmNlX2lkIjoiMSIsImVwaXNvZGVfdXJsIjoiaHR0cHM6Ly93d3cueW91a25vdy50di9wLzIwNTAwMy0xLTEvIn0seyJzb3VyY2UiOiLnur_ot68yIiwic291cmNlX2lkIjoiMSIsImVwaXNvZGVfdXJsIjoiaHR0cHM6Ly93d3cueW91a25vdy50di9wLzIwNTAwMy0xLTEvIn0seyJzb3VyY2UiOiLnur_ot68zNiIsInNvdXJjZV9pZCI6IjIiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUwMDMtMi0xLyJ9LHsic291cmNlIjoi57q_6LevMzciLCJzb3VyY2VfaWQiOiIyIiwiZXBpc29kZV91cmwiOiJodHRwczovL3d3dy55b3Vrbm93LnR2L3AvMjA1MDAzLTItMS8ifSx7InNvdXJjZSI6Iue6v-i3rzcxIiwic291cmNlX2lkIjoiMyIsImVwaXNvZGVfdXJsIjoiaHR0cHM6Ly93d3cueW91a25vdy50di9wLzIwNTAwMy0zLTEvIn0seyJzb3VyY2UiOiLnur_ot683MiIsInNvdXJjZV9pZCI6IjMiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUwMDMtMy0xLyJ9XX0"}, "player": {"parse": 0, "url": "https://vip.dytt-tvs.com/20260627/25759_ba307c1f/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://play2.jimxtc.com/20260627/25759_ba307c1f/index.m3u8", "reason": null}}, {"spider": "七味", "file": "七味.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 231.798, "init": 0.007, "home": 0.001, "category": 777.563, "detail": 694.771, "player": 0.003, "url_check": 164.733, "total": 1883.165}, "counts": {"classes": 5, "category_videos": 42, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "82347", "flag": "夸克1", "play_id": "https://pan.quark.cn/s/11c20fc20e00"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/11c20fc20e00", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/11c20fc20e00", "reason": null}}, {"spider": "不太灵", "file": "不太灵.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 223.612, "init": 0.002, "home": 1020.812, "category": 1062.507, "detail": 1169.737, "player": 0.005, "url_check": 1213.019, "total": 6791.35}, "counts": {"classes": 5, "category_videos": 25, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "37096230", "flag": "百度", "play_id": "https://pan.baidu.com/s/1fTF4krrz4FCAlnilpTUVFg?pwd=Yu66"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1fTF4krrz4FCAlnilpTUVFg?pwd=Yu66", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=fTF4krrz4FCAlnilpTUVFg&pwd=Yu66", "reason": null}}, {"spider": "世纪音乐", "file": "世纪音乐.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 190.819, "init": 0.001, "home": 129.17, "category": 110.306, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 552.973}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "rank_list", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "两个BT", "file": "两个BT.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 9.342, "init": 0.001, "home": 0.001, "category": 468.683, "detail": 470.094, "player": 725.439, "url_check": 292.267, "total": 1966.385}, "counts": {"classes": 14, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "zgjun", "vod_id": "ch34wxjbl", "flag": "两个BT", "play_id": "eyJwaWQiOiIvcGxheS9jaDM0d3hqYmwiLCJzaWQiOiJjaDM0d3hqYmwiLCJuYW1lIjoiMSJ9"}, "player": {"parse": 0, "url": "https://cloudcube.telecomjs.com/media-zjhz-fy-home/FAMILYCLOUD/c1419bf9-b1b2-442d-a27b-a5b55f7f4315.mp4?x-obs-traffic-limit=409600&X-Amz-Date=20260722T005212Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&x-amz-CLIENTTYPEIN=PC&X-Amz-Credential=SZshenghuo/20260722/us-east-1/s3/aws4_request&x-amz-UID=300001730784375&x-amz-APPID=93005&response-content-disposition=attachment%3Bfilename%3D%25E8%25A3%2585%25E5%258F%25B0.E01.mp4&x-amz-OPERID=300001730795859&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=FAMILY&X-Amz-SignedHeaders=host&X-Amz-Expires=10800&x-amz-FSIZE=1359738584&x-amz-UFID=123401267192443289&X-Amz-Signature=2c904e5e89cf70ad636a90b36840d6c8f61c259dc8e802c0148ea2c11e8d6167", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cloudcube.telecomjs.com/media-zjhz-fy-home/FAMILYCLOUD/c1419bf9-b1b2-442d-a27b-a5b55f7f4315.mp4?x-obs-traffic-limit=409600&X-Amz-Date=20260722T005212Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&x-amz-CLIENTTYPEIN=PC&X-Amz-Credential=SZshenghuo/20260722/us-east-1/s3/aws4_request&x-amz-UID=300001730784375&x-amz-APPID=93005&response-content-disposition=attachment%3Bfilename%3D%25E8%25A3%2585%25E5%258F%25B0.E01.mp4&x-amz-OPERID=300001730795859&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=FAMILY&X-Amz-SignedHeaders=host&X-Amz-Expires=10800&x-amz-FSIZE=1359738584&x-amz-UFID=123401267192443289&X-Amz-Signature=2c904e5e89cf70ad636a90b36840d6c8f61c259dc8e802c0148ea2c11e8d6167", "reason": null}}, {"spider": "乌云影视", "file": "乌云影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.19, "init": 0.001, "home": 409.026, "category": 377.72, "detail": 700.082, "player": 0.02, "url_check": 710.656, "total": 2206.847}, "counts": {"classes": 7, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "movie", "vod_id": "1087907", "flag": "乌云影视", "play_id": "eyJtZWRpYUlkIjogIjEwODc5MDciLCAic2Vhc29uTm8iOiAxLCAiZXBObyI6IDEsICJ2aWRlb0lkIjogNTEwNzM1MjcsICJwbGF5VXJsIjogImh0dHBzOi8vd29veXVuLnR2L2dlbl9vdmVyc2Vhcy9odHRwczovL3YuZmVuZ2JhbzEwLmNvbS92aWRlby96aGlmYWppYW9jaGFkaWFuLzRlMThiYTU1YjY2Yi9pbmRleC5tM3U4IiwgIm5hbWUiOiAi56ysMembhiBIRCJ9"}, "player": {"parse": 0, "url": "https://wooyun.tv/gen_overseas/https://v.fengbao10.com/video/zhifajiaochadian/4e18ba55b66b/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vod-cdn.findtv.me/hls_overseas/d6384f0fd0baef02ce48e4f979c7244c2fa8b459.m3u8", "reason": null}}, {"spider": "乐兔", "file": "乐兔.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 4.237, "init": 0.0, "home": 0.0, "category": 599.615, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1033.917}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "2", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "二小", "file": "二小.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.89, "init": 0.001, "home": 0.001, "category": 1705.444, "detail": 230.638, "player": 0.004, "url_check": 964.86, "total": 2909.317}, "counts": {"classes": 4, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "12759", "flag": "百度#二小", "play_id": "https://pan.baidu.com/s/1_d60_IrScRAY6Qxe2BmwNw?pwd=mgzz"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1_d60_IrScRAY6Qxe2BmwNw?pwd=mgzz", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=_d60_IrScRAY6Qxe2BmwNw&pwd=mgzz", "reason": null}}, {"spider": "云朵", "file": "云朵.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.985, "init": 0.001, "home": 1304.716, "category": 912.32, "detail": 718.82, "player": 723.305, "url_check": 1830.231, "total": 5495.713}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "58276", "flag": "vwnet", "play_id": "vwnet-7dd2229116d64b36aced0a80d58fe774"}, "player": {"parse": 0, "url": "https://yun.jiexicn.top/api/banyun/7dd2229116d64b36aced0a80d58fe774.m3u8?ZDZmZGI5TTZFM2UrSE9BMU5wRHJlVDA3Ymh0S2hYWHVTS1U2M2FNM28xSzBIa2tmdmtJUFgzVldBWXJxVDhjaVpiditlY1QzbTN4ZkNRa0FseEtnT3ZBc3A1aFlhT1lkc1AwanAvYXdIUndZZUc3MThiSVpOcHBKUS9abkJOOUw5cml3QlN2SmlFUkJvdG1LR0xTUS9KWnIzc2VkZ1JZ", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://yun.jiexicn.top/api/banyun/7dd2229116d64b36aced0a80d58fe774.m3u8?ZDZmZGI5TTZFM2UrSE9BMU5wRHJlVDA3Ymh0S2hYWHVTS1U2M2FNM28xSzBIa2tmdmtJUFgzVldBWXJxVDhjaVpiditlY1QzbTN4ZkNRa0FseEtnT3ZBc3A1aFlhT1lkc1AwanAvYXdIUndZZUc3MThiSVpOcHBKUS9abkJOOUw5cml3QlN2SmlFUkJvdG1LR0xTUS9KWnIzc2VkZ1JZ", "reason": null}}, {"spider": "人人电影", "file": "人人电影.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.877, "init": 0.001, "home": 0.001, "category": 603.24, "detail": 526.919, "player": 0.012, "url_check": 1004.295, "total": 2138.868}, "counts": {"classes": 4, "category_videos": 10, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movie/list_2", "vod_id": "/movie/2020/0302/8902.html", "flag": "baidu", "play_id": "https://pan.baidu.com/s/1xBD6KMz445vesz2PpxYWbg?pwd=ypd2"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1xBD6KMz445vesz2PpxYWbg?pwd=ypd2", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=xBD6KMz445vesz2PpxYWbg&pwd=ypd2", "reason": null}}, {"spider": "人人视频", "file": "人人视频.txt", "success": false, "failed_stage": "url_check", "error": "HTTP 403", "traceback": null, "timings_ms": {"module_load": 4.531, "init": 0.0, "home": 233.725, "category": 305.579, "detail": 317.68, "player": 391.753, "url_check": 162.631, "total": 2570.817}, "counts": {"classes": 4, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "MOVIE", "vod_id": "58241", "flag": "人人专线", "play_id": "58241@388415"}, "player": {"parse": 0, "url": "https://tfxs1ge3drmttgchnhcj3gazdgpy.ourdvsssvip.com:20443/ws-302.bwcgee.cn/6030095a7b3971f1840f5017f0e90402/e8e9b94510d94f1db197b50941db0199-7482482f8fb2eba0a7462fb8ec54e10e-ld.mp4?key=0c19bc851aecc255dfa22443f0ccb8ab&time=1784696692102&clientType=web_pc&clientVersion=1.0.0&parseUsage=PLAY&uid=0&rk=3cb22c312cab47308ad30475b4a89882&hevc=false&seasonId=58241&wsiphost=ipdbme&wsrid_tag=6a601734_PS-000-01nyA23_9477-41934-s1t1784682292184&x-mamba-business-label=13551&redirect_cnt=0&ip_type=0&wshc=C&requery=0", "valid": false, "reachable": false, "status_code": 403, "final_url": "https://tfxs1ge3drmttgchnhcj3gazdgpy.ourdvsssvip.com:20443/ws-302.bwcgee.cn/6030095a7b3971f1840f5017f0e90402/e8e9b94510d94f1db197b50941db0199-7482482f8fb2eba0a7462fb8ec54e10e-ld.mp4?key=0c19bc851aecc255dfa22443f0ccb8ab&time=1784696692102&clientType=web_pc&clientVersion=1.0.0&parseUsage=PLAY&uid=0&rk=3cb22c312cab47308ad30475b4a89882&hevc=false&seasonId=58241&wsiphost=ipdbme&wsrid_tag=6a601734_PS-000-01nyA23_9477-41934-s1t1784682292184&x-mamba-business-label=13551&redirect_cnt=0&ip_type=0&wshc=C&requery=0", "reason": "HTTP 403"}}, {"spider": "优酷", "file": "优酷.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 48.168, "init": 0.001, "home": 0.001, "category": 314.713, "detail": 551.147, "player": 0.002, "url_check": 241.442, "total": 1156.202}, "counts": {"classes": 6, "category_videos": 23, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "电视剧", "vod_id": "show:bbaf2557249a4f2a9447", "flag": "优酷", "play_id": "https://v.youku.com/v_show/id_XNjUyMTM3MTY0OA==.html"}, "player": {"parse": 1, "url": "https://v.youku.com/v_show/id_XNjUyMTM3MTY0OA==.html", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.youku.com/v_show/id_XNjUyMTM3MTY0OA==.html", "reason": null}}, {"spider": "低端影视", "file": "低端影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 24.649, "init": 0.001, "home": 0.001, "category": 1128.967, "detail": 826.633, "player": 0.007, "url_check": 467.516, "total": 2448.575}, "counts": {"classes": 4, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "series", "vod_id": "movie/yirans-silver-linings", "flag": "播放源 1 (1080P)", "play_id": "https://v.lzcdn27.com/20260721/13747_c8e080a5/index.m3u8"}, "player": {"parse": 0, "url": "https://v.lzcdn27.com/20260721/13747_c8e080a5/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.lzcdn27.com/20260721/13747_c8e080a5/index.m3u8", "reason": null}}, {"spider": "修罗", "file": "修罗.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 32.628, "init": 0.001, "home": 0.001, "category": 686.532, "detail": 296.623, "player": 1668.908, "url_check": 1161.664, "total": 3847.421}, "counts": {"classes": 4, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movie", "vod_id": "jingsong/27009", "flag": "修罗直连", "play_id": "play/27009-0"}, "player": {"parse": 0, "url": "https://v.xl01.eu.cc/obj/4087ED3AEA376F0E4557FC4AC1ABDA42CFE6B0EBB7176B50B407DE49ECBCD76D", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://lf26-imcloud-file-sign.bytetos.com/tos-cn-o-0000c2428/ocynEGinAJBUYk5XAABBAmKx4Y1QkBBLA8iCfG?x-expires=1784683950&x-signature=HxXDN9zfZpre8Hd%2FNoOhzps1Ds8%3D", "reason": null}}, {"spider": "免费短剧", "file": "免费短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.765, "init": 0.01, "home": 0.0, "category": 339.628, "detail": 492.257, "player": 0.002, "url_check": 912.521, "total": 1748.644}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "https://20.90kan.cc/?id=65425", "flag": "百度", "play_id": "https://pan.baidu.com/s/1XjJ98NSfw4hdiUCTyibWYA?pwd=6666"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1XjJ98NSfw4hdiUCTyibWYA?pwd=6666", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=XjJ98NSfw4hdiUCTyibWYA&pwd=6666", "reason": null}}, {"spider": "农民", "file": "农民.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 16.678, "init": 0.001, "home": 204.194, "category": 261.339, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 782.848}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "juji", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "凡客TV", "file": "凡客TV.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 4.57, "init": 0.001, "home": 0.001, "category": 753.148, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1369.239}, "counts": {"classes": 8, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "2", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "剧圈圈", "file": "剧圈圈.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 5.986, "init": 0.001, "home": 0.0, "category": 628.299, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1497.464}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "juji", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "剧看", "file": "剧看.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.774, "init": 147.028, "home": 0.071, "category": 106.121, "detail": 547.027, "player": 196.198, "url_check": 47.291, "total": 1051.275}, "counts": {"classes": 5, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "194798", "flag": "蓝光B线-在线看", "play_id": "BBA@FYNB-3538646366616439356532633335373505168b6b37fa017c5ce07b5588b7d3c27028f8cb59992e49c9cfa18bcd9fde8dba6ffdcfe04ede6c02ef1cd10789ead878cd4814d7c742fdab44820f0a0fbfb3bc6e07db1c11911c8c35008de292b9bb198081bcb0b1d186cdf988bf3c7d6e2834f9930851e1154a432e01a4d315cad0692bcea1628805f8c0369a54525a8be8fce64d73c8930e317be774b1211ada10a906cd9f6b8ad2644420cf068414ae5bb938c17e80434dd940daf3be73863d5cce92c7e76d46b73185f7b0e44c75db57"}, "player": {"parse": 0, "url": "https://lf6-csp-sign.bytetos.com/tos-cn-v-5f73e7/oUtBiAE2mt9Po9rUEZWcifilm1KO1EDGLg0aQQ?x-expires=1784682876&x-signature=oI9kLP9VJQQ3uFYCqRuOzmn1REI%3D&filename=BBA.mp4", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://lf6-csp-sign.bytetos.com/tos-cn-v-5f73e7/oUtBiAE2mt9Po9rUEZWcifilm1KO1EDGLg0aQQ?x-expires=1784682876&x-signature=oI9kLP9VJQQ3uFYCqRuOzmn1REI%3D&filename=BBA.mp4", "reason": null}}, {"spider": "剧迷", "file": "剧迷.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.378, "init": 0.001, "home": 0.001, "category": 318.313, "detail": 410.517, "player": 537.866, "url_check": 1077.346, "total": 2349.807}, "counts": {"classes": 6, "category_videos": 55, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "472650", "flag": "gimy", "play_id": "472650-5-1"}, "player": {"parse": 0, "url": "https://vip.dytt-network.com/20260713/36404_e4df7614/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip.dytt-network.com/20260713/36404_e4df7614/index.m3u8", "reason": null}}, {"spider": "华数影视", "file": "华数影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.284, "init": 0.0, "home": 0.001, "category": 748.444, "detail": 316.712, "player": 193.826, "url_check": 518.837, "total": 1782.869}, "counts": {"classes": 5, "category_videos": 40, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "961", "vod_id": "961@176980", "flag": "华数专线", "play_id": "aHR0cHM6Ly92aWRlby41Zy53YXN1LnR2L3Bjc2FuMjQvcGMvbW92aWUvMjAyNi0wNy8xNS8yMDI2MDcxNTE0MTQ0NDc3MVhrWE91TXNULm1wNA"}, "player": {"parse": 0, "url": "https://pcvideo.5g.wasu.tv/pcsan24/pc/movie/2026-07/15/20260715141444771XkXOuMsT/playlist.m3u8?auth_key=1784682292-0-0-ba375717da89b6d0fc4416d7ce6a93ad", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pcvideo.5g.wasu.tv/pcsan24/pc/movie/2026-07/15/20260715141444771XkXOuMsT/playlist.m3u8?auth_key=1784682292-0-0-ba375717da89b6d0fc4416d7ce6a93ad", "reason": null}}, {"spider": "博看听书", "file": "博看听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.518, "init": 0.001, "home": 2894.372, "category": 270.438, "detail": 683.471, "player": 0.002, "url_check": 154.407, "total": 4009.611}, "counts": {"classes": 11, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1319", "vod_id": "902849", "flag": "博看听书", "play_id": "http://audio.bookan.com.cn/video1/audio/20200706001/aache64_133068a2.m4a"}, "player": {"parse": 0, "url": "http://audio.bookan.com.cn/video1/audio/20200706001/aache64_133068a2.m4a", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://audio.bookan.com.cn/video1/audio/20200706001/aache64_133068a2.m4a", "reason": null}}, {"spider": "双子星", "file": "双子星.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 13.396, "init": 0.006, "home": 413.578, "category": 86.453, "detail": 158.062, "player": 0.002, "url_check": 112.548, "total": 785.432}, "counts": {"classes": 6, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "11404", "flag": "线路D", "play_id": "http://jx1-jiexijiekou.050713.xyz/m3u8/m3u812/1783583955.m3u8"}, "player": {"parse": 0, "url": "http://jx1-jiexijiekou.050713.xyz/m3u8/m3u812/1783583955.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://jx1-jiexijiekou.050713.xyz/m3u8/m3u812/1783583955.m3u8", "reason": null}}, {"spider": "双星", "file": "双星.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.396, "init": 402.788, "home": 0.009, "category": 151.297, "detail": 149.413, "player": 0.002, "url_check": 145.494, "total": 857.185}, "counts": {"classes": 7, "category_videos": 15, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "ju", "vod_id": "/ju/10953.html", "flag": "夸克", "play_id": "https://pan.quark.cn/s/d5c527bf1640"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/d5c527bf1640", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/d5c527bf1640", "reason": null}}, {"spider": "听书", "file": "听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.679, "init": 76.059, "home": 0.001, "category": 190.547, "detail": 2809.726, "player": 269.872, "url_check": 49.67, "total": 3401.337}, "counts": {"classes": 11, "category_videos": 10, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "6", "vod_id": "63", "flag": "直链", "play_id": "2926931|||63"}, "player": {"parse": 0, "url": "http://audiopay.cos.tx.xmcdn.com/download/1.0.0/storages/b817-audiopay/16/AA/GKwRIaIGGaRGADgE-gEx_hMS-aacv2-48K.m4a?sign=4f98e10052fd41a51cc54a98a7cb4df9&buy_key=FM&token=1980×tamp=1784682294&duration=453", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://audiopay.cos.tx.xmcdn.com/download/1.0.0/storages/b817-audiopay/16/AA/GKwRIaIGGaRGADgE-gEx_hMS-aacv2-48K.m4a?sign=4f98e10052fd41a51cc54a98a7cb4df9&buy_key=FM&token=1980×tamp=1784682294&duration=453", "reason": null}}, {"spider": "听友FM", "file": "听友FM.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.376, "init": 0.001, "home": 1541.429, "category": 501.49, "detail": 586.032, "player": 319.058, "url_check": 133.78, "total": 3090.157}, "counts": {"classes": 8, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "46", "vod_id": "9783312385", "flag": "听友FM", "play_id": "9783312385|1"}, "player": {"parse": 0, "url": "https://file.hgeuz.cn/stream/eJwANwDI_wJVZgVKIIrU0ECux-GJ1PSt38ahythCqsH-r9TAQ4rj5F94rOjbQKjk063xyIX2z3hfeGcIHF4BAAD__5DtISY.?ts=1784678914&sign=5a1214f88b9ba8cd7404e2c42bbf093c", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://file.hgeuz.cn/stream/eJwANwDI_wJVZgVKIIrU0ECux-GJ1PSt38ahythCqsH-r9TAQ4rj5F94rOjbQKjk063xyIX2z3hfeGcIHF4BAAD__5DtISY.?ts=1784678914&sign=5a1214f88b9ba8cd7404e2c42bbf093c", "reason": null}}, {"spider": "咕咕动漫", "file": "咕咕动漫.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.155, "init": 0.005, "home": 720.398, "category": 452.626, "detail": 408.054, "player": 1850.0, "url_check": 350.588, "total": 3790.581}, "counts": {"classes": 3, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "6", "vod_id": "5060", "flag": "咕咕新线(国内高速)", "play_id": "parse_api=a2796a09189261bcaf3cc4542d7c5ac2&url=gKHiY0ehfmeiqEkNTNlewhQUXIaXYT6xVtXj2OMC1PAqnPs8eZh9Xeg4PdgE/69a&token=|攻壳机动队 THE GHOST IN THE SHELL|1"}, "player": {"parse": 0, "url": "https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/9101a212e8dd442e80037fabb966e15d~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1815786294&x-signature=bluluFyHw8m1NbNqXeyKX38eGlM%3D", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/9101a212e8dd442e80037fabb966e15d~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1815786294&x-signature=bluluFyHw8m1NbNqXeyKX38eGlM%3D", "reason": null}}, {"spider": "四万影视", "file": "四万影视.txt", "success": false, "failed_stage": "category", "error": "HTTPSConnectionPool(host='40000.me', port=443): Read timed out. (read timeout=10)", "traceback": null, "timings_ms": {"module_load": 4.01, "init": 0.001, "home": 0.001, "category": 10014.768, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 20034.879}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "30", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "在线之家", "file": "在线之家.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.904, "init": 0.001, "home": 0.001, "category": 663.224, "detail": 1476.704, "player": 778.251, "url_check": 666.741, "total": 3594.6}, "counts": {"classes": 6, "category_videos": 12, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "4601", "flag": "zxzj", "play_id": "vodplay/4601-1-1.html"}, "player": {"parse": 1, "url": "https://www.zxzjys.com/vodplay/4601-1-1.html", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.zxzj.run/vodplay/4601-1-1.html", "reason": null}}, {"spider": "多多", "file": "多多.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 11.323, "init": 0.001, "home": 0.001, "category": 1997.557, "detail": 593.508, "player": 0.004, "url_check": 1081.596, "total": 3684.689}, "counts": {"classes": 6, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "9676", "flag": "百度#多多", "play_id": "https://pan.baidu.com/s/1-9Aj9JgyGr0Xu6N0TCDcQQ?pwd=yyds"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1-9Aj9JgyGr0Xu6N0TCDcQQ?pwd=yyds", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=-9Aj9JgyGr0Xu6N0TCDcQQ&pwd=yyds", "reason": null}}, {"spider": "多瑙影视", "file": "多瑙影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.073, "init": 0.002, "home": 0.001, "category": 1090.559, "detail": 577.61, "player": 1059.847, "url_check": 860.571, "total": 4325.865}, "counts": {"classes": 5, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "386878", "flag": "非凡资源", "play_id": "386878-3-1"}, "player": {"parse": 0, "url": "https://super.ffzy-online6.com/20260721/37037_5cc9ab68/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://super.ffzy-online6.com/20260721/37037_5cc9ab68/index.m3u8", "reason": null}}, {"spider": "如意资源", "file": "如意资源.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.523, "init": 0.001, "home": 0.007, "category": 886.934, "detail": 424.6, "player": 0.003, "url_check": 868.289, "total": 2184.943}, "counts": {"classes": 6, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "82213", "flag": "rym3u8", "play_id": "https://svip.ryiplay18.com/20260720/8195_51be31a1/index.m3u8"}, "player": {"parse": 0, "url": "https://svip.ryiplay18.com/20260720/8195_51be31a1/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://svip.ryiplay18.com/20260720/8195_51be31a1/index.m3u8", "reason": null}}, {"spider": "寻川4K", "file": "寻川4K.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 8.51, "init": 445.908, "home": 515.434, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 970.048}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "山楂影视", "file": "山楂影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.406, "init": 125.29, "home": 83.37, "category": 318.628, "detail": 413.126, "player": 550.315, "url_check": 634.192, "total": 2130.048}, "counts": {"classes": 8, "category_videos": 40, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "M16", "vod_id": "1138857", "flag": "YK", "play_id": "1138857@85@19948957@episode"}, "player": {"parse": "0", "url": "https://cibn-edge-5g.1ljx.com/cloud/flv/00a6dc02c4dc6b4b058622fea6b12c39/35ce86f67b457b3cccef2810dd09db2f/6a601736b46ef.m3u8?auth_key=1784682294.739-1-796529309.info-internet-2-llq-6459f71bcab5d164970849f66c63ea00", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cibn-edge-4g.1ljx.com/vod-rose/9ecb05a0a6bb3d8d87db40f2d4081a35eaf97d117f2cd27ce901330169b8b8cb6bf3afc054451c30ac11211a654476fa3b50648404f1ec6ffd36c89575d28e36bfa7f1c66ee0910f2a752f46bd1804a7c498c4ae984b3a6cff91a9aa2c3e9b4b/videoplayback.m3u8?e=&sig=&tg@lirose_tv", "reason": null}}, {"spider": "布布影视", "file": "布布影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.966, "init": 0.001, "home": 0.0, "category": 808.563, "detail": 795.419, "player": 1344.626, "url_check": 505.645, "total": 3461.067}, "counts": {"classes": 4, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "86421", "flag": "CO蓝光(2)", "play_id": "co@1@co_uzc2tzd6xi4age5ryd43dxouwpop5mo776z4twdexhvn5m6yzgz7lzvr37plt2w7"}, "player": {"parse": 0, "url": "https://cibn-edge-5g.1ljx.com/cloud/flv/4169d689f8ce6973f75080c2094c93b6/4e55b00752778cfc18e1cc8484d11aaf/6a6017381831c.m3u8?auth_key=1784682296.0991-1-241092072.info-internet-2-llq-2b9591a3e67b8f45e54fcfca9110849b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cibn-edge-4g.1ljx.com/vod-rose/9ecb05a0a6bb3d8d87db40f2d4081a35d613ef83bca9348245f79e192b68f4b4ccb6e17d403decf82065616ac46fa9c8ca0659c2afe7d1358a26c0b5356a40703fc092cb36ce6adbb2283cd3c5be14ee263f16b9642f31d936701b8b8cc5cc2b/videoplayback.m3u8?e=&sig=&tg@lirose_tv", "reason": null}}, {"spider": "微观短剧", "file": "微观短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.796, "init": 0.023, "home": 203.584, "category": 305.639, "detail": 225.737, "player": 385.219, "url_check": 252.282, "total": 1377.85}, "counts": {"classes": 30, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "逆袭", "vod_id": "110000046951321516", "flag": "超清", "play_id": "110000046951321516:1"}, "player": {"parse": 0, "url": "https://tv-video.cdn.drama.9ddm.com/C1/F6/C1F63C79CBF09E493F99B1E0824CEAB2.mp4?timestamp=1784682294&sign=35875edf715c5f60af19912b13b05930", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://tv-video.cdn.drama.9ddm.com/C1/F6/C1F63C79CBF09E493F99B1E0824CEAB2.mp4?timestamp=1784682294&sign=35875edf715c5f60af19912b13b05930", "reason": null}}, {"spider": "怀桑", "file": "怀桑.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.009, "init": 0.007, "home": 482.218, "category": 194.939, "detail": 169.367, "player": 449.112, "url_check": 421.417, "total": 1724.636}, "counts": {"classes": 8, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "15089", "flag": "线·叁", "play_id": "parse_api=4a720977ebfe3f13296b548e51cc3355&url=XYTy+hIhqvPfYAAWwQW2sqmE/HE6Rw61JVXNU8h7Kd7wkYAL1d4eHFB4Dapbmy8/aJWwiUTZA77dc+xaj7/sbkC6SbxkN08kCx9Y9CLUnFg6Lx/6qYXH7uIjeQ+8hfqwyw5/sAHRd23NYzpE/Oc0L68ZPIVsKnpPhwCqAc/AsUfO3R0QrX65ryELrW3Cy3J3B6hukFwflbHvHVw44MTfjQ==&token=|速度与激情10|1"}, "player": {"parse": 0, "url": "https://vip.nsapi.sbs/nsys/proxy.php?file=3c4850b9a6c6687763b1718e29b82f05.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip.nsapi.sbs/nsys/proxy.php?file=3c4850b9a6c6687763b1718e29b82f05.m3u8", "reason": null}}, {"spider": "悯善", "file": "悯善.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.789, "init": 0.01, "home": 207.958, "category": 209.269, "detail": 103.205, "player": 0.02, "url_check": 982.023, "total": 1592.436}, "counts": {"classes": 5, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "194958", "flag": "高清①", "play_id": "app88:WyJodHRwczovL2Nkbi55enp5dmlwLTI5LmNvbS8yMDI2MDcyMS8yNTk0OV85YWZhZDRjMy9pbmRleC5tM3U4IiwiMTA4MHp5ayIsIuihgOWknOihjCIsIjEiXQ"}, "player": {"parse": 0, "url": "https://cdn.yzzyvip-29.com/20260721/25949_9afad4c3/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzyvip-29.com/20260721/25949_9afad4c3/index.m3u8", "reason": null}}, {"spider": "新片预告", "file": "新片预告.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.664, "init": 0.001, "home": 291.241, "category": 321.356, "detail": 379.694, "player": 347.572, "url_check": 91.796, "total": 1437.446}, "counts": {"classes": 1, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "movlist/", "vod_id": "/movie/85472", "flag": "预告片", "play_id": "/show/195673"}, "player": {"parse": 0, "url": "https://vfx.mtime.cn/Video/2026/07/21/mp4/260721170046507108.mp4", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vfx.mtime.cn/Video/2026/07/21/mp4/260721170046507108.mp4", "reason": null}}, {"spider": "新韩剧网", "file": "新韩剧网.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.076, "init": 0.001, "home": 0.001, "category": 732.158, "detail": 828.333, "player": 507.675, "url_check": 959.524, "total": 3033.283}, "counts": {"classes": 5, "category_videos": 16, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "3695", "flag": "在线云播", "play_id": "3695_1_1"}, "player": {"parse": 0, "url": "https://cdn.yzzy28-play.com/20260713/32446_8aa7db6b/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzy28-play.com/20260713/32446_8aa7db6b/index.m3u8", "reason": null}}, {"spider": "星星短剧", "file": "星星短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.474, "init": 0.0, "home": 0.001, "category": 494.785, "detail": 736.289, "player": 0.002, "url_check": 445.1, "total": 1685.587}, "counts": {"classes": 5, "category_videos": 10, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1287", "vod_id": "437823882657793@@千金驾到@@向往自由的首富千金唐灵自普林斯顿商学院毕业后,非但没有听从爷爷唐天的安排进公司做总裁,反而去荣盛集团那样的小公司实习,唐天拗不过唐灵,只能答应后安排人暗中照顾,却不料,在荣盛集团,唐灵的千金身份被自己的同班同学唐星月所冒用,在唐灵这位正主面前,唐星月不知悔改,一步步迈入贪婪的深渊无法回头。", "flag": "星星短剧", "play_id": "https://img.novel.wsljf.xyz/shortPlay-mp4/437424643637249/GZRfB1754881124538/2a2bf885-69ea-4aa9-80a4-1ebb782af11f/540x960/output.m3u8"}, "player": {"parse": 0, "url": "https://img.novel.wsljf.xyz/shortPlay-mp4/437424643637249/GZRfB1754881124538/2a2bf885-69ea-4aa9-80a4-1ebb782af11f/540x960/output.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://img.novel.wsljf.xyz/shortPlay-mp4/437424643637249/GZRfB1754881124538/2a2bf885-69ea-4aa9-80a4-1ebb782af11f/540x960/output.m3u8", "reason": null}}, {"spider": "木偶", "file": "木偶.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 14.323, "init": 0.001, "home": 0.001, "category": 601.872, "detail": 203.706, "player": 0.008, "url_check": 234.063, "total": 1054.342}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "25", "vod_id": "8318", "flag": "115#木偶", "play_id": "https://115cdn.com/s/swsoh3c36dh?password=q7c5"}, "player": {"parse": 0, "url": "https://115cdn.com/s/swsoh3c36dh?password=q7c5", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://115cdn.com/s/swsoh3c36dh?password=q7c5", "reason": null}}, {"spider": "樱花动漫", "file": "樱花动漫.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 9.577, "init": 0.001, "home": 0.001, "category": 1393.173, "detail": 1432.152, "player": 1523.096, "url_check": 882.331, "total": 5241.064}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "guoman", "vod_id": "711", "flag": "高清", "play_id": "/play/711-1-1/"}, "player": {"parse": 0, "url": "https://yzzy1.play-cdn16.com/20230503/4012_61589bd1/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://yzzy1.play-cdn16.com/20230503/4012_61589bd1/index.m3u8", "reason": null}}, {"spider": "橘子TV", "file": "橘子TV.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.993, "init": 317.946, "home": 432.714, "category": 446.01, "detail": 531.449, "player": 1362.66, "url_check": 1053.527, "total": 4150.216}, "counts": {"classes": 8, "category_videos": 18, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "50", "vod_id": "427195", "flag": "一起看APP", "play_id": "26267919"}, "player": {"parse": 0, "url": "https://usaydd.up8r6jjh.com/m3u87/share/8322305/8517715/20260717/100735/1080/index.m3u8?sign=41938a29d2ef1601d5c4ac1919cf18dd&t=1784682297", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://usaydd.up8r6jjh.com/m3u87/share/8322305/8517715/20260717/100735/1080/index.m3u8?sign=41938a29d2ef1601d5c4ac1919cf18dd&t=1784682297", "reason": null}}, {"spider": "橘汁", "file": "橘汁.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.286, "init": 287.668, "home": 315.338, "category": 133.277, "detail": 119.288, "player": 226.781, "url_check": 126.919, "total": 1215.294}, "counts": {"classes": 7, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "20", "vod_id": "267207", "flag": "FY蓝光", "play_id": "eyJ2b2RQbGF5RnJvbSI6ICJmeW0zdTgiLCAicGxheVVybCI6ICJGWU5CLXllbFM5OVg1LWctUkgzdEF2UmNHLVZpT1lhdWd0eUxXY1dndFFrb1Z5V2lFMTJpN3kwZVNaeHJKN2hhNlpxaHNHREZ2aEQ1RzVMSUVzXzg5SHlUMkR3In0="}, "player": {"parse": 0, "url": "https://m3u8.yeegv.cn:2424/hls/1768641318740.m3u8?token=d33cf03d8a8d0eb07821d85f3bee42e57e6dfbf06496ae4f77f5da91835adaf343a9b0bf5c2ecc2de07a0b1b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://m3u8.yeegv.cn:2424/hls/1768641318740.m3u8?token=d33cf03d8a8d0eb07821d85f3bee42e57e6dfbf06496ae4f77f5da91835adaf343a9b0bf5c2ecc2de07a0b1b", "reason": null}}, {"spider": "次元城", "file": "次元城.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 6.149, "init": 0.001, "home": 262.001, "category": 317.22, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 765.119}, "counts": {"classes": 2, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "21", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "欧歌", "file": "欧歌.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 15.376, "init": 0.001, "home": 0.002, "category": 590.784, "detail": 448.495, "player": 0.006, "url_check": 1030.289, "total": 2085.812}, "counts": {"classes": 6, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "31921", "flag": "百度", "play_id": "https://pan.baidu.com/s/1Rc6pXuUczy2UZVmiIFRQAg?pwd=8888"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1Rc6pXuUczy2UZVmiIFRQAg?pwd=8888", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=Rc6pXuUczy2UZVmiIFRQAg&pwd=8888", "reason": null}}, {"spider": "毒蛇", "file": "毒蛇.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.274, "init": 0.002, "home": 0.001, "category": 624.322, "detail": 288.971, "player": 306.075, "url_check": 641.234, "total": 1866.706}, "counts": {"classes": 5, "category_videos": 18, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "355205", "flag": "超清2", "play_id": "355205-41-4422228"}, "player": {"parse": 0, "url": "https://142.248.96.124:11302/data10/jvods/hls/dhz/142/141548/26071312/1_355205_4424059/1920/index.m3u8?appId=ds91&sign=23ed185d521ed6d9b5f49fbeba36019f×tamp=1784682234&ref=0", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://142.248.96.124:11302/data10/jvods/hls/dhz/142/141548/26071312/1_355205_4424059/1920/index.m3u8?appId=ds91&sign=23ed185d521ed6d9b5f49fbeba36019f×tamp=1784682234&ref=0", "reason": null}}, {"spider": "沐辞4K", "file": "沐辞4K.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 8.093, "init": 88.173, "home": 89.015, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 185.485}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "河马短剧", "file": "河马短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.907, "init": 0.0, "home": 305.999, "category": 333.204, "detail": 276.256, "player": 0.023, "url_check": 119.931, "total": 1040.228}, "counts": {"classes": 18, "category_videos": 10, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "462", "vod_id": "/drama/41000271676", "flag": "河马剧场", "play_id": "https://dzzt-video.cbread.cn/68f023bcde9b4e2137bb1680808c7cb3/6a610520/95/6x7/67x6/676x1/67617200014/615122959_1/615122959.720p.narrowv3.mp4"}, "player": {"parse": 0, "url": "https://dzzt-video.cbread.cn/68f023bcde9b4e2137bb1680808c7cb3/6a610520/95/6x7/67x6/676x1/67617200014/615122959_1/615122959.720p.narrowv3.mp4", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://dzzt-video.cbread.cn/68f023bcde9b4e2137bb1680808c7cb3/6a610520/95/6x7/67x6/676x1/67617200014/615122959_1/615122959.720p.narrowv3.mp4", "reason": null}}, {"spider": "泥视频", "file": "泥视频.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.675, "init": 0.001, "home": 0.001, "category": 450.702, "detail": 542.718, "player": 427.59, "url_check": 185.529, "total": 1612.888}, "counts": {"classes": 6, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "125260", "flag": "自营1线", "play_id": "125260-1-1"}, "player": {"parse": 0, "url": "https://y6fb.vhmzy.com/videos/202607/19/6a5bc43ae1798af8ca591bf3/de09d8/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://y6fb.vhmzy.com/videos/202607/19/6a5bc43ae1798af8ca591bf3/de09d8/index.m3u8", "reason": null}}, {"spider": "海纳TV", "file": "海纳TV.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.045, "init": 0.0, "home": 460.996, "category": 250.411, "detail": 348.794, "player": 1223.876, "url_check": 187.258, "total": 2478.128}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "2", "vod_id": "45381", "flag": "海纳云端", "play_id": "45381-1-1"}, "player": {"parse": 0, "url": "https://jx.hainatv.net/hn/stray/89741848f8268d040ffab01d00f4207c.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://jx.hainatv.net/hn/stray/89741848f8268d040ffab01d00f4207c.m3u8", "reason": null}}, {"spider": "清沅4K", "file": "清沅4K.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 14.289, "init": 172.968, "home": 411.406, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 599.4}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "滴答影视", "file": "滴答影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 10.912, "init": 0.001, "home": 0.001, "category": 540.286, "detail": 500.209, "player": 0.004, "url_check": 140.916, "total": 1192.882}, "counts": {"classes": 5, "category_videos": 48, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "3596", "flag": "夸克", "play_id": "https://pan.quark.cn/s/eb722f35207c"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/eb722f35207c", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/eb722f35207c", "reason": null}}, {"spider": "潮流APP", "file": "潮流APP.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.31, "init": 0.003, "home": 103.347, "category": 105.959, "detail": 133.072, "player": 289.407, "url_check": 99.814, "total": 736.45}, "counts": {"classes": 10, "category_videos": 12, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "10", "vod_id": "75852", "flag": "线路二 (点击换线)", "play_id": "75852@@0@@0"}, "player": {"parse": 0, "url": "http://211.154.21.15:9090/nby/m3u8/getM3u8?name=jx.91by.top&time=1784682296707&url=NBY-c6d046002ed1d767bee10e93ee7f1ff8.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://211.154.21.15:9090/nby/m3u8/getM3u8?name=jx.91by.top&time=1784682296707&url=NBY-c6d046002ed1d767bee10e93ee7f1ff8.m3u8", "reason": null}}, {"spider": "灯泡影视", "file": "灯泡影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 10.954, "init": 0.001, "home": 0.001, "category": 1463.661, "detail": 939.121, "player": 0.005, "url_check": 804.86, "total": 3219.176}, "counts": {"classes": 4, "category_videos": 98, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "", "vod_id": "7932", "flag": "百度", "play_id": "push://https://pan.baidu.com/s/1Lc37qEn__n4rPbFlttjBtg?pwd=a85n"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1Lc37qEn__n4rPbFlttjBtg?pwd=a85n", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/s/1Lc37qEn__n4rPbFlttjBtg?pwd=a85n", "reason": null}}, {"spider": "热播之家", "file": "热播之家.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 14.972, "init": 0.001, "home": 216.714, "category": 309.5, "detail": 236.099, "player": 199.245, "url_check": 147.916, "total": 1126.116}, "counts": {"classes": 5, "category_videos": 12, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "3596", "flag": "UC网盘", "play_id": "/play/3596-2-1.html"}, "player": {"parse": 0, "url": "https://drive.uc.cn/s/565073f38aa84", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://drive.uc.cn/s/565073f38aa84", "reason": null}}, {"spider": "爱壹帆", "file": "爱壹帆.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.994, "init": 0.002, "home": 0.001, "category": 559.061, "detail": 1110.43, "player": 449.538, "url_check": 309.194, "total": 2433.866}, "counts": {"classes": 4, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "125260", "flag": "自营1线", "play_id": "125260-1-1"}, "player": {"parse": 0, "url": "https://y6fb.vhmzy.com/videos/202607/19/6a5bc43ae1798af8ca591bf3/de09d8/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://y6fb.vhmzy.com/videos/202607/19/6a5bc43ae1798af8ca591bf3/de09d8/index.m3u8", "reason": null}}, {"spider": "爱奇艺", "file": "爱奇艺.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 14.36, "init": 0.022, "home": 3113.433, "category": 950.893, "detail": 230.728, "player": 0.002, "url_check": 74.528, "total": 4384.722}, "counts": {"classes": 11, "category_videos": 48, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "pcw:1", "vod_id": "pcw:1$3993682946415500", "flag": "爱奇艺", "play_id": "http://www.iqiyi.com/v_13jun9w5hpc.html"}, "player": {"parse": 1, "url": "http://www.iqiyi.com/v_13jun9w5hpc.html", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.iqiyi.com/v_13jun9w5hpc.html", "reason": null}}, {"spider": "片库", "file": "片库.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 9.052, "init": 0.101, "home": 0.001, "category": 1383.181, "detail": 0.002, "player": 0.002, "url_check": 122.14, "total": 1515.67}, "counts": {"classes": 7, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "genre", "vod_id": "msearch:movie-1368337", "flag": "Test", "play_id": "Test"}, "player": {"parse": 0, "url": "https://v.qq.com/", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.qq.com/", "reason": null}}, {"spider": "独播库", "file": "独播库.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.322, "init": 0.001, "home": 0.001, "category": 499.942, "detail": 356.306, "player": 417.953, "url_check": 215.62, "total": 1497.391}, "counts": {"classes": 6, "category_videos": 48, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "index", "vod_id": "147616", "flag": "独播库", "play_id": "147616-1-1"}, "player": {"parse": 0, "url": "https://vid.dbokutv.com/20260713/ppotb62-S71lT2yliZApDBSvkYzBsrmD3fpCJ4nBtLsRsGlQ79nBNXcBJ0nBJ0nGqOuGpCnGIvjS34/chunklist.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vid.dbokutv.com/20260713/ppotb62-S71lT2yliZApDBSvkYzBsrmD3fpCJ4nBtLsRsGlQ79nBNXcBJ0nBJ0nGqOuGpCnGIvjS34/chunklist.m3u8", "reason": null}}, {"spider": "猫猫4K", "file": "猫猫4K.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 13.946, "init": 194.135, "home": 303.168, "category": 4276.222, "detail": 252.358, "player": 758.551, "url_check": 665.951, "total": 8400.59}, "counts": {"classes": 5, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "60024", "flag": "火猫极速R", "play_id": "https://m.yichengwlkj.com/drama/56521?episodeNo=1@@@rrmj"}, "player": {"parse": 0, "url": "https://png.ruyijx.com/m3u8/KCOii0oRjYaz7J.m3u8?uxXazyUNqLp7F5svHE", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://png.ruyijx.com/m3u8/KCOii0oRjYaz7J.m3u8?uxXazyUNqLp7F5svHE", "reason": null}}, {"spider": "王子4K", "file": "王子4K.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.59, "init": 0.002, "home": 986.636, "category": 592.142, "detail": 733.395, "player": 0.008, "url_check": 614.256, "total": 2933.524}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "383475", "flag": "TY线路", "play_id": "TY线路@@direct@@,https://tyyszywvod2.com/videos/202605/03/69f73cda3d69b2ec9119dcda/cd7d8g/index.m3u8,token+,1,0"}, "player": {"parse": 0, "url": "https://tyyszywvod2.com/videos/202605/03/69f73cda3d69b2ec9119dcda/cd7d8g/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://tyyszywvod2.com/videos/202605/03/69f73cda3d69b2ec9119dcda/cd7d8g/index.m3u8", "reason": null}}, {"spider": "玩偶哥哥", "file": "玩偶哥哥.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.429, "init": 0.001, "home": 0.001, "category": 555.919, "detail": 542.945, "player": 0.003, "url_check": 4585.155, "total": 5691.995}, "counts": {"classes": 8, "category_videos": 70, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "44", "vod_id": "128806", "flag": "百度#玩偶哥哥", "play_id": "https://pan.baidu.com/s/1U16NAKsCs_Oi7RTEhF1JJg?pwd=wogg"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1U16NAKsCs_Oi7RTEhF1JJg?pwd=wogg", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=U16NAKsCs_Oi7RTEhF1JJg&pwd=wogg", "reason": null}}, {"spider": "玩偶聚合", "file": "玩偶聚合.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 47.706, "init": 0.001, "home": 3.577, "category": 2206.215, "detail": 934.76, "player": 0.002, "url_check": 1598.772, "total": 6040.69}, "counts": {"classes": 11, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "site_duoduo", "vod_id": "site:duoduo:/index.php/vod/detail/id/9676.html", "flag": "百度#多多", "play_id": "https://pan.baidu.com/s/1-9Aj9JgyGr0Xu6N0TCDcQQ?pwd=yyds"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1-9Aj9JgyGr0Xu6N0TCDcQQ?pwd=yyds", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=-9Aj9JgyGr0Xu6N0TCDcQQ&pwd=yyds", "reason": null}}, {"spider": "瓜子", "file": "瓜子.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.255, "init": 0.001, "home": 0.016, "category": 375.39, "detail": 838.387, "player": 488.526, "url_check": 605.683, "total": 2314.458}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "128782", "flag": "1080", "play_id": "vod_d_id=128782&vurl_id=3323715&domain_type=8&resolution=1080&type=play"}, "player": {"parse": 0, "url": "https://app.wanglaoshi.xn--fiqs8s/hls/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://app.wanglaoshi.xn--fiqs8s/hls/index.m3u8", "reason": null}}, {"spider": "甜圈漫剧", "file": "甜圈漫剧.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 5.559, "init": 101.657, "home": 0.018, "category": 402.242, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 822.622}, "counts": {"classes": 67, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "热剧榜", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "电影人生", "file": "电影人生.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.294, "init": 0.003, "home": 0.001, "category": 2406.542, "detail": 8961.246, "player": 846.483, "url_check": 1567.784, "total": 13790.893}, "counts": {"classes": 5, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "dianying", "vod_id": "wzzy-71299/68aed1042625dfef5c83a0a2.html", "flag": "超级线路", "play_id": "{\"title\":\"1080P重制\",\"origin\":\"超级线路\",\"page\":\"https://dyrsvip.net/wzzy-71299-68aed1042625dfef5c83a0a2.html?origin=%E8%B6%85%E7%BA%A7%E7%BA%BF%E8%B7%AF&p=0\",\"vodName\":\"愤怒的公牛\",\"pic\":\"https://dyrsvip.net/img/id/68aed1042625dfef5c83a0a2.jpg\"}"}, "player": {"parse": 0, "url": "https://dyrsvip.net/api/m3u8?origin=%E8%B6%85%E7%BA%A7%E7%BA%BF%E8%B7%AF&url=6938fb47af620135ff71e829", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://box.dyrs.com.de/api/super?id=6938fb47af620135ff71e829&origin=%E8%B6%85%E7%BA%A7%E7%BA%BF%E8%B7%AF", "reason": null}}, {"spider": "电影天堂", "file": "电影天堂.txt", "success": false, "failed_stage": "detail", "error": "详情缺少播放源或播放列表", "traceback": null, "timings_ms": {"module_load": 4.997, "init": 158.922, "home": 370.464, "category": 168.395, "detail": 123.888, "player": 0.0, "url_check": 0.0, "total": 1126.441}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 0}, "samples": {"tid": "1", "vod_id": "827850", "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "百度短剧", "file": "百度短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.671, "init": 0.001, "home": 511.872, "category": 201.083, "detail": 601.42, "player": 267.636, "url_check": 27.58, "total": 1616.784}, "counts": {"classes": 29, "category_videos": 9, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "3", "vod_id": "10284595040762396431", "flag": "百度短剧", "play_id": "4723147730512611191|||10284595040762396431"}, "player": {"parse": 0, "url": "http://vd3.bdstatic.com/mda-rgu31fx13xnschwc/1080p/mv_cae264_backtrack_1080p_normal/1753858859061604699/mda-rgu31fx13xnschwc.mp4?v_from_s=haokan-ui-video-hnb", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://vd3.bdstatic.com/mda-rgu31fx13xnschwc/1080p/mv_cae264_backtrack_1080p_normal/1753858859061604699/mda-rgu31fx13xnschwc.mp4?v_from_s=haokan-ui-video-hnb", "reason": null}}, {"spider": "盘Ta", "file": "盘Ta.txt", "success": false, "failed_stage": "unexpected", "error": "('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))", "traceback": "Traceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 787, in urlopen\n response = self._make_request(\n conn,\n ...<10 lines>...\n **response_kw,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 488, in _make_request\n raise new_e\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 464, in _make_request\n self._validate_conn(conn)\n ~~~~~~~~~~~~~~~~~~~^^^^^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 1093, in _validate_conn\n conn.connect()\n ~~~~~~~~~~~~^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connection.py\", line 796, in connect\n sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n sock=sock,\n ...<14 lines>...\n assert_fingerprint=self.assert_fingerprint,\n )\nConnectionResetError: [Errno 104] Connection reset by peer\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/requests/adapters.py\", line 645, in send\n resp = conn.urlopen(\n method=request.method,\n ...<9 lines>...\n chunked=chunked,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 841, in urlopen\n retries = retries.increment(\n method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/retry.py\", line 490, in increment\n raise reraise(type(error), error, _stacktrace)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/util.py\", line 38, in reraise\n raise value.with_traceback(tb)\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 787, in urlopen\n response = self._make_request(\n conn,\n ...<10 lines>...\n **response_kw,\n )\nurllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 756, in validate_spider_file\n home_result = _run_timed(result[\"timings_ms\"], \"home\", spider.homeContent, clock, False)\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 318, in _run_timed\n return func(*args, **kwargs)\n File \"/home/harold/workspace/tvbox-resources/py/盘Ta.txt\", line 230, in homeContent\n File \"/home/harold/workspace/tvbox-resources/py/盘Ta.txt\", line 70, in _request_html\n File \"/home/harold/workspace/atv-spiders/py/base/spider.py\", line 145, in fetch\n rsp = requests.get(url, params=params, cookies=cookies, headers=headers, timeout=timeout, verify=verify,\n stream=stream, allow_redirects=allow_redirects)\nrequests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))\n", "timings_ms": {"module_load": 7.101, "init": 0.001, "home": 2795.48, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 2805.218}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "盘聚", "file": "盘聚.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.713, "init": 0.001, "home": 0.001, "category": 262.97, "detail": 326.37, "player": 220.277, "url_check": 1449.855, "total": 2268.173}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "/", "vod_id": "117429", "flag": "百度1", "play_id": "push://https://www.seedhub.cc/link_start/?redirect_to=pan_id_665773&movie_title=【火遮眼】【4K+1080P】【中字】【极限画质】 更新于 2天前"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1TDNOsLIZkUr8kjw9X5U1og?pwd=2vty", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=TDNOsLIZkUr8kjw9X5U1og&pwd=2vty", "reason": null}}, {"spider": "盘链", "file": "盘链.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 10.077, "init": 0.099, "home": 0.001, "category": 1413.848, "detail": 427.531, "player": 2029.103, "url_check": 587.135, "total": 4468.535}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "0", "vod_id": "-76225", "flag": "百度", "play_id": "push://https://www.xn--vzy265d.cc/api/go.php?t=HIk3iHQi953P8vKhEw9pq37x_AoWssO2gc_xDpeEg-PJSOEXLJfWEYCzpkLweO7nvWoY6Kw4uveIgYCoJHyZvyYqVssEP2n440HdMklUOrbhJ63oMo6E9qG3WfWLozWchXWN_F5vklMKD7t7lhQBi1yIzeTo-0aL5rMsOT1Gywi2IZHGF0t0vTOjrBsGjKeZFME5ybNO05RDgUx-aj6mSxqtMw7Hh-PTeoQk_Jv057s"}, "player": {"parse": 0, "url": "https://pan.baidu.com/share/init?surl=2upe9flYXMT7cng3BuZHNQ&pwd=8888", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=2upe9flYXMT7cng3BuZHNQ&pwd=8888", "reason": null}}, {"spider": "短剧优选", "file": "短剧优选.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 23.478, "init": 466.426, "home": 445.537, "category": 397.858, "detail": 280.711, "player": 0.002, "url_check": 64.89, "total": 1679.864}, "counts": {"classes": 13, "category_videos": 69, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "七猫", "vod_id": "七猫@9193", "flag": "七猫短剧", "play_id": "https://cdn-vod-playlet.wtzw.com/asset/1767000637e5ae01741cf0fc70b9b21b/play_multi_video/6f7310c287644b7c813ab8e2eb7a4a0c/950b0e87416d186247c24505473f5853.m3u8"}, "player": {"parse": 0, "url": "https://cdn-vod-playlet.wtzw.com/asset/1767000637e5ae01741cf0fc70b9b21b/play_multi_video/6f7310c287644b7c813ab8e2eb7a4a0c/950b0e87416d186247c24505473f5853.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn-vod-playlet.wtzw.com/asset/1767000637e5ae01741cf0fc70b9b21b/play_multi_video/6f7310c287644b7c813ab8e2eb7a4a0c/950b0e87416d186247c24505473f5853.m3u8", "reason": null}}, {"spider": "短剧网", "file": "短剧网.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.739, "init": 0.0, "home": 0.0, "category": 352.165, "detail": 363.959, "player": 0.007, "url_check": 3374.774, "total": 4094.93}, "counts": {"classes": 2, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "https://sm3.cc/?id=65439", "flag": "百度", "play_id": "https://pan.baidu.com/s/1FmXg5x7MtsekrQiwDoN70Q?pwd=6666"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1FmXg5x7MtsekrQiwDoN70Q?pwd=6666", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=FmXg5x7MtsekrQiwDoN70Q&pwd=6666", "reason": null}}, {"spider": "磁力熊", "file": "磁力熊.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.897, "init": 0.002, "home": 0.004, "category": 698.946, "detail": 668.396, "player": 0.003, "url_check": 0.048, "total": 1373.643}, "counts": {"classes": 24, "category_videos": 16, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "movie", "vod_id": "movie/4726", "flag": "磁力·1080P", "play_id": "magnet:?xt=urn:btih:E0A8D0EB86D836837D309A120B8F17762587B62A"}, "player": {"parse": 0, "url": "magnet:?xt=urn:btih:E0A8D0EB86D836837D309A120B8F17762587B62A", "valid": true, "reachable": null, "status_code": null, "final_url": "magnet:?xt=urn:btih:E0A8D0EB86D836837D309A120B8F17762587B62A", "reason": "非 HTTP 地址,按协议格式通过"}}, {"spider": "糯米", "file": "糯米.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 7.399, "init": 0.001, "home": 297.682, "category": 174.96, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 665.196}, "counts": {"classes": 5, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "juji", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "网易云音乐", "file": "网易云音乐.txt", "success": false, "failed_stage": "player", "error": "playerContent 未返回播放地址", "traceback": null, "timings_ms": {"module_load": 3.233, "init": 0.001, "home": 370.907, "category": 389.725, "detail": 0.004, "player": 413.351, "url_check": 0.0, "total": 1915.696}, "counts": {"classes": 62, "category_videos": 100, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "/discover/toplist?id=3779629", "vod_id": "3399839173@甲乙丙丁 (你我怎么两清)@李佳薇👉MP3", "flag": "网易云音乐", "play_id": "3399839173"}, "player": {"parse": 0, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "耐视点播", "file": "耐视点播.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 4.575, "init": 0.001, "home": 0.0, "category": 1737.528, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 3370.632}, "counts": {"classes": 6, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "2", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "腾讯视频", "file": "腾讯视频.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.466, "init": 0.001, "home": 118.835, "category": 268.072, "detail": 928.981, "player": 0.002, "url_check": 228.177, "total": 1552.101}, "counts": {"classes": 7, "category_videos": 12, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "choice", "vod_id": "choice$mzc00200nfe7al6", "flag": "腾讯视频", "play_id": "https://v.qq.com/x/cover/mzc00200nfe7al6/x4102k19oq6.html"}, "player": {"parse": 1, "url": "https://v.qq.com/x/cover/mzc00200nfe7al6/x4102k19oq6.html", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.qq.com/x/cover/mzc00200nfe7al6/x4102k19oq6.html", "reason": null}}, {"spider": "至臻", "file": "至臻.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 14.152, "init": 0.001, "home": 0.001, "category": 1436.03, "detail": 242.641, "player": 0.009, "url_check": 179.77, "total": 4363.796}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "15627", "flag": "夸克#至臻", "play_id": "https://pan.quark.cn/s/805d6dac775e"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/805d6dac775e", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/805d6dac775e", "reason": null}}, {"spider": "苹果", "file": "苹果.txt", "success": false, "failed_stage": "detail", "error": "详情缺少播放源或播放列表", "traceback": null, "timings_ms": {"module_load": 5.44, "init": 186.749, "home": 339.766, "category": 173.264, "detail": 118.424, "player": 0.0, "url_check": 0.0, "total": 1121.441}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 0}, "samples": {"tid": "1", "vod_id": "827850", "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "茶杯狐", "file": "茶杯狐.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 6.326, "init": 0.001, "home": 312.581, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 319.178}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "薯条", "file": "薯条.txt", "success": false, "failed_stage": "detail", "error": "详情缺少播放源或播放列表", "traceback": null, "timings_ms": {"module_load": 4.804, "init": 238.957, "home": 352.714, "category": 167.177, "detail": 116.169, "player": 0.0, "url_check": 0.0, "total": 1187.83}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 0}, "samples": {"tid": "1", "vod_id": "827850", "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "虎斑", "file": "虎斑.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.385, "init": 0.001, "home": 0.001, "category": 1280.424, "detail": 1547.033, "player": 0.01, "url_check": 979.487, "total": 3814.702}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "460896", "flag": "百度#虎斑", "play_id": "https://pan.baidu.com/s/1sc_CpbKSmWx0_5jIe9k5bg?pwd=5580"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1sc_CpbKSmWx0_5jIe9k5bg?pwd=5580", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=sc_CpbKSmWx0_5jIe9k5bg&pwd=5580", "reason": null}}, {"spider": "蜗牛", "file": "蜗牛.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.458, "init": 0.002, "home": 0.001, "category": 528.321, "detail": 494.178, "player": 0.005, "url_check": 264.429, "total": 1292.076}, "counts": {"classes": 4, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "34873", "flag": "115#蜗牛", "play_id": "https://115cdn.com/s/swsozj93nm4?password=i675"}, "player": {"parse": 0, "url": "https://115cdn.com/s/swsozj93nm4?password=i675", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://115cdn.com/s/swsozj93nm4?password=i675", "reason": null}}, {"spider": "蜡笔", "file": "蜡笔.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 9.232, "init": 0.001, "home": 0.002, "category": 210.302, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1001.119}, "counts": {"classes": 7, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "1", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "蜻蜓FM", "file": "蜻蜓FM.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.269, "init": 0.0, "home": 703.913, "category": 513.733, "detail": 0.007, "player": 0.002, "url_check": 322.176, "total": 1543.477}, "counts": {"classes": 44, "category_videos": 12, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "217", "vod_id": "1259@@广东珠江经济电台@@https://pic.qtfm.cn/2015/0209/20150209212831195.jpg@@正在直播: 珠江第一线", "flag": "蜻蜓FM", "play_id": "1259"}, "player": {"parse": 0, "url": "http://lhttp.qtfm.cn/live/1259/64k.mp3", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://lhttp.qtfm.cn/live/1259/64k.mp3", "reason": null}}, {"spider": "袋鼠影视", "file": "袋鼠影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.226, "init": 0.001, "home": 0.001, "category": 1203.178, "detail": 512.566, "player": 566.174, "url_check": 987.732, "total": 3965.711}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "420373", "flag": "蓝光专线2", "play_id": "play/420373-0-0"}, "player": {"parse": 0, "url": "https://play.phimgood.com/20260721/29160_6fdb8f7d/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://play.phimgood.com/20260721/29160_6fdb8f7d/index.m3u8", "reason": null}}, {"spider": "观影", "file": "观影.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 8.766, "init": 0.004, "home": 0.001, "category": 0.002, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 10.203}, "counts": {"classes": 6, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "tv", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "视界", "file": "视界.txt", "success": false, "failed_stage": "unexpected", "error": "HTTPSConnectionPool(host='cms140.yhg.one', port=443): Read timed out. (read timeout=10)", "traceback": "Traceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 464, in _make_request\n self._validate_conn(conn)\n ~~~~~~~~~~~~~~~~~~~^^^^^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 1093, in _validate_conn\n conn.connect()\n ~~~~~~~~~~~~^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connection.py\", line 796, in connect\n sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n sock=sock,\n ...<14 lines>...\n assert_fingerprint=self.assert_fingerprint,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connection.py\", line 975, in _ssl_wrap_socket_and_match_hostname\n ssl_sock = ssl_wrap_socket(\n sock=sock,\n ...<8 lines>...\n tls_in_tls=tls_in_tls,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/ssl_.py\", line 483, in ssl_wrap_socket\n ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\nTimeoutError: _ssl.c:1063: The handshake operation timed out\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/requests/adapters.py\", line 645, in send\n resp = conn.urlopen(\n method=request.method,\n ...<9 lines>...\n chunked=chunked,\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 841, in urlopen\n retries = retries.increment(\n method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]\n )\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/retry.py\", line 490, in increment\n raise reraise(type(error), error, _stacktrace)\n ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/util/util.py\", line 39, in reraise\n raise value\n File \"/home/harold/workspace/atv-spiders/py/.venv/lib/python3.14/site-packages/urllib3/connectionpool.py\", line 787, in urlopen\n response = self._make_request(\n conn,\n ...<10 lines>...\n **response_kw,\n )\nurllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='cms140.yhg.one', port=443): Read timed out. (read timeout=10)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 756, in validate_spider_file\n home_result = _run_timed(result[\"timings_ms\"], \"home\", spider.homeContent, clock, False)\n File \"/home/harold/workspace/atv-spiders/py/validate_spiders.py\", line 318, in _run_timed\n return func(*args, **kwargs)\n File \"/home/harold/workspace/tvbox-resources/py/视界.txt\", line 72, in homeContent\n File \"/home/harold/workspace/tvbox-resources/py/视界.txt\", line 400, in _ensure_init_payload\n File \"/home/harold/workspace/tvbox-resources/py/视界.txt\", line 199, in _post_api\nrequests.exceptions.ReadTimeout: HTTPSConnectionPool(host='cms140.yhg.one', port=443): Read timed out. (read timeout=10)\n", "timings_ms": {"module_load": 7.075, "init": 0.001, "home": 10013.011, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 10022.338}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "资源聚合", "file": "资源聚合.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.464, "init": 0.023, "home": 318.614, "category": 730.265, "detail": 375.749, "player": 0.002, "url_check": 991.108, "total": 2424.828}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "cms:feifan:98741", "flag": "非凡资源", "play_id": "https://vip.ffzy-play10.com/20260721/69661_96eea2fc/index.m3u8"}, "player": {"parse": 0, "url": "https://vip.ffzy-play10.com/20260721/69661_96eea2fc/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip.ffzy-play10.com/20260721/69661_96eea2fc/index.m3u8", "reason": null}}, {"spider": "路漫漫", "file": "路漫漫.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 5.039, "init": 0.0, "home": 0.001, "category": 375.907, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 660.574}, "counts": {"classes": 6, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": "7", "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "路飞影视", "file": "路飞影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.654, "init": 0.001, "home": 0.001, "category": 225.044, "detail": 1059.691, "player": 1815.202, "url_check": 872.76, "total": 3978.285}, "counts": {"classes": 7, "category_videos": 16, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movie", "vod_id": "39033917", "flag": "【无广①】", "play_id": "39033917-1-1"}, "player": {"parse": 0, "url": "https://cdn.yzzyvip-29.com/20260721/25949_9afad4c3/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzyvip-29.com/20260721/25949_9afad4c3/index.m3u8", "reason": null}}, {"spider": "酷我听书", "file": "酷我听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.731, "init": 0.001, "home": 396.642, "category": 104.535, "detail": 3345.844, "player": 140.268, "url_check": 79.657, "total": 4076.923}, "counts": {"classes": 4, "category_videos": 21, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "2", "vod_id": "13492273", "flag": "酷我听书", "play_id": "free|94448942"}, "player": {"parse": 0, "url": "http://car-lv.kuwo.cn/d61ed2315308a0cbfa6f8bb6d2cc1f29/6a601742/resource/30106/trackmedia/long/M500002ZiI9a1sctnS.mp3?bitrate$128&format$mp3&source$kwplayerhd_ar_4.3.0.8_tianbao_T1A_qirui.apk&type$convert_url_with_sign&user$&loginUid$", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://car-lv.kuwo.cn/d61ed2315308a0cbfa6f8bb6d2cc1f29/6a601742/resource/30106/trackmedia/long/M500002ZiI9a1sctnS.mp3?bitrate$128&format$mp3&source$kwplayerhd_ar_4.3.0.8_tianbao_T1A_qirui.apk&type$convert_url_with_sign&user$&loginUid$", "reason": null}}, {"spider": "酷狗音乐", "file": "酷狗音乐.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 9.75, "init": 421.664, "home": 251.429, "category": 307.284, "detail": 258.603, "player": 362.256, "url_check": 323.111, "total": 1935.392}, "counts": {"classes": 12, "category_videos": 15, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "recommend", "vod_id": "331220950", "flag": "酷狗音乐", "play_id": "331220950"}, "player": {"parse": 0, "url": "http://fsdg360.tx.kugou.com/202607220905/796e093414371cf987ac88910d822701/v3/5917538661113f2a2a14baafd7b585dd/yp/full/ap1013_us0_mic85f71c379c462618de1399950957c33_pi6101_mx331220950_qumultitrack_s2204213148.mkv?ft=car_203559_10049&fts=b05bb02d44717442054bac7624ed9a29&ext=.mkv", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://fsdg360.tx.kugou.com/202607220905/796e093414371cf987ac88910d822701/v3/5917538661113f2a2a14baafd7b585dd/yp/full/ap1013_us0_mic85f71c379c462618de1399950957c33_pi6101_mx331220950_qumultitrack_s2204213148.mkv?ft=car_203559_10049&fts=b05bb02d44717442054bac7624ed9a29&ext=.mkv", "reason": null}}, {"spider": "金牌", "file": "金牌.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.063, "init": 0.001, "home": 608.785, "category": 215.264, "detail": 196.531, "player": 227.192, "url_check": 240.617, "total": 1493.085}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "145512", "flag": "金牌线路", "play_id": "145512@1298790"}, "player": {"parse": 0, "url": "https://ppvod01.kqgfbs.com/splitOut/20260705/1342569/V20260705110331438911342569/index.m3u8?t=6a604170&whip=222.210.164.211&sign=f3c42e857a8a4bb1f43f3f79248b94198e5a6ffe", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://ppvod01.kqgfbs.com/splitOut/20260705/1342569/V20260705110331438911342569/index.m3u8?t=6a604170&whip=222.210.164.211&sign=f3c42e857a8a4bb1f43f3f79248b94198e5a6ffe", "reason": null}}, {"spider": "长泽", "file": "长泽.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 10.543, "init": 0.013, "home": 146.071, "category": 103.379, "detail": 87.764, "player": 0.015, "url_check": 986.531, "total": 1334.929}, "counts": {"classes": 18, "category_videos": 21, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "20", "vod_id": "93078", "flag": "FF有广", "play_id": "app88:WyJodHRwczovL3N1cGVyLmZmenktb25saW5lNi5jb20vMjAyNjA3MjEvMzcwMzdfNWNjOWFiNjgvaW5kZXgubTN1OCIsImZmbTN1OCIsIuaWremtguWJkSIsIjEiXQ"}, "player": {"parse": 0, "url": "https://super.ffzy-online6.com/20260721/37037_5cc9ab68/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://super.ffzy-online6.com/20260721/37037_5cc9ab68/index.m3u8", "reason": null}}, {"spider": "闪电", "file": "闪电.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 14.274, "init": 0.001, "home": 0.001, "category": 517.436, "detail": 302.272, "player": 0.004, "url_check": 869.282, "total": 1703.703}, "counts": {"classes": 5, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "186100", "flag": "百度#闪电", "play_id": "https://pan.baidu.com/s/1nPEvJVfqnBsyxSzb2x_1iA?pwd=6688"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1nPEvJVfqnBsyxSzb2x_1iA?pwd=6688", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=nPEvJVfqnBsyxSzb2x_1iA&pwd=6688", "reason": null}}, {"spider": "雷鲸", "file": "雷鲸.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.804, "init": 0.002, "home": 0.003, "category": 2017.734, "detail": 436.219, "player": 0.005, "url_check": 215.557, "total": 2676.816}, "counts": {"classes": 7, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "42204681950354", "vod_id": "66466", "flag": "迅雷", "play_id": "https://pan.xunlei.com/s/VOxGjKrL2zREw7pkB8aXhCvqA1"}, "player": {"parse": 0, "url": "https://pan.xunlei.com/s/VOxGjKrL2zREw7pkB8aXhCvqA1", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.xunlei.com/s/VOxGjKrL2zREw7pkB8aXhCvqA1", "reason": null}}, {"spider": "韩圈", "file": "韩圈.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.598, "init": 0.003, "home": 1402.525, "category": 1519.784, "detail": 4341.723, "player": 1081.924, "url_check": 137.877, "total": 8489.877}, "counts": {"classes": 18, "category_videos": 25, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "RWA1fjPgWNm7zDXWIV56", "flag": "蓝光HDR", "play_id": "RWA1fjPgWNm7zDXWIV56|||6ELTVL1fVx13oPB0teZtP|||sc_TnymrI9lPH6g6Ba2RnXE|||11"}, "player": {"parse": 0, "url": "http://piccc.cdn.51touxiang.com/m3u8/2ePd4TGLqoackYBGnFxo66tx694g29pLJY5pkDQc.m3u8?pid=%2BibJyq87ptZYRmRqhIP%2FvdPpS8IkFbC44G%2FR8jMO89c%3D&utk=u_bYstpjDewEfNg7Qfvwx1&uk=f0vRs0mWZ8Q4NeOaqnzptBzBCFA8hAHZaPEf9u6Y3cw%3D&spl=213&t=1784682311&sign=fe1b8a416b085f4f22aa3b2ad8b5acf7&ip=222.210.164.211", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://piccc.cdn.51touxiang.com/m3u8/2ePd4TGLqoackYBGnFxo66tx694g29pLJY5pkDQc.m3u8?pid=%2BibJyq87ptZYRmRqhIP%2FvdPpS8IkFbC44G%2FR8jMO89c%3D&utk=u_bYstpjDewEfNg7Qfvwx1&uk=f0vRs0mWZ8Q4NeOaqnzptBzBCFA8hAHZaPEf9u6Y3cw%3D&spl=213&t=1784682311&sign=fe1b8a416b085f4f22aa3b2ad8b5acf7&ip=222.210.164.211", "reason": null}}, {"spider": "韩小圈", "file": "韩小圈.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.736, "init": 0.001, "home": 0.001, "category": 934.399, "detail": 833.086, "player": 0.003, "url_check": 874.663, "total": 2647.379}, "counts": {"classes": 5, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "0", "vod_id": "80697", "flag": "默认线路", "play_id": "https://cdn.yzzy33-play.com/20260204/6775_8e443d68/index.m3u8"}, "player": {"parse": 0, "url": "https://cdn.yzzy33-play.com/20260204/6775_8e443d68/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzy33-play.com/20260204/6775_8e443d68/index.m3u8", "reason": null}}, {"spider": "飞卢听书", "file": "飞卢听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.405, "init": 0.001, "home": 0.001, "category": 325.799, "detail": 305.41, "player": 0.003, "url_check": 101.913, "total": 737.092}, "counts": {"classes": 12, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "765", "flag": "飞卢听书", "play_id": "http://tss.faloo.com/ListenNode/0/765/1.mp3"}, "player": {"parse": 0, "url": "http://tss.faloo.com/ListenNode/0/765/1.mp3", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://tss.faloo.com/ListenNode/0/765/1.mp3", "reason": null}}, {"spider": "飞快TV", "file": "飞快TV.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.901, "init": 0.001, "home": 0.001, "category": 935.063, "detail": 925.569, "player": 936.433, "url_check": 662.731, "total": 3465.451}, "counts": {"classes": 4, "category_videos": 40, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "249303", "flag": "茅台资源1", "play_id": "/vodplay/249303-4-1.html"}, "player": {"parse": 0, "url": "https://vodcnd16.trjho.com/20260720/yO13DcSF/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vodcnd16.trjho.com/20260720/yO13DcSF/index.m3u8", "reason": null}}, {"spider": "魔方APP", "file": "魔方APP.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 5.664, "init": 0.001, "home": 326.704, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 332.572}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}, {"spider": "麦田影院", "file": "麦田影院.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.866, "init": 0.001, "home": 0.0, "category": 285.325, "detail": 200.253, "player": 0.018, "url_check": 446.675, "total": 936.686}, "counts": {"classes": 6, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "171427", "flag": "LZ源", "play_id": "eyJ1cmwiOiJodHRwczovL3YubHpjZG4yNy5jb20vMjAyNTA3MzEvNjc5XzUwYTJiMDQ3L2luZGV4Lm0zdTgiLCJwYXJzZV9hcGkiOiJodHRwczovL2RlbC5tdDMyMC5jb20vbHpmZi5waHA_dXJsPSIsImhlYWRlcnMiOnt9LCJ1c2VyX2FnZW50IjoiIn0="}, "player": {"parse": 0, "url": "https://v.lzcdn27.com/20250731/679_50a2b047/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.lzcdn27.com/20250731/679_50a2b047/index.m3u8", "reason": null}}, {"spider": "黑猫APP", "file": "黑猫APP.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 5.124, "init": 0.001, "home": 206.328, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 211.61}, "counts": {"classes": 0, "category_videos": 0, "detail_videos": 0, "episodes": 0}, "samples": {"tid": null, "vod_id": null, "flag": null, "play_id": null}, "player": {"parse": null, "url": "", "valid": false, "reachable": null, "status_code": null, "final_url": "", "reason": null}}]};
|
|
const STAGE_LABELS = {"module_load": "模块加载", "init": "初始化", "home": "首页分类", "category": "分类列表", "detail": "视频详情", "player": "播放地址", "url_check": "地址校验", "unexpected": "未预期异常", "total": "总耗时"};
|
|
const RAW_SPIDER_BASE_URL = "https://github.com/har01d5/tvbox/raw/refs/heads/master/py/";
|
|
const SPIDER_RELATIVE_PREFIX = "py/";
|
|
const state = {
|
|
status: "all",
|
|
failedStage: "all",
|
|
keyword: "",
|
|
minDuration: "",
|
|
maxDuration: "",
|
|
sortKey: "spider",
|
|
sortDirection: "asc",
|
|
};
|
|
|
|
function escapeHtml(value) {
|
|
return String(value ?? "")
|
|
.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """);
|
|
}
|
|
|
|
function formatDuration(value) {
|
|
const numeric = Number(value ?? 0);
|
|
if (Number.isNaN(numeric)) {
|
|
return String(value ?? "");
|
|
}
|
|
if (numeric >= 1000) {
|
|
return `${Math.round((numeric / 1000) * 1000) / 1000}秒`;
|
|
}
|
|
return `${numeric}ms`;
|
|
}
|
|
|
|
function stageLabel(stage) {
|
|
return stage ? (STAGE_LABELS[stage] || stage) : "";
|
|
}
|
|
|
|
function spiderUrl(fileName) {
|
|
return SPIDER_RELATIVE_PREFIX + encodeURIComponent(String(fileName || ""));
|
|
}
|
|
|
|
function uniqueFailedStages(items) {
|
|
const values = new Set();
|
|
items.forEach((item) => {
|
|
if (item.failed_stage) {
|
|
values.add(item.failed_stage);
|
|
}
|
|
});
|
|
return [...values].sort((left, right) => stageLabel(left).localeCompare(stageLabel(right), "zh-Hans-CN"));
|
|
}
|
|
|
|
function sortValue(item, key) {
|
|
if (key === "status") {
|
|
return item.success ? 0 : 1;
|
|
}
|
|
if (key === "failed_stage") {
|
|
return stageLabel(item.failed_stage);
|
|
}
|
|
if (key === "spider") {
|
|
return item.spider || "";
|
|
}
|
|
return Number(item.timings_ms?.[key] ?? 0);
|
|
}
|
|
|
|
function applyFilters(items) {
|
|
return items.filter((item) => {
|
|
if (state.status === "success" && !item.success) {
|
|
return false;
|
|
}
|
|
if (state.status === "failed" && item.success) {
|
|
return false;
|
|
}
|
|
if (state.failedStage !== "all" && (item.failed_stage || "") !== state.failedStage) {
|
|
return false;
|
|
}
|
|
const haystack = `${item.spider || ""} ${item.file || ""}`.toLowerCase();
|
|
if (state.keyword && !haystack.includes(state.keyword.toLowerCase())) {
|
|
return false;
|
|
}
|
|
const total = Number(item.timings_ms?.total ?? 0);
|
|
if (state.minDuration !== "" && total < Number(state.minDuration)) {
|
|
return false;
|
|
}
|
|
if (state.maxDuration !== "" && total > Number(state.maxDuration)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
|
|
function applySort(items) {
|
|
return [...items].sort((left, right) => {
|
|
const a = sortValue(left, state.sortKey);
|
|
const b = sortValue(right, state.sortKey);
|
|
const comparison = typeof a === "number" && typeof b === "number"
|
|
? a - b
|
|
: String(a).localeCompare(String(b), "zh-Hans-CN");
|
|
return state.sortDirection === "asc" ? comparison : -comparison;
|
|
});
|
|
}
|
|
|
|
function renderSummary(items) {
|
|
const success = items.filter((item) => item.success).length;
|
|
const failed = items.length - success;
|
|
document.getElementById("summary-line").textContent =
|
|
`当前显示 ${items.length} / ${report.results.length} 条,成功 ${success},失败 ${failed}`;
|
|
}
|
|
|
|
function renderRows(items) {
|
|
const tbody = document.getElementById("results-body");
|
|
if (!items.length) {
|
|
tbody.innerHTML = '<tr><td class="empty" colspan="13">当前筛选条件下没有结果</td></tr>';
|
|
return;
|
|
}
|
|
|
|
tbody.innerHTML = items.map((item) => {
|
|
const statusClass = item.success ? "success" : "failed";
|
|
const statusText = item.success ? "成功" : "失败";
|
|
return `
|
|
<tr>
|
|
<td><a href="${spiderUrl(item.file)}" target="_blank" rel="noreferrer">${escapeHtml(item.spider)}</a></td>
|
|
<td><span class="status ${statusClass}">${statusText}</span></td>
|
|
<td>${escapeHtml(stageLabel(item.failed_stage))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.total ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.module_load ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.init ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.home ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.category ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.detail ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.player ?? 0))}</td>
|
|
<td>${escapeHtml(formatDuration(item.timings_ms?.url_check ?? 0))}</td>
|
|
<td>${escapeHtml(item.player?.url ?? "")}</td>
|
|
<td>${escapeHtml(item.error ?? "")}</td>
|
|
</tr>
|
|
`;
|
|
}).join("");
|
|
}
|
|
|
|
function updateSortIndicators() {
|
|
document.querySelectorAll("[data-sort-key]").forEach((button) => {
|
|
const indicator = button.querySelector(".sort-indicator");
|
|
if (!indicator) {
|
|
return;
|
|
}
|
|
if (button.dataset.sortKey !== state.sortKey) {
|
|
indicator.textContent = "";
|
|
return;
|
|
}
|
|
indicator.textContent = state.sortDirection === "asc" ? "▲" : "▼";
|
|
});
|
|
}
|
|
|
|
function rerender() {
|
|
const filtered = applyFilters(report.results);
|
|
const sorted = applySort(filtered);
|
|
renderSummary(sorted);
|
|
renderRows(sorted);
|
|
updateSortIndicators();
|
|
}
|
|
|
|
function initializeFilters() {
|
|
const statusFilter = document.getElementById("status-filter");
|
|
const stageFilter = document.getElementById("stage-filter");
|
|
const keywordFilter = document.getElementById("keyword-filter");
|
|
const minFilter = document.getElementById("duration-min-filter");
|
|
const maxFilter = document.getElementById("duration-max-filter");
|
|
const resetButton = document.getElementById("reset-filters");
|
|
|
|
statusFilter.innerHTML = [
|
|
'<option value="all">全部状态</option>',
|
|
'<option value="success">成功</option>',
|
|
'<option value="failed">失败</option>',
|
|
].join("");
|
|
|
|
stageFilter.innerHTML = ['<option value="all">全部阶段</option>']
|
|
.concat(uniqueFailedStages(report.results).map((stage) => `<option value="${escapeHtml(stage)}">${escapeHtml(stageLabel(stage))}</option>`))
|
|
.join("");
|
|
|
|
statusFilter.addEventListener("change", (event) => {
|
|
state.status = event.target.value;
|
|
rerender();
|
|
});
|
|
stageFilter.addEventListener("change", (event) => {
|
|
state.failedStage = event.target.value;
|
|
rerender();
|
|
});
|
|
keywordFilter.addEventListener("input", (event) => {
|
|
state.keyword = event.target.value.trim();
|
|
rerender();
|
|
});
|
|
minFilter.addEventListener("input", (event) => {
|
|
state.minDuration = event.target.value;
|
|
rerender();
|
|
});
|
|
maxFilter.addEventListener("input", (event) => {
|
|
state.maxDuration = event.target.value;
|
|
rerender();
|
|
});
|
|
resetButton.addEventListener("click", () => {
|
|
state.status = "all";
|
|
state.failedStage = "all";
|
|
state.keyword = "";
|
|
state.minDuration = "";
|
|
state.maxDuration = "";
|
|
statusFilter.value = "all";
|
|
stageFilter.value = "all";
|
|
keywordFilter.value = "";
|
|
minFilter.value = "";
|
|
maxFilter.value = "";
|
|
rerender();
|
|
});
|
|
|
|
document.querySelectorAll("[data-sort-key]").forEach((button) => {
|
|
button.addEventListener("click", () => {
|
|
const key = button.dataset.sortKey;
|
|
if (state.sortKey === key) {
|
|
state.sortDirection = state.sortDirection === "asc" ? "desc" : "asc";
|
|
} else {
|
|
state.sortKey = key;
|
|
state.sortDirection = "asc";
|
|
}
|
|
rerender();
|
|
});
|
|
});
|
|
}
|
|
|
|
function initializeSummaryCards() {
|
|
document.getElementById("generated-at").textContent = report.generated_at || "";
|
|
document.getElementById("max-workers").textContent = String(report.max_workers ?? "");
|
|
document.getElementById("total-count").textContent = String(report.summary?.total ?? 0);
|
|
document.getElementById("success-count").textContent = String(report.summary?.success ?? 0);
|
|
document.getElementById("failed-count").textContent = String(report.summary?.failed ?? 0);
|
|
document.getElementById("total-duration").textContent = formatDuration(report.total_duration_ms ?? 0);
|
|
}
|
|
|
|
initializeSummaryCards();
|
|
initializeFilters();
|
|
rerender();
|
|
</script>
|
|
</body>
|
|
</html>
|