Files
tvboxzt/spider_validation.html
T
2026-07-19 14:28:05 +08:00

565 lines
122 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-19T14:26:45+08:00", "max_workers": 16, "total_duration_ms": 65995.635, "summary": {"total": 113, "success": 87, "failed": 26, "success_rate": 0.7699, "stage_failures": {"module_load": 0, "init": 0, "home": 6, "category": 13, "detail": 1, "player": 1, "url_check": 2, "unexpected": 3}}, "results": [{"spider": "4KVM", "file": "4KVM.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 201.303, "init": 0.002, "home": 11909.783, "category": 0.025, "detail": 477.212, "player": 7312.676, "url_check": 557.436, "total": 20491.823}, "counts": {"classes": 6, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "-1", "vod_id": "cgzq7f3tf", "flag": "alists", "play_id": "1551|cgzq7f3tf"}, "player": {"parse": 0, "url": "https://oss.douyinbit.com/m3u8/e99a493fad588e618465263d5d62a22e.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://oss.douyinbit.com/m3u8/e99a493fad588e618465263d5d62a22e.m3u8", "reason": null}}, {"spider": "4K指南", "file": "4K指南.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 201.58, "init": 0.001, "home": 0.001, "category": 9891.408, "detail": 676.03, "player": 0.007, "url_check": 146.479, "total": 10916.304}, "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": 247.185, "init": 0.006, "home": 0.002, "category": 843.916, "detail": 676.171, "player": 0.002, "url_check": 0.052, "total": 1788.792}, "counts": {"classes": 12, "category_videos": 18, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "dianshiju/guoju", "vod_id": "/dianshiju/guoju/29163.html", "flag": "01-06.2160p.HD国语中字无水印.mkv", "play_id": "magnet:?xt=urn:btih:79fdc9b79c6da84ee34df091a9070227bfb8acfb&dn=%E5%B0%8F%E8%8A%B301-06.2160p&tr=udp%3A%2F%2Ftracker.ducks.party%3A1984%2Fannounce"}, "player": {"parse": 0, "url": "magnet:?xt=urn:btih:79fdc9b79c6da84ee34df091a9070227bfb8acfb&dn=%E5%B0%8F%E8%8A%B301-06.2160p&tr=udp%3A%2F%2Ftracker.ducks.party%3A1984%2Fannounce", "valid": true, "reachable": null, "status_code": null, "final_url": "magnet:?xt=urn:btih:79fdc9b79c6da84ee34df091a9070227bfb8acfb&dn=%E5%B0%8F%E8%8A%B301-06.2160p&tr=udp%3A%2F%2Ftracker.ducks.party%3A1984%2Fannounce", "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": 200.274, "init": 0.001, "home": 640.53, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 843.471}, "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": "PPnix", "file": "PPnix.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 200.376, "init": 0.001, "home": 0.004, "category": 622.848, "detail": 5857.434, "player": 0.009, "url_check": 5736.334, "total": 12450.573}, "counts": {"classes": 2, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "movie/8321.html", "flag": "PPnix", "play_id": "8321|1080P"}, "player": {"parse": 0, "url": "https://www.ppnix.com/info/m3u8/8321/1080P.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.ppnix.com/info/m3u8/8321/1080P.m3u8", "reason": null}}, {"spider": "Pomo", "file": "Pomo.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 256.643, "init": 0.001, "home": 0.002, "category": 358.26, "detail": 304.339, "player": 0.004, "url_check": 0.076, "total": 930.891}, "counts": {"classes": 7, "category_videos": 16, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "zuixin", "vod_id": "3309", "flag": "Backrooms.2026.2160p.iT.WEB-DL.DV.HDR10+.DDP5.1.Atmos.H265.MP4-BTM · 4K · 20.25GB", "play_id": "magnet:?xt=urn:btih:a8894150faa50678d9055e691bded4eb64a33b62"}, "player": {"parse": 0, "url": "magnet:?xt=urn:btih:a8894150faa50678d9055e691bded4eb64a33b62", "valid": true, "reachable": null, "status_code": null, "final_url": "magnet:?xt=urn:btih:a8894150faa50678d9055e691bded4eb64a33b62", "reason": "非 HTTP 地址,按协议格式通过"}}, {"spider": "QQ音乐", "file": "QQ音乐.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 203.851, "init": 0.018, "home": 0.01, "category": 448.639, "detail": 2975.081, "player": 324.025, "url_check": 186.063, "total": 4198.722}, "counts": {"classes": 6, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "playlist", "vod_id": "playlist:7709482046", "flag": "QQ音乐", "play_id": "qqmusic:001zMQr71F1Qo8:718477|夜曲 - 周杰伦"}, "player": {"parse": 0, "url": "https://isure.stream.qqmusic.qq.com/F0000024jrso28p8VA.flac?guid=60f129733b207fd01bc8c92cf9976fdb&vkey=5C09181329946AA08E001215FCE601F612D7C4CA513E156038BEE0CC3032136CB7D9C4AE1BF1AFFCD8BF03E9F2FB06ABC4324B28DB986581__v21e2a16e4&uin=1152921504846230218&fromtag=119114&redirect=1", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://isure.stream.qqmusic.qq.com/F0000024jrso28p8VA.flac?guid=60f129733b207fd01bc8c92cf9976fdb&vkey=5C09181329946AA08E001215FCE601F612D7C4CA513E156038BEE0CC3032136CB7D9C4AE1BF1AFFCD8BF03E9F2FB06ABC4324B28DB986581__v21e2a16e4&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": 245.45, "init": 0.008, "home": 0.087, "category": 736.403, "detail": 14929.297, "player": 0.004, "url_check": 6514.235, "total": 28120.691}, "counts": {"classes": 29, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "cat_trending", "vod_id": "yt:video:goH9vq8E3Vw", "flag": "YouTube", "play_id": "yt:video:goH9vq8E3Vw"}, "player": {"parse": 0, "url": "https://www.youtube.com/watch?v=goH9vq8E3Vw", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.youtube.com/watch?v=goH9vq8E3Vw", "reason": null}}, {"spider": "libvio", "file": "libvio.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 259.759, "init": 0.001, "home": 0.001, "category": 7073.815, "detail": 382.316, "player": 0.006, "url_check": 160.425, "total": 7877.715}, "counts": {"classes": 6, "category_videos": 48, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "index", "vod_id": "714893558", "flag": "夸克", "play_id": "https://pan.quark.cn/s/b277ec97ba05"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/b277ec97ba05", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/b277ec97ba05", "reason": null}}, {"spider": "mifun", "file": "mifun.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 227.985, "init": 0.006, "home": 9172.611, "category": 521.713, "detail": 720.644, "player": 5857.075, "url_check": 4544.21, "total": 28891.845}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "19479", "flag": "特快云", "play_id": "特快云@@direct@@ba11073ae57ba0eede130eeda148f635,v10033g50000d332n1nog65kkqskev1g,token+,1,1"}, "player": {"parse": 0, "url": "http://v16.akamaized.net/0ce5fd92e29908e817da999a4a3a65a9/6a5cba97/video/tos/alisg/tos-alisg-v-0051c001-sg/oIsQGEfMILAmpjOARbQGgNUdF8rHcSRYfDueCh/?a=0&bti=NTk5Zi42Og%3D%3D&&bt=1361&ft=cApXJCz7ThWHoEN2LGZmo0P&mime_type=video_mp4&rc=anludG45cjQ1NjMzODYzNEBpanludG45cjQ1NjMzODYzNEAuYnBoMmRrazBhLS1kMC1zYSMuYnBoMmRrazBhLS1kMC1zcw%3D%3D&vvpl=1&l=20260719133017453C0F3A18DB5D28C730&btag=e00068000", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://v16.akamaized.net/0ce5fd92e29908e817da999a4a3a65a9/6a5cba97/video/tos/alisg/tos-alisg-v-0051c001-sg/oIsQGEfMILAmpjOARbQGgNUdF8rHcSRYfDueCh/?a=0&bti=NTk5Zi42Og%3D%3D&&bt=1361&ft=cApXJCz7ThWHoEN2LGZmo0P&mime_type=video_mp4&rc=anludG45cjQ1NjMzODYzNEBpanludG45cjQ1NjMzODYzNEAuYnBoMmRrazBhLS1kMC1zYSMuYnBoMmRrazBhLS1kMC1zcw%3D%3D&vvpl=1&l=20260719133017453C0F3A18DB5D28C730&btag=e00068000", "reason": null}}, {"spider": "youknow", "file": "youknow.txt", "success": false, "failed_stage": "url_check", "error": "HTTPSConnectionPool(host='play.phimgood.com', port=443): Read timed out. (read timeout=5)", "traceback": null, "timings_ms": {"module_load": 211.449, "init": 0.001, "home": 0.002, "category": 1267.244, "detail": 1098.168, "player": 8844.887, "url_check": 5012.472, "total": 32011.967}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "drama", "vod_id": "205220", "flag": "YouKnowTV", "play_id": "eyJ2b2RfaWQiOiIyMDUyMjAiLCJlcGlzb2RlX2luZGV4IjoxLCJ0aXRsZSI6IuesrDAx6ZuGIiwiY2FuZGlkYXRlcyI6W3sic291cmNlIjoi57q_6LevMSIsInNvdXJjZV9pZCI6IjEiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUyMjAtMS0xLyJ9LHsic291cmNlIjoi57q_6LevMiIsInNvdXJjZV9pZCI6IjEiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUyMjAtMS0xLyJ9LHsic291cmNlIjoi57q_6LevOSIsInNvdXJjZV9pZCI6IjIiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUyMjAtMi0xLyJ9LHsic291cmNlIjoi57q_6LevMTAiLCJzb3VyY2VfaWQiOiIyIiwiZXBpc29kZV91cmwiOiJodHRwczovL3d3dy55b3Vrbm93LnR2L3AvMjA1MjIwLTItMS8ifSx7InNvdXJjZSI6Iue6v-i3rzE1Iiwic291cmNlX2lkIjoiMyIsImVwaXNvZGVfdXJsIjoiaHR0cHM6Ly93d3cueW91a25vdy50di9wLzIwNTIyMC0zLTEvIn0seyJzb3VyY2UiOiLnur_ot68xNiIsInNvdXJjZV9pZCI6IjMiLCJlcGlzb2RlX3VybCI6Imh0dHBzOi8vd3d3LnlvdWtub3cudHYvcC8yMDUyMjAtMy0xLyJ9XX0"}, "player": {"parse": 0, "url": "https://play.phimgood.com/20260704/28607_bb24c3e3/index.m3u8", "valid": false, "reachable": false, "status_code": null, "final_url": "https://play.phimgood.com/20260704/28607_bb24c3e3/index.m3u8", "reason": "HTTPSConnectionPool(host='play.phimgood.com', port=443): Read timed out. (read timeout=5)"}}, {"spider": "七味", "file": "七味.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 247.116, "init": 0.006, "home": 0.002, "category": 760.389, "detail": 8102.837, "player": 0.003, "url_check": 132.859, "total": 9258.466}, "counts": {"classes": 5, "category_videos": 42, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "508123", "flag": "夸克1", "play_id": "https://pan.quark.cn/s/f9c778c9a47f"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/f9c778c9a47f", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/f9c778c9a47f", "reason": null}}, {"spider": "不太灵", "file": "不太灵.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 224.991, "init": 0.001, "home": 10888.169, "category": 6767.894, "detail": 1470.212, "player": 0.004, "url_check": 1248.306, "total": 30648.355}, "counts": {"classes": 5, "category_videos": 25, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "37491182", "flag": "百度", "play_id": "https://pan.baidu.com/s/12a4rwaZ_zwsB_YVSMbSYLg?pwd=Yu66"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/12a4rwaZ_zwsB_YVSMbSYLg?pwd=Yu66", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=2a4rwaZ_zwsB_YVSMbSYLg&pwd=Yu66", "reason": null}}, {"spider": "世纪音乐", "file": "世纪音乐.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 219.363, "init": 0.001, "home": 111.303, "category": 109.122, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 580.669}, "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": 252.212, "init": 0.001, "home": 0.001, "category": 439.389, "detail": 444.37, "player": 716.259, "url_check": 7034.627, "total": 8895.428}, "counts": {"classes": 14, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "zgjun", "vod_id": "ch4cnej9w", "flag": "两个BT", "play_id": "eyJwaWQiOiIvcGxheS9jaDRjbmVqOXciLCJzaWQiOiJjaDRjbmVqOXciLCJuYW1lIjoiMSJ9"}, "player": {"parse": 0, "url": "https://zijieapi.douyinbyte.com/m3u8/81e481dd2b3ea89d7caca24197bb63ae.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://zijieapi.douyinbyte.com/m3u8/81e481dd2b3ea89d7caca24197bb63ae.m3u8", "reason": null}}, {"spider": "乌云影视", "file": "乌云影视.txt", "success": false, "failed_stage": "url_check", "error": "HTTPSConnectionPool(host='wooyun.tv', port=443): Read timed out. (read timeout=5)", "traceback": null, "timings_ms": {"module_load": 242.704, "init": 0.001, "home": 5806.635, "category": 10751.184, "detail": 953.622, "player": 0.02, "url_check": 5011.96, "total": 47689.607}, "counts": {"classes": 7, "category_videos": 24, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "tv_series", "vod_id": "1105380", "flag": "乌云影视", "play_id": "eyJtZWRpYUlkIjogIjExMDUzODAiLCAic2Vhc29uTm8iOiAxLCAiZXBObyI6IDEsICJ2aWRlb0lkIjogNTE4NzU0OTYsICJwbGF5VXJsIjogImh0dHBzOi8vd29veXVuLnR2L2dlbl9vdmVyc2Vhcy9odHRwczovL3YuZmVuZ2JhbzEwLmNvbS92aWRlby9haXphaWJvZXJ0YWxhL2U4MmRmMzliZWVjYy9pbmRleC5tM3U4IiwgIm5hbWUiOiAi56ysMembhiDnrKwx6ZuGIn0"}, "player": {"parse": 0, "url": "https://wooyun.tv/gen_overseas/https://v.fengbao10.com/video/aizaiboertala/e82df39beecc/index.m3u8", "valid": false, "reachable": false, "status_code": null, "final_url": "https://wooyun.tv/gen_overseas/https://v.fengbao10.com/video/aizaiboertala/e82df39beecc/index.m3u8", "reason": "HTTPSConnectionPool(host='wooyun.tv', port=443): Read timed out. (read timeout=5)"}}, {"spider": "乐兔", "file": "乐兔.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 4.662, "init": 0.001, "home": 0.0, "category": 6132.026, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 13466.777}, "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.08, "init": 0.001, "home": 0.001, "category": 6462.722, "detail": 8340.368, "player": 0.003, "url_check": 1416.428, "total": 16227.095}, "counts": {"classes": 4, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "12685", "flag": "百度#二小", "play_id": "https://pan.baidu.com/s/1X2-WHwElykunKxaGT3SmEQ?pwd=8tac"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1X2-WHwElykunKxaGT3SmEQ?pwd=8tac", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=X2-WHwElykunKxaGT3SmEQ&pwd=8tac", "reason": null}}, {"spider": "人人电影", "file": "人人电影.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.768, "init": 0.001, "home": 0.001, "category": 6136.314, "detail": 5818.015, "player": 0.01, "url_check": 1072.802, "total": 13032.592}, "counts": {"classes": 4, "category_videos": 10, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movie/list_2", "vod_id": "/movie/2026/0718/60364.html", "flag": "baidu", "play_id": "https://pan.baidu.com/s/1j92nzucr-hXf5d7-AM-0Ew?pwd=fdxx"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1j92nzucr-hXf5d7-AM-0Ew?pwd=fdxx", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=j92nzucr-hXf5d7-AM-0Ew&pwd=fdxx", "reason": null}}, {"spider": "人人视频", "file": "人人视频.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.007, "init": 0.0, "home": 218.375, "category": 307.56, "detail": 299.492, "player": 867.985, "url_check": 125.138, "total": 3262.862}, "counts": {"classes": 4, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "MOVIE", "vod_id": "58392", "flag": "人人专线", "play_id": "58392@389270"}, "player": {"parse": 0, "url": "https://a0i8iluj31ju04t.302.fledgecloud.com:56782/zj-302-cdn.bwcgee.cn/008555ce81b971f180086723a78f0402/c7d7d97b0e7d4295bdd916d3b158a462-3d48c6e854b5a626644d68fe790900cf-ld.mp4?auth_key=1784456795-acb6e52942fc6ef663f1fff826c6b729-0-6f1b939fe4fe2e0aec58a233f40916e6&clientType=web_pc&clientVersion=1.0.0&parseUsage=PLAY&uid=0&rk=de3aac9913f147a3bd0065424809fc8a&hevc=false&seasonId=58392", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://a0i8iluj31ju04t.302.fledgecloud.com:56782/zj-302-cdn.bwcgee.cn/008555ce81b971f180086723a78f0402/c7d7d97b0e7d4295bdd916d3b158a462-3d48c6e854b5a626644d68fe790900cf-ld.mp4?auth_key=1784456795-acb6e52942fc6ef663f1fff826c6b729-0-6f1b939fe4fe2e0aec58a233f40916e6&clientType=web_pc&clientVersion=1.0.0&parseUsage=PLAY&uid=0&rk=de3aac9913f147a3bd0065424809fc8a&hevc=false&seasonId=58392", "reason": null}}, {"spider": "优酷", "file": "优酷.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.075, "init": 0.001, "home": 0.001, "category": 310.888, "detail": 549.117, "player": 0.002, "url_check": 683.631, "total": 1551.155}, "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": 6.657, "init": 0.001, "home": 0.001, "category": 1181.018, "detail": 1574.764, "player": 0.009, "url_check": 1068.946, "total": 28153.399}, "counts": {"classes": 4, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "movie", "vod_id": "movie/youre-next", "flag": "播放源 1 (1080P)", "play_id": "https://vip1.lz-cdn1.com/20220418/2534_5490981d/index.m3u8"}, "player": {"parse": 0, "url": "https://vip1.lz-cdn1.com/20220418/2534_5490981d/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip1.lz-cdn1.com/20220418/2534_5490981d/index.m3u8", "reason": null}}, {"spider": "修罗", "file": "修罗.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.067, "init": 0.001, "home": 0.001, "category": 742.061, "detail": 8428.265, "player": 1988.991, "url_check": 858.597, "total": 12027.023}, "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/74A32590AEF7DE2B95010FC8D07EE1DD4E4738D125128EAD3CB8D9C95DAF321A", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://lf26-imcloud-file-sign.bytetos.com/tos-cn-o-0000c2428/ocynEGinAJBUYk5XAABBAmKx4Y1QkBBLA8iCfG?x-expires=1784442834&x-signature=9Et0Fk2TlReVyQDvVYQompgs3h0%3D", "reason": null}}, {"spider": "免费短剧", "file": "免费短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.749, "init": 0.011, "home": 0.001, "category": 302.828, "detail": 216.773, "player": 0.002, "url_check": 1042.604, "total": 1566.416}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "https://20.90kan.cc/?id=64803", "flag": "百度", "play_id": "https://pan.baidu.com/s/1li3z5l2nldh-MHGW2ZkP-Q?pwd=6666"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1li3z5l2nldh-MHGW2ZkP-Q?pwd=6666", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=li3z5l2nldh-MHGW2ZkP-Q&pwd=6666", "reason": null}}, {"spider": "农民", "file": "农民.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 6.78, "init": 0.001, "home": 367.984, "category": 250.587, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 811.844}, "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.456, "init": 0.001, "home": 0.001, "category": 6989.27, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 7454.587}, "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.558, "init": 0.001, "home": 0.001, "category": 9956.548, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 18263.96}, "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": 4.683, "init": 148.224, "home": 0.084, "category": 122.018, "detail": 605.005, "player": 143.284, "url_check": 156.094, "total": 1180.033}, "counts": {"classes": 5, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "194685", "flag": "蓝光B线-在线看", "play_id": "BBA@FYNB-35386463666164393565326333353735ceb363759caaf51875b9072d34a28fd674818856d507defae14d58b687e859a98c09d953bd986db76dacfbf7589eb30ed6dca73cd46e4d3a7be4b3d8460eddba72e0fdad3ebdf0ef2a2b78eb78c39a6d61dcca5f1d79cf69080fdb84f37e2b18cdda3f4f61d64e48ffce79fc472e3af0b6ad511aff6ff30f56c0db67ad3b8111ab5681c86c8e3f2e0686588c81e08b2b57d4addd43100c277278630c29c623ba6a46834a0852b6eee265e4a40338abb1aef416acda9694947e59896583ed0400"}, "player": {"parse": 0, "url": "https://findermp.video.qq.com/251/20302/stodownload?encfilekey=nLWUlAoVvyy6ZHA93I4XPGjUwUwm7lSMx93ASbNcBsh59tpAcHZicFR2KxuVt5Tv1PeVbqIkQMxEjQibmNGJ8R2A&token=cztXnd9GyrGGRyLsP6MppReVFBN4tUjzYsLpia36icpQvEWYSrmibLDicVzpZTMU3NEh48SWvAzXKEmN6ZpykLiaA6qmesCklJoKPNVmianePKFZD9syxVHNQMq3qW4NA6RDeyMCI7F62eSGJ0zcnRpwcgc97I3lsybblJzO8oAiaTtrQ2llhdCJnhB9G2esFYVhiamV2Sy6uNjvqtx1HicicAO5DGphwLibMHWmttZicicdru10iapcc&bizid=1023&dotrans=0&hy=SH&idx=1&m=&uzid=7a166&basedata=CAMSA3hWMCIJCgcKA3hWMBAASLXW8dIG&sign=yoLyP8iALq5V1Q8kEBJPzd0F9ajQ84S_HXM8Kf5owsEdkGewC5UhcRANf0rXoVSxvaELi8URA4tRm1ea6jblYg&filename=BBA.mp4", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://findermp.video.qq.com/251/20302/stodownload?encfilekey=nLWUlAoVvyy6ZHA93I4XPGjUwUwm7lSMx93ASbNcBsh59tpAcHZicFR2KxuVt5Tv1PeVbqIkQMxEjQibmNGJ8R2A&token=cztXnd9GyrGGRyLsP6MppReVFBN4tUjzYsLpia36icpQvEWYSrmibLDicVzpZTMU3NEh48SWvAzXKEmN6ZpykLiaA6qmesCklJoKPNVmianePKFZD9syxVHNQMq3qW4NA6RDeyMCI7F62eSGJ0zcnRpwcgc97I3lsybblJzO8oAiaTtrQ2llhdCJnhB9G2esFYVhiamV2Sy6uNjvqtx1HicicAO5DGphwLibMHWmttZicicdru10iapcc&bizid=1023&dotrans=0&hy=SH&idx=1&m=&uzid=7a166&basedata=CAMSA3hWMCIJCgcKA3hWMBAASLXW8dIG&sign=yoLyP8iALq5V1Q8kEBJPzd0F9ajQ84S_HXM8Kf5owsEdkGewC5UhcRANf0rXoVSxvaELi8URA4tRm1ea6jblYg&filename=BBA.mp4", "reason": null}}, {"spider": "剧迷", "file": "剧迷.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.357, "init": 0.001, "home": 0.001, "category": 213.811, "detail": 11955.26, "player": 467.092, "url_check": 952.454, "total": 37871.496}, "counts": {"classes": 6, "category_videos": 241, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "2", "vod_id": "463703", "flag": "gimy", "play_id": "463703-8-1"}, "player": {"parse": 0, "url": "https://play.phimgood.com/20260627/28315_3c0cddf4/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://play.phimgood.com/20260627/28315_3c0cddf4/index.m3u8", "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": 1092.7, "detail": 593.602, "player": 215.955, "url_check": 372.259, "total": 2280.084}, "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=1784442403-0-0-39f632cade18f3d2c0370f05a03d1316", "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=1784442403-0-0-39f632cade18f3d2c0370f05a03d1316", "reason": null}}, {"spider": "博看听书", "file": "博看听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.357, "init": 0.001, "home": 2785.251, "category": 272.319, "detail": 708.818, "player": 0.003, "url_check": 51.922, "total": 3823.289}, "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": 6.122, "init": 0.005, "home": 415.926, "category": 86.11, "detail": 73.073, "player": 0.003, "url_check": 168.459, "total": 750.417}, "counts": {"classes": 6, "category_videos": 21, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "11427", "flag": "主线路①", "play_id": "https://v.qq.com/x/cover/mzc00200pntcqa9/n4101d5vavo.html"}, "player": {"parse": 0, "url": "https://v.qq.com/x/cover/mzc00200pntcqa9/n4101d5vavo.html", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.qq.com/x/cover/mzc00200pntcqa9/n4101d5vavo.html", "reason": null}}, {"spider": "双星", "file": "双星.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.186, "init": 786.541, "home": 0.004, "category": 178.741, "detail": 171.904, "player": 0.004, "url_check": 152.742, "total": 1293.895}, "counts": {"classes": 7, "category_videos": 15, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "ju", "vod_id": "/ju/10952.html", "flag": "夸克", "play_id": "https://pan.quark.cn/s/a9da867d7c28"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/a9da867d7c28", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/a9da867d7c28", "reason": null}}, {"spider": "听书", "file": "听书.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.704, "init": 79.1, "home": 0.001, "category": 162.527, "detail": 1808.134, "player": 290.978, "url_check": 67.91, "total": 2413.326}, "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=1ae4b5dfbff059dedda3870247b99476&buy_key=FM&token=5400&timestamp=1784442407&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=1ae4b5dfbff059dedda3870247b99476&buy_key=FM&token=5400&timestamp=1784442407&duration=453", "reason": null}}, {"spider": "听友FM", "file": "听友FM.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.96, "init": 0.001, "home": 407.87, "category": 283.985, "detail": 523.751, "player": 331.081, "url_check": 133.863, "total": 1688.673}, "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=1784441913&sign=c0c099432c4abc6dc724f621108deb91", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://file.hgeuz.cn/stream/eJwANwDI_wJVZgVKIIrU0ECux-GJ1PSt38ahythCqsH-r9TAQ4rj5F94rOjbQKjk063xyIX2z3hfeGcIHF4BAAD__5DtISY.?ts=1784441913&sign=c0c099432c4abc6dc724f621108deb91", "reason": null}}, {"spider": "咕咕动漫", "file": "咕咕动漫.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 9.899, "init": 0.006, "home": 5890.331, "category": 615.241, "detail": 469.699, "player": 1767.864, "url_check": 333.669, "total": 9087.38}, "counts": {"classes": 3, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "6", "vod_id": "5030", "flag": "咕咕新线(国内高速)", "play_id": "parse_api=a2796a09189261bcaf3cc4542d7c5ac2&url=RWo96m6GXJ77to0GUn9Ac2rpTQrBNIOfkkMX1+hwxXyVWJjBlQ1w/Dh2uW1rJqXl&token=|遭到流放的转生重骑士凭借游戏知识大开无双|1"}, "player": {"parse": 0, "url": "https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/32045346ddfe49e583c390b926c26ee0~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1815546414&x-signature=j%2BIHj5DlvO3gsejnoIi8mIXL1KQ%3D", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://p26-bot-workflow-sign.byteimg.com/tos-cn-i-mdko3gqilj/32045346ddfe49e583c390b926c26ee0~tplv-mdko3gqilj-image.image?rk3s=81d4c505&x-expires=1815546414&x-signature=j%2BIHj5DlvO3gsejnoIi8mIXL1KQ%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": 3.744, "init": 0.0, "home": 0.001, "category": 10017.07, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 20039.018}, "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": false, "failed_stage": "detail", "error": "详情缺少播放源或播放列表", "traceback": null, "timings_ms": {"module_load": 6.233, "init": 0.001, "home": 0.001, "category": 9476.422, "detail": 797.198, "player": 0.0, "url_check": 0.0, "total": 30991.266}, "counts": {"classes": 6, "category_videos": 12, "detail_videos": 1, "episodes": 0}, "samples": {"tid": "2", "vod_id": "4623", "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.566, "init": 0.001, "home": 0.001, "category": 15828.573, "detail": 579.931, "player": 0.003, "url_check": 1006.949, "total": 17423.52}, "counts": {"classes": 6, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "9607", "flag": "百度#多多", "play_id": "https://pan.baidu.com/s/1LoCfRG5N64SdmgPwCew9UA?pwd=yyds"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1LoCfRG5N64SdmgPwCew9UA?pwd=yyds", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=LoCfRG5N64SdmgPwCew9UA&pwd=yyds", "reason": null}}, {"spider": "如意资源", "file": "如意资源.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.923, "init": 0.001, "home": 0.006, "category": 5625.885, "detail": 364.628, "player": 0.003, "url_check": 1977.481, "total": 39702.314}, "counts": {"classes": 6, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "81055", "flag": "rym3u8", "play_id": "https://cdn.ryplay11.com/20260705/202871_09f1ac80/index.m3u8"}, "player": {"parse": 0, "url": "https://cdn.ryplay11.com/20260705/202871_09f1ac80/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.ryplay11.com/20260705/202871_09f1ac80/index.m3u8", "reason": null}}, {"spider": "寻川4K", "file": "寻川4K.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 7.608, "init": 549.563, "home": 451.355, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1008.708}, "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": 5.032, "init": 238.158, "home": 87.752, "category": 857.448, "detail": 614.461, "player": 740.204, "url_check": 387.963, "total": 8495.453}, "counts": {"classes": 8, "category_videos": 40, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "M16", "vod_id": "825829", "flag": "超清", "play_id": "1@77@825829@virtual"}, "player": {"parse": "0", "url": "https://cibn-edge-5g.1ljx.com/cloud/flv/1b56a0afabfac0afb482bbcb2ed0ab50/c9d2fd437311af2353855dd0cb0329ce/6a5c6e30ca8ea.mp4?auth_key=1784442416.8297-1-822782327.info-internet-2-llq-e6eac110e74ad6c17e170f442062124c", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://upos-sz-mirrorhw.bilivideo.com/upgcxcode/60/01/39989740160/39989740160-1-192.mp4?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&trid=00001ac00ec02f704eaeb1998d72cf76f98v&mid=3377833036953&nbs=1&oi=2672511824&gen=playurlv3&os=bcache&deadline=1784448498&uipk=5&platform=html5&og=hw&upsig=dceabe5c79013f72d869a2ec9ef3fc9e&uparams=e,trid,mid,nbs,oi,gen,os,deadline,uipk,platform,og&cdnid=61312&bvc=vod&nettype=0&bw=455097&lrs=0&buvid=1784441298&build=105700&dl=0&f=v_2_aea&qn_dyeid=&allo_id=&agrr=1&orderid=0,4&www.bilibili.com", "reason": null}}, {"spider": "布布影视", "file": "布布影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.276, "init": 0.001, "home": 0.001, "category": 684.005, "detail": 682.719, "player": 1548.005, "url_check": 249.595, "total": 3170.241}, "counts": {"classes": 4, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "86421", "flag": "JD蓝光(1)", "play_id": "JD4K@1@JD-3823d951135350f7454bb0f521eaa5a70"}, "player": {"parse": 0, "url": "https://media-bjcy-fy-person01.bjoss.ctyunxs.cn/PERSONCLOUD/874f908a-f9df-4538-942a-7342fda0ff8a.m3u8?x-amz-CLIENTTYPEIN=UNKNOWN&AWSAccessKeyId=0Lg7dAq3ZfHvePP8DKEU&x-amz-userLevel=0&x-amz-limitrate=51200&x-amz-UID=269636103&x-amz-APPID=828221&response-content-disposition=attachment%3Bfilename%3D%22%E6%AD%A3%E7%89%87.m3u8%22%3Bfilename*%3DUTF-8%27%27%25E6%25AD%25A3%25E7%2589%2587.m3u8&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=PERSON&Signature=JOQlfUZXTQPr6xgLcKD6vPZBLYE%3D&Expires=1784442711&x-amz-FSIZE=58373&x-amz-UFID=624471240788981016", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://media-bjcy-fy-person01.bjoss.ctyunxs.cn/PERSONCLOUD/874f908a-f9df-4538-942a-7342fda0ff8a.m3u8?x-amz-CLIENTTYPEIN=UNKNOWN&AWSAccessKeyId=0Lg7dAq3ZfHvePP8DKEU&x-amz-userLevel=0&x-amz-limitrate=51200&x-amz-UID=269636103&x-amz-APPID=828221&response-content-disposition=attachment%3Bfilename%3D%22%E6%AD%A3%E7%89%87.m3u8%22%3Bfilename*%3DUTF-8%27%27%25E6%25AD%25A3%25E7%2589%2587.m3u8&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=PERSON&Signature=JOQlfUZXTQPr6xgLcKD6vPZBLYE%3D&Expires=1784442711&x-amz-FSIZE=58373&x-amz-UFID=624471240788981016", "reason": null}}, {"spider": "微观短剧", "file": "微观短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.274, "init": 0.03, "home": 166.353, "category": 266.003, "detail": 237.776, "player": 386.54, "url_check": 130.028, "total": 1191.51}, "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=1784442412&sign=67130f9cb3bb72b0b5ef75bea6473ffa", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://tv-video.cdn.drama.9ddm.com/C1/F6/C1F63C79CBF09E493F99B1E0824CEAB2.mp4?timestamp=1784442412&sign=67130f9cb3bb72b0b5ef75bea6473ffa", "reason": null}}, {"spider": "怀桑", "file": "怀桑.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.731, "init": 0.006, "home": 493.717, "category": 191.667, "detail": 179.686, "player": 186.906, "url_check": 121.321, "total": 1182.625}, "counts": {"classes": 8, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "17816", "flag": "线·贰", "play_id": "parse_api=4a720977ebfe3f13296b548e51cc3355&url=11JMk4JSbYeEahoOeECIbtxzjPJhYTujseGsHTjrF6X0Etg3ahsFBJJp6/TAIj7J&token=|我爱你|1"}, "player": {"parse": 0, "url": "https://fffan.wki8.com/hls/ebba4b4c17ed8476b1a3de0c7a38b356.m3u8?token=916a2cf599c5e2db142efeb0cef90d94&time=1784442413&YYNB.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://fffan.wki8.com/hls/ebba4b4c17ed8476b1a3de0c7a38b356.m3u8?token=916a2cf599c5e2db142efeb0cef90d94&time=1784442413&YYNB.m3u8", "reason": null}}, {"spider": "悯善", "file": "悯善.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.08, "init": 0.01, "home": 197.57, "category": 175.634, "detail": 98.562, "player": 0.019, "url_check": 1849.699, "total": 2328.211}, "counts": {"classes": 5, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "35067", "flag": "高清①", "play_id": "app88:WyJodHRwczovL3l6enkucGxheS1jZG40LmNvbS8yMDIyMDYxNi8yMDk5MF85YTI0ZWIxMi9pbmRleC5tM3U4IiwiMTA4MHp5ayIsIueZveiJsuS4peWGrCIsIjEiXQ"}, "player": {"parse": 0, "url": "https://yzzy.play-cdn4.com/20220616/20990_9a24eb12/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://yzzy.play-cdn4.com/20220616/20990_9a24eb12/index.m3u8", "reason": null}}, {"spider": "新片预告", "file": "新片预告.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.44, "init": 0.001, "home": 290.011, "category": 5670.667, "detail": 7852.249, "player": 288.175, "url_check": 74.744, "total": 14180.945}, "counts": {"classes": 1, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "movlist/", "vod_id": "/movie/85472", "flag": "预告片", "play_id": "/show/195667"}, "player": {"parse": 0, "url": "https://vfx.mtime.cn/Video/2026/07/18/mp4/260718144334515115.mp4", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vfx.mtime.cn/Video/2026/07/18/mp4/260718144334515115.mp4", "reason": null}}, {"spider": "新韩剧网", "file": "新韩剧网.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.882, "init": 0.001, "home": 0.001, "category": 6440.771, "detail": 18442.513, "player": 4028.176, "url_check": 1101.646, "total": 30020.664}, "counts": {"classes": 5, "category_videos": 16, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "3559", "flag": "在线云播", "play_id": "3559_1_1"}, "player": {"parse": 0, "url": "https://cdn.yzzyvip-29.com/20260201/16425_49d7d186/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzyvip-29.com/20260201/16425_49d7d186/index.m3u8", "reason": null}}, {"spider": "星星短剧", "file": "星星短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.78, "init": 0.0, "home": 0.001, "category": 505.676, "detail": 448.799, "player": 0.003, "url_check": 68.883, "total": 1027.718}, "counts": {"classes": 5, "category_videos": 10, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1287", "vod_id": "422599939194881@@穿越诡计爱上你@@苏清韵为了给妹妹治病,卖身富豪被卓熙辰所救,答应卓熙辰的契约婚姻。苏清韵受到了爱慕卓熙辰的上官溪玲的疯狂攻击与算计,导致妹妹离世。苏清韵误会记恨卓熙辰因此拿刀伤了他,自己也被判入狱五年。", "flag": "星星短剧", "play_id": "https://img.novel.wsljf.xyz/shortPlay-mp4/420424102051841/EvnIm1746774634078/abc6208e-390b-4533-a1a4-b9e5741cc384/540x960/output.m3u8"}, "player": {"parse": 0, "url": "https://img.novel.wsljf.xyz/shortPlay-mp4/420424102051841/EvnIm1746774634078/abc6208e-390b-4533-a1a4-b9e5741cc384/540x960/output.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://img.novel.wsljf.xyz/shortPlay-mp4/420424102051841/EvnIm1746774634078/abc6208e-390b-4533-a1a4-b9e5741cc384/540x960/output.m3u8", "reason": null}}, {"spider": "木偶", "file": "木偶.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.343, "init": 0.001, "home": 0.001, "category": 1453.374, "detail": 300.868, "player": 0.008, "url_check": 237.954, "total": 2000.993}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "25", "vod_id": "8296", "flag": "115#木偶", "play_id": "https://115cdn.com/s/swsbjmf36dh?password=sb82"}, "player": {"parse": 0, "url": "https://115cdn.com/s/swsbjmf36dh?password=sb82", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://115cdn.com/s/swsbjmf36dh?password=sb82", "reason": null}}, {"spider": "樱花动漫", "file": "樱花动漫.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.495, "init": 0.001, "home": 0.001, "category": 17370.956, "detail": 9552.065, "player": 1516.432, "url_check": 367.289, "total": 28812.75}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "guoman", "vod_id": "19866", "flag": "高清", "play_id": "/play/19866-1-1/"}, "player": {"parse": 0, "url": "https://v.lzcdn31.com/20260704/7966_021345e0/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.lzcdn31.com/20260704/7966_021345e0/index.m3u8", "reason": null}}, {"spider": "橘子TV", "file": "橘子TV.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.602, "init": 334.186, "home": 482.997, "category": 475.799, "detail": 7177.96, "player": 1372.078, "url_check": 379.092, "total": 26795.888}, "counts": {"classes": 8, "category_videos": 18, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "65", "vod_id": "418112", "flag": "一起看APP", "play_id": "26023185"}, "player": {"parse": 0, "url": "https://tt0923.abc7722.com/m3u87/share/8014729/8209503/20260627/101630/1080/index.m3u8?sign=c9849a4d88dd950e724e22cc52493875&t=1784442444", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://tt0923.abc7722.com/m3u87/share/8014729/8209503/20260627/101630/1080/index.m3u8?sign=c9849a4d88dd950e724e22cc52493875&t=1784442444", "reason": null}}, {"spider": "橘汁", "file": "橘汁.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.622, "init": 266.912, "home": 322.846, "category": 147.615, "detail": 112.692, "player": 307.123, "url_check": 1096.265, "total": 2259.778}, "counts": {"classes": 7, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "20", "vod_id": "157511", "flag": "神话蓝光", "play_id": "eyJ2b2RQbGF5RnJvbSI6ICJxc3ZpcCIsICJwbGF5VXJsIjogInFzdmlwLUdVNU5hV0dNdnF1cDZsOEtZNGM0ZXRrRjZkcGVxWVRmQk82MzdWS2pzR0ViOWlaNXQ3ZWFTUUNjak5qTXd0SUdIN25xV1lucWF4SU1tdzRlSy1IdmloNGtyZjNTckxOS0tHVkhrUEdJOXJyWXRlUEdQSXZ4dFRRR3MxRFRRMktLTUdTZ1FHai1kM3VOb0IyQ1JzQzF2dyJ9"}, "player": {"parse": 0, "url": "https://hxx2026.bbroot.com/data/telegram/2026-07-18/200378509_1c219d81.m3u8?verify=1784442419-WvNpeG2n0nXUhDOeSmS587IQIF15kA6PDaeT3GJyhG0%3D", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://hxx2026.bbroot.com/data/telegram/2026-07-18/200378509_1c219d81.m3u8?verify=1784442419-WvNpeG2n0nXUhDOeSmS587IQIF15kA6PDaeT3GJyhG0%3D", "reason": null}}, {"spider": "次元城", "file": "次元城.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 5.286, "init": 0.001, "home": 181.268, "category": 185.326, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 9792.057}, "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": 11.525, "init": 0.001, "home": 0.0, "category": 5940.562, "detail": 214.372, "player": 0.006, "url_check": 1116.589, "total": 7283.573}, "counts": {"classes": 6, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "28688", "flag": "百度", "play_id": "https://pan.baidu.com/s/1LHabgrGhbQ_AKaW2SYQbSA?pwd=8888"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1LHabgrGhbQ_AKaW2SYQbSA?pwd=8888", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=LHabgrGhbQ_AKaW2SYQbSA&pwd=8888", "reason": null}}, {"spider": "沐辞4K", "file": "沐辞4K.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 7.166, "init": 105.27, "home": 94.6, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 207.237}, "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": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 3.799, "init": 0.0, "home": 428.25, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 432.199}, "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.699, "init": 0.001, "home": 0.001, "category": 7268.06, "detail": 5937.34, "player": 5884.382, "url_check": 2751.778, "total": 21846.858}, "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.018, "init": 0.001, "home": 9850.305, "category": 288.282, "detail": 324.399, "player": 8048.18, "url_check": 3616.693, "total": 22134.834}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "2", "vod_id": "45320", "flag": "海纳云端", "play_id": "45320-1-1"}, "player": {"parse": 0, "url": "https://jx.hainatv.net/hn/stray/52bd24de3efdd0171a597b11cefff881.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://jx.hainatv.net/hn/stray/52bd24de3efdd0171a597b11cefff881.m3u8", "reason": null}}, {"spider": "清沅4K", "file": "清沅4K.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.562, "init": 231.721, "home": 631.865, "category": 2706.461, "detail": 336.64, "player": 775.729, "url_check": 207.372, "total": 20806.036}, "counts": {"classes": 7, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "394702", "flag": "NBY", "play_id": "NBY-XMYAES5cc086de456097383d7a2f16712c0a65a8691eabfeca0d8bd23da82723c41ef50c2f1d2e42716a23196e0f162e4641ae|d1e39e9e5c3ed0be2de965658ea2505f@@@NBY"}, "player": {"parse": 0, "url": "http://45.207.210.22:2028/play/f28bbec0a954a25823cd85616bcdde15.m3u8?t=1784442443&sign=f77f3f5f07fd0864520baea602ef008e", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://45.207.210.22:2028/play/f28bbec0a954a25823cd85616bcdde15.m3u8?t=1784442443&sign=f77f3f5f07fd0864520baea602ef008e", "reason": null}}, {"spider": "滴答影视", "file": "滴答影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.971, "init": 0.001, "home": 0.001, "category": 6128.598, "detail": 630.74, "player": 0.005, "url_check": 933.361, "total": 7700.287}, "counts": {"classes": 5, "category_videos": 48, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "3571", "flag": "百度", "play_id": "https://pan.baidu.com/s/1u-au6-HNVu6KLxjlW4m4nA?pwd=hy64"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1u-au6-HNVu6KLxjlW4m4nA?pwd=hy64", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=u-au6-HNVu6KLxjlW4m4nA&pwd=hy64", "reason": null}}, {"spider": "潮流APP", "file": "潮流APP.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.32, "init": 0.003, "home": 84.767, "category": 98.596, "detail": 121.821, "player": 288.022, "url_check": 78.796, "total": 676.74}, "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://210.16.164.82:9090/nby/m3u8/getM3u8?name=jx.91by.top&time=1784442425346&url=NBY-c6d046002ed1d767bee10e93ee7f1ff8.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://210.16.164.82:9090/nby/m3u8/getM3u8?name=jx.91by.top&time=1784442425346&url=NBY-c6d046002ed1d767bee10e93ee7f1ff8.m3u8", "reason": null}}, {"spider": "灯泡影视", "file": "灯泡影视.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.617, "init": 0.001, "home": 0.001, "category": 1421.161, "detail": 1378.252, "player": 0.006, "url_check": 628.783, "total": 3433.491}, "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": 6.399, "init": 0.001, "home": 8153.83, "category": 276.547, "detail": 296.702, "player": 8426.635, "url_check": 368.871, "total": 17529.601}, "counts": {"classes": 5, "category_videos": 12, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "3571", "flag": "蓝光C", "play_id": "/play/3571-4-1.html"}, "player": {"parse": 0, "url": "https://cloudcube.wuxi.cn/cloudcube-jswx-person/PERSONCLOUD/92eb2ccd-7213-4d59-afbf-d523312f163d.mp4?x-obs-traffic-limit=819200&X-Amz-Date=20260719T051236Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&x-amz-CLIENTTYPEIN=UNKNOWN&X-Amz-Credential=SZshenghuo/20260719/us-east-1/s3/aws4_request&x-amz-UID=852078578886571&response-content-disposition=attachment%3Bfilename%3DHeartstopper.Forever.2026.1080p.NF.mp4&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=CORP&X-Amz-SignedHeaders=host&X-Amz-Expires=10800&x-amz-FSIZE=2117629753&x-amz-UFID=61458317119383782&X-Amz-Signature=10c0676b8762cc16b071047c26d9cc611d982376ebaf5475cdeded91c0cca90d", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cloudcube.wuxi.cn/cloudcube-jswx-person/PERSONCLOUD/92eb2ccd-7213-4d59-afbf-d523312f163d.mp4?x-obs-traffic-limit=819200&X-Amz-Date=20260719T051236Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&x-amz-CLIENTTYPEIN=UNKNOWN&X-Amz-Credential=SZshenghuo/20260719/us-east-1/s3/aws4_request&x-amz-UID=852078578886571&response-content-disposition=attachment%3Bfilename%3DHeartstopper.Forever.2026.1080p.NF.mp4&x-amz-CLIENTNETWORK=UNKNOWN&x-amz-CLOUDTYPEIN=CORP&X-Amz-SignedHeaders=host&X-Amz-Expires=10800&x-amz-FSIZE=2117629753&x-amz-UFID=61458317119383782&X-Amz-Signature=10c0676b8762cc16b071047c26d9cc611d982376ebaf5475cdeded91c0cca90d", "reason": null}}, {"spider": "爱壹帆", "file": "爱壹帆.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.342, "init": 0.001, "home": 0.001, "category": 1305.549, "detail": 1183.298, "player": 8032.736, "url_check": 191.759, "total": 10719.147}, "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.477, "init": 0.02, "home": 3214.388, "category": 780.125, "detail": 218.619, "player": 0.001, "url_check": 156.898, "total": 4385.571}, "counts": {"classes": 11, "category_videos": 60, "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": 10.449, "init": 0.107, "home": 0.001, "category": 15474.23, "detail": 0.002, "player": 0.002, "url_check": 220.99, "total": 15706.277}, "counts": {"classes": 7, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "genre", "vod_id": "msearch:movie-1108427", "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": 13.388, "init": 0.001, "home": 0.001, "category": 8070.751, "detail": 408.518, "player": 418.508, "url_check": 5676.147, "total": 14588.115}, "counts": {"classes": 6, "category_videos": 48, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "index", "vod_id": "147607", "flag": "独播库", "play_id": "147607-1-1"}, "player": {"parse": 0, "url": "https://vid.dbokutv.com/20260713/ppotb62-S71lT2yliZApDBSvkYzBsrmD3fpCJ4nBt1sRsGlQ79nBNTgScPcBJ0nBJ0oC3GrEJ0uH2vjS34/chunklist.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vid.dbokutv.com/20260713/ppotb62-S71lT2yliZApDBSvkYzBsrmD3fpCJ4nBt1sRsGlQ79nBNTgScPcBJ0nBJ0oC3GrEJ0uH2vjS34/chunklist.m3u8", "reason": null}}, {"spider": "猫猫4K", "file": "猫猫4K.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.205, "init": 201.171, "home": 303.618, "category": 159.823, "detail": 152.166, "player": 135.502, "url_check": 743.598, "total": 13067.712}, "counts": {"classes": 5, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "197101", "flag": "火猫备用T", "play_id": "https://vip.dytt-tvs.com/20260711/27712_c30729ad/index.m3u8@@@dyttm3u8"}, "player": {"parse": 0, "url": "https://vip.dytt-tvs.com/20260711/27712_c30729ad/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://play2.jimxtc.com/20260711/27712_c30729ad/index.m3u8", "reason": null}}, {"spider": "王子4K", "file": "王子4K.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 13.511, "init": 0.003, "home": 530.112, "category": 462.379, "detail": 8202.759, "player": 0.009, "url_check": 1863.107, "total": 11072.65}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "409142", "flag": "YZ线路", "play_id": "YZ线路@@direct@@,https://cdn.yzzy28-play.com/20260719/32526_a38c4432/index.m3u8,token+,1,0"}, "player": {"parse": 0, "url": "https://cdn.yzzy28-play.com/20260719/32526_a38c4432/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://cdn.yzzy28-play.com/20260719/32526_a38c4432/index.m3u8", "reason": null}}, {"spider": "玩偶哥哥", "file": "玩偶哥哥.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.695, "init": 0.001, "home": 0.001, "category": 6474.224, "detail": 650.048, "player": 0.004, "url_check": 1008.136, "total": 8139.478}, "counts": {"classes": 8, "category_videos": 70, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "44", "vod_id": "128695", "flag": "百度#玩偶哥哥", "play_id": "https://pan.baidu.com/s/13bTSaiKEe9hfRb2PJ7oCSA?pwd=wogg"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/13bTSaiKEe9hfRb2PJ7oCSA?pwd=wogg", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=3bTSaiKEe9hfRb2PJ7oCSA&pwd=wogg", "reason": null}}, {"spider": "玩偶聚合", "file": "玩偶聚合.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 48.886, "init": 0.001, "home": 3.214, "category": 2320.292, "detail": 773.684, "player": 0.004, "url_check": 1172.79, "total": 10519.259}, "counts": {"classes": 11, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "site_duoduo", "vod_id": "site:duoduo:/index.php/vod/detail/id/9607.html", "flag": "百度#多多", "play_id": "https://pan.baidu.com/s/1LoCfRG5N64SdmgPwCew9UA?pwd=yyds"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1LoCfRG5N64SdmgPwCew9UA?pwd=yyds", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=LoCfRG5N64SdmgPwCew9UA&pwd=yyds", "reason": null}}, {"spider": "瓜子", "file": "瓜子.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.739, "init": 0.001, "home": 0.016, "category": 634.956, "detail": 5152.674, "player": 449.872, "url_check": 553.978, "total": 6799.324}, "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": 4.146, "init": 87.037, "home": 0.009, "category": 328.286, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 733.62}, "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": 5.317, "init": 0.002, "home": 0.001, "category": 900.977, "detail": 5223.708, "player": 842.894, "url_check": 507.473, "total": 16083.671}, "counts": {"classes": 5, "category_videos": 24, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "dianshiju", "vod_id": "wzzy-42727/6a5a24bffd8186d70da1aca7.html", "flag": "lzm3u8", "play_id": "{\"title\":\"第01集\",\"origin\":\"lzm3u8\",\"page\":\"https://dyrs7.vip/wzzy-42727-6a5a24bffd8186d70da1aca7.html?origin=lzm3u8&p=0\",\"vodName\":\"愿望地图\",\"pic\":\"https://dyrs7.vip/img/id/6a5a24bffd8186d70da1aca7.jpg\"}"}, "player": {"parse": 0, "url": "https://v.lfthirtytwo.com/20260717/8709_e65851a5/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v.lfthirtytwo.com/20260717/8709_e65851a5/index.m3u8", "reason": null}}, {"spider": "电影天堂", "file": "电影天堂.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 4.982, "init": 165.537, "home": 349.588, "category": 153.93, "detail": 158.36, "player": 322.975, "url_check": 457.468, "total": 1613.55}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "408917", "flag": "超级无敌4k", "play_id": "eyJ2b2RQbGF5RnJvbSI6ICJieXRlZGFuY2UiLCAicGxheVVybCI6ICJ2MGQ1YWFnMTAwMDJkOTR0c3B2b2c2NXBpczdwajcxMCJ9"}, "player": {"parse": 0, "url": "https://v9-forum.picovr.com/3915e4e1d4403e70e14faa08ae9d9ff5/6a5dca99/video/tos/cn/tos-cn-v-672a0a/ocEDqSVzvendaBCLdE5A1ZUJEFNMJn4IhgfFp5/?a=264482&ch=0&cr=0&dr=0&er=0&lr=default&cd=0%7C0%7C0%7C0&br=1114&bt=1114&cs=0&ds=3&ft=GjcLGCXMBBkq8ZmoJ1Rxk_vjVQWw&mime_type=video_mp4&qs=0&rc=Omc6Zzg1MzM5Z2VnZTgzN0BpMzpzdnM5cnN3PDUzNGQ4M0AxNDQzNmNgNTQxNDAuMDE1YSMuZzRmMmRzcDFhLS1kXmFzcw%3D%3D&btag=80000e00038000&dy_q=1784442444&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=202607191427245348E3C7DEAC5679BD99", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://v9-forum.picovr.com/3915e4e1d4403e70e14faa08ae9d9ff5/6a5dca99/video/tos/cn/tos-cn-v-672a0a/ocEDqSVzvendaBCLdE5A1ZUJEFNMJn4IhgfFp5/?a=264482&ch=0&cr=0&dr=0&er=0&lr=default&cd=0%7C0%7C0%7C0&br=1114&bt=1114&cs=0&ds=3&ft=GjcLGCXMBBkq8ZmoJ1Rxk_vjVQWw&mime_type=video_mp4&qs=0&rc=Omc6Zzg1MzM5Z2VnZTgzN0BpMzpzdnM5cnN3PDUzNGQ4M0AxNDQzNmNgNTQxNDAuMDE1YSMuZzRmMmRzcDFhLS1kXmFzcw%3D%3D&btag=80000e00038000&dy_q=1784442444&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=202607191427245348E3C7DEAC5679BD99", "reason": null}}, {"spider": "百度短剧", "file": "百度短剧.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 3.483, "init": 0.001, "home": 392.064, "category": 254.958, "detail": 596.24, "player": 221.378, "url_check": 142.175, "total": 1611.175}, "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-hna", "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-hna", "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": 4.841, "init": 0.001, "home": 3385.471, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 3392.02}, "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": 5.601, "init": 0.001, "home": 0.001, "category": 273.45, "detail": 279.387, "player": 303.503, "url_check": 1438.013, "total": 2300.599}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "/", "vod_id": "129450", "flag": "百度1", "play_id": "push://https://www.seedhub.cc/link_start/?redirect_to=pan_id_698322&movie_title=【野狗骨头】【4K+1080P】【中文字幕】【无广告】 更新于 今天"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/12oEDdD3KWO9GWPXeAsgWVQ?pwd=9lx6", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=2oEDdD3KWO9GWPXeAsgWVQ&pwd=9lx6", "reason": null}}, {"spider": "盘链", "file": "盘链.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.651, "init": 0.078, "home": 0.001, "category": 1662.581, "detail": 429.406, "player": 671.816, "url_check": 470.484, "total": 3243.428}, "counts": {"classes": 5, "category_videos": 30, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "0", "vod_id": "-75519", "flag": "123", "play_id": "push://https://www.xn--vzy265d.cc/api/go.php?t=zIHjpKPPy4NkgJvFSiL76ol1akMhWbX51SNcwVWhqg9HB8nK7Ry7ZnfoYS3eNXsiRKAwaID8-vh8pYxpRVjYu3rhjOODdIwoLuY4iGRkcCdt-tq1wKMc-Zgnw71MTBr-f7bDwONlwCoVMpYr7Uc3XTmJ8VgJHfBmnrk9RJ5N11dTFyn7b80MATQD4SsADoAKi4SWaIUZ90VwUyqgQNKltg"}, "player": {"parse": 0, "url": "https://1856539457.share.123pan.cn/123pan/ZUtrvd-Occ4H", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://www.123pan.com", "reason": null}}, {"spider": "短剧优选", "file": "短剧优选.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 24.639, "init": 511.543, "home": 0.105, "category": 717.112, "detail": 303.068, "player": 0.003, "url_check": 41.154, "total": 1598.337}, "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": 4.631, "init": 0.001, "home": 0.0, "category": 240.487, "detail": 1188.628, "player": 0.005, "url_check": 164.953, "total": 1599.27}, "counts": {"classes": 2, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "https://sm3.cc/?id=64783", "flag": "夸克", "play_id": "https://pan.quark.cn/s/7a967449161d"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/7a967449161d", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/7a967449161d", "reason": null}}, {"spider": "磁力熊", "file": "磁力熊.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.089, "init": 0.002, "home": 0.005, "category": 698.319, "detail": 571.441, "player": 0.004, "url_check": 0.055, "total": 1276.435}, "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": 6.481, "init": 0.001, "home": 267.342, "category": 276.941, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 833.424}, "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.927, "init": 0.001, "home": 762.521, "category": 431.75, "detail": 0.006, "player": 377.876, "url_check": 0.0, "total": 2353.69}, "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": 5.229, "init": 0.001, "home": 0.001, "category": 1618.016, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 3117.385}, "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": 8.15, "init": 0.001, "home": 131.704, "category": 246.242, "detail": 953.915, "player": 0.002, "url_check": 205.269, "total": 1546.144}, "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": 10.115, "init": 0.001, "home": 0.001, "category": 1702.938, "detail": 245.648, "player": 0.004, "url_check": 1062.849, "total": 3022.212}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "26", "vod_id": "15605", "flag": "百度#至臻", "play_id": "https://pan.baidu.com/s/1CfzXG_EH2CogCjYKrwWqtw?pwd=xer3"}, "player": {"parse": 0, "url": "https://pan.baidu.com/s/1CfzXG_EH2CogCjYKrwWqtw?pwd=xer3", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.baidu.com/share/init?surl=CfzXG_EH2CogCjYKrwWqtw&pwd=xer3", "reason": null}}, {"spider": "苹果", "file": "苹果.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 5.857, "init": 178.697, "home": 341.322, "category": 115.211, "detail": 90.211, "player": 242.592, "url_check": 181.313, "total": 1155.857}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "854818", "flag": "独家4K", "play_id": "eyJ2b2RQbGF5RnJvbSI6ICJmeW0zdTgiLCAicGxheVVybCI6ICJGWU5CLTdfOU5xSW5kMUtzVFdQNFNkNnJjTUdZQ2EwUjVGR3ZYR2txZXVEQjJzazc5RHI5RXVDSUR5M20wR3VZNHRaTGVIb1JaNDYtb0Z0ZlRPWi05MVoyUHhoaWo1WnhKNU1SN3ZQbDFoR2YybS1COVJkT3JfbkZVTTl6T1ZLRmJxT1hteTJlbnZNejl0dHdGbWZqZUs1ZWJkQSJ9"}, "player": {"parse": 0, "url": "https://hls.yeegv.cn:2828/hls/209cfd0fa5076a79d9aa3969302e0584.m3u8?token=d33cf03d88810eb67521d85f3bee42e57e6dfbf06494a24f71f8da91835adaf343a9b0bf5c2ece21e07c061b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://hls.yeegv.cn:2828/hls/209cfd0fa5076a79d9aa3969302e0584.m3u8?token=d33cf03d88810eb67521d85f3bee42e57e6dfbf06494a24f71f8da91835adaf343a9b0bf5c2ece21e07c061b", "reason": null}}, {"spider": "茶杯狐", "file": "茶杯狐.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 6.122, "init": 0.001, "home": 676.926, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 683.271}, "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": 5.882, "init": 224.356, "home": 321.411, "category": 124.35, "detail": 110.116, "player": 258.757, "url_check": 112.041, "total": 1157.631}, "counts": {"classes": 9, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "2", "vod_id": "854818", "flag": "独家4K", "play_id": "eyJ2b2RQbGF5RnJvbSI6ICJmeW0zdTgiLCAicGxheVVybCI6ICJGWU5CLTdfOU5xSW5kMUtzVFdQNFNkNnJjTUdZQ2EwUjVGR3ZYR2txZXVEQjJzazc5RHI5RXVDSUR5M20wR3VZNHRaTGVIb1JaNDYtb0Z0ZlRPWi05MVoyUHhoaWo1WnhKNU1SN3ZQbDFoR2YybS1COVJkT3JfbkZVTTl6T1ZLRmJxT1hteTJlbnZNejl0dHdGbWZqZUs1ZWJkQSJ9"}, "player": {"parse": 0, "url": "https://hls.yeegv.cn:2828/hls/209cfd0fa5076a79d9aa3969302e0584.m3u8?token=d33cf03d88810eb67521d85f3bee42e57e6dfbf06494a24f71f8da91835adaf343a9b0bf5c2ece21e07c061b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://hls.yeegv.cn:2828/hls/209cfd0fa5076a79d9aa3969302e0584.m3u8?token=d33cf03d88810eb67521d85f3bee42e57e6dfbf06494a24f71f8da91835adaf343a9b0bf5c2ece21e07c061b", "reason": null}}, {"spider": "虎斑", "file": "虎斑.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.423, "init": 0.001, "home": 0.001, "category": 2321.183, "detail": 2539.835, "player": 0.025, "url_check": 148.654, "total": 5018.641}, "counts": {"classes": 7, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "488127", "flag": "夸克#虎斑", "play_id": "https://pan.quark.cn/s/7a1c7729a56b"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/7a1c7729a56b", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/7a1c7729a56b", "reason": null}}, {"spider": "蜗牛", "file": "蜗牛.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 10.298, "init": 0.002, "home": 0.001, "category": 632.996, "detail": 506.314, "player": 0.012, "url_check": 419.131, "total": 1569.723}, "counts": {"classes": 4, "category_videos": 72, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "34638", "flag": "115#蜗牛", "play_id": "https://115.com/s/swzn0oe3fwo?password=8888&"}, "player": {"parse": 0, "url": "https://115.com/s/swzn0oe3fwo?password=8888&", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://115cdn.com/s/swzn0oe3fwo?password=8888&", "reason": null}}, {"spider": "蜡笔", "file": "蜡笔.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 19.128, "init": 0.001, "home": 0.001, "category": 281.756, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 1134.874}, "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.697, "init": 0.001, "home": 498.814, "category": 491.924, "detail": 0.008, "player": 0.004, "url_check": 342.217, "total": 1336.986}, "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": 7.447, "init": 0.001, "home": 0.003, "category": 1219.44, "detail": 593.982, "player": 565.483, "url_check": 1058.068, "total": 3445.131}, "counts": {"classes": 4, "category_videos": 36, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "419973", "flag": "蓝光专线4", "play_id": "play/419973-1-0"}, "player": {"parse": 0, "url": "https://play.phimgood.com/20260718/29082_2f3b82f3/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://play.phimgood.com/20260718/29082_2f3b82f3/index.m3u8", "reason": null}}, {"spider": "观影", "file": "观影.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 11.236, "init": 0.006, "home": 0.002, "category": 0.004, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 12.534}, "counts": {"classes": 3, "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": 14.602, "init": 0.001, "home": 10014.764, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 10031.053}, "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": 9.429, "init": 0.029, "home": 295.722, "category": 661.43, "detail": 314.223, "player": 0.003, "url_check": 1517.58, "total": 2799.062}, "counts": {"classes": 4, "category_videos": 20, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "cms:feifan:98684", "flag": "非凡资源", "play_id": "https://vip.ffzy-plays.com/20260718/55917_c6d410f5/index.m3u8"}, "player": {"parse": 0, "url": "https://vip.ffzy-plays.com/20260718/55917_c6d410f5/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip.ffzy-plays.com/20260718/55917_c6d410f5/index.m3u8", "reason": null}}, {"spider": "路漫漫", "file": "路漫漫.txt", "success": false, "failed_stage": "category", "error": "分类视频列表为空", "traceback": null, "timings_ms": {"module_load": 5.436, "init": 0.001, "home": 0.001, "category": 358.814, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 683.369}, "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": 6.163, "init": 0.001, "home": 387.83, "category": 96.144, "detail": 3326.578, "player": 140.61, "url_check": 46.059, "total": 4005.437}, "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/b13439397d1f5f2ba37eb9e4bd226e00/6a5c6e53/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/b13439397d1f5f2ba37eb9e4bd226e00/6a5c6e53/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": 8.555, "init": 404.97, "home": 275.909, "category": 309.355, "detail": 286.258, "player": 391.332, "url_check": 307.676, "total": 1986.069}, "counts": {"classes": 12, "category_videos": 15, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "recommend", "vod_id": "752791315", "flag": "酷狗音乐", "play_id": "752791315"}, "player": {"parse": 0, "url": "http://fsdg360.tx.kugou.com/202607191427/32aea7ba5ade026e4aa4268622df51b2/v3/46caf64aa0570c103b2c47f281042192/yp/full/ap1013_us0_mic85f71c379c462618de1399950957c33_pi6101_mx752791315_qumultitrack_s503431068.mkv?ft=car_203559_10049&fts=b05bb02d44717442054bac7624ed9a29&ext=.mkv", "valid": true, "reachable": true, "status_code": 200, "final_url": "http://fsdg360.tx.kugou.com/202607191427/32aea7ba5ade026e4aa4268622df51b2/v3/46caf64aa0570c103b2c47f281042192/yp/full/ap1013_us0_mic85f71c379c462618de1399950957c33_pi6101_mx752791315_qumultitrack_s503431068.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": 5.493, "init": 0.001, "home": 1717.845, "category": 207.018, "detail": 195.621, "player": 190.178, "url_check": 155.149, "total": 2471.973}, "counts": {"classes": 6, "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=6a5c9881&whip=222.210.164.211&sign=84a343835c8c94dc77623fb25939c5779776f18f", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://ppvod01.kqgfbs.com/splitOut/20260705/1342569/V20260705110331438911342569/index.m3u8?t=6a5c9881&whip=222.210.164.211&sign=84a343835c8c94dc77623fb25939c5779776f18f", "reason": null}}, {"spider": "长泽", "file": "长泽.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.801, "init": 0.017, "home": 146.914, "category": 104.685, "detail": 80.956, "player": 0.024, "url_check": 2019.195, "total": 2359.248}, "counts": {"classes": 18, "category_videos": 21, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "20", "vod_id": "93025", "flag": "FF有广", "play_id": "app88:WyJodHRwczovL3ZpcC5mZnp5LXBsYXlzLmNvbS8yMDI2MDcxNy81NTg2OV8zNmY4OWU1MC9pbmRleC5tM3U4IiwiZmZtM3U4IiwiMjMgMDAw5p2h55Sf5ZG9IiwiMSJd"}, "player": {"parse": 0, "url": "https://vip.ffzy-plays.com/20260717/55869_36f89e50/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vip.ffzy-plays.com/20260717/55869_36f89e50/index.m3u8", "reason": null}}, {"spider": "闪电", "file": "闪电.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 8.13, "init": 0.001, "home": 0.001, "category": 862.513, "detail": 392.226, "player": 0.01, "url_check": 135.256, "total": 1398.594}, "counts": {"classes": 5, "category_videos": 72, "detail_videos": 1, "episodes": 1}, "samples": {"tid": "1", "vod_id": "186095", "flag": "夸克#闪电", "play_id": "https://pan.quark.cn/s/b33e2a7c1c44"}, "player": {"parse": 0, "url": "https://pan.quark.cn/s/b33e2a7c1c44", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://pan.quark.cn/s/b33e2a7c1c44", "reason": null}}, {"spider": "雷鲸", "file": "雷鲸.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 6.687, "init": 0.003, "home": 0.003, "category": 2081.598, "detail": 901.981, "player": 0.004, "url_check": 198.537, "total": 3189.361}, "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": 6.588, "init": 0.002, "home": 2000.0, "category": 1513.81, "detail": 4704.913, "player": 990.166, "url_check": 131.601, "total": 9347.623}, "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=1784442456&sign=ca481552a726f5be7d2c4115ca354176&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=1784442456&sign=ca481552a726f5be7d2c4115ca354176&ip=222.210.164.211", "reason": null}}, {"spider": "韩小圈", "file": "韩小圈.txt", "success": true, "failed_stage": null, "error": null, "traceback": null, "timings_ms": {"module_load": 7.865, "init": 0.001, "home": 0.001, "category": 590.892, "detail": 573.435, "player": 0.003, "url_check": 2005.861, "total": 3178.706}, "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.522, "init": 0.001, "home": 0.001, "category": 548.001, "detail": 312.862, "player": 0.004, "url_check": 77.374, "total": 942.243}, "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": 6.814, "init": 0.001, "home": 0.001, "category": 1048.238, "detail": 1082.779, "player": 947.222, "url_check": 793.106, "total": 3878.982}, "counts": {"classes": 4, "category_videos": 40, "detail_videos": 1, "episodes": 2}, "samples": {"tid": "1", "vod_id": "248126", "flag": "茅台资源1", "play_id": "/vodplay/248126-3-1.html"}, "player": {"parse": 0, "url": "https://vodcnd16.trjho.com/20260715/GnywOhlM/index.m3u8", "valid": true, "reachable": true, "status_code": 200, "final_url": "https://vodcnd16.trjho.com/20260715/GnywOhlM/index.m3u8", "reason": null}}, {"spider": "魔方APP", "file": "魔方APP.txt", "success": false, "failed_stage": "home", "error": "分类列表为空", "traceback": null, "timings_ms": {"module_load": 5.78, "init": 0.002, "home": 396.998, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 402.975}, "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": 6.813, "init": 0.001, "home": 0.001, "category": 230.087, "detail": 255.892, "player": 0.024, "url_check": 434.423, "total": 928.384}, "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": 6.645, "init": 0.002, "home": 298.652, "category": 0.0, "detail": 0.0, "player": 0.0, "url_check": 0.0, "total": 305.51}, "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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}
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>