修复当前播放的音乐记录置底

This commit is contained in:
mtvpls
2026-05-15 09:31:08 +08:00
parent ac765eff78
commit cef7f73ce0
5 changed files with 15 additions and 9 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ function toHistoryRecord(input: any, previous?: MusicV2HistoryRecord): MusicV2Hi
lastPlayedAt: Number(input.lastPlayedAt ?? input.last_played_at ?? now),
playCount: Number(input.playCount ?? input.play_count ?? ((previous?.playCount || 0) + 1)),
lastQuality: input.lastQuality || input.last_quality || previous?.lastQuality,
createdAt: Number(input.createdAt ?? input.created_at ?? previous?.createdAt ?? now),
createdAt: Number(previous?.createdAt ?? input.createdAt ?? input.created_at ?? now),
updatedAt: now,
};
}
+9 -4
View File
@@ -407,6 +407,7 @@ export default function MusicPage() {
playProgressSec: playTime,
lastPlayedAt,
lastQuality: quality,
createdAt: record.timestamp,
}),
});
};
@@ -743,6 +744,7 @@ export default function MusicPage() {
lastPlayedAt: baseTime + i,
playCount: 1,
lastQuality: quality,
createdAt: baseTime + i,
}));
await fetch('/api/music/v2/history', {
@@ -930,6 +932,7 @@ export default function MusicPage() {
lastPlayedAt: baseTime + i,
playCount: 1,
lastQuality: quality,
createdAt: baseTime + i,
}));
// 一次性批量添加所有歌曲
@@ -1131,8 +1134,10 @@ export default function MusicPage() {
setShowPlayer(true);
setLyrics([]); // 清空旧歌词
// 添加到播放记录和播放列表
const record: PlayRecord = {
// 添加到播放记录和播放列表。timestamp 表示入队时间,不能在再次播放时刷新,
// 否则会破坏按 createdAt/timestamp 维护的播放队列顺序。
const existingRecord = playRecords.find(r => r.platform === platform && r.id === song.id);
const record: PlayRecord = existingRecord || {
platform: platform,
id: song.id,
playTime: 0, // 初始播放时间
@@ -1146,11 +1151,11 @@ export default function MusicPage() {
setPlayRecords(prev => {
const existingIndex = prev.findIndex(r => r.platform === record.platform && r.id === record.id);
if (existingIndex >= 0) {
// 记录已存在,更新时间戳但不重置播放时间
// 记录已存在:保持原位置和原 timestamp,只补齐可能变化的时长信息。
const updated = [...prev];
updated[existingIndex] = {
...updated[existingIndex],
timestamp: Date.now(),
duration: updated[existingIndex].duration || song.duration || 0,
};
return updated;
} else {
+1 -1
View File
@@ -749,7 +749,7 @@ export class D1Storage implements IStorage {
try {
const results = await this.db
// 按队列顺序返回;当前播放项由最大 last_played_at 决定
.prepare('SELECT * FROM music_v2_history WHERE username = ? ORDER BY created_at ASC, last_played_at ASC')
.prepare('SELECT * FROM music_v2_history WHERE username = ? ORDER BY created_at ASC, id ASC')
.bind(userName)
.all();
+1 -1
View File
@@ -1404,7 +1404,7 @@ export class PostgresStorage implements IStorage {
try {
const results = await this.db
// 按队列顺序返回;当前播放项由最大 last_played_at 决定
.prepare('SELECT * FROM music_v2_history WHERE username = $1 ORDER BY created_at ASC, last_played_at ASC')
.prepare('SELECT * FROM music_v2_history WHERE username = $1 ORDER BY created_at ASC, id ASC')
.bind(userName)
.all();
+3 -2
View File
@@ -807,11 +807,12 @@ export abstract class BaseRedisStorage implements IStorage {
return Object.values(rows || {})
.filter(Boolean)
.map(value => JSON.parse(value as string) as MusicV2HistoryRecord)
// 按队列顺序返回;当前播放项由最大 lastPlayedAt 决定
// 按队列顺序返回;当前播放项由最大 lastPlayedAt 决定
// createdAt 相同时使用歌曲标识做稳定兜底,避免最近播放时间把歌曲顶到队尾。
.sort((a, b) => {
const createdAtDiff = (a.createdAt || 0) - (b.createdAt || 0);
if (createdAtDiff !== 0) return createdAtDiff;
return (a.lastPlayedAt || 0) - (b.lastPlayedAt || 0);
return `${a.source}:${a.songId}`.localeCompare(`${b.source}:${b.songId}`);
});
}