Open bpking1 opened 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呢?
这个文件夹的作用是给emby所有官方客户端添加外部播放器链接,使用方式可以参考reademe
问题2 可以参考这个conf文件: https://gist.github.com/bpking1/604cfb243c9af41a43e0ca5f822f193b
或者不用docker,直接用宿主机的nginx运行脚本来获取直链也可以
大佬 [error] 20#20: *79 js: error500: alist_path_api 401 Guest user is disabled, login please 是什么原因呢
注意js文件里面填写的是alist的文件夹密码,如果不行的话可以再试试给alist添加一个guest账户,具体逻辑可能要自己去看这部分alist源码
谢谢已经解决了,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: @.***>
这个文件夹的作用是给emby所有官方客户端添加外部播放器链接,使用方式可以参考reademe
问题2 可以参考这个conf文件: https://gist.github.com/bpking1/604cfb243c9af41a43e0ca5f822f193b
或者不用docker,直接用宿主机的nginx运行脚本来获取直链也可以
谢谢解答,我明白了,这个ExternalUrls字段已经是emby原有字段并且会处理。 即显示tmdb等外部链接,这相当于把油猴脚本换一种形式嵌入。非常佩服博主的脑洞,非常巧妙,哈哈哈 但是这种形式相对隐蔽了点。
大佬 [error] 20#20: *79 js: error500: alist_path_api 401 Guest user is disabled, login please 是什么原因呢
调用 alist 接口,我有不同的见解,我用的不是文件夹密码而是alist令牌模式,需要修改emby.js部分代码。(变更用// !!! WARN
注释)
1.在alist后台创建令牌 token 路径:设置-其他,参照下图:
2.修改emby.js调用alist的方法
2.1修改alistPwd变量值为令牌,而不是文件夹密码
async function redirect2Pan(r) {
// ......省略
const alistPwd = 'alist-xxxxx'; // !!! WARN 这里我改成admin用户后台设置的令牌,这里可以优化改个变量名称
// ......省略
}
2.2修改调用alist接口的path参数,即变量 alistFilePath
async function redirect2Pan(r) {
// ......省略
// rclonePathPrefix 这个前缀意思是rclone使用alist admin用户挂载的具体路径,如果是alist根路径,保留为空
// 当然,我为rclone创建了个特殊的alist的webdav用户,修改了这个用户的根路径来读取alist信息
// 这里可以调试,登录admin用户,F12查看应该是哪个前缀才正确,不然返回找不到对象
const alistRclonePathPrefix='/rclone'; // !!! WARN 新增这个参数,值可为空,控制挂载alist的路径前缀
const alistFilePath = alistRclonePathPrefix + embyRes.replace(embyMountPath, '');
// ......省略
}
使用新用户挂载,限制其读取目录,增强了安全性,带来的副作用,需要额外的变量来拼接成正确的路径,也就是alistRclonePathPrefix
这个变量的含义。详细如下图所示
2.3修改 fetchAlistPathApi 接口的实现,password变量赋空值,新增请求头Authorization值为令牌值,即alistPwd变量
async function fetchAlistPathApi(alistApiPath, alistFilePath, alistPwd) {
const alistRequestBody = {
"path": alistFilePath,
"password": "" // !!! WARN 此处修改为空
}
try {
const response = await ngx.fetch(alistApiPath, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
'Authorization': alistPwd // !!! WARN 新增 header,形如admin访问
},
max_response_body_size: 65535,
body: JSON.stringify(alistRequestBody)
})
// ......省略
}
感谢分享,我才发现alist v3可以方便普通用户后台设置token,是应该改成token方式要更好。
小白不会用,能否远程协助,可以付费
请问最后直链下载走的是哪个的token?是alist里的还是aliyunwebdav8080端口那个?或者说,alist和aliyunwebdav各自究竟是在做什么工作,能否进一步说明下,谢谢您的回复!
请问最后直链下载走的是哪个的token?是alist里的还是aliyunwebdav8080端口那个?或者说,alist和aliyunwebdav各自究竟是在做什么工作,能否进一步说明下,谢谢您的回复!
aliyunwebdav仅仅是提供webdav服务给rclone挂载使用,不安装这个而使用alist的webdav应该也是可以的。下载走的是alist
你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?
我已经直接在机器上安装过Emby和alist了,用这个是不是会在docker里再装一遍
照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧
我已经直接在机器上安装过Emby和alist了,用这个是不是会在docker里再装一遍
博主给的思路是,nginx的njs模块调alist获取直链302
基于你的情况,建议用dokcer版本的nginx,因为已经包含了njs模块不用自己编译。
你好,请问我用rclone挂载alist添加天翼网盘的webdav,nginx重定向302直链后,emby请求会带Origin:我的域名 这个请求头导致跨域,这时只有部分cdn带access-control-allow-origin:*的响应头文件才能正常返回,其他都是cors跨域报错,我看alist这块没这个问题,请问有遇到过这个问题吗?
你在alist的网页播放视频看是否正常?(按照http和浏览器的规范,都会检查CORS)
照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧 是否走直链,日志,浏览器F12调试看响应和链接,均可以看出来。
确保emby在浏览器调用 /videos/123/stream
这种url获取视频流。两个地方都要设置关闭转码。
过滤出js关键字,因为njs模块的日志会添加js为开头。
如果不放心这个关键字,那你可以在emby.js文件的redirect2Pan 方法 入口处添加自己的日志,如 r.warn(redirect2Pan_start...
);然后再搜索自己的关键字 redirect2Pan_start
检查 /emby/Items/123/PlaybackInfo 接口返回是否是支持stream及播放地址
检查是否调用 /emby/videos/123/stream.mkv 这个接口,并且 Status Code:是302
该接口的 Response Header location是直链地址
理解博主提供的思路,灵活结合就行了,如果博主要改博文,不如改下njs模块调alist获取直链那块的接口
@oneisall8955
照着教程操作,访问8095端口没有日志输出,是不是表示没走直连?也没报错不知道啥原因,老大教程重写一份新的吧 是否走直链,日志,浏览器F12调试看响应和链接,均可以看出来。
先确保emby没有转码
确保emby在浏览器调用
/videos/123/stream
这种url获取视频流。两个地方都要设置关闭转码。
- 转码-启用硬件加速-否
- 修改账号的设置,禁用相关转码,我的配置如图
日志检查
过滤出js关键字,因为njs模块的日志会添加js为开头。
如果不放心这个关键字,那你可以在emby.js文件的redirect2Pan 方法 入口处添加自己的日志,如 r.warn(
redirect2Pan_start...
);然后再搜索自己的关键字 redirect2Pan_start浏览器检查F12调试
检查 /emby/Items/123/PlaybackInfo 接口返回是否是支持stream及播放地址
检查是否调用 /emby/videos/123/stream.mkv 这个接口,并且 Status Code:是302
该接口的 Response Header location是直链地址
理解博主提供的思路,灵活结合就行了,如果博主要改博文,不如改下njs模块调alist获取直链那块的接口
大神厉害,还想着1天就能部署成功呢,看来还得补补功课,要好好研究一下
@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的响应头,所以你们没这个问题
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
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文件混在里面了,请整个重新下载
@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 这个路径
是配的有问题还是函数调用有问题?
@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 即可截取正确
@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的响应头,所以你们没这个问题
谢谢为网友提供解决方案,👍
@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结合使用
大佬,成了。我现在在用nastool的软连接来分类网盘里的视频,不知道怎么和emby2alist结合使用
@Daziax
没用nastool,印象它提供软链接硬链,从而刮削,重命名不破坏源文件(种子)。
我不清楚你的需求,你是哪种场景呢?该项目与emby是比较强关联的
如果你没有用emby,那几乎是不可用,从上下文你应该用emby了吧?
如果你是emby读取nastool整理好的软硬链接,先阅读我的回复 https://github.com/bpking1/hugo/issues/1#issuecomment-1465637011
此回复解释了emby.js代码是如何获取直链的逻辑。先获取emby的磁盘文件路径参数embyRes,截取(拼接)出alist的/api/fs/get请求参数alistFilePath,进而获取302链接。
如果你的embyRes,很容易的构建出alistFilePath,那该项目就有可用的可能性,简单修改相关逻辑即可。
(假设emby读取的是nastool已经重命名,和云盘的文件路径和文件名几乎不一致,构造alist请求参数很困难,除非nastool有提供接口,通过硬链接获取源文件路径的api)
大佬,成了。我现在在用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如何能解析出真实文件路径
你好大佬,我是第二种情况。用nastool整理网盘中的资源重命名并且自动分类成软连接的文件夹后,emby绑定软连接的这个文件夹作为媒体库。现在的情况是,解析出来的alistFilePath 是软连接中的文件目录,和网盘中真实的文件目录不一样,不知道emby.js如何能解析出真实文件路径
@Daziax
emby.js 的代码逻辑很易懂,具体看下图
你的情景,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
你好大佬,我是第二种情况。用nastool整理网盘中的资源重命名并且自动分类成软连接的文件夹后,emby绑定软连接的这个文件夹作为媒体库。现在的情况是,解析出来的alistFilePath 是软连接中的文件目录,和网盘中真实的文件目录不一样,不知道emby.js如何能解析出真实文件路径
@Daziax
emby.js 的代码逻辑很易懂,具体看下图
你的情景,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😂
大佬牛逼,思路我看懂了,可惜不会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
大佬牛逼,思路我看懂了,可惜不会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,服务器上有记录,但是无法返回真实路径
@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可正常使用直连
您好 使用docker版本 成功获取直链 但是不能保存播放进度 就算看到中间也会显示已播放完毕 这个问题要怎么解决呢
太感谢了,大佬步骤写的好详细。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 可以读取到源文件路径的,只是内容读取不到而已。测试如下图:
步骤1:先在宿主机执行readlink是否正确,在宿主机安装并启动shell2http(做成systemd服务后台运行),保证 curl 'http://127.0.0.1:3080/readlink?path=xxx' 正确返回。请注意path参数需要url编码 https://tool.chinaz.com/tools/urlencode.aspx ,并且用英文引号''包裹整个请求,如:
步骤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服务)
太感谢了,大佬步骤写的好详细。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 可以读取到源文件路径的,只是内容读取不到而已。测试如下图:
- 步骤1:先在宿主机执行readlink是否正确,在宿主机安装并启动shell2http(做成systemd服务后台运行),保证 curl 'http://127.0.0.1:3080/readlink?path=xxx' 正确返回。请注意path参数需要url编码 https://tool.chinaz.com/tools/urlencode.aspx ,并且用英文引号''包裹整个请求,如:
- 步骤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服务)
大佬救命 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点
大佬救命 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点
@Daziax
if(alistFilePath === alistFilePath){
// 永远是true,永远打印"一模一样啊"
r.warn("一模一样啊")
}
大佬救命 现在的问题是,alistFilePath这个变量,我直接使用固定的路径(试了几个),是能获取到视频直链。但我只要使用alistFilePath1(我通过shell2alist获取到的真实路径),fetchAlistPathApi就会返回 js: error500: alist_path_api 500 object not found。我打印了alistFilePath和alistFilePath1,显示的一摸一样,甚至使用if判断两个是否一样,都得到是一样的结果,但就是不能使用alistFilePath1。求大佬指点
@Daziax
- 你的if判断alistFilePath1是否和alistFilePath一样有问题:
if(alistFilePath === alistFilePath){ // 永远是true,永远打印"一模一样啊" r.warn("一模一样啊") }
- shell2http,返回会在末尾添加一行空行,你用postman请求很容易看出,昨天我忘记在上面回复了。应该是这个导致你看起来一样实际不一样,你可以用按\n换行符分割,读取第一行即可。(同时考虑是'none'情况)。
- 如果在测试完能读取直链后,请完善代码让它更健壮。调用shell2http,设置connectTimeout,readTimeout避免一直卡住,判断response的http状态码返回非200情况,返回'none\n'或 ''等其他异常状态等
十分感谢大佬的耐心讲解,直链问题解决了😁。 还有个问题,如果播放本地视频的话,如何才能不走直链直接播放呢(只用8095这个端口)
基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。
如果不行,你可以按照我提供的想法:
可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。
如何调原emby接口,参考另外一个网友写的git 提交:
https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8
基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。
如果不行,你可以按照我提供的想法:
可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。
如何调原emby接口,参考另外一个网友写的git 提交:
感谢大佬的耐心指点,目前问题已经完全解决了🫡🫡🫡
~/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
@oneisall8955
基于群友讨论,原本就支持播放本地视频。我搭建在VPS上没有视频,也不太想测试。
如果不行,你可以按照我提供的想法:
可以修改emby.js,通过embyRes变量判断是本地还是云盘文件(是否以embyMountPath变量开头判断),如果是本地,直接调emby的原本接口即可。
如何调原emby接口,参考另外一个网友写的git 提交:
https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8
大佬你好,方便发下群链接吗,想加入学习一下
在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这参数呢?
在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就行了
@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是不是不能使用,能不能合并一下整合到一个端口呢。
感谢,已经配置完成了。目前还有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
使用源路径播放在上面已经讨论问:https://github.com/bpking1/hugo/issues/1#issuecomment-1485316044 此外, https://github.com/zxcvbnmzsedr/docker_env/commit/3704b8875c3f953b876b69abc55587326d109ec8 此仓库就是你推荐的博客的代码仓库。照葫芦画瓢,兜底逻辑,自己改就行了
博主将项目拆分为三个子项目,是为了按需配置。自己按需整合就行了,可以全部整合到一个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,网页,等等,就如 现在项目有更新,添加了图标,此处为旧的截图
embyWebAddExternalUrl 是纯属js项目,相当于油猴插件,在所有web前端,仅限于前端,添加上唤起第三方播放器播放按钮
大佬你好,方便发下群链接吗,想加入学习一下
@nanoia 直接留tg群不太好,留下base64的邮箱发给你
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: @.***>
感谢,已经配置完成了。目前还有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
- 使用源路径播放在上面已经讨论问:emby挂载阿里盘转直链 #1 (comment) 此外, zxcvbnmzsedr/docker_env@3704b88 此仓库就是你推荐的博客的代码仓库。照葫芦画瓢,兜底逻辑,自己改就行了
- 博主将项目拆分为三个子项目,是为了按需配置。自己按需整合就行了,可以全部整合到一个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,网页,等等,就如 现在项目有更新,添加了图标,此处为旧的截图
embyWebAddExternalUrl 是纯属js项目,相当于油猴插件,在所有web前端,仅限于前端,添加上唤起第三方播放器播放按钮
确实有点迷糊了。 感谢大佬 另外tg拉我下把 OTcxMTIxNTkzQHFxLmNvbQ==
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我都是按上面教程获取的
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
https://blog.738888.xyz/posts/emby_jellyfin_to_alist_directlink/?code=0405695c3b05dfe49b5d