修复关系型数据库保存音乐记录错误,播放记录修改为队列式

This commit is contained in:
mtvpls
2026-05-09 10:25:39 +08:00
parent 2480b4d28b
commit a8cacf3e60
6 changed files with 54 additions and 14 deletions
+2
View File
@@ -25,6 +25,8 @@ export async function GET(request: NextRequest) {
if (!username) return unauthorized();
try {
// 注意:records 按“播放队列顺序”返回(createdAt ASC),
// 前端再基于 lastPlayedAt 定位当前播放项。
const records = await db.listMusicV2History(username);
return NextResponse.json({ success: true, data: { records } });
} catch (error) {
+38 -9
View File
@@ -50,6 +50,7 @@ interface DbRecord {
id: string;
playProgressSec: number;
durationSec: number;
createdAt: number;
lastPlayedAt: number;
name: string;
artist: string;
@@ -243,7 +244,13 @@ export default function MusicPage() {
setResolvingCount((prev) => Math.max(0, prev - 1));
};
const saveHistoryRecord = async (record: PlayRecord, song: Song, playTime: number, totalDuration: number) => {
const saveHistoryRecord = async (
record: PlayRecord,
song: Song,
playTime: number,
totalDuration: number,
lastPlayedAt = Date.now()
) => {
await fetch('/api/music/v2/history', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
@@ -260,12 +267,24 @@ export default function MusicPage() {
durationText: song.durationText,
},
playProgressSec: playTime,
lastPlayedAt: Date.now(),
lastPlayedAt,
lastQuality: quality,
}),
});
};
const saveHistoryRecordSafely = (
record: PlayRecord,
song: Song,
playTime = 0,
totalDuration = 0,
lastPlayedAt?: number
) => {
saveHistoryRecord(record, song, playTime, totalDuration, lastPlayedAt).catch(err => {
console.error('保存播放记录到数据库失败:', err);
});
};
// 保存播放状态到 localStorage
const savePlayState = () => {
if (!currentSong) return;
@@ -308,15 +327,17 @@ export default function MusicPage() {
const history = await response.json();
const dbRecords = (history.data?.records || []) as DbRecord[];
const sortedRecords: PlayRecord[] = dbRecords.map((record) => ({
const queueRecords = dbRecords;
const sortedRecords: PlayRecord[] = queueRecords.map((record) => ({
platform: record.source,
id: record.songId,
playTime: record.playProgressSec,
duration: record.durationSec || 0,
timestamp: record.lastPlayedAt,
timestamp: record.createdAt || record.lastPlayedAt || 0,
}));
const sortedSongs: Song[] = dbRecords.map((record) => ({
const sortedSongs: Song[] = queueRecords.map((record) => ({
id: record.songId,
name: record.name,
artist: record.artist,
@@ -351,12 +372,17 @@ export default function MusicPage() {
if (sortedRecords.length > 0) {
const proxyEnabled = getMusicProxyEnabled();
setMusicProxyEnabled(proxyEnabled);
const latestDbRecord = sortedRecords[0];
const latestDbSong = sortedSongs[0];
const latestIndex = queueRecords.reduce((bestIndex, record, index) => {
if (bestIndex < 0) return index;
return (record.lastPlayedAt || 0) > (queueRecords[bestIndex].lastPlayedAt || 0) ? index : bestIndex;
}, -1);
const activeIndex = latestIndex >= 0 ? latestIndex : 0;
const latestDbRecord = sortedRecords[activeIndex];
const latestDbSong = sortedSongs[activeIndex];
// 使用数据库的歌曲信息
setCurrentSong(latestDbSong);
setPlaylistIndex(0);
setPlaylistIndex(activeIndex);
setShowPlayer(true);
// 从数据库恢复播放进度
@@ -646,6 +672,7 @@ export default function MusicPage() {
setPlayRecords((prev) => [...prev, record]);
setPlaylist((prev) => [...prev, { ...song, platform }]);
saveHistoryRecordSafely(record, { ...song, platform }, 0, song.duration || 0, 0);
setToast({
message: '已加入稍后播放',
type: 'success',
@@ -941,7 +968,7 @@ export default function MusicPage() {
platform: platform,
id: song.id,
playTime: 0, // 初始播放时间
duration: 0, // 将在音频加载后更新
duration: song.duration || 0, // 将在音频加载后更新
timestamp: Date.now(),
};
@@ -973,6 +1000,8 @@ export default function MusicPage() {
}
});
saveHistoryRecordSafely(record, { ...song, platform }, 0, song.duration || 0);
if (proxyEnabled) {
const streamUrl = buildStreamUrl(song, platform, quality);
setCurrentSongUrl(streamUrl);