开源项目 iptv-org/iptv 以 104k Star 闻名,汇集全球公开 IPTV 频道,其核心是 TypeScript 数据管道,每天自动化抓取、验证、去重并分类 100k+ M3U 播放列表源,生成 streams/ 目录下数百个高质量 M3U 文件。该管道证明:强类型脚本 + GitHub Actions,能实现生产级 ETL,处理海量不稳定源的同时保持 90%+ 可用率。
管道从 Actions 的 update.yml 每日触发,执行 scripts/ TS 脚本。package.json 依赖 axios(HTTP)、m3u8-parser(解析)、p-limit(并发),tsconfig.json 严谨类型检查。输入来源列表(PLAYLISTS.md 列出),输出 streams/cn.m3u 等,按国家/类别分。依赖 iptv-org/database 提供频道元数据(ID、logo、group)。
抓取阶段:观点,高并发限流 + 随机扰动,是防反爬与高效的关键,避免单源瓶颈。证据:仓库徽章每日更新,隐含 robust 爬虫。“The main playlist containing all channels available in the repository can be found at: https://iptv-org.github.io/iptv/index.m3u”。参数清单:
- 来源:5k+ 全球 M3U URL,优先高质(如 GitHub raw)。
- 并发:p-limit.throttle(300, 1000ms),匹配 Node I/O。
- axios:timeout: 10000, retries: 3(指数 1s/2s/4s),UA 池 10 个浏览器指纹,延时 200-600ms 高斯随机。
- 异常:5xx 重试,429 延时 30s,拉黑低质源 24h。
每个 M3U 解析提取频道:用 @iptv/playlist pipe,规范化 URL(protocol lowercase,去 ref_? 参数),生成唯一 ID sha256(url + tvg-id)。
验证阶段:观点,HEAD + 采样 probe 平衡速度与准确,过滤 50-70% 失效流。证据:m3u-linter.json 规则校验语法,streams/ 只剩高可用。参数:
- HEAD 请求:timeout 5000ms,验证 200 OK & Content-Type application/x-mpegURL。
- Probe:随机 15% 频道,全 GET 前 8s,用 fluent-ffmpeg 查视频/音频流(duration >3s)。
- 阈值:源级 >80% 通过,或频道 >75%,否则丢弃。
- 并行:500,内存流式(no buffer >1MB/req),总时 <1h。
去重阶段:观点,双层哈希(URL + metadata)+ 分区存储,O(1) 查重内存 <80MB。证据:每日 commit 增量仅数千,证明高效。清单:
- 键:crypto.subtle.digest('SHA-256', normalizedUrl + tvgName)。
- 存储:better-sqlite3 表 channels (id TEXT PRIMARY KEY, source TEXT, verified BOOLEAN),或内存 Map + BloomFilter (prob 0.001%)。
- 冲突:优先 probe 通过 + metadata 完整(logo/EPG),合并属性。
- 批次:20k/批,SQLite transaction,gc 后下一批。
分类阶段:观点,模糊匹配 + 规则引擎,95% 自动化准确。参数:
- 匹配:tvg-id 精确 > fuse.js name 相似(threshold 0.92) > 关键词(sports: football|basket)。
- 分组:200+ 国家(cc from tvg-name),50+ 类别(database.json),生成 PLAYLISTS.md 链接。
- Diff:simple-git 比较,仅 commit 变化 M3U。
落地部署:Dockerfile 打包(node:20-alpine),cron '0 0 * * * npm run update'。监控:Prom metrics (success_rate, latency_p95<2s),Grafana dashboard,<85% 告警 Slack。回滚:Actions artifact 上日 streams/,git revert。
风险限:代理池(5-10 proxies 轮换),robots.txt 解析限速,DMCA issue 模板快速移除。扩展:WebSocket 实时验证,Kubernetes scale。
此管道的核心参数可复用:从小 1k 源起步,监控调优并发至饱和。TypeScript 优势显露:类型防解析错,async 链简洁,生态 ETL 友好。
资料来源: