From cd423752d15bdca589e9a5479b8b7bbb2f0ac978 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 29 Nov 2024 12:39:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=AD=8C=E6=9B=B2=E6=8D=A2?= =?UTF-8?q?=E6=BA=90=E6=9C=BA=E5=88=B6=EF=BC=8C=E6=8F=90=E5=8D=87=E6=8D=A2?= =?UTF-8?q?=E6=BA=90=E6=AD=A3=E7=A1=AE=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/utils/musicSdk/index.js | 100 ++++++++++++++++----------- 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 3d8b510d..4d008dd0 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -12,6 +12,7 @@ Linux 系统至少需要 GLIBC_2.29 版本才能运行, ### 优化 - 优化正常播放结束时的下一首歌曲播放衔接度,在歌曲即将播放结束时将预获取下一首歌曲的播放链接,减少自动切歌时的等待时间(#2126) +- 优化歌曲换源机制,提升换源正确率 - 修正搜索歌曲提示框文案(#2050) - 优化播放详情页UI,歌曲名字、歌手等文字过长时被截断的问题(#2049) - Scheme URL 的播放歌曲允许更长的专辑名称 diff --git a/src/renderer/utils/musicSdk/index.js b/src/renderer/utils/musicSdk/index.js index 47d4fca2..a48cf3c3 100644 --- a/src/renderer/utils/musicSdk/index.js +++ b/src/renderer/utils/musicSdk/index.js @@ -73,19 +73,22 @@ export default { async findMusic({ name, singer, albumName, interval, source: s }) { 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 sortSingle = singer => singersRxp.test(singer) ? singer.split(singersRxp).sort((a, b) => a.localeCompare(b)).join('、') - : singer + : (singer || '') const sortMusic = (arr, callback) => { const tempResult = [] for (let i = arr.length - 1; i > -1; i--) { const item = arr[i] if (callback(item)) { - delete item.sortedSinger - delete item.lowerCaseName - delete item.lowerCaseAlbumName + delete item.fSinger + delete item.fMusicName + delete item.fAlbumName + delete item.fInterval tempResult.push(item) arr.splice(i, 1) } @@ -93,55 +96,68 @@ export default { tempResult.reverse() return tempResult } - const trimStr = str => typeof str == 'string' ? str.trim() : str - const filterStr = str => typeof str == 'string' ? str.replace(/\s|'|\.|,|,|&|"|、|\(|\)|(|)|`|~|-|<|>|\||\/|\]|\[/g, '') : str - const musicName = trimStr(name) - const sortedSinger = filterStr(String(sortSingle(singer)).toLowerCase()) - const lowerCaseName = filterStr(String(musicName).toLowerCase()) - const lowerCaseAlbumName = filterStr(String(albumName).toLowerCase()) + const getIntv = (interval) => { + if (!interval) return 0 + // if (musicInfo._interval) return musicInfo._interval + let intvArr = interval.split(':') + let intv = 0 + 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 => { for (const item of source.list) { item.name = trimStr(item.name) - item.sortedSinger = filterStr(String(sortSingle(item.singer)).toLowerCase()) - item.lowerCaseName = filterStr(String(item.name ?? '').toLowerCase()) - item.lowerCaseAlbumName = filterStr(String(item.albumName ?? '').toLowerCase()) - // console.log(lowerCaseName, item.lowerCaseName, item.source) - if ( - ( - item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName - ) || - ( - (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 + item.singer = trimStr(item.singer) + item.fSinger = filterStr(sortSingle(item.singer).toLowerCase()) + item.fMusicName = filterStr(String(item.name ?? '').toLowerCase()) + item.fAlbumName = filterStr(String(item.albumName ?? '').toLowerCase()) + item.fInterval = getIntv(item.interval) + // console.log(fMusicName, item.fMusicName, item.source) + if (!isEqualsInterval(item.fInterval)) { + item.name = null + continue } + 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 }).filter(s => s) const newResult = [] if (result.length) { - newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName && item.interval == interval)) - newResult.push(...sortMusic(result, item => item.lowerCaseName == lowerCaseName && item.sortedSinger == sortedSinger && item.lowerCaseAlbumName == lowerCaseAlbumName)) - newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.lowerCaseName == lowerCaseName)) - newResult.push(...sortMusic(result, item => item.sortedSinger == sortedSinger && item.interval == interval)) + newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName && item.interval == interval)) + newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName && item.fSinger == fSinger && item.fAlbumName == fAlbumName)) + newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName)) + 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) { - delete item.sortedSinger - delete item.lowerCaseName - delete item.lowerCaseAlbumName + delete item.fSinger + delete item.fMusicName + delete item.fAlbumName + delete item.fInterval } newResult.push(...result) }