音乐数据导入导出

This commit is contained in:
mtvpls
2026-02-02 14:27:25 +08:00
parent 68b1332df1
commit a447a41920
3 changed files with 72 additions and 0 deletions

View File

@@ -94,6 +94,17 @@ export async function POST(req: NextRequest) {
continue;
}
// 获取用户的所有歌单
const playlists = await db.getUserMusicPlaylists(username);
const playlistsWithSongs = [];
for (const playlist of playlists) {
const songs = await db.getPlaylistSongs(playlist.id);
playlistsWithSongs.push({
...playlist,
songs
});
}
const userData = {
// 播放记录
playRecords: await db.getAllPlayRecords(username),
@@ -103,6 +114,10 @@ export async function POST(req: NextRequest) {
searchHistory: await db.getSearchHistory(username),
// 跳过片头片尾配置
skipConfigs: await db.getAllSkipConfigs(username),
// 音乐播放记录
musicPlayRecords: await db.getAllMusicPlayRecords(username),
// 音乐歌单(包含歌曲)
musicPlaylists: playlistsWithSongs,
// V2用户的加密密码
passwordV2: finalPasswordV2
};

View File

@@ -225,6 +225,44 @@ export async function POST(req: NextRequest) {
}
}
}
// 导入音乐播放记录
if (user.musicPlayRecords) {
for (const [key, record] of Object.entries(user.musicPlayRecords)) {
const [platform, id] = key.split('+');
if (platform && id) {
await db.saveMusicPlayRecord(username, platform, id, record as any);
}
}
}
// 导入音乐歌单
if (user.musicPlaylists && Array.isArray(user.musicPlaylists)) {
for (const playlist of user.musicPlaylists) {
// 创建歌单
await db.createMusicPlaylist(username, {
id: playlist.id,
name: playlist.name,
description: playlist.description,
cover: playlist.cover,
});
// 导入歌单中的歌曲
if (playlist.songs && Array.isArray(playlist.songs)) {
for (const song of playlist.songs) {
await db.addSongToPlaylist(playlist.id, {
platform: song.platform,
id: song.id,
name: song.name,
artist: song.artist,
album: song.album,
pic: song.pic,
duration: song.duration || 0,
});
}
}
}
}
}
console.log(`成功导入 ${importedCount} 个用户的user:info`);

View File

@@ -865,6 +865,25 @@ export abstract class BaseRedisStorage implements IStorage {
if (skipConfigKeys.length > 0) {
await this.withRetry(() => this.adapter.del(skipConfigKeys));
}
// 删除音乐播放记录
await this.withRetry(() => this.adapter.del(this.musicPlayRecordHashKey(userName)));
// 删除用户的所有歌单
const playlistIds = await this.withRetry(() =>
this.adapter.zRange(this.musicPlaylistsKey(userName), 0, -1)
);
if (playlistIds && playlistIds.length > 0) {
for (const playlistId of playlistIds) {
const id = ensureString(playlistId);
// 删除歌单信息
await this.withRetry(() => this.adapter.del(this.musicPlaylistKey(id)));
// 删除歌单的歌曲列表
await this.withRetry(() => this.adapter.del(this.musicPlaylistSongsKey(id)));
}
}
// 删除用户的歌单列表
await this.withRetry(() => this.adapter.del(this.musicPlaylistsKey(userName)));
}
// ---------- 新版用户存储使用Hash和Sorted Set ----------