灵感来源自一个开源视频播放器:DashPlayer
它的核心功能就是在你看视频时,能够快速的查询单词和句子解释:
- hover 到字幕单词时,自动暂停,查询单词的含义
- 接入 openai 后可以整句解释
还有一些其他的功能,我个人用不上。喜欢的小伙伴可以去看看。整体还是不错的。
但我在其中遇到了一些问题:
- 它只能在 PC 端使用,有时候我喜欢在 ipad 上刷视频。
- 它只支持 mp4 格式,其他格式需要自己转换
因此第一阶段,我开发了一个 web 程序,顺便学习 golang:
只有最基本的功能,但对我个人够用:
- 播放视频时自动加载同名的 srt 字幕文件;
- 当鼠标 hover 到字幕上单词时,自动调用有道词典接口的翻译;
- 当鼠标 hover 离开字幕时,继续播放
然后通过 docker 将它部署到 NAS 上。这样我就可以在 ipad 以及 PC 上使用该功能了。
但在使用的过程中感觉,如果是从 youtube 上下载的视频,由于视频体积不大,使用感觉还不错。
但一些高清的影视剧,即使在内网环境,使用 WEB 程序播放视频,还是卡。奈何水平有限难以优化。
因此进行了第二阶段尝试, 尝试用懒猫大大的 EAF 播放 NAS 视频,十分流畅。因此周末 fock 了一波 eaf-video-player 一番魔改,大体实现了我的需求:
- 播放视频时自动加载同名的 srt 字幕文件;
- 当鼠标 hover 到字幕上单词时,自动调用 Emacs 的翻译;
- 当鼠标 hover 离开字幕时,继续播放
- 在字幕处单击右键,调用 gptel 解释整句
- 跳转到上一个、下一个字幕处
由于这只是一个测试版,代码里一堆 hard code. 但通过这个魔改,展示出 EAF 视频领域的各种可能。唯一的遗憾是,EAF 在 MacOS 上使用并不是完美,我遇到一些问题:
- 单机鼠标左键,触发的事件,会导致 eaf 失焦。也不知道是我的问题,还是 MAC 问题,我索性把 try_hide_top_view 直接注释了,不自动隐藏 eaf 的视图。
- 把 try_hide_top_view 注释后还会有点问题。运行键盘快捷键之后,需要单击屏幕才能触发 hover 事件。
如果使用 EAF 的小伙伴可以试试:
使用前提:
- 和视频文件同一个目录下放置一个 srt 文件,例如 a.mkv 放置一个 a.srt
- 如果需要词典和句子解释功能,需要重写 eaf-video-player-lookup eaf-video-player-explain-sentence 给 eaf 发送你自己的翻译结果。
(defun eaf-video-player-lookup (text x y)
(eaf-call-async "execute_function_with_args" eaf--buffer-id "message_box_update" text x y))
(defun eaf-video-player-explain-sentence (text x y)
(eaf-call-async "execute_function_with_args" eaf--buffer-id "message_box_update" text x y))