Files
Melo/src/renderer/core/music/online.ts
T
NKXingXhandlyswhut ab3f118588 允许设置其他优先播放的歌曲音质 (#1839)
* 在线播放更高音质

* 修改对应翻译

* 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”

* 修复拼写

* 优化

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-04-15 19:46:28 +08:00

104 lines
3.7 KiB
TypeScript

import { updateListMusics } from '@renderer/store/list/action'
import { appSetting } from '@renderer/store/setting'
import {
saveLyric,
saveMusicUrl,
getMusicUrl as getStoreMusicUrl,
} from '@renderer/utils/ipc'
import {
buildLyricInfo,
getPlayQuality,
handleGetOnlineLyricInfo,
handleGetOnlineMusicUrl,
handleGetOnlinePicUrl,
getCachedLyricInfo,
} from './utils'
/* export const setMusicUrl = ({ musicInfo, type, url }: {
musicInfo: LX.Music.MusicInfo
type: LX.Quality
url: string
}) => {
saveMusicUrl(musicInfo, type, url)
}
export const setPic = (datas: {
listId: string
musicInfo: LX.Music.MusicInfo
url: string
}) => {
datas.musicInfo.img = datas.url
updateMusicInfo({
listId: datas.listId,
id: datas.musicInfo.songmid,
data: { img: datas.url },
musicInfo: datas.musicInfo,
})
}
*/
export const getMusicUrl = async({ musicInfo, quality, isRefresh, allowToggleSource = true, onToggleSource = () => {} }: {
musicInfo: LX.Music.MusicInfoOnline
quality?: LX.Quality
isRefresh: boolean
allowToggleSource?: boolean
onToggleSource?: (musicInfo?: LX.Music.MusicInfoOnline) => void
}): Promise<string> => {
// if (!musicInfo._types[type]) {
// // 兼容旧版酷我源搜索列表过滤128k音质的bug
// if (!(musicInfo.source == 'kw' && type == '128k')) throw new Error('该歌曲没有可播放的音频')
// // return Promise.reject(new Error('该歌曲没有可播放的音频'))
// }
const targetQuality = quality ?? getPlayQuality(appSetting['player.playQuality'], musicInfo)
const cachedUrl = await getStoreMusicUrl(musicInfo, targetQuality)
if (cachedUrl && !isRefresh) return cachedUrl
return handleGetOnlineMusicUrl({ musicInfo, quality, onToggleSource, isRefresh, allowToggleSource }).then(({ url, quality: targetQuality, musicInfo: targetMusicInfo, isFromCache }) => {
if (targetMusicInfo.id != musicInfo.id && !isFromCache) void saveMusicUrl(targetMusicInfo, targetQuality, url)
void saveMusicUrl(musicInfo, targetQuality, url)
return url
})
}
export const getPicUrl = async({ musicInfo, listId, isRefresh, allowToggleSource = true, onToggleSource = () => {} }: {
musicInfo: LX.Music.MusicInfoOnline
listId?: string | null
isRefresh: boolean
allowToggleSource?: boolean
onToggleSource?: (musicInfo?: LX.Music.MusicInfoOnline) => void
}): Promise<string> => {
if (musicInfo.meta.picUrl && !isRefresh) return musicInfo.meta.picUrl
return handleGetOnlinePicUrl({ musicInfo, onToggleSource, isRefresh, allowToggleSource }).then(({ url, musicInfo: targetMusicInfo, isFromCache }) => {
// picRequest = null
if (listId) {
musicInfo.meta.picUrl = url
void updateListMusics([{ id: listId, musicInfo }])
}
// savePic({ musicInfo, url, listId })
return url
})
}
export const getLyricInfo = async({ musicInfo, isRefresh, allowToggleSource = true, onToggleSource = () => {} }: {
musicInfo: LX.Music.MusicInfoOnline
isRefresh: boolean
allowToggleSource?: boolean
onToggleSource?: (musicInfo?: LX.Music.MusicInfoOnline) => void
}): Promise<LX.Player.LyricInfo> => {
if (!isRefresh) {
const lyricInfo = await getCachedLyricInfo(musicInfo)
if (lyricInfo) return buildLyricInfo(lyricInfo)
}
// lrcRequest = music[musicInfo.source].getLyric(musicInfo)
return handleGetOnlineLyricInfo({ musicInfo, onToggleSource, isRefresh, allowToggleSource }).then(async({ lyricInfo, musicInfo: targetMusicInfo, isFromCache }) => {
// lrcRequest = null
if (isFromCache) return buildLyricInfo(lyricInfo)
if (targetMusicInfo.id == musicInfo.id) void saveLyric(musicInfo, lyricInfo)
else void saveLyric(targetMusicInfo, lyricInfo)
return buildLyricInfo(lyricInfo)
})
}