chen3861229 / embyExternalUrl

some emby/jellyfin scripts
MIT License
116 stars 17 forks source link

外网套娃反代之后,无法播放。 #4

Closed hiccup90 closed 5 months ago

hiccup90 commented 6 months ago

我的使用环境可能比较特别。 emby:8096交给本项目。然后又对本项目:8095进行了一次反代。并且外网是ipv6访问的

我在内网环境测试。8095端口能正常播放。 但是外网环境,并不能播放.

使用的是strm文件。格式如下 http://alist:5244/d/xxxxx/xxxxx/xxxxxx.mkv

其中一段日志,不知道能不能体现问题。 2024/03/26 14:54:33 [error] 70#70: 215 upstream prematurely closed connection while reading response header from upstream, client: 10.10.10.21, server: default, request: "GET /emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CMusicVideo%2CVideo&ImageTypes=Backdrop&ParentId=678660&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28 HTTP/1.1", subrequest: "/emby/Users/bf90b02b42d045c58d503032cb523503/Items", upstream: "http://10.10.10.2:8096/emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CMusicVideo%2CVideo&ImageTypes=Backdrop&ParentId=678660&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28&Fields=Path", host: "外网域名" 2024/03/26 14:54:33 [error] 69#69: 213 upstream prematurely closed connection while reading response header from upstream, client: 10.10.10.21, server: default, request: "GET /emby/Users/bf90b02b42d045c58d503032cb523503/Items/678660?X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28 HTTP/1.1", upstream: "http://10.10.10.2:8096/emby/Users/bf90b02b42d045c58d503032cb523503/Items/678660?X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28", host: "外网域名" 2024/03/26 14:54:33 [error] 66#66: 205 upstream prematurely closed connection while reading response header from upstream, client: 10.10.10.21, server: default, request: "GET /emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CMusicVideo%2CVideo&ImageTypes=Backdrop&ParentId=678660&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28 HTTP/1.1", subrequest: "/emby/Users/bf90b02b42d045c58d503032cb523503/Items", upstream: "http://10.10.10.2:8096/emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CMusicVideo%2CVideo&ImageTypes=Backdrop&ParentId=678660&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28&Fields=Path", host: "外网域名" 2024/03/26 14:54:33 [error] 67#67: 208 upstream prematurely closed connection while reading response header from upstream, client: 10.10.10.21, server: default, request: "GET /emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CGame%2CBook&ImageTypes=Backdrop&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28 HTTP/1.1", subrequest: "/emby/Users/bf90b02b42d045c58d503032cb523503/Items", upstream: "http://10.10.10.2:8096/emby/Users/bf90b02b42d045c58d503032cb523503/Items?SortBy=Random&Limit=20&Recursive=true&IncludeItemTypes=Movie%2CSeries%2CGame%2CBook&ImageTypes=Backdrop&EnableTotalRecordCount=false&ImageTypeLimit=1&EnableImageTypes=Backdrop&X-Emby-Client=Emby%20Theater&X-Emby-Device-Name=Hiccup&X-Emby-Device-Id=Hiccup&X-Emby-Client-Version=3.0.20-3.0&X-Emby-Token=2b9e891df6114ff2a70ab0a15a75da28&Fields=Path", host: "外网域名"

10.10.10.21 是我一个反代服务器的ip

配置如下:

// export constant allocation
// 必填项,根据实际情况修改下面的设置
// 这里默认emby/jellyfin的地址是宿主机,要注意iptables给容器放行端口
const embyHost = "http://10.10.10.2:8096";
// rclone 的挂载目录, 例如将od, gd挂载到/mnt目录下: /mnt/onedrive /mnt/gd ,那么这里就填写 /mnt
// 通常配置一个远程挂载根路径就够了,默认非此路径开头文件将转给原始emby处理,不用重复填写至disableRedirectRule
// 如果没有挂载,全部使用strm文件,此项填[""],必须要是数组
const embyMountPath = [""];
// emby/jellyfin api key, 在emby/jellyfin后台设置
const embyApiKey = "66exxxxxxxxxxxxxxxxx";
// 访问宿主机上5244端口的alist地址, 要注意iptables给容器放行端口
const alistAddr = "http://10.10.10.2:5244";
// alist token, 在alist后台查看
const alistToken = "alist-f84e9b5axxxxxxxxxxxxxxxx";

其他都为默认。

chen3861229 commented 6 months ago

链路是这样的吗? 外网是ipv6访问=>nginx反代:8095=>本项目nginx反代:(这个监听端口缺少信息,配置位于emby.conf->server->listen)=>原始emby服务(http://10.10.10.2:8096)

hiccup90 commented 6 months ago

是的。链路是这样的。那么emby.conf该如何修改? 麻烦作者了。因为对这一块并不是很熟悉。

链路是这样的吗? 外网是ipv6访问=>nginx反代:8095=>本项目nginx反代:(这个监听端口缺少信息,配置位于emby.conf->server->listen)=>原始emby服务(http://10.10.10.2:8096)

hiccup90 commented 6 months ago

尝试把

    listen 80;
    server_name 10.10.10.2:8096;

修改成这样。但是还是不行。。

chen3861229 commented 6 months ago

估计是默认的80端口和其他服务冲突了,用一个自定义的吧

外网是ipv6访问 =>外网(这里可选配置https) nginx反代:8095 这里需要开启nginx的ipv6监听,nginx.conf中加一行 listen [::]:8095 检查location中的proxy_pass为内网ip:8097

=>内网(不要配置https) 本项目nginx反代: 8097 内网可以不用加,但是如果还是报错,也需要同时监听ipv6 listen [::]:8097 这个监听端口缺少信息,配置位于emby.conf->server->listen 检查location中的proxy_pass为内网ip:8096,已用njs抽取至constaant.js的embyHost变量,等同值

=>内网(不要配置https) 原始emby服务(http://10.10.10.2:8096/)

hiccup90 commented 6 months ago

其实只有一层V6。就是外网访问Nginx是V6。内网还是都是V4的。 也尝试修改过端口,不知道是我修改的不对,还是其他问题。结果是不行。。

然后我以为是strm的问题。因为用网页看了下。一直是直接请求strm内的地址。所以尝试修改strm的内容为路径。 但是结果还是不尽人意。 我再研究研究吧。。

谢谢作者了

chen3861229 commented 6 months ago

然后我以为是strm的问题。因为用网页看了下。一直是直接请求strm内的地址。所以尝试修改strm的内容为路径。

和这个没关系,单层反代的情况下是都支持的,建议先内网访问最后一层反代测试一下,如果能成功再排查其他层的情况,这样看日志关键信息也方便一点儿

hiccup90 commented 6 months ago

之前测试过。内网访问的情况下。直接用我外网域名访问的方式是成功的。

但是纯外网的情况。就不行了。

现在使用的是http://hicane.com/archives/nas-115-alist-cd2-shi-xian-emby-zhi-lian-bo-fang-jia-su-sao-ku-ban 这篇教程的方案,然后strm是路径的方式。测试成功了。但是我看他的constant.js好像跟你的配置文件也是类似的。

我改下路径的strm测试下。

现在换回您的方案了。用strm的路径模式可以了。 之前用strm的路径不行。估计是我路径没搞对。

但是如果是http://10.10.10.2:5244/d/xxxxx/xxxxx.mkv 就死活不行。 10.10.10.2是内网alist的ip

目前测试下来,没法保存播放进度。只要点击过,就算看完了。

chen3861229 commented 6 months ago

这种不行的。。[http://10.10.10.2:5244/d/xxxxx/xxxxx.mkv] 这是内网ip,302重定向给客户端在外网访问不了,如果你alist有域名且公网畅通,目前可以暂时添加映射兼容

// url映射,会在xxxMountPath之后全部替换一遍,不要有重叠 const embyPathMapping = [ ["http://10.10.10.2:5244", "http://yourdomain:5244"] ];

过几天我可以优化下代码兼容你这种情况 如果链接比较多编辑起来费劲,还是用embyPathMapping做映射吧

hiccup90 commented 6 months ago

这种不行的。。[http://10.10.10.2:5244/d/xxxxx/xxxxx.mkv] 这是内网ip,302重定向给客户端在外网访问不了,如果你alist有域名且公网畅通,目前可以暂时添加映射兼容

啊。果然。我把strm里面文件的路径。换成https://domain:port/d/xxxxx/xxxxx.mkv 就能正常外网播放了。也能正常保留播放记录,不过好像内封字幕又出问题了。如果用http://10.10.10.2:5244的话,虽然不能播放,但是能正确识别内封字幕 搞半天,原来问题出在这里。怪我之前没说清楚。 之前用路径的方式的,字幕跟播放记录都不能正确识别。

chen3861229 commented 6 months ago

好的,多谢反馈,刚对比调试plex的strm支持隐约发现这个问题了

之前用路径的方式的,字幕跟播放记录都不能正确识别。

hiccup90 commented 6 months ago

好的,多谢反馈,刚对比调试plex的strm支持隐约发现这个问题了

辛苦辛苦。如果路径的方式,能正确支持字幕和播放记录的话。路径的strm是比较理想的方案了 我用另一个插件能很方便的生成所有的strm

目前为止。对于我来说 const embyPathMapping = [ ["http://10.10.10.2:5244", "http://yourdomain:5244"] ]; 这是最完美的方案,字幕正常,播放进度也正常。

hiccup90 commented 6 months ago

// url映射,会在xxxMountPath之后全部替换一遍,不要有重叠 // strm文件提醒,填写规则参考emby官方文档,强烈建议strm文件内部只填路径,重定向后的远程链接将被部分浏览器跨域限制 const embyPathMapping = [ ["http://10.10.10.2:5244", "http://yourdomain:5244"] ];

之前的版本,用这个映射可以使用。 但是最新版本,如果也这么映射的话。 会丢失前面的域名部分。只留下/d/xxxx/xxxxx.mp4 啊,我也不知道这算不算bug。也有可能我设置问题。

chen3861229 commented 6 months ago

1.路径映射可选参数做了增强,限定下媒体来源,之前映射范围太大了,估计是被错误截取掉了 2.strm测试下来还是按emby官方文档的远程链接方式比较好,emby第一次播放后会补充字幕流和媒体信息 3.对于局域网["http://10.10.10.2:5244"]的这种strm也做了兼容,目前可以去掉embyPathMapping的映射了