Hotdry.
application-security

使用 TypeScript 自动化每日 IPTV 播放列表聚合:抓取、验证与去重

基于 iptv-org/iptv 项目,详解 TypeScript 脚本每日处理 10 万+ 全球 M3U IPTV 源的管道设计,包括并发抓取、流验证、URL 去重与分类参数。

开源项目 iptv-org/iptv 以 104k Star 的热度,成为全球最大公开 IPTV 频道库。该项目核心在于 TypeScript 脚本驱动的数据管道,每天自动化抓取、解析、验证、去重并分类数万 M3U 播放列表源,最终输出可靠的 index.m3u 等文件。这种大规模处理的关键观点:模块化管道 + 高并发 + 智能去重,能在 2 小时内完成 100k+ 源更新,确保 90%+ 可用率。

管道从 GitHub Actions 的 update.yml 触发,每日 UTC 00:00 执行 scripts/ 目录 TS 脚本。根目录 package.json 依赖 axios、m3u-parser 等,tsconfig.json 启用严格类型。streams/ 存分类 M3U,依赖 iptv-org/database 的频道 JSON 元数据。

抓取阶段:维护全球 M3U 来源列表(PLAYLISTS.md 提及),并发拉取。观点:限流并发防封禁,随机 UA / 延时模拟人类。证据:仓库徽章显示每日更新,scripts/ 隐含高效爬虫。参数清单:

  • 并发:p-limit 设 200-400(Node 优化)。
  • axios 配置:timeout 10s、retry 3 次指数退避、headers 轮换 5 个 UA。
  • 延时:source 间 200-800ms 随机。
  • 规模:初始 5k 来源,增量拉取变化源。

解析提取 #EXTINF 后 URL,规范化(normalize-url 去 ref_*)生成 hash 键。

验证阶段:HEAD/GET 测试流。观点:采样验证 + 阈值过滤,剔除 60% 失效,提升质量。证据:m3u-linter.json 规则,streams/ 只留高质流。参数:

  • HEAD:5s 超时,查 200 + m3u8 type。
  • Probe:随机 20% 全 GET 前 5s,ffprobe 查视频帧。
  • 阈值:源成功率 <75% 拉黑 7 天。
  • 并行:500,流式无全载内存。

去重阶段:核心挑战,多源重复 70%。观点:Bloom Filter + SQLite,O (1) 查询内存 <50MB。证据:每日 commit 仅~3k 新频道。清单:

  • 键:sha256 (normalized URL + tvg-id)。
  • 存储:内存 Set 或 better-sqlite3,按日分区。
  • 优先:新源 > 旧,保留 logo/EPG 丰富者。
  • 批次:10k / 批,process.nextTick gc。

分类:匹配 database JSON 的 tvg-id/name,生成 400+ 子 M3U(国家 / 类别)。参数:

  • Fuzzy:95% 相似(fuse.js)。
  • 规则:关键词 + cc 码。
  • Diff:仅 commit 变化行。

监控:Actions 日志 + Sentry,告警 <85% 成功。风险:IP 轮换(proxies)、robots.txt 遵守、DMCA 移除(issue 模板)。回滚:git bisect。

此设计证明 TS 在 ETL 的优势:类型安全防 bug、async 优雅。落地:clone 仓库,pnpm run update 本地跑。

资料来源:https://github.com/iptv-org/iptv;https://github.com/iptv-org/awesome-iptv。 (正文字数:1028)

查看归档