Closed fengero closed 2 months ago
点开视频播放的时候匹配路径,获取alist直连,302,基本每次都能播放成功。但拖动进度条就会出问题,即使成功加载耗时也经常比重新点开视频要长。
这个是 Infuse 老大难问题了,基本没法解决,虽做了直链的缓存来防抖,但也仅是避免了频繁查询,频繁访问这个主动权在 Infuse 自身手上,目前的妥协方案估计只有禁用 Infuse 客户端的直链,回源中转来避免了
const routeRule = [
// 以下规则代表禁用 strHead.xEmbyClients.maybeProxy 中的[本地挂载文件或 alist 返回的链接]的 115 直链功能
["115-local", "r.args.X-Emby-Client", 0, strHead.xEmbyClients.maybeProxy],
["115-local", "filePath", 2, "/115/media"],
];
确实是infuse自己的问题 即使是infuse直接接入webdav在目标网盘是115的情况下还是有几率出现问题 已经向infuse反馈了
我上面两行注释掉之后好像还是无法禁用直连。是不是跟我的其他配置冲突了
embyRes: {"message":"success","path":"/alist/115/media/电影/复仇者联盟2:奥创纪元 (2015)/Avengers Age of Ultron 2015 UHD BluRay REMUX 2160p HEVC Atmos TrueHD 7.1-PTer.mkv","itemName":"复仇者联盟2:奥创纪元","notLocal":false}
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: notLocal: false
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: mount emby file path: /alist/115/media/电影/复仇者联盟2:奥创纪元 (2015)/Avengers Age of Ultron 2015 UHD BluRay REMUX 2160p HEVC Atmos TrueHD 7.1-PTer.mkv
medialinker | 2024/07/25 13:31:25 [info] 27#27: *5 js: getRouteMode proxyRules: [["115-local","r.args.X-Emby-Client",0,["Emby Web","Emby for iOS","Infuse"]],["115-local","filePath",0,"/alist/115"]]
medialinker | 2024/07/25 13:31:25 [info] 27#27: *5 js: getMatchedRuleGroupKey groupRuleArr3D: [["115-local","r.args.X-Emby-Client",0,["Emby Web","Emby for iOS","Infuse"]],["115-local","filePath",0,"/alist/115"]]
medialinker | 2024/07/25 13:31:25 [info] 27#27: *5 js: getMatchedRuleGroupKey ruleArr3D: [["r.args.X-Emby-Client",0,["Emby Web","Emby for iOS","Infuse"]],["filePath",0,"/alist/115"]]
medialinker | 2024/07/25 13:31:25 [info] 27#27: *5 js: Property "X-Emby-Client" not found in object,will ignore
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: sourceStrValue, r.args.X-Emby-Client =
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: getRouteMode: redirect
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: mediaPathMapping: [[0,0,"/alist",""],[1,0,"http://example:port/d"]]
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: strMapping replace: /alist =>
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: strMapping append: http://example:port/d
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: mapped emby file path: http://example:port/d/115/media/电影/复仇者联盟2:奥创纪元 (2015)/Avengers Age of Ultron 2015 UHD BluRay REMUX 2160p HEVC Atmos TrueHD 7.1-PTer.mkv
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: sign data: /115/media/电影/复仇者联盟2:奥创纪元 (2015)/Avengers Age of Ultron 2015 UHD BluRay REMUX 2160p HEVC Atmos TrueHD 7.1-PTer.mkv:0
medialinker | 2024/07/25 13:31:25 [warn] 27#27: *5 js: redirect to: http://example:port/d/115/media/电影/复仇者联盟2:奥创纪元 (2015)/Avengers Age of Ultron 2015 UHD BluRay REMUX 2160p HEVC Atmos TrueHD 7.1-PTer.mkv?sign=?=:0
const mediaPathMapping = [
// [0, 0, "/mnt/aliyun-01", "/mnt/aliyun-02"],
// [0, 2, "http:", "https:"],
// [0, 2, ":5244", "/alist"],
// [0, 0, "D:", "F:"],
// [0, 0, /blue/g, "red"], // 此处正则不要加引号
[1, 0, `${alistPublicAddr}/d`],
// [2, 2, "?xxx"],
];
const redirectStrmLastLinkRule = [
// [0, strHead.lanIp.map(s => "http://" + s)],
// [0, alistAddr],
// [0, "http:"],
// 参数3: 请求验证类型,当前 alistAddr 不需要此参数
// 参数4: 当前 alistAddr 不需要此参数,alistSignExpireTime
// [0, "http://otheralist1.com", "sign", `${alistToken}:${alistSignExpireTime}`],
];
// 指定客户端自己请求并获取 alist 直链的规则,代码优先级在 redirectStrmLastLinkRule 之后
// 特殊情况使用,则此处必须使用域名且公网畅通,用不着请保持默认
// 参数1: 0: startsWith(str), 1: endsWith(str), 2: includes(str), 3: match(/ain/g)
// 参数2: 匹配目标,对象为 Alist 接口返回的链接 raw_url
// 参数3: 指定转发给客户端的 alist 的 host 前缀,兼容 sign 参数
const cilentSelfAlistRule = [
// "Emby for iOS"和"Infuse"对于 115 的进度条拖动依赖于此
// 如果 nginx 为 https,则此 alist 也必须 https,浏览器行为客户端会阻止非 https 请求
[2, strHead["115"], alistPublicAddr],
// [2, strHead.ali, alistPublicAddr],
];
const routeRule = [
["115-local", "r.args.X-Emby-Client", 0, ["Emby Web", "Emby for iOS", "Infuse"]],
["115-local", "filePath", 0, "/alist/115"],
];
sourceStrValue, r.args.X-Emby-Client =
倒不是冲突了,Infuse 这个标头也没传递,不过不重要,是 emby 私有的标头,需要更换为 User-Agent 参数识别客户端类型
const routeRule = [
["115-local", "r.headersIn.User-Agent", 0, ["Infuse"]],
["115-local", "filePath", 0, "/alist/115"],
];
注意 User-Agent 的值内容和 X-Emby-Client 值大不相同,部分 UA 可参考 emby2Alist\nginx\conf.d\config\UA.txt https://github.com/bpking1/embyExternalUrl/blob/main/emby2Alist/nginx/conf.d/config/UA.txt
谢谢 infuse即使是走中转进度条似乎也完全不怎么好用。我在想能否有曲线救国的办法,在播放设备上搭建一个代理服务,对发送到115服务器的流量进行整流。不知道这样是否可行
这样是可行的,但是不清楚对于 Infuse 进度条拖动 问题能不能避免,这里有一个简单点儿的测试方案,alist 上对 115 专门建一个 alias 别名来设置为 alist 的代理中转流量,或者再添加一个 115 驱动选代理也行,使用脚本中的 mediaPathMapping 路径映射进行字符串替换到新的代理中转 alist 入口上,假如进度条没问题,再考虑 在播放设备上搭建一个代理服务 ,alist 安卓版,或者 IOS 的第三方代理 VPN 也可以写脚本,当然后续这些操作比较费时间了
试了一下 alist打开web代理还是不可以 情况是差不多的 infuse还是一直在请求alist的连接。 alist代理跟302一样 都是只支持两个线程,多余线程被关闭之后infuse会反复请求。 不过把alist连接直接粘贴到infuse里面情况还是会好转一些,虽然进度条加载还是很慢,但报错的几率小了不少。
那感觉确实和 115 有些关系了,任何账户只支持单任务 2 个线程这个我之前用 IDM 验证过了,Infuse 默认多线程并发加载好心办坏事了,因为其余几乎所有的播放器都只支持单线程加载,如果 Infuse 官方能给出一个加载线程数的设置就好了,不过暂时没实际验证到底是否是 Infuse 加载线程数 > 2 造成的,这个虽然可以用 nginx 的反代中转流量 conf 中加限制条件测试下, 只能是中转流量时才能限制生效,302 重定向是没法限制的,不过具体指令我没试过,
以下是 AI 的回答引用
http {
# 创建一个连接限制区,用于跟踪每个IP地址的连接数
limit_conn_zone $binary_remote_addr zone=mylimit:10m;
server {
listen 80;
server_name example.com;
location /streaming {
# 限制每个IP地址的并发连接数为2
limit_conn mylimit 2;
# 其他流媒体相关的配置
...
}
}
}
在讨论多线程下载时,我们通常指的是客户端(如浏览器或下载管理器)同时从服务器发起多个连接以加速下载的情况。例如,当使用迅雷、IDM(Internet Download Manager)或其他支持多线程下载的工具时,这些工具会将一个大文件分割成多个小块,然后同时下载这些小块以提高下载速度。
Nginx 中的 limit_conn 配置正是用来控制这种多线程下载的并发连接数的。当你设置了 limit_conn 后,对于每一个唯一的客户端 IP 地址,Nginx 将限制同时存在的连接数。这意味着,即使客户端尝试打开更多的连接,Nginx 也会拒绝超出限制的额外连接请求,从而有效地控制了多线程下载的并发度。
例如,如果 limit_conn 设置为 5,那么来自同一个 IP 地址的客户端最多只能同时维持 5 个连接。如果客户端尝试开启更多的连接,Nginx 将返回一个错误或等待现有连接关闭后才允许新的连接。
这有助于防止服务器资源被过多的并发连接耗尽,尤其是在带宽有限或服务器处理能力有限的情况下。同时,它还可以确保公平地分配资源给所有用户,避免单个用户过度占用资源。
昨天拷打了一会ai,用py写了个临时的限流工具,对infuse还是没有帮助。他好像不会像多线程下载器一样根据服务器的限制调节线程数量、、、暂时只能自适应了
用mac版infuse播放视频,拖动进度条时经常失败
查看日志发现拖动进度条后infuse会反复访问alist的直链地址,直到成功加载视频。
多次拖动进度条大概率会播放失败。同时过高的访问频率会被115拉几秒小黑屋,表现为浏览器输入直链也无法下载视频。
局域网 公网播放都有这个问题 公网播放失败的概率更大一些
alistAddr和alistPublicAddr都填了域名+ip
日志如下