Thanks to visit codestin.com
Credit goes to github.com

Skip to content

改进建议:为预加载 URL 添加过期保护机制 #1048

@MissKisser

Description

@MissKisser

问题描述

长时间不操作应用后,点击"下一曲"会提示播放错误并自动跳转到下一首,但点击"上一曲"却能正常播放。

问题分析

根本原因:预加载 URL 过期机制缺失

播放器有预加载下一首歌曲 URL 的功能(nextPrefetch),但当前实现存在以下问题:

步骤 场景 结果
1 播放歌曲 A 成功 预加载歌曲 B 的 URL,存储在 nextPrefetch
2 长时间不操作(如 20 分钟) 网易云音乐 URL 过期失效
3 点击"下一曲" getAudioSource() 发现 ID 匹配,直接使用过期 URL
4 播放失败 错误处理清除缓存,重试或跳转

为什么"上一曲"能正常播放?

点击"上一曲"时,歌曲 ID 与预加载缓存不匹配,因此会重新获取新鲜的 URL,而不是使用过期的缓存。

API 返回数据

网易云 /song/url/v1 API 返回的 expi 字段表示 URL 有效时间(通常为 1200 秒 = 20 分钟):

{
  "data": [{
    "id": 1901371647,
    "url": "http://m702.music.126.net/...",
    "expi": 1200,  // URL 有效时间(秒)
    ...
  }]
}

代码位置

文件 行号 问题
SongManager.ts 52 nextPrefetch 类型无时间戳字段
SongManager.ts 350-470 prefetchNextSong 不保存获取时间或过期时间
SongManager.ts 515-523 使用缓存时无过期检查
PlayerController.ts 973-1010 nextOrPrev 切歌时不清除缓存

相关文件

  • src/core/player/SongManager.ts
  • src/core/player/PlayerController.ts

感谢您的开源项目!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions