diff --git a/publish/changeLog.md b/publish/changeLog.md index 108b6daa..bf6f4799 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -8,6 +8,7 @@ - 不再丢弃kg源逐行歌词(@helloplhm-qwq) - 支持kw源排行榜显示大小(revert @Folltoshe #1460) - 托盘菜单添加多语言支持(#1802) +- 优化本地歌曲换源匹配机制 ### 修复 diff --git a/src/renderer/core/music/local.ts b/src/renderer/core/music/local.ts index 76893183..a8f21a91 100644 --- a/src/renderer/core/music/local.ts +++ b/src/renderer/core/music/local.ts @@ -16,26 +16,26 @@ import { } from './utils' -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 = musicInfo.meta.filePath.split('/').at(-1) + let fileName = 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 = () => {} }: { @@ -84,14 +84,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 + }) }) } @@ -115,15 +115,15 @@ export const getPicUrl = async({ musicInfo, listId, isRefresh, onToggleSource = } 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 + }) }) } @@ -152,15 +152,14 @@ export const getLyricInfo = async({ musicInfo, isRefresh, onToggleSource = () => } 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/renderer/utils/musicSdk/kg/lyric.js b/src/renderer/utils/musicSdk/kg/lyric.js index c1a7b645..33480957 100644 --- a/src/renderer/utils/musicSdk/kg/lyric.js +++ b/src/renderer/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/renderer/utils/musicSdk/mg/temp/leaderboard-old.js b/src/renderer/utils/musicSdk/mg/temp/leaderboard-old.js index 1c5cb186..674c9798 100644 --- a/src/renderer/utils/musicSdk/mg/temp/leaderboard-old.js +++ b/src/renderer/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/renderer/utils/musicSdk/tx/lyric.js b/src/renderer/utils/musicSdk/tx/lyric.js index 503b1dbf..a6e5ae1e 100644 --- a/src/renderer/utils/musicSdk/tx/lyric.js +++ b/src/renderer/utils/musicSdk/tx/lyric.js @@ -100,6 +100,7 @@ const parseTools = { return str.replace(/^[\S\s]*?LyricContent="/, '').replace(/"\/>[\S\s]*?$/, '') }, getIntv(interval) { + if (!interval) return 0 if (!interval.includes('.')) interval += '.0' let arr = interval.split(/:|\./) while (arr.length < 3) arr.unshift('0') diff --git a/src/renderer/utils/musicSdk/wy/lyric.js b/src/renderer/utils/musicSdk/wy/lyric.js index 61e01d84..3d74f762 100644 --- a/src/renderer/utils/musicSdk/wy/lyric.js +++ b/src/renderer/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')