From 97533cd4aa6c75c8b298588a12031cda400c2623 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 10 Jun 2026 09:24:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=A8=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B=E6=B7=BB=E5=8A=A0=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E3=80=81=E6=AD=8C=E6=9B=B2=E6=97=B6=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=BF=9D=E5=AD=98=E7=9A=84=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88#2842?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + .../worker/dbService/modules/list/dbHelper.ts | 12 +++++++++ .../worker/dbService/modules/list/index.ts | 26 ++++++++++++++++--- .../dbService/modules/list/statements.ts | 11 ++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 5025c257..86e4252d 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -10,3 +10,4 @@ - 修复某些情况下开放 API 获取到的音量为 0 的问题 (#2790) - 修复 mg 图片、歌词获取 - 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000) +- 修复在某些情况下添加歌曲时可能导致保存的歌曲顺序不对的问题(#2842) diff --git a/src/main/worker/dbService/modules/list/dbHelper.ts b/src/main/worker/dbService/modules/list/dbHelper.ts index e0bd9360..dd6387ed 100644 --- a/src/main/worker/dbService/modules/list/dbHelper.ts +++ b/src/main/worker/dbService/modules/list/dbHelper.ts @@ -17,6 +17,7 @@ import { createMusicInfoOrderClearStatement, createMusicInfoByListAndMusicInfoIdQueryStatement, createMusicInfoByMusicInfoIdQueryStatement, + createMusicInfoOrderStatement, } from './statements' const idFixRxp = /\.0$/ @@ -368,3 +369,14 @@ export const overwriteListData = (lists: LX.DBService.UserListInfo[], musicInfos })(lists, musicInfos) } + +/** + * 获取列表内音乐的排序 + * @param listId 列表id + * @param musicInfoId 音乐id + * @returns 音乐排序信息 + */ +export const getMusicInfoOrder = (listId: string, musicInfoId: string) => { + const musicInfoOrderStatement = createMusicInfoOrderStatement() + return musicInfoOrderStatement.get({ listId, musicInfoId }) +} diff --git a/src/main/worker/dbService/modules/list/index.ts b/src/main/worker/dbService/modules/list/index.ts index 63615ee3..8f283d8f 100644 --- a/src/main/worker/dbService/modules/list/index.ts +++ b/src/main/worker/dbService/modules/list/index.ts @@ -18,10 +18,12 @@ import { updateMusicInfoOrder, updateMusicInfos, updateUserLists as updateUserListsFromDB, + getMusicInfoOrder, } from './dbHelper' let userLists: LX.DBService.UserListInfo[] let musicLists = new Map() +let rawPoss = new Map() const toDBMusicInfo = (musicInfos: LX.Music.MusicInfo[], listId: string, offset: number = 0): LX.DBService.MusicInfo[] => { return musicInfos.map((info, index) => { @@ -41,8 +43,10 @@ const toDBMusicInfo = (musicInfos: LX.Music.MusicInfo[], listId: string, offset: export const getAllUserList = (): LX.List.UserListInfo[] => { userLists ??= queryAllUserList() + rawPoss.clear() return userLists.map(list => { const { position, ...newList } = list + rawPoss.set(list.id, position) return newList }) } @@ -55,10 +59,15 @@ export const getAllUserList = (): LX.List.UserListInfo[] => { export const createUserLists = (position: number, lists: LX.List.UserListInfo[]) => { userLists ??= queryAllUserList() if (position < 0 || position >= userLists.length) { + // 如果是最末尾,那么取最后一个列表的原始位置 + 1 作为新列表的原始位置,否则新列表的原始位置为 position + // 因为原始 pos 可能比 userLists.length 大,所以不能直接用 userLists.length 作为新列表的原始位置 + const order = userLists.length ? (rawPoss.get(userLists.at(-1)!.id) ?? userLists.length) + 1 : 0 const newLists: LX.DBService.UserListInfo[] = lists.map((list, index) => { + const pos = order + index + rawPoss.set(list.id, pos) return { ...list, - position: position + index, + position: pos, } }) insertUserLists(newLists) @@ -72,6 +81,8 @@ export const createUserLists = (position: number, lists: LX.List.UserListInfo[]) }) insertUserLists(newUserLists, true) userLists = newUserLists + rawPoss.clear() + for (const list of userLists) rawPoss.set(list.id, list.position) } } @@ -97,6 +108,7 @@ export const createUserLists = (position: number, lists: LX.List.UserListInfo[]) export const removeUserLists = (ids: string[]) => { deleteUserLists(ids) userLists &&= queryAllUserList() + for (const id of ids) rawPoss.delete(id) } /** @@ -147,6 +159,8 @@ export const updateUserListsPosition = (position: number, ids: string[]) => { }) insertUserLists(newUserLists, true) userLists = newUserLists + rawPoss.clear() + for (const list of userLists) rawPoss.set(list.id, list.position) } /** @@ -210,10 +224,14 @@ export const musicsAdd = (listId: string, musicInfos: LX.Music.MusicInfo[], addM arrUnshift(targetList, musicInfos) break case 'bottom': - default: - insertMusicInfoList(toDBMusicInfo(musicInfos, listId, targetList.length)) + default: { + // 如果是添加到最后,那么取最后一个歌曲的原始位置 + 1 作为新歌曲的原始位置,否则新歌曲的原始位置为 position + // 因为原始 pos 可能比 targetList.length 大,所以不能直接用 targetList.length 作为新歌曲的原始位置 + const order = targetList.length ? (getMusicInfoOrder(listId, targetList.at(-1)!.id)?.order ?? targetList.length) + 1 : 0 + insertMusicInfoList(toDBMusicInfo(musicInfos, listId, order)) arrPush(targetList, musicInfos) break + } } } @@ -363,6 +381,8 @@ export const listDataOverwrite = (myListData: MakeOptional { } +/** + * 创建根据列表Id与音乐id查询音乐排序语句 + * @returns 查询语句 + */ +export const createMusicInfoOrderStatement = () => { + const db = getDB() + return db.prepare<[LX.DBService.ListMusicInfoQuery], LX.DBService.MusicInfoOrder>(`SELECT "listId", "musicInfoId", "order" + FROM "main"."my_list_music_info_order" + WHERE "listId"=@listId AND "musicInfoId"=@musicInfoId`) +} + /** * 创建音乐信息排序插入语句 * @returns 插入语句