
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
实时将字体子集化后嵌入ass的小工具,用于在未安装对应字体的系统上正确显示字幕
无需修改Emby/Jellyfin服务器与客户端,实现使用播放外挂ass/srt字幕时,在没有安装字体的设备上正确显示字幕。
MISS_LOGS 或者MISS_GLYPH_LOGS
-v /path/to/your/logs:/logs \
[!NOTE] 联网下载的字体存储在/fonts/download
即使无本地字体,也建议映射/fonts到主机路径,避免重复下载字体
在客户端上使用http://[ip]:8012访问容器代理后的服务器
使用riderlty/fontinass:noproxytag,不整合nginx,避免在使用302直链时套壳nginx
有需求的用户可参考手动部署,映射8011端口并配置字幕接口的nginx反向代理location ~* /videos/(.*)/Subtitles
下载模版
shcurl -o /boot/config/plugins/dockerMan/templates-user/my-fontinass.xml https://raw.githubusercontent.com/RiderLty/fontInAss/refs/heads/main/my-fontinass.xml
Docker > 添加容器 > 选择一个模版 > fontinass
修改环境变量并移除你不需要的配置项
应用
python src/py2cy/setup.py
EMBY_SERVER_URL = "http://192.168.3.3:7096"
pip install -r ./requirements.txt python src/main.py
或者使用uv(推荐)
uv sync uv run src/main.py
server { listen 8012; #新的Emby访问端口 gzip on; gzip_http_version 1.0; gzip_comp_level 1; gzip_types text/x-ssa; location ~ /(socket|embywebsocket) { proxy_pass $EMBY_SERVER_URL; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host; } location ~* /videos/(.*)/Subtitles/(.*)/Stream.vtt { #适配emby网页播放SRT字幕,302直链时避免冲突 proxy_pass $EMBY_SERVER_URL; } location ~* /videos/(.*)/Subtitles/(.*)/(Stream.ass|Stream.srt|Stream) { #仅匹配ass与srt字幕文件,Stream适配infuse #修改为你的fontinass服务器地址 proxy_pass http://127.0.0.1:8011; } location ~* /web/bower_components/(.*)/subtitles-octopus.js { #修改为你的fontinass服务器地址 #如不需要修改web端渲染,可删除此location proxy_pass http://127.0.0.1:8011; } location ~* /web/modules/htmlvideoplayer/plugin.js { #修改为你的fontinass服务器地址 #仅当需要web渲染,且通过https访问时,才需启用此location,否则可删除 #见 https://github.com/RiderLty/fontInAss/issues/43 proxy_pass http://127.0.0.1:8011; } location / { #修改为你的Emby/Jellyfin服务器地址 proxy_pass $EMBY_SERVER_URL; } }
内嵌字体的ASS并非所有播放器都支持,以下为部分播放器(客户端)的支持情况
| 名称 | 平台 | 支持ass内嵌字体 |
|---|---|---|
| emby web端 | windows/android/linux | ✅ 需要设置EMBY_WEB_EMBED_FONT环境变量为True |
| jellyfin web端 | windows/android/linux | ✅ jellyfin最新版本已支持 |
| potplayer | windows | ✅ |
| mpv | windows/android | ✅ |
| potplayer | windows | ✅ |
| Emby for windows | windows | ✅ |
| tsukimi | windows/linux | ✅ |
| MX Player | android | ✅ |
| Exo Player | android | ❌ |
| Emby 小秘版 | android | ✅ (设置中启用使用mpv播放器后支持) |
| hills | android | ✅ |
| yamby | android | ✅ (设置中启用使用mpv播放器后支持) |
| Emby for Android | android | ❌ |
| Emby for Android TV | android | ❌ |
| infuse | ios | ✅ |
| SenPlayer | ios | ✅ |
| vidhub | ios | ✅ |
| Emby for ios | ios | ✅ |
欢迎补充
容器内部端口8011为字体与js处理服务
8012为nginx反向代理端口,使用此端口访问代理后的服务器
如有其他需求,可暴露8011端口用于字幕处理与HDR设置等
| 配置项 | 描述 | 默认值 |
|---|---|---|
| EMBY_WEB_EMBED_FONT | 修改Emby的字幕渲染文件让Web端也可以正确渲染内嵌字体的字幕 (Jellyfin最新版用户请设置为False,详细说明看下面) | True |
| RENAMED_FONT_RESTORE | 还原字幕中被重命名字体的名称 | True |
| SRT_2_ASS_FORMAT | 可实现SRT转ASS,统一在不同设备上的播放效果 (Jellyfin无法使用,详细设置看下面) | None |
| SRT_2_ASS_STYLE | 可实现SRT转ASS,统一在不同设备上的播放效果 (Jellyfin无法使用,详细设置看下面) | None |
| SUB_CACHE_SIZE | 字幕缓存上限,单位(条) | 50 |
| SUB_CACHE_TTL | 字幕缓存在内存的过期时间,单位(分钟), SUB_CACHE_TTL <= 0 禁用过期 | 60 |
| FONT_CACHE_SIZE | 字体缓存上限,单位(条) | 30 |
| FONT_CACHE_TTL | 字体缓存在内存的过期时间,单位(分钟), FONT_CACHE_TTL <= 0 禁用过期 | 30 |
| NGINX_GZIP_COMP_LEVEL | nginx的gzip压缩等级,可用值1~9,设置为其他值则禁用gzip(noproxy无作用) | 1 |
| LOG_LEVEL | 日志等级,可设置为 DEBUG、INFO、WARNING、ERROR、CRITICAL | INFO |
| ERROR_DISPLAY | 错误信息显示,默认关闭,单位(秒)范围大于0小于60,开启后会在字幕开头插入错误信息用来告知字体缺失或者其他错误信息。 | 0 |
| ERROR_DISPLAY_IGNORE_GLYPH | 错误信息显示开启时,忽略字形缺失,默认关闭,设置值为True后仅当字体缺失时会提示错误 | False |
| MISS_LOGS | 字体缺失文件记录开关,设置为True会把字体缺失记录到MISS_LOGS_NAME | False |
| MISS_GLYPH_LOGS | 缺少字形文件记录开关,设置为True会把缺少字形记录到MISS_LOGS_NAME | False |
| MISS_LOGS_NAME | 缺失字体/字形日记文件名,任意中英文/组合(特殊符号除外) | miss_logs |
| MISS_LOGS_SIZE | 缺失字体/字形日记最大记录数(行数),单位(行) | 20 |
| MISS_LOGS_ORDER | 缺失字体/字形日记新增顺序,设置为True时新增日记会记录到最后面,反之最前面 | False |
[!NOTE] 当 EMBY_WEB_EMBED_FONT 设置为 True 时,Nginx 的反向代理会将 Emby 的字幕渲染文件 subtitles-octopus.js 转发给程序处理。程序将在该 JS 文件中新增两个方法:
1.解析字幕文件获取字体信息
2.对获取的字体信息的 UUEncode 进行解码,并转为字体文件供字幕渲染文件使用
需要注意的是,修改原始 JS 文件可能会引发安全性或稳定性问题,请根据实际情况自行斟酌是否启用。
目前已在 Emby 4.7.14 至 4.9.0.37 版本中测试通过。如果未来 Emby 更新支持内嵌字体功能,可以关闭此项功能。但鉴于 Emby 升级可能存在一定难度,且新版通常不向下兼容,因此该功能可能会长期保留。
Emby 4.9.0.48b 版本更新加入字幕内嵌字体的支持,经测试开启EMBY_WEB_EMBED_FONT不影响,大于该版本可选择关闭这个。
添加环境变量SRT_2_ASS_FORMAT与SRT_2_ASS_STYLE,可实现SRT转ASS,统一在不同设备上的播放效果(Jellyfin无法使用)
-e SRT_2_ASS_FORMAT='Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding' -e SRT_2_ASS_STYLE='Style: Default,楷体,20,&H03FFFFFF,&H00FFFFFF,&H00000000,&H02000000,-1,0,0,0,100,100,0,0,1,2,0,2,10,10,10,1'
通过http://[ip]:8011/color/set可调整字幕整体颜色亮度与饱和度,避免HDR显示时过亮(需开放8011端口)
可使用fnos的NAS访问地址作为EMBY_SERVER_URL,例如http://192.168.3.215:5666
目前测试结果为仅支持WEB端
对字体文件进行处理,仅保留字幕文件用到了的字体,从而缩小字体体积
使用UUEncode对子集化后的字体二进制文件进行编码,在ass内添加[Fonts]标签,将编码后字体嵌入字幕(不保证兼容性,部分播放器可能不支持)
拦截/videos/(.*)/Subtitles请求,将内容发送到程序处理后,替换原本的内容返回给客户端
自带的 https://github.com/RiderLty/fontInAss/blob/main/onlineFonts.json 文件来自超级字体整合包 XZ
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务