diff --git a/src/main/server.ts b/src/main/server.ts index 2824657..dc9d9e5 100644 --- a/src/main/server.ts +++ b/src/main/server.ts @@ -12,8 +12,8 @@ if (!fs.existsSync(path.resolve(os.tmpdir(), 'anonymous_token'))) { } // 处理解锁音乐请求 -ipcMain.handle('unblock-music', async (_, id) => { - return unblockMusic(id); +ipcMain.handle('unblock-music', async (_, id, data) => { + return unblockMusic(id, data); }); import server from 'netease-cloud-music-api-alger/server'; diff --git a/src/main/set.json b/src/main/set.json index b340616..bcc706c 100644 --- a/src/main/set.json +++ b/src/main/set.json @@ -6,12 +6,13 @@ "host": "127.0.0.1", "port": 7890 }, - "enableRealIP":false, - "realIP":"", + "enableRealIP": false, + "realIP": "", "noAnimate": false, "animationSpeed": 1, "author": "Alger", "authorUrl": "https://github.com/algerkong", "musicApiPort": 30488, - "closeAction": "ask" + "closeAction": "ask", + "musicQuality": "higher" } diff --git a/src/main/unblockMusic.ts b/src/main/unblockMusic.ts index 3b33407..7cfbc8c 100644 --- a/src/main/unblockMusic.ts +++ b/src/main/unblockMusic.ts @@ -1,8 +1,8 @@ import match from '@unblockneteasemusic/server'; -const unblockMusic = async (id: any): Promise => { +const unblockMusic = async (id: any, songData: any): Promise => { return new Promise((resolve, reject) => { - match(parseInt(id, 10), ['qq', 'migu', 'kugou', 'joox']) + match(parseInt(id, 10), ['qq', 'migu', 'kugou', 'joox'], songData) .then((data) => { resolve({ data: { diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index e4586d4..f272f39 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -12,7 +12,7 @@ declare global { dragStart: (data: string) => void; miniTray: () => void; restart: () => void; - unblockMusic: (id: number) => Promise; + unblockMusic: (id: number, data: any) => Promise; }; } } diff --git a/src/renderer/api/music.ts b/src/renderer/api/music.ts index a53e0cb..b84e5b1 100644 --- a/src/renderer/api/music.ts +++ b/src/renderer/api/music.ts @@ -3,9 +3,32 @@ import { IPlayMusicUrl } from '@/type/music'; import { isElectron } from '@/utils'; import request from '@/utils/request'; import requestMusic from '@/utils/request_music'; +import store from '@/store'; + +// 获取音乐音质详情 +export const getMusicQualityDetail = (id: number) => { + return request.get('/song/music/detail', { params: { id } }); +}; + // 根据音乐Id获取音乐播放URl -export const getMusicUrl = (id: number) => { - return request.get('/song/url', { params: { id } }); +export const getMusicUrl = async (id: number) => { + const res = await request.get('/song/download/url/v1', { + params: { + id, + level: store.state.setData.musicQuality || 'higher' + } + }); + + if (res.data.data.url) { + return {data:{ data:[{url:res.data.data.url}]}}; + } + + return await request.get('/song/url/v1', { + params: { + id, + level: store.state.setData.musicQuality || 'higher' + } + }); }; // 获取歌曲详情 @@ -18,9 +41,9 @@ export const getMusicLrc = (id: number) => { return request.get('/lyric', { params: { id } }); }; -export const getParsingMusicUrl = (id: number) => { +export const getParsingMusicUrl = (id: number, data: any) => { if (isElectron) { - return window.api.unblockMusic(id); + return window.api.unblockMusic(id, data); } return requestMusic.get('/music', { params: { id } }); }; diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index 15cc638..f817464 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -26,9 +26,12 @@ declare module 'vue' { NMessageProvider: typeof import('naive-ui')['NMessageProvider'] NModal: typeof import('naive-ui')['NModal'] NPopover: typeof import('naive-ui')['NPopover'] + NRadio: typeof import('naive-ui')['NRadio'] + NRadioGroup: typeof import('naive-ui')['NRadioGroup'] NScrollbar: typeof import('naive-ui')['NScrollbar'] NSelect: typeof import('naive-ui')['NSelect'] NSlider: typeof import('naive-ui')['NSlider'] + NSpace: typeof import('naive-ui')['NSpace'] NSpin: typeof import('naive-ui')['NSpin'] NSwitch: typeof import('naive-ui')['NSwitch'] NTag: typeof import('naive-ui')['NTag'] diff --git a/src/renderer/components/common/SongItem.vue b/src/renderer/components/common/SongItem.vue index 212f96b..19889eb 100644 --- a/src/renderer/components/common/SongItem.vue +++ b/src/renderer/components/common/SongItem.vue @@ -81,6 +81,7 @@ import type { SongResult } from '@/type/music'; import { getImgUrl, isElectron } from '@/utils'; import { getImageBackground } from '@/utils/linearColor'; import { getSongUrl } from '@/hooks/MusicListHook'; +import { cloneDeep } from 'lodash'; const props = withDefaults( defineProps<{ @@ -148,7 +149,7 @@ const downloadMusic = async () => { isDownloading.value = true; const loadingMessage = message.loading('正在下载中...', { duration: 0 }); - const url = await getSongUrl(props.item.id); + const url = await getSongUrl(props.item.id, cloneDeep(props.item)); if (!url) { loadingMessage.destroy(); message.error('获取音乐下载地址失败'); diff --git a/src/renderer/hooks/MusicListHook.ts b/src/renderer/hooks/MusicListHook.ts index a6b3901..7e76419 100644 --- a/src/renderer/hooks/MusicListHook.ts +++ b/src/renderer/hooks/MusicListHook.ts @@ -4,31 +4,31 @@ import { getMusicLrc, getMusicUrl, getParsingMusicUrl } from '@/api/music'; import { useMusicHistory } from '@/hooks/MusicHistoryHook'; import { audioService } from '@/services/audioService'; import type { ILyric, ILyricText, SongResult } from '@/type/music'; -import { getImgUrl, getMusicProxyUrl } from '@/utils'; +import { getImgUrl } from '@/utils'; import { getImageLinearBackground } from '@/utils/linearColor'; +import { cloneDeep } from 'lodash'; const musicHistory = useMusicHistory(); // 获取歌曲url -export const getSongUrl = async (id: number) => { +export const getSongUrl = async (id: number, songData: any) => { const { data } = await getMusicUrl(id); let url = ''; try { if (data.data[0].freeTrialInfo || !data.data[0].url) { - const res = await getParsingMusicUrl(id); - console.log('res', res); + const res = await getParsingMusicUrl(id, songData); url = res.data.data.url; } } catch (error) { console.error('error', error); } url = url || data.data[0].url; - return getMusicProxyUrl(url); + return url; }; const getSongDetail = async (playMusic: SongResult) => { playMusic.playLoading = true; - const playMusicUrl = await getSongUrl(playMusic.id); + const playMusicUrl = await getSongUrl(playMusic.id, cloneDeep(playMusic)); const { backgroundColor, primaryColor } = playMusic.backgroundColor && playMusic.primaryColor ? playMusic diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index fbec860..0f1b36a 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -6,15 +6,10 @@ import type { SongResult } from '@/type/music'; import { applyTheme, getCurrentTheme, ThemeType } from '@/utils/theme'; import { isElectron } from '@/utils'; import { likeSong, getLikedList } from '@/api/music'; +import setData from '@/../main/set.json' // 默认设置 -const defaultSettings = { - isProxy: false, - noAnimate: false, - animationSpeed: 1, - author: 'Alger', - authorUrl: 'https://github.com/algerkong' -}; +const defaultSettings = setData; function getLocalStorageItem(key: string, defaultValue: T): T { const item = localStorage.getItem(key); @@ -139,7 +134,6 @@ const mutations = { const actions = { initializeSettings({ commit }: { commit: any }) { if (isElectron) { - // const setData = (window as any).electron.ipcRenderer.getStoreValue('set'); const setData = window.electron.ipcRenderer.sendSync('get-store-value', 'set'); commit('setSetData', setData || defaultSettings); } else { diff --git a/src/renderer/utils/index.ts b/src/renderer/utils/index.ts index 27b40b6..744e054 100644 --- a/src/renderer/utils/index.ts +++ b/src/renderer/utils/index.ts @@ -54,34 +54,9 @@ export const formatNumber = (num: string | number) => { return num.toString(); }; -const windowData = window as any; -export const getIsMc = () => { - if (!windowData.electron) { - return false; - } - const setData = window.electron.ipcRenderer.sendSync('get-store-value', 'set'); - if (setData.isProxy) { - return true; - } - return false; -}; -const ProxyUrl = import.meta.env.VITE_API_PROXY; - -export const getMusicProxyUrl = (url: string) => { - if (!getIsMc()) { - return url; - } - const PUrl = url.split('').join('+'); - return `${ProxyUrl}/mc?url=${PUrl}`; -}; - export const getImgUrl = (url: string | undefined, size: string = '') => { - const bdUrl = 'https://image.baidu.com/search/down?url='; const imgUrl = `${url}?param=${size}`; - if (!getIsMc()) { - return imgUrl; - } - return `${bdUrl}${encodeURIComponent(imgUrl)}`; + return imgUrl; }; export const isMobile = computed(() => { diff --git a/src/renderer/utils/request.ts b/src/renderer/utils/request.ts index 87989dd..71fe3dc 100644 --- a/src/renderer/utils/request.ts +++ b/src/renderer/utils/request.ts @@ -44,7 +44,9 @@ request.interceptors.request.use( }; const token = localStorage.getItem('token'); if (token) { - config.params.cookie = token; + config.params.cookie = token + ' os=pc;'; + }else{ + config.params.cookie = 'os=pc;'; } } diff --git a/src/renderer/views/set/index.vue b/src/renderer/views/set/index.vue index 48e6a75..fc8b7b3 100644 --- a/src/renderer/views/set/index.vue +++ b/src/renderer/views/set/index.vue @@ -168,6 +168,27 @@ /> +
+
+
音质设置
+
选择音乐播放音质(VIP)
+
+ +
{ port: 7890 }; } + // 确保音质设置存在 + if (!data.musicQuality) { + data.musicQuality = 'higher'; + } return data; });