diff --git a/publish/changeLog.md b/publish/changeLog.md index f46a561..54776af 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -7,6 +7,7 @@ - 不再丢弃kg源逐行歌词(@helloplhm-qwq) - 支持kw源排行榜显示大小(revert @Folltoshe #1460) +- 优化本地歌曲换源匹配机制 ### 修复 diff --git a/src/core/music/local.ts b/src/core/music/local.ts index e967400..a86adf7 100644 --- a/src/core/music/local.ts +++ b/src/core/music/local.ts @@ -16,26 +16,26 @@ import { getLocalFilePath } from '@/utils/music' import { readLyric, readPic } from '@/utils/localMediaMetadata' import { stat } from '@/utils/fs' -const getOtherSourceByLocal = async(musicInfo: LX.Music.MusicInfoLocal) => { +const getOtherSourceByLocal = async(musicInfo: LX.Music.MusicInfoLocal, handler: (infos: LX.Music.MusicInfoOnline[]) => Promise) => { let result: LX.Music.MusicInfoOnline[] = [] result = await getOtherSource(musicInfo) - if (result.length) return result + if (result.length) try { return await handler(result) } catch {} if (musicInfo.name.includes('-')) { const [name, singer] = musicInfo.name.split('-').map(val => val.trim()) result = await getOtherSource({ ...musicInfo, name, singer, - }) - if (result.length) return result + }, true) + if (result.length) try { return await handler(result) } catch {} result = await getOtherSource({ ...musicInfo, name: singer, singer: name, - }) - if (result.length) return result + }, true) + if (result.length) try { return await handler(result) } catch {} } - let fileName = (await stat(musicInfo.meta.filePath).catch(() => ({ name: null }))).name ?? musicInfo.meta.filePath.split('/').at(-1) + let fileName = (await stat(musicInfo.meta.filePath).catch(() => ({ name: null }))).name ?? musicInfo.meta.filePath.split(/\/|\\/).at(-1) if (fileName) { fileName = fileName.substring(0, fileName.lastIndexOf('.')) if (fileName != musicInfo.name) { @@ -45,25 +45,25 @@ const getOtherSourceByLocal = async(musicInfo: LX.Music.MusicInfoLocal) => { ...musicInfo, name, singer, - }) - if (result.length) return result + }, true) + if (result.length) try { return await handler(result) } catch {} result = await getOtherSource({ ...musicInfo, name: singer, singer: name, - }) + }, true) } else { result = await getOtherSource({ ...musicInfo, name: fileName, singer: '', - }) + }, true) } - if (result.length) return result + if (result.length) try { return await handler(result) } catch {} } } - return result + throw new Error('source not found') } export const getMusicUrl = async({ musicInfo, isRefresh, onToggleSource = () => {} }: { @@ -85,14 +85,14 @@ export const getMusicUrl = async({ musicInfo, isRefresh, onToggleSource = () => } catch {} onToggleSource() - const otherSource = await getOtherSourceByLocal(musicInfo) - if (!otherSource.length) throw new Error('source not found') - return getOnlineOtherSourceMusicUrl({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ url, quality: targetQuality, musicInfo: targetMusicInfo, isFromCache }) => { - // saveLyric(musicInfo, data.lyricInfo) - if (!isFromCache) void saveMusicUrl(targetMusicInfo, targetQuality, url) + return getOtherSourceByLocal(musicInfo, async(otherSource) => { + return getOnlineOtherSourceMusicUrl({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ url, quality: targetQuality, musicInfo: targetMusicInfo, isFromCache }) => { + // saveLyric(musicInfo, data.lyricInfo) + if (!isFromCache) void saveMusicUrl(targetMusicInfo, targetQuality, url) - // TODO: save url ? - return url + // TODO: save url ? + return url + }) }) } @@ -120,15 +120,15 @@ export const getPicUrl = async({ musicInfo, listId, isRefresh, skipFilePic, onTo } catch {} onToggleSource() - const otherSource = await getOtherSourceByLocal(musicInfo) - if (!otherSource.length) throw new Error('source not found') - return getOnlineOtherSourcePicUrl({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ url, musicInfo: targetMusicInfo, isFromCache }) => { - if (listId) { - musicInfo.meta.picUrl = url - void updateListMusics([{ id: listId, musicInfo }]) - } + return getOtherSourceByLocal(musicInfo, async(otherSource) => { + return getOnlineOtherSourcePicUrl({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ url, musicInfo: targetMusicInfo, isFromCache }) => { + if (listId) { + musicInfo.meta.picUrl = url + void updateListMusics([{ id: listId, musicInfo }]) + } - return url + return url + }) }) } @@ -169,15 +169,14 @@ export const getLyricInfo = async({ musicInfo, isRefresh, skipFileLyric, onToggl } catch {} onToggleSource() - const otherSource = await getOtherSourceByLocal(musicInfo) - if (!otherSource.length) throw new Error('source not found') - // eslint-disable-next-line @typescript-eslint/promise-function-async - return getOnlineOtherSourceLyricInfo({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ lyricInfo, musicInfo: targetMusicInfo, isFromCache }) => { - void saveLyric(musicInfo, lyricInfo) + return getOtherSourceByLocal(musicInfo, async(otherSource) => { + return getOnlineOtherSourceLyricInfo({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(async({ lyricInfo, musicInfo: targetMusicInfo, isFromCache }) => { + void saveLyric(musicInfo, lyricInfo) - if (isFromCache) return buildLyricInfo(lyricInfo) - void saveLyric(targetMusicInfo, lyricInfo) + if (isFromCache) return buildLyricInfo(lyricInfo) + void saveLyric(targetMusicInfo, lyricInfo) - return buildLyricInfo(lyricInfo) + return buildLyricInfo(lyricInfo) + }) }) } diff --git a/src/utils/musicSdk/kg/lyric.js b/src/utils/musicSdk/kg/lyric.js index c1a7b64..3348095 100644 --- a/src/utils/musicSdk/kg/lyric.js +++ b/src/utils/musicSdk/kg/lyric.js @@ -57,6 +57,7 @@ const parseLyric = str => { export default { getIntv(interval) { + if (!interval) return 0 let intvArr = interval.split(':') let intv = 0 let unit = 1 diff --git a/src/utils/musicSdk/mg/temp/leaderboard-old.js b/src/utils/musicSdk/mg/temp/leaderboard-old.js index 1c5cb18..674c979 100644 --- a/src/utils/musicSdk/mg/temp/leaderboard-old.js +++ b/src/utils/musicSdk/mg/temp/leaderboard-old.js @@ -72,6 +72,7 @@ export default { return arr.join('、') }, getIntv(interval) { + if (!interval) return 0 let intvArr = interval.split(':') let intv = 0 let unit = 1 diff --git a/src/utils/musicSdk/wy/lyric.js b/src/utils/musicSdk/wy/lyric.js index 61e01d8..3d74f76 100644 --- a/src/utils/musicSdk/wy/lyric.js +++ b/src/utils/musicSdk/wy/lyric.js @@ -126,6 +126,7 @@ const parseTools = { }) }, getIntv(interval) { + if (!interval) return 0 if (!interval.includes('.')) interval += '.0' let arr = interval.split(/:|\./) while (arr.length < 3) arr.unshift('0')