|
|
本帖最后由 Ann 于 2026-3-25 16:51 编辑
开源仓库:https://github.com/naganohara-yoshino/flash-font 感谢星星(bgm24)
看下载的动画,字幕组的字幕往往需要额外字体。一般可以通过字体包和加载器共同加载字体,但是手动加载未免繁琐,而且加载器加载的比较慢。于是做了一个新的字体库字体加载的CLI工具,配合lua mpv插件,可以将上述过程全部自动化,只要有正确的字幕就能点开即看。
CLI工具特性:
◾递归扫描字体库,为 60GB / 18,000+ 的字体整合包建立数据库仅需10秒左右,有数据库的情况下查询与匹配是秒级的;
◾自动检测字体库变化(新增 / 删除),不需要手动更新数据库;
◾精确匹配 ASS 字幕,提取所有实际使用字体(包括样式变体),即时字体注入。
使用方法:
0. 准备字体文件夹
推荐下载字幕论坛的字体包,省去了每次看动画都要额外下载字幕字体的麻烦;若不下载字体包,也可以自己手动把字体拖进一个特定的文件夹里面,当作加载的来源。字体包种子下载链接。
1. 安装CLI 工具
如果有rust工具链,推荐使用cargo安装- cargo install flash-font-ass --locked
复制代码
没有rust工具链可以去GitHub下载预编译版本,地址在此。一般的用户请下载 msvc-x86_64 版本,少部分的win arm用户下载arm64的。解压后exe放置在任何文件夹都可以。
对于下载预编译版本的,如果知道什么是path环境变量,非常推荐添加,能省去很多麻烦。
目前只支持Windows。
2. 初始化CLI工具
按 Win+R 呼出运行窗口,输入按运行,即能弹出终端。
如果用cargo安装的或者手动添加了path环境变量的,直接输入
如果是手动下载的,到你放置exe的文件夹,选中flash-font-ass.exe, 按Ctrl+Shift+C复制路径,回到终端,输入&空格,然后点击鼠标右键即可粘贴刚才的路径,最后输入空格init,整体应该形如
输完命令,回车。弹出一个问题,要你填入第0步的字体文件夹的路径。同样的,来到字体文件夹所在的文件夹,选中字体文件夹,按Ctrl+Shift+C,然后来到终端,右键点击就把路径贴在了终端里。再回车就完成了初始化。
3. 配置MPV插件
有了cli工具,就可以利用mpv的lua脚本自动的调用它,为我们自动加载字幕。
首先,到mpv.exe所在的文件夹。如果用的是mpv lazy等整合包,应该可以看到一个名为的文件夹,里面会有一个文件夹,进入到这个文件夹。(如果没有,就手动创建并进入。)
如果用cargo安装的或者手动添加了path环境变量的,直接进入GitHub Gist Raw界面,按Ctrl+S下载,会得到文件把它拖进刚才的scripts文件夹就全部完成了。
如果是手动下载的,进入GitHub Gist,然后在刚才的script文件夹,用记事本新建一个txt文件,复制全部1-78行内容,并粘贴进去。注意第网页中显示的30行,内容为- args = { "flash-font-ass", "load", "--subtitle", sub_path },
复制代码 把txt文件这里的"flash-font-ass"改成你自己的路径,比如- args = { "D:/文件夹/flash-font-ass.exe", "load", "--subtitle", sub_path },
复制代码 保存后重命名为即可(注意,后缀也要改,.txt后缀变成了.lua)。
完成以上配置后,对于媒体文件有对应外挂ass字幕的(MPV能直接相应加载的),现在就不需要再手动加载字幕字体了。
如果熟悉MPV的也可以自己修改lua脚本。以下附load_ass_fonts.lua的全部内容:
- -- mpv Auto ASS Font Loader
- -- Requires: flash-font-ass (must be in PATH)
- -- Place this script in: mpv_folder/portable_config/scripts/ (or ~/.config/mpv/scripts/ , ..)
- local msg = require 'mp.msg'
- -- Table to track already processed subtitle files (prevents duplicate loading)
- local processed_subs = {}
- -- ===================================================================
- -- Core function: Load fonts for a given external ASS subtitle file
- -- ===================================================================
- local function load_fonts_for_subtitle(sub_path)
- -- 1. Basic validation
- if not sub_path or not sub_path:lower():match("%.ass$") then
- return
- end
- -- 2. Skip if this subtitle has already been processed
- if processed_subs[sub_path] then
- return
- end
- msg.info("Detected external ASS subtitle, loading fonts: " .. sub_path)
- -- 3. Call flash-font-ass synchronously (blocks until finished)
- -- This ensures fonts are available before playback starts
- local result = mp.command_native({
- name = "subprocess",
- args = { "flash-font-ass", "load", "--subtitle", sub_path },
- playback_only = false,
- capture_stdout = true,
- capture_stderr = true,
- })
- -- 4. Handle result
- if result.status == 0 then
- msg.info("flash-font-ass executed successfully for: " .. sub_path)
- processed_subs[sub_path] = true -- Mark as processed
- else
- msg.error("flash-font-ass failed with exit code: " .. tostring(result.status))
- if result.stderr and result.stderr ~= "" then
- msg.error("Error output: " .. result.stderr)
- end
- end
- end
- -- ===================================================================
- -- Scenario A: Automatic font loading when a file is opened
- -- ===================================================================
- -- on_preloaded hook runs after mpv has parsed the file list but before playback starts.
- -- This allows us to load fonts early and avoid font missing issues at the beginning.
- mp.add_hook("on_preloaded", 50, function()
- local tracks = mp.get_property_native("track-list")
- if not tracks then return end
- for _, track in ipairs(tracks) do
- -- Only process external subtitle tracks (internal embedded subs don't have external-filename)
- if track.type == "sub" and track["external-filename"] then
- load_fonts_for_subtitle(track["external-filename"])
- end
- end
- end)
- -- ===================================================================
- -- Scenario B: Font loading when user adds/switches subtitle during playback
- -- ===================================================================
- -- Observes the external filename of the currently active subtitle track
- mp.observe_property("current-tracks/sub/external-filename", "string", function(name, sub_path)
- if sub_path then
- load_fonts_for_subtitle(sub_path)
- end
- end)
- -- Optional: Clear processed list when a new file is loaded (prevents memory growth over long sessions)
- mp.register_event("file-loaded", function()
- processed_subs = {}
- end)
复制代码
|
|