Files
AlgerMusicPlayer/src/renderer/api/music.ts
alger b86661ca11 feat: 替换 netease-cloud-music-api-alger 为官方 NeteaseCloudMusicApi
- 依赖从 netease-cloud-music-api-alger@4.26 升级为 NeteaseCloudMusicApi@4.29
- 新增 fmTrash API 支持私人FM不喜欢功能
- getPersonalFM 移除重复 timestamp(拦截器已自动添加)
2026-03-16 23:11:25 +08:00

231 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { musicDB } from '@/hooks/MusicHook';
import { useSettingsStore, useUserStore } from '@/store';
import type { ILyric } from '@/types/lyric';
import type { SongResult } from '@/types/music';
import request from '@/utils/request';
import { MusicParser, type MusicParseResult } from './musicParser';
const { addData, getData, deleteData } = musicDB;
// 将 FM 歌曲移至垃圾桶(不喜欢)
export const fmTrash = (id: number) => {
return request.post('/fm_trash', null, {
params: { id, timestamp: Date.now() }
});
};
// 获取音乐音质详情
export const getMusicQualityDetail = (id: number) => {
return request.get('/song/music/detail', { params: { id } });
};
// 根据音乐Id获取音乐播放URl
export const getMusicUrl = async (id: number, isDownloaded: boolean = false) => {
const userStore = useUserStore();
const settingStore = useSettingsStore();
// 判断是否登录
try {
if (userStore.user && isDownloaded && userStore.user.vipType !== 0) {
const url = '/song/download/url/v1';
const res = await request.get(url, {
params: {
id,
level: settingStore.setData.musicQuality || 'higher',
encodeType: settingStore.setData.musicQuality == 'lossless' ? 'aac' : 'flac',
cookie: `${localStorage.getItem('token')} os=pc;`
}
});
if (res.data.data.url) {
return { data: { data: [{ ...res.data.data }] } };
}
}
} catch (error) {
console.error('error', error);
}
return await request.get('/song/url/v1', {
params: {
id,
level: settingStore.setData.musicQuality || 'higher',
encodeType: settingStore.setData.musicQuality == 'lossless' ? 'aac' : 'flac'
}
});
};
// 获取歌曲详情
export const getMusicDetail = (ids: Array<number>) => {
return request.get('/song/detail', { params: { ids: ids.join(',') } });
};
// 根据音乐Id获取音乐歌词
export const getMusicLrc = async (id: number) => {
const TEN_DAYS_MS = 10 * 24 * 60 * 60 * 1000; // 10天的毫秒数
try {
// 尝试获取缓存的歌词
const cachedLyric = await getData('music_lyric', id);
if (cachedLyric?.createTime && Date.now() - cachedLyric.createTime < TEN_DAYS_MS) {
return { ...cachedLyric };
}
// 获取新的歌词数据
const res = await request.get<ILyric>('/lyric/new', { params: { id } });
// 只有在成功获取新数据后才删除旧缓存并添加新缓存
if (res?.data) {
if (cachedLyric) {
await deleteData('music_lyric', id);
}
addData('music_lyric', { id, data: res.data, createTime: Date.now() });
}
return res;
} catch (error) {
console.error('获取歌词失败:', error);
throw error; // 向上抛出错误,让调用者处理
}
};
/**
* 获取解析后的音乐URL
* @param id 歌曲ID
* @param data 歌曲数据
* @returns 解析结果
*/
export const getParsingMusicUrl = async (
id: number,
data: SongResult
): Promise<MusicParseResult> => {
return await MusicParser.parseMusic(id, data);
};
// 收藏歌曲
export const likeSong = (id: number, like: boolean = true) => {
return request.get('/like', { params: { id, like } });
};
// 将每日推荐中的歌曲标记为不感兴趣,并获取一首新歌
export const dislikeRecommendedSong = (id: number | string) => {
return request.get('/recommend/songs/dislike', {
params: { id }
});
};
// 获取用户喜欢的音乐列表
export const getLikedList = (uid: number) => {
return request.get('/likelist', {
params: { uid, noLogin: true }
});
};
// 创建歌单
export const createPlaylist = (params: { name: string; privacy: number }) => {
return request.post('/playlist/create', params);
};
// 添加或删除歌单歌曲
export const updatePlaylistTracks = (params: {
op: 'add' | 'del';
pid: number;
tracks: string;
}) => {
return request.post('/playlist/tracks', params);
};
/**
* 根据类型获取列表数据
* @param type 列表类型 album/playlist
* @param id 列表ID
*/
export function getMusicListByType(type: string, id: string) {
if (type === 'album') {
return getAlbumDetail(id);
} else if (type === 'playlist') {
return getPlaylistDetail(id);
}
return Promise.reject(new Error('未知列表类型'));
}
/**
* 获取专辑详情
* @param id 专辑ID
*/
export function getAlbumDetail(id: string) {
return request({
url: '/album',
method: 'get',
params: {
id
}
});
}
/**
* 获取歌单详情
* @param id 歌单ID
*/
export function getPlaylistDetail(id: string) {
return request({
url: '/playlist/detail',
method: 'get',
params: {
id
}
});
}
export function subscribePlaylist(params: { t: number; id: number }) {
return request({
url: '/playlist/subscribe',
method: 'post',
params
});
}
/**
* 收藏/取消收藏专辑
* @param params t: 1 收藏, 2 取消收藏; id: 专辑id
*/
export function subscribeAlbum(params: { t: number; id: number }) {
return request({
url: '/album/sub',
method: 'post',
params
});
}
/**
* 获取历史日推可用日期列表
*/
export function getHistoryRecommendDates() {
return request({
url: '/history/recommend/songs',
method: 'get'
});
}
/**
* 获取历史日推详情数据
* @param date 日期格式YYYY-MM-DD
*/
export function getHistoryRecommendSongs(date: string) {
return request({
url: '/history/recommend/songs/detail',
method: 'get',
params: { date }
});
}
/**
* 心动模式/智能播放
* @param params id: 歌曲id, pid: 歌单id, sid: 要开始播放的歌曲id(可选)
*/
export function getIntelligenceList(params: { id: number; pid: number; sid?: number }) {
return request({
url: '/playmode/intelligence/list',
method: 'get',
params
});
}