bpking1 / hugo

my blog site
https://blog.738888.xyz
0 stars 0 forks source link

emby挂载阿里盘转直链 #1

Open bpking1 opened 1 year ago

bpking1 commented 1 year ago

https://blog.738888.xyz/posts/emby_jellyfin_to_alist_directlink/?code=0405695c3b05dfe49b5d

oneisall8955 commented 1 year ago

你好,按照你的操作,网页及第三方播放器已经成功播放直链,谢谢分享。有如下疑问:

请问 embyExternalUrl项目的 embyAddExternalUrl 这个文件夹有什么作用?

看代码是在 http://emby.host/emby/Users/xxx/Items/8512 这个接口的response body返回的json数组添加上 ExternalUrls字段,该字段包含各个第三方播放器名及对应的base64格式的直链地址,这个地址,应该有其他程序通过http://emby.host/redirect2external 接口解码出正确的地址对吧?

这个文件夹的docker-compose.yml只有暴露出 nginx的8097端口,应该有emby2Alist的8095 nginx类似作用,但我找不到使用的地方

是不是使用这个特性,在emby的index.html插入相关js添加对应第三方播放器按钮?这样就不需要再安装油猴插件了。希望解答,或许你有其他项目在使用这个了

再有,宿主主机已经安装了nginx的情况下,如何配置反向代理到emby2Alist的8095端口nginx呢?

bpking1 commented 1 year ago

这个文件夹的作用是给emby所有官方客户端添加外部播放器链接,使用方式可以参考reademe

问题2 可以参考这个conf文件: https://gist.github.com/bpking1/604cfb243c9af41a43e0ca5f822f193b

或者不用docker,直接用宿主机的nginx运行脚本来获取直链也可以

nandu-cbird commented 1 year ago

大佬 [error] 20#20: *79 js: error500: alist_path_api 401 Guest user is disabled, login please 是什么原因呢

bpking1 commented 1 year ago

注意js文件里面填写的是alist的文件夹密码,如果不行的话可以再试试给alist添加一个guest账户,具体逻辑可能要自己去看这部分alist源码

nandu-cbird commented 1 year ago

谢谢已经解决了,alist文件夹密码改成了alist token,我一开始一直理解的是加密文件夹的密码

------------------ 原始邮件 ------------------ 发件人: "bpking1/hugo" @.>; 发送时间: 2023年2月6日(星期一) 晚上10:35 @.>; @.**@.>; 主题: Re: [bpking1/hugo] emby挂载阿里盘转直链 (Issue #1)

注意js文件里面填写的是alist的文件夹密码,如果不行的话可以再试试给alist添加一个guest账户,具体逻辑可能要自己去看这部分alist源码

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

oneisall8955 commented 1 year ago

这个文件夹的作用是给emby所有官方客户端添加外部播放器链接,使用方式可以参考reademe

问题2 可以参考这个conf文件: https://gist.github.com/bpking1/604cfb243c9af41a43e0ca5f822f193b

或者不用docker,直接用宿主机的nginx运行脚本来获取直链也可以

谢谢解答,我明白了,这个ExternalUrls字段已经是emby原有字段并且会处理。 即显示tmdb等外部链接,这相当于把油猴脚本换一种形式嵌入。非常佩服博主的脑洞,非常巧妙,哈哈哈 但是这种形式相对隐蔽了点。

oneisall8955 commented 1 year ago

大佬 [error] 20#20: *79 js: error500: alist_path_api 401 Guest user is disabled, login please 是什么原因呢

调用 alist 接口,我有不同的见解,我用的不是文件夹密码而是alist令牌模式,需要修改emby.js部分代码。(变更用// !!! WARN注释)

bpking1 commented 1 year ago

感谢分享,我才发现alist v3可以方便普通用户后台设置token,是应该改成token方式要更好。

shyshyshyyyy commented 1 year ago

小白不会用,能否远程协助,可以付费

user4396 commented 1 year ago

请问最后直链下载走的是哪个的token?是alist里的还是aliyunwebdav8080端口那个?或者说,alist和aliyunwebdav各自究竟是在做什么工作,能否进一步说明下,谢谢您的回复!

bpking1 commented 1 year ago

请问最后直链下载走的是哪个的token?是alist里的还是aliyunwebdav8080端口那个?或者说,alist和aliyunwebdav各自究竟是在做什么工作,能否进一步说明下,谢谢您的回复!

aliyunwebdav仅仅是提供webdav服务给rclone挂载使用,不安装这个而使用alist的webdav应该也是可以的。下载走的是alist

lixuemin13 commented 1 year ago

你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?

Daziax commented 1 year ago

我已经直接在机器上安装过Emby和alist了,用这个是不是会在docker里再装一遍

xning00nn commented 1 year ago

照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧

oneisall8955 commented 1 year ago

我已经直接在机器上安装过Emby和alist了,用这个是不是会在docker里再装一遍

博主给的思路是,nginx的njs模块调alist获取直链302

基于你的情况,建议用dokcer版本的nginx,因为已经包含了njs模块不用自己编译。

oneisall8955 commented 1 year ago

你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?

你在alist的网页播放视频看是否正常?(按照http和浏览器的规范,都会检查CORS)

oneisall8955 commented 1 year ago

照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧 是否走直链,日志,浏览器F12调试看响应和链接,均可以看出来。

先确保emby没有转码

确保emby在浏览器调用 /videos/123/stream 这种url获取视频流。两个地方都要设置关闭转码。

日志检查

过滤出js关键字,因为njs模块的日志会添加js为开头。 image

如果不放心这个关键字,那你可以在emby.js文件的redirect2Pan 方法 入口处添加自己的日志,如 r.warn(redirect2Pan_start...);然后再搜索自己的关键字 redirect2Pan_start

浏览器检查F12调试

理解博主提供的思路,灵活结合就行了,如果博主要改博文,不如改下njs模块调alist获取直链那块的接口

xning00nn commented 1 year ago

@oneisall8955

照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧 是否走直链,日志,浏览器F12调试看响应和链接,均可以看出来。

先确保emby没有转码

确保emby在浏览器调用 /videos/123/stream 这种url获取视频流。两个地方都要设置关闭转码。

    1. 转码-启用硬件加速-否 image
    1. 修改账号的设置,禁用相关转码,我的配置如图 image

日志检查

过滤出js关键字,因为njs模块的日志会添加js为开头。 image

如果不放心这个关键字,那你可以在emby.js文件的redirect2Pan 方法 入口处添加自己的日志,如 r.warn(redirect2Pan_start...);然后再搜索自己的关键字 redirect2Pan_start

浏览器检查F12调试

  • 检查 /emby/Items/123/PlaybackInfo 接口返回是否是支持stream及播放地址 image

  • 检查是否调用 /emby/videos/123/stream.mkv 这个接口,并且 Status Code:是302

    该接口的 Response Header location是直链地址 image

理解博主提供的思路,灵活结合就行了,如果博主要改博文,不如改下njs模块调alist获取直链那块的接口

大神厉害,还想着1天就能部署成功呢,看来还得补补功课,要好好研究一下

lixuemin13 commented 1 year ago

@oneisall8955

你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?

你在alist的网页播放视频看是否正常?(按照http和浏览器的规范,都会检查CORS)

感谢回复,alist和天翼云盘web页面都是正常播放,请求头显示Sec-Fetch-Mode: no-cors,而emby请求头显示Sec-Fetch-Mode: cors,这会导致跨域问题,天翼云部分资源域名是有添加cors没问题,其他会报错,经我排查是emby播放器crossorigin="anonymous"的标签导致的,我已经从js上删除这个标签,现在已经没问题了,可能阿里云盘的资源都添加了cors的响应头,所以你们没这个问题

xning00nn commented 1 year ago

emby-nginx | 2023/03/11 05:25:09 [error] 22#22: *19 js exception: Error: unhandled promise rejection: ReferenceError: "alistPwd" is not defined, client: 112.xx.xx.217, server: default, request: "GET /emby/videos/7/stream.mp4?DeviceId=97608e01-8f97-4541-9679-349a7bb8f7ca&MediaSourceId=0e14dc7e49abd8cc234540c7564c3324&Static=true&PlaySessionId=7dd67df2b00b4bc086b9d4882e7cf88a&api_key=60ae9ae75d474c04a2e332a5ded82918 HTTP/1.1", host: "150.230.38.226:8095"

大佬,"alistPwd" is not defined 这个在哪里定义? emby.js只有以下定义 //根据实际情况修改下面4个设置 const embyHost = 'http://172.17.0.1:8096'; // const embyMountPath = '/root/emby_alist/aliyun';
const alistToken = 'alist-5dxxxxxxxxxxxxxxx //alist token, 在alist后台查看 const alistAddr= 'http://172.17.0.1:5244'; const embyApiKey = '307dc19450xxxx323b77b1e734b';
const alistPublicAddr =xxxxxx

bpking1 commented 1 year ago

emby-nginx | 2023/03/11 05:25:09 [error] 22#22: *19 js exception: Error: unhandled promise rejection: ReferenceError: "alistPwd" is not defined, client: 112.xx.xx.217, server: default, request: "GET /emby/videos/7/stream.mp4?DeviceId=97608e01-8f97-4541-9679-349a7bb8f7ca&MediaSourceId=0e14dc7e49abd8cc234540c7564c3324&Static=true&PlaySessionId=7dd67df2b00b4bc086b9d4882e7cf88a&api_key=60ae9ae75d474c04a2e332a5ded82918 HTTP/1.1", host: "150.230.38.226:8095"

大佬,"alistPwd" is not defined 这个在哪里定义? emby.js只有以下定义 //根据实际情况修改下面4个设置 const embyHost = 'http://172.17.0.1:8096'; // const embyMountPath = '/root/emby_alist/aliyun'; const alistToken = 'alist-5dxxxxxxxxxxxxxxx //alist token, 在alist后台查看 const alistAddr= 'http://172.17.0.1:5244'; const embyApiKey = '307dc19450xxxx323b77b1e734b'; const alistPublicAddr =xxxxxx

你好,你这个可能是之前的js文件混在里面了,请整个重新下载

xning00nn commented 1 year ago

@bpking1

emby-nginx | 2023/03/11 05:25:09 [error] 22#22: *19 js exception: Error: unhandled promise rejection: ReferenceError: "alistPwd" is not defined, client: 112.xx.xx.217, server: default, request: "GET /emby/videos/7/stream.mp4?DeviceId=97608e01-8f97-4541-9679-349a7bb8f7ca&MediaSourceId=0e14dc7e49abd8cc234540c7564c3324&Static=true&PlaySessionId=7dd67df2b00b4bc086b9d4882e7cf88a&api_key=60ae9ae75d474c04a2e332a5ded82918 HTTP/1.1", host: "150.230.38.226:8095"

大佬,"alistPwd" is not defined 这个在哪里定义? emby.js只有以下定义 //根据实际情况修改下面4个设置 const embyHost = 'http://172.17.0.1:8096'; // const embyMountPath = '/root/emby_alist/aliyun'; const alistToken = 'alist-5dxxxxxxxxxxxxxxx //alist token, 在alist后台查看 const alistAddr= 'http://172.17.0.1:5244'; const embyApiKey = '307dc19450xxxx323b77b1e734b'; const alistPublicAddr =xxxxxx

你好,你这个可能是之前的js文件混在里面了,请整个重新下载

大佬, 还有个报错,

2023/03/11 09:30:07 [warn] 21#21: 49 js: mount emby file path: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [warn] 21#21: 49 js: try to fetch alist path from /aliyun/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [error] 21#21: *49 js: error500: alist_path_api 500 failed get storage: can't find storage with rawPath: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4

embyMountPath = '/mnt/aliyun' #配置的是这个路径 rclone mount aliyun: /mnt/aliyun #rclone 挂载的是这个路径 AList里面挂载的是/aliyun这个路径 emby映射的是/mnt/aliyun:/data/movies 这个路径

是配的有问题还是函数调用有问题?

oneisall8955 commented 1 year ago

@bpking1

emby-nginx | 2023/03/11 05:25:09 [error] 22#22: *19 js exception: Error: unhandled promise rejection: ReferenceError: "alistPwd" is not defined, client: 112.xx.xx.217, server: default, request: "GET /emby/videos/7/stream.mp4?DeviceId=97608e01-8f97-4541-9679-349a7bb8f7ca&MediaSourceId=0e14dc7e49abd8cc234540c7564c3324&Static=true&PlaySessionId=7dd67df2b00b4bc086b9d4882e7cf88a&api_key=60ae9ae75d474c04a2e332a5ded82918 HTTP/1.1", host: "150.230.38.226:8095" 大佬,"alistPwd" is not defined 这个在哪里定义? emby.js只有以下定义 //根据实际情况修改下面4个设置 const embyHost = 'http://172.17.0.1:8096'; // const embyMountPath = '/root/emby_alist/aliyun'; const alistToken = 'alist-5dxxxxxxxxxxxxxxx //alist token, 在alist后台查看 const alistAddr= 'http://172.17.0.1:5244'; const embyApiKey = '307dc19450xxxx323b77b1e734b'; const alistPublicAddr =xxxxxx

你好,你这个可能是之前的js文件混在里面了,请整个重新下载

大佬, 还有个报错,

2023/03/11 09:30:07 [warn] 21#21: 49 js: mount emby file path: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [warn] 21#21: 49 js: try to fetch alist path from /aliyun/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [error] 21#21: *49 js: error500: alist_path_api 500 failed get storage: can't find storage with rawPath: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4

embyMountPath = '/mnt/aliyun' #配置的是这个路径 rclone mount aliyun: /mnt/aliyun #rclone 挂载的是这个路径 AList里面挂载的是/aliyun这个路径 emby映射的是/mnt/aliyun:/data/movies 这个路径

是配的有问题还是函数调用有问题?

不知道你解决了没有,看报错信息应该是参数embyMountPath配置问题,修改为 /data/movies 即可。

扩展下为什么这样配置:

emby.js有一段拼接出正确的alistFilePath参数,用于请求alist的/api/fs/get 接口,获取直链链接。

思路排查如下:

* media
  ** tv
  *** 狂飙
  **** 狂飙S01E01.mkv
  **** 狂飙S01E02.mkv
  **** ......
  ** movie
* software
  ** mysql
  ** ......
* image
  ** xxx.jpg
  ** ......
oneisall8955 commented 1 year ago

@oneisall8955

你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?

你在alist的网页播放视频看是否正常?(按照http和浏览器的规范,都会检查CORS)

感谢回复,alist和天翼云盘web页面都是正常播放,请求头显示Sec-Fetch-Mode: no-cors,而emby请求头显示Sec-Fetch-Mode: cors,这会导致跨域问题,天翼云部分资源域名是有添加cors没问题,其他会报错,经我排查是emby播放器crossorigin="anonymous"的标签导致的,我已经从js上删除这个标签,现在已经没问题了,可能阿里云盘的资源都添加了cors的响应头,所以你们没这个问题

谢谢为网友提供解决方案,👍

Daziax commented 1 year ago

@oneisall8955

我已经直接在机器上安装过Emby和alist了,用这个是不是会在docker里再装一遍

博主给的思路是,nginx的njs模块调alist获取直链302

基于你的情况,建议用dokcer版本的nginx,因为已经包含了njs模块不用自己编译。

  • 复制 emby2Alist/nginx/conf.d/ 目录 emby.conf 和 emby.js 到你主机docker的 nginx 的 conf 目录
  • 修改 emby.conf ,主要是emby的ip和端口,docker container 版的 nginx 容器访问宿主机,可以用 172.17.0.1 这个docker虚拟网卡ip来访问
  • 修改 emby.js ,修改 emby,alist(ip同理),rclone的相关配置

大佬,成了。我现在在用nastool的软连接来分类网盘里的视频,不知道怎么和emby2alist结合使用

oneisall8955 commented 1 year ago

大佬,成了。我现在在用nastool的软连接来分类网盘里的视频,不知道怎么和emby2alist结合使用

@Daziax

没用nastool,印象它提供软链接硬链,从而刮削,重命名不破坏源文件(种子)。

我不清楚你的需求,你是哪种场景呢?该项目与emby是比较强关联的

Daziax commented 1 year ago

大佬,成了。我现在在用nastool的软连接来分类网盘里的视频,不知道怎么和emby2alist结合使用

@Daziax

没用nastool,印象它提供软链接硬链,从而刮削,重命名不破坏源文件(种子)。

我不清楚你的需求,你是哪种场景呢?该项目与emby是比较强关联的

  • 如果你没有用emby,那几乎是不可用,从上下文你应该用emby了吧?
  • 如果你是emby读取nastool整理好的软硬链接,先阅读我的回复 emby挂载阿里盘转直链 #1 (comment) 此回复解释了emby.js代码是如何获取直链的逻辑。先获取emby的磁盘文件路径参数embyRes,截取(拼接)出alist的/api/fs/get请求参数alistFilePath,进而获取302链接。 如果你的embyRes,很容易的构建出alistFilePath,那该项目就有可用的可能性,简单修改相关逻辑即可。 (假设emby读取的是nastool已经重命名,和云盘的文件路径和文件名几乎不一致,构造alist请求参数很困难,除非nastool有提供接口,通过硬链接获取源文件路径的api)

你好大佬,我是第二种情况。用nastool整理网盘中的资源重命名并且自动分类成软连接的文件夹后,emby绑定软连接的这个文件夹作为媒体库。现在的情况是,解析出来的alistFilePath 是软连接中的文件目录,和网盘中真实的文件目录不一样,不知道emby.js如何能解析出真实文件路径

oneisall8955 commented 1 year ago

你好大佬,我是第二种情况。用nastool整理网盘中的资源重命名并且自动分类成软连接的文件夹后,emby绑定软连接的这个文件夹作为媒体库。现在的情况是,解析出来的alistFilePath 是软连接中的文件目录,和网盘中真实的文件目录不一样,不知道emby.js如何能解析出真实文件路径

@Daziax

emby.js 的代码逻辑很易懂,具体看下图 image

你的情景,emby应该是用nastool制作的软连接(硬链接会因为跨文件系统报错)。 在上图中,以rclone后的视频文件/mnt/aliyun_mount/aliyun/media/tv/狂飙/狂飙E01.mkv为源文件例子,创建的软连接 /mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

假设 embyRes变量是软连接 /mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

此时 embyRes 通过简单的字符串替换构造出正确的 alistFilePath,是比较困难的。

在可以考虑通过readlink命令来读取源文件,readlink /mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

但是,由于是在njs模块,执行shell命令及读取命令返回值是比较困难的,可以考虑在主机创建一个http api,如go,java,nodejs,接收embyRes,执行readlink 命令,返回源文件路径。(设计上,可以考虑加上缓存)(备注1)

返回源文件路径,那么构造出 alistFilePath 就非常简单了,直接沿用源代码,const alistFilePath = embyRes.replace(embyMountPath, ''); 即可

=============== 关于备注1: 找到一个一些好用的小工具,通过http执行shell命令, https://github.com/msoap/shell2http https://github.com/adnanh/webhook

以为shell2http为例子,安装完成后:

shell2http \
    -form \
    -cache=10 \
    -port=3080 \
    -form-check='^.+$' \
    -log=/opt/software/shell2http/logs/shell2http.log \
    -timeout 10 \
    -shell="/bin/bash" \
    -500 \
    /readlink 'if [[ "X${v_path}" == "X" ]]; then echo "none"; else /bin/readlink "${v_path}"; fi';

启动成功后,测试软连接:

echo "halo" > /opt/tmp/a.txt
ln -s /opt/tmp/a.txt /opt/tmp/b.txt

测试通过api返回软连接的源文件:

curl http://127.0.0.1:3080/readlink?path=/opt/tmp/b.txt
/opt/tmp/a.txt
Daziax commented 1 year ago

你好大佬,我是第二种情况。用nastool整理网盘中的资源重命名并且自动分类成软连接的文件夹后,emby绑定软连接的这个文件夹作为媒体库。现在的情况是,解析出来的alistFilePath 是软连接中的文件目录,和网盘中真实的文件目录不一样,不知道emby.js如何能解析出真实文件路径

@Daziax

emby.js 的代码逻辑很易懂,具体看下图

image

你的情景,emby应该是用nastool制作的软连接(硬链接会因为跨文件系统报错)。

在上图中,以rclone后的视频文件/mnt/aliyun_mount/aliyun/media/tv/狂飙/狂飙E01.mkv为源文件例子,创建的软连接

/mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

假设 embyRes变量是软连接 /mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

此时 embyRes 通过简单的字符串替换构造出正确的 alistFilePath,是比较困难的。

在可以考虑通过readlink命令来读取源文件,readlink /mnt/aliyun_mount/links/media/电视剧/狂飙/S01/狂飙S01E01.mkv

但是,由于是在njs模块,执行shell命令及读取命令返回值是比较困难的,可以考虑在主机创建一个http api,如go,java,nodejs,接收embyRes,执行readlink 命令,返回源文件路径。(设计上,可以考虑加上缓存)

返回源文件路径,那么构造出 alistFilePath 就非常简单了,直接沿用源代码,const alistFilePath = embyRes.replace(embyMountPath, ''); 即可

大佬牛逼,思路我看懂了,可惜不会nodejs相关代码,也不知道njs怎么调用nodejs的api😂

oneisall8955 commented 1 year ago

大佬牛逼,思路我看懂了,可惜不会nodejs相关代码,也不知道njs怎么调用nodejs的api😂

@Daziax

上面回复有更新,怎么简单的创建用于执行shell的http服务。 至于njs调用http api,抄一下就行了,emby.js已经有调用emby和alist请求的例子

=============下面是上个回复面更新的内容===============

关于备注1: 找到一个一些好用的小工具,通过http执行shell命令, https://github.com/msoap/shell2http https://github.com/adnanh/webhook

以为shell2http为例子,安装完成后:

shell2http \
    -form \
    -cache=10 \
    -port=3080 \
    -form-check='^.+$' \
    -log=/opt/software/shell2http/logs/shell2http.log \
    -timeout 10 \
    -shell="/bin/bash" \
    -500 \
    /readlink 'if [[ "X${v_path}" == "X" ]]; then echo "none"; else /bin/readlink "${v_path}"; fi';

启动成功后,测试软连接:

echo "halo" > /opt/tmp/a.txt
ln -s /opt/tmp/a.txt /opt/tmp/b.txt

测试通过api返回软连接的源文件:

curl http://127.0.0.1:3080/readlink?path=/opt/tmp/b.txt
/opt/tmp/a.txt
Daziax commented 1 year ago

大佬牛逼,思路我看懂了,可惜不会nodejs相关代码,也不知道njs怎么调用nodejs的api😂

@Daziax

上面回复有更新,怎么简单的创建用于执行shell的http服务。 至于njs调用http api,抄一下就行了,emby.js已经有调用emby和alist请求的例子

=============下面是上个回复面更新的内容===============

关于备注1: 找到一个一些好用的小工具,通过http执行shell命令, https://github.com/msoap/shell2http https://github.com/adnanh/webhook

以为shell2http为例子,安装完成后:

shell2http \
    -form \
    -cache=10 \
    -port=3080 \
    -form-check='^.+$' \
    -log=/opt/software/shell2http/logs/shell2http.log \
    -timeout 10 \
    -shell="/bin/bash" \
    -500 \
    /readlink 'if [[ "X${v_path}" == "X" ]]; then echo "none"; else /bin/readlink "${v_path}"; fi';

启动成功后,测试软连接:

echo "halo" > /opt/tmp/a.txt
ln -s /opt/tmp/a.txt /opt/tmp/b.txt

测试通过api返回软连接的源文件:

curl http://127.0.0.1:3080/readlink?path=/opt/tmp/b.txt
/opt/tmp/a.txt

太感谢了,大佬步骤写的好详细。docker只会使用简单命令,不会使用dockerfile🫡我现在是使用docker运行后,手动在docker中执行的您在上面写的shell2http命令,并且以相同的路径挂载了在docker容器中宿主机中的软连接文件夹,但是目前有些问题。 我在宿主机执行的命令是 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/动漫/死神\ (2004)/Season\ 1/死神\ -\ S01E01\ -\ 第1集.mp4 返回结果 curl: (3) Error 软连接路径为 /volume1/Emby/Library/动漫/死神 (2004)/Season 1/死神 - S01E01 - 第1集.mp4 服务器上没有这条记录。 单独执行 curl 127.0.0.1:3080 是返回的有结果的。

运行 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/test 返回404,服务器上有记录,但是无法返回真实路径

xning00nn commented 1 year ago

@oneisall8955

@bpking1

emby-nginx | 2023/03/11 05:25:09 [error] 22#22: *19 js exception: Error: unhandled promise rejection: ReferenceError: "alistPwd" is not defined, client: 112.xx.xx.217, server: default, request: "GET /emby/videos/7/stream.mp4?DeviceId=97608e01-8f97-4541-9679-349a7bb8f7ca&MediaSourceId=0e14dc7e49abd8cc234540c7564c3324&Static=true&PlaySessionId=7dd67df2b00b4bc086b9d4882e7cf88a&api_key=60ae9ae75d474c04a2e332a5ded82918 HTTP/1.1", host: "150.230.38.226:8095" 大佬,"alistPwd" is not defined 这个在哪里定义? emby.js只有以下定义 //根据实际情况修改下面4个设置 const embyHost = 'http://172.17.0.1:8096'; // const embyMountPath = '/root/emby_alist/aliyun'; const alistToken = 'alist-5dxxxxxxxxxxxxxxx //alist token, 在alist后台查看 const alistAddr= 'http://172.17.0.1:5244'; const embyApiKey = '307dc19450xxxx323b77b1e734b'; const alistPublicAddr =xxxxxx

你好,你这个可能是之前的js文件混在里面了,请整个重新下载

大佬, 还有个报错,

2023/03/11 09:30:07 [warn] 21#21: 49 js: mount emby file path: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [warn] 21#21: 49 js: try to fetch alist path from /aliyun/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4 2023/03/11 09:30:07 [error] 21#21: *49 js: error500: alist_path_api 500 failed get storage: can't find storage with rawPath: /data/movies/aliyun/新概念/雪梨新概念/雪梨初级语法/雪梨初级英语语法课/2.Lesson 2 可数名词复数(规则变化).mp4

embyMountPath = '/mnt/aliyun' #配置的是这个路径 rclone mount aliyun: /mnt/aliyun #rclone 挂载的是这个路径 AList里面挂载的是/aliyun这个路径 emby映射的是/mnt/aliyun:/data/movies 这个路径

是配的有问题还是函数调用有问题?

不知道你解决了没有,看报错信息应该是参数embyMountPath配置问题,修改为 /data/movies 即可。

扩展下为什么这样配置:

emby.js有一段拼接出正确的alistFilePath参数,用于请求alist的/api/fs/get 接口,获取直链链接。

思路排查如下:

  • 在云盘中存在视频,文件目录树如下:
* media
  ** tv
  *** 狂飙
  **** 狂飙S01E01.mkv
  **** 狂飙S01E02.mkv
  **** ......
  ** movie
* software
  ** mysql
  ** ......
* image
  ** xxx.jpg
  ** ......
  • 挂载到alist的目录 /aliyun

  • alist admin 用户,播放media/tv/狂飙/狂飙S01E01.mkv ,请求 /api/fs/get 接口,请求为

    {
      "password": "",
      "path": "/aliyun/media/tv/狂飙/狂飙S01E01.mkv"
    }
  • rclone 挂载到/mnt/aliyun ,emby 播放视频,请求emby接口 /emby/Items/123/PlaybackInfo 获取播放信息

    {
      "MediaSources": [
          {
              // ......
              "Path": "/mnt/aliyun/aliyun/media/tv/狂飙/狂飙S01E01.mkv"
              // ......
          }
      ]
    }
  • 当emby是宿主机运行 要想将 "Path": "/mnt/aliyun/aliyun/media/tv/狂飙/狂飙S01E01.mkv" 截取成 alist接口的path,那么,配置 embyMountPath 配置为 /mnt/aliyun,截取成 /aliyun/media/tv/狂飙/狂飙S01E01.mkv 就是alist的接口参数。

    相关逻辑在 emby.js ,如下:

      //fetch alist direct link
      const alistFilePath = embyRes.replace(embyMountPath, '')

    其中,embyRes 是 "/mnt/aliyun/aliyun/media/tv/狂飙/狂飙S01E01.mkv" ,replace后是 /aliyun/media/tv/狂飙/狂飙S01E01.mkv

  • 当emby是docker运行,将宿主机 /mnt/aliyun 映射到容器 /data/movies。

    那么 /emby/Items/123/PlaybackInfo 接口返回应该是 "/data/movies/aliyun/media/tv/狂飙/狂飙S01E01.mkv" 同理,embyMountPath 配置为 /data/movies 即可截取正确

之前已经解决但是不知道原理,谢谢大佬提供的解题思路,这个路径的截取还真有讲究。已经测试aliyun,onedrive可正常使用直连

ENFP-T9 commented 1 year ago

您好 使用docker版本 成功获取直链 但是不能保存播放进度 就算看到中间也会显示已播放完毕 这个问题要怎么解决呢

oneisall8955 commented 1 year ago

太感谢了,大佬步骤写的好详细。docker只会使用简单命令,不会使用dockerfile🫡我现在是使用docker运行后,手动在docker中执行的您在上面写的shell2http命令,并且以相同的路径挂载了在docker容器中宿主机中的软连接文件夹,但是目前有些问题。 我在宿主机执行的命令是 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/动漫/死神\ (2004)/Season\ 1/死神\ -\ S01E01\ -\ 第1集.mp4 返回结果 curl: (3) Error 软连接路径为 /volume1/Emby/Library/动漫/死神 (2004)/Season 1/死神 - S01E01 - 第1集.mp4 服务器上没有这条记录。 单独执行 curl 127.0.0.1:3080 是返回的有结果的。

运行 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/test 返回404,服务器上有记录,但是无法返回真实路径

@Daziax

Daziax commented 1 year ago

太感谢了,大佬步骤写的好详细。docker只会使用简单命令,不会使用dockerfile🫡我现在是使用docker运行后,手动在docker中执行的您在上面写的shell2http命令,并且以相同的路径挂载了在docker容器中宿主机中的软连接文件夹,但是目前有些问题。 我在宿主机执行的命令是 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/动漫/死神\ (2004)/Season\ 1/死神\ -\ S01E01\ -\ 第1集.mp4 返回结果 curl: (3) Error 软连接路径为 /volume1/Emby/Library/动漫/死神 (2004)/Season 1/死神 - S01E01 - 第1集.mp4 服务器上没有这条记录。 单独执行 curl 127.0.0.1:3080 是返回的有结果的。 运行 curl 127.0.0.1:3080/readlink?path=/volume1/Emby/Library/test 返回404,服务器上有记录,但是无法返回真实路径

@Daziax

  • 先确保:readlink /volume1/Emby/Library/动漫/死神\ (2004)/Season\ 1/死神\ -\ S01E01\ -\ 第1集.mp4是否返回正确,需要注意的是你的readlink命令包含了空格和括号,所以带了 \ 进行转义。建议使用英文引号包裹: readlink '/volume1/Emby/Library/动漫/死神 (2004)/Season 1/死神 - S01E01 - 第1集.mp4'
  • 根据你的上下文,你的emby和alist是安装在宿主机,nginx(njs)是在docker运行。我测试过这样执行readlink 可以读取到源文件路径的,只是内容读取不到而已。测试如下图: image
  • 步骤1:先在宿主机执行readlink是否正确,在宿主机安装并启动shell2http(做成systemd服务后台运行),保证 curl 'http://127.0.0.1:3080/readlink?path=xxx' 正确返回。请注意path参数需要url编码 https://tool.chinaz.com/tools/urlencode.aspx ,并且用英文引号''包裹整个请求,如: image
  • 步骤2:返回404应该是没有shell2http没有 /readlink 接口。可以通过 -log=xxxx 指定的日志文件检查是否有报错等排查。(tail -f /opt/software/shell2http/logs/shell2http.log)
  • 步骤3:docker nginx 的 emby.js 调用 http://172.17.0.1:3080/readlink (即通过docker网卡调用宿主机shell2http服务)

大佬救命 image 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点

oneisall8955 commented 1 year ago

大佬救命 image 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点

@Daziax

Daziax commented 1 year ago

大佬救命 image 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点

@Daziax

    1. 你的if判断alistFilePath1是否和alistFilePath一样有问题:
    if(alistFilePath === alistFilePath){
    // 永远是true,永远打印"一模一样啊"
    r.warn("一模一样啊")
    }
    1. shell2http,返回会在末尾添加一行空行,你用postman请求很容易看出,昨天我忘记在上面回复了。应该是这个导致你看起来一样实际不一样,你可以用按\n换行符分割,读取第一行即可。(同时考虑是'none'情况)。
    1. 如果在测试完能读取直链后,请完善代码让它更健壮。调用shell2http,设置connectTimeout,readTimeout避免一直卡住,判断response的http状态码返回非200情况,返回'none\n'或 ''等其他异常状态等

十分感谢大佬的耐心讲解,直链问题解决了😁。 还有个问题,如果播放本地视频的话,如何才能不走直链直接播放呢(只用8095这个端口)

oneisall8955 commented 1 year ago

基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。

如果不行,你可以按照我提供的想法:


可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。

如何调原emby接口,参考另外一个网友写的git 提交:

https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8

Screenshot_20230318_004150

Daziax commented 1 year ago

基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。

如果不行,你可以按照我提供的想法:

可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。

如何调原emby接口,参考另外一个网友写的git 提交:

zxcvbnmzsedr/docker_env@3704b88

Screenshot_20230318_004150

感谢大佬的耐心指点,目前问题已经完全解决了🫡🫡🫡

ershouqingge commented 1 year ago

~/emby2Alist# docker-compose up -d Recreating dea08953a174_alist ... Recreating fed206973a31_ali-webdav ... error Recreating dea08953a174_alist ... error ERROR: for fed206973a31_ali-webdav Cannot start service service.ali-webdav: Bind mount failed: '/root/emby2Alist/aliyundrive-webdav' does not exists

ERROR: for dea08953a174_alist Cannot start service service.ali: Bind mount failed: '/root/emby2Alist/alist' does not exists

ERROR: for service.ali-webdav Cannot start service service.ali-webdav: Bind mount failed: '/root/emby2Alist/aliyundrive-webdav' does not exists

ERROR: for service.ali Cannot start service service.ali: Bind mount failed: '/root/emby2Alist/alist' does not exists ERROR: Encountered errors while bringing up the project.

大佬 这个是什么问题呢,是容器的路径映射服务问题吗,不太会使用docke compose

nanoia commented 1 year ago

@oneisall8955

基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。

如果不行,你可以按照我提供的想法:


可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。

如何调原emby接口,参考另外一个网友写的git 提交:

https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8

Screenshot_20230318_004150

大佬你好,方便发下群链接吗,想加入学习一下

ershouqingge commented 1 year ago

在emby2Alist目录下手动新建alist和aliyundrive-webdav后再执行docker-compose解决了问题,但是aliyundrive-webdav这个镜像提示RROR aliyundrive_webdav::drive: refresh token failed: error sending request for url (https://websv.aliyundrive.com/token/refresh): error trying to connect: dns error: failed to lookup address information: Name does not resolve Error: initialize aliyundrive client failed,测了一下dns全挂了,应该是接口换了。所以暂时使用了群晖的套机替代,打出来日志是2023/03/27 15:18:43 [warn] 23#23: 1626 js: itemInfoUri: http://172.17.0.1:8096/Items/13116/PlaybackInfo?MediaSourceId=3127a0bd8b1625956e495cc8c9f65dff&api_key=d3032563e6ba4ddc920128e1aabc8ea8 2023/03/27 15:18:43 [warn] 23#23: 1626 js: mount emby file path: /mnt/ali/电影/未整理/[x264 高码]机器人总动员-瓦力.WALL-E.2008.H264.1080P.国粤英三语.中英特效字幕.mp4,走的还是服务器流量,是否是因为我配置了alistPublicAddr这参数呢?

oneisall8955 commented 1 year ago

在emby2Alist目录下手动新建alist和aliyundrive-webdav后再执行docker-compose解决了问题,但是aliyundrive-webdav这个镜像提示RROR aliyundrive_webdav::drive: refresh token failed: error sending request for url (https://websv.aliyundrive.com/token/refresh): error trying to connect: dns error: failed to lookup address information: Name does not resolve Error: initialize aliyundrive client failed,测了一下dns全挂了,应该是接口换了。所以暂时使用了群晖的套机替代,打出来日志是2023/03/27 15:18:43 [warn] 23#23: 1626 js: itemInfoUri: http://172.17.0.1:8096/Items/13116/PlaybackInfo?MediaSourceId=3127a0bd8b1625956e495cc8c9f65dff&api_key=d3032563e6ba4ddc920128e1aabc8ea8 2023/03/27 15:18:43 [warn] 23#23: 1626 js: mount emby file path: /mnt/ali/电影/未整理/[x264 高码]机器人总动员-瓦力.WALL-E.2008.H264.1080P.国粤英三语.中英特效字幕.mp4,走的还是服务器流量,是否是因为我配置了alistPublicAddr这参数呢?

关于直链: 请根据这里排查:

https://github.com/bpking1/hugo/issues/1#issuecomment-1463611154

另外,alist不要开启web代理,直接用默认的302重定向

关于报错: 如果搭建了alist,docker-compose可以不用aliyundrive-webdav这个容器,在docker-compose.yml删除相关配置即可。用他是教程rclone用次容器挂载,其实用alist提供的webdav就行了

ershouqingge commented 1 year ago

@oneisall8955

在emby2Alist目录下手动新建alist和aliyundrive-webdav后再执行docker-compose解决了问题,但是aliyundrive-webdav这个镜像提示RROR aliyundrive_webdav::drive: refresh token failed: error sending request for url (https://websv.aliyundrive.com/token/refresh): error trying to connect: dns error: failed to lookup address information: Name does not resolve Error: initialize aliyundrive client failed,测了一下dns全挂了,应该是接口换了。所以暂时使用了群晖的套机替代,打出来日志是2023/03/27 15:18:43 [warn] 23#23: 1626 js: itemInfoUri: http://172.17.0.1:8096/Items/13116/PlaybackInfo?MediaSourceId=3127a0bd8b1625956e495cc8c9f65dff&api_key=d3032563e6ba4ddc920128e1aabc8ea8 2023/03/27 15:18:43 [warn] 23#23: 1626 js: mount emby file path: /mnt/ali/电影/未整理/[x264 高码]机器人总动员-瓦力.WALL-E.2008.H264.1080P.国粤英三语.中英特效字幕.mp4,走的还是服务器流量,是否是因为我配置了alistPublicAddr这参数呢?

关于直链: 请根据这里排查:

https://github.com/bpking1/hugo/issues/1#issuecomment-1463611154

另外,alist不要开启web代理,直接用默认的302重定向

关于报错: 如果搭建了alist,docker-compose可以不用aliyundrive-webdav这个容器,在docker-compose.yml删除相关配置即可。用他是教程rclone用次容器挂载,其实用alist提供的webdav就行了

感谢,已经配置完成了。目前还有2个问题想咨询下。 1.目前通过8097端口访问302直链没问题,但是在8097端口访问服务器本地资源的时候好像没兜底逻辑会播放失败,这样要在2个端口使用,是否考虑增加一个兜底逻辑,匹配超时状态下使用原路径播放呢?参考此文:https://www.ztianzeng.com/posts/%E4%BB%8EEmby%E7%9B%B4%E9%93%BE%E5%88%9D%E8%AF%86NJS%E6%A8%A1%E5%9D%97/ 2.embyAddExternalUrl这个项目我是按油猴里面的直接把脚本放在dashboard-ui后修改index.html引用的,反代到8097直链项目后还可以使用播放器按钮,但是好像重启容器会恢复。 如果使用项目中的反代到8095,那么8097反代8096是不是不能使用,能不能合并一下整合到一个端口呢。

oneisall8955 commented 1 year ago

感谢,已经配置完成了。目前还有2个问题想咨询下。 1.目前通过8097端口访问302直链没问题,但是在8097端口访问服务器本地资源的时候好像没兜底逻辑会播放失败,这样要在2个端口使用,是否考虑增加一个兜底逻辑,匹配超时状态下使用原路径播放呢?参考此文:https://www.ztianzeng.com/posts/%E4%BB%8EEmby%E7%9B%B4%E9%93%BE%E5%88%9D%E8%AF%86NJS%E6%A8%A1%E5%9D%97/ 2.embyAddExternalUrl这个项目我是按油猴里面的直接把脚本放在dashboard-ui后修改index.html引用的,反代到8097直链项目后还可以使用播放器按钮,但是好像重启容器会恢复。 如果使用项目中的反代到8095,那么8097反代8096是不是不能使用,能不能合并一下整合到一个端口呢。

@ershouqingge

  1. 使用源路径播放在上面已经讨论问:https://github.com/bpking1/hugo/issues/1#issuecomment-1485316044 此外, https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8 此仓库就是你推荐的博客的代码仓库。照葫芦画瓢,兜底逻辑,自己改就行了

  2. 博主将项目拆分为三个子项目,是为了按需配置。自己按需整合就行了,可以全部整合到一个nginx。 不知道你笔误还是理解错误,embyAddExternalUrl 是通过njs添加上第三方播放器插件链接,这个方式,让所有emby客户端都可以唤起第三方播放,不需要修改index.html。需要修改index.html的是embyWebAddExternalUrl

以下是我给一位网友解释的回答,可参考:

他这个项目有三个子项目 emby2Alist 是核心,劫持 /videos/(.*)/stream 接口通过njs模块,获取302直链

embyAddExternalUrl 对这个 /Users/(.*)/Items/(\d+)$ ,将 response body 用 js_body_filter过滤,通过njs添加上第三方播放器插件链接,这个方式,让所有emby客户端都可以唤起第三方播放,例如安卓app,网页,等等,就如 c7d93ba4bfd4cbec37ff986733113ab 现在项目有更新,添加了图标,此处为旧的截图

embyWebAddExternalUrl 是纯属js项目,相当于油猴插件,在所有web前端,仅限于前端,添加上唤起第三方播放器播放按钮 6b079a9d020748e0425c1c74bffc711

oneisall8955 commented 1 year ago

大佬你好,方便发下群链接吗,想加入学习一下

@nanoia 直接留tg群不太好,留下base64的邮箱发给你

nanoia commented 1 year ago

c2h1aW1vdEBxcS5jb20= ——————————————————————-

刘志聪 @.***>于2023年3月28日 周二12:07写道:

大佬你好,方便发下群链接吗,想加入学习一下

@nanoia https://github.com/nanoia 直接留tg群不太好,留下base64的邮箱发给你

— Reply to this email directly, view it on GitHub https://github.com/bpking1/hugo/issues/1#issuecomment-1486183797, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFRBE2QDTD5ORN7XMZTOMBTW6JPXZANCNFSM6AAAAAAUO4MXKU . You are receiving this because you were mentioned.Message ID: @.***>

ershouqingge commented 1 year ago

感谢,已经配置完成了。目前还有2个问题想咨询下。 1.目前通过8097端口访问302直链没问题,但是在8097端口访问服务器本地资源的时候好像没兜底逻辑会播放失败,这样要在2个端口使用,是否考虑增加一个兜底逻辑,匹配超时状态下使用原路径播放呢?参考此文:https://www.ztianzeng.com/posts/%E4%BB%8EEmby%E7%9B%B4%E9%93%BE%E5%88%9D%E8%AF%86NJS%E6%A8%A1%E5%9D%97/ 2.embyAddExternalUrl这个项目我是按油猴里面的直接把脚本放在dashboard-ui后修改index.html引用的,反代到8097直链项目后还可以使用播放器按钮,但是好像重启容器会恢复。 如果使用项目中的反代到8095,那么8097反代8096是不是不能使用,能不能合并一下整合到一个端口呢。

@ershouqingge

  1. 使用源路径播放在上面已经讨论问:emby挂载阿里盘转直链 #1 (comment) 此外, zxcvbnmzsedr/docker_env@3704b88 此仓库就是你推荐的博客的代码仓库。照葫芦画瓢,兜底逻辑,自己改就行了
  2. 博主将项目拆分为三个子项目,是为了按需配置。自己按需整合就行了,可以全部整合到一个nginx。 不知道你笔误还是理解错误,embyAddExternalUrl 是通过njs添加上第三方播放器插件链接,这个方式,让所有emby客户端都可以唤起第三方播放,不需要修改index.html。需要修改index.html的是embyWebAddExternalUrl

以下是我给一位网友解释的回答,可参考:

他这个项目有三个子项目 emby2Alist 是核心,劫持 /videos/(.*)/stream 接口通过njs模块,获取302直链

embyAddExternalUrl 对这个 /Users/(.*)/Items/(\d+)$ ,将 response body 用 js_body_filter过滤,通过njs添加上第三方播放器插件链接,这个方式,让所有emby客户端都可以唤起第三方播放,例如安卓app,网页,等等,就如 c7d93ba4bfd4cbec37ff986733113ab 现在项目有更新,添加了图标,此处为旧的截图

embyWebAddExternalUrl 是纯属js项目,相当于油猴插件,在所有web前端,仅限于前端,添加上唤起第三方播放器播放按钮 6b079a9d020748e0425c1c74bffc711

确实有点迷糊了。 感谢大佬 另外tg拉我下把 OTcxMTIxNTkzQHFxLmNvbQ==

xiaochenchui commented 1 year ago

2023/03/31 03:42:36 [warn] 23#23: 17 js: itemInfoUri: http://172.17.0.1:8096/Items/37/PlaybackInfo?MediaSourceId=32f260d3f1a2eaeed404881998723a3a&api_key=e14d4e29992c4ce6bd4c05f4194a3504 2023/03/31 03:42:36 [warn] 23#23: 17 js: mount emby file path: /mnt/ali/电影/单电影/罗马假日/[TSKS][Roman.Holiday][2017][KO_CN].mkv 2023/03/31 03:42:36 [error] 23#23: *17 js: error500: alist_path_api 401 couldn't handle this token

请问这个报错是什么原因呢,token我都是按上面教程获取的

xiaochenchui commented 1 year ago

2023/03/31 03:42:36 [warn] 23#23: 17 js: itemInfoUri: http://172.17.0.1:8096/Items/37/PlaybackInfo?MediaSourceId=32f260d3f1a2eaeed404881998723a3a&api_key=e14d4e29992c4ce6bd4c05f4194a3504 2023/03/31 03:42:36 [warn] 23#23: 17 js: mount emby file path: /mnt/ali/电影/单电影/罗马假日/[TSKS][Roman.Holiday][2017][KO_CN].mkv 2023/03/31 03:42:36 [error] 23#23: *17 js: error500: alist_path_api 401 couldn't handle this token

请问这个报错是什么原因呢,token我都是按上面教程获取的 顺利解决,原来emby.js中的token是令牌token,不是阿里云盘的token