Faceoff:在终端里追 NHL 比赛的 TUI 应用
文章摘要
Faceoff 是一款专为 NHL(北美职业冰球联赛)爱好者打造的终端用户界面(TUI)应用,作者 Vincent Gregoire 从同类的 MLB 棒球终端应用 Playball 中获得灵感,把”在命令行里看球”这件事搬到了冰球世界。Faceoff 的功能覆盖了赛季观赛的几乎所有场景:用户可以按日期浏览赛程,方便地翻阅前一天或后一天的比赛安排;正在进行的比赛会以自动刷新的方式呈现实时比分、逐回合战报(play-by-play)、得分摘要以及详细的 box score。开赛前还能看到对位信息,包括两队首发门将的对比与得分手领跑者,让球迷快速建立对当晚对阵的判断。
除了单场比赛之外,Faceoff 还提供完整的联盟数据视图,支持按外卡(Wild Card)、分区(Division)、联盟会议(Conference)以及全联盟四种维度查看积分榜,还可以按个人数据查看顶尖球员和门将的统计领跑者。用户可以打开任意球队页面查看阵容、赛程,也能进入球员主页查看生涯数据和单赛季逐场记录(game log)。整个界面会根据终端窗口尺寸做自适应布局,比赛时间会按用户本地时区显示,避免时差带来的混乱。
技术栈方面,Faceoff 使用 Python 编写,UI 层基于现代 TUI 框架 Textual 构建,数据层则依赖 nhl-stats-api-client 这个第三方 Python 客户端,用于访问 NHL 的非官方 API。安装方式非常简洁,可以通过 uvx faceoff 一键运行,也可以通过 pip 标准方式安装。整个项目的代码结构清晰、对外依赖少,是个非常典型的”个人开发者的小工具”——既好用又不浪费时间在过度抽象上。
HN 评论精华
- divbzero 第一时间指出了它的”亲缘关系”:Playball(MLB 终端应用)已经多次出现在 HN 上,从 2019 年到 2025 年都有相关讨论。Faceoff 算是把这个理念延伸到冰球项目。
- yuppiepuppie 提出了体育数据应用最痛的问题:联盟普遍把数据 API 当做收费内容门控起来。NHL 是否提供公开 API?stackskipton 解释道:官方上没有,但存在一个”未文档化但公开可访问”的 API,无需鉴权;如果是商业用途,联盟会单独提供文档和支持。redanddead 接着感叹”联盟没有官方 API 真是奇怪”,Shalomboy 则补充:这其实来自联盟广播合作伙伴的施压——他们希望流量集中在少数渠道,便于卖广告。
- freedomben 表达了 AI 时代个人小工具的”福音”:以前犯不上花时间写的脚本和小工具,现在写起来都很顺手,他自己就攒了好几十个;这种”个人 utility”才是 AI 真正的杀手级用例。作者 vcf 表示赞同,自己也有十几个这种工具,平时不会公开,只是借着季后赛开赛把这个分享了出来。
- mooktakim 戏称这是”图文电视(Teletext)的复兴”,forestingfisher 顺势指出:终端世界确实需要一个”无广告、无 JS 干扰”的中央信息面板,LeoPanthera 补充欧洲许多国家至今仍保留着电视的图文电视服务。
- duncangh 发来了实际使用反馈:观看 Hurricanes 比赛时发现 face-off 百分比 bug(两队同时显示 100%),希望能从比赛页直接跳转到球队/球员详情页,并表达了对作者发布这个工具的感谢。vcf 回复说这类 bug 只能在有比赛进行时才能调试,自动刷新偶尔不稳定也是同样的问题。
- paolatauru 提出了一个技术性更强的问题:NHL 那个非官方 API 的延迟在 30 秒到 2 分钟之间,作者是用固定轮询还是有更聪明的策略来保证体验?这是这类实时体育应用绕不开的核心难题。