开源项目 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)