mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-05-23 22:37:41 +08:00
优化本地歌曲换源匹配机制
This commit is contained in:
parent
e047590706
commit
3a048eeda2
@ -7,6 +7,7 @@
|
||||
|
||||
- 不再丢弃kg源逐行歌词(@helloplhm-qwq)
|
||||
- 支持kw源排行榜显示大小(revert @Folltoshe #1460)
|
||||
- 优化本地歌曲换源匹配机制
|
||||
|
||||
### 修复
|
||||
|
||||
|
@ -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<T>(musicInfo: LX.Music.MusicInfoLocal, handler: (infos: LX.Music.MusicInfoOnline[]) => Promise<T>) => {
|
||||
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,8 +85,7 @@ export const getMusicUrl = async({ musicInfo, isRefresh, onToggleSource = () =>
|
||||
} catch {}
|
||||
|
||||
onToggleSource()
|
||||
const otherSource = await getOtherSourceByLocal(musicInfo)
|
||||
if (!otherSource.length) throw new Error('source not found')
|
||||
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)
|
||||
@ -94,6 +93,7 @@ export const getMusicUrl = async({ musicInfo, isRefresh, onToggleSource = () =>
|
||||
// TODO: save url ?
|
||||
return url
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export const getPicUrl = async({ musicInfo, listId, isRefresh, skipFilePic, onToggleSource = () => {} }: {
|
||||
@ -120,8 +120,7 @@ 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 getOtherSourceByLocal(musicInfo, async(otherSource) => {
|
||||
return getOnlineOtherSourcePicUrl({ musicInfos: [...otherSource], onToggleSource, isRefresh }).then(({ url, musicInfo: targetMusicInfo, isFromCache }) => {
|
||||
if (listId) {
|
||||
musicInfo.meta.picUrl = url
|
||||
@ -130,6 +129,7 @@ export const getPicUrl = async({ musicInfo, listId, isRefresh, skipFilePic, onTo
|
||||
|
||||
return url
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const getMusicFileLyric = async(filePath: string) => {
|
||||
@ -169,10 +169,8 @@ 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 }) => {
|
||||
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)
|
||||
@ -180,4 +178,5 @@ export const getLyricInfo = async({ musicInfo, isRefresh, skipFileLyric, onToggl
|
||||
|
||||
return buildLyricInfo(lyricInfo)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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')
|
||||
|
Loading…
x
Reference in New Issue
Block a user