Scheme URL API新增 `music/searchPlay` 支持(#1886)
							parent
							
								
									8e7fd1ecef
								
							
						
					
					
						commit
						2ee7572634
					
				| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
- 新增 设置-播放设置-使用设备能处理的最大声道数输出音频 设置(未启用时固定为2声道输出),由于这用到高级音频API,考虑到在某些设备上的兼容问题,默认禁用(#1873)
 | 
			
		||||
- 允许添加 `m4a`、`oga` 格式的本地歌曲到列表中(#1864)
 | 
			
		||||
- 开放API支持跨域请求(#1872 @Ceale)
 | 
			
		||||
- Scheme URL API新增 `music/searchPlay` 支持,用于搜索并播放指定的歌曲名字,详细入参请阅读 Scheme URL 支持文档(#1886)
 | 
			
		||||
 | 
			
		||||
### 优化
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<LX.Music.MusicInfoOnline[]> => {
 | 
			
		||||
  if (!isRefresh) {
 | 
			
		||||
  if (!isRefresh && musicInfo.id) {
 | 
			
		||||
    const cachedInfo = await getOtherSourceFromStore(musicInfo.id)
 | 
			
		||||
    if (cachedInfo.length) return cachedInfo
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue