优化歌曲换源机制,提升换源正确率
parent
1f8a0eaf67
commit
cd423752d1
|
@ -12,6 +12,7 @@ Linux 系统至少需要 GLIBC_2.29 版本才能运行,
|
||||||
### 优化
|
### 优化
|
||||||
|
|
||||||
- 优化正常播放结束时的下一首歌曲播放衔接度,在歌曲即将播放结束时将预获取下一首歌曲的播放链接,减少自动切歌时的等待时间(#2126)
|
- 优化正常播放结束时的下一首歌曲播放衔接度,在歌曲即将播放结束时将预获取下一首歌曲的播放链接,减少自动切歌时的等待时间(#2126)
|
||||||
|
- 优化歌曲换源机制,提升换源正确率
|
||||||
- 修正搜索歌曲提示框文案(#2050)
|
- 修正搜索歌曲提示框文案(#2050)
|
||||||
- 优化播放详情页UI,歌曲名字、歌手等文字过长时被截断的问题(#2049)
|
- 优化播放详情页UI,歌曲名字、歌手等文字过长时被截断的问题(#2049)
|
||||||
- Scheme URL 的播放歌曲允许更长的专辑名称
|
- Scheme URL 的播放歌曲允许更长的专辑名称
|
||||||
|
|
|
@ -73,19 +73,22 @@ export default {
|
||||||
|
|
||||||
async findMusic({ name, singer, albumName, interval, source: s }) {
|
async findMusic({ name, singer, albumName, interval, source: s }) {
|
||||||
const lists = await this.searchMusic({ name, singer, source: s, limit: 25 })
|
const lists = await this.searchMusic({ name, singer, source: s, limit: 25 })
|
||||||
|
// console.log(lists)
|
||||||
|
// console.log({ name, singer, albumName, interval, source: s })
|
||||||
|
|
||||||
const singersRxp = /、|&|;|;|\/|,|,|\|/
|
const singersRxp = /、|&|;|;|\/|,|,|\|/
|
||||||
const sortSingle = singer => singersRxp.test(singer)
|
const sortSingle = singer => singersRxp.test(singer)
|
||||||
? singer.split(singersRxp).sort((a, b) => a.localeCompare(b)).join('、')
|
? singer.split(singersRxp).sort((a, b) => a.localeCompare(b)).join('、')
|
||||||
: singer
|
: (singer || '')
|
||||||
const sortMusic = (arr, callback) => {
|
const sortMusic = (arr, callback) => {
|
||||||
const tempResult = []
|
const tempResult = []
|
||||||
for (let i = arr.length - 1; i > -1; i--) {
|
for (let i = arr.length - 1; i > -1; i--) {
|
||||||
const item = arr[i]
|
const item = arr[i]
|
||||||
if (callback(item)) {
|
if (callback(item)) {
|
||||||
delete item.sortedSinger
|
delete item.fSinger
|
||||||
delete item.lowerCaseName
|
delete item.fMusicName
|
||||||
delete item.lowerCaseAlbumName
|
delete item.fAlbumName
|
||||||
|
delete item.fInterval
|
||||||
tempResult.push(item)
|
tempResult.push(item)
|
||||||
arr.splice(i, 1)
|
arr.splice(i, 1)
|
||||||
}
|
}
|
||||||
|
@ -93,55 +96,68 @@ export default {
|
||||||
tempResult.reverse()
|
tempResult.reverse()
|
||||||
return tempResult
|
return tempResult
|
||||||
}
|
}
|
||||||
const trimStr = str => typeof str == 'string' ? str.trim() : str
|
const getIntv = (interval) => {
|
||||||
const filterStr = str => typeof str == 'string' ? str.replace(/\s|'|\.|,|,|&|"|、|\(|\)|(|)|`|~|-|<|>|\||\/|\]|\[/g, '') : str
|
if (!interval) return 0
|
||||||
const musicName = trimStr(name)
|
// if (musicInfo._interval) return musicInfo._interval
|
||||||
const sortedSinger = filterStr(String(sortSingle(singer)).toLowerCase())
|
let intvArr = interval.split(':')
|
||||||
const lowerCaseName = filterStr(String(musicName).toLowerCase())
|
let intv = 0
|
||||||
const lowerCaseAlbumName = filterStr(String(albumName).toLowerCase())
|
let unit = 1
|
||||||
|
while (intvArr.length) {
|
||||||
|
intv += parseInt(intvArr.pop()) * unit
|
||||||
|
unit *= 60
|
||||||
|
}
|
||||||
|
return intv
|
||||||
|
}
|
||||||
|
const trimStr = str => typeof str == 'string' ? str.trim() : (str || '')
|
||||||
|
const filterStr = str => typeof str == 'string' ? str.replace(/\s|'|\.|,|,|&|"|、|\(|\)|(|)|`|~|-|<|>|\||\/|\]|\[|!|!/g, '') : String(str || '')
|
||||||
|
const fMusicName = filterStr(name).toLowerCase()
|
||||||
|
const fSinger = filterStr(sortSingle(singer)).toLowerCase()
|
||||||
|
const fAlbumName = filterStr(albumName).toLowerCase()
|
||||||
|
const fInterval = getIntv(interval)
|
||||||
|
const isEqualsInterval = (intv) => Math.abs((fInterval || intv) - (intv || fInterval)) < 5
|
||||||
|
const isIncludesName = (name) => (fMusicName.includes(name) || name.includes(fMusicName))
|
||||||
|
const isIncludesSinger = (singer) => fSinger ? (fSinger.includes(singer) || singer.includes(fSinger)) : true
|
||||||
|
const isEqualsAlbum = (album) => fAlbumName ? fAlbumName == album : true
|
||||||
|
|
||||||
const result = lists.map(source => {
|
const result = lists.map(source => {
|
||||||
for (const item of source.list) {
|
for (const item of source.list) {
|
||||||
item.name = trimStr(item.name)
|
item.name = trimStr(item.name)
|
||||||
item.sortedSinger = filterStr(String(sortSingle(item.singer)).toLowerCase())
|
item.singer = trimStr(item.singer)
|
||||||
item.lowerCaseName = filterStr(String(item.name ?? '').toLowerCase())
|
item.fSinger = filterStr(sortSingle(item.singer).toLowerCase())
|
||||||
item.lowerCaseAlbumName = filterStr(String(item.albumName ?? '').toLowerCase())
|
item.fMusicName = filterStr(String(item.name ?? '').toLowerCase())
|
||||||
// console.log(lowerCaseName, item.lowerCaseName, item.source)
|
item.fAlbumName = filterStr(String(item.albumName ?? '').toLowerCase())
|
||||||
if (
|
item.fInterval = getIntv(item.interval)
|
||||||
(
|
// console.log(fMusicName, item.fMusicName, item.source)
|
||||||
item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName
|
if (!isEqualsInterval(item.fInterval)) {
|
||||||
) ||
|
item.name = null
|
||||||
(
|
continue
|
||||||
(interval ? item.interval == interval : true) && item.lowerCaseName == lowerCaseName &&
|
|
||||||
(item.sortedSinger.includes(sortedSinger) || sortedSinger.includes(item.sortedSinger))
|
|
||||||
) ||
|
|
||||||
(
|
|
||||||
item.lowerCaseName == lowerCaseName && (lowerCaseAlbumName ? item.lowerCaseAlbumName == lowerCaseAlbumName : true) &&
|
|
||||||
(interval ? item.interval == interval : true)
|
|
||||||
) ||
|
|
||||||
(
|
|
||||||
item.lowerCaseName == lowerCaseName && (lowerCaseAlbumName ? item.lowerCaseAlbumName == lowerCaseAlbumName : true) &&
|
|
||||||
(item.sortedSinger.includes(sortedSinger) || sortedSinger.includes(item.sortedSinger))
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
return item
|
|
||||||
}
|
|
||||||
if (!singer) {
|
|
||||||
if (item.lowerCaseName == lowerCaseName && (interval ? item.interval == interval : true)) return item
|
|
||||||
}
|
}
|
||||||
|
if (item.fMusicName == fMusicName && isIncludesSinger(item.fSinger)) return item
|
||||||
|
}
|
||||||
|
for (const item of source.list) {
|
||||||
|
if (item.name == null) continue
|
||||||
|
if (item.fSinger == fSinger && isIncludesName(item.fMusicName)) return item
|
||||||
|
}
|
||||||
|
for (const item of source.list) {
|
||||||
|
if (item.name == null) continue
|
||||||
|
if (isEqualsAlbum(item.fAlbumName) && isIncludesSinger(item.fSinger) && isIncludesName(item.fMusicName)) return item
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}).filter(s => s)
|
}).filter(s => s)
|
||||||
const newResult = []
|
const newResult = []
|
||||||
if (result.length) {
|
if (result.length) {
|
||||||
newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName && item.interval == interval))
|
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName && item.interval == interval))
|
||||||
newResult.push(...sortMusic(result, item => item.lowerCaseName == lowerCaseName && item.sortedSinger == sortedSinger && item.lowerCaseAlbumName == lowerCaseAlbumName))
|
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName && item.fSinger == fSinger && item.fAlbumName == fAlbumName))
|
||||||
newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName))
|
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName))
|
||||||
newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.interval == interval))
|
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName))
|
||||||
|
newResult.push(...sortMusic(result, item => item.fSinger == fSinger))
|
||||||
|
newResult.push(...sortMusic(result, item => item.fAlbumName == fAlbumName))
|
||||||
|
newResult.push(...sortMusic(result, item => item.interval == interval))
|
||||||
for (const item of result) {
|
for (const item of result) {
|
||||||
delete item.sortedSinger
|
delete item.fSinger
|
||||||
delete item.lowerCaseName
|
delete item.fMusicName
|
||||||
delete item.lowerCaseAlbumName
|
delete item.fAlbumName
|
||||||
|
delete item.fInterval
|
||||||
}
|
}
|
||||||
newResult.push(...result)
|
newResult.push(...result)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue