Skip to content

播放已下载歌曲时希望优先使用本地文件 #365

Closed

Description

@OMSociety

检查清单

  • 我已检索过仓库中现有的 Issues / Discussions,确保没有相同或极为相似的功能建议
  • 我已经详细思考了该功能的合理性与使用场景,并在下方进行了清晰描述

功能描述

希望新增「播放时优先使用已下载文件」的能力,建议做成设置开关、默认关闭:

  • 播放一首歌时,如果下载记录中存在这首歌已完成且有落盘文件的记录,就直接播放该本地文件,不再联网解析音频地址;
  • 命中的判定用下载记录里已经保存的歌曲 source + id 与当前曲目直接对应,不需要按标题、歌手或时长做模糊匹配;
  • 新增设置项「优先播放已下载文件」,默认关闭;关闭时保持现有行为完全不变;
  • 命中后不再走联网解析这一步,在线歌单本身的加载仍需联网,但已加载曲目可以播放本地文件。

现状核对(基于 dev 分支源码):

  • 播放侧的音频地址解析入口是 src/services/audioSource.ts 的 resolveTrackSource(),顺序为「本地文件 → 歌曲缓存 → 流媒体 / 在线平台」,其中不查下载记录;
  • 播放使用的「歌曲缓存」与「下载」是两套相互独立的机制:前者的文件放在缓存目录的 songs 子目录下(electron/main/utils/config.ts 的 getSongCacheDir()),设置项 settings.enableSongCache 的说明是「播放在线歌曲时缓存至本地,提升加载速度」,默认关闭;后者的目录由用户在「下载目录」里自选;
  • 下载记录(DownloadTask)里已经保存了 track.source、track.id 与 filePath,所以「这首歌是否已有本地文件」是查得到的,只是播放链路没有使用它;
  • 目前唯一会播放下载文件的地方是「下载」页:src/components/list/DownloadList.vue 在播放已完成任务时把任务转成 source: "local" 的曲目再交给播放器。也就是说,同一首歌从下载页播放会读取本地文件,而从歌单、搜索结果、收藏等位置播放会重新联网拉流。

使用场景与价值

  • 下载过的歌曲,从歌单、搜索结果、收藏、播放历史里点开时仍会重新联网解析并拉一次流,重复消耗流量;对带宽有限、按流量计费或使用移动网络的场景影响明显;
  • 由于播放链路不查下载记录,用户也无从判断某首歌是否已经下载过(这一点与 侧栏歌单、已下载歌曲右键菜单增加「复制本地文件」 #358 中提到的困惑相关)。

替代方案或补充说明

  • 另一个可选思路是把下载目录当作「本地音乐库」扫描建索引、再按元信息匹配。相比之下载记录里已经有 source + id,直接查记录即可精确命中,不必扫描目录也无需模糊匹配,改动面小得多,建议优先考虑这一种;
  • 如果方向认可,我可以照此提 PR。

Activity

  1. github-actions commented on Oct 10, 2026

    @github-actions

    👋 @OMSociety

    感谢提交 Issue!我们已经收到您的反馈,会尽快确认您的问题。

    Thanks for opening this issue! We have received your report and will review it as soon as possible.

  2. github-actions commented on Oct 11, 2026

    @github-actions

    🎉 @OMSociety

    感谢您的反馈!该问题已修复,并将在当前开发版或下一个正式版中生效。
    若您仍能复现该问题,欢迎重新提交新的 Issue。

    Thanks for your report! This issue has been resolved and will be available in the current dev build or next stable release.
    If you can still reproduce this problem, please open a new issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    resolvedFixed, pending release新功能新功能建议或改进 / Feature request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions