Compare commits

...

4 Commits

18 changed files with 857 additions and 1435 deletions

View File

@ -136,7 +136,7 @@ jobs:
esac
- name: Upload build artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.platform }}-binary
path: release-artifacts/*
@ -165,17 +165,16 @@ jobs:
fetch-tags: true
- name: Download build artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
path: release-artifacts
merge-multiple: true
- name: Flatten artifacts
- name: List flattened artifacts
shell: bash
run: |
mkdir -p final-artifacts
find release-artifacts -type f -exec cp {} final-artifacts/ \;
cp release-artifacts/* final-artifacts/
ls -lah final-artifacts
- name: Generate release notes

File diff suppressed because it is too large Load Diff

739
interface.d.ts vendored
View File

@ -1841,3 +1841,742 @@ export function voice_lyric(
id: number | string
} & RequestBaseConfig,
): Promise<Response>
export function aidj_content_rcmd(
params: {
latitude?: string | number
longitude?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function album_privilege(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function artist_detail_dynamic(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function artist_follow_count(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function broadcast_category_region_get(
params: RequestBaseConfig,
): Promise<Response>
export function broadcast_channel_collect_list(
params: MultiPageConfig & RequestBaseConfig,
): Promise<Response>
export function broadcast_channel_currentinfo(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function broadcast_channel_list(
params: {
categoryId?: string | number
regionId?: string | number
lastId?: string | number
score?: string | number
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>
export function broadcast_sub(
params: {
t: SubAction
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function chart_detail(
params: {
chartCode: string | number
targetId: string | number
targetType: string | number
} & RequestBaseConfig,
): Promise<Response>
export function chart_song_detail(
params: {
chartCode: string | number
targetId: string | number
targetType: string | number
} & RequestBaseConfig,
): Promise<Response>
export function cloud_import(
params: {
md5: string
id?: string | number
bitrate?: string | number
fileSize?: string | number
artist?: string
album?: string
song?: string
} & RequestBaseConfig,
): Promise<Response>
export function cloud_lyric_get(
params: {
uid: string | number
sid: string | number
} & RequestBaseConfig,
): Promise<Response>
export function cloud_upload_complete(
params: {
songId: string | number
resourceId: string | number
md5: string
filename: string
song?: string
artist?: string
album?: string
bitrate?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function cloud_upload_token(
params: {
md5: string
fileSize: string | number
filename: string
bitrate?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function comment_info_list(
params: {
ids?: string
type?: CommentType
} & RequestBaseConfig,
): Promise<Response>
export function comment_report(
params: {
id: string | number
cid: string | number
reason: string | number
} & RequestBaseConfig,
): Promise<Response>
export function creator_authinfo_get(
params: RequestBaseConfig,
): Promise<Response>
export function dj_difm_all_style_channel(
params: {
sources?: string
} & RequestBaseConfig,
): Promise<Response>
export function dj_difm_channel_subscribe(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function dj_difm_channel_unsubscribe(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function dj_difm_playing_tracks_list(
params: {
channelId: string | number
limit?: string | number
source?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function dj_difm_subscribe_channels_get(
params: {
sources?: string
} & RequestBaseConfig,
): Promise<Response>
export function fanscenter_basicinfo_age_get(
params: RequestBaseConfig,
): Promise<Response>
export function fanscenter_basicinfo_gender_get(
params: RequestBaseConfig,
): Promise<Response>
export function fanscenter_basicinfo_province_get(
params: RequestBaseConfig,
): Promise<Response>
export function fanscenter_overview_get(
params: RequestBaseConfig,
): Promise<Response>
export function fanscenter_trend_list(
params: {
startTime?: string | number
endTime?: string | number
type?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function lbs_city_code(
params: {
bizCode?: string
} & RequestBaseConfig,
): Promise<Response>
export function listen_data_realtime_report(
params: {
type?: string
} & RequestBaseConfig,
): Promise<Response>
export function listen_data_report(
params: {
type?: string
endTime?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listen_data_today_song(
params: RequestBaseConfig,
): Promise<Response>
export function listen_data_total(
params: RequestBaseConfig,
): Promise<Response>
export function listen_data_year_report(
params: RequestBaseConfig,
): Promise<Response>
export function listentogether_accept(
params: {
roomId: string | number
inviterId: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_end(
params: {
roomId: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_heatbeat(
params: {
roomId: string | number
songId: string | number
playStatus: string | number
progress: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_play_command(
params: {
roomId: string | number
commandType: string | number
progress?: string | number
playStatus: string | number
formerSongId: string | number
targetSongId: string | number
clientSeq: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_room_check(
params: {
roomId: string | number
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_room_create(
params: RequestBaseConfig,
): Promise<Response>
export function listentogether_sync_list_command(
params: {
roomId: string | number
commandType: string | number
userId: string | number
version: string | number
randomList: string
displayList: string
} & RequestBaseConfig,
): Promise<Response>
export function listentogether_sync_playlist_get(
params: {
roomId: string | number
} & RequestBaseConfig,
): Promise<Response>
export function mlog_music_rcmd(
params: {
mvid?: string | number
songid?: string | number
limit?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function music_first_listen_info(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function personal_fm_mode(
params: {
mode: string
submode?: string
limit?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function playlist_category_list(
params: {
cat?: string
limit?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function playlist_detail_rcmd_get(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function playlist_import_name_task_create(
params: {
local?: string
importStarPlaylist?: boolean
['name']?: string
['description']?: string
['id']?: string | number
['url']?: string
} & RequestBaseConfig,
): Promise<Response>
export function playlist_import_task_status(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function playlist_privacy(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function playmode_song_vector(
params: {
ids: string
} & RequestBaseConfig,
): Promise<Response>
export function radio_sport_get(
params: {
bpm?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function recent_listen_list(
params: RequestBaseConfig,
): Promise<Response>
export function recommend_songs_dislike(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function register_anonimous(
params: RequestBaseConfig,
): Promise<Response>
export function sati_resource_list(
params: {
tag: string
} & RequestBaseConfig,
): Promise<Response>
export function sati_resource_list_more(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function sati_resource_sub(
params: {
id: string | number
cancel?: string | boolean
} & RequestBaseConfig,
): Promise<Response>
export function sati_resource_sub_list(
params: RequestBaseConfig,
): Promise<Response>
export function sati_tag_list(
params: RequestBaseConfig,
): Promise<Response>
export function sati_timescene_resources_get(
params: RequestBaseConfig,
): Promise<Response>
export function search_match(
params: {
title?: string
album?: string
artist?: string
duration?: string | number
md5?: string
} & RequestBaseConfig,
): Promise<Response>
export function search_suggest_pc(
params: {
keyword: string
} & RequestBaseConfig,
): Promise<Response>
export function send_album(
params: {
id: string | number
msg?: string
user_ids: string
} & RequestBaseConfig,
): Promise<Response>
export function send_song(
params: {
id: string | number
msg?: string
user_ids: string
} & RequestBaseConfig,
): Promise<Response>
export function song_chorus(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_creators(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_downlist(
params: MultiPageConfig & RequestBaseConfig,
): Promise<Response>
export function song_download_url_v1(
params: {
id: string | number
level: SoundQualityType
} & RequestBaseConfig,
): Promise<Response>
export function song_dynamic_cover(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_like(
params: {
id: string | number
like?: string | boolean
uid?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_like_check(
params: {
ids: string
} & RequestBaseConfig,
): Promise<Response>
export function song_lyrics_mark(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_lyrics_mark_add(
params: {
id: string | number
markId?: string
data?: string
} & RequestBaseConfig,
): Promise<Response>
export function song_lyrics_mark_del(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_lyrics_mark_user_page(
params: MultiPageConfig & RequestBaseConfig,
): Promise<Response>
export function song_monthdownlist(
params: MultiPageConfig & RequestBaseConfig,
): Promise<Response>
export function song_music_detail(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_red_count(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function song_singledownlist(
params: MultiPageConfig & RequestBaseConfig,
): Promise<Response>
export function song_url_match(
params: {
id: string | number
source?: string
} & RequestBaseConfig,
): Promise<Response>
export function song_url_ncmget(
params: RequestBaseConfig,
): Promise<Response>
export function song_url_v1_302(
params: {
id: string | number
level: SoundQualityType
} & RequestBaseConfig,
): Promise<Response>
export function starpick_comments_summary(
params: RequestBaseConfig,
): Promise<Response>
export function summary_annual(
params: {
year: string
} & RequestBaseConfig,
): Promise<Response>
export function threshold_detail_get(
params: RequestBaseConfig,
): Promise<Response>
export function toplist_detail_v2(
params: RequestBaseConfig,
): Promise<Response>
export function ugc_album_get(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function ugc_artist_get(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function ugc_artist_search(
params: {
keyword: string
limit?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function ugc_detail(
params: {
auditStatus?: string
type?: string | number
sortBy?: string
order?: string
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>
export function ugc_mv_get(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function ugc_song_get(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function ugc_user_devote(
params: RequestBaseConfig,
): Promise<Response>
export function user_detail_new(
params: {
uid: string | number
} & RequestBaseConfig,
): Promise<Response>
export function user_follow_mixed(
params: {
size?: string | number
cursor?: string | number
scene?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function user_medal(
params: {
uid: string | number
} & RequestBaseConfig,
): Promise<Response>
export function user_mutualfollow_get(
params: {
uid: string | number
} & RequestBaseConfig,
): Promise<Response>
export function user_playlist_collect(
params: {
uid: string | number
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>
export function user_playlist_create(
params: {
uid: string | number
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>
export function user_social_status(
params: {
uid: string | number
} & RequestBaseConfig,
): Promise<Response>
export function user_social_status_edit(
params: {
type: string | number
iconUrl?: string
content?: string
actionUrl?: string
} & RequestBaseConfig,
): Promise<Response>
export function user_social_status_rcmd(
params: RequestBaseConfig,
): Promise<Response>
export function user_social_status_support(
params: RequestBaseConfig,
): Promise<Response>
export function verify_getQr(
params: {
vid: string | number
type: string | number
token: string
evid: string
sign: string
} & RequestBaseConfig,
): Promise<Response>
export function verify_qrcodestatus(
params: {
qr: string
} & RequestBaseConfig,
): Promise<Response>
export function vip_sign(
params: RequestBaseConfig,
): Promise<Response>
export function vip_sign_info(
params: RequestBaseConfig,
): Promise<Response>
export function vip_tasks_v1(
params: {
id?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function voice_detail(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function voice_upload(
params: {
songFile: {
name: string
data: string | Buffer
}
} & RequestBaseConfig,
): Promise<Response>
export function voicelist_detail(
params: {
id: string | number
} & RequestBaseConfig,
): Promise<Response>
export function voicelist_list(
params: {
voiceListId: string | number
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>
export function voicelist_my_created(
params: {
limit?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function voicelist_search(
params: {
keyword?: string
limit?: string | number
offset?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function voicelist_trans(
params: {
radioId?: string | number
programId?: string | number
position?: string | number
} & MultiPageConfig &
RequestBaseConfig,
): Promise<Response>

View File

@ -3,5 +3,9 @@
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
return request(`/api/vip-center-bff/task/sign`, data, createOption(query))
return request(
`/api/vip-center-bff/task/sign`,
data,
createOption(query, 'weapi'),
)
}

14
module/vip_sign_detail.js Normal file
View File

@ -0,0 +1,14 @@
// 黑胶乐签打卡详情
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
signDayTime: query.timestamp,
type: '1',
}
return request(
`/api/vipnewcenter/app/level/user/checkin/history/detail`,
data,
createOption(query, 'eapi'),
)
}

View File

@ -0,0 +1,13 @@
// 黑胶乐签打卡历史
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
type: '0',
}
return request(
`/api/vipnewcenter/app/minidesk/music/sign/pc`,
data,
createOption(query, 'xeapi'),
)
}

View File

@ -1,4 +1,4 @@
// 黑胶乐签签到信息
// 黑胶乐签未来签到信息
const createOption = require('../util/option.js')
module.exports = (query, request) => {

14
module/vip_tasks_v1.js Normal file
View File

@ -0,0 +1,14 @@
// 会员任务 - 新版
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
taskType: 'app_vip_task_center',
userId: query.id,
}
return request(
`/api/middle/vip/mission/user/progress/list`,
data,
createOption(query, 'xeapi'),
)
}

View File

@ -1,6 +1,6 @@
{
"name": "@neteasecloudmusicapienhanced/api",
"version": "4.34.0",
"version": "4.34.3",
"description": "全网最全的网易云音乐API接口 || A revival project for NeteaseCloudMusicApi Node.js Services (Half Refactor & Enhanced) || 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护",
"scripts": {
"dev": "nodemon app.js",
@ -41,6 +41,14 @@
],
"main": "main.js",
"types": "./interface.d.ts",
"repository": {
"type": "git",
"url": "git+https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git"
},
"bugs": {
"url": "https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced/issues"
},
"homepage": "https://neteasecloudmusicapienhanced.js.org/",
"engines": {
"node": ">=12"
},
@ -104,5 +112,9 @@
"power-assert": "^1.6.1",
"prettier": "^3.8.3",
"typescript": "^5.9.3"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
}
}

BIN
public/docs/aigen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@ -2,8 +2,6 @@
网易云音乐 NodeJS API Enhanced
最后更新于: 2026.2.15
## 灵感来自
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
@ -220,6 +218,10 @@ $ sudo docker run -d -p 3000:3000 netease-music-api
### 调用前须知
AI 生成的图,仅供娱乐()
![ai generated](./aigen.png)
!> 本项目不提供线上 demo, 只提供在线文档服务, 请不要轻易信任使用他人提供的公开服务,以免发生安全问题,泄露自己的账号和密码
!> 为使用方便,降低门槛, 文档示例接口直接使用了 GET 请求,本项目同时支持 GET/POST 请按实际需求使用 (POST 请求 url 必须添加时间戳,使每次请求 url 不一样,不然请求会被缓存)
@ -5028,7 +5030,7 @@ let data = encodeURIComponent(
**调用例子:** `/vip/sign`
### 黑胶乐签打卡信息
### 黑胶乐签未来打卡信息
说明: 登录后调用此接口, 获取黑胶乐签打卡信息
@ -5336,6 +5338,46 @@ let data = encodeURIComponent(
说明 : 调用此接口,可获取城市榜、城市风格榜等指定维度音乐排行榜歌曲列表
**必选参数 :**
`chartCode`: 榜单编码,如 `CITY_SONG_CHART``CITY_STYLE_SONG_CHART`
`targetId`: 目标 id,城市榜如 `110000`,城市风格榜如 北京华语流行榜 `110000_1020`。城市风格榜格式通常为 `城市 id_曲风 id`,其中曲风 id 可通过[曲风列表](#曲风列表)接口 `/style/list` 获取。城市榜的城市列表可通过[多级行政区划数据](#多级行政区划数据)接口传入 `bizCode=chart` 获取;城市风格榜的城市列表可通过该接口传空 `bizCode` 获取
`targetType`: 目标类型,如 `CITY``CITY_STYLE`
**接口地址 :** `/chart/song/detail`
**调用例子 :** `/chart/song/detail?chartCode=CITY_STYLE_SONG_CHART&targetId=110000_1020&targetType=CITY_STYLE`
### 会员任务 - 新版
说明 : 登录后调用此接口, 获取会员任务
**可选参数** `id`: 用户 id, 传入后可获取指定用户的会员任务, 不传入则获取当前登录用户的会员任务
**接口地址 :** `/vip/task/v1`
**调用例子 :** `/vip/task/v1` `/vip/task/v1?id=32953014`
### 黑胶乐签详情
说明 : 登录后调用此接口, 传入时间戳, 获取黑胶乐签详情
**必选参数 :** `timestamp`: 时间戳, 单位毫秒, 如 `1704067200000` 表示 2024 年 12 月 31 日 0 点 (不传入会出现随机的乐签详情)
**接口地址 :** `/vip/sign/detail`
**调用例子 :** `/vip/sign/detail`
### 黑胶乐签历史
说明 : 登录后调用此接口, 获取黑胶乐签历史
**接口地址 :** `/vip/sign/history`
**调用例子 :** `/vip/sign/history`
## 离线访问此文档
此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问

Binary file not shown.

Before

Width:  |  Height:  |  Size: 858 KiB

View File

@ -108,7 +108,7 @@
name: '网易云音乐 API Enhanced',
repo: 'https://github.com/neteasecloudmusicapienhanced/api-enhanced',
coverpage: true,
homepage: 'https://cdn.jsdelivr.net/gh/NeteaseCloudMusicApiEnhanced/api-enhanced@main/public/docs/home.md',
homepage: 'home.md',
}
</script>
<script src="https://unpkg.com/docsify@4.11.3/lib/docsify.min.js"></script>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 992 KiB

BIN
public/static/2170.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -5,7 +5,10 @@ const createOption = (query, crypto = '') => {
ua: query.ua || '',
proxy: query.proxy,
realIP: query.realIP,
randomCNIP: process.env.ENABLE_RANDOM_CN_IP === 'true' ? !['false', false].includes(query.randomCNIP) : ['true', true].includes(query.randomCNIP),
randomCNIP:
process.env.ENABLE_RANDOM_CN_IP === 'true'
? !['false', false].includes(query.randomCNIP)
: ['true', true].includes(query.randomCNIP),
e_r: query.e_r || undefined,
domain: query.domain || '',
checkToken: query.checkToken || false,