420 lines
13 KiB
JavaScript
420 lines
13 KiB
JavaScript
import musicSdk from '../../utils/music'
|
|
import { clearLyric, clearMusicUrl } from '../../utils'
|
|
import { sync as eventSyncName, list as eventListNames } from '@renderer/event/names'
|
|
import { removeListPosition, setListPrevSelectId, removeListUpdateInfo } from '@renderer/utils/data'
|
|
import { markRawList, toRaw, markRaw } from '@renderer/utils/vueTools'
|
|
import { allList, allListInit, setInited, removeUserList, addUserList, updateList, defaultList, loveList, userLists } from '@renderer/core/share/list'
|
|
|
|
// import { allListInit } from '@renderer/core/share/list'
|
|
|
|
// state
|
|
const state = window.lists = {
|
|
// isInitedList: false,
|
|
}
|
|
|
|
// getters
|
|
const getters = {
|
|
// isInitedList: state => state.isInitedList,
|
|
// defaultList: state => state.defaultList || {},
|
|
// loveList: state => state.loveList || {},
|
|
// userList: state => state.userList,
|
|
// allList: () => allList,
|
|
}
|
|
|
|
const getOtherSourcePromises = new Map()
|
|
|
|
// actions
|
|
const actions = {
|
|
getOtherSource({ state, commit }, musicInfo) {
|
|
if (musicInfo.otherSource?.length) return Promise.resolve(musicInfo.otherSource)
|
|
let key = `${musicInfo.source}_${musicInfo.songmid}`
|
|
if (getOtherSourcePromises.has(key)) return getOtherSourcePromises.get(key)
|
|
const promise = musicSdk.findMusic(musicInfo).then(otherSource => {
|
|
commit('setOtherSource', { musicInfo, otherSource })
|
|
if (getOtherSourcePromises.has(key)) getOtherSourcePromises.delete(key)
|
|
return otherSource
|
|
})
|
|
getOtherSourcePromises.set(key, promise)
|
|
return promise
|
|
},
|
|
}
|
|
|
|
// mitations
|
|
const mutations = {
|
|
initList(state, { defaultList, loveList, userList, tempList }) {
|
|
if (defaultList != null) {
|
|
markRawList(defaultList.list)
|
|
}
|
|
if (loveList != null) {
|
|
markRawList(loveList.list)
|
|
}
|
|
if (tempList != null) {
|
|
markRawList(tempList.list)
|
|
}
|
|
if (userList != null) {
|
|
for (const list of userList) if (list.list) markRawList(list.list)
|
|
}
|
|
allListInit({ defaultList, loveList, tempList, userList })
|
|
window.eventHub.emit(eventListNames.listChange, [defaultList.id, loveList.id, tempList.id, ...userList.map(l => l.id)])
|
|
// state.isInitedList = true
|
|
setInited()
|
|
|
|
// if (!isSync) {
|
|
// window.eventHub.emit(eventSyncName.send_action_list, {
|
|
// action: 'init_list',
|
|
// data: { defaultList, loveList, userList },
|
|
// })
|
|
// }
|
|
},
|
|
setSyncListData(state, { defaultList, loveList, userList }) {
|
|
if (defaultList != null) markRawList(defaultList.list)
|
|
if (loveList != null) markRawList(loveList.list)
|
|
if (userList != null) for (const list of userList) markRawList(list.list)
|
|
allListInit({ defaultList, loveList, userList })
|
|
window.eventHub.emit(eventListNames.listChange, [defaultList.id, loveList.id, ...userList.map(l => l.id)])
|
|
},
|
|
setList(state, { id, list, name, source, sourceListId, isSync }) {
|
|
markRawList(list)
|
|
const targetList = id == defaultList.id
|
|
? defaultList
|
|
: id == loveList.id
|
|
? loveList
|
|
: userLists.find(l => l.id == id)
|
|
if (targetList) {
|
|
if (name && targetList.name === name) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'set_list',
|
|
data: { id, list: toRaw(list), name, source, sourceListId },
|
|
})
|
|
}
|
|
updateList({
|
|
id,
|
|
list,
|
|
name,
|
|
source,
|
|
sourceListId,
|
|
})
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
return
|
|
}
|
|
|
|
id += '_' + Math.random()
|
|
}
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'set_list',
|
|
data: { id, list: toRaw(list), name, source, sourceListId },
|
|
})
|
|
}
|
|
let newList = {
|
|
name,
|
|
id,
|
|
list,
|
|
source,
|
|
sourceListId,
|
|
}
|
|
addUserList(newList)
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
listAdd(state, { id, musicInfo, addMusicLocationType, isSync }) {
|
|
if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType
|
|
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_add',
|
|
data: { id, musicInfo: toRaw(musicInfo), addMusicLocationType },
|
|
})
|
|
}
|
|
|
|
const targetList = allList[id]
|
|
markRaw(musicInfo)
|
|
if (!targetList) return
|
|
if (targetList.some(s => s.songmid === musicInfo.songmid)) return
|
|
switch (addMusicLocationType) {
|
|
case 'top':
|
|
targetList.unshift(musicInfo)
|
|
break
|
|
case 'bottom':
|
|
default:
|
|
targetList.push(musicInfo)
|
|
break
|
|
}
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
listMove(state, { fromId, musicInfo, toId, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_move',
|
|
data: { fromId, musicInfo: toRaw(musicInfo), toId },
|
|
})
|
|
}
|
|
|
|
const fromList = allList[fromId]
|
|
const toList = allList[toId]
|
|
if (!fromList || !toList) return
|
|
fromList.splice(fromList.findIndex(s => s.songmid === musicInfo.songmid), 1)
|
|
let index = toList.findIndex(s => s.songmid === musicInfo.songmid)
|
|
if (index < 0) {
|
|
switch (this.state.setting.list.addMusicLocationType) {
|
|
case 'top':
|
|
toList.unshift(musicInfo)
|
|
break
|
|
case 'bottom':
|
|
default:
|
|
toList.push(musicInfo)
|
|
break
|
|
}
|
|
}
|
|
window.eventHub.emit(eventListNames.listChange, [fromId, toList])
|
|
},
|
|
listAddMultiple(state, { id, list, addMusicLocationType, isSync }) {
|
|
if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType
|
|
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_add_multiple',
|
|
data: { id, list: toRaw(list), addMusicLocationType },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[id]
|
|
if (!targetList) return
|
|
markRawList(list)
|
|
let newList
|
|
const map = {}
|
|
const ids = []
|
|
switch (addMusicLocationType) {
|
|
case 'top':
|
|
newList = [...list, ...targetList]
|
|
for (let i = newList.length - 1; i > -1; i--) {
|
|
const item = newList[i]
|
|
if (map[item.songmid]) continue
|
|
ids.unshift(item.songmid)
|
|
map[item.songmid] = item
|
|
}
|
|
break
|
|
case 'bottom':
|
|
default:
|
|
newList = [...targetList, ...list]
|
|
for (const item of newList) {
|
|
if (map[item.songmid]) continue
|
|
ids.push(item.songmid)
|
|
map[item.songmid] = item
|
|
}
|
|
break
|
|
}
|
|
targetList.splice(0, targetList.length, ...ids.map(id => map[id]))
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
// { fromId, toId, list }
|
|
listMoveMultiple(state, { fromId, toId, list, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_move_multiple',
|
|
data: { fromId, toId, list: toRaw(list) },
|
|
})
|
|
}
|
|
|
|
// console.log(state.commit)
|
|
this.commit('list/listRemoveMultiple', { listId: fromId, ids: list.map(s => s.songmid), isSync: true })
|
|
this.commit('list/listAddMultiple', { id: toId, list, isSync: true })
|
|
},
|
|
listRemove(state, { listId, id, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_remove',
|
|
data: { listId, id },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[listId]
|
|
if (!targetList) return
|
|
const index = targetList.findIndex(item => item.songmid == id)
|
|
if (index < 0) return
|
|
targetList.splice(index, 1)
|
|
window.eventHub.emit(eventListNames.listChange, [listId])
|
|
},
|
|
listRemoveMultiple(state, { listId, ids: musicIds, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_remove_multiple',
|
|
data: { listId, ids: musicIds },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[listId]
|
|
if (!targetList) return
|
|
let map = {}
|
|
let ids = []
|
|
for (const item of targetList) {
|
|
ids.push(item.songmid)
|
|
map[item.songmid] = item
|
|
}
|
|
for (const songmid of musicIds) {
|
|
if (map[songmid]) delete map[songmid]
|
|
}
|
|
let newList = []
|
|
for (const id of ids) if (map[id]) newList.push(map[id])
|
|
|
|
targetList.splice(0, targetList.length, ...newList)
|
|
window.eventHub.emit(eventListNames.listChange, [listId])
|
|
},
|
|
listClear(state, { id, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'list_clear',
|
|
data: { id },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[id]
|
|
if (!targetList) return
|
|
targetList.splice(0, targetList.length)
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
updateMusicInfo(state, { listId, id, data, musicInfo, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'update_music_info',
|
|
data: { listId, id, data, musicInfo: toRaw(musicInfo) },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[listId]
|
|
if (!targetList) {
|
|
if (musicInfo) Object.assign(musicInfo, data)
|
|
return
|
|
}
|
|
const targetMusicInfo = targetList.find(item => item.songmid == id)
|
|
if (targetMusicInfo) Object.assign(targetMusicInfo, data)
|
|
|
|
switch (listId) {
|
|
case defaultList.id:
|
|
window.eventHub.emit(eventListNames.musicInfoChange, { list: targetList, ...defaultList })
|
|
break
|
|
case loveList.id:
|
|
window.eventHub.emit(eventListNames.musicInfoChange, { list: targetList, ...loveList })
|
|
break
|
|
default:
|
|
window.eventHub.emit(eventListNames.musicInfoChange, userLists.map(l => ({ list: allList[l.id], ...l })))
|
|
break
|
|
}
|
|
},
|
|
createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId, position, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'create_user_list',
|
|
data: { name, id, list: toRaw(list), source, sourceListId, position },
|
|
})
|
|
}
|
|
|
|
markRawList(list)
|
|
let newList = userLists.find(item => item.id === id)
|
|
if (!newList) {
|
|
newList = {
|
|
name,
|
|
id,
|
|
list: [],
|
|
source,
|
|
position,
|
|
sourceListId,
|
|
}
|
|
if (position) newList.locationUpdateTime = Date.now()
|
|
addUserList(newList)
|
|
}
|
|
this.commit('list/listAddMultiple', { id, list, isSync: true })
|
|
},
|
|
removeUserList(state, { id, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'remove_user_list',
|
|
data: { id },
|
|
})
|
|
}
|
|
|
|
const index = userLists.findIndex(l => l.id === id)
|
|
if (index < 0) return
|
|
removeUserList(id)
|
|
removeListPosition(id)
|
|
removeListUpdateInfo(id)
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
setUserListName(state, { id, name, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'set_user_list_name',
|
|
data: { id, name },
|
|
})
|
|
}
|
|
|
|
let list = userLists.find(l => l.id === id)
|
|
if (!list) return
|
|
list.name = name
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
setUserListPosition(state, { id, position, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'set_user_list_position',
|
|
data: { id, position },
|
|
})
|
|
}
|
|
const index = userLists.findIndex(l => l.id == id)
|
|
if (index < 0) return
|
|
let targetList = userLists[index]
|
|
userLists.splice(index, 1)
|
|
userLists.splice(Math.max(Math.min(position, userLists.length), 0), 0, targetList)
|
|
targetList.locationUpdateTime = Date.now()
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
setMusicPosition(state, { id, position, list, isSync }) {
|
|
if (!isSync) {
|
|
window.eventHub.emit(eventSyncName.send_action_list, {
|
|
action: 'set_music_position',
|
|
data: { id, position, list: toRaw(list) },
|
|
})
|
|
}
|
|
|
|
let targetList = allList[id]
|
|
this.commit('list/listRemoveMultiple', { listId: id, ids: list.map(m => m.songmid), isSync: true })
|
|
|
|
targetList.splice(position - 1, 0, ...list)
|
|
window.eventHub.emit(eventListNames.listChange, [id])
|
|
},
|
|
clearCache() {
|
|
const lists = Object.values(allList)
|
|
for (const list of lists) {
|
|
for (const item of list) {
|
|
if (item.otherSource) item.otherSource = null
|
|
if (item.typeUrl['128k']) delete item.typeUrl['128k']
|
|
if (item.typeUrl['320k']) delete item.typeUrl['320k']
|
|
if (item.typeUrl.flac) delete item.typeUrl.flac
|
|
if (item.typeUrl.wav) delete item.typeUrl.wav
|
|
|
|
// v1.8.2以前的Lyric
|
|
if (item.lxlrc) delete item.lxlrc
|
|
if (item.lrc) delete item.lrc
|
|
if (item.tlrc) delete item.tlrc
|
|
}
|
|
}
|
|
clearMusicUrl()
|
|
clearLyric()
|
|
window.eventHub.emit(eventListNames.listChange, Object.keys(allList))
|
|
},
|
|
setOtherSource(state, { musicInfo, otherSource }) {
|
|
musicInfo.otherSource = otherSource
|
|
},
|
|
setPrevSelectListId(state, val) {
|
|
setListPrevSelectId(val)
|
|
},
|
|
}
|
|
|
|
export default {
|
|
namespaced: true,
|
|
state,
|
|
getters,
|
|
actions,
|
|
mutations,
|
|
}
|