Skip to content

fnmusic-ext 2.6.3

Latest

Choose a tag to compare

@github-actions github-actions released this 30 Sep 08:23

修复

  • 第三方音源(墨澜/星海等)搜索超时与无结果修复(新增逐曲探活可选控制):
    1. 搜索性能优化(毫秒级直出):解决第三方音源在搜索阶段因并发解析直链与网络探活导致 12s 超时(search deadline exceeded)以及频繁触发熔断导致全平台搜不出歌曲的问题。新增 逐曲探活(beta) 开关(默认关闭),关闭时搜索候选曲目跳过直链解析与 Range 探活,单次搜索耗时从 12 秒降至 30 毫秒,并在播放时按需解析真实音频流;
    2. 代理层放行收费曲目:逐曲探活关闭时,代理层对来自第三方音源的搜索候选曲目豁免 VIP/收费元数据拦截(同时严格保留试听、坏链接与无音频流等真不可播防御),使 VIP/版权曲目能够正常展示并在点播时交由用户源解析;
    3. WebUI 体验优化:新增「搜索」独立菜单页(置于播放与推荐下方),移入搜索超时设置并提供逐曲探活开关及作用说明;清理「音乐源」页面过期的切换描述文案。
  • 转码下载文件接口报 500(UnicodeEncodeError):下载曲库歌曲或透传官方转码任务时,官方后端在 Content-Disposition 响应头中携带原始非 ASCII(中文)文件名;代理拦截层依赖的 Starlette 框架在处理 HTTP 响应头时无条件使用 Latin-1 编码,触发 UnicodeEncodeError 导致代理对外直接报错 500;http error。现增加响应头安全规范化处理(_sanitize_content_disposition),将中文文件名规范化为标准 RFC 6266/5987 格式(ASCII 安全回退 + filename*=UTF-8''),并确保代理自发文件交付时同样附带标准格式,彻底杜绝响应头非 Latin-1 导致的 500 异常。
  • 音源无损档交付损坏数据导致"转码下载失败":飞牛音乐 App 在转码或下载时,若曲库中对应歌曲文件损坏,官方后端解码器会报 errno 68157441 transcoding error 导致下载进度卡在 0% 或直接失败。经排查,部分音源(如酷我官方 CDN)无损档(FLAC)近期交付了文件头正常但正文含坏帧的不可解码数据,此前代理只校验 HTTP 状态码与文件大小便写入曲库,导致官方转码器无法处理。现建立三层防护机制:
    1. 音源服务头探针与自动降级:音源服务在输出无损音频直链时,取前 3MB 数据流做 ffmpeg 解码探针,探针失败判定为损坏流,自动走官方接口强制降级为干净的 MP3(320kbps)音频流。
    2. 代理入库前全量解码校验与回退:代理后台完整抓取(_full_fetch_download)或边听边存(_tee_finalize)无损文件落盘前,使用 ffmpeg 进行全量解码校验,校验失败立即拦截入库并自动重试拉取 MP3 档位,确保曲库中绝不写入坏文件。
    3. 坏流曲目拉黑机制:被判定为损坏的在线曲目加入内存黑名单(6 小时有效),后续直接使用 MP3 档位请求,避免死循环。
  • App 音质偏好选"标准"后在线歌曲无法播放:飞牛音乐 App 把音质偏好设为"标准"后,播放器不再直拉歌曲原文件,改向服务端要转码后的低码率 HLS 流(fMP4/AAC 分片);代理此前只回一个"假"的转码应答——播放列表里唯一的分片仍指向原始大文件,既不省流量,音源关闭(如只启用 musicdl 时播网易歌曲)还会直接 404 跳歌。现由宿主机 ffmpeg 把在线曲目实时转成真正的 AAC/fMP4 分片流(默认 128kbps、10 秒/片,可经 FNMUSIC_TRANSCODE_* 环境变量调整、改 .env 热生效),同一首歌转码完成后缓存复用(配额 512MB、最久未用先清),并支持 App 的心跳保活与停止转码;边听边存照常在后台保存原文件。ffmpeg 不可用或音源临时失效时自动回落旧行为,不影响播放。
  • App 音质偏好选"标准"后下载失败:App 的下载同样走转码协议(先建任务、轮询进度、再取文件),官方后端不认识代理的在线歌曲 id,请求透传官方必然失败。现代理对在线歌曲按官方协议的实测形状仿真(任务号 downloadId、状态 waiting/transcoding/ready、进度 percent):标准档交付 MP3 320kbps 转码文件(与官方"标准"档一致;源已是 MP3 时直接供原文件不做有损重编码),原始档直接交付已下载的原文件,均支持断点续传;下载本地歌曲、或任何代理不认识的下载任务,一律原样透传官方,行为零变化。
  • 已下载的在线歌曲偶发重新出网:边听边存完成后会在缓存里记一条指向曲库文件的引用,个别情况下该引用丢失,再次播放同一首歌时会重新从源站下载、曲库出现重复文件。现引用写入后立即回读校验;即便引用丢失,也会按"歌名+歌手(+专辑)"在飞牛曲库反查并自动补回——音源已关闭也能直接播已落库的本地文件,不再出网、不产生重复文件。
  • 偶发上游连接失败导致请求报错:官方服务重启窗口内的陈旧连接会让紧接着的 GET/HEAD 透传瞬时失败(表现为封面、歌曲信息偶发加载出错)。现此类"还没换来任何响应"的连接级失败对幂等请求自动重试一次;已经开始输出内容的请求不重试,避免重复扣减。

变更

  • FNMUSIC_TRACE_FORWARD 抓包日志恢复可见:开启 trace_forward 后子进程会打印 download/* 双向报文([dl-capture] 前缀),用于 App 下载协议对齐取证;但守护层(takeover)的日志白名单未放行该前缀,日志实际到不了系统日志。现白名单放行 [dl-capture] 固定格式(限 600 可打印字符),远程排查 App 下载问题时抓包日志可正常留存。

安全

  • 数据目录与配置备份权限收紧:存放网易登录凭据的 sources-data 数据目录此前安装/升级后被统一放开为 0755,本机其他用户可直接读取网易云音乐登录 Cookie;现安装与升级统一将其收紧为仅运行账户可访问(目录 0700、文件 0600,属主对齐容器运行账户,不影响容器读写)。管理页保存配置时生成的 .env.webui.bak 备份(含 API Key)此前按默认权限 0644 落盘,现与 .env 本体一致收紧为 0600。