From e47c84e5eb3c1dcfe8f10e21d565b488c382e364 Mon Sep 17 00:00:00 2001 From: alger Date: Sun, 18 May 2025 12:44:23 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=E4=BC=98=E5=8C=96B=E7=AB=99?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E8=A7=A3=E6=9E=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/api/bilibili.ts | 29 +++++++++++++++++++++++++++++ src/renderer/api/gdmusic.ts | 20 -------------------- src/renderer/api/music.ts | 30 ++++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/renderer/api/bilibili.ts b/src/renderer/api/bilibili.ts index 0998846..90fb550 100644 --- a/src/renderer/api/bilibili.ts +++ b/src/renderer/api/bilibili.ts @@ -152,3 +152,32 @@ export const getBilibiliAudioUrl = async (bvid: string, cid: number): Promise => { + try { + // 搜索B站视频,取第一页第一个结果 + const res = await searchBilibili({ keyword, page: 1, pagesize: 1 }); + const result = res.data?.data?.result; + if (!result || result.length === 0) { + throw new Error('未找到相关B站视频'); + } + const first = result[0]; + const bvid = first.bvid; + // 需要获取视频详情以获得cid + const detailRes = await getBilibiliVideoDetail(bvid); + const pages = detailRes.data.pages; + if (!pages || pages.length === 0) { + throw new Error('未找到视频分P信息'); + } + const cid = pages[0].cid; + // 获取音频URL + return await getBilibiliAudioUrl(bvid, cid); + } catch (error) { + console.error('根据名称搜索B站音频URL失败:', error); + throw error; + } +} \ No newline at end of file diff --git a/src/renderer/api/gdmusic.ts b/src/renderer/api/gdmusic.ts index 593c908..b2e232b 100644 --- a/src/renderer/api/gdmusic.ts +++ b/src/renderer/api/gdmusic.ts @@ -126,26 +126,6 @@ export const parseFromGDMusic = async ( } }; -/** - * 获取音质映射 - * @param qualitySetting 设置中的音质选项 - * @returns 映射到GD音乐台的音质参数 - */ -export const getQualityMapping = (qualitySetting: string): string => { - const qualityMap: Record = { - standard: '128', - higher: '320', - exhigh: '320', - lossless: '740', - hires: '999', - jyeffect: '999', - sky: '999', - dolby: '999', - jymaster: '999' - }; - return qualityMap[qualitySetting] || '320'; -}; - interface GDMusicUrlResult { url: string; br: string; diff --git a/src/renderer/api/music.ts b/src/renderer/api/music.ts index a8f5473..127f13f 100644 --- a/src/renderer/api/music.ts +++ b/src/renderer/api/music.ts @@ -5,7 +5,9 @@ import { isElectron } from '@/utils'; import request from '@/utils/request'; import requestMusic from '@/utils/request_music'; import { cloneDeep } from 'lodash'; -import { parseFromGDMusic, getQualityMapping } from './gdmusic'; +import { parseFromGDMusic } from './gdmusic'; +import type { SongResult } from '@/type/music'; +import { searchAndGetBilibiliAudioUrl } from './bilibili'; const { addData, getData, deleteData } = musicDB; @@ -80,7 +82,7 @@ export const getMusicLrc = async (id: number) => { } }; -export const getParsingMusicUrl = async (id: number, data: any) => { +export const getParsingMusicUrl = async (id: number, data: SongResult) => { const settingStore = useSettingsStore(); // 如果禁用了音乐解析功能,则直接返回空结果 @@ -98,7 +100,25 @@ export const getParsingMusicUrl = async (id: number, data: any) => { try { enabledSources = JSON.parse(savedSource); console.log(`使用歌曲 ${id} 自定义音源:`, enabledSources); + if(enabledSources.includes('bilibili')){ + // 构建搜索关键词,依次判断歌曲名称、歌手名称和专辑名称是否存在 + const songName = data?.name || ''; + const artistName = Array.isArray(data?.ar) && data.ar.length > 0 && data.ar[0]?.name ? data.ar[0].name : ''; + const albumName = data?.al && typeof data.al === 'object' && data.al?.name ? data.al.name : ''; + const name = [songName, artistName, albumName].filter(Boolean).join(' ').trim(); + console.log('开始搜索bilibili音频', name); + return { + data: { + code: 200, + message: 'success', + data: { + url: await searchAndGetBilibiliAudioUrl(name) + } + } + } + } } catch (e) { + console.error('e',e) console.error('解析自定义音源失败, 使用全局设置', e); enabledSources = settingStore.setData.enabledMusicSources || []; } @@ -108,13 +128,11 @@ export const getParsingMusicUrl = async (id: number, data: any) => { } // 检查是否选择了GD音乐台解析 + if (enabledSources.includes('gdmusic')) { // 获取音质设置并转换为GD音乐台格式 try { - const quality = getQualityMapping(settingStore.setData.musicQuality || 'higher'); - - // 调用封装的GD音乐台解析服务 - const gdResult = await parseFromGDMusic(id, data, quality); + const gdResult = await parseFromGDMusic(id, data, '999'); if (gdResult) { return gdResult; }