大家好,之前开源了一个自己做的 macOS 视频客户端 OKVideoMac

第一版出来的时候,其实基本功能已经能用了:

  • TVBox / CatVod 一类配置
  • CatPawOpen / MiraPlay 一类 Node 源
  • 直播
  • 搜索
  • 详情
  • 收藏 / 历史
  • libmpv 播放

但自己连续当主力软件用了一个月以后,越来越觉得:

“能跑”和“真正好用”之间,还有很长一段距离。

所以过去这一个月,我基本没有继续堆新功能,而是把大量时间花在重新整理 UI 、交互、播放链路、源兼容和底层生命周期上。

现在正式发布 OKVideoMac 0.4.0 ( Build 94 )


先简单介绍一下项目

OKVideoMac 是一个用 Swift / SwiftUI 开发的原生 macOS 视频与直播客户端。

播放器使用 libmpv

它不是 Android App 移植,也不是把 TVBox 界面直接搬到 Mac 上。

我的目标一直是:

保留 TVBox / CatVod / CatPawOpen 这类生态比较开放的“壳与源分离”能力,但把客户端真正按照 macOS 软件重新做一遍。

目前支持的主要路径包括:

  • Native CMS JSON
  • 部分 CMS XML
  • QuickJS Spider
  • CatVod / FongMi 风格 JS
  • CatPaw 风格 Node .js.md5
  • 部分 Java / Dex csp_ Spider
  • M3U / TXT / JSON 直播
  • XMLTV EPG

其中绝大部分路径都不需要 Android 。

只有部分传统 Java / Dex csp_ Spider ,会通过可选的 Android Bridge 兼容。

并不是声称“所有 TVBox 源全部兼容”,实际兼容性还是取决于源格式、运行时、接口实现和具体 Spider 。


0.4.0 我主要重新做了什么?

1. UI 基本重新设计了一遍

这是这一版最直观的变化。

首页、分类、搜索、详情、收藏、历史、设置等页面都重新统一了一遍。

包括:

  • Sidebar
  • Toolbar / Titlebar
  • 筛选器
  • 选中状态
  • 弹窗
  • 滚动区域
  • 字体层级
  • 间距
  • 深色模式
  • 窗口尺寸变化

都尽量回归 macOS 自己的交互方式。

第一版多少还有一点“把电视端软件搬到电脑上”的感觉。

这一版我越来越明确一个原则:

既然它运行在 Mac 上,那它首先应该是一个 Mac App ,其次才是一个影视客户端。

所以现在很多地方都改成了 SwiftUI / AppKit 更自然的交互,而不是照着 Android TV 的思路做。


2. 播放器还是 libmpv ,但底层改了很多

播放器核心没有换,依然是 libmpv 。

但这一轮真正花时间的,其实不是“能不能播放”,而是大量播放器生命周期问题。

比如:

  • 首帧什么时候真正 ready
  • 播放器打开 / 退出的资源释放
  • 连续切集
  • 快速拖动进度条
  • 播放到结尾
  • 用户主动快进到结尾
  • 自动下一集
  • 直播连续换台
  • 播放失败后的清理
  • 窗口关闭后的 teardown
  • mpv 与 Swift 状态同步

这些东西单独看都不算什么大功能,但叠起来以后,非常影响一个播放器到底“顺不顺手”。

我这一轮最大的感受也是:

做出一个能播放视频的 Demo 不难,难的是把播放器真正打磨到你每天愿意用。


3. TVBox 和 CatPawOpen 两条兼容链路重新梳理

这个项目现在其实有两套比较不同的源运行逻辑。

一类是传统的:

TVBox / CatVod / FongMi

包括 CMS 、QuickJS 、Java / Dex csp_ Spider 等。

另一类是:

CatPawOpen / MiraPlay 风格的 Node 视频接口

这一轮我花了很多时间去研究这两类项目原本的行为,然后尽量避免在 Mac 端“拍脑袋兼容”。

比如:

  • 首页到底什么时候重新请求
  • 分类切换是否应该缓存
  • detail 请求如何调度
  • Node runtime 是否重复初始化
  • Spider 生命周期
  • 搜索并发
  • 超时隔离
  • 播放地址解析
  • 网盘类源的处理
  • Action / Dialog 回调
  • Java Spider 与原生运行时之间如何隔离

现在整体架构比第一版清楚很多。


4. Android 现在只是兼容层,不是软件运行基础

这个也解释一下。

有些传统 TVBox Java Spider 本质上就是 Android / Dex 生态,如果完全不提供 Android 兼容层,就没办法做到比较完整的兼容。

所以项目里有一个可选的 Android Bridge 。

但现在它的定位非常明确:

Native 优先,Android fallback 。

也就是说:

普通 CMS 、QuickJS 、Node .js.md5、直播、XMLTV 、正常播放都不需要 Android 。

只有确实遇到 Java / Dex csp_ Spider 时才会启动这个兼容环境。

这一点我后面还会继续优化。

长期方向肯定是:

能原生处理的全部原生处理,Android 只留给无法替代的兼容场景。


5. 这次反而砍掉了一些“想做的功能”

比如 TMDB 详情增强,我原本准备放进 0.4.0 。

后来做着做着决定先停下来。

一方面是国内网络环境下 TMDB API 的可用性问题,另一方面我觉得这一版继续加功能,意义已经不大了。

所以最后选择:

先把现有东西做好,再增加下一层能力。

TMDB 、详情信息增强之类的东西,准备留到后面的版本。


项目不提供什么

这个还是需要明确说明一下。

OKVideoMac 本身:

不内置任何第三方影视源、账号、Cookie 、解析服务或者 DRM Key 。

项目提供的是客户端、Provider 运行能力和播放器。

请只使用自己有权访问的配置和内容。


目前版本

OKVideoMac 0.4.0 ( Build 94 )

系统要求:

  • Apple Silicon Mac
  • macOS 12.0+
  • arm64

正式 DMG 已完成:

  • Developer ID 签名
  • Apple Notarization
  • Staple

Release 里除了 DMG ,也提供了对应源码、第三方源码和许可证归档、SBOM 、Notices 、Manifest 、SHA256SUMS 等发布材料。

GitHub:

https://github.com/yaolin-dev/OKVideoMac

0.4.0 Release:

https://github.com/yaolin-dev/OKVideoMac/releases/tag/v0.4.0

项目采用 GPL-3.0 开源。


最后

这个项目最开始其实就是因为一直没找到一个自己真正喜欢的 macOS 客户端,所以决定自己写。

做第一版的时候觉得:

“功能跑通应该就差不多了。”

真正连续用了一个月以后才发现,大量工作其实发生在功能跑通之后。

状态管理、播放器生命周期、缓存、并发、异常路径、源兼容、窗口行为、UI 一致性……

这些东西很难截图展示,但可能才是一个软件从 Demo 变成日常工具真正需要花时间的地方。

0.4.0 对我来说更像是 OKVideoMac 第一个真正成型的版本。

项目还比较年轻,肯定还有不少问题。

如果有 Apple Silicon Mac ,欢迎试一下。

尤其如果你也在做 SwiftUI 、libmpv 、播放器、TVBox / CatVod / CatPaw 相关的东西,也很欢迎交流实现思路。

Bug 或兼容性问题可以直接提 Issue 。

另外也很好奇 V2EX 上有没有人在做类似的:

“把原本偏 Android / TV 的开放源生态,重新做成原生桌面应用”

这类项目。

感觉这里面其实还有很多挺有意思的问题可以继续折腾。