fix: 修复在某些情况下添加列表、歌曲时可能导致保存的顺序不对的问题(#2842)
This commit is contained in:
@@ -10,3 +10,4 @@
|
|||||||
- 修复某些情况下开放 API 获取到的音量为 0 的问题 (#2790)
|
- 修复某些情况下开放 API 获取到的音量为 0 的问题 (#2790)
|
||||||
- 修复 mg 图片、歌词获取
|
- 修复 mg 图片、歌词获取
|
||||||
- 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000)
|
- 修复某些 tx 歌单打开失败的问题 (#1060, @ght-000)
|
||||||
|
- 修复在某些情况下添加歌曲时可能导致保存的歌曲顺序不对的问题(#2842)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import {
|
|||||||
createMusicInfoOrderClearStatement,
|
createMusicInfoOrderClearStatement,
|
||||||
createMusicInfoByListAndMusicInfoIdQueryStatement,
|
createMusicInfoByListAndMusicInfoIdQueryStatement,
|
||||||
createMusicInfoByMusicInfoIdQueryStatement,
|
createMusicInfoByMusicInfoIdQueryStatement,
|
||||||
|
createMusicInfoOrderStatement,
|
||||||
} from './statements'
|
} from './statements'
|
||||||
|
|
||||||
const idFixRxp = /\.0$/
|
const idFixRxp = /\.0$/
|
||||||
@@ -368,3 +369,14 @@ export const overwriteListData = (lists: LX.DBService.UserListInfo[], musicInfos
|
|||||||
})(lists, 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 })
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ import {
|
|||||||
updateMusicInfoOrder,
|
updateMusicInfoOrder,
|
||||||
updateMusicInfos,
|
updateMusicInfos,
|
||||||
updateUserLists as updateUserListsFromDB,
|
updateUserLists as updateUserListsFromDB,
|
||||||
|
getMusicInfoOrder,
|
||||||
} from './dbHelper'
|
} from './dbHelper'
|
||||||
|
|
||||||
let userLists: LX.DBService.UserListInfo[]
|
let userLists: LX.DBService.UserListInfo[]
|
||||||
let musicLists = new Map<string, LX.Music.MusicInfo[]>()
|
let musicLists = new Map<string, LX.Music.MusicInfo[]>()
|
||||||
|
let rawPoss = new Map<string, number>()
|
||||||
|
|
||||||
const toDBMusicInfo = (musicInfos: LX.Music.MusicInfo[], listId: string, offset: number = 0): LX.DBService.MusicInfo[] => {
|
const toDBMusicInfo = (musicInfos: LX.Music.MusicInfo[], listId: string, offset: number = 0): LX.DBService.MusicInfo[] => {
|
||||||
return musicInfos.map((info, index) => {
|
return musicInfos.map((info, index) => {
|
||||||
@@ -41,8 +43,10 @@ const toDBMusicInfo = (musicInfos: LX.Music.MusicInfo[], listId: string, offset:
|
|||||||
export const getAllUserList = (): LX.List.UserListInfo[] => {
|
export const getAllUserList = (): LX.List.UserListInfo[] => {
|
||||||
userLists ??= queryAllUserList()
|
userLists ??= queryAllUserList()
|
||||||
|
|
||||||
|
rawPoss.clear()
|
||||||
return userLists.map(list => {
|
return userLists.map(list => {
|
||||||
const { position, ...newList } = list
|
const { position, ...newList } = list
|
||||||
|
rawPoss.set(list.id, position)
|
||||||
return newList
|
return newList
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -55,10 +59,15 @@ export const getAllUserList = (): LX.List.UserListInfo[] => {
|
|||||||
export const createUserLists = (position: number, lists: LX.List.UserListInfo[]) => {
|
export const createUserLists = (position: number, lists: LX.List.UserListInfo[]) => {
|
||||||
userLists ??= queryAllUserList()
|
userLists ??= queryAllUserList()
|
||||||
if (position < 0 || position >= userLists.length) {
|
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 newLists: LX.DBService.UserListInfo[] = lists.map((list, index) => {
|
||||||
|
const pos = order + index
|
||||||
|
rawPoss.set(list.id, pos)
|
||||||
return {
|
return {
|
||||||
...list,
|
...list,
|
||||||
position: position + index,
|
position: pos,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
insertUserLists(newLists)
|
insertUserLists(newLists)
|
||||||
@@ -72,6 +81,8 @@ export const createUserLists = (position: number, lists: LX.List.UserListInfo[])
|
|||||||
})
|
})
|
||||||
insertUserLists(newUserLists, true)
|
insertUserLists(newUserLists, true)
|
||||||
userLists = newUserLists
|
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[]) => {
|
export const removeUserLists = (ids: string[]) => {
|
||||||
deleteUserLists(ids)
|
deleteUserLists(ids)
|
||||||
userLists &&= queryAllUserList()
|
userLists &&= queryAllUserList()
|
||||||
|
for (const id of ids) rawPoss.delete(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -147,6 +159,8 @@ export const updateUserListsPosition = (position: number, ids: string[]) => {
|
|||||||
})
|
})
|
||||||
insertUserLists(newUserLists, true)
|
insertUserLists(newUserLists, true)
|
||||||
userLists = newUserLists
|
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)
|
arrUnshift(targetList, musicInfos)
|
||||||
break
|
break
|
||||||
case 'bottom':
|
case 'bottom':
|
||||||
default:
|
default: {
|
||||||
insertMusicInfoList(toDBMusicInfo(musicInfos, listId, targetList.length))
|
// 如果是添加到最后,那么取最后一个歌曲的原始位置 + 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)
|
arrPush(targetList, musicInfos)
|
||||||
break
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,6 +381,8 @@ export const listDataOverwrite = (myListData: MakeOptional<LX.List.ListDataFull,
|
|||||||
if (userLists) userLists.splice(0, userLists.length, ...dbLists)
|
if (userLists) userLists.splice(0, userLists.length, ...dbLists)
|
||||||
else userLists = dbLists
|
else userLists = dbLists
|
||||||
|
|
||||||
|
rawPoss.clear()
|
||||||
|
for (const list of userLists) rawPoss.set(list.id, list.position)
|
||||||
musicLists.clear()
|
musicLists.clear()
|
||||||
musicLists.set(LIST_IDS.DEFAULT, listData.defaultList)
|
musicLists.set(LIST_IDS.DEFAULT, listData.defaultList)
|
||||||
musicLists.set(LIST_IDS.LOVE, listData.loveList)
|
musicLists.set(LIST_IDS.LOVE, listData.loveList)
|
||||||
|
|||||||
@@ -145,6 +145,17 @@ export const createMusicInfoByMusicInfoIdQueryStatement = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建根据列表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 插入语句
|
* @returns 插入语句
|
||||||
|
|||||||
Reference in New Issue
Block a user