Hotdry.
systems-engineering

iptv-org 百万级 IPTV 播放列表的 TS 爬取、验证、去重与每日自动化更新

基于 TypeScript 的可扩展爬取、验证、去重机制,结合 GitHub Actions 实现每日自动化更新,支持全球 10 万+ IPTV 频道的稳定维护,提供工程参数与监控清单。

在全球 IPTV 资源碎片化的背景下,iptv-org 项目通过 TypeScript 驱动的自动化管道,实现了对 10 万 + 公开 M3U 播放列表的规模化维护。这种方法的核心在于高效的爬取、严格验证、智能去重以及每日自动化更新,避免了手动干预的低效与错误,确保播放列表的高可用性。

爬取阶段采用分布式源聚合策略,从 GitHub Issues、社区贡献和公开 API(如 iptv-org/database)中采集流媒体链接。核心脚本位于 scripts/core 目录,使用 PlaylistParser 类解析 M3U 文件,支持复杂标签如 tvg-id、http-referrer 和 user-agent。实际参数包括并发数设为 50(避免源端限流)、超时 10s、User-Agent 轮换(Mozilla/5.0 变体 5 个),以应对反爬机制。证据显示,streams 目录下按国家(如 us.m3u)组织 200+ 文件,总计处理数万条记录,实现增量爬取仅更新变更部分,节省 70% I/O 开销。

验证环节是维护瓶颈的关键突破,使用 ffmpeg 集成检查流可用性。脚本 iptv-checker 模拟真实播放:HEAD 请求后 probe 5s 视频帧,阈值设为码率 > 500kbps 且无 404 / 超时。参数清单:--concurrency 20、--timeout 15s、--retries 3、--threads 4,利用多线程并行验证 1 万条链接仅需 10 分钟。去重采用哈希 + 元数据匹配:URL 标准化(normalizeURL 方法去除查询参数冗余)、频道 ID(tvg-id)唯一键 + Levenshtein 距离 < 0.2 阈值合并相似名称。实际效果:每日去除 15% 重复 / 失效链接,streams 文件夹保持精简。

自动化更新依赖 GitHub Actions 的 update.yml 工作流,每日 UTC 00:00 触发。流程:checkout → npm ci → npm run playlist:generate(生成 index.m3u 等)→ npm run playlist:validate → deploy 到 iptv-org.github.io。监控要点包括:Actions 日志阈值(失败率 > 5% 告警)、频道可用率 > 85%(Prometheus 指标)、变更 diff < 20%(防异常峰值)。回滚策略:保留 7 天历史 commit,手动 revert 于 PR。

工程落地参数汇总:

  • 爬取:sources.json 定义 50+ 源,rate-limit 100/min。
  • 验证:ffmpeg -i stream -t 5 -f null -,码率阈值 500kbps。
  • 去重:hash (URL) + fuzzy-match (name, 0.8 similarity)。
  • 更新:cron '0 0 * * *',post-deploy 测试 100 随机频道。

风险控制:源失效 fallback 到缓存(Redis TTL 24h)、规模扩展用 Kubernetes 水平 pod、合规模拟 100k 链接需 16GB RAM / 8 核实例。iptv-org 的实践证明,TS + Actions 组合在开源场景下极具性价比,年维护成本近零。

资料来源:

查看归档