RiderLty / fontInAss

实时将字体子集化后嵌入ass的小工具,用于在未安装对应字体的系统上正确显示字幕。
28 stars 0 forks source link

佬,麻烦有空的时候看一下 #1

Open entaroartanis114514 opened 3 weeks ago

entaroartanis114514 commented 3 weeks ago

今天更新后docker版后fontinass出现下面的错误,EMBY的WEB界面会出现无法兼容的流 客户端会没有字幕。 2024/09/01 00:04:11 | stderr | 2024/08/31 16:04:11 [error] 16#16: *1 js exception: Error: unhandled promise rejection: ReferenceError: "debug" is not defined 还有一个问题 之前的版本如果是srt字幕的情况我这里使用nginx或者lucky反代8012端口到443通过域名访问都会不显示srt字幕,客户端会直接卡住 web会不显示srt字幕,如果切换成ASS或者PSG就正常。 佬,你看下我这里需要提供什么吗?

entaroartanis114514 commented 2 weeks ago

佬,我更正一下错误信息,。之前发的错误信息少了一段 2024/09/01 12:54:42 | stderr | , client: 172.17.0.1, server: , request: "GET /emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.vtt?api_key=apikey HTTP/1.1", host: "域名", referrer: "https://域名/web/index.html" 2024/09/01 12:54:42 | stderr | at anonymous (/etc/nginx/conf.d/emby.js:4) 2024/09/01 12:54:39 | stderr | 2024/09/01 04:54:39 [error] 11#11: *1208 js exception: Error: unhandled promise rejection: ReferenceError: "debug" is not defined

RiderLty commented 2 weeks ago

DEBUG这个是昨天添加功能,忘记给去掉了,现在更新下容器应该就好了。

SRT如果没有设置SRT_2_ASS_FORMAT与SRT_2_ASS_STYLE应该是直接报错,然后返回原始内容。 如果设置了SRT_2_ASS_FORMAT与SRT_2_ASS_STYLE,会将SRT转为ASS传递给客户端。 目前发现infuse并不能显示实际内容为ASS格式的SRT字幕,现在如果检测到infuse的UA会不转换SRT。 如果你在使用其他客户端并且也无法处理内容为ASS格式的SRT字幕,请告诉我。

entaroartanis114514 commented 2 weeks ago

佬,第一个问题已经解决了。 第二个问题使用docker run可以解决,但如果在群辉的docker上用docker-comepose.yml会出一些问题,SRT_2_ASS_FORMAT='Format: 这里哪怕加了单引号仍然会被群辉的docker识别成是一起的。佬我只是提一下,这个问题不大。 屏幕截图 2024-09-01 194851 目前我用手机端和电脑还有WEB以及TV的EMBY没发现什么问题。 因为我家里都是安卓所以目前来说很完美了,谢谢佬解决问题。

现在发现了个小问题,如果双端同时播放一个srt影片,会导致后一个设备没字幕,只要切换一下字幕就又可以正常显示了。 佬这个也问题不大,只是提醒一下如果有后来的人可以看一下。

RiderLty commented 2 weeks ago

docker-compose我没怎么用过哈,试试双引号行么?或者转义下。🤔 上面那个我也遇到了,初步猜测可能是处理时间较长导致。 现在加上了字体与字幕缓存,可以试试。

entaroartanis114514 commented 2 weeks ago

那个变量也可能是我操作有问题,一直弄不上,改用env或者docker run就可以弄上去了。 佬,后面这个版本我现在看他一直在加载字体不处理字幕。 因为我下的那个50G字体包,字体有点多,感觉今天晚上看不出来效果了,明天我再看看效果。 佬,字体下次重开后还需要重新扫描吗? 屏幕截图 2024-09-01 231310

entaroartanis114514 commented 2 weeks ago

佬,这个扫50G的字体用了差不多一个小时左右。 同一个视频PC客户端会弹出下面的错误并且出不来字幕。 2024/09/02 01:06:06 | stdout | INFO:     ip - "GET /emby/Videos/61101/ebf46282cae9ed895e65ba30d528433e/Subtitles/2/0/Stream.ssa?api_key=key HTTP/1.0" 200 OK 2024/09/02 01:06:06 | stdout | 出错了: 'default'  返回原始内容 2024/09/02 01:06:06 | stdout | 原始大小: 37938 WEB会出现下面的错误然后无兼容的流,手机也会弹出上面PC客户端的错误但又正常播放带有字幕 stdout | 出错了: not enough values to unpack (expected 2, got 1)  返回原始内容 2024/09/02 01:37:34 | stdout | 原始大小: 0 SRT字幕内网手机和TV会命中缓存两次,然后出不来字幕但可以播放。如果通过域名反代fontinass的端口访问SRT字幕视频日志只命中缓存一次但跟之前一样没字幕卡住。而PC和WEB内外网只会命中一次然后可以显示SRT字幕

佬,我看不太懂这些怎么回事了。 上一版除了双端同时播放一个srt影片这个小BUG其它没碰到什么,这版虽然快了但是BUG看不懂

RiderLty commented 2 weeks ago

字幕出错只会不显示字幕,无兼容的流应该是别的什么地方出问题了。

现在这个版本的逻辑是,nginx将客户端请求/videos/(.*)/Subtitles反向代理到字体处理程序。

字体处理程序去请求原始字幕,然后将处理后的字幕返回给nginx。

即使出错了,也应该是返回原始字幕的。

如果你在使用nginx,推荐直接单独添加一条配置,容器只要暴露一个8011,或者直接运行main.py都可以。

location ~* /videos/(.*)/Subtitles {
    #这里填字体处理程序的地址
    proxy_pass http://192.168.3.3:8011;
}

扫字体太慢,可以把/localFontMap.json映射到容器外,避免重复扫描。下面是我的完整命令,你可以参考下。

docker run
  -d
  --name='fontinass'
  -e 'DEV'='true'
  -e 'EMBY_SERVER_URL'='http://192.168.3.3:7096'
  -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'
  -e 'CACHE_SIZE'='1024'
  -p '8011:8011/tcp'
  -p '8097:8012/tcp'
  -v '/mnt/user/storage/Fonts/':'/fonts':'rw'
  -v '/mnt/user/storage/assinfontsDEV':'/DEV':'rw'
  -v '/mnt/user/appdata/fontinass/localFontMap.json':'/localFontMap.json':'rw' 'riderlty/fontinass'
entaroartanis114514 commented 2 weeks ago

佬,不好意思。 我的问题。昨天熬的脑子不清醒 上面第一个问题是视频格式的问题,我这里解码有问题。 扫字体通过映射localFontMap.json解决了。 第二个的话,好像还是SRT字幕的问题,之前的版本SRT字幕有问题外网访问srt视频就会出那些问题,上个版本又正常,这版本又出现了。命中两次那个问题我觉得应该是昨天看错了,不好意思误导了

除了浏览器都和客户端返回的一样,但是TV直接没有字幕,在手机端只有从头开始播放才能显示SRT字幕并且会显示成下面的样子。 上个版本同一视频TV和手机是正常的,所以应该不是资源和设备的问题

这个版本我也开启了srt转ass,直接使用srt还没有尝试

下面是手机端srt视频,tv会直接没字幕但有画面。 Screenshot_20240902_162530 客户端显示正常?字幕位置好像也不太对 屏幕截图 2024-09-02 173649

TV的字幕返回

2024/09/02 17:12:27 | stdout | INFO:     127.0.0.1:41504 - "GET /emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key HTTP/1.0" 200 OK
2024/09/02 17:12:27 | stdout | 处理后大小: 757812
2024/09/02 17:12:27 | stdout | 字幕缓存命中
2024/09/02 17:12:27 | stdout | 原始大小: 138851
2024/09/02 17:12:27 | stdout | 字幕URL: http://192.168.5.3:8094/emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key
手机的字幕
2024/09/02 17:10:03 | stdout | INFO:     ip - "GET /emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key HTTP/1.0" 200 OK
2024/09/02 17:10:03 | stdout | 处理后大小: 757812
2024/09/02 17:10:03 | stdout | 字幕缓存命中
2024/09/02 17:10:03 | stdout | 原始大小: 138851
2024/09/02 17:10:03 | stdout | 字幕URL: http://192.168.5.3:8094/emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key
WEB的字幕返回
2024/09/02 17:09:11 | stdout | INFO:     127.0.0.1:33608 - "GET /emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.vtt?api_key=key HTTP/1.0" 200 OK
2024/09/02 17:09:11 | stdout | 出错了: not enough values to unpack (expected 2, got 1)  返回原始内容
2024/09/02 17:09:11 | stdout | 原始大小: 119908
2024/09/02 17:09:10 | stdout | 字幕URL: http://192.168.5.3:8094/emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.vtt?api_key=key
PC客户端的字幕返回
2024/09/02 17:24:46 | stdout | INFO:     127.0.0.1:49200 - "GET /emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key HTTP/1.0" 200 OK
2024/09/02 17:24:46 | stdout | 处理后大小: 757812
2024/09/02 17:24:46 | stdout | 字幕缓存命中
2024/09/02 17:24:46 | stdout | 原始大小: 138851
2024/09/02 17:24:46 | stdout | 字幕URL: 
http://192.168.5.3:8094/emby/Videos/38658/b0e3530e9e59e286c59657cca8c2c4ec/Subtitles/4/0/Stream.srt?api_key=key
RiderLty commented 2 weeks ago

发下SRT文件和SRT_2_ASS_STYLE,SRT_2_ASS_FORMAT看看?这个错误看起来是SRT转ASS出错了 。 刚才添加了DEBUG功能,设置环境变量DEV=true,会显示处理前后的字幕,可以看下。

entaroartanis114514 commented 2 weeks ago

佬这两个就是我一直在用的SRT字幕。DEBUG我等下看看什么情况 两个字幕.zip

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'
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'

image

entaroartanis114514 commented 2 weeks ago

佬,这四个有点乱,我是用html直接变后缀成log了。佬你换成html就比较清晰一些 四个客户端都是播放了两个影片,手机确实是中了两次缓存, PC客户端.log TV.log 手机.log 网页.log

RiderLty commented 2 weeks ago

银魂完结篇:直到永远的万事屋 (2013) - 1080p.zh-CN.srt 这个里面,格式是错误的,导致解析Event的时候,无法获取到文本,于是在子集化的时候,就没有把对应的字放进去。

SRT字幕的颜色以及一些特效的设置

比如

1
00:00:02,440 --> 00:00:10,820
{\fs30\fad(500500)\an8}本字幕由「白月字幕组」制作 仅限内部学习交流 请于24小时内删除 若您喜欢请支持购买正版

正确的写法应该是

1
00:00:02,440 --> 00:00:10,820
{\fs30\fad(500,500)\an8}本字幕由「白月字幕组」制作 仅限内部学习交流 请于24小时内删除 若您喜欢请支持购买正版

原本的即使是SRT,也是不能实现淡入淡出的。 修改之后就正确显示了。

建议还SRT还是尽量收纯文本的吧。

entaroartanis114514 commented 2 weeks ago

啊...佬主要的不是特效和排版问题,但还 是谢谢佬解决这个问题了。

佬,主要是这个版本srt字幕又出问题了... 手机字幕会出现0,0,Default那串字符。 以及手机端需要从头开始播放才有srt字幕,如果挪动进度条就会没srt字幕。 以及TV的SRT字幕出不来。 那个魔女的srt字幕我根据佬发的文章看了下文本是没有任何特效的,但同样是拖动进度条后出不来字幕以及出现0,0,Default那串。 这些在之前刚刚更新SRT那个版本是没事的,更新后SRT又出问题了。 所以想问下佬怎么回事,能显示srt就可以了。 现在如果不转srt为ass就出不来字幕,如果转的话就会出问题..

RiderLty commented 2 weeks ago

我这实验都是正常的,可能是headers的问题? 现在去掉了headers,然后也改了srt转ass的逻辑了。按理来说应该没问题了。。。

entaroartanis114514 commented 2 weeks ago

佬,还是不行... Defaul前面的数字就是第几个字幕文本,Defaul后是字体格式? pc客户端是没问题的 web没使用子集化的字幕,应该是web的问题 手机就这样了,tv不显示字幕应该也是字幕有问题

第一张图是银魂的那个字幕日志输出 image 第二张图是银魂在手机端转为ASS字幕后 Screenshot_20240903_204347 第三张图是魔女那个纯文本SRT转ASS字幕后 Screenshot_20240903_204440

RiderLty commented 2 weeks ago

6fafa70145c17b25a53715a1421e07ce e78bdce284366a0a05789907cfa024f4 905b63c710f21d6c85e4b5417949aed2 🤔,应该是客户端的问题了。 test.zip

entaroartanis114514 commented 2 weeks ago

离谱.. 佬,我这里服务端是4.8.0.66测试版 TV客户端是小秘的TV 2.0.95g常规版 手机是官方最新版的3.4.21和小秘的3.2.32-17.41都不行... PC客户端是3.0.20-3.0的小秘版本可以正常显示。 佬,能问下你用的版本吗? 以及佬如果能否留个之前刚刚修改srt的那个版本镜像? 我在github上找了下之前的版本的文件替换进容器里不行..

RiderLty commented 2 weeks ago

这个emby.apk,有一说TV版已经没啥必要了吧,手机版设置下显示为TV就可以了。

entaroartanis114514 commented 2 weeks ago

佬,是exo播放器的问题,对ASS字幕支持有问题。 手机端之前因为mpv播放有时候黑屏所以关了...手机端用mx播放器和PC端potplayer都是正常的。 电视端我估计也是exo播放器... 电脑端因为开着mpv播放器所以没事。 绷不住了,弄了这么长时间是因为播放器的问题,答辩exo,气死了 TV版是因为我家电视安装不了emby安卓版,估计跟安卓版本又有关系...今天开始打算换苹果盒子用infuse了

entaroartanis114514 commented 2 weeks ago

佬,问题解决了。 这个问题和反代也没关系,就是单纯答辩exo播放器对字幕支持有问题。 解决办法是要不然换ASS格式出来的时候简单一些,要不然就用外部播放器。 之前版本转的字幕应该简单一些,exo可以显示出来。 后面更改后格式复杂一些,exo就出不来了。 谢谢佬一直回复和处理问题

RiderLty commented 2 weeks ago

build了一个旧版本的 riderlty/fontinass:njsmode

之前是用njs请求,python只负责bytes => ASS => 处理后的ASS => bytes,njs只替换内容。

后面要加点功能,就改成nginx只负责反向代理字幕请求到python,没用njs了。

希望这个你能用吧🥰

entaroartanis114514 commented 2 weeks ago

谢谢佬,但还是不行。 那应该是处理字幕Dialogue语句的那段问题,字幕显示时间和使用字幕特效那段复杂了一些? EXO识别不了所以会出现0,0,Default,,0,0,0,, 然后挪动进度条后不知道时间轴也就不会再显示字幕。 佬,现在版本的这个方法是对的。 其它播放器都可以,就这个exo不可以。 切个播放器就在正常了

我猪逼了,今天又试了下是正常的。 昨天用njs也出现Default,,0,0,0,,这串,今天又重新拉了下然后exo正常显示了。 提醒一下后面的人如果想要使用emby客户端带弹幕就要用njs版。

njs内网可以用exo正常显示,外网就出现Default,,0,0,0,,这串,也可能是我反代的问题