diff --git a/publish/changeLog.md b/publish/changeLog.md index 6fae43fc..ff0a96a5 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -3,6 +3,7 @@ - 新增 设置-播放设置-使用设备能处理的最大声道数输出音频 设置(未启用时固定为2声道输出),由于这用到高级音频API,考虑到在某些设备上的兼容问题,默认禁用(#1873) - 允许添加 `m4a`、`oga` 格式的本地歌曲到列表中(#1864) - 开放API支持跨域请求(#1872 @Ceale) +- Scheme URL API新增 `music/searchPlay` 支持,用于搜索并播放指定的歌曲名字,详细入参请阅读 Scheme URL 支持文档(#1886) ### 优化 diff --git a/src/renderer/core/music/utils.ts b/src/renderer/core/music/utils.ts index d2fd89af..098c2f96 100644 --- a/src/renderer/core/music/utils.ts +++ b/src/renderer/core/music/utils.ts @@ -17,7 +17,7 @@ const getOtherSourcePromises = new Map() export const existTimeExp = /\[\d{1,2}:.*\d{1,4}\]/ export const getOtherSource = async(musicInfo: LX.Music.MusicInfo | LX.Download.ListItem, isRefresh = false): Promise => { - if (!isRefresh) { + if (!isRefresh && musicInfo.id) { const cachedInfo = await getOtherSourceFromStore(musicInfo.id) if (cachedInfo.length) return cachedInfo } diff --git a/src/renderer/core/useApp/useDeeplink/index.ts b/src/renderer/core/useApp/useDeeplink/index.ts index c4a0238e..e0b84290 100644 --- a/src/renderer/core/useApp/useDeeplink/index.ts +++ b/src/renderer/core/useApp/useDeeplink/index.ts @@ -38,7 +38,7 @@ export default () => { console.log(params) switch (type) { case 'music': - handleMusicAction(action, params) + await handleMusicAction(action, params) break case 'songlist': await handleSonglistAction(action, params) diff --git a/src/renderer/core/useApp/useDeeplink/useMusicAction.js b/src/renderer/core/useApp/useDeeplink/useMusicAction.js index 03daf7a1..01bca77d 100644 --- a/src/renderer/core/useApp/useDeeplink/useMusicAction.js +++ b/src/renderer/core/useApp/useDeeplink/useMusicAction.js @@ -10,6 +10,7 @@ import { focusWindow } from '@renderer/utils/ipc' import { playNext } from '@renderer/core/player/action' import { toNewMusicInfo } from '@common/utils/tools' import { LIST_IDS } from '@common/constants' +import { getOtherSource } from '@renderer/core/music/utils' const useSearchMusic = () => { const router = useRouter() @@ -159,11 +160,68 @@ const usePlayMusic = () => { } } + +const useSearchPlayMusic = () => { + const verifyInfo = (info) => { + return dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], max: 200 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: 'playLater', types: ['boolean'] }, + ], info) + } + + const searchMusic = async(name, singer, albumName, interval) => { + return getOtherSource({ + name, + singer, + interval, + meta: { + albumName, + }, + source: 'local', + id: `sp_${name}_s${singer}_a${albumName}_i${interval ?? ''}`, + }) + } + return async({ paths, data }) => { + // console.log(paths, data) + let info + if (paths.length) { + let name = paths[0] + let singer = '' + if (name.includes('-')) [name, singer] = name.split('-').map(val => val.trim()) + info = { + name, + singer, + } + } else info = data + info = verifyInfo(info) + const musicList = await searchMusic(info.name, info.singer || '', info.albumName || '', info.interval || null) + if (musicList.length) { + console.log('find music:', musicList) + const musicInfo = musicList[0] + markRaw(musicInfo) + const isPlaying = !!playMusicInfo.musicInfo + if (info.playLater) { + addTempPlayList([{ listId: LIST_IDS.PLAY_LATER, musicInfo }]) + } else { + addTempPlayList([{ listId: LIST_IDS.PLAY_LATER, musicInfo, isTop: true }]) + if (isPlaying) playNext() + } + } else { + console.log('msuic not found:', info) + } + } +} + export default () => { const handleSearchMusic = useSearchMusic() const handlePlayMusic = usePlayMusic() + const handleSearchPlayMusic = useSearchPlayMusic() - return (action, info) => { + + return async(action, info) => { switch (action) { case 'search': handleSearchMusic(info) @@ -171,6 +229,9 @@ export default () => { case 'play': handlePlayMusic(info) break + case 'searchPlay': + await handleSearchPlayMusic(info) + break default: throw new Error('Unknown action: ' + action) } }