From cef7f73ce0fe4668389736e17f672b9aec88ea03 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Fri, 15 May 2026 09:31:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=93=E5=89=8D=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E7=9A=84=E9=9F=B3=E4=B9=90=E8=AE=B0=E5=BD=95=E7=BD=AE?= =?UTF-8?q?=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/music/v2/history/route.ts | 2 +- src/app/music/page.tsx | 13 +++++++++---- src/lib/d1.db.ts | 2 +- src/lib/postgres.db.ts | 2 +- src/lib/redis-base.db.ts | 5 +++-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/app/api/music/v2/history/route.ts b/src/app/api/music/v2/history/route.ts index 68de61d..c500af2 100644 --- a/src/app/api/music/v2/history/route.ts +++ b/src/app/api/music/v2/history/route.ts @@ -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, }; } diff --git a/src/app/music/page.tsx b/src/app/music/page.tsx index 58dc3a6..7e64d59 100644 --- a/src/app/music/page.tsx +++ b/src/app/music/page.tsx @@ -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 { diff --git a/src/lib/d1.db.ts b/src/lib/d1.db.ts index efc3004..7e1acda 100644 --- a/src/lib/d1.db.ts +++ b/src/lib/d1.db.ts @@ -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(); diff --git a/src/lib/postgres.db.ts b/src/lib/postgres.db.ts index 4399a03..8131653 100644 --- a/src/lib/postgres.db.ts +++ b/src/lib/postgres.db.ts @@ -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(); diff --git a/src/lib/redis-base.db.ts b/src/lib/redis-base.db.ts index f8a7b0e..0cacd90 100644 --- a/src/lib/redis-base.db.ts +++ b/src/lib/redis-base.db.ts @@ -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}`); }); }