Compare commits

..
2001 Commits
Author SHA1 Message Date
MoeFurina 0a5a1242f2 feat: 新增免费听接口 2026-07-15 16:14:19 +08:00
MoeFurina 6946dc8e14 docs: 修改运行要求 2026-07-12 10:42:50 +08:00
MoeFurina 22b78779ca Merge branch 'main' of https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced 2026-07-11 17:20:25 +08:00
MoeFurina 35607f5050 perf: 改进api调试页面 2026-07-11 17:20:14 +08:00
Takanashi Hoshino 60af95ac06 Merge pull request #210 from laoshuikaixue/feature/artist-new-song-playall
feat(artist): 添加关注歌手新歌播放全部&新作品接口
2026-07-11 17:04:55 +08:00
LaoShui 46073e5f50 docs(docs): 更新 sourceType 参数说明
- 明确 `1` 表示新歌,其他取值待确认
- 添加默认值 `1` 的标注
2026-07-10 23:07:31 +08:00
LaoShui bf12abe2f1 feat(artist): 添加关注歌手新作品(歌曲/MV)接口
- 新增 module/artist_new_song_mv_list_v2.js 模块实现接口逻辑
- 在文档中添加接口说明、参数详情和调用示例
- 在 TypeScript 定义文件中添加对应的接口类型声明
- 支持分页获取关注歌手的新歌曲和 MV 列表
- 实现时间游标和翻页功能支持
- 提供多种可选参数配置选项
2026-07-10 19:20:54 +08:00
LaoShui 1491b91829 feat(artist): 添加关注歌手新歌播放全部功能
- 新增 module/artist_new_song_playall.js 文件实现获取所有关注歌手最近50首新歌的功能
- 在文档中添加关注歌手最近新歌播放全部接口说明和调用示例
- 在类型定义文件中添加 artist_new_song_playall 函数声明
2026-07-10 18:56:50 +08:00
MoeFurina 63f669d7f8 fix: 黑胶乐签签到失败 (#197) 2026-06-30 14:34:58 +08:00
Furina's Little Ocean Act Theater d525204dda Merge pull request #199 from zhuixingzhe-baisheng/add-vip-growthpoint-getall
feat: add vip_growthpoint_getall - one-click claim all VIP growth rew…
2026-06-29 16:14:42 +08:00
Furina's Little Ocean Act Theater 6eb31984fd Merge pull request #200 from floatwoozy/feat/listen-data-song-play-rank
feat: 新增 listen_data_song_play_rank 歌曲播放排行接口
2026-06-29 16:14:11 +08:00
MoeFurina 9faeb0aa25 docs: 删减文档内容 2026-06-29 15:53:01 +08:00
floatwoozy f6db3e76e9 feat: 新增 listen_data_song_play_rank 歌曲播放排行接口
新增 /api/content/activity/listen/data/song/play/rank,返回某周/月
听歌排行(每首带 playCount),默认 Top20、不足则返回全部。与已有的
listen_data_today_song(今日)同族,补全「带次数的历史周/月榜」。

- module/listen_data_song_play_rank.js:type(week|month) + endTime 参数
- interface.d.ts:补类型声明
- public/docs/home.md:补接口文档
2026-06-25 03:25:20 +08:00
MonkeyCode Agent 9163d48f0a feat: add vip_growthpoint_getall - one-click claim all VIP growth rewards (xeapi)
- New module: module/vip_growthpoint_getall.js
- Uses xeapi encryption for direct  endpoint
- No parameters required, claims all completed task rewards at once
- Added TypeScript type declaration in interface.d.ts
- Added API documentation in public/docs/home.md
2026-06-21 05:24:35 +00:00
MoeFurina 1454ee216c fix: 请求异常 (83ee2cda34) 2026-06-20 23:28:08 +08:00
MoeFurina 83ee2cda34 feat: add NCBL encrypted scrobble interface and update related documentation
- Implemented new scrobble endpoint for NCBL encrypted logs in `scrobble_v1.js`.
- Updated `scrobble.js` to use domain from config.
- Enhanced `scrobble.html` with tabbed interface for original and NCBL versions, including new input fields.
- Added cookie handling and quick fill functionality for both versions.
- Updated `config.json` to include new domain configurations.
- Introduced `ncbl.js` for NCBL encryption utilities.
- Improved documentation in `home.md` to reflect changes in API usage.
2026-06-20 22:51:51 +08:00
MoeFurina 3c352b5752 feat: 新增听歌打卡示例页面 2026-06-20 21:16:14 +08:00
MoeFurina 60ee927e32 fix: 修复听歌打卡接口 (#167) 2026-06-19 15:11:31 +08:00
MoeFurina eb07a525eb feat: 支持显示加密方式 2026-06-18 23:46:11 +08:00
MoeFurina 6fc4231142 feat(docs-format): 增加文档格式化工具 2026-06-18 23:05:44 +08:00
MoeFurina fa69736300 revert: some changes
This reverts commit c959866436.
2026-06-18 22:52:35 +08:00
MoeFurina 73a5e9d788 Revert "feat: 增加文档格式化工具"
This reverts commit 6550c7c827.
2026-06-18 22:51:34 +08:00
MoeFurina dc6f56e8a8 Revert "fix(deploy): 修复部分启动失败 (#196)"
This reverts commit 395a80e74b.
2026-06-18 22:50:53 +08:00
MoeFurina 2c9da8507d Revert "refactor: 优化serverless入口文件"
This reverts commit 1db354464f.
2026-06-18 22:50:51 +08:00
MoeFurina 1db354464f refactor: 优化serverless入口文件 2026-06-18 22:29:24 +08:00
MoeFurina 395a80e74b fix(deploy): 修复部分启动失败 (#196) 2026-06-18 21:00:06 +08:00
MoeFurina 6550c7c827 feat: 增加文档格式化工具 2026-06-13 23:49:30 +08:00
MoeFurina c959866436 feat: 增强配置生成逻辑,添加重试机制和日志记录 2026-06-13 21:21:33 +08:00
MoeFurina e3a1c041b6 fix: 修复游客登陆接口 2026-06-09 00:09:48 +08:00
MoeFurina e2324e26da Merge remote-tracking branch 'origin/dependabot/github_actions/docker/login-action-4' 2026-06-09 00:09:09 +08:00
MoeFurina f01e770c35 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/types/node-25.9.1' 2026-06-09 00:08:41 +08:00
MoeFurina abb56ec014 Merge remote-tracking branch 'origin/dependabot/github_actions/aormsby/Fork-Sync-With-Upstream-action-3.4.3' 2026-06-09 00:08:23 +08:00
dependabot[bot] 0300c1b51e build(packages): bump @types/node from 25.5.0 to 25.9.2
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.5.0 to 25.9.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-06 07:42:44 +00:00
MoeFurina 9896242333 bump 4.35.0 2026-06-06 15:40:08 +08:00
MoEFusion e3812be97b Merge pull request #182 from zhuixingzhe-baisheng/feat/add-relay-play-state-submit
feat: add relay_play_state_submit API for song play state tracking
2026-06-06 15:36:27 +08:00
MoeFurina e7ff0da4ba refactor: 自动生成sessionID 2026-06-06 15:33:15 +08:00
MoeFurina 65261fa658 Merge branch 'main' into pr/182 2026-06-06 15:23:37 +08:00
MoEFusionandgemini-code-assist[bot] cb5b2e7d0f Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-06-06 15:22:25 +08:00
MoeFurina f58fd4b50d feat: 新增云盘歌曲下载链接接口 (1a5f91a192) 2026-06-06 15:20:06 +08:00
MoeFurina 1a5f91a192 feat: 新增从云盘获取歌曲下载链接接口 2026-06-06 15:17:28 +08:00
MoeFurina 50cc26f297 feat: 为xeapi重构相关接口以优化密钥获取流程 2026-06-06 14:52:33 +08:00
MoeFurina c92613b19e fix: 更新GitHub Actions和Dockerfile中的依赖版本 2026-05-30 20:58:03 +08:00
MoeFurina 7aacc8990b feat: 新增和改进黑胶乐签相关接口 2026-05-30 20:45:24 +08:00
MoeFurina 8e934789a1 ci: 修复Dockerfile的错误配置 2026-05-30 20:17:22 +08:00
MoeFurina d26e6b0615 feat: 新增新版会员任务接口 (#173) 2026-05-30 20:02:00 +08:00
dependabot[bot] a9c33de182 chore(deps): bump docker/login-action from 3 to 4
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-30 10:24:02 +00:00
MoeFurina d0935f6e42 feat: add xeapi support and refactor eapi_decrypt to api_decrypt
- Added xeapi option to the API selection dropdown in api.html.
- Removed eapi_decrypt.html and created a new api_decrypt.html for unified API decryption.
- Implemented multi-crypto support in api_decrypt.html with corresponding UI changes.
- Created decrypt.js module to handle decryption logic for different crypto types including xeapi.
- Updated request.js to remove unnecessary debug logs and improve code clarity.
- Updated index.html to link to the new api_decrypt.html instead of the removed eapi_decrypt.html.
2026-05-30 00:17:24 +08:00
MoeFurina 3e0337ab94 Merge branch 'pr/186' 2026-05-30 00:14:39 +08:00
LuoRain 5cf43c48ef fix: wrong unit for yrc 2026-05-30 00:03:27 +08:00
MoeFurina 68567f4a14 perf: 更新Bug报告模板和配置 2026-05-29 23:24:24 +08:00
MoEFusion d0d71bb4f9 Merge pull request #183 from 1254qwer/feat/xeapi-crypto
feat: 新增 xeapi 算法支持
2026-05-29 22:49:37 +08:00
MoeFurina ec7eff1697 Merge branch 'pr/183' 2026-05-29 22:46:26 +08:00
MoeFurina 1882c3c31e fix workflows 2026-05-29 22:17:16 +08:00
1254qwer f21f5677e8 feat: Add xeapi crypto support 2026-05-29 21:56:27 +08:00
MoeFurina fc5a76d5e2 Merge branch 'main' into main 2026-05-29 21:54:27 +08:00
MoeFurina fbc34a1846 Merge branch 'pr/178' 2026-05-29 21:53:29 +08:00
MoeFurina 3ef5ea341b Merge branch 'pr/179' 2026-05-29 21:53:11 +08:00
MoeFurina 4195c41171 bump 4.33.1 2026-05-29 21:49:21 +08:00
MoeFurina 232cc3d916 Squashed commit of the following:
commit 01d391ac91
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Mon May 25 13:05:14 2026 +0800

    Update util/option.js

    Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

commit 85d70ba9dd
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Mon May 25 12:56:34 2026 +0800

    Update util/option.js

    Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

commit 3cfecbcc1f
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Mon May 25 12:51:29 2026 +0800

    Update util/option.js

    Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

commit c6e9746ed6
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Mon May 25 01:47:53 2026 +0000

    fix: 修正为原始逻辑,简化代码

commit d6961ecb4d
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Sun May 24 18:11:35 2026 +0000

    feat: 当ENABLE_RANDOM_CN_IP为true时,除非请求参数randomCNIP显式为false,默认开启randomCNIP
2026-05-29 17:20:07 +08:00
MoeFurina 1b4af30a49 Squashed commit of the following:
commit 02242eecf6
Author: Sunset Mikoto <26019675+SunsetMkt@users.noreply.github.com>
Date:   Sun May 24 18:00:36 2026 +0000

    fix: randomCNIP 不工作
2026-05-29 17:19:41 +08:00
Developer 39e0e0718d feat: add relay_play_state_submit API for song play state tracking
- Add new interface /api/relay/play/state/submit
- Support sessionId tracking for play sessions
- Support playMode parameter (list_loop, single_loop, random, single)
- Add parameter validation
- Include integration documentation
2026-05-28 13:00:21 +00:00
Sunset Mikotoandgemini-code-assist[bot] 01d391ac91 Update util/option.js
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-05-25 13:05:14 +08:00
Sunset Mikotoandgemini-code-assist[bot] 85d70ba9dd Update util/option.js
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-05-25 12:56:34 +08:00
Sunset Mikotoandgemini-code-assist[bot] 3cfecbcc1f Update util/option.js
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-05-25 12:51:29 +08:00
Sunset Mikoto c6e9746ed6 fix: 修正为原始逻辑,简化代码 2026-05-25 01:47:53 +00:00
Sunset Mikoto d6961ecb4d feat: 当ENABLE_RANDOM_CN_IP为true时,除非请求参数randomCNIP显式为false,默认开启randomCNIP 2026-05-24 18:11:35 +00:00
Sunset Mikoto 02242eecf6 fix: randomCNIP 不工作 2026-05-24 18:00:36 +00:00
MoeFurina 269456def3 fix: 去除对github registry 的支持 2026-05-22 20:45:00 +08:00
MoeFurina 086e379f2c fix(workflow): 移动 pnpm 设置步骤以避免重复 2026-05-22 20:27:20 +08:00
MoeFurina 38803a18ae feat(workflow): 新增版本变更时创建发布的工作流 2026-05-22 20:19:59 +08:00
MoeFurina 3980d09bcd feat(上游): 新增多级行政区划和指定维度音乐排行榜接口 2026-05-22 19:59:42 +08:00
MoeFurina 64d4847350 fix(workflow): 移除发布条件检查以简化工作流 2026-05-16 10:43:28 +08:00
MoeFurina cf74e90c1d fix(workflow): fix cant publish packages 2026-05-16 10:40:21 +08:00
MoeFurina a366983e99 feat: 新增评论举报接口 && bump 4.32.1 2026-05-16 10:21:46 +08:00
dependabot[bot] 6175d55f89 chore(deps): bump aormsby/Fork-Sync-With-Upstream-action
Bumps [aormsby/Fork-Sync-With-Upstream-action](https://github.com/aormsby/fork-sync-with-upstream-action) from 3.4.2 to 3.4.3.
- [Release notes](https://github.com/aormsby/fork-sync-with-upstream-action/releases)
- [Commits](https://github.com/aormsby/fork-sync-with-upstream-action/compare/v3.4.2...v3.4.3)

---
updated-dependencies:
- dependency-name: aormsby/Fork-Sync-With-Upstream-action
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-01 14:54:43 +00:00
MoEFusion 15fa49a2e8 Merge pull request #164 from irtrdr/main 2026-05-01 14:00:51 +08:00
irtrdr f5fe69c863 feat: 更新song_copyright_rcmd接口参数为可选 2026-04-29 04:09:54 +08:00
irtrdr b6be789ccd feat: 新增灰色歌曲其他版本推荐接口 2026-04-29 03:55:21 +08:00
MoeFurina 0395d087d9 Merge branch 'main' into main 2026-04-19 10:19:41 +08:00
wlm3201 3f679c0d87 日推接口增加刷新参数 2026-04-18 11:40:13 +08:00
MoeFurina ba9c6deaee feat: 新增助眠解压相关模块 && bump 4.32.0 2026-04-17 20:41:31 +08:00
MoeFurina 2c36daf07a bump 4.31.0 2026-03-28 00:09:46 +08:00
ElyPrism 5b5f380cd5 Merge pull request #136 from laoshuikaixue/feature/cors-multi-domain 2026-03-20 23:39:06 +08:00
ElyPrism ff7c5518d1 Merge pull request #138 from NeteaseCloudMusicApiEnhanced/up-4.31.0 2026-03-20 20:14:14 +08:00
MoeFurina bbb2b9d4a0 docs: 更新文档 2026-03-20 20:08:47 +08:00
MoeFurina 3188238678 feat: 添加DIFM相关接口 2026-03-20 20:05:40 +08:00
MoeFurina 8e60324452 chore: update deps 2026-03-20 20:02:04 +08:00
MoeFurina c9909cddd3 Merge remote-tracking branch 'origin/dependabot/github_actions/actions/upload-artifact-7' into up-4.31.0 2026-03-20 19:58:27 +08:00
MoeFurina dbdbba3f98 Squashed commit of the following:
commit ed0208eb89
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Mar 1 12:48:11 2026 +0000

    chore(deps): bump actions/download-artifact from 7 to 8

    Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8.
    - [Release notes](https://github.com/actions/download-artifact/releases)
    - [Commits](https://github.com/actions/download-artifact/compare/v7...v8)

    ---
    updated-dependencies:
    - dependency-name: actions/download-artifact
      dependency-version: '8'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 19:58:19 +08:00
LaoShui 27aa9a01cb fix(cors): 修复CORS源验证逻辑
- 移除无效的请求源回退逻辑
- 简化Vary头设置条件判断
- 优化CORS允许源验证流程
2026-03-14 21:14:18 +08:00
LaoShui 30e522018f feat(server): 支持多域名CORS配置
- 实现了逗号分隔的多域名CORS配置解析功能
- 新增parseCorsAllowOrigins函数处理域名列表解析
- 新增getCorsAllowOrigin函数实现动态域名匹配逻辑
- 更新CORS响应头设置逻辑支持多域名验证
- 添加Vary: Origin响应头优化缓存策略
- 修改README文档说明多域名配置方式
2026-03-14 21:03:58 +08:00
LaoShui 7b2507e43d refactor(server): 修复函数名拼写错误
- 将 consturctServer 函数名更正为 constructServer
- 更新调用处的函数名称以保持一致性
2026-03-14 19:24:52 +08:00
ElyPrism 3647fc5fa0 Merge branch 'add-new-modules' to main 2026-03-14 00:28:04 +08:00
MoeFurina 8521c198d3 docs: 更新readme 2026-03-14 00:25:43 +08:00
MoeFurina 4d8c4daa14 docs: 更新文档 2026-03-13 23:35:03 +08:00
ElyPrismandgemini-code-assist[bot] 2e3cf4d451 Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-08 12:00:17 +08:00
ElyPrismandgemini-code-assist[bot] 288459cddb fix: 修复部分拼写错误
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-08 11:59:15 +08:00
ElyPrismandgemini-code-assist[bot] c1b8a381f3 fix: module/voicelist_search.js 拼写错误
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-08 11:53:03 +08:00
MoeFurina 2dd12b88ae feat: 新增评论相关接口并更新部分接口 2026-03-08 11:42:32 +08:00
ElyPrism b6a1f9ce0a Merge branch 'main' into main 2026-03-08 09:24:54 +08:00
RedSTAR.Cheng 5991e41c5d Merge branch 'NeteaseCloudMusicApiEnhanced:main' into main 2026-03-04 10:21:38 +08:00
dependabot[bot] f61554714c chore(deps): bump actions/upload-artifact from 6 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 12:48:05 +00:00
RedSTARO 266cd8d059 chore: doc update for 302 endpoint 2026-03-01 14:03:54 +08:00
RedSTARO 89a70b14d4 refactor: simplify /song/url/v1/302 call chain 2026-03-01 13:48:28 +08:00
ElyPrism a9332af453 Merge branch 'main' into main
build(version): bump to 4.30.2
2026-02-28 15:52:06 +08:00
MoeFurina cffe68d9ff upd changelog 2026-02-28 15:51:47 +08:00
MoeFurina 75ec2de66f feat: update doc icon 2026-02-28 15:37:02 +08:00
MoeFurina 0bd023c188 Merge branch 'main' into chore/bump-4.30.2 2026-02-28 15:33:16 +08:00
ElyPrism 2c82c9b7be Merge branch 'add-comment-info' into 'main' 2026-02-28 15:29:10 +08:00
imsyy 1320e5780b feat: 更新文档 2026-02-28 14:52:13 +08:00
imsyy bde1f0864b feat: 更新文档 2026-02-28 14:50:04 +08:00
imsyy e891287f1a feat: 添加评论统计数据 2026-02-28 14:42:25 +08:00
RedSTARO 59241631db feat: add song download url api end point for 302
* This will redirect access from http://localhost:3000/song/url/v1?id=2756058128&level=exhigh to actual resource url
2026-02-26 20:12:43 +08:00
MoeFurina 29ef4f68c2 docs: update readme 2026-02-26 18:43:17 +08:00
MoeFurina ee25eb17a6 docs: update readme 2026-02-23 23:30:55 +08:00
MoeFurina 31d2ec9225 chore: clean up empty code change sections in the changes log 2026-02-23 23:12:01 +08:00
ElyPrismandgemini-code-assist[bot] b45bdd411f Update README.MD
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-22 22:20:15 +08:00
MoeFurina c14b06f6c3 build: update deps 2026-02-22 22:16:39 +08:00
ElyPrism b027aca40a Merge branch 'feat/cloud-upload-modes' into 'main'
feat(cloud): 添加云盘上传模式选择功能并优化上传配置
2026-02-19 12:04:19 +08:00
LaoShui b1729f19aa style(code): 格式化代码
- 将长参数列表拆分为多行以提高可读性
- 标准化函数调用中的逗号使用
- 统一对象和数组的换行格式
- 更新 ESLint 配置中的 ECMA 版本至 2020,以支持 ES2020 语法(包括 Optional Chaining)
- 优化代码缩进和对齐方式
- 确保所有文件中的代码风格一致性
2026-02-19 11:52:19 +08:00
LaoShui 755489546b refactor(util): 简化文件帮助工具函数
- 移除未使用的 path 模块引入
- 将 getFileExtension 函数从异步改为同步
- 优化 sanitizeFilename 函数逻辑,移除冗余扩展名处理
2026-02-18 20:24:43 +08:00
LaoShui 92df6e13a0 refactor(cloud): 重构文件处理逻辑并提取辅助函数
- 将文件大小、MD5计算等逻辑提取到 fileHelper 工具模块
- 使用统一的文件扩展名和文件名处理函数
- 简化临时文件处理和清理逻辑
- 统一文件上传数据获取方式
- 移除重复的文件操作代码并提高可维护性
2026-02-18 20:19:46 +08:00
LaoShui 1ad8ab088f fix(cloud): 修改上传接口Cookie参数传递方式
- 将Cookie参数从URL查询字符串改为请求体传递
- 更新token接口调用以将cookie作为data参数发送
- 更新complete接口调用以将cookie作为data参数发送
- 修改API文档说明Cookie参数传递方式变更
- 确保Cookie值通过POST请求体安全传输
2026-02-18 19:37:32 +08:00
LaoShui a09f126ab2 fix(upload): 修复文件上传功能中的路径替换和临时文件支持
- 将单个斜杠替换改为全局正则替换以正确处理所有路径分隔符
- 移除未使用的 crypto 模块引入
- 添加对临时文件上传的支持,使用 fs 模块读取临时文件
- 动态设置 Content-Type 头部,优先使用文件的 mimetype 属性
- 重构多处文件上传逻辑以支持流式读取大文件
- 优化分片上传时的文件大小获取方式
2026-02-18 19:09:15 +08:00
LaoShui 872bae1b43 feat(cloud): 添加音频元数据解析功能
- 集成 jsmediatags 库用于解析音频文件的 ID3 标签
- 实现 parseMediaTags 函数提取歌曲标题、艺术家和专辑信息
- 在上传前添加音频元数据解析步骤
- 将解析的元数据传递给 completeUpload 函数
- 使用元数据中的标题作为歌曲名称,提高准确性
- 添加默认值处理以防止解析失败
- 更新 completeUpload 函数接收文件对象和媒体标签参数
- 移除模块中不再使用的文件扩展名提取逻辑
2026-02-18 18:49:05 +08:00
LaoShui 83c527af01 feat(cloud): 添加云盘上传模式选择和进度显示功能
- 添加客户端直传和后端代理两种上传模式选项
- 实现上传进度条和状态显示界面
- 添加文件MD5计算和上传凭证获取功能
- 支持大文件上传和断点续传机制
- 新增cloud/upload/token和cloud/upload/complete接口
- 更新文档说明上传模式和接口使用方法
- 优化上传按钮禁用状态和提示信息显示
2026-02-18 18:42:28 +08:00
LaoShui 84efe5d758 chore(deps): 更新依赖包版本并移除冗余依赖
- 移除了 express-fileupload 中的 md5 依赖
- 将多个开发依赖包从固定版本改为范围版本(^)
- 更新了 typescript、eslint 等核心依赖的版本声明
- 移除了 charenc、crypt、is-buffer 等冗余依赖包
- 更新了 @typescript-eslint 相关包的版本引用
- 清理了依赖树中的重复和无用条目
2026-02-18 17:24:45 +08:00
LaoShui cfa475bf94 chore(deps): 更新依赖包版本并移除不需要的依赖
- 移除了 md5 依赖包
- 移除了 @neteasecloudmusicapienhanced/unblockmusic-utils 重复依赖
- 移除了 axios 重复依赖
- 移除了 dotenv 重复依赖
- 移除了 music-metadata 重复依赖
- 将开发依赖包版本从固定版本号更新为 ^ 版本范围
- 统一了依赖包版本管理格式
2026-02-18 17:13:50 +08:00
LaoShui 4087bafd7d fix(cloud): 解决临时文件清理和上传流程中的错误处理问题
- 修复了临时文件清理失败时的日志消息本地化
- 移除了重复的临时文件清理调用,统一在 finally 块中处理
- 优化了错误处理逻辑,确保在各种异常情况下正确返回错误响应
- 更新了日志消息为中文描述,提高可读性
- 修复了上传插件中的日志消息本地化问题
- 统一了错误处理流程,避免重复的清理操作
2026-02-18 17:09:02 +08:00
LaoShui 8951e32a0e refactor(server): 优化文件上传配置和MD5计算逻辑
- 移除cloud.js中的异步Promise包装,直接同步计算MD5哈希值
- 在server.js中提取上传大小限制为常量配置
- 统一使用字节单位常量管理文件上传大小限制
- 简化代码结构,提高可读性和维护性
2026-02-18 17:02:15 +08:00
LaoShui 33ccc83615 fix(cloud): 解决临时文件清理和异步操作问题
- 添加异步临时文件清理函数避免资源泄露
- 将同步文件操作改为异步操作提高性能
- 在令牌分配失败时执行临时文件清理
- 在上传失败时确保临时文件被清理
- 使用 Promise 包装 MD5 计算操作
- 统一临时文件清理逻辑到 finally 块
2026-02-18 16:57:20 +08:00
LaoShui 2d6173b2aa fix(cloud): 移除了重复的条件判断 2026-02-18 16:50:20 +08:00
LaoShui ba7d1a8574 feat(cloud): 支持临时文件上传功能
- 使用 crypto 模块替换 md5 模块进行文件哈希计算
- 添加对临时文件上传的支持,当存在 tempFilePath 时使用文件流处理
- 实现临时文件的 MD5 计算和元数据解析功能
- 在上传完成后自动清理临时文件
- 配置服务器端文件上传中间件启用临时文件支持
- 修改上传插件以支持临时文件读取流上传方式
- 增加文件大小获取和验证的兼容性处理
2026-02-18 16:44:19 +08:00
LaoShui 26d55255e0 fix(cloud): 解决云上传功能中的错误处理和代码清理
- 移除注释掉的废弃代码和调试信息
- 添加详细的错误处理和日志记录
- 验证token分配结果并处理失败情况
- 在上传过程中添加异常捕获和错误抛出
- 验证LBS响应的有效性并处理网络请求超时
- 改进上传流程的错误处理机制
2026-02-18 16:17:07 +08:00
LaoShui 4489f10f63 feat(server): 增加文件上传大小限制并优化配置
- 将请求体大小限制从 50MB 增加到 500MB
- 配置文件上传中间件支持 500MB 大小限制
- 设置临时文件目录为 /tmp/
- 启用 useTempFiles 选项以提高性能
- 配置达到限制时自动中止上传
2026-02-18 16:08:40 +08:00
ElyPrism 2047bdfa65 Merge branch 'main' into 'main'
refactor: Refactor random Chinese IP generator
2026-02-15 00:20:25 +08:00
MoeFurina bc9d7b949f fix: 修复注入随机ip不生效 2026-02-15 00:06:42 +08:00
MoeFurina f08f192328 refactor: 重构随机中国ip 2026-02-14 23:50:59 +08:00
ElyPrism b04b9d51fb Merge branch 'main' of 'main'
更加优雅的显示URL和调试按钮
2026-02-14 12:09:45 +08:00
BakaCookie520 c91f5f3714 更加优雅的显示URL和调试按钮 2026-02-14 00:01:19 +08:00
ElyPrism 7fceec12e4 Merge branch "Burial0268/main" into "main" 2026-02-12 19:28:43 +08:00
拜瑞andgemini-code-assist[bot] 1df147edab fix(server): prevent obj[2]=undefined if there is no options passed
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-02-12 19:21:02 +08:00
Burial0268 6d1f75f229 fix(server): Correctly inject client IP into request parameters 2026-02-12 18:59:32 +08:00
2a0b54e442 feat: Add user playlist endpoints & domain overrides (bump 4.30.1) (#105)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-11 16:49:11 +08:00
github-actions[bot]andgithub-actions[bot] a19418bbb6 Auto-build: Add compiled binaries for win, linux, macos (#104)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-10 11:38:47 +08:00
ce51da9150 build(version): bump 4.30.0 (#102)
* chore(deps): bump actions/checkout from 4 to 6

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Squashed commit of the following:

commit f73cbbeec3
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Feb 1 12:47:57 2026 +0000

    chore(deps): bump actions/download-artifact from 4 to 7

    Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 7.
    - [Release notes](https://github.com/actions/download-artifact/releases)
    - [Commits](https://github.com/actions/download-artifact/compare/v4...v7)

    ---
    updated-dependencies:
    - dependency-name: actions/download-artifact
      dependency-version: '7'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

* Squashed commit of the following:

commit 4da2d5f360
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Feb 1 12:48:00 2026 +0000

    chore(deps): bump actions/github-script from 7 to 8

    Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.
    - [Release notes](https://github.com/actions/github-script/releases)
    - [Commits](https://github.com/actions/github-script/compare/v7...v8)

    ---
    updated-dependencies:
    - dependency-name: actions/github-script
      dependency-version: '8'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

* Squashed commit of the following:

commit 9e65b17625
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Feb 1 12:47:49 2026 +0000

    chore(deps): bump actions/setup-node from 4 to 6

    Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
    - [Release notes](https://github.com/actions/setup-node/releases)
    - [Commits](https://github.com/actions/setup-node/compare/v4...v6)

    ---
    updated-dependencies:
    - dependency-name: actions/setup-node
      dependency-version: '6'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

* Squashed commit of the following:

commit a060f3c4cc
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Sun Feb 1 12:47:53 2026 +0000

    chore(deps): bump actions/upload-artifact from 4 to 6

    Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6.
    - [Release notes](https://github.com/actions/upload-artifact/releases)
    - [Commits](https://github.com/actions/upload-artifact/compare/v4...v6)

    ---
    updated-dependencies:
    - dependency-name: actions/upload-artifact
      dependency-version: '6'
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

* build(version): bump 4.30.0

* refactor: QR login and voice upload pages with improved UI and error handling

- Enhanced styling for better user experience on qrlogin-nocookie.html and qrlogin.html
- Added loading indicators and improved status messages during QR code login process
- Updated error handling for login status retrieval
- Refactored unblock_test.html for better layout and user interaction
- Improved voice upload page with a more intuitive design and better feedback for file uploads
- Added loading state management for voice list retrieval
- Enhanced accessibility and usability across all modified pages

* fix: Potential fix for code scanning alert no. 6: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 15: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* build: update utils

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-02-09 23:33:26 +08:00
Yon8 27002d7665 feat: add musician_vip_tasks API, its module, and home.md documentation. (#95) 2026-02-05 00:29:02 +08:00
github-actions[bot]andgithub-actions[bot] 43d1c72f8f Auto-build: Add compiled binaries for win, linux, macos (#88)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-31 14:37:48 +08:00
MoeFurina 1d7e9cb6d8 fix(workflow): 修复低级错误 2026-01-31 14:32:42 +08:00
ElyPrism 609c910d5a ci: 支持action自动编译可执行文件 2026-01-31 14:22:00 +08:00
MoeFurina 2b69e9dda5 chore(packages): bump version 4.29.21 2026-01-30 23:13:13 +08:00
MoeFurina 796c2803df Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/typescript-eslint/parser-8.53.0' 2026-01-30 23:08:07 +08:00
MoeFurina ab00919a93 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/types/node-25.0.9' 2026-01-30 23:07:58 +08:00
dependabot[bot] db2ca44bbc chore(packages): bump @typescript-eslint/parser from 8.51.0 to 8.53.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.51.0 to 8.53.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.53.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.53.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 14:35:05 +00:00
dependabot[bot] 6c79f7495b chore(packages): bump @types/node from 25.0.3 to 25.0.9
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.0.3 to 25.0.9.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 14:34:32 +00:00
dependabot[bot] fd0608adef chore(packages): bump eslint-plugin-prettier from 5.5.4 to 5.5.5
Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 5.5.4 to 5.5.5.
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.4...v5.5.5)

---
updated-dependencies:
- dependency-name: eslint-plugin-prettier
  dependency-version: 5.5.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-19 14:34:19 +00:00
f6fc452666 更新 README 以反映 Node.js 版本要求和 Docker 使用说明 (#80)
Co-authored-by: binaryify <binaryify@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-16 22:58:19 +08:00
MoeFurina 748d5da8fe fix(require): fix modules not defined 2026-01-09 21:44:03 +08:00
dependabot[bot] 6613fbf50d chore(packages): bump @types/node from 24.10.0 to 24.10.1 (#57)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-03 01:50:08 +08:00
dependabot[bot] c8493b93ad chore(packages): bump @typescript-eslint/parser from 8.46.3 to 8.48.0 (#67)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-03 01:49:49 +08:00
dependabot[bot] b93578a879 chore(packages): bump prettier from 3.6.2 to 3.7.3 (#66)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-03 01:47:59 +08:00
dependabot[bot] de54c7fe97 chore(packages): bump @typescript-eslint/eslint-plugin (#59)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-03 01:47:38 +08:00
MoeFurina 2e707e2f5e Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/lint-staged-16.2.7' 2026-01-03 01:43:23 +08:00
MoeFurina 2994e2fadd Merge remote-tracking branch 'origin/dependabot/github_actions/peter-evans/create-or-update-comment-5' 2026-01-03 01:43:15 +08:00
MoeFurina eb08ed4ba3 Merge remote-tracking branch 'origin/dependabot/github_actions/actions/stale-10' 2026-01-03 01:43:09 +08:00
MoeFurina d5fedb5c54 Merge remote-tracking branch 'origin/dependabot/github_actions/actions/checkout-6' 2026-01-03 01:43:02 +08:00
MoeFurina f2f78b2774 fix(workflows): update branch references and remove unused push triggers
feat: enhance eapi_decrypt.html with styled decode result display

fix: update qrlogin and qrlogin-nocookie to include platform parameter in QR code creation URL

chore: bump music-metadata and other dependencies in package.json and pnpm-lock.yaml

docs: update README with important project usage notes
2026-01-03 01:36:21 +08:00
dependabot[bot] 871414f2e6 chore(deps): bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-26 11:55:00 +00:00
MoeFurina 2d3f15f0e5 revert: revive back workflow 2025-12-26 19:54:03 +08:00
ElyPrismandgemini-code-assist[bot] 598dd8bd34 refactor(unblock): Refactor song URL matching to use new utils package (#73)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-26 19:51:13 +08:00
ElyPrismandYiQing-House 30bd839809 feat(module): add vip daily signin (#72)
Co-authored-by: YiQing-House <72288016+1662187689@users.noreply.github.com>
2025-12-20 10:14:50 +08:00
MoeFurina d4ee3b88f8 docs: upd doc 2025-12-20 00:45:53 +08:00
MoeFurina 77eb154028 fix(eslint): replace double quotes with single quotes 2025-12-19 21:05:04 +08:00
ElyPrism 140ea858c4 Merge pull request #70 from apoint123/fix/phone-login 2025-12-19 20:59:24 +08:00
apoint123 f7f8c54236 fix: 修复验证码登录 2025-12-18 18:21:05 +08:00
MoeFurina bcda215a6c chore(deps): update dependences 2025-12-12 20:24:24 +08:00
MoeFurina ca6834b83f ci(docker): fix cannot be deployed by linux arm64 2025-12-06 23:00:49 +08:00
dependabot[bot] c8fba0f7d1 chore(deps): bump actions/stale from 8 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 15:08:15 +00:00
dependabot[bot] 546a84b1b8 chore(deps): bump peter-evans/create-or-update-comment from 4 to 5
Bumps [peter-evans/create-or-update-comment](https://github.com/peter-evans/create-or-update-comment) from 4 to 5.
- [Release notes](https://github.com/peter-evans/create-or-update-comment/releases)
- [Commits](https://github.com/peter-evans/create-or-update-comment/compare/v4...v5)

---
updated-dependencies:
- dependency-name: peter-evans/create-or-update-comment
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 15:08:11 +00:00
ElyPrism 205ac7292f Merge pull request #62 from NeteaseCloudMusicApiEnhanced/chore/upd-deps 2025-11-29 12:36:11 +08:00
MoeFurina 1aba68561d 🐳 chore(deps): update dependences 2025-11-29 12:33:03 +08:00
ElyPrism bd2fdff5ae Merge pull request #55 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/music-metadata-11.10.3 2025-11-28 19:23:52 +08:00
dependabot[bot] 4af8323694 chore(packages): bump lint-staged from 16.2.6 to 16.2.7
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.2.6 to 16.2.7.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.2.6...v16.2.7)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 16.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 14:15:19 +00:00
dependabot[bot] a5a1a91dfa chore(packages): bump music-metadata from 11.10.0 to 11.10.3
Bumps [music-metadata](https://github.com/Borewit/music-metadata) from 11.10.0 to 11.10.3.
- [Release notes](https://github.com/Borewit/music-metadata/releases)
- [Commits](https://github.com/Borewit/music-metadata/compare/v11.10.0...v11.10.3)

---
updated-dependencies:
- dependency-name: music-metadata
  dependency-version: 11.10.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 14:15:05 +00:00
ElyPrism ee43878834 Merge pull request #53 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/mocha-11.7.5 2025-11-15 15:25:31 +08:00
MoeFurina 9d18639464 fix(eslint): fix files which have eslint problems 2025-11-15 13:25:09 +08:00
MoeFurina fe28194445 refactor(generateRandomChineseIP): 完善随机中国ip功能 2025-11-15 13:11:29 +08:00
dependabot[bot] b14cb9bb24 chore(packages): bump mocha from 11.7.4 to 11.7.5
Bumps [mocha](https://github.com/mochajs/mocha) from 11.7.4 to 11.7.5.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/v11.7.5/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v11.7.4...v11.7.5)

---
updated-dependencies:
- dependency-name: mocha
  dependency-version: 11.7.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-15 03:18:39 +00:00
ElyPrism 06739b2d6d Merge pull request #51 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/typescript-eslint/parser-8.46.3 2025-11-15 00:31:26 +08:00
MoeFurina 8639c9d0f1 chore(deps): update dependences 2025-11-15 00:28:14 +08:00
dependabot[bot] bc4a0d4916 chore(packages): bump @typescript-eslint/parser from 8.46.2 to 8.46.3
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.46.2 to 8.46.3.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.3/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.46.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 14:48:48 +00:00
MoeFurina 4e00b94ee6 chore: 删除过时的issue模板和更新bug报告及功能请求模板 2025-11-09 10:51:14 +08:00
MoeFurina 9019a2a4a5 fix(type): covert "music-metadata" esm to cjs 2025-11-09 08:21:51 +08:00
MoeFurina 3a10a4d753 ci(debug): add more debug info 2025-11-08 15:28:36 +08:00
MoeFurina f39aafaff4 docs: update doc 2025-11-08 12:52:19 +08:00
ElyPrism 2a8fb72d1d Merge pull request #41 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/actions/setup-node-6 2025-11-07 22:13:52 +08:00
ElyPrism ea6ab4f6f7 Merge pull request #42 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/docker/build-push-action-6 2025-11-07 22:13:42 +08:00
ElyPrism 6fe19a71e3 Merge pull request #43 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/actions/checkout-5 2025-11-07 22:13:30 +08:00
ElyPrism abd3a79ecd Merge branch 'main' into dependabot/github_actions/actions/checkout-5 2025-11-07 22:13:21 +08:00
ElyPrism 044ef355c1 Merge pull request #47 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/types/node-24.10.0 2025-11-07 22:13:07 +08:00
ElyPrism 2944ca42ba Merge pull request #45 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/music-metadata-11.9.0 2025-11-07 22:12:52 +08:00
MoeFurina d4d465e731 chore(deps): update dependences 2025-11-07 19:03:04 +08:00
ElyPrism f49d3cac19 Merge pull request #48 from Cinvin/main 2025-11-07 19:00:32 +08:00
5unV 2f2755ac8c feat: 增加云盘歌词接口 2025-11-06 10:04:13 +08:00
dependabot[bot] f46c0d4a84 chore(packages): bump @types/node from 24.9.1 to 24.10.0
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.9.1 to 24.10.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 12:42:34 +00:00
dependabot[bot] 14ee86e15b chore(packages): bump music-metadata from 7.14.0 to 11.9.0
Bumps [music-metadata](https://github.com/Borewit/music-metadata) from 7.14.0 to 11.9.0.
- [Release notes](https://github.com/Borewit/music-metadata/releases)
- [Commits](https://github.com/Borewit/music-metadata/compare/v7.14.0...v11.9.0)

---
updated-dependencies:
- dependency-name: music-metadata
  dependency-version: 11.9.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 12:42:01 +00:00
dependabot[bot] 5e820187a1 chore(deps): bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 12:18:20 +00:00
dependabot[bot] 781299c1c5 chore(deps): bump docker/build-push-action from 5 to 6
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 12:18:15 +00:00
dependabot[bot] 8fc6ed1a76 chore(deps): bump actions/setup-node from 5 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 12:18:12 +00:00
MoeFurina 8bb68accee ci(action): fix workflows which pnpm is not installed 2025-11-01 13:23:30 +08:00
MoeFurina 55858d89d9 ci(action): switch GitHub Actions to use pnpm and update actions 2025-11-01 13:16:50 +08:00
MoeFurina 597ac1498f fix(eslint): fix files which have eslint problems 2025-11-01 13:11:38 +08:00
MoeFurina 398f410109 fix: update music search keyword and test case ID
- Changed the default search keyword in the API documentation from "这么可爱真是抱歉" to "妖精小姐的魔法邀约".
- Updated the test case for fetching song URL to use the correct song ID (from 1969519579 to 2756058128).
2025-11-01 12:16:29 +08:00
ElyPrism 97980b5ac3 Merge pull request #36 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/eslint-config-prettier-10.1.8
chore(packages): bump eslint-config-prettier from 8.5.0 to 10.1.8
2025-10-29 13:09:14 +08:00
ElyPrism 65ff21526a Merge pull request #37 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/types/mocha-10.0.10
chore(packages): bump @types/mocha from 9.1.1 to 10.0.10
2025-10-29 13:09:06 +08:00
ElyPrism fb052fdecd Merge pull request #38 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/typescript-5.9.3
chore(packages): bump typescript from 4.5.2 to 5.9.3
2025-10-29 13:08:58 +08:00
ElyPrism b6453a1c1b Merge pull request #39 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/yargs-18.0.0
chore(packages): bump yargs from 17.7.2 to 18.0.0
2025-10-29 13:08:49 +08:00
ElyPrism 0c3da3bcb7 Merge pull request #40 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/lint-staged-16.2.6
chore(packages): bump lint-staged from 16.2.4 to 16.2.6
2025-10-29 13:08:38 +08:00
dependabot[bot] 80fbd7a620 chore(packages): bump lint-staged from 16.2.4 to 16.2.6
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.2.4 to 16.2.6.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.2.4...v16.2.6)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 16.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 13:51:16 +00:00
dependabot[bot] a4c9c0edaf chore(packages): bump yargs from 17.7.2 to 18.0.0
Bumps [yargs](https://github.com/yargs/yargs) from 17.7.2 to 18.0.0.
- [Release notes](https://github.com/yargs/yargs/releases)
- [Changelog](https://github.com/yargs/yargs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs/compare/v17.7.2...v18.0.0)

---
updated-dependencies:
- dependency-name: yargs
  dependency-version: 18.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 13:50:05 +00:00
dependabot[bot] 19e51bc39a chore(packages): bump typescript from 4.5.2 to 5.9.3
Bumps [typescript](https://github.com/microsoft/TypeScript) from 4.5.2 to 5.9.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v4.5.2...v5.9.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 5.9.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 13:39:32 +00:00
dependabot[bot] a914b5bc11 chore(packages): bump @types/mocha from 9.1.1 to 10.0.10
Bumps [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha) from 9.1.1 to 10.0.10.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/mocha)

---
updated-dependencies:
- dependency-name: "@types/mocha"
  dependency-version: 10.0.10
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 13:39:31 +00:00
dependabot[bot] 5eeeaeee8a chore(packages): bump eslint-config-prettier from 8.5.0 to 10.1.8
Bumps [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) from 8.5.0 to 10.1.8.
- [Release notes](https://github.com/prettier/eslint-config-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-config-prettier/compare/v8.5.0...v10.1.8)

---
updated-dependencies:
- dependency-name: eslint-config-prettier
  dependency-version: 10.1.8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 13:21:55 +00:00
ElyPrism 1ab9def4d5 Merge pull request #32 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/husky-9.1.7 2025-10-25 12:14:59 +08:00
dependabot[bot] 446ad4c871 chore(packages): bump husky from 7.0.4 to 9.1.7
Bumps [husky](https://github.com/typicode/husky) from 7.0.4 to 9.1.7.
- [Release notes](https://github.com/typicode/husky/releases)
- [Commits](https://github.com/typicode/husky/compare/v7.0.4...v9.1.7)

---
updated-dependencies:
- dependency-name: husky
  dependency-version: 9.1.7
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 04:14:44 +00:00
ElyPrism 316826dd81 Merge pull request #33 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/typescript-eslint/parser-5.62.0 2025-10-25 12:13:47 +08:00
ElyPrism 11a240cb18 Merge pull request #24 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/mocha-11.7.4 2025-10-25 12:13:39 +08:00
ElyPrism df2d0e6431 Merge pull request #34 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/types/node-24.8.1 2025-10-25 12:13:29 +08:00
ElyPrism a1436e1d64 Merge pull request #26 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/eslint-plugin-prettier-5.5.4 2025-10-25 12:13:19 +08:00
dependabot[bot] 1f87ccf080 chore(packages): bump @types/node from 24.6.1 to 24.8.1
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.6.1 to 24.8.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.8.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 04:12:03 +00:00
dependabot[bot] 323b1014d2 chore(packages): bump @typescript-eslint/parser from 5.0.0 to 5.62.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.0.0 to 5.62.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.62.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 5.62.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 04:12:00 +00:00
dependabot[bot] d2351f6f30 chore(packages): bump mocha from 11.7.3 to 11.7.4
Bumps [mocha](https://github.com/mochajs/mocha) from 11.7.3 to 11.7.4.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v11.7.3...v11.7.4)

---
updated-dependencies:
- dependency-name: mocha
  dependency-version: 11.7.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 04:11:54 +00:00
dependabot[bot] dd653c07e9 chore(packages): bump eslint-plugin-prettier from 4.0.0 to 5.5.4
Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 4.0.0 to 5.5.4.
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v4.0.0...v5.5.4)

---
updated-dependencies:
- dependency-name: eslint-plugin-prettier
  dependency-version: 5.5.4
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-25 04:11:52 +00:00
MoeFurina 173496f305 build(ci): delete useless lock files 2025-10-25 12:10:23 +08:00
MoeFurina b45739b621 refactor(index): rewrite api index pages without ai and update dependences 2025-10-24 17:51:23 +08:00
ElyPrism f63068b386 Merge pull request #31 from NeteaseCloudMusicApiEnhanced/fix/user_accout-returns-null 2025-10-18 14:21:16 +08:00
ElyPrism 927b79030b edit funding sources in FUNDING.yml
Removed WeChat & Alipay from funding options.

Signed-off-by: ElyPrism <noreply@focalors.ltd>
2025-10-18 14:20:38 +08:00
ImFurina 6d6eee13b9 docs: upd readme 2025-10-17 22:01:32 +08:00
ElyPrism a7f086cf8f Merge pull request #30 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/lint-staged-16.2.4 2025-10-17 21:39:31 +08:00
dependabot[bot] a38d689de4 chore(packages): bump lint-staged from 12.1.7 to 16.2.4
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 12.1.7 to 16.2.4.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v12.1.7...v16.2.4)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 16.2.4
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-17 13:39:20 +00:00
ElyPrism 4ffb20c4ff Merge pull request #25 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-5.62.0 2025-10-17 21:37:34 +08:00
ElyPrism 84c19ee237 Merge pull request #22 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/dotenv-17.2.3 2025-10-17 21:37:22 +08:00
ImFurina f3d95f17b4 build(env): disable global dotenv file 2025-10-17 21:35:27 +08:00
ImFurina 6d33efee47 build(ci): change the package name 2025-10-17 20:06:30 +08:00
dependabot[bot] acc458f6cb chore(packages): bump @typescript-eslint/eslint-plugin
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.0.0 to 5.62.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.62.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 5.62.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-08 03:42:32 +00:00
ImFurina d78a20ea11 feat(randomCNIP): 添加随机中国IP选项 2025-10-08 11:40:40 +08:00
ImFurina 2cbd17a6d7 fix(typeerror): 尝试修复vercel调用 500错误 2025-10-07 15:08:05 +08:00
dependabot[bot] 240d8042fb chore(packages): bump dotenv from 16.6.1 to 17.2.3
Bumps [dotenv](https://github.com/motdotla/dotenv) from 16.6.1 to 17.2.3.
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v16.6.1...v17.2.3)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 17.2.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 14:52:04 +00:00
ElyPrism f9f6db3fee Merge pull request #23 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/multi-c1a69033e5
chore(packages): bump express and @types/express
2025-10-06 22:41:56 +08:00
dependabot[bot] 89e7c98412 chore(packages): bump express and @types/express
Bumps [express](https://github.com/expressjs/express) and [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express). These dependencies needed to be updated together.

Updates `express` from 4.21.2 to 5.1.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.2...v5.1.0)

Updates `@types/express` from 4.17.23 to 5.0.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

---
updated-dependencies:
- dependency-name: express
  dependency-version: 5.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
- dependency-name: "@types/express"
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 12:58:19 +00:00
ElyPrism 16bf878135 ci(workflow): fix the workflow file that package name is illegal 2025-10-06 20:54:58 +08:00
ImFurina 8dcbe4db9d ci: add ghcr imagine 2025-10-06 20:28:44 +08:00
ElyPrism a1fbcf7008 add fundings 2025-10-06 17:38:12 +08:00
ImFurina c9c881ba7d docs(index): 指向官方文档 2025-10-06 14:11:09 +08:00
ImFurina 0e0777d175 feat: 支持全局cookie代理 2025-10-06 14:07:33 +08:00
ImFurina 765734cd2d chore(dep): update dependence 2025-10-06 10:10:02 +08:00
ImFurina 7f3be34fdd 4.29.8 2025-10-06 10:09:35 +08:00
ElyPrism 00af0c281d docs(doc): add docker deployment 2025-10-05 21:34:17 +08:00
ElyPrism 001f206a31 docs(readme): fix markdown grammar 2025-10-05 21:26:40 +08:00
ElyPrism 4d9045d597 docs(env-deploy): add env config 2025-10-05 21:25:08 +08:00
ElyPrism e001de3efa ci(dockerignore): add ignore 2025-10-05 21:19:18 +08:00
ElyPrism 6ae1ccd5e3 docs(readme): fix gammar in this readme file 2025-10-05 21:16:53 +08:00
ElyPrism cb72918c55 docs(readme): add docker deploy method 2025-10-05 21:15:14 +08:00
ElyPrism ba16f2f0ab ci(docker): add version tag to every deployment 2025-10-05 20:58:39 +08:00
ElyPrism a76576af23 ci(fix): fix workflow file conflicts 2025-10-05 20:54:52 +08:00
ElyPrism 72526ba20d ci(docker-deployment): add dockerhub push workflow file 2025-10-05 20:51:46 +08:00
ElyPrism db05eddb9c Merge pull request #18 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/prettier-3.6.2
chore(packages): bump prettier from 2.7.1 to 3.6.2
2025-10-05 20:26:09 +08:00
ElyPrism fb6804364a docs: 更新readme 2025-10-05 20:25:39 +08:00
ElyPrism 9e4626e905 Merge pull request #17 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/mocha-11.7.2
chore(packages): bump mocha from 10.0.0 to 11.7.2
2025-10-02 19:22:02 +08:00
ElyPrism 6c8f7be2a5 Merge branch 'main' into dependabot/npm_and_yarn/prettier-3.6.2 2025-10-01 21:56:02 +08:00
ElyPrism cf97ed45b7 Merge branch 'main' into dependabot/npm_and_yarn/mocha-11.7.2 2025-10-01 21:55:50 +08:00
ElyPrism 1d640a789f Merge pull request #15 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/types/node-24.6.0 2025-10-01 21:55:28 +08:00
ElyPrism 22e47582c4 Merge branch 'main' into dependabot/npm_and_yarn/types/node-24.6.0 2025-10-01 21:54:54 +08:00
ImFurina ed3959f545 docs(playlistSubscribe): 更新该内容文档 2025-10-01 21:53:05 +08:00
dependabot[bot] 771c2f9d52 chore(packages): bump prettier from 2.7.1 to 3.6.2
Bumps [prettier](https://github.com/prettier/prettier) from 2.7.1 to 3.6.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.7.1...3.6.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.6.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 03:55:37 +00:00
dependabot[bot] f5b7fa2d26 chore(packages): bump @types/node from 16.11.19 to 24.6.0
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.11.19 to 24.6.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.6.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 03:54:16 +00:00
dependabot[bot] b798f1383b chore(packages): bump mocha from 10.0.0 to 11.7.2
Bumps [mocha](https://github.com/mochajs/mocha) from 10.0.0 to 11.7.2.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v10.0.0...v11.7.2)

---
updated-dependencies:
- dependency-name: mocha
  dependency-version: 11.7.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 03:54:13 +00:00
ElyPrism 6a1b7d987c Merge pull request #16 from NeteaseCloudMusicApiEnhanced/dependabot/npm_and_yarn/eslint-plugin-html-8.1.3
chore(packages): bump eslint-plugin-html from 7.1.0 to 8.1.3
2025-10-01 11:52:29 +08:00
ElyPrism db95ee1987 Merge pull request #14 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/actions/cache-4
chore(deps): bump actions/cache from 3 to 4
2025-10-01 11:51:37 +08:00
dependabot[bot] edb9fbba09 chore(deps): bump actions/cache from 3 to 4
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 03:50:53 +00:00
ElyPrism ede6534ebf Merge pull request #13 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/docker/setup-buildx-action-3
chore(deps): bump docker/setup-buildx-action from 2 to 3
2025-10-01 11:50:48 +08:00
ElyPrism 15c6ea7266 Merge pull request #12 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/actions/checkout-5
chore(deps): bump actions/checkout from 3 to 5
2025-10-01 11:50:10 +08:00
ElyPrism a719631607 Merge pull request #11 from NeteaseCloudMusicApiEnhanced/dependabot/github_actions/actions/setup-node-5
chore(deps): bump actions/setup-node from 3 to 5
2025-10-01 11:49:24 +08:00
dependabot[bot] e7d9d0fdf2 chore(packages): bump eslint-plugin-html from 7.1.0 to 8.1.3
Bumps [eslint-plugin-html](https://github.com/BenoitZugmeyer/eslint-plugin-html) from 7.1.0 to 8.1.3.
- [Changelog](https://github.com/BenoitZugmeyer/eslint-plugin-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/BenoitZugmeyer/eslint-plugin-html/compare/v7.1.0...v8.1.3)

---
updated-dependencies:
- dependency-name: eslint-plugin-html
  dependency-version: 8.1.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 11:57:34 +00:00
dependabot[bot] 27bba9ce55 chore(deps): bump docker/setup-buildx-action from 2 to 3
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 11:56:36 +00:00
dependabot[bot] 27562092b1 chore(deps): bump actions/checkout from 3 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 11:56:33 +00:00
dependabot[bot] 053640fd33 chore(deps): bump actions/setup-node from 3 to 5
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 5.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v5)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 11:56:28 +00:00
ElyPrism f7ad6b7d61 ci(bot): enable dependabot 2025-09-30 19:55:50 +08:00
ImFurina da6f590632 chore(package): update dependence 2025-09-30 19:52:17 +08:00
ImFurina 96148385c4 4.29.6 2025-09-30 19:52:01 +08:00
ImFurina 348b7569b8 4.29.5 2025-09-23 20:25:21 +08:00
ImFurina ea3acc0b14 feat(unblock): 新增bodian source 2025-09-23 20:19:47 +08:00
ImFurina 09f6b862fe chore(deps): 更新UNM至0.28.0 2025-09-23 20:12:45 +08:00
ImFurina 0535b88b24 chore(deps): 更新必要的依赖 2025-09-19 19:59:07 +08:00
ImFurina 9fe3a0f491 chores 2025-09-13 14:36:22 +08:00
ImFurinaandbinaryify b73685ace3 chore(deps): 更新axios依赖
Co-Authored-By: binaryify <binaryify@gmail.com>
2025-09-12 20:37:20 +08:00
ImFurina f16c92e825 chore(version): 更新版本号 2025-09-07 13:13:59 +08:00
ImFurinaandbinaryify abd0c9ca91 refactor: 重构模块加载
Refactored main.js to optimize module and server loading, improving code clarity and lazy loading. Updated several dependencies in package.json to their latest versions for better security and compatibility. Updated documentation cover page and home page to reflect project branding changes.

Co-Authored-By: binaryify <binaryify@gmail.com>
2025-09-07 13:08:26 +08:00
ImFurinaandbinaryify 4f4aa134d5 perf: 新增接口, 修复登录问题
Co-Authored-By: binaryify <binaryify@gmail.com>
2025-09-07 12:58:58 +08:00
ImFurina 365450c26e issues: 添加事先声明 2025-08-27 14:02:56 +08:00
ImFurina 24928fc0b4 fix 2025-08-26 17:47:45 +08:00
ImFurina 8787bc6bb6 refactor: 页面重写 2025-08-26 17:45:21 +08:00
ImFurina 442d0a8f81 docs: 纠正文档 2025-08-26 17:37:44 +08:00
ImFurina 79edb14a03 fix: 修复合并出现的冲突 2025-08-24 23:17:23 +08:00
ImFurina ceb2044500 feat(logger}: 支持更好的日志输出, 完善了文档 2025-08-24 23:10:24 +08:00
ImFurina 11e1c62cc3 chore(deps): 更新依赖以及完善文档 2025-08-24 23:10:23 +08:00
NotFurina 1261f83a27 fix: 这辈子有了 2025-08-24 23:10:22 +08:00
NotFurina 5125847ec4 feat: 尝试支持CF Worker部署 2025-08-24 23:10:22 +08:00
MoeFurina a2befaad75 Revert "fix: 修复部署问题"
This reverts commit ffb8e2f75277fa5d42579978e490b1404bf7fb5b.
2025-08-24 23:10:19 +08:00
MoeFurina 7def05ed30 fix: 修复部署问题 2025-08-24 23:10:18 +08:00
MoeFurina 7ece12c131 Revert "feat: 尝试支持edgeone"
This reverts commit 99f1639f83c4d7ca845baca3814377d11c77c214.
2025-08-24 23:10:16 +08:00
MoeFurina 29ecf0ba11 Revert "fix: 修复edgeone侦测问题"
This reverts commit afe0569bad9f615af2366c029b2193b47bdc9299.
2025-08-24 23:10:12 +08:00
MoeFurina a1d0a7b699 Revert "用ai试试"
This reverts commit f70eef909467a19d6b439c6570ed1266cf5302d9.
2025-08-24 23:10:11 +08:00
MoeFurina 96f1a59d20 用ai试试 2025-08-24 23:10:11 +08:00
MoeFurina 06d514141a fix: 修复edgeone侦测问题 2025-08-24 23:10:11 +08:00
MoeFurina e3a451780a feat: 尝试支持edgeone 2025-08-24 23:10:09 +08:00
MoeFurina 598c887be8 chore: 更新UNM-Server 2025-08-24 23:10:08 +08:00
MoeFurina b598978628 perf: 优化反向代理配置 2025-08-24 23:10:07 +08:00
MoeFurina 771777b669 chore: 尝试适配更多平台的部署 2025-08-24 23:10:06 +08:00
MoeFurina c6bc299bbc chore: 更改归属权 2025-08-24 23:10:06 +08:00
NotFurina 974e17580b Update .env 2025-08-24 23:10:04 +08:00
NotFurina fae5c63c68 chore: 转移归属权 2025-08-24 23:09:57 +08:00
IamFurina 0ee7b55f99 feat: 支持解灰手动选择音源 2025-08-24 23:09:56 +08:00
IamFurina 0c99618380 feat(proxyUrl): 支持代理酷我资源, 需自己部署反向代理 2025-08-24 23:09:52 +08:00
IamFurina de01a55aa2 docs: 及时更新文档内容 2025-08-24 23:09:52 +08:00
IamFurina 6e63dce9d3 docs: 新增图片 2025-08-24 23:09:50 +08:00
IamFurina cecc04e60e fix(cors): 修复无法携带cookie请求的cors问题 2025-08-24 23:09:50 +08:00
IamFurina 34da6ddd6c fix(unblock): 修复数组其实是字符串的问题 2025-08-24 23:09:47 +08:00
IamFurina 2d4250931d feat: 支持启用全局解灰 2025-08-24 23:09:44 +08:00
IamFurina b018be8695 feat: 支持直接在请求歌曲url使用unm server 2025-08-24 23:09:42 +08:00
IamFurina fb2eb82a86 fix: 修复请求失败, 适配SPlayer 2025-08-24 23:09:41 +08:00
IamFurina 76d8e662f7 feat: 支持GD台音乐的获取 2025-08-24 23:09:39 +08:00
IamFurina f5e3c8ae1b docs: 更新文档 2025-08-24 23:09:37 +08:00
IamFurina 9925b4da91 fix: 修复错别字 2025-08-24 23:09:35 +08:00
IamFurina 9711915f7a feat: 支持Actions自动同步上有仓库 2025-08-24 23:09:35 +08:00
IamFurina 4fdc4c1abc refactor: 更改homepage 2025-08-24 23:09:33 +08:00
IamFurina 8246736140 docs. 重写README 2025-08-24 23:09:31 +08:00
IamFurina a051864303 feat. 分离解灰至单独的模块, 更新文档 2025-08-24 23:09:29 +08:00
IamFurina b91092d0c6 docs: 更新文档 2025-08-24 23:09:26 +08:00
IamFurina 8d4b790f2b fix: 删除无用action 2025-08-24 23:09:26 +08:00
IamFurina bf62107b17 feat: 支持action发布npm包 2025-08-24 23:09:26 +08:00
IamFurina 2b662ae7c7 chore: 再更新 2025-08-24 23:09:26 +08:00
IamFurina f617b066c9 chore: 更新依赖 2025-08-24 23:09:21 +08:00
FalseElaina fc66dc4de2 Update npm.yml 2025-08-24 23:08:55 +08:00
FalseElaina 50093704b5 Update npm.yml 2025-08-24 23:08:55 +08:00
FalseElaina d6dea0895b Update ------.md 2025-08-24 23:08:55 +08:00
FalseElaina 83e51505d1 Delete .github/workflows/npm-publish-github-packages.yml 2025-08-24 23:08:55 +08:00
FalseElaina b06599a088 Create npm.yml 2025-08-24 23:08:55 +08:00
FalseElaina bf3b21af8d 修复action 2025-08-24 23:08:55 +08:00
FalseElaina 288d6fe63f Update npm-publish-github-packages.yml 2025-08-24 23:08:55 +08:00
FalseElaina eadff324d1 Update npm-publish-github-packages.yml 2025-08-24 23:08:55 +08:00
FalseElaina 0b706626c8 Create npm-publish-github-packages.yml 2025-08-24 23:08:55 +08:00
FalseElaina 35f79bb0ea Update README.MD 2025-08-24 23:08:55 +08:00
FalseElaina 646617dd8e docs: 更新文档 2025-08-24 23:08:55 +08:00
IamFurina 05bdc89393 feat: 更新更多设置项 2025-08-24 23:08:27 +08:00
IamFurina 45609a8806 feat. 更新API到4.27.0 2025-08-24 23:08:27 +08:00
IamFurina 0ff650cd50 perf. 加快访问速度 2025-08-24 23:08:27 +08:00
IamFurina 614e733fd1 Update server.js 2025-08-24 23:08:27 +08:00
IamFurina f35c198c4e Update server.js 2025-08-24 23:08:27 +08:00
IamFurina 6ae1964685 Fix: 修复API不正常工作 2025-08-24 23:08:27 +08:00
IamFurina b6a135e8b9 reapply. 重新加入解灰功能 2025-08-24 23:08:27 +08:00
IamFurina f4ac52756e temp. 暂时移除解灰功能 2025-08-24 23:08:27 +08:00
IamFurina 9758f53058 revert. 回退操作 2025-08-24 23:08:27 +08:00
IamFurina 5435ed70f3 fix. 添加选择条件以防止多次调用接口 2025-08-24 23:08:27 +08:00
IamFurina 950f9a2365 feat. 接口支持无损音质 2025-08-24 23:08:27 +08:00
IamFurina 2d5f4630e9 chore. 加入.env配置文件 2025-08-24 23:08:27 +08:00
IamFurina 88712e02a1 feat. 接口支持无损音质 2025-08-24 23:08:27 +08:00
IamFurina ffd5c095a9 Patch: 更新API 2025-08-24 23:08:27 +08:00
IamFurina 007890be90 Patch: 更新API 2025-08-24 23:08:24 +08:00
IamFurina 0e7ce27b3c Patch: 更新API 2025-08-24 23:08:24 +08:00
IamFurina eedd30295c Patch: 更新todo 2025-08-24 23:07:25 +08:00
binaryify ed28a571a6 Merge branch 'main' into 'main'
Main

See merge request Binaryify/neteasecloudmusicapi!36
2025-01-12 08:36:37 +00:00
overwriter 879edd7fef feat: 验证码登录链接改回https 2025-01-12 16:30:28 +08:00
overwriter 90b9883691 feat: 补充歌词摘录文档 2025-01-12 12:48:04 +08:00
overwriter e04bfbf3b4 feat: 添加歌词摘录相关接口 2025-01-12 12:21:53 +08:00
overwriter ea8d2f56f7 refeator: 年度听歌报告接口支持2024年 2024-12-28 14:35:51 +08:00
overwriter 455cb1929b fix: /api/v3/song/detail限制拉取数量为1000,避免拉取失败 2024-12-22 22:28:24 +08:00
overwriter 07edbfed6d fix: 验证码检查可能不生效 2024-12-22 22:25:49 +08:00
binaryify ff0dcc0b29 Merge branch 'main' into 'main'
fix #33: 创建歌单接口替换为weapi, eapi加密需要checkToken

Closes #33

See merge request Binaryify/neteasecloudmusicapi!33
2024-11-24 01:55:15 +00:00
overwriter 48dfefc039 fix #33: 创建歌单接口替换为weapi, eapi加密需要checkToken 2024-11-23 21:14:54 +08:00
binaryify fc85d6d6c7 bump to v4.25.0 2024-11-16 11:07:07 +08:00
binaryify 88ca6938be Merge branch 'main' into 'main'
fix: 播客上传接口

See merge request Binaryify/neteasecloudmusicapi!32
2024-11-16 03:01:31 +00:00
Tak 8c8683557e fix: 播客上传接口 2024-11-15 17:56:42 +00:00
binaryify ae3ed350a8 Merge branch 'main' into 'main'
feat: 增加副歌时间、相关歌单推荐接口,原有相关歌单接口已废弃;fix: 将部分易盾白名单接口替换为eapi

See merge request Binaryify/neteasecloudmusicapi!30
2024-10-30 09:08:18 +00:00
overwriter 1fff1d559c feat: 增加歌单导入工具example 2024-10-27 22:30:08 +08:00
overwriter a71eaf76f0 fix: 将部分易盾白名单接口替换为eapi 2024-10-27 11:03:40 +08:00
overwriter d45124dfbb feat: 增加副歌时间、相关歌单推荐接口,原有相关歌单接口已废弃 2024-10-27 10:41:47 +08:00
binaryify 5689016228 uodate:4.24.0 2024-10-20 22:22:02 +08:00
binaryify e84325625d Merge branch 'main' into 'main'
Main

See merge request Binaryify/neteasecloudmusicapi!29
2024-10-20 13:23:44 +00:00
overwriter 0e18cb7fbe feat: 增加歌单导入 - 任务状态接口 2024-10-20 21:10:11 +08:00
overwriter 2113f7f78b feat: 增加歌单导入接口 2024-10-20 19:14:06 +08:00
overwriter 5aaa2bc105 refactor: 主页增加版本号 2024-10-20 01:51:01 +08:00
overwriter b796e87106 feat: 增加听歌足迹相关接口 2024-10-19 23:57:22 +08:00
overwriter c5d29c72e9 refactor: 主页界面优化 2024-10-19 23:08:23 +08:00
overwriter bffc4aa59c refactor: 替换cdn地址 2024-10-19 22:43:03 +08:00
overwriter a09c519cc2 feat: 增加用户状态相关接口 2024-10-19 22:15:26 +08:00
overwriter 9032a2e504 feat: 增加用户徽章接口 2024-10-19 21:56:27 +08:00
binaryify 71272bf448 update: v4.23.3 2024-10-15 09:42:36 +08:00
binaryify 6d8b50da59 Merge branch 'main' into 'main'
更正iPhone请求的cookie

See merge request Binaryify/neteasecloudmusicapi!28
2024-10-15 01:41:23 +00:00
111inhistory 5a242a300e Correct the iphone cookie 2024-10-12 16:33:01 +00:00
binaryify 75549b6117 update: v4.23.2 2024-10-12 10:11:47 +08:00
binaryify 3433c33b7e Merge branch 'main' into 'main'
fix: cookie参数补充

See merge request Binaryify/neteasecloudmusicapi!27
2024-10-12 02:09:34 +00:00
overwriter a0b09afc30 fix: cookie不覆盖原有参数 2024-10-10 00:48:41 +08:00
overwriter a2d675cdd6 fix: cookie参数补充 2024-10-10 00:00:21 +08:00
binaryify e6c3e95737 update: 模拟pc客户端的ua和cookie字段 #26 2024-10-06 16:33:31 +08:00
binaryify b25732e820 Merge branch 'main' into 'main'
feat: 模拟pc客户端的ua和cookie字段

See merge request Binaryify/neteasecloudmusicapi!26
2024-10-06 08:32:25 +00:00
overwriter 7e2683c660 fix: os使用iphone 2024-10-06 16:29:09 +08:00
overwriter 9d3828b3c1 feat: cookie添加部分字段 2024-10-06 16:12:55 +08:00
overwriter 18c9ebe51e feat: 修改客户端的ua 2024-10-06 11:48:59 +08:00
binaryify 784eb1110e update: 4.23.0 2024-10-03 17:07:17 +08:00
binaryify 8a4db72ed1 Merge branch 'main' into 'main'
fix: 尝试修复登录冻结问题

See merge request Binaryify/neteasecloudmusicapi!25
2024-10-03 08:51:43 +00:00
Kengwang 016fe7c285 fix: 尝试修复登录冻结问题 2024-10-03 16:43:54 +08:00
binaryify b970ed9704 Merge branch 'main' into 'main'
feat: 增加歌曲是否喜爱接口

See merge request Binaryify/neteasecloudmusicapi!24
2024-09-22 02:34:05 +00:00
overwriter 8ee4167087 feat: 增加歌曲动态封面接口 2024-09-22 10:11:28 +08:00
overwriter 61983799fe feat: 增加用户是否互相关注接口 2024-09-22 09:00:46 +08:00
overwriter e549d85c39 refactor: 文档补充 2024-09-20 23:20:20 +08:00
overwriter 8750653418 feat: 增加歌曲是否喜爱接口 2024-09-20 23:14:51 +08:00
binaryify 20a626d413 Merge branch 'main' into 'main'
docs: 增加 杜比全景声 音质的说明。补充客户端下载链接新版接口的说明

See merge request Binaryify/neteasecloudmusicapi!23
2024-09-03 10:02:35 +00:00
binaryify c9a422a0d5 Merge branch 'main' into 'main'
doc: cookie, 腾讯云serverless

See merge request Binaryify/neteasecloudmusicapi!21
2024-09-03 10:00:47 +00:00
Cinvin 0dab5e55ba docs: 增加 杜比全景声 音质的说明。补充客户端下载链接新版接口的说明 2024-09-02 14:29:41 +00:00
Xu Luoming 8d49669b26 doc: cookie, 腾讯云serverless 2024-08-24 15:31:33 +08:00
binaryify c702774bb8 Merge branch 'main' into 'main'
Main

See merge request Binaryify/neteasecloudmusicapi!19
2024-08-22 08:44:41 +00:00
overwriter 9447e7bb60 fix: 补充修改 2024-08-10 22:12:53 +08:00
overwriter dd9ec456bf refactor: 请求头无需传递content-type、os和appver 2024-08-03 20:00:25 +08:00
overwriter c1011b8602 refactor: request无需传入请求方式 2024-07-31 08:55:35 +08:00
overwriter 0fc4057a81 refactor: weapi无需传入os和apper 2024-07-31 08:24:32 +08:00
binaryify 377970c73d Merge branch 'main' into 'main'
fix: weapi的cookie不需要os和appver,避免听歌打卡接口不被记录

See merge request Binaryify/neteasecloudmusicapi!18
2024-07-30 01:35:34 +00:00
overwriter e9bad5d27e fix: weapi的cookie不需要os和appver,避免听歌打卡接口不被记录 2024-07-29 23:33:27 +08:00
binaryify eae4c1f53c bump to 4.22.0 2024-07-23 11:13:49 +08:00
binaryify 7e51c9cd5b Merge branch 'main' into 'main'
feat: 增加API调试界面

See merge request Binaryify/neteasecloudmusicapi!16
2024-07-23 01:37:29 +00:00
overwriter 422722e0a7 feat: 增加下载、购买记录接口 2024-07-22 07:53:46 +08:00
overwriter a0d4a3c27a feat: 增加API调试界面 2024-07-20 00:21:54 +08:00
binaryify 2469823df2 Merge branch 'main' into 'main'
增加部分接口;eapi返回值加密可被控制,默认不加密;代码优化

See merge request Binaryify/neteasecloudmusicapi!15
2024-07-16 06:48:13 +00:00
overwriter 9310aa450a refactor: 将csrfToken抽出来 2024-07-14 11:48:00 +08:00
overwriter 02505b72d4 fix: e_r在加密前插入data 2024-07-13 17:35:44 +08:00
overwriter 83cc9a7566 feat: 增加接口: 获取客户端歌曲下载链接 - 新版、当前账号关注的用户/歌手 2024-07-13 16:32:11 +08:00
overwriter 8de3e9fa66 refactor: 调整加密请求数据的代码结构;添加一些注释 2024-07-13 08:46:45 +08:00
overwriter 656a69e07e feat: eapi返回值加密可被控制;默认不加密 2024-07-12 23:24:40 +08:00
overwriter f7132eba63 refactor: 请求的data不覆盖 2024-07-12 23:18:37 +08:00
binaryify 93ebc9cf51 bump to 4.21.2 2024-07-09 11:19:58 +08:00
binaryify b42e16f91e Merge branch 'main' into 'main'
feat: eapi和api都生成cookie;甚至重新适配了linuxapi

See merge request Binaryify/neteasecloudmusicapi!14
2024-07-03 04:29:07 +00:00
overwriter 58e9865b70 fix: 修复batch没有返回数据;eapi加密,传入e_r: true,返回数据会被加密 2024-06-29 16:50:30 +08:00
overwriter bd8c049576 refactor: 补充一些注释 2024-06-29 11:36:16 +08:00
overwriter c38a8a0816 feat: api测试接口data传递字符串 2024-06-28 05:55:14 +08:00
overwriter 9006fdc938 refactor: 默认返回值都是未加密的 2024-06-27 20:18:01 +08:00
overwriter 157a058f74 feat: eapi和api都生成cookie;甚至适配了linuxapi 2024-06-27 19:53:42 +08:00
binaryify 9754f341ea bump to 4.21.1 2024-06-27 09:34:04 +08:00
binaryify 2553caf13a Merge branch 'main' into 'main'
Main

See merge request Binaryify/neteasecloudmusicapi!13
2024-06-27 01:30:52 +00:00
overwriter 90d2a9ad93 fix: 修复新接口 2024-06-26 21:26:31 +08:00
overwriter 5e3a7ba027 feat: 增加调试接口,支持传入请求方法、加密方式、uri和data 2024-06-26 21:25:46 +08:00
binaryify f99564d1b4 bump to 4.21.0 2024-06-26 14:55:35 +08:00
binaryify 2501ca2101 Merge branch 'main' into 'main'
feat: 云盘导入歌曲

See merge request Binaryify/neteasecloudmusicapi!11
2024-06-26 06:42:26 +00:00
binaryify 0d2e3232f3 Merge branch 'main' into 'main'
refactor: 很多代码优化

See merge request Binaryify/neteasecloudmusicapi!12
2024-06-26 06:42:13 +00:00
overwriter 46718c29f1 refactor: 精简weapi的链接,统一使用uri 2024-06-25 22:47:17 +08:00
overwriter d78a4990fe refactor: 部分weapi替换为api 2024-06-25 21:27:35 +08:00
overwriter 6d6bd1ad77 refactor: 进一步封装option 2024-06-25 20:04:53 +08:00
overwriter d23b4a3653 refactor: api是否加密由配置文件决定;封装option 2024-06-25 00:12:53 +08:00
Cinvin 1c5d203323 feat: 云盘导入歌曲 2024-06-21 12:36:11 +00:00
binaryify 8d6fa6b6ca Merge branch 'main' into 'main'
docs: 补充歌曲字段说明

See merge request Binaryify/neteasecloudmusicapi!10
2024-06-20 07:47:35 +00:00
Cinvin 8c140fe6d3 docs: 补充歌曲字段说明 2024-06-20 07:06:13 +00:00
binaryify 7e38d10383 Merge branch 'main' into 'main'
feat: 增加接口:获取专辑歌曲的音质、歌手动态信息

See merge request Binaryify/neteasecloudmusicapi!9
2024-06-18 12:53:04 +00:00
overwriter a75565929b feat: 增加接口:最近听歌列表 2024-06-18 19:46:15 +08:00
overwriter e933c00ee8 feat: 增加接口:获取专辑歌曲的音质、歌手动态信息 2024-06-18 00:52:55 +08:00
overwriter 7d2d715dbc fix: 修改私信和通知接口注释 2024-06-15 16:26:08 +08:00
binaryify 1c1447b49a update: bump tp 4.20.0 2024-06-12 15:28:25 +08:00
binaryify caf6432c08 Merge branch 'main' into 'main'
一起听从机模式完善

See merge request Binaryify/neteasecloudmusicapi!8
2024-06-10 02:39:17 +00:00
Kengwang dd7e109b92 fix: 链接错误 2024-06-09 23:37:00 +08:00
Kengwang 1123672a86 example: 一起听完整示例 2024-06-09 23:36:27 +08:00
Kengwang fef44babf0 add: 一起听 接受邀请 2024-06-09 23:07:43 +08:00
binaryify d5795aef08 fix: 云盘上传中文乱码问题修复 2024-05-31 17:37:08 +08:00
binaryify 5f7c752707 bump to 4.19.8 2024-05-19 18:56:07 +08:00
binaryify 2d367aaf4f Merge branch 'main' into 'main'
fix: 云盘上传问题修复

See merge request Binaryify/neteasecloudmusicapi!7
2024-05-19 10:50:09 +00:00
overwriter 577e4b9aad fix: 云盘上传问题修复 2024-05-19 13:41:50 +08:00
binaryify ef7f998636 4.19.7 2024-05-15 10:35:54 +08:00
binaryify 47a43bc4a9 Merge branch 'hotfix-cellphone-name' into 'main'
fix: incorrect property name (`cellphone`) in type definition

See merge request Binaryify/neteasecloudmusicapi!6
2024-05-15 02:33:33 +00:00
Lijd TheGrandfatherofGitLab 6dd52cf95f fix: incorrect property name (cellphone) in type definition 2024-05-15 02:33:32 +00:00
binaryify 6aa4418ecb update: 例子更新 2024-05-11 14:20:01 +08:00
binaryify dea65db2b3 fix: 中间件问题修复 2024-05-08 15:34:54 +08:00
binaryify 5b30e1b222 fix:参数接收问题修复 2024-05-07 22:46:50 +08:00
binaryify 076ee17286 展示优化 2024-05-07 15:58:15 +08:00
binaryify 5d07cdf071 参数调整 2024-05-07 15:43:20 +08:00
binaryify b6310e1b24 update: 返回数据优化 2024-05-07 15:30:04 +08:00
binaryify 15a2e1bcdf feat: 新增 eapi 解析接口和使用 demo 2024-05-07 15:17:56 +08:00
binaryify 1c1c850b51 fix: 云盘上传问题修复 2024-05-07 10:46:49 +08:00
binaryify 9b941ef17d fix: 问题修复 2024-04-30 16:44:05 +08:00
binaryify b821ce2b76 fix: 配置补充 2024-04-30 16:24:36 +08:00
binaryify 3da8ff1d00 update: 文档和 interface 补充 2024-04-30 15:42:09 +08:00
binaryify da0f9f6fd7 Merge branch 'main' of gitlab.com:Binaryify/neteasecloudmusicapi 2024-04-30 15:14:50 +08:00
binaryify 780f30f0b1 feat: 游客登录机制完善 2024-04-30 15:14:32 +08:00
binaryify 683b470ac0 Merge branch 'VoiceTop' into 'main'
添加电台排行榜获取接口

See merge request Binaryify/neteasecloudmusicapi!5
2024-04-30 01:55:20 +00:00
toolor 8437f9a7cd 添加电台排行榜获取接口 2024-04-30 01:55:20 +00:00
binaryify cc0377ba7c Merge branch 'main' into 'main'
feat: 新增获取声音歌词

See merge request Binaryify/neteasecloudmusicapi!4
2024-04-30 01:55:06 +00:00
binaryify eb92cef0b2 fix: song/url 参数问题修复 2024-04-29 17:37:10 +08:00
binaryify 7b6e9d90e0 update: cookie 处理优化 2024-04-29 15:23:41 +08:00
binaryify 2bb5269dfa update: 使用 crypto-js 重构 crypto 部分 2024-04-25 15:19:28 +08:00
binaryify d55fb43f0a fix: ua 问题修复 2024-04-25 13:42:52 +08:00
binaryify 4fe71a4903 fix: 听歌识曲接口和 demo 页面问题修复和更新 2024-04-23 17:05:28 +08:00
binaryify 52892d2f03 cookie version 更新 2024-04-19 16:06:44 +08:00
binaryify fab8b50229 update: cookie 补全 2024-04-18 17:28:35 +08:00
binaryify a9e0626b12 fix: typo 2024-04-18 17:21:49 +08:00
binaryify 22f21eda3f fix: 分享问题修复 2024-04-18 17:19:44 +08:00
binaryify fc3e62a69e update: bump to v4.16.0 2024-04-18 15:11:34 +08:00
binaryify c7c5769c05 update: workflows 配置更新 2024-04-12 09:46:11 +08:00
binaryify 9c9a439bc3 update: workflows 配置更新 2024-04-12 09:45:47 +08:00
binaryify 4ad08e0222 update: workflows 配置更新 2024-04-12 09:43:03 +08:00
Kengwang 7201908b30 feat: 新增获取声音歌词 2024-04-04 21:54:55 +08:00
binaryify 2ae029fb2a update: 播客声音排序接口更新,新增删除播客 2024-03-29 10:52:43 +08:00
binaryify efd7a7b39c Merge branch 'program_trans' into 'main'
电台节目排序接口

See merge request Binaryify/neteasecloudmusicapi!3
2024-03-27 14:33:18 +00:00
binaryify 54496fc407 Merge branch 'voice_delete' into 'main'
删除FM声音接口,参数ids是列表,要删除的声音的id

See merge request Binaryify/neteasecloudmusicapi!2
2024-03-27 14:33:10 +00:00
toolor 143fddd066 电台节目排序接口 2024-03-27 21:58:27 +08:00
toolor 8f0d4bf490 删除FM声音接口,参数ids是列表,要删除的声音的id 2024-03-27 21:46:24 +08:00
binaryify d2f8f659f4 bump to 4.15.7 2024-03-21 16:54:08 +08:00
binaryify 98c49de0aa Merge branch 'main' into 'main'
feat: 播客分段上传

See merge request Binaryify/neteasecloudmusicapi!1
2024-03-19 23:29:34 +00:00
龙打野 18ca74214e feat: 播客分段上传 2024-03-15 18:55:33 +08:00
binaryify dfcdc04fbb update: 文档和示例更新 2024-03-12 14:29:31 +08:00
binaryify 571c35da55 update: README 2024-03-11 15:40:28 +08:00
binaryify 2be88c6a86 update:文档更新 2024-02-28 11:02:07 +08:00
binaryify 4b3cf00c8c update: 文档更新 2024-02-28 10:18:07 +08:00
binaryify 9203e8a7d0 bump to v4.15.3 2024-01-29 18:22:33 +08:00
binaryify a34d4cfa2f fix: 文件重命名防止404 2024-01-29 18:21:45 +08:00
binaryify 0f458b1784 fix:上传问题修复 2024-01-29 17:55:14 +08:00
binaryify 4c6d2910ca update: 版本更新提示不展示问题修复 2024-01-26 17:39:42 +08:00
binaryify a42d2e491e update: 版本更新提示不展示问题修复 2024-01-26 17:38:43 +08:00
binaryify 35e1807c4c update:新增私人 FM 模式选择接口 2024-01-26 16:02:57 +08:00
binaryify 22ac50621c update changelog 2024-01-23 15:59:06 +08:00
binaryify 06362c4751 update:vercel 配置更新 2024-01-23 15:27:24 +08:00
binaryify b8f9110f69 update:文档结构调整 2024-01-23 15:20:25 +08:00
binaryify 185031ddce update: ua 固定 #1867 2024-01-13 16:01:20 +08:00
binaryify daa377ffb9 update: eslint 配置补充 2024-01-13 15:07:38 +08:00
binaryify 32531f1331 Merge pull request #1868 from arunsathiya/master
ci: Use GITHUB_OUTPUT envvar instead of set-output command
2024-01-12 09:26:39 +08:00
Arun 516b906d9b ci: Use GITHUB_OUTPUT envvar instead of set-output command 2024-01-11 17:05:00 -08:00
binaryify 61a1a17318 fix: #1833 apicache 调整 2023-12-29 16:54:21 +08:00
binaryify 1c3050d6ef update: pkg 打包命令 node 版本升级 2023-12-27 14:00:06 +08:00
binaryify 574364ae41 feat: 重构 register_anonimous 模块 #1858 2023-12-25 09:46:53 +08:00
binaryify 6a541a33a1 bump to 4.14.0 2023-12-20 11:22:11 +08:00
binaryify 5c1f3aee5a update: 移除多余代码 2023-12-20 11:15:17 +08:00
binaryify a505114140 update: 文档更新 2023-12-20 11:04:35 +08:00
binaryify b5e67199bc Merge pull request #1854 from 2061360308/master
And Python SDK in README.MD
2023-12-15 23:17:14 +08:00
盧瞳 caf2ae1c5f Update README.MD 2023-12-15 17:12:48 +08:00
盧瞳 39f335efd7 Update README.MD
add Python SDK
2023-12-15 16:52:29 +08:00
binaryify fa5c733895 fix: /artist/detail 登录状态下调用提示网络拥挤的问题 #1853 2023-12-13 13:51:38 +08:00
binaryify 19e927d6ec Merge pull request #1852 from Cinvin/master
feat:歌曲红心数量,歌曲音质详情,本地歌曲文件匹配网易云歌曲信息
2023-12-12 12:39:14 +08:00
binaryify 7eccaa2c07 fix: lint error 2023-12-12 12:38:35 +08:00
binaryify 50ab628751 update: appver更新 2023-12-12 12:36:52 +08:00
5unV 737e226471 feat:歌曲红心数量,歌曲音质详情,本地歌曲文件匹配网易云歌曲信息
feat:本地歌曲文件匹配网易云歌曲信息
feat:歌曲音质详情
feat:歌曲红心数量
2023-12-12 10:55:25 +08:00
binaryify ef7b1a935b Merge pull request #1851 from akane/patch-1
update: song upload use up-to-date ip
2023-12-06 21:14:07 +08:00
Akane be75a7b1b9 fix: use variable bucket name 2023-12-05 15:13:30 +08:00
Akane 399cf2dc97 update: song upload use up-to-date ip 2023-12-05 15:11:49 +08:00
binaryify f8e839db2f Merge pull request #1848 from yuxiaolejs/master
[fix] removed unnecessary console log in song_url_v1
2023-11-30 13:41:10 +08:00
Unics Yu efde4c308b [fix] removed unnecessary console log in song_url_v1 2023-11-29 20:45:27 -08:00
binaryify 52b2335749 update:lock文件更新 2023-11-26 17:10:26 +08:00
binaryify af3846658a feat: crypto.js 重构 #1839 2023-11-26 17:08:30 +08:00
binaryify b4a9c8ece1 Merge pull request #1843 from nooblong/master
两个播客接口
2023-11-22 21:04:50 +08:00
龙打野 f7bba48508 doc: 更新文档 2023-11-22 17:58:14 +08:00
龙打野 4f4727e6bb feat: 播客列表详情 2023-11-22 17:42:19 +08:00
龙打野 d7a64982f9 feat: 播客声音排序 2023-11-22 17:31:02 +08:00
binaryify b143af56c4 Merge pull request #1836 from WooMai/master
更新获取歌曲详情接口的 TypeScript 定义与文档,增加 Hi-Res 类型
2023-11-10 21:24:58 +08:00
binaryify 4755df842e Merge pull request #1837 from WooMai/fix-song_url
Fix: 使用 Node 调用 song_url 时未正确处理 number 类型
2023-11-10 21:24:41 +08:00
WooMai 6ac0baeffb fix: error when query.id is number 2023-11-10 03:42:20 +08:00
WooMai 18812abf66 docs: sync type definition 2023-11-10 03:16:19 +08:00
WooMai 262be06e67 chore: update type 2023-11-10 03:15:35 +08:00
binaryify 43391930b3 bump to 4.13.8 2023-10-27 16:57:22 +08:00
binaryify 0140eefce5 CI 更新 2023-10-27 16:51:08 +08:00
binaryify a89d2e6b5d CI 更新 2023-10-27 15:16:18 +08:00
binaryify afa12efcbb CI 更新 2023-10-27 10:20:38 +08:00
binaryify d3a5530d60 ci 更新 2023-10-27 10:16:47 +08:00
binaryify 74e64d1594 CI 更新 2023-10-27 09:58:58 +08:00
binaryify d3d84eb5c0 update: dockerfile 配置更新 2023-10-26 17:55:44 +08:00
binaryify 7046219cd4 修复 Docker 构建镜像安装依赖速度慢的问题 2023-10-26 17:44:35 +08:00
binaryify 0912ae1458 lock文件更新 2023-10-26 17:38:09 +08:00
binaryify d5ba853e3e update: Dockfile 2023-10-26 17:18:04 +08:00
binaryify dfa0639317 fix: 修复匿名登录下,部分接口提示网络太拥挤问题 #1829 2023-10-26 11:36:36 +08:00
binaryify 08ca5e8026 bump to 4.13.5 2023-10-22 14:43:30 +08:00
binaryify a8756990f7 bump to 4.13.5 2023-10-22 14:42:26 +08:00
binaryify ca54d662ae update dockerfile 2023-10-22 14:34:16 +08:00
binaryify 4d201f20eb update: CI 更新 2023-10-22 13:57:09 +08:00
binaryify 0816c7411e update CHANGELOG 2023-10-22 10:28:45 +08:00
binaryify bddb6dcbb5 update: 部分接口移除avatarImgId_str字段 #1797 2023-10-22 10:27:50 +08:00
binaryify 255161f995 fix: 修复更新用户信息接口报错问题 #1824 2023-10-22 10:08:42 +08:00
binaryify 51eb568ea9 Merge pull request #1822 from WooMai/patch-1
refactor: Sync TypeScript Definition of /song/url/v1
2023-10-16 14:08:10 +08:00
WooMai bea03fd60e sync typescript definition of song_url_v1 2023-10-16 01:39:48 +08:00
binaryify 75aa4c7b1b Merge pull request #1816 from GuMengYu/master
feat: 新增日推歌曲不感兴趣接口
2023-10-13 09:49:42 +08:00
gumengyu 626209284d squash! feat: 新增日推歌曲不感兴趣接口 2023-10-12 21:46:30 +08:00
gumengyu 10bcd07fbd feat: 新增日推歌曲不感兴趣接口 2023-10-12 15:27:01 +08:00
binaryify f37a8dae41 Merge pull request #1815 from ZhangDo/master
docs: 检测扫码状态接口添加 nocookie 例子 📝
2023-10-11 20:09:30 +08:00
zhangdong 542d8573fc docs: 检测扫码状态接口添加 nocookie 例子 📝 2023-10-11 16:45:01 +08:00
binaryify aa2e832ea3 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2023-10-11 11:31:35 +08:00
binaryify 932095663a update: 新增播客声音搜索 #1814, bump to 4.13.3 2023-10-11 11:31:28 +08:00
binaryify a1f1a39300 Merge pull request #1813 from ZhangDo/master
docs: 更正获取节目音频时传入的 id  为 mainTrackId 💬
2023-10-07 10:15:28 +08:00
binaryify 4deeb52134 Merge pull request #1812 from billchenchina/patch-1
fix: util(s) typo
2023-10-07 10:15:00 +08:00
zhangdong e42ac5b5b6 docs: 更正获取节目音频时传入的 id 为 mainTrackId 2023-10-06 10:02:09 +08:00
billchenchina bd23bf1e9b fix: util(s) typo 2023-10-05 01:06:40 +08:00
binaryify e439a537fa update:去除多余文本 2023-09-25 14:09:36 +08:00
binaryify ca14c983bb bump to 4.13.2 2023-09-25 14:08:41 +08:00
binaryify 56f0317529 Merge pull request #1810 from s12mmm3/master
refactor:修改wiki相关接口名称
2023-09-24 22:45:06 +08:00
overwriter 224f6e2cf8 refactor:修改wiki相关接口 2023-09-24 22:42:09 +08:00
binaryify 336dc2a65a update: /verify/getQr 补充二维码dataurl返回数据 2023-09-23 16:15:45 +08:00
binaryify ddc9b58ed9 update: 文档地址更新 2023-09-23 16:07:43 +08:00
binaryify 488a30b16f bump to 4.13.0 2023-09-23 15:45:29 +08:00
binaryify d42ec9acda Merge pull request #1809 from s12mmm3/master
feat:增加2017-2022年度听歌报告接口
2023-09-23 15:16:49 +08:00
overwriter bb7f0734f5 refactor:合并年度听歌报告接口 2023-09-23 13:38:45 +08:00
overwriter 5506e31c43 fix:修复粉丝来源接口 2023-09-23 11:01:31 +08:00
overwriter a526741a55 update: 更新文档 2023-09-23 08:39:47 +08:00
overwriter 8d1f196cf6 update: 更新文档 2023-09-23 08:31:22 +08:00
overwriter 8a9b040092 feat:增加2017-2022年度听歌报告接口 2023-09-23 07:58:45 +08:00
binaryify 715770246c Merge pull request #1808 from s12mmm3/master
update: 更新文档
2023-09-22 22:21:15 +08:00
overwriter 9f242fc658 update: 更新文档 2023-09-22 22:04:14 +08:00
overwriter 4127b047c9 update: 更新文档 2023-09-22 19:50:24 +08:00
overwriter f00dd4d363 update: 更新文档 2023-09-22 19:43:44 +08:00
overwriter 4056015771 Merge branch 'master' of github.com:s12mmm3/NeteaseCloudMusicApi 2023-09-22 19:11:45 +08:00
s12mmm3 119d301e24 Update README.md 2023-09-22 13:30:28 +08:00
binaryify 76506e65b7 Merge pull request #1800 from ZhangDo/master
check_music add code  ♿
2023-09-22 11:13:24 +08:00
binaryify c64ec3bc21 Merge pull request #1807 from s12mmm3/master
feat:新增用户贡献相关接口
2023-09-22 11:12:13 +08:00
overwriter 6114012be7 feat:新增云音乐达人相关接口,粉丝相关接口需要达人认证才可获取 2023-09-22 00:58:58 +08:00
overwriter fa269f7f07 feat:新增用户贡献相关接口 2023-09-22 00:44:52 +08:00
binaryify 18e3566194 Merge pull request #1805 from s12mmm3/master
feat:新增专辑、歌曲、歌手简要wiki信息接口,关键词搜索歌手接口
2023-09-21 09:38:33 +08:00
overwriter 38e53640eb feat:新增mv简要wiki信息接口 2023-09-20 23:15:19 +08:00
overwriter cdb1fb767d feat:新增专辑、歌曲、歌手简要wiki信息接口,关键词搜索歌手接口 2023-09-20 23:06:56 +08:00
Dong Zhang d1565a1848 check_music add code ♿ 2023-09-13 10:33:57 +08:00
binaryify b21fc110a0 Merge pull request #1799 from nooblong/master
播客声音详情
2023-09-12 13:45:48 +08:00
龙打野 e5db2139bc feat: 获取播客里面的声音详情 2023-09-12 11:58:57 +08:00
龙打野 005a45309c doc: 播客返回参数说明 2023-09-12 11:41:00 +08:00
binaryify 957213bb93 fix: 修复anonymous_token路径异常 #1795 2023-09-12 11:22:57 +08:00
binaryify 39ad34fa0b Merge pull request #1798 from nooblong/master
feat: 获取播客里面的声音列表
2023-09-12 09:52:53 +08:00
龙打野 38e5a8742c feat: 获取播客里面的声音列表 2023-09-12 09:19:46 +08:00
binaryify 00d3594814 feat: 新增根据nickname获取userid 接口 2023-09-11 11:21:57 +08:00
binaryify c3dbccf52a update: demo 接口地址调整 2023-09-10 15:57:13 +08:00
binaryify 70db662026 update: 听歌识曲接口完善, 补充demo页面 2023-09-10 15:30:59 +08:00
binaryify 37bad1cc33 update: NMTID 动态添加 #1792 2023-09-10 11:41:18 +08:00
binaryify 1bc0b8f177 update: weapi ua 固定 2023-09-09 23:23:24 +08:00
binaryify 7e869aa919 update: 验证接口-二维码检测 文档补充返回结果说明 2023-09-09 23:10:36 +08:00
binaryify 1f6c8928b2 bump to 4.11.3 2023-09-09 21:50:36 +08:00
binaryify 10d8ef5f43 fix: 返回内容code类型处理 2023-09-09 21:46:03 +08:00
binaryify b6f6a87a86 update: song/url 单元测试id更换 2023-09-09 18:51:07 +08:00
binaryify 7fe9d36b73 fix: 单元测试问题修复 2023-09-09 18:15:10 +08:00
binaryify 2e933b3d61 fix: song/url 返回排序处理 #1792, 移除多余log 2023-09-09 17:11:02 +08:00
binaryify 8c52f4de1b fix: 修复vercel无文件创建权限问题 #1796 2023-09-09 11:15:56 +08:00
binaryify 52c6021d89 update: anonymous_token配置抽离, 生成稳定性问题修复 2023-09-08 21:46:42 +08:00
binaryify 6741d9a920 update: 更新文档:验证接口 #1783 #1516 2023-09-08 20:05:28 +08:00
binaryify dd2365bcb7 update: 播客声音上传接口和文档 2023-09-07 23:55:26 +08:00
binaryify 846b7e5fbc update: request增加headers选项 2023-09-07 18:32:00 +08:00
binaryify 312434bc99 feat: 声音上传接口 2023-09-07 18:31:24 +08:00
binaryify a7f508f3cf update: audio upload 接口 2023-09-06 17:35:00 +08:00
binaryify 05c705f495 update: audio_upload 更新 2023-09-06 15:13:09 +08:00
binaryify 2e03ad008b Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2023-09-04 18:05:26 +08:00
binaryify 08f4c3b3df fix: 修复docker缺失文件问题 #1791 2023-09-04 18:05:20 +08:00
binaryify ee96cc09a5 update: 更新文档 2023-09-03 18:28:38 +08:00
binaryify 17c7317183 update: 文档更新 2023-09-01 14:00:36 +08:00
binaryify ff0206ee25 update: package-lock文件更新 2023-08-24 16:40:35 +08:00
binaryify 954093864d feat: 补充播客上传声音接口 #1789 2023-08-24 16:38:10 +08:00
binaryify d7cf9d1c2f bump to 4.10.1 2023-08-21 21:39:02 +08:00
binaryify c2621a5870 update: anonymous_token 动态生成 2023-08-21 21:34:41 +08:00
binaryify e528f93ef7 feat: 匿名登录username算法 2023-08-21 18:24:48 +08:00
binaryify ac99ba5822 update: 更新版本和文档 2023-08-21 10:28:38 +08:00
binaryify 5a0bdfb171 update: 状态码判断完善,补充verify相关接口 #1783 2023-08-21 10:19:17 +08:00
binaryify 7f21fbcda1 Merge pull request #1787 from movefreechen/master
update: 增加对带用户名密码的代理支持
2023-08-20 14:17:14 +08:00
binaryify 8913131739 fix: 禁用NMTID #1788 2023-08-20 12:40:06 +08:00
陈晗 8c70630d2d update: 增加对带用户名密码的代理支持 2023-08-20 11:12:48 +08:00
binaryify e1c4ed4268 fix: 更新文档错误描述 #1784 2023-08-19 23:31:55 +08:00
binaryify c0366c5da5 Merge pull request #1786 from kengwang/master
[feat] 新增 回忆坐标 API
2023-08-19 23:00:23 +08:00
kengwang 695b599e7d [feat] 新增 回忆坐标 API 2023-08-19 15:31:51 +08:00
kengwang c44faaa224 [lint] Fix lint error 2023-08-19 14:50:44 +08:00
kengwang 511837df3a [feat] 新增 云随机播放 API [undocumented] 2023-08-19 14:46:36 +08:00
binaryify 6b28f34b5b Merge pull request #1785 from kengwang/feat/aidj/info
[feat] 新增 私人 DJ
2023-08-18 23:14:13 +08:00
Kengwang d20ec1af22 [feat] 新增 私人 DJ 2023-08-18 20:24:35 +08:00
binaryify a892488320 update:补充 /vip/info/v2 接口 2023-08-15 15:50:17 +08:00
binaryify 092ef8b316 update: /vip/info 接口增加 uid 参数 2023-08-15 14:49:16 +08:00
binaryify c505cf455f update: 更新文档 2023-07-20 09:47:24 +08:00
binaryify f741bb358b bump to 4.9.0 2023-07-20 09:46:46 +08:00
binaryify 3935bd7b41 fix: lint error 2023-07-20 09:41:36 +08:00
binaryify 0764c52ffb update: 文档更新 2023-07-20 09:41:02 +08:00
binaryify 653aad88c4 Merge pull request #1773 from WooMai/master
Fix security risk with deprecated vm2 dependency
2023-07-20 09:39:56 +08:00
WooMai df9f2da995 Bump pac-proxy-agent 2023-07-19 23:25:14 +08:00
binaryify 6170e15e0d Merge pull request #1772 from SevenOutman/refactor/song-detail-types
refactor(dts): 更新 song_detail 返回值类型
2023-07-19 20:35:30 +08:00
Doma 65be4e30e7 refactor(dts): 更新 song_detail 返回值类型 2023-07-19 14:56:09 +08:00
binaryify 3022f2a47a Merge pull request #1770 from kengwang/feat/starpick-com-sum
[feat] 新增星评馆简要评论获取
2023-07-15 17:51:36 +08:00
Kengwang 35b2c8454b [feat] 新增星评馆简要评论获取 2023-07-15 16:04:21 +08:00
binaryify 77a0dcda3b Merge pull request #1766 from mos9527/master
docs: document `yrc` lyrics
2023-06-28 22:21:25 +08:00
mos9527 83eda822dd docs: document yrc lyrics 2023-06-28 19:47:04 +08:00
binaryify 4606e248b2 Merge pull request #1765 from meedfine/master
针对扫码登录502,增加一个明显的提示
2023-06-27 19:34:12 +08:00
meedfine 8157758820 fix 502 2023-06-27 14:39:06 +08:00
binaryify 84953f2c7a Merge pull request #1760 from XiaoMengXinX/master
新增沉浸环绕声音质,修改部分文案以同步客户端更改
2023-06-14 16:47:53 +08:00
XiaoMengXinX 789e26be6a 新增沉浸环绕声音质,修改部分文案以同步客户端更改 2023-06-14 10:19:05 +08:00
binaryify 3e5c052f98 fix: 支持headers不携带cookie信息 #1744 #1748 2023-05-29 16:30:36 +08:00
binaryify 0ff32acdc1 Merge pull request #1731 from XiaoMengXinX/master
增加对鲸云臻音、鲸云母带音质的支持
2023-04-24 09:22:10 +08:00
XiaoMengXinX 422191cea4 增加对鲸云臻音、鲸云母带音质的支持 2023-04-24 02:22:23 +08:00
binaryify 9d63df78c5 feat: 缓存策略添加hostname #1722 2023-04-07 10:00:10 +08:00
binaryify 7eca25d390 feat: 新增私信和通知接口 2023-04-07 09:39:34 +08:00
binaryify 5e3c84e6c3 依赖更新 2023-02-22 09:40:47 +08:00
binaryify de4f06196e 代码优化 2023-02-22 09:37:36 +08:00
binaryify 23cceebdbd Merge pull request #1706 from lixinyang123/master
解决 pkg 打包后无法运行
2023-02-22 09:19:24 +08:00
LLLXY 9debdc0bbc fixed pkg package error 2023-02-21 21:04:53 +00:00
binaryify 03fab7f2d7 Merge pull request #1696 from Shirtiny/master
Supports the configuration of   `Access-Control-Allow-Origin`  through environment variables.
2023-02-16 14:28:04 +08:00
Shirtiny ebfc130983 Merge branch 'Binaryify:master' into master 2023-02-16 11:07:12 +08:00
binaryify.zhuang 1917316718 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2023-02-15 09:41:34 +08:00
binaryify.zhuang 0a83b98faf 环境要求更新 2023-02-15 09:41:28 +08:00
Shirtiny 02c2a792e4 Merge branch 'Binaryify:master' into master 2023-02-13 23:59:36 +08:00
binaryify 28e071fa94 fix typo #1698 2023-02-12 22:34:31 +08:00
Shirtiny b7aa9f934c read Access-Control-Allow-Origin from env 2023-02-11 14:48:50 +00:00
binaryify.zhuang 4d7c51831b 文档说明更新 2023-02-10 16:27:35 +08:00
binaryify bebe44fb38 Merge pull request #1694 from HakurouKen/master
refactor(type): replace all limit/offset definitions with MultiPageConfig
2023-02-09 17:00:01 +08:00
HakurouKen 167d7a4c30 refactor: replace limit/offset with MultiPageConfig 2023-02-09 11:07:40 +08:00
binaryify.zhuang aa95a6185d Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2023-02-07 17:33:00 +08:00
binaryify.zhuang 4fc46a046c 文档说明更新 2023-02-07 17:32:40 +08:00
binaryify 9240541331 Merge pull request #1692 from HakurouKen/master
fix(types): playlist_track_all limit&offset params
2023-02-07 17:27:57 +08:00
leroy li 764960a17d fix(types): playlist_track_all limit&offset params 2023-02-06 12:36:38 +08:00
binaryify 18cc8ce66b Merge pull request #1691 from Goooler/master
Add Node 16 & 18 to test matrix
2023-02-05 11:56:06 +08:00
Goooler 65463bf726 Add Node 16 & 18 to test matrix 2023-02-05 11:52:46 +08:00
binaryify 1946797d70 Merge pull request #1681 from Hurrieam/master
Update package-lock.json
2023-01-22 21:11:52 +08:00
Hurrieam Hu 9f1bb9d1f6 Update package-lock.json
version updated when npm install
2023-01-22 15:00:34 +08:00
binaryify f52f2988c9 文档更新 2023-01-18 17:26:36 +08:00
binaryify 715e22b389 补充一起听相关接口 #1677 2023-01-18 16:33:53 +08:00
binaryify 848f899afe Merge pull request #1677 from kengwang/feat/api/listen-together
[feat]<api/listentogether>: 一起听 API 相关
2023-01-18 16:31:24 +08:00
binaryify 0015cf27cf bump to 4.8.8 2023-01-18 15:59:54 +08:00
binaryify 5e7beb8203 fix lint error 2023-01-18 15:52:24 +08:00
binaryify d8abac46d2 文档细节修复 2023-01-18 15:49:48 +08:00
binaryify 8743e216c9 axios 相关代码调整, 腾讯云 serverless 部署文档说明 2023-01-18 15:47:24 +08:00
kengwang 6a6c6e3dea [fix/doc] 完善一起听 主机模式 2023-01-16 15:23:44 +08:00
Kengwang 51e1e3b6f9 [doc] 修改一起听相关 2023-01-16 00:48:08 +08:00
Kengwang f268e7b870 [feat]<api/listentogether>: 一起听 API 相关
见 #1676
2023-01-16 00:22:24 +08:00
binaryify d73effd34a Merge pull request #1665 from Binaryify/renovate/eslint-plugin-html-7.x
chore(deps): update dependency eslint-plugin-html to v7
2023-01-11 12:05:22 +08:00
binaryify 47772fe902 文档错误修复 #1667 2023-01-11 09:57:18 +08:00
renovate[bot] a106997d40 chore(deps): update dependency eslint-plugin-html to v7 2023-01-08 10:22:04 +00:00
binaryify c71adfada5 Merge pull request #1669 from kengwang/feat/api/lyric-new
[feat]<api/lyric>: 添加逐字歌词接口
2023-01-08 18:20:37 +08:00
binaryify 4036dd9f93 Merge pull request #1670 from Raspberry-Monster/feat/api/cloudsearch
[feat] CloudSearch接口使用eapi代替weapi
2023-01-08 18:20:14 +08:00
binaryify 7872d77d50 Merge pull request #1668 from Revincx/master
fix: axios is not a function when using ES module
2023-01-08 18:18:05 +08:00
Raspberry-Monster 6a8144f227 [feat] CloudSearch接口使用eapi代替weapi以同时支持UnblockNeteaseMusic 2023-01-08 09:34:22 +08:00
Kengwang 912998b212 [feat]<api/lyric>: 添加逐字歌词接口 2023-01-07 22:07:58 +08:00
Revincx 372883c35f fix: axios is not a function when using ES module 2023-01-06 18:51:47 +08:00
binaryify 985a054658 登录问题修复 #1658 2023-01-04 10:46:58 +08:00
binaryify 23516ca856 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2023-01-02 18:21:21 +08:00
binaryify ff34f8ab11 手机登录问题修复 fix #1658 2023-01-02 18:21:03 +08:00
binaryify 4e14ca2786 Merge pull request #1637 from Binaryify/renovate/axios-1.x
fix(deps): update dependency axios to v1
2023-01-01 14:26:55 +08:00
binaryify f8dad7ec22 Merge pull request #1652 from a76yyyy/patch-3
同步 Github ReadMe 到 DockerHub
2023-01-01 14:11:28 +08:00
binaryify 8ff9b82e36 手机登录问题修复 2022-12-28 22:53:18 +08:00
binaryify 1fadb1b98b Merge pull request #1661 from ahmr-bot/patch-1
修复手机号登陆问题(网易这个 api 咋这么爱变啊
2022-12-28 22:48:20 +08:00
Aehxy f2ab58d3bb Update login_cellphone.js 2022-12-28 22:03:56 +08:00
binaryify 4994acd8a5 邮箱登录问题修复 2022-12-19 14:17:46 +08:00
binaryify 521f284b79 v 4.8.3 2022-12-19 09:57:02 +08:00
binaryify 99f6c915d4 Merge pull request #1653 from PeanutMelonSeedBigAlmond/fix/login
fix: 修复了手机号登录接口
2022-12-18 22:07:09 +08:00
13574 fe0ee3fba1 fix: 修复了手机号登录接口 2022-12-17 17:51:58 +08:00
a76yyyy 5adc11edfd Update DockerHub-Description.yml 2022-12-14 15:54:27 +08:00
a76yyyy 8debae2c21 Create DockerHub-Description.yml 2022-12-14 15:51:54 +08:00
binaryify a85797665d search接口回滚 2022-12-14 09:45:11 +08:00
binaryify 61cdcdeee7 文档更新 2022-12-13 17:42:08 +08:00
binaryify 4e39afebeb 文档例子id更新 2022-12-13 17:41:33 +08:00
binaryify 07f5842230 Merge pull request #1613 from chshouyu/new-dockerfile
Dockerfile 重构
2022-11-20 16:18:05 +08:00
renovate[bot] ba3e8caf11 Update dependency axios to v1 2022-10-26 12:01:51 +00:00
binaryify 175932d0ab Merge pull request #1629 from coder-xiaomo/master
Update README.md
2022-10-17 16:29:25 +08:00
程序员小墨 e05700004f Update README.md 2022-10-17 16:16:10 +08:00
binaryify b4ca93bda8 fixed lint error 2022-10-14 20:26:25 +08:00
binaryify 4d2343967d Merge pull request #1626 from qazxcdswe123/master
feat: auto retry failed upload (in module_example)
2022-10-14 16:46:58 +08:00
qazxcdswe123 2af22a506e feat: auto retry failed upload
Also fix single file upload (when passing --file), it was not treated as array properly
2022-10-14 14:55:07 +08:00
binaryify aa54bd8a24 Merge pull request #1623 from chen310/patch
feat: 增加若干曲风相关接口
2022-10-10 18:09:24 +08:00
chen_10 ccaa4bc8d5 feat: 增加若干曲风相关接口 2022-10-10 16:42:31 +08:00
chshouyu 80d411f5b1 refactor Dockerfile 2022-09-19 04:06:56 +08:00
binaryify 06dec2e79b 搜索接口更新 2022-09-13 14:16:03 +08:00
binaryify ae032b72a4 参数补充 2022-09-13 13:50:06 +08:00
binaryify 88056db7bd 修复 song/url 接口提示网络拥堵的问题,单元测试修复 2022-09-13 11:17:59 +08:00
binaryify 4977423e3a Merge pull request #1607 from kengwang/fix/typo/doc-wiki-summ
[typo]<doc>: 修正文档错误
2022-09-12 20:47:28 +08:00
Kengwang 20c9dd4125 [typo]<doc>: 修正文档错误 2022-09-12 20:26:10 +08:00
binaryify beb8919315 文档更新 2022-09-12 17:50:16 +08:00
binaryify 3cca8d2924 解决网络拥堵提示问题 2022-09-12 17:23:49 +08:00
binaryify b4f6ba0884 解决网络拥堵提示问题 2022-09-12 16:58:07 +08:00
binaryify feaf083dfe Merge pull request #1603 from DawningW/master
补全乐谱等API的interface
2022-09-07 16:39:36 +08:00
QingChenW cc10e81228 补全乐谱等API的interface 2022-09-07 16:22:51 +08:00
binaryify ae38be14ec remove login test 2022-09-03 23:28:06 +08:00
binaryify 56166c3157 fixed lint error 2022-09-03 23:26:43 +08:00
binaryify 890344aa97 Merge pull request #1500 from Binaryify/renovate/eslint-config-prettier-8.x
chore(deps): update dependency eslint-config-prettier to v8.5.0
2022-09-03 18:12:41 +08:00
binaryify 15151ff8ac Merge pull request #1505 from Binaryify/renovate/prettier-2.x
chore(deps): update dependency prettier to v2.7.1
2022-09-03 18:12:12 +08:00
binaryify 0d812fd0b0 Merge pull request #1598 from Binaryify/dependabot/npm_and_yarn/nanoid-and-mocha-3.3.3
chore(deps): bump nanoid and mocha
2022-09-03 18:11:54 +08:00
dependabot[bot] 6a3cf6fa2d chore(deps): bump nanoid and mocha
Bumps [nanoid](https://github.com/ai/nanoid) and [mocha](https://github.com/mochajs/mocha). These dependencies needed to be updated together.

Updates `nanoid` from 3.1.20 to 3.3.3
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.20...3.3.3)

Updates `mocha` from 8.4.0 to 10.0.0
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v8.4.0...v10.0.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
- dependency-name: mocha
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-02 07:21:35 +00:00
binaryify 3b908b34a5 bump to v4.7.0 2022-09-02 15:20:49 +08:00
binaryify 020e825701 resourceType补充,更新文档 2022-09-02 15:16:00 +08:00
binaryify 15492b996c Merge pull request #1597 from kengwang/master
[typo]<doc>: 修复一处文档笔误
2022-09-02 15:07:34 +08:00
Kengwang 6592ffaf19 [typo]<doc>: 修复一处文档笔误 2022-09-02 14:59:00 +08:00
binaryify dfc104e876 Merge pull request #1596 from kengwang/master
新增部分 API
2022-09-02 13:50:52 +08:00
kengwang be156c5d22 新增 API: 乐谱相关 API
新增:
* 获取乐谱列表
* 获取乐谱内容

!!! 请注意, 乐谱内容的 id 为 乐谱 ID, 请不要提交错误
2022-09-02 13:48:23 +08:00
kengwang b9e3b8f016 新增 API: 歌曲百科简要信息
有点无用的 API
2022-09-02 12:29:41 +08:00
binaryify 7a0321bcef 修复vercel部署后运行错误 2022-09-01 13:57:58 +08:00
binaryify 0cc771244f Merge pull request #1584 from kengwang/bugfix/remove-debug
[fix] 移除不必要的调试代码
2022-08-23 18:18:56 +08:00
Kengwang 9b7545b3f1 [fix] 移除不必要的调试代码 2022-08-23 10:32:25 +08:00
binaryify eb5c40bb33 Merge pull request #1583 from kengwang/master
[feat] 新增新版 音乐链接获取 API
2022-08-23 09:29:18 +08:00
kengwang 647396f38c [feat] 新增新版 音乐链接获取 API
注意, 为防止兼容性问题, 仍然保留旧版 API
新版 API 不再使用 br 作为音质的区分而是通过 standard 等单词更加准确地获取指定音质
默认 level 暂未设置
2022-08-23 02:00:41 +08:00
renovate[bot] f6e69243ed chore(deps): update dependency prettier to v2.7.1 2022-08-12 15:00:35 +00:00
renovate[bot] 86faba5817 chore(deps): update dependency eslint-config-prettier to v8.5.0 2022-08-12 14:59:39 +00:00
binaryify d47714175f Merge pull request #1566 from Binaryify/dependabot/npm_and_yarn/file-type-16.5.4
chore(deps): bump file-type from 16.1.0 to 16.5.4
2022-08-12 20:20:02 +08:00
binaryify 7c196a0bc5 Merge pull request #1580 from KNCM-Project/master
docs: correct default offset of /user/cloud
2022-08-08 20:27:39 +08:00
JackuXL 6abee06600 docs: correct default offset of /user/cloud 2022-08-08 12:18:01 +08:00
binaryify 92098e4b9a Merge pull request #1571 from WindLeaf233/master
docs: cd the directory before `npm install`
2022-07-24 20:39:57 +08:00
WindLeaf_qwq 33cca95cb3 readme: cd the directory before npm install 2022-07-24 19:31:46 +08:00
WindLeaf_qwq 82ab334d69 docs: cd the directory before npm install 2022-07-24 19:21:05 +08:00
dependabot[bot] 0b0baa52bf chore(deps): bump file-type from 16.1.0 to 16.5.4
Bumps [file-type](https://github.com/sindresorhus/file-type) from 16.1.0 to 16.5.4.
- [Release notes](https://github.com/sindresorhus/file-type/releases)
- [Commits](https://github.com/sindresorhus/file-type/compare/v16.1.0...v16.5.4)

---
updated-dependencies:
- dependency-name: file-type
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-23 01:38:03 +00:00
binaryify b079f7d1ba bump version 2022-07-17 22:24:22 +08:00
binaryify 71abe6faaf 音乐是否可用接口更新 获取精品歌单接口更新描述 #1544 2022-07-17 22:19:21 +08:00
binaryify 3e9f97cdb8 changelog日期更正 2022-06-20 17:21:16 +08:00
binaryify e8222ce3c6 npx 方式运行完善和增加文档说明 2022-06-20 17:20:19 +08:00
binaryify 10df8ecc3c 修复npx使用路径错误 2022-06-19 13:33:21 +08:00
binaryify 7bb0eaaf7e 修复歌单收藏/取消收藏歌曲接口报错问题 #1551 2022-06-19 12:54:26 +08:00
binaryify 53ec7ee8e1 歌单收藏/删除歌曲返回内容修复 2022-06-19 10:35:53 +08:00
binaryify 9074a695a0 更新文档说明 2022-06-17 10:51:08 +08:00
binaryify 41bf7d2c9c 修复 npm 包文件缺失的问题 2022-06-15 12:33:43 +08:00
binaryify ddb3042988 更新文档 #1544 2022-06-07 11:32:20 +08:00
binaryify e174de0448 客户端ip传入完善 2022-06-07 11:03:18 +08:00
binaryify 1591d0df6f 修复文档描述错误 fix #1544 2022-06-02 20:51:13 +08:00
binaryify 7faff01f5b 云贝推歌参数缺失修复 2022-05-30 15:52:30 +08:00
binaryify b1a9c93ebb bump to v4.6.2 2022-05-30 09:50:35 +08:00
binaryify b8898523e5 anonymous_token默认置空 2022-05-30 09:49:44 +08:00
binaryify 47bd9175ee 修复测试不通过的问题 2022-05-30 09:46:38 +08:00
binaryify b3ca43267a 服务启动刷新游客cookie 2022-05-29 21:45:48 +08:00
binaryify 9e5c9372fe Merge pull request #1542 from MrRainbowYoo/master
chore: Modify the config.json and prompt the user to bring their own cookies
2022-05-29 21:44:14 +08:00
binaryify c0a82ece79 Merge pull request #1535 from turrisxyz/naveensrinivasan/renovate-bot
chore: renovate bot setting to pin actions to a full length commit SHA
2022-05-29 21:03:09 +08:00
binaryify 1d93513570 问题修复 2022-05-29 19:04:26 +08:00
binaryify 6589094d99 增加匿名cookie生成接口 2022-05-29 19:01:41 +08:00
binaryify cff6bcf766 问题修复 2022-05-29 18:54:29 +08:00
binaryify 6bd63eb061 代码优化 2022-05-29 14:34:03 +08:00
MrRainbowYoo bef1b1c9ee 解决接口请求繁忙bug 2022-05-29 13:47:39 +08:00
binaryify 065d4aa111 remove log 2022-05-29 01:14:12 +08:00
binaryify 3027c704e2 merge 2022-05-29 01:12:19 +08:00
binaryify 1a3a9d3df6 修复请求接口提示需要验证的问题 #1541 #1539 #1537 #1538 2022-05-29 01:11:37 +08:00
binaryify 338ba1ea49 Merge pull request #1536 from foamzou/patch-1
fix(plugins-songUpload): compatibility method
2022-05-21 16:43:20 +08:00
foam c43bb9cb15 fix(plugins-songUpload): compatibility method
use replace rather than replaceAll
2022-05-21 10:16:07 +08:00
Naveen b0a9fe014d chore: renovate bot setting to pin actions to a full length commit SHA
- https://docs.renovatebot.com/modules/manager/github-actions/#additional-information

- Pinned actions by SHA https://github.com/ossf/scorecard/blob/main/docs/checks.md#pinned-dependencies

>Pin actions to a full length commit SHA

>Pinning an action to a full length commit SHA is currently the only way to use an action as an immutable release.
> Pinning to a particular SHA helps mitigate the risk of a bad actor adding a backdoor to the action's repository,
> as they would need to generate a SHA-1 collision for a valid Git object payload.

- https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-third-party-actions
- https://github.com/renovatebot/.github/blob/b0c3aa85ef2bb242580f20b02b380ca532b4ce17/default.json#L13
2022-05-19 21:13:41 -05:00
binaryify 844dabeeff 增加支持罗马音歌词返回 #1523 2022-05-06 21:13:02 +08:00
binaryify d7201c1b38 Merge pull request #1523 from akinazuki/master
增加支持罗马音歌词返回
2022-05-06 21:11:41 +08:00
binaryify 08dbeb1061 修复获取歌单所有歌曲接口分页问题 #1524 2022-05-06 20:44:00 +08:00
binaryify 4eef73db71 Merge pull request #1524 from NobeKanai/fix
fix(playlist_track_all): fix inconsistent meaning of offset/limit between code and document
2022-05-06 20:41:26 +08:00
nobekanai f4130b0dd8 fix(playlist_track_all): fix inconsistent meaning of offset/limit between code and document 2022-05-06 18:47:01 +08:00
Aki Nazuki 08334d85d8 增加支持罗马音歌词返回 2022-05-06 09:56:19 +08:00
Aki Nazuki d5250e8590 增加支持罗马音歌词返回 2022-05-06 09:16:13 +08:00
binaryify 65765edafe Merge pull request #1514 from turrisxyz/setup-permissions
chore: Set permissions for GitHub actions
2022-04-19 09:40:49 +08:00
nathannaveen 598b7eff5f chore: Set permissions for GitHub actions
Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much.

- Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions

https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs

[Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/)

Signed-off-by: nathannaveen <42319948+nathannaveen@users.noreply.github.com>
2022-04-19 00:33:43 +00:00
binaryify 606819489a update:更新文档 2022-04-16 12:16:07 +08:00
binaryify 9505a4ede9 Merge pull request #1512 from Goooler/ci
Bump GH actions
2022-04-16 09:52:31 +08:00
Goooler 7e13a3361d Bump GH actions 2022-04-15 22:46:27 +08:00
binaryify 9ce5055aad chore: update changelog, bump 4.5.12 2022-04-15 17:41:15 +08:00
binaryify 896560d554 Merge pull request #1511 from chen310/master
feat: 新增黑胶时光机接口
2022-04-15 17:36:57 +08:00
chen_10 bc3541f1a7 feat: 新增黑胶时光机接口 2022-04-15 16:03:00 +08:00
binaryify 9f5f178d68 Merge pull request #1473 from Binaryify/dependabot/npm_and_yarn/follow-redirects-1.14.8
chore(deps): bump follow-redirects from 1.14.4 to 1.14.8
2022-04-06 17:09:06 +08:00
binaryify 78640ffae3 update: 登录刷新接口完善 2022-04-06 17:08:30 +08:00
binaryify 81a218a2b1 update: 二维码登录例子更新 2022-04-06 16:55:12 +08:00
binaryify 22fbe0e3ed chore: 升级版本 2022-04-06 16:07:58 +08:00
binaryify 321e9c68f0 Merge pull request #1503 from itxve/master
🐛 专辑未正常获取
2022-04-06 15:56:48 +08:00
tianxueren 7c86728612 🐛 专辑未正常获取 2022-04-06 15:53:22 +08:00
binaryify ad2608494f 新增歌单更新播放量接口 2022-03-28 14:19:22 +08:00
binaryify 557874dcc2 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2022-03-26 11:46:13 +08:00
binaryify c2c53ade74 路径修复 2022-03-26 11:43:39 +08:00
binaryify 28da98d102 登录接口更新 2022-03-24 18:10:29 +08:00
binaryify 15260bc154 替换有兼容性的语法 2022-03-24 15:53:46 +08:00
binaryify b0701be845 cloud.html逻辑优化 2022-03-23 14:53:40 +08:00
binaryify 3cbad92d2f 单元测试完善 2022-03-20 18:46:47 +08:00
binaryify 684c581fe0 新增内部版本接口接口 2022-03-20 15:51:33 +08:00
binaryify ff74170bf2 修复云盘上传接口部分文件名格式上传失败的问题 2022-03-20 15:40:10 +08:00
binaryify 9cba287739 云盘上传适配flac 2022-03-20 12:39:08 +08:00
binaryify 5195a56a79 资源cdn修改 2022-03-20 11:00:34 +08:00
binaryify 878cc7fffc request.js替换废弃方法 2022-03-10 22:28:04 +08:00
binaryify f803f774f1 Merge pull request #1475 from Binaryify/dependabot/npm_and_yarn/vm2-3.9.7
chore(deps): bump vm2 from 3.9.3 to 3.9.7
2022-03-07 18:01:14 +08:00
binaryify faf35edef4 update 2022-03-05 22:46:50 +08:00
binaryify 31e95721a7 新增歌手粉丝数量接口 #1485 , 新增音乐人任务(新)接口, 更新 appver 2022-03-05 17:59:37 +08:00
binaryify 064a128fd9 更新文档 2022-03-03 22:23:14 +08:00
binaryify 5001b283ee 更新文档 2022-03-03 22:22:44 +08:00
binaryify cdf1abdba8 Merge pull request #1486 from meedfine/master
fix: 部署在域名子路径下无法执行示例的问题
2022-03-02 10:45:29 +08:00
MeedFine 9b67a09f4e fix: 部署在域名子路径下无法执行示例的问题 2022-03-01 22:50:28 +08:00
dependabot[bot] c3996147e8 chore(deps): bump vm2 from 3.9.3 to 3.9.7
Bumps [vm2](https://github.com/patriksimek/vm2) from 3.9.3 to 3.9.7.
- [Release notes](https://github.com/patriksimek/vm2/releases)
- [Changelog](https://github.com/patriksimek/vm2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patriksimek/vm2/compare/3.9.3...3.9.7)

---
updated-dependencies:
- dependency-name: vm2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 00:47:22 +00:00
binaryify 4050efc01c Merge pull request #1474 from chen310/master
Update README.md
2022-02-13 11:25:18 +08:00
chen310 0ee9527980 Update README.md 2022-02-13 10:17:43 +08:00
dependabot[bot] 8a1c84afc1 chore(deps): bump follow-redirects from 1.14.4 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.4 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.4...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-12 09:30:37 +00:00
binaryify 8cc6fe8676 歌单封面上传接口缺失参数时返回状态码修正 2022-02-12 17:30:00 +08:00
binaryify 6f6501cf10 Merge pull request #1471 from npmmirror/master
update https://registry.npm.taobao.org to https://registry.npmmirror.com
2022-02-11 22:20:32 +08:00
NPM Mirror Bot 02192b5863 update https://registry.npm.taobao.org to https://registry.npmmirror.com 2022-02-11 13:55:59 +00:00
binaryify d638be3455 update:歌曲详情文档增加字段说明 2022-02-11 21:29:34 +08:00
binaryify 0bc2a75879 update:歌曲详情文档增加字段说明 2022-02-11 17:36:53 +08:00
binaryify da88795b86 update:歌曲详情文档增加字段说明 2022-02-11 17:34:40 +08:00
binaryify 530d331eb2 update docs 2022-02-10 09:25:23 +08:00
binaryify 61d468ebbd 新增重复昵称检测接口 #1469 2022-02-09 22:40:20 +08:00
binaryify 61c8f2406c 新增重复昵称检测接口 #1469 2022-02-09 22:36:49 +08:00
binaryify 0fef46f7d1 新增重复昵称检测接口 #1469 2022-02-09 22:35:30 +08:00
binaryify ce6e29a7ec 搜索接口支持搜索声音 2022-02-09 20:45:05 +08:00
binaryify 2752ad5270 update docs 2022-02-09 16:15:45 +08:00
binaryify 4c643c7d36 修复云盘上传无法获取文件的问题 2022-02-09 15:03:58 +08:00
binaryify 8fa03ecd27 update license year 2022-02-05 14:45:48 +08:00
binaryify 247081174a update 2022-02-04 13:07:11 +08:00
binaryify 969d5d59c2 fix lint error 2022-02-03 08:52:31 +08:00
binaryify 114b92b68b Merge pull request #1462 from chen310/dev
feat: 签到进度接口 (Binaryify#1384)
2022-02-03 08:50:55 +08:00
chen_10 39708e48cb feat: 签到进度接口 (Binaryify#1384) 2022-02-02 22:45:43 +08:00
binaryify 39d3fb83eb update 2022-01-29 22:58:11 +08:00
binaryify 7a566765d9 Merge pull request #1459 from pan93412/fix/pack-server-js
fix: add "server.js" to the filelist to pack
2022-01-29 22:57:35 +08:00
pan93412 6681f11ce0 fix: add "server.js" to the filelist to pack
目前的 NPM 包少了 server.js,會導致
"NeteaseCloudMusicApi/server" 找不到檔案,也會讓
npx NeteaseCloudMusicApi 報錯(找不到 server.js 模組)
2022-01-29 22:27:17 +08:00
binaryify 61a0c0ebe1 入口文件优化#1457 2022-01-28 17:14:01 +08:00
binaryify d665429d77 Merge pull request #1457 from pan93412/refactor/dynamic-to-main
refactor: allow using server statically
2022-01-28 13:51:00 +08:00
pan93412 b02d4d5e04 refactor: allow using server statically
將原本 "NeteaseCloudMusicApi/server"
掃描 modules 目錄的部分抽出 server.js,
改移到 main.js。這樣使用者就有辦法只載入
靜態的伺服器部分(不動態載入模組)。

這個 patch 的 breaking changes 不易發生。
可作為 patch version 發佈。
2022-01-28 12:52:21 +08:00
binaryify.zhuang 91a3ba758d change version 2022-01-27 11:29:12 +08:00
binaryify.zhuang e7c153d9e9 增加兼容性 2022-01-27 11:23:44 +08:00
binaryify.zhuang d5b2952299 修复 pkg 打包问题 2022-01-27 11:09:10 +08:00
binaryify 36942a350c Merge pull request #1453 from pan93412/refactor/server-seperation
refactor(server): 使伺服器可以復用、更換廢棄函式
2022-01-27 10:49:33 +08:00
pan93412 69a71cb710 chore: add a tool to get the static module definitions 2022-01-26 14:50:50 +08:00
pan93412 c412f53f11 feat(server): allow printing out module paths 2022-01-26 14:42:50 +08:00
pan93412 7061a9ea82 refactor!: use server.js as main.js
server.js 有 main.js 原本的功能 (getModulesDefinitions)

BREAKING CHANGES: 所有使用到這個 lib 的應用程式
,皆需更改為 .getModulesDefinitions()。
2022-01-26 14:34:35 +08:00
pan93412 9e0c900f6f test(server): more reliable test for server 2022-01-26 14:30:00 +08:00
pan93412 4e434a2691 feat(server): add field "identifier"
I'm going to replace the function of "main.js".
2022-01-26 14:20:54 +08:00
pan93412 5bf53028ef feat(server): allow passing modules manually
自行維護 require 名單以相容 Webpack。
2022-01-26 14:14:24 +08:00
pan93412 fc9630aa39 refactor: add type definition of Express 2022-01-26 11:52:46 +08:00
pan93412 fb04e512c0 fix(server): remove the shebang line 2022-01-26 11:38:08 +08:00
pan93412 0ac00325c8 refactor(server): replace the deprecated function
Express 4.x 以上版本已經內建 body-parser。
2022-01-26 11:34:35 +08:00
pan93412 7985690987 refactor(server): separate server from app
我們需要 NCM API 的伺服器部分,但 app.js
目前的做法讓我們不太好單獨啟動伺服器。

我將 app.js 的伺服器部分抽成各個函數,並將原有
會 blocking 的函數更改為非同步函式。
這樣不僅能最大化善用 Node.js 的 Event Loop,
亦能提升未來維護的程式碼易讀性。
2022-01-26 11:29:07 +08:00
binaryify 6d335bd85f update to v4.3.0 2022-01-22 20:57:25 +08:00
binaryify 5daa11bdb6 Merge pull request #1446 from chen310/dev
fix: 发送/删除评论、点赞失败
2022-01-20 09:25:23 +08:00
chen_10 3a914fb240 doc: 修改文档错误 2022-01-20 09:02:58 +08:00
chen_10 2bd00f932f fix: 发送/删除评论、点赞失败 (Binaryify#1442) 2022-01-20 08:59:10 +08:00
binaryify 8ea1dc5d8a Merge pull request #1440 from cweijan/master
增加二进制文件node标识
2022-01-17 09:29:28 +08:00
WeiJian Chen 9ebdb6a1d8 增加二进制文件node标识 2022-01-16 23:52:31 +08:00
binaryify 9579e709f1 Merge pull request #1423 from Binaryify/renovate/lint-staged-12.x
chore(deps): update dependency lint-staged to v12.1.7
2022-01-16 20:53:52 +08:00
binaryify cdee107ced Merge pull request #1414 from Binaryify/renovate/eslint-8.x
chore(deps): update dependency eslint to v8.7.0
2022-01-16 20:53:32 +08:00
binaryify 644756d301 Merge pull request #1405 from Binaryify/renovate/prettier-2.x
chore(deps): update dependency prettier to v2.5.1
2022-01-16 20:53:13 +08:00
binaryify 9e29c66c63 Merge pull request #1403 from Binaryify/renovate/node-16.x
chore(deps): update dependency @types/node to v16.11.19
2022-01-16 20:53:01 +08:00
Renovate Bot a23eda52da chore(deps): update dependency eslint to v8.7.0 2022-01-16 03:14:07 +00:00
Renovate Bot b30b8a75ce chore(deps): update dependency prettier to v2.5.1 2022-01-15 10:48:25 +00:00
Renovate Bot d2c1cf215d chore(deps): update dependency lint-staged to v12.1.7 2022-01-15 10:47:25 +00:00
Renovate Bot f643dd5e73 chore(deps): update dependency @types/node to v16.11.19 2022-01-15 10:47:05 +00:00
binaryify a0500ec648 Merge pull request #1435 from SnowingFox/master
feat(playlist_track_all): 获取歌单所有歌曲接口新增offset偏移量设置,以此达到分页效果
2022-01-15 13:47:33 +08:00
SnowingFox 4a941dd5e9 feat(playlist_track_all): 增加offset偏移量设置 2022-01-15 13:18:34 +08:00
SnowingFox 10a0751b00 feat(playlist_track_all): 增加offset偏移量设置 2022-01-15 13:17:43 +08:00
SnowingFox 775cda8e24 feat(playlist_track_all): 增加offset偏移量设置 2022-01-15 13:14:12 +08:00
SnowingFox 231a0ad6fe feat(playlist_track_all): 增加offset偏移量设置 2022-01-15 13:12:29 +08:00
SnowingFox 845c357aa3 feat(playlist_track_all): 增加offset偏移量设置 2022-01-15 13:06:18 +08:00
binaryify 4200833a30 Merge pull request #1416 from Alkaidcc/master
修正最近播放接口的文档说明
2021-12-04 21:31:18 +08:00
Alkaidcc 8ecc3ce150 修正最近播放接口的文档说明 2021-12-04 21:16:08 +08:00
binaryify 68ca8bdf88 文档增加空格 2021-12-03 17:34:17 +08:00
binaryify 0d4f4d671e v4.2.0 新增最近播放-歌曲,最近播放-视频,最近播放-声音,最近播放-歌单,最近播放-专辑,最近播放-播客等接口 2021-11-23 19:44:35 +08:00
binaryify 168451712f Merge pull request #1353 from Binaryify/renovate/typescript-4.x
chore(deps): update dependency typescript to v4.5.2
2021-11-23 16:24:49 +08:00
binaryify fffdd57d69 Merge pull request #1360 from Binaryify/renovate/eslint-plugin-html-6.x
chore(deps): update dependency eslint-plugin-html to v6.2.0
2021-11-23 16:24:11 +08:00
binaryify 96db47b4fe Merge pull request #1366 from Binaryify/renovate/axios-0.x
fix(deps): update dependency axios to ^0.24.0
2021-11-23 16:24:01 +08:00
binaryify 6ab08670ab Merge pull request #1371 from Binaryify/renovate/eslint-8.x
chore(deps): update dependency eslint to v8
2021-11-23 16:23:51 +08:00
binaryify 95efccf0a6 Merge pull request #1378 from Binaryify/renovate/husky-7.x
chore(deps): update dependency husky to v7.0.4
2021-11-23 16:23:35 +08:00
binaryify 79646fda5a Merge pull request #1380 from Binaryify/renovate/node-16.x
chore(deps): update dependency @types/node to v16
2021-11-23 16:23:23 +08:00
binaryify 8331a3f9f4 Merge pull request #1394 from Binaryify/renovate/lint-staged-12.x
chore(deps): update dependency lint-staged to v12
2021-11-23 16:23:08 +08:00
binaryify 5221b9e671 Merge pull request #1402 from chen310/master
合并相同接口;增加歌手视频接口;增加创建共享歌单的用法
2021-11-23 16:17:40 +08:00
chen_10 0f27e22656 增加创建共享歌单的用法 2021-11-23 15:42:46 +08:00
chen_10 8d7c147696 增加歌手视频接口 2021-11-23 15:32:19 +08:00
chen_10 873eb58899 合并相同接口 2021-11-23 15:05:57 +08:00
Renovate Bot 5f4f5f8268 chore(deps): update dependency lint-staged to v12 2021-11-22 09:21:16 +00:00
binaryify b43c0871ed update docs 2021-11-22 09:21:51 +08:00
Renovate Bot 96cab0cafe chore(deps): update dependency eslint to v8 2021-11-21 09:02:12 +00:00
Renovate Bot 4c4c2d8233 chore(deps): update dependency eslint-plugin-html to v6.2.0 2021-11-20 14:45:28 +00:00
binaryify 9803e2e5a1 添加乐签信息接口 #1365 2021-11-20 20:28:37 +08:00
binaryify 136f14db49 更新文档 2021-11-20 17:24:18 +08:00
binaryify 80961900f9 修复新版评论返回参数错误问题 #1393 2021-11-20 17:20:50 +08:00
binaryify 9f0ea1dabc Merge pull request #1397 from SnowingFox/master
feature: 新增获取歌单所有歌曲的API
2021-11-20 15:14:51 +08:00
SnowingFox 9022f52156 修改一处文字 2021-11-20 15:12:18 +08:00
SnowingFox 615e1c1748 新增能获取歌单所有歌曲的API 2021-11-20 15:10:49 +08:00
SnowingFox ba38d005bf 修改文档 2021-11-20 12:48:53 +08:00
SnowingFox 96f84b0ace feature: 新增获取歌单所有歌曲的API 2021-11-20 11:07:20 +08:00
Renovate Bot 2f479f9622 chore(deps): update dependency @types/node to v16 2021-11-19 08:45:52 +00:00
Renovate Bot 8b7b45ca4a chore(deps): update dependency typescript to v4.5.2 2021-11-17 19:23:09 +00:00
binaryify e15e7ea664 Merge pull request #1391 from XiaoMengXinX/master
新增发送文本动态接口、获取客户端歌曲下载链接url接口
2021-11-06 21:58:36 +08:00
lz已经是条咸鱼了 793c276e4e 新增获取客户端歌曲下载url接口 2021-11-06 21:38:55 +08:00
lz已经是条咸鱼了 9e9c77541a 新增发送文本动态接口 2021-11-06 12:35:58 +08:00
binaryify 6c3743959e Merge pull request #1383 from a76yyyy/patch-2
Auto build Docker images when releasing new
2021-10-28 13:00:39 +08:00
a76yyyyy ac02283a83 Update Build_Image.yml 2021-10-27 12:07:08 +08:00
a76yyyyy b931bfde40 Update Dockerfile 2021-10-27 12:05:13 +08:00
a76yyyyy 42a64dc0e1 Auto build Docker images when releasing new
在setting创建secrets name=DOCKER_USERNAME  value=Docker_ID;
创建secrets name=DOCKER_PASSWORD  value=Docker_Password;
实现在发布新版本tag时自动构建Docker镜像
2021-10-27 10:45:57 +08:00
Renovate Bot 7385f05809 fix(deps): update dependency axios to ^0.24.0 2021-10-25 18:08:38 +00:00
Renovate Bot b8a19a2ee8 chore(deps): update dependency husky to v7.0.4 2021-10-21 02:47:38 +00:00
binaryify 9fe5238ab8 update workflows 2021-10-14 17:01:07 +08:00
binaryify 107ba8b266 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2021-10-14 16:49:00 +08:00
binaryify 365391c081 update license 2021-10-14 16:48:45 +08:00
binaryify 0f694fb2a2 Merge pull request #1372 from Binaryify/renovate/major-typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v5 (major)
2021-10-14 16:41:47 +08:00
Renovate Bot cd88b5924a chore(deps): update typescript-eslint monorepo to v5 2021-10-11 19:31:17 +00:00
binaryify 0f72d6043a merge 2021-10-07 18:53:34 +08:00
binaryify 8aad07e683 Merge pull request #1367 from wk93210/wk93210/batch_upload
Batch Music Cloud Upload
2021-10-07 18:15:24 +08:00
Lunan Li 7c7080ce3b Added Batch Music Upload Feature 2021-10-02 16:34:17 -07:00
binaryify 1c05f8f57d update version 2021-09-15 09:38:26 +08:00
binaryify a8a20ae48b 修复interface不完整问题 #1356 2021-09-15 09:29:49 +08:00
binaryify 5942e265bf Merge pull request #1355 from HEHEHAHAHEIHEI/wk93210/upload_bug_fix
Better Error Handling for Upload Failure and Max Uploading File Length
2021-09-14 15:04:37 +08:00
Lunan Li f5cade95e4 Better Error Handling during Upload Failure and Setting Max File Length to Infinity 2021-09-13 23:45:03 -07:00
binaryify 8da05fe6f9 Merge pull request #1350 from Binaryify/renovate/npm-axios-vulnerability
chore(deps): update dependency axios to 0.21.2 [security]
2021-09-09 13:42:25 +08:00
Renovate Bot ffa1a0f0e6 chore(deps): update dependency axios to 0.21.2 [security] 2021-09-08 16:55:23 +00:00
binaryify 0660928dc5 修复 URI malformed 错误 #1347 #1287 #1110 2021-09-08 14:12:49 +08:00
binaryify d608f100d1 Merge pull request #1349 from Binaryify/renovate/node-14.x
chore(deps): update dependency @types/node to v14.17.15
2021-09-08 10:01:12 +08:00
Renovate Bot 51bbb25a0f chore(deps): update dependency @types/node to v14.17.15 2021-09-07 08:42:12 +00:00
binaryify ec36bc27b0 更新 2021-09-04 15:06:07 +08:00
binaryify 53ba3e175f 修复代理设置问题 #1343 2021-09-04 15:03:30 +08:00
binaryify 0e658f9b5a 修复调用不存在的接口导致API崩溃的问题 #1345 2021-09-04 14:56:28 +08:00
binaryify 28289beb8d 修复云盘上传失败问题 #1332 2021-09-04 14:45:00 +08:00
binaryify ffeb4dc1c2 Merge pull request #1324 from Binaryify/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v4.30.0
2021-09-04 13:13:16 +08:00
binaryify ddd2163e80 Merge pull request #1336 from Binaryify/renovate/typescript-4.x
chore(deps): update dependency typescript to v4.4.2
2021-09-04 13:12:56 +08:00
binaryify 58865f5e7d Merge pull request #1340 from Binaryify/renovate/eslint-plugin-prettier-4.x
chore(deps): update dependency eslint-plugin-prettier to v4
2021-09-04 13:12:42 +08:00
binaryify 6916b8fe63 Merge pull request #1337 from kengwang/master
新增 API
2021-09-04 13:05:15 +08:00
Renovate Bot b6642c958e chore(deps): update dependency eslint-plugin-prettier to v4 2021-08-30 21:15:55 +00:00
Renovate Bot 2cab8b1bf3 chore(deps): update typescript-eslint monorepo to v4.30.0 2021-08-30 17:26:52 +00:00
kengwang 52856371a4 新增公开隐私歌单接口 2021-08-27 11:52:49 +08:00
Renovate Bot 7fb81da3ad chore(deps): update dependency typescript to v4.4.2 2021-08-26 21:28:29 +00:00
kengwang d8bdb4002d 新增歌曲相关视频接口 2021-08-23 23:59:12 +08:00
binaryify 077a347d41 手机登录增加验证码登录方式 #1328, #1075 #1227 2021-08-20 10:14:36 +08:00
binaryify ced768962a update version 2021-08-10 17:28:31 +08:00
binaryify 22e4da431d Merge pull request #1318 from Binaryify/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v4.29.1
2021-08-10 13:55:10 +08:00
binaryify 4eb4952262 Merge pull request #1317 from PL-FE/patch-1
Update app.js
2021-08-10 13:54:52 +08:00
binaryify 0e12a4239b Merge pull request #1316 from JackuXL/patch-1
Update README.MD 添加第三方SDK板块
2021-08-10 09:39:38 +08:00
Renovate Bot ffdc2f0137 chore(deps): update typescript-eslint monorepo to v4.29.1 2021-08-09 18:26:34 +00:00
pengliang 54195037a4 Update app.js
修正缺少分号引起的错误
2021-08-09 22:07:54 +08:00
JackuXL 04ab092dac Update README.MD
添加第三方SDK板块
2021-08-09 20:44:04 +08:00
binaryify f9073f27c6 update version 2021-08-09 10:58:23 +08:00
binaryify 7179935a39 Merge pull request #1301 from Binaryify/renovate/lint-staged-11.x
chore(deps): update dependency lint-staged to v11.1.2
2021-08-09 10:55:21 +08:00
binaryify 4cb8177255 Merge pull request #1304 from Binaryify/renovate/node-14.x
chore(deps): update dependency @types/node to v14.17.9
2021-08-09 10:55:12 +08:00
binaryify 2859471bfd Merge pull request #1307 from Binaryify/renovate/eslint-7.x
chore(deps): update dependency eslint to v7.32.0
2021-08-09 10:55:05 +08:00
binaryify 359ca4c538 Merge pull request #1315 from syhan/syhan-patch-1
Fix the wrong cookie split regex
2021-08-09 10:52:57 +08:00
Song Yihan f47c7269dd Fix the wrong cookie split regex 2021-08-09 10:49:49 +08:00
binaryify 3961e358f1 Merge pull request #1312 from marcoriosp/patch-1
Polynomial regular expression
2021-08-07 13:28:27 +08:00
Marco Rios ff5ace990c Polynomial regular expression
A regular expression that can require polynomial time to match may be vulnerable to denial-of-service attacks.
2021-08-07 01:20:28 +08:00
Renovate Bot d602d5fa61 chore(deps): update dependency lint-staged to v11.1.2 2021-08-06 07:17:46 +00:00
Renovate Bot bbe19891a2 chore(deps): update dependency @types/node to v14.17.9 2021-08-04 17:12:12 +00:00
Renovate Bot 96f4d9adf5 chore(deps): update dependency eslint to v7.32.0 2021-07-30 23:36:06 +00:00
binaryify 801fc5a7ea fixed realIP error 2021-07-23 09:17:29 +08:00
binaryify e602cdd550 Merge pull request #1254 from Binaryify/renovate/eslint-7.x
chore(deps): update dependency eslint to v7.31.0
2021-07-19 10:29:37 +08:00
binaryify f79f707e6c Merge pull request #1260 from Binaryify/renovate/node-14.x
chore(deps): update dependency @types/node to v14.17.5
2021-07-19 10:29:13 +08:00
binaryify 7874fcb6c9 Merge pull request #1271 from Binaryify/renovate/typescript-4.x
chore(deps): update dependency typescript to v4.3.5
2021-07-19 10:29:03 +08:00
binaryify a5dfadc1ad Merge pull request #1280 from Binaryify/renovate/husky-7.x
chore(deps): update dependency husky to v7
2021-07-19 10:28:53 +08:00
binaryify 9d5a79eb7f Merge pull request #1288 from Binaryify/renovate/pac-proxy-agent-5.x
fix(deps): update dependency pac-proxy-agent to v5
2021-07-19 10:28:45 +08:00
binaryify f081e8ae9e Merge pull request #1291 from Binaryify/renovate/lint-staged-11.x
chore(deps): update dependency lint-staged to v11.0.1
2021-07-19 10:28:30 +08:00
Renovate Bot fa7efa28e4 chore(deps): update dependency eslint to v7.31.0 2021-07-17 23:27:00 +00:00
binaryify 2ecde76413 update 2021-07-16 10:54:11 +08:00
binaryify 338ae58dc7 fix lint error 2021-07-16 10:52:31 +08:00
binaryify 214415a119 Merge pull request #1293 from chen310/master
增加音乐人签到接口;修正文档错误
2021-07-16 10:49:37 +08:00
chen_10 509755a33b 增加音乐人签到接口;修正文档错误 2021-07-16 10:40:27 +08:00
Renovate Bot 375a2e3d9c chore(deps): update dependency lint-staged to v11.0.1 2021-07-13 10:26:01 +00:00
Renovate Bot e42d19c2c2 fix(deps): update dependency pac-proxy-agent to v5 2021-07-12 22:31:23 +00:00
Renovate Bot 3b8071b50e chore(deps): update dependency @types/node to v14.17.5 2021-07-07 17:10:06 +00:00
binaryify 462af30e25 Merge pull request #1285 from WooMai/master
添加 VIP 信息接口
2021-07-07 17:18:30 +08:00
WooMai 7f644bf61f 添加 VIP 信息接口 2021-07-06 20:18:07 +08:00
Renovate Bot c2d62cddfe chore(deps): update dependency husky to v7 2021-07-06 10:43:43 +00:00
Renovate Bot 60ffcd5f0a chore(deps): update dependency typescript to v4.3.5 2021-06-30 23:57:42 +00:00
binaryify 1cdc09226f Merge pull request #1273 from ceabqw/patch-1
Update request.js
2021-06-24 15:11:33 +08:00
binaryify 122b6f765b Merge pull request #1275 from blooddark/master
增加打包可执行程序功能
2021-06-21 09:03:56 +08:00
blooddark 45bfab349b 增加打包可执行程序功能 2021-06-20 10:02:32 +08:00
ceabq 25d1e3ae88 Update request.js 2021-06-18 19:03:31 -07:00
binaryify 6a293401c2 Merge pull request #1269 from moonrailgun/master
fix: samesite problem in cors request after chrome 80
2021-06-11 20:51:36 +08:00
moonrailgun 3b04746278 fix: samesite problem in cors request after chrome 80
After Chrome 80, the default samesite in cookie will be set to `Lax`.
And i am try to fix it. Disable SameSite policy when deploy by tls.

For more detail about Chrome 80, checkout:
- https://support.google.com/chrome/a/thread/27911174/chrome-80-release-notes-are-now-live?hl=en
- https://blog.chromium.org/2020/02/samesite-cookie-changes-in-february.html

For more detail about SameSite, checkout:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
2021-06-11 14:31:04 +08:00
binaryify 8af9f78abc update docs 2021-06-07 10:10:41 +08:00
binaryify 788d2f0e6f Merge pull request #1253 from Binaryify/renovate/node-14.x
chore(deps): update dependency @types/node to v14.17.2
2021-06-03 09:58:48 +08:00
Renovate Bot f2e6e6a258 chore(deps): update dependency @types/node to v14.17.2 2021-06-02 08:08:06 +00:00
binaryify c579ef887a update 2021-06-02 12:00:16 +08:00
binaryify 7a2dd90960 update eslint config 2021-06-02 11:47:52 +08:00
binaryify 35cfbbb2b6 fix eslint error 2021-06-02 11:45:58 +08:00
binaryify 36e8573ac6 Merge pull request #1192 from Binaryify/renovate/intelli-espower-loader-1.x
chore(deps): update dependency intelli-espower-loader to v1.1.0
2021-06-02 11:44:49 +08:00
binaryify a95f2270a9 Merge pull request #1194 from Binaryify/renovate/typescript-4.x
chore(deps): update dependency typescript to v4.3.2
2021-06-02 11:44:39 +08:00
binaryify af6d787af1 Merge pull request #1202 from Binaryify/renovate/node-14.x
chore(deps): update dependency @types/node to v14.17.1
2021-06-02 11:44:25 +08:00
binaryify c2ba980a5a Merge pull request #1244 from Binaryify/renovate/mocha-8.x
chore(deps): update dependency mocha to v8.4.0
2021-06-02 11:44:07 +08:00
binaryify a27af8dbae Merge pull request #1245 from Binaryify/renovate/eslint-config-prettier-8.x
chore(deps): update dependency eslint-config-prettier to v8
2021-06-02 11:43:46 +08:00
binaryify 5bd3b97081 Merge pull request #1252 from chen310/master
增加若干接口
2021-06-02 11:42:57 +08:00
binaryify 63ff22bf34 fix eslint error 2021-06-01 10:12:52 +08:00
chen10 4102a705fb 修改领取会员成长值接口 2021-05-31 12:07:42 +08:00
chen310 b0e12093e5 Delete workspace.code-workspace 2021-05-31 04:02:51 +00:00
chen10 b1beb10acf 更正文档错误 2021-05-31 10:00:31 +08:00
chen10 26506ad48c 修改歌手粉丝接口默认参数 2021-05-31 09:52:51 +08:00
chen10 f2ec40d36e 增加音乐人相关接口 2021-05-31 09:46:02 +08:00
chen10 0475f3b61d 增加歌手粉丝接口;数字专辑详情接口;数字专辑销量接口 2021-05-29 21:13:10 +08:00
binaryify ea86e5bbeb 新增已购单曲,获取mlog播放地址,将mlog id转为视频id,vip成长值,vip成长值获取记录,vip任务,领取vip成长值 等接口 #1248 2021-05-29 16:12:12 +08:00
binaryify 5494359948 Merge pull request #1248 from chen310/master
增加已购单曲接口;mlog相关接口;vip相关接口
2021-05-29 15:10:01 +08:00
chen10 e994bb836e 增加已购单曲接口;mlog相关接口;vip相关接口 2021-05-28 20:01:21 +08:00
Renovate Bot f8ff652b36 chore(deps): update dependency eslint-config-prettier to v8 2021-05-28 02:55:34 +00:00
Renovate Bot 369edad75e chore(deps): update dependency typescript to v4.3.2 2021-05-28 02:55:00 +00:00
Renovate Bot 629eda2db6 chore(deps): update dependency mocha to v8.4.0 2021-05-28 02:54:45 +00:00
Renovate Bot 806898ab81 chore(deps): update dependency @types/node to v14.17.1 2021-05-28 02:54:29 +00:00
binaryify 8e7c7c5531 增加云贝推歌接口,云贝推歌历史记录接口 #1246 2021-05-28 09:45:27 +08:00
binaryify af27f1a319 Merge pull request #1246 from chen310/master
增加云贝推歌接口
2021-05-28 09:37:17 +08:00
chen310 055775bf75 Merge branch 'Binaryify:master' into master 2021-05-27 18:44:43 +08:00
chen10 83be4cc744 增加云贝推歌接口 2021-05-27 18:37:04 +08:00
binaryify 8fa42fe169 修复解析问题,改善 Docker 支持 #1241 2021-05-24 10:38:01 +08:00
Renovate Bot 6c4899e38d chore(deps): update dependency intelli-espower-loader to v1.1.0 2021-05-24 02:37:15 +00:00
binaryify f5437a34d2 Merge pull request #1243 from Binaryify/renovate/eslint-plugin-prettier-3.x
chore(deps): update dependency eslint-plugin-prettier to v3.4.0
2021-05-24 10:36:38 +08:00
Renovate Bot dc6a303793 chore(deps): update dependency eslint-plugin-prettier to v3.4.0 2021-05-24 02:35:57 +00:00
binaryify c2d738822e Merge pull request #1241 from greenhat616/master
修复解析问题,改善 Docker 支持
2021-05-24 10:34:57 +08:00
greenhat616 f23fbae6aa chore: import husky 2021-05-24 02:25:09 +08:00
greenhat616 eba9641aa0 fix: lint 2021-05-24 02:24:26 +08:00
greenhat616 aded3f3ea5 fix: lint 2021-05-24 02:16:14 +08:00
greenhat616 a82f930297 chore: make dockerfile reasonable 2021-05-24 02:02:47 +08:00
greenhat616 e0eec75f08 fix(requests): omit JSON based(without encryption) data 2021-05-24 02:00:34 +08:00
binaryify 97bd7fedf8 Merge pull request #1226 from Binaryify/renovate/lint-staged-11.x
Update dependency lint-staged to v11
2021-05-13 14:20:19 +08:00
binaryify 296082afcc Merge pull request #1230 from Binaryify/renovate/prettier-2.x
Update dependency prettier to v2.3.0
2021-05-13 14:20:09 +08:00
binaryify ecb2f8e4b8 Merge pull request #1229 from Binaryify/renovate/npm-lodash-vulnerability
Update dependency lodash to 4.17.21 [SECURITY]
2021-05-13 14:19:58 +08:00
binaryify 8804cf0ebc Merge pull request #1234 from Binaryify/dependabot/npm_and_yarn/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21
2021-05-13 14:11:56 +08:00
dependabot[bot] e9668a33d1 Bump lodash from 4.17.20 to 4.17.21
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 22:23:18 +00:00
Renovate Bot fbea33dfbd Update dependency prettier to v2.3.0 2021-05-09 23:54:13 +00:00
Renovate Bot 1ec1950cf8 Update dependency lodash to 4.17.21 [SECURITY] 2021-05-09 13:36:18 +00:00
Renovate Bot a722b5b187 Update dependency lint-staged to v11 2021-05-07 18:22:09 +00:00
binaryify 56086b709a 更新文档 #1214 2021-05-07 09:14:17 +08:00
binaryify 679be3df69 首页-发现接口增加 cursor 参数,refresh默认设为false #1217 2021-05-01 16:46:16 +08:00
binaryify e35a44e9ba update docs 2021-04-26 10:59:40 +08:00
binaryify 8d467a1c2f update docs 2021-04-26 10:56:21 +08:00
binaryify 05084c7f81 新增云盘歌曲信息匹配纠正接口 #1212 2021-04-26 10:53:32 +08:00
binaryify bf8f98d726 新增用户历史评论接口 #1197 2021-04-09 10:28:42 +08:00
binaryify 8d5797b11c Merge pull request #1186 from Binaryify/renovate/npm-netmask-vulnerability
Update dependency netmask to 2.0.1 [SECURITY]
2021-04-05 17:21:47 +08:00
Renovate Bot c2876fda6c Update dependency netmask to 2.0.1 [SECURITY] 2021-03-31 20:00:37 +00:00
binaryify e3e7a93b28 Merge pull request #1183 from Binaryify/renovate/npm-y18n-vulnerability
Update dependency y18n to 4.0.1 [SECURITY]
2021-03-30 20:59:28 +08:00
binaryify d9f3b36634 Merge pull request #1184 from Binaryify/dependabot/npm_and_yarn/y18n-4.0.1
Bump y18n from 4.0.0 to 4.0.1
2021-03-30 20:59:18 +08:00
dependabot[bot] 7a1d1113cf Bump y18n from 4.0.0 to 4.0.1
Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-30 07:57:09 +00:00
Renovate Bot 0ecc2df590 Update dependency y18n to 4.0.1 [SECURITY] 2021-03-30 05:56:32 +00:00
binaryify 259d3caf70 Merge pull request #1166 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.37
2021-03-30 13:55:56 +08:00
binaryify 2d2172541a Merge pull request #1168 from Binaryify/renovate/eslint-plugin-html-6.x
Update dependency eslint-plugin-html to v6.1.2
2021-03-30 13:55:47 +08:00
binaryify 07df13d4c9 Merge pull request #1171 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8.3.2
2021-03-30 13:55:31 +08:00
binaryify 5c746cb0a4 Merge pull request #1172 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.23.0
2021-03-30 13:55:21 +08:00
Renovate Bot ce2c254f1d Update dependency @types/node to v14.14.37 2021-03-27 02:13:40 +00:00
Renovate Bot f42390dc79 Update dependency eslint to v7.23.0 2021-03-26 22:39:06 +00:00
binaryify baeddb68f5 Merge pull request #1180 from Clarkkkk/master
解决使用POST请求时cookie没有转换为对象导致的问题
2021-03-26 14:38:10 +08:00
Clark 39b32b4b61 1. 在调用模块前,若req.query.cookie和req.body.cookie是字符串,则先解码,再转为对象。
2. 删除在各模块中的转换。
3. 更新文档。
2021-03-26 02:02:38 +08:00
binaryify 3fe3995f14 更新personalized/newsong接口 2021-03-25 21:08:16 +08:00
binaryify 7e9dc3fe5f update README.MD 2021-03-13 15:21:12 +08:00
binaryify 6c094b4f50 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2021-03-13 13:37:25 +08:00
binaryify b6edef640a 新增一起听状态接口 #1170 #1098 2021-03-13 13:37:09 +08:00
Renovate Bot 6a99d3fc97 Update dependency mocha to v8.3.2 2021-03-12 11:02:04 +00:00
Renovate Bot df01fbf0c1 Update dependency eslint-plugin-html to v6.1.2 2021-03-08 13:15:21 +00:00
binaryify c8e921681c Merge pull request #1158 from Binaryify/renovate/typescript-4.x
Update dependency typescript to v4.2.3
2021-03-06 20:37:27 +08:00
binaryify a95f4e693d Merge pull request #1162 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.21.0
2021-03-06 20:37:18 +08:00
binaryify aebf289b9a Merge pull request #1157 from Binaryify/renovate/lint-staged-10.x
Update dependency lint-staged to v10.5.4
2021-03-06 20:37:06 +08:00
Renovate Bot b92d139d82 Update dependency lint-staged to v10.5.4 2021-03-06 10:46:49 +00:00
binaryify d5c93f1ea3 Merge pull request #1165 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8.3.1
2021-03-06 16:19:02 +08:00
Renovate Bot 4a4cf2874b Update dependency mocha to v8.3.1 2021-03-06 08:18:08 +00:00
binaryify 166db1ee9a update docs 2021-03-05 13:58:09 +08:00
Renovate Bot 83a8c0ec27 Update dependency typescript to v4.2.3 2021-03-05 00:34:29 +00:00
binaryify ba3121a63c update docs 2021-03-03 17:28:41 +08:00
Renovate Bot e20104d07f Update dependency eslint to v7.21.0 2021-02-27 22:55:00 +00:00
binaryify 044ac78c17 update docs 2021-02-27 22:42:28 +08:00
binaryify 11a72f1726 更新启动页 2021-02-27 21:26:30 +08:00
binaryify 1e4f19ab89 代码格式化 2021-02-27 21:18:07 +08:00
binaryify bb468d5b55 增加Vercel 部署说明 2021-02-27 21:15:24 +08:00
binaryify 4cc750d6ec add vercel config 2021-02-27 21:04:57 +08:00
binaryify 3e58a4cadf update 2021-02-27 20:12:48 +08:00
binaryify 44bb25e81c v4.0.7,#1151 #1152 #1143 #1161 2021-02-27 19:58:24 +08:00
binaryify d1907ae541 修复红心接口460错误问题 #1151 2021-02-27 16:13:53 +08:00
binaryify 368b7f6b69 Merge pull request #1118 from Binaryify/renovate/eslint-plugin-html-6.x
Update dependency eslint-plugin-html to v6.1.1
2021-02-27 15:18:20 +08:00
binaryify ffd0212a28 Merge pull request #1120 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8.3.0
2021-02-27 15:18:10 +08:00
binaryify 216a2b8f7a Merge pull request #1122 from Binaryify/renovate/prettier-2.x
Update dependency prettier to v2.2.1
2021-02-27 15:18:03 +08:00
binaryify c394e00b89 Merge pull request #1130 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.31
2021-02-27 15:17:51 +08:00
binaryify c99ddb4fae Merge pull request #1131 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.20.0
2021-02-27 15:17:40 +08:00
binaryify fbe87a64ef Merge pull request #1155 from 7lsu/master
增加私信专辑功能
2021-02-27 15:17:16 +08:00
7lsu cd17ccfbaa 增加私信专辑功能 2021-02-27 14:59:19 +08:00
binaryify 1eb178d0e4 修复 eapi 接口无法正确解密response的问题 #1138 2021-02-21 21:29:00 +08:00
Renovate Bot 0b4cb08ca0 chore(deps): update dependency @types/node to v14.14.31 2021-02-19 19:55:33 +00:00
binaryify d289f6332d 修复红心接口默认不红心的问题 #1126 2021-02-19 22:03:47 +08:00
binaryify e18d14f1e2 修复红心接口默认不红心的问题 2021-02-19 21:43:34 +08:00
binaryify 8e627fb9fa 更新文档 2021-02-18 21:38:52 +08:00
binaryify 60f017c1a1 移除云村热评接口(官方下架) #1111, 更新app version 2021-02-18 18:06:47 +08:00
binaryify 25cc98fed3 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2021-02-15 20:57:28 +08:00
binaryify 289dbd13ce 更新docsify版本 2021-02-15 20:50:42 +08:00
Renovate Bot 0591733faf chore(deps): update dependency eslint to v7.20.0 2021-02-12 23:32:19 +00:00
Renovate Bot 118f208fcc chore(deps): update dependency mocha to v8.3.0 2021-02-11 19:52:25 +00:00
Renovate Bot 19198dc227 chore(deps): update dependency prettier to v2.2.1 2021-02-05 08:59:15 +00:00
Renovate Bot 50b1f69213 chore(deps): update dependency eslint-plugin-html to v6.1.1 2021-02-05 08:57:12 +00:00
binaryify 90fa494866 Merge pull request #1104 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.25
2021-02-05 16:56:03 +08:00
binaryify ceef2c461f Merge pull request #1113 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.19.0
2021-02-05 16:55:54 +08:00
binaryify 7f5953edf1 Merge pull request #1116 from MuBeiSAMA/master
feat: Batch upload
2021-02-05 16:44:42 +08:00
zhouwei 282c19dcf7 feat: Batch upload 2021-02-05 16:25:33 +08:00
Renovate Bot 3b5a8bac25 Update dependency @types/node to v14.14.25 2021-02-04 09:07:06 +00:00
Renovate Bot 5eae918ef6 Update dependency eslint to v7.19.0 2021-01-31 06:02:16 +00:00
binaryify d64262676a 修复云盘接口中文音乐信息乱码的问题 #1108 2021-01-28 22:18:19 +08:00
binaryify cc6551ca9a Merge pull request #1093 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.21
2021-01-18 17:04:04 +08:00
Renovate Bot f5640147e8 Update dependency @types/node to v14.14.21 2021-01-18 08:49:55 +00:00
binaryify 1a4127875c 修复未绑定手机号对歌单添加或删除歌曲无响应的问题 #1099 2021-01-18 11:33:03 +08:00
binaryify 73187162ac Merge pull request #1094 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.18.0
2021-01-18 11:25:58 +08:00
binaryify bd89b97aea Merge pull request #1100 from Lisianthus-A/master
Fix playlist_tracks
2021-01-18 11:25:44 +08:00
lisianthus-a 6512979e0e Fix playlist_tracks 2021-01-18 10:54:28 +08:00
Renovate Bot 0dad665b1f Update dependency eslint to v7.18.0 2021-01-15 23:58:18 +00:00
binaryify d94b9e0f9b update 2021-01-09 18:26:55 +08:00
binaryify 9430758db6 新增歌单详情动态接口 #1088 2021-01-09 18:25:23 +08:00
binaryify ffaa742298 修复文档描述错误 #1085 2021-01-08 11:00:43 +08:00
binaryify 52f074cad9 Merge pull request #1080 from Binaryify/renovate/eslint-plugin-prettier-3.x
Update dependency eslint-plugin-prettier to v3.3.1
2021-01-07 13:49:54 +08:00
binaryify 276607285e Merge pull request #1081 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.20
2021-01-07 13:49:40 +08:00
binaryify e67c2450e8 Merge pull request #1084 from Binaryify/dependabot/npm_and_yarn/axios-0.21.1
Bump axios from 0.20.0 to 0.21.1
2021-01-07 13:49:12 +08:00
dependabot[bot] 3cefae912c Bump axios from 0.20.0 to 0.21.1
Bumps [axios](https://github.com/axios/axios) from 0.20.0 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.20.0...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-01-06 09:28:58 +00:00
Renovate Bot e79d134050 Update dependency @types/node to v14.14.20 2021-01-04 22:53:56 +00:00
Renovate Bot ba9549f21f Update dependency eslint-plugin-prettier to v3.3.1 2021-01-04 20:16:15 +00:00
binaryify c32bf8b697 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2021-01-04 16:57:13 +08:00
binaryify db7fecde30 更新文档 2021-01-04 16:56:23 +08:00
binaryify de163b2ac9 Merge pull request #1074 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.19
2021-01-04 13:36:59 +08:00
binaryify 3acbf75f48 Merge pull request #1078 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.17.0
2021-01-04 13:36:48 +08:00
Renovate Bot a1a547df61 Update dependency eslint to v7.17.0 2021-01-03 14:45:53 +00:00
Renovate Bot 27f49b3fd1 Update dependency @types/node to v14.14.19 2021-01-03 14:45:24 +00:00
binaryify beefc04d20 update package-lock 2021-01-03 20:21:15 +08:00
binaryify a4259bca80 Merge branch 'dev' 2021-01-03 20:18:45 +08:00
binaryify 75cb79fc6a v4.0,新增云盘上传接口以及二维码登录相关接口和相关demo,升级部分接口加密方法 #70 , #121 ,#121 , #153 ,#248 , #705 , #716 , #745 , #1055 2021-01-03 20:17:26 +08:00
binaryify 77775b25f5 增加二维码登录 2020-12-31 15:26:18 +08:00
binaryify 43536b0220 Merge pull request #1018 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.16.0
2020-12-29 09:48:57 +08:00
Renovate Bot f0c4c12dcf Update dependency eslint to v7.16.0 2020-12-29 01:48:49 +00:00
binaryify bd9cda8aa1 Merge pull request #1022 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.16
2020-12-29 09:48:48 +08:00
Renovate Bot f56f7287c3 Update dependency @types/node to v14.14.16 2020-12-29 01:48:31 +00:00
binaryify d555637af4 Merge pull request #1033 from Binaryify/renovate/typescript-4.x
Update dependency typescript to v4.1.3
2020-12-29 09:48:18 +08:00
binaryify 4dcc03b32c Merge pull request #1045 from Binaryify/renovate/eslint-config-prettier-7.x
Update dependency eslint-config-prettier to v7
2020-12-29 09:47:43 +08:00
binaryify bffd9307b5 Merge pull request #1059 from Binaryify/renovate/actions-setup-node-2.x
Update actions/setup-node action to v2
2020-12-29 09:47:31 +08:00
binaryify bf50fa65eb 更新appver #1060 2020-12-20 17:41:49 +08:00
binaryify 8f59c6df5f 更新appver 2020-12-20 17:35:56 +08:00
Renovate Bot 90ca861673 Update dependency eslint-config-prettier to v7 2020-12-18 23:55:38 +00:00
Renovate Bot 51770c1a15 Update actions/setup-node action to v2 2020-12-16 10:10:43 +00:00
Renovate Bot d6ffd7ab7c Update dependency typescript to v4.1.3 2020-12-11 21:40:20 +00:00
binaryify 59b71410fe 修复收藏的专栏接口无法调用的问题 #1042 2020-12-03 13:38:24 +08:00
binaryify 4c5a1109fc 新增歌手详情接口 #1035 2020-11-22 21:06:33 +08:00
binaryify 6e1a5b9aae Merge pull request #1030 from YXL76/main
🐞fix: import config with ext
2020-11-18 11:00:23 +08:00
YXL 2acd96c226 🐞fix: import config with ext 2020-11-18 10:41:09 +08:00
binaryify a3be49850d update 2020-11-17 11:04:10 +08:00
binaryify d6e65ed33c 更新文档 2020-11-17 11:03:30 +08:00
binaryify 20309e44d1 新增关注歌手新歌/新MV接口 #1028 2020-11-15 20:44:01 +08:00
binaryify 65e9215d06 update 2020-11-15 11:36:35 +08:00
binaryify 40185476f2 修复使用post请求取消喜欢音乐会失败的问题 #1024, 新增抱一抱评论和评论抱一抱列表接口 #1016, 新增收藏的专栏接口 #1026 2020-11-14 21:23:22 +08:00
binaryify 99ec5bf065 添加抱一抱接口 2020-11-13 14:46:25 +08:00
binaryify 00b63cfa7a 修复使用post请求取消喜欢音乐会失败的问题 #1024 2020-11-13 10:50:28 +08:00
binaryify 4def4dcbaf 修复私信音乐接口出现风险提示的问题 #1016 2020-11-07 20:05:11 +08:00
binaryify 0e1c7eec3d 添加私信音乐接口 #1016,添加最近联系人接口,修复用户动态数量不准确问题 #1010,修复 cloudsearch 接口分页问题 #1015 2020-11-07 17:18:25 +08:00
binaryify 65e32eec77 相似歌手,首页-发现-圆形图标入口列表接口增加匿名token #877,#988,修复音乐 url接口POST方式手动传入cookie报错问题 #1005 2020-11-01 14:13:23 +08:00
binaryify f4a3a9cc72 Merge pull request #996 from Binaryify/renovate/lint-staged-10.x
Update dependency lint-staged to v10.5.0
2020-10-31 15:24:30 +08:00
binaryify f2c41cce0a Merge pull request #998 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.14.6
2020-10-31 15:24:17 +08:00
binaryify 41b2297047 Merge pull request #999 from Binaryify/renovate/typescript-4.x
Update dependency typescript to v4.0.5
2020-10-31 15:24:05 +08:00
binaryify b7cb44a574 Merge pull request #1003 from Binaryify/renovate/eslint-config-prettier-6.x
Update dependency eslint-config-prettier to v6.15.0
2020-10-31 15:23:36 +08:00
Renovate Bot 45f30169ea Update dependency @types/node to v14.14.6 2020-10-28 19:24:07 +00:00
Renovate Bot f59962d90a Update dependency eslint-config-prettier to v6.15.0 2020-10-27 17:23:02 +00:00
Renovate Bot d10089c549 Update dependency typescript to v4.0.5 2020-10-26 23:31:45 +00:00
Renovate Bot d5e7f0a0e5 Update dependency lint-staged to v10.5.0 2020-10-26 18:06:29 +00:00
binaryify b87874ae13 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2020-10-26 22:04:05 +08:00
binaryify 60005769a1 云贝完成任务接口增加depositCode参数 #995 2020-10-26 22:03:31 +08:00
binaryify 78511e0f06 更新文档 #994 2020-10-26 15:27:43 +08:00
binaryify 82a6fc53f4 Merge pull request #991 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.12.0
2020-10-26 13:46:38 +08:00
Renovate Bot 2e9866a2a6 Update dependency eslint to v7.12.0 2020-10-25 16:56:20 +00:00
binaryify 02cca66a22 update package-lock.json 2020-10-25 22:05:47 +08:00
binaryify 0256763f48 参数调整 2020-10-25 22:02:06 +08:00
binaryify e8f9a7539a 修复代理配置失效的问题 #992,修复新碟上架不返回周数据的问题,修复推荐新音乐接口返回数量问题,并添加limit参数支持 #981, 添加云贝相关接口 #985,添加用户账号信息接口,替换接口文件所有http url 为 https 2020-10-25 21:59:29 +08:00
binaryify 0ca29afda6 Merge pull request #974 from Binaryify/renovate/eslint-config-prettier-6.x
Update dependency eslint-config-prettier to v6.13.0
2020-10-17 18:20:26 +08:00
binaryify fd3f5d722e Merge pull request #975 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.11.10
2020-10-17 18:20:08 +08:00
binaryify 7df0d7a199 Merge pull request #976 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8.2.0
2020-10-17 18:19:49 +08:00
binaryify 9326d8c148 Update issue templates 2020-10-17 16:53:34 +08:00
binaryify ed2e5fa953 更新电台详情/电台节目详情接口 #977 2020-10-17 14:02:42 +08:00
Renovate Bot 3cac39f0b9 Update dependency mocha to v8.2.0 2020-10-16 21:15:53 +00:00
Renovate Bot 2f581d9960 Update dependency @types/node to v14.11.10 2020-10-16 20:19:21 +00:00
Renovate Bot 4ca88d7850 Update dependency eslint-config-prettier to v6.13.0 2020-10-16 15:18:14 +00:00
binaryify 6a77fba237 fix lint error 2020-10-16 17:17:26 +08:00
binaryify b59eaf492b 新增接口 #971 2020-10-16 16:13:07 +08:00
binaryify edf7077a47 Update issue templates 2020-10-14 11:05:33 +08:00
binaryify 7c0e3a1937 Update issue templates 2020-10-14 10:53:26 +08:00
binaryify 497bb61f99 Update issue templates 2020-10-14 10:43:57 +08:00
binaryify b69348b8c7 Merge pull request #968 from Binaryify/renovate/typescript-eslint-monorepo
Update typescript-eslint monorepo to v4.4.1
2020-10-13 09:48:42 +08:00
Renovate Bot 735367451c Update typescript-eslint monorepo to v4.4.1 2020-10-12 17:11:10 +00:00
binaryify 784ba807b3 Merge pull request #965 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.11.0
2020-10-10 15:32:08 +08:00
Renovate Bot 5ffb7af18a Update dependency eslint to v7.11.0 2020-10-09 20:45:01 +00:00
binaryify 8040aa3ac1 Merge pull request #964 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.11.8
2020-10-09 20:28:18 +08:00
Renovate Bot dcab50c4ca Update dependency @types/node to v14.11.8 2020-10-09 07:10:24 +00:00
binaryify 5236e06228 Merge pull request #963 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.11.7
2020-10-09 11:07:50 +08:00
Renovate Bot 6e40a1bdd6 Update dependency @types/node to v14.11.7 2020-10-08 21:16:44 +00:00
binaryify 232232ef5b Merge pull request #959 from Binaryify/renovate/typescript-eslint-monorepo
Update typescript-eslint monorepo to v4.4.0
2020-10-08 17:47:23 +08:00
binaryify aff3d8de3e 更新文档 2020-10-08 09:52:51 +08:00
binaryify 3f87e26aad 更新文档 2020-10-07 21:10:54 +08:00
binaryify 5f61cdfe4c 修复新评论接口分页参数问题 #962 2020-10-07 12:59:09 +08:00
Renovate Bot ecaf3a4eab Update typescript-eslint monorepo to v4.4.0 2020-10-06 15:56:08 +00:00
binaryify ac6bf92b64 移除冗余代码 2020-10-06 21:02:11 +08:00
binaryify f3a4684a9e Merge pull request #960 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.11.5
2020-10-06 20:59:19 +08:00
Renovate Bot c22196b7b8 Update dependency @types/node to v14.11.5 2020-10-06 05:59:49 +00:00
binaryify b913c4ba10 移除冗余代码 2020-10-05 22:42:49 +08:00
binaryify 39b4f80134 更新文档 #957 2020-10-05 20:03:12 +08:00
binaryify c6c888c4b6 修复新评论接口分页参数问题 #958 2020-10-05 18:48:30 +08:00
binaryify 7bb48bace0 更新歌单详情接口 2020-10-05 13:13:55 +08:00
binaryify 5adcc5a355 更新用户歌单参数 #955 2020-10-04 22:43:12 +08:00
binaryify e187c9a228 更新文档 2020-10-04 22:22:10 +08:00
binaryify 2e25211364 update README.MD 2020-10-04 22:19:20 +08:00
binaryify 38f468661b fixed lint error 2020-10-04 22:16:15 +08:00
binaryify 1d880bede7 新增用户绑定信息,用户绑定手机,新版评论,点赞过的视频,收藏视频到视频歌单,删除视频歌单里的视频,最近播放的视频,音乐日历等接口 创建歌单接口增加type参数,可创建视频歌单 #955 #946 2020-10-04 22:11:27 +08:00
binaryify a7019f5ca3 Merge branch 'master' into dev 2020-10-02 19:52:54 +08:00
binaryify 430111e532 Merge pull request #953 from Binaryify/renovate/typescript-4.x
chore(deps): update dependency typescript to v4.0.3
2020-10-02 17:09:48 +08:00
binaryify c59ee69504 修改文档错别字 2020-10-02 10:17:38 +08:00
Renovate Bot a58780460a chore(deps): update dependency typescript to v4.0.3 2020-10-02 02:16:03 +00:00
binaryify 8ad27ce358 Merge pull request #952 from YXL76/master
使用axios代替request
2020-10-02 10:15:00 +08:00
YXL f6319c8b6e fix login test error 2020-10-01 23:26:53 +08:00
YXL 57e5e0f5e5 test: use axios 2020-10-01 23:23:18 +08:00
YXL cea2024288 fix parameters error 2020-10-01 23:23:02 +08:00
YXL 8b529e55f0 fix key spell 2020-10-01 22:29:30 +08:00
YXL ab37ff328d use axios to replace request 2020-10-01 22:28:06 +08:00
binaryify 3b94c7aa63 增加用户相关接口 2020-09-30 17:33:48 +08:00
binaryify 123e137581 Merge pull request #951 from YXL76/master
合并类型声明
2020-09-30 16:58:31 +08:00
YXL c16fc13568 add MultiPageConfig 2020-09-30 16:09:11 +08:00
YXL 6ee7179cb9 use const enum 2020-09-30 15:51:26 +08:00
YXL bfafe19352 Use function overloading to provide stricter parameter restrictions 2020-09-30 14:59:52 +08:00
YXL 85ea2d8934 use enum replace union type 2020-09-30 14:44:49 +08:00
YXL 0183f41df5 combine all type declartion 2020-09-30 13:44:17 +08:00
binaryify 430c89cc48 Merge pull request #949 from Binaryify/renovate/typescript-eslint-monorepo
Update typescript-eslint monorepo to v4.3.0
2020-09-29 09:10:19 +08:00
Renovate Bot 6f0631a41a Update typescript-eslint monorepo to v4.3.0 2020-09-28 17:38:54 +00:00
binaryify 39fd1fed03 Merge pull request #947 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.10.0
2020-09-27 07:51:46 +08:00
Renovate Bot 3e8e3cc392 Update dependency eslint to v7.10.0 2020-09-26 22:20:12 +00:00
binaryify 0a7815fcb7 Merge pull request #945 from Binaryify/renovate/eslint-config-prettier-6.x
Update dependency eslint-config-prettier to v6.12.0
2020-09-26 07:38:08 +08:00
Renovate Bot d7a740ae10 Update dependency eslint-config-prettier to v6.12.0 2020-09-25 18:48:37 +00:00
binaryify 4f90957090 Merge pull request #941 from Binaryify/renovate/node-14.x
Update dependency @types/node to v14.11.2
2020-09-22 22:47:33 +08:00
Renovate Bot 785bc9fa98 Update dependency @types/node to v14.11.2 2020-09-22 00:30:44 +00:00
binaryify d09c19c64f 更新获取音乐 url接口,未登录状态返回试听片段 #897 2020-09-20 10:25:55 +08:00
binaryify 372a81fb6e 电台个性推荐接口 #824 2020-09-19 22:53:08 +08:00
binaryify b935a55356 完善单元测试 2020-09-19 19:39:11 +08:00
binaryify a42decd00f 完善单元测试 2020-09-19 18:57:28 +08:00
binaryify 5baa1b2560 fix lint error 2020-09-19 18:48:23 +08:00
binaryify 50a1cb367b 新增精品歌单标签列表接口 #921, 新增用户等级信息接口 #929,增加新接口的 d.ts 文件,修复登录接口的 d.ts 的 countrycode 为非可选属性的错误 2020-09-19 18:43:52 +08:00
binaryify cb4c07f421 Merge pull request #935 from Binaryify/renovate/lint-staged-10.x
Update dependency lint-staged to v10.4.0
2020-09-19 16:18:29 +08:00
binaryify 8e35eee3b1 Merge pull request #934 from Binaryify/renovate/prettier-2.x
Update dependency prettier to v2.1.2
2020-09-19 16:18:20 +08:00
binaryify 4e4adf1a5c Merge pull request #931 from Binaryify/renovate/typescript-eslint-monorepo
Update typescript-eslint monorepo to v4.1.1
2020-09-19 16:18:03 +08:00
Renovate Bot a3fff1531b Update dependency lint-staged to v10.4.0 2020-09-16 13:30:03 +00:00
Renovate Bot 99a9813d70 Update dependency prettier to v2.1.2 2020-09-16 01:18:55 +00:00
binaryify cbb1fdc152 Merge pull request #930 from greenhat616/patch-1
修复与 types 文件表现不一致问题
2020-09-15 09:46:59 +08:00
Renovate Bot 0781285b62 Update typescript-eslint monorepo to v4.1.1 2020-09-14 17:26:37 +00:00
Jonson Petard 3383783f3c 修复与 types 文件表现不一致问题 2020-09-14 21:11:00 +08:00
binaryify 6dfba91da8 update package.json 2020-09-13 13:37:31 +08:00
binaryify f725c86519 update package.json 2020-09-13 13:27:38 +08:00
binaryify 2dc8c1979f Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2020-09-13 13:17:47 +08:00
binaryify 004f4846ab 更新 TypeScript 声明 #928 2020-09-13 13:15:02 +08:00
binaryify 434326012c Merge pull request #928 from YXL76/master
更新 TypeScript 声明
2020-09-13 13:13:51 +08:00
YXL bfece83217 修复参数名和删除多余参数 2020-09-13 13:01:50 +08:00
YXL 92612bc4fe 将提供默认值的参数改为可选 2020-09-13 12:57:33 +08:00
YXL 19f71cfd62 统一id, limit, offset的类型为string | number 2020-09-13 12:56:47 +08:00
binaryify 5fd859f4d0 Merge pull request #927 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.9.0
2020-09-13 08:27:46 +08:00
Renovate Bot ac88b05e6e Update dependency eslint to v7.9.0 2020-09-12 19:17:36 +00:00
binaryify 8f701d722f 代码格式化 2020-09-12 15:29:34 +08:00
binaryify d4dc1f247a 更新文档 2020-09-12 15:23:31 +08:00
binaryify fee4eb7072 TypeScript 声明文件 #908, 更改随机 UA 相关逻辑 #922 2020-09-12 13:34:45 +08:00
binaryify 0fced69244 Merge pull request #924 from Binaryify/renovate/pin-dependencies
Pin dependencies
2020-09-12 10:36:00 +08:00
Renovate Bot fc719aed64 Pin dependencies 2020-09-12 02:34:45 +00:00
binaryify 3b15fe9024 修复代码错误 2020-09-12 10:23:21 +08:00
binaryify 4f7266e4a5 代码格式化 2020-09-12 10:20:25 +08:00
binaryify 0ae2628fb6 修复 github action 错误 2020-09-12 09:49:58 +08:00
binaryify b58bc739bf update package-lock.json 2020-09-12 09:44:12 +08:00
binaryify 346593e0c3 Merge pull request #922 from makeding/huggy_edit
更新 UA 列表,更改随机 UA 相关逻辑
2020-09-12 09:39:29 +08:00
binaryify 36cb5f3705 remove lock file 2020-09-12 09:34:32 +08:00
binaryify 606278a9be Merge pull request #919 from greenhat616/build-github-action
build: support github actions
2020-09-12 09:21:49 +08:00
binaryify 74996163cb Merge pull request #908 from greenhat616/master
feat: typescript module declaration, part 1
2020-09-12 09:14:02 +08:00
huggy 44e0ac4182 Linux 的 UA 改回原来的版本
在 Deepin 下测试 1.2.0(0408)
UA 是 Chrome 60 ,并不会跟着系统版本更新。
2020-09-11 17:03:04 +08:00
huggy 1e4a90f19a chooseUserAgent function -> const
因为函数重构了 直接用 function 了 没有注意到其它函数是变量形式的
2020-09-11 10:50:16 +08:00
huggy e933997d26 又优化了下 UA 逻辑 现在两行就 ok 了
https://github.com/Binaryify/NeteaseCloudMusicApi/pull/922
2020-09-11 10:24:52 +08:00
huggy c05c83db14 readme 修改成 https 克隆(不用登录 修改 /public 几个测试网页
去掉了 http://localhost:port/
public 里面的网页 lang 都改成 zh 了
2020-09-11 00:32:21 +08:00
huggy 9ee30f363a 修改了下 UA 相关逻辑 .gitignore 弄得好看了点 2020-09-11 00:17:05 +08:00
huggy 4afb471d33 更改了下 UA 2020-09-10 23:54:22 +08:00
a632079 4e074b1061 fix: correct ci file path 2020-09-07 20:59:43 +08:00
a632079 bc71f537ad test: use env variable variables in login.test.js 2020-09-07 20:55:04 +08:00
a632079 9aed821057 build: support github actions 2020-09-07 20:42:26 +08:00
a632079 c831af12cd fix: module exports wrong in types declartion 2020-09-07 20:27:17 +08:00
a632079 b806741905 fix: exclude types ignore in pkg file 2020-09-05 18:59:58 +08:00
a632079 132fcd9a45 Merge branch 'master' of https://github.com/Binaryify/NeteaseCloudMusicApi 2020-09-05 18:56:24 +08:00
a632079 f711b074cf fix(ts): correct declaration upon uploaded img api 2020-09-05 18:55:07 +08:00
binaryify da7a535cc6 更新nodejs调用头像上传例子 2020-09-05 17:30:41 +08:00
a632079 c6312abbad feat: ts support 2020-09-05 16:31:13 +08:00
a632079 139e9a1a39 feat: ts support, all declaration 2020-09-05 15:54:03 +08:00
a632079 40f8c7601c chore: resolve conflict 2020-09-05 01:21:12 +08:00
a632079 2a04853948 feat: ts support, full creation 2020-09-05 01:18:30 +08:00
a632079 585592faa9 feat: ts support, artist part 2020-09-05 00:10:15 +08:00
binaryify 5fc7b5999d Merge pull request #911 from Binaryify/renovate/lint-staged-10.x
Update dependency lint-staged to v10.3.0
2020-09-03 22:16:32 +08:00
Renovate Bot ef17617085 Update dependency lint-staged to v10.3.0 2020-09-03 08:17:51 +00:00
a632079 f89bd19899 feat: ts support, album part 2020-09-03 13:32:52 +08:00
a632079 0dacfa0a50 build: add .editorconfig 2020-09-03 09:21:35 +08:00
a632079 ca4ed2a98f build: adding Prettier to the mix 2020-09-03 09:03:20 +08:00
a632079 44beef4098 dev: suppoprt typescript 2020-09-03 08:57:21 +08:00
binaryify 2da9552c5b Merge pull request #907 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.8.1
2020-09-02 10:55:44 +08:00
Renovate Bot 3015bb67b8 Update dependency eslint to v7.8.1 2020-09-01 20:15:26 +00:00
binaryify ebbefa0e94 Merge pull request #906 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.8.0
2020-09-01 15:33:06 +08:00
Renovate Bot 9782c2dfd5 Update dependency eslint to v7.8.0 2020-08-31 22:06:56 +00:00
binaryify 2b074ad9e0 更新文档 2020-08-31 22:16:31 +08:00
binaryify e8cabc94c7 Merge pull request #903 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8.1.3
2020-08-29 08:48:08 +08:00
Renovate Bot f6ab753c70 Update dependency mocha to v8.1.3 2020-08-28 21:03:14 +00:00
binaryify 12bf3cd5fb Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2020-08-23 19:52:57 +08:00
binaryify 047c3bb0bc 新增cloudsearch接口 #893, mv 地址接口修改分辨率参数 #883, 修复新碟上架接口分页问题 #892 2020-08-23 19:52:41 +08:00
binaryify 9351387787 Merge pull request #894 from Binaryify/renovate/axios-0.x
Update dependency axios to ^0.20.0
2020-08-21 21:43:20 +08:00
Renovate Bot a91eb405bc Update dependency axios to ^0.20.0 2020-08-21 03:22:36 +00:00
binaryify 9b066470ba 更新文档 #887 2020-08-18 14:42:48 +08:00
binaryify 0de21f3c73 Merge pull request #881 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7.7.0
2020-08-15 09:32:54 +08:00
Renovate Bot 31c24a287f Update dependency eslint to v7.7.0 2020-08-14 22:19:05 +00:00
binaryify caeb1d266d Merge pull request #875 from Binaryify/renovate/mocha-8.x
Update dependency mocha to v8
2020-08-09 19:46:25 +08:00
Renovate Bot aa528b6cb3 Update dependency mocha to v8 2020-08-09 11:46:03 +00:00
binaryify ef4fa6e124 Merge pull request #874 from Binaryify/renovate/lint-staged-10.x
Update dependency lint-staged to v10
2020-08-09 19:44:51 +08:00
Renovate Bot 5077b36f47 Update dependency lint-staged to v10 2020-08-09 11:43:52 +00:00
binaryify f510aa552b Merge pull request #873 from Binaryify/renovate/husky-4.x
Update dependency husky to v4
2020-08-09 18:38:04 +08:00
binaryify b061667558 Merge pull request #872 from Binaryify/renovate/eslint-7.x
Update dependency eslint to v7
2020-08-09 18:37:50 +08:00
binaryify 9d22d446fd 更新项目配置 2020-08-09 18:37:10 +08:00
Renovate Bot 88318a69a1 Update dependency husky to v4 2020-08-09 10:35:57 +00:00
Renovate Bot 39305c0228 Update dependency eslint to v7 2020-08-09 10:35:50 +00:00
binaryify e830f3dc42 Merge pull request #871 from Binaryify/renovate/pac-proxy-agent-4.x
Update dependency pac-proxy-agent to v4
2020-08-09 17:52:13 +08:00
binaryify 89a106b5b5 Merge pull request #870 from Binaryify/renovate/pin-dependencies
Pin dependencies
2020-08-09 17:52:01 +08:00
Renovate Bot 644ffcd069 Update dependency pac-proxy-agent to v4 2020-08-09 09:51:32 +00:00
Renovate Bot f96fd3e3c2 Pin dependencies 2020-08-09 09:51:26 +00:00
binaryify 025bfc338a 合并拉取#869二进制化/翻新/配置
Configure Renovate
2020-08-09 17:51:04 +08:00
Renovate Bot 362e10751f Add renovate.json 2020-08-09 09:49:41 +00:00
binaryify 324cd8b67e 新增歌曲楼层评论,歌手全部歌曲接口 #864, #867, 支持收藏VIP或付费歌曲到歌单 #860, 支持手动传入realIP #863 2020-08-09 17:37:55 +08:00
binaryify 9063c7dfc5 Merge pull request #863 from greenhat616/master
feat: optional realIP
2020-08-08 16:20:13 +08:00
a632079 3c638e5f0a feat: optional data in weblog api 2020-08-05 02:09:13 +08:00
a632079 9bd30a0ffb feat: realIP option 2020-08-05 02:07:37 +08:00
binaryify 31d7e3941e v3.37.2 2020-08-04 14:14:39 +08:00
binaryify 0d06fed76b Merge pull request #862 from Knove/master
fix: 修复上传 npm 丢失 plugins 文件夹
2020-08-04 14:12:42 +08:00
binaryify acb49acab8 修复依赖问题 2020-08-04 09:59:41 +08:00
Knove 0ae3e159c6 fix: 修复上传 npm 丢失 plugins 文件夹 2020-08-04 01:16:15 +08:00
binaryify 8e49998a47 更新文档 2020-08-03 23:16:22 +08:00
binaryify 726f21b1e2 update 2020-08-03 23:12:20 +08:00
binaryify 8df5d7a790 新增更新头像,歌单封面上传接口和相关例子 #403 #857 2020-08-03 23:09:36 +08:00
binaryify 0ad746dad4 新增全部新碟,数字专辑-新碟上架,数字专辑&数字单曲-榜单,数字专辑-语种风格馆,数字专辑详情接口,更新新碟上架接口,修改传入参数,返回数据结构有变化 2020-07-26 16:45:56 +08:00
binaryify feefa9fc47 更新文档 2020-07-19 09:47:14 +08:00
binaryify a38d314ee0 增加首页-发现和首页-发现-圆形图标入口列表接口 2020-07-18 21:27:24 +08:00
binaryify 1c88464f1d Merge pull request #851 from hcanyz/master
新增移动端 首页发现页 接口
2020-07-18 20:11:29 +08:00
yan.kong b992f1138e feat(*): 新增 移动端首页发现页 dragon ball 2020-07-16 17:07:28 +08:00
yan.kong 39d4b2614e feat(*): 新增 移动端首页发现页 block page 2020-07-16 17:06:50 +08:00
binaryify 76cea02b23 修复获取用户播放记录接口参数错误问题 增加国家编码列表接口 2020-07-13 21:14:42 +08:00
binaryify 9a25400234 Merge pull request #841 from hcanyz/master
新增 国家编码列表
2020-07-13 20:52:46 +08:00
binaryify a0abeed224 Merge pull request #849 from YXL76/master
🐞fix(user_record): fix type always be 1
2020-07-13 20:50:55 +08:00
YXL 59368bd67a 🐞fix(user_record): fix type always be 1 2020-07-13 20:30:48 +08:00
binaryify eda6869873 更新文档 2020-07-10 14:21:35 +08:00
yan.kong 8a40f5bdf7 feat(*): 新增 国家代码列表
https://github.com/hcanyz/flutter-netease-music-api/commit/24eda4c89a87b5b7025c4d13e7e2e3fb88f036e8
2020-07-08 10:49:44 +08:00
binaryify f6a051b851 登录接口增加 md5_password 参数 #839 2020-07-06 14:06:47 +08:00
binaryify 27773a6d5a 更新文档 2020-07-06 11:39:06 +08:00
binaryify 25e9206efb 更新test.html 2020-07-03 11:52:27 +08:00
binaryify 91d997c6c6 Merge pull request #832 from YXL76/master
补充和更正注释
2020-06-27 11:02:24 +08:00
YXL 66e37b4449 更正注释 2020-06-26 15:49:30 +08:00
YXL fa535cdf37 补充注释 2020-06-26 15:49:23 +08:00
binaryify 885d1930f2 排行榜接口废弃idx参数,只支持id参数,修复返回数据异常问题 #830 ,新增获取历史日推可用日期列表,获取历史日推详细数据接口 2020-06-25 17:55:27 +08:00
binaryify 06013ed4d0 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2020-06-23 14:48:07 +08:00
binaryify afd468ca18 更新每日推荐接口 #826 2020-06-23 14:47:43 +08:00
binaryify 0ec6716a4c Merge pull request #827 from omnip620/master
docs: correct limit description
2020-06-21 15:53:26 +08:00
omnip 7c110e8234 docs: correct limit description 2020-06-20 06:55:39 -04:00
binaryify eb77b0474e 修复直接调用时传入 cookie 不生效的问题 #822 2020-06-15 12:49:10 +08:00
binaryify ab89083fae 更新文档 2020-06-13 22:01:09 +08:00
binaryify 494a33c385 #816, #817, #818 2020-06-10 23:21:26 +08:00
binaryify 20cba0aa15 修复 Nodejs 下 cookie 使用格式问题 #812 2020-06-07 15:34:54 +08:00
binaryify 1a362242d4 新增独家放送列表接口 2020-06-05 11:44:15 +08:00
binaryify b7f8d9d3ff 新增歌曲排序接口 2020-06-03 21:35:27 +08:00
binaryify f420959df5 v3.32.0 2020-06-03 21:17:14 +08:00
binaryify 56168e1745 更新文档 2020-05-26 11:18:04 +08:00
binaryify 251e14bdd5 修复cookie没返回的问题 #778 2020-05-19 15:39:03 +08:00
binaryify ceb99119d0 Merge pull request #777 from poppinlp/optimize-package
chore: optimize the publishing package for npm
2020-05-18 16:08:20 +08:00
PoppinL c6f0c2e5a0 chore: optimize the publishing package for npm 2020-05-18 15:34:45 +08:00
binaryify ff8d57a34a 支持nodejs调用 #773 2020-05-18 15:09:39 +08:00
binaryify e9fe4351b4 登录接口返回内容增加cookie字段,支持手动传入cookie 2020-05-17 20:21:03 +08:00
binaryify 96d0898ca1 调整通知接口分页参数 #761 2020-05-13 18:43:37 +08:00
binaryify 2cb2ed9458 支持批量删除歌单 #760 2020-05-11 16:28:36 +08:00
binaryify 148afed858 新增mv/视频点赞转发评论数数据接口 #720 #748 2020-05-05 17:43:42 +08:00
binaryify f410bbad73 更新文档 2020-04-26 11:00:20 +08:00
binaryify a6c49d9cec 更新文档 2020-04-20 17:31:26 +08:00
binaryify 4a0645d92e 新增购买专辑接口 #740 2020-04-20 14:12:00 +08:00
binaryify e5caf7a418 Merge pull request #740 from TimonPeng/master
新增购买专辑接口
2020-04-20 14:05:23 +08:00
TimonPeng c3d2817c56 修改购买专辑接口地址 2020-04-18 12:26:43 +08:00
TimonPeng 402cf0fbf2 新增购买专辑接口 2020-04-18 12:23:32 +08:00
binaryify 0beb4e746f 更新文档 2020-04-15 14:17:47 +08:00
binaryify d6600472b2 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2020-04-08 18:33:35 +08:00
binaryify a77736cb63 v3.26.0, 更新歌手分类列表接口参数 2020-04-08 18:33:01 +08:00
binaryify da01569d99 更新模板和文档 2020-04-04 13:56:16 +08:00
binaryify 5e6e430687 improve 2020-04-04 13:21:54 +08:00
binaryify ec3fac99e0 更新issues模板 2020-03-19 10:57:14 +08:00
binaryify 960c65e044 更新文档 2020-03-18 16:59:39 +08:00
binaryify 11e6bcbd1c 更新接口和文档 2020-03-18 16:57:43 +08:00
binaryify efa2d416b3 更新文档 2020-01-15 11:08:44 +08:00
binaryify 9443bb2562 去除多余代码 2019-11-10 11:47:03 +08:00
binaryify 06e522b684 升级依赖,去除多余依赖 #635 优化test.html 2019-11-08 14:11:11 +08:00
binaryify af85273466 更改版本号 2019-11-07 14:08:11 +08:00
binaryify 40931b30c1 优化 2019-11-07 14:07:26 +08:00
binaryify abf7bc4ec5 修复邮箱登录状态码错误,增加相关提示 #633 2019-11-07 14:05:37 +08:00
binaryify f254aa2b85 v3.25.0 新增云村热评,歌手热门50首歌曲,电台24小时节目榜,电台24小时主播榜,电台最热主播榜,电台主播新人榜,电台付费精品榜接口,调整歌手分类列表接口 #626 #606 #624 2019-11-06 17:54:19 +08:00
binaryify 1818a4ceb9 update docs 2019-10-31 09:37:07 +08:00
binaryify 5951985e4c 修改默认绑定 HOST #620 2019-10-28 11:17:38 +08:00
binaryify 641a72b06c #615 2019-10-25 14:58:34 +08:00
binaryify 8bde78595b Merge pull request #613 from 52871299hzy/master
Added customizable host.
2019-10-23 22:52:35 +08:00
Bob 9bf9ddd199 Added customizable host.
Use 'HOST=0.0.0.0 node app.js' to listen on all ip's.
2019-10-23 20:05:07 +08:00
binaryify c0ff65b8d4 新增类别热门电台接口 #607 2019-10-22 16:47:02 +08:00
binaryify 6d96d1065b 更新文档 #607 2019-10-21 14:03:19 +08:00
binaryify 308f250d6c 更新文档 2019-10-16 16:34:37 +08:00
binaryify b9f02d6b30 修复电台 banner 接口无数据问题 #601,更新排行榜 #602,新增电台排行榜,新晋电台榜,热门电台榜接口 #604 2019-10-16 15:02:05 +08:00
binaryify c0e4b39938 修复私信历史记录分页参数问题,更新文档 #599 2019-09-26 10:11:21 +08:00
binaryify 058e7b9a35 手机号码检测: 添加国家码作为参数,方便检测国外手机号码 #598 2019-09-24 10:11:00 +08:00
binaryify 28ad57896b Merge pull request #598 from boyan01/master
add countrycode for cellphone check
2019-09-24 10:09:39 +08:00
boyan 521b98ea46 add countrycode for cellphone check 2019-09-24 10:04:29 +08:00
binaryify 2134432750 更新推荐歌单文档参数#594 2019-09-19 10:36:46 +08:00
binaryify 7a7001b386 排行榜参数更新,更新文档 #592 2019-09-18 10:48:35 +08:00
binaryify 932246e501 Merge pull request #573 from gengjiawen/patch-1
use Official lts-alpine
2019-09-18 09:53:51 +08:00
binaryify 254426fa0c v3.22.1 支持回复评论 #589 2019-09-12 10:35:03 +08:00
binaryify 8b36cdece5 Merge pull request #589 from jsososo/master
回复评论
2019-09-12 10:13:00 +08:00
jsososo b1ebbf51be 回复评论 2019-09-11 19:38:04 +08:00
binaryify 98bb292872 支持 CORS 预检 #564 #578 2019-08-25 17:03:57 +08:00
binaryify f848a00a80 Merge pull request #578 from nondanee/patch
支持 CORS 预检
2019-08-25 16:29:26 +08:00
Nzix 52a4dd541f fit for preflight request 2019-08-25 12:50:31 +08:00
binaryify dbd1d7ab02 移除无效参数 2019-08-21 22:47:15 +08:00
binaryify 936f66d887 修复推荐歌单和网易出品mv参数错误,更新文档 fixed #571 #572 2019-08-21 22:26:41 +08:00
binaryify 92a194acf2 Merge pull request #574 from gengjiawen/patch-2
use latest Node for CI
2019-08-21 22:16:47 +08:00
Jiawen Geng eb2991f40f use latest Node for CI 2019-08-21 22:01:29 +08:00
Jiawen Geng 16f984db1e use Official lts-alpine 2019-08-21 21:57:40 +08:00
binaryify 83b6bfcd1e 更新文档,更新eslint 2019-08-20 23:07:01 +08:00
binaryify aed229e212 新增删除歌单接口 #570 2019-08-20 21:50:12 +08:00
binaryify f67f2b4924 修复文档错误 #569 2019-08-20 21:13:28 +08:00
binaryify 5b9bfd7205 fixed url error 2019-08-20 16:03:56 +08:00
binaryify 83e572f362 修复文档错误 #566 2019-08-20 15:55:30 +08:00
binaryify 83ebe6d25b improve eslint 2019-08-16 21:49:21 +08:00
binaryify b98d611989 add eslint 2019-08-16 10:57:31 +08:00
binaryify 629533e674 update docs 2019-08-06 23:04:42 +08:00
binaryify 5a5aa39af2 新增更新歌单描述,更新歌单名,更新歌单标签,默认搜索关键词接口,更新文档 #547 2019-08-06 11:24:13 +08:00
binaryify a24ced1098 更新文档 2019-08-06 11:21:25 +08:00
binaryify 974640550e Merge pull request #547 from kurodaakira-jp/master
默认搜索关键词、单独的歌单名,描述,标签更新
2019-07-31 14:22:15 +08:00
kurodaakira-jp 5fa415635f 默认搜索关键词、单独的歌单名,描述,标签更新 2019-07-30 17:34:34 +08:00
binaryify 42ef2d1052 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2019-07-28 20:33:46 +08:00
binaryify d23158ac4c 更新文档 #545 2019-07-28 20:33:24 +08:00
binaryify 74650ea7b9 新增 检测手机号码是否已注册 和 初始化昵称 接口 #540 2019-07-24 16:15:22 +08:00
binaryify 4223c07a70 Merge pull request #540 from kurodaakira-jp/master
验证手机是否注册、验证用户名是否注册
2019-07-23 22:29:52 +08:00
kurodaakira-jp ffbb13313e 验证手机是否注册、验证用户名是否注册 2019-07-23 17:49:55 +08:00
binaryify 0d4d8cebe0 修复注册异常的问题 #532 2019-07-15 10:51:19 +08:00
binaryify 70cce6b9a5 hot fix 2019-07-14 12:17:59 +08:00
binaryify 07c4ae8736 修复部分歌曲无法获得播放链接的问题 #531 2019-07-14 11:03:25 +08:00
binaryify cfa939bb84 修复全部 mv接口分页参数错误的问题#524 2019-07-04 15:58:45 +08:00
binaryify d37906ec14 修复听歌打卡接口 /scrobble 失效问题 #522 2019-07-03 22:33:32 +08:00
binaryify ec1400171e v3.18.1评论接口增加 before 参数以获取超过5000条评论数据 #521 修复 /msg/comments 传入参数和文档描述不一致问题 2019-06-30 22:31:18 +08:00
binaryify 6bc08d95e4 v3.18.0 新增 更换绑定手机接口 #518 2019-06-29 16:24:50 +08:00
binaryify a6b072ab39 v3.17.0 新增 专辑动态信息 热搜列表(详细) 接口,更新文档 #517 #519 2019-06-29 14:39:56 +08:00
binaryify 90cdaa2fa4 新增 接口#515, 调整歌曲评论接口使用客户端版本接口#513 2019-06-27 10:10:04 +08:00
binaryify cb494c444d 更新文档 2019-06-19 14:48:11 +08:00
binaryify 771f249a70 v3.15.0 新增获取视频标签列表,网易出品,全部mv接口, 最新 mv 和 mv 排行 接口加入地区参 数,更新文档 #505 2019-06-16 22:08:04 +08:00
binaryify 356d5e2c46 获取用户粉丝列表接口修改请求参数,更新文档 #504 2019-06-10 16:17:17 +08:00
binaryify b20e9d7733 修复获取用户粉丝列表接口只能获取1000个的问题 2019-06-09 19:08:25 +08:00
binaryify 6932995fc3 improve 2019-05-19 12:15:06 +08:00
binaryify f85b8f70cf v3.13.0 2019-05-19 12:14:05 +08:00
binaryify 0ae76b6abd Merge branch 'test' into dev 2019-05-19 11:25:27 +08:00
binaryify 1bc8e5360a Merge branch 'master' into test 2019-05-19 11:22:40 +08:00
binaryify 1391dd6abd 更新文档,用户动态增加分页参数 2019-05-19 11:22:36 +08:00
阿发 cfcadb3ce0 Merge pull request #491 from lizhenyuls/master
新增eapi算法
2019-05-16 23:23:33 +08:00
lizhenyuls 99e60a5fc4 新增eapi算法 2019-05-16 23:01:27 +08:00
binaryify 4163cbbe3d 更新文档 2019-05-15 18:10:23 +08:00
binaryify dabcd3a097 更新文档 2019-05-14 10:15:32 +08:00
binaryify 462fa33cbf improve 2019-05-11 10:45:11 +08:00
binaryify a84c87f748 improve 2019-05-11 10:40:46 +08:00
binaryify 314c7a5796 ad 2019-05-11 10:32:17 +08:00
binaryify e7df5cd70a v3.12.0 2019-05-10 16:05:09 +08:00
binaryify 57f903fd3d 更新依赖 2019-05-10 14:11:01 +08:00
binaryify f7a1f8d429 更新 issues 模板 2019-05-10 09:46:18 +08:00
binaryify 0d7b8ec41e 更新 issues 模板 2019-05-10 09:44:41 +08:00
binaryify 46400d930f v3.11.0 增加接口 2019-05-09 16:26:41 +08:00
binaryify d42c8b42c5 v3.10.2 分享歌曲、歌单、mv、电台、电台节目到动态 2019-05-09 11:52:12 +08:00
binaryify bf40e9c080 Merge branch 'master' into test 2019-05-09 11:01:28 +08:00
binaryify d670a4523d add share_friend 2019-05-08 23:13:29 +08:00
binaryify f73130f5af v3.10.1增加删除动态接口 2019-05-08 14:46:30 +08:00
binaryify 634a8a856b v3.10.0 增加转发动态接口 2019-05-08 12:03:11 +08:00
阿发 26b5cad8d5 Merge pull request #484 from HIjack2015/jk-branch
Jk branch
2019-05-07 22:57:02 +08:00
jiakang becd7ed77b 增加转发动态接口 2019-05-07 21:51:15 +08:00
jiakang 0e8fa1b978 增加转发动态接口 2019-05-07 21:47:21 +08:00
binaryify 34c92ddece 更新文档 2019-05-06 17:04:52 +08:00
binaryify d6ca1b5a79 update README.MD 2019-05-04 09:59:09 +08:00
binaryify d8969652f9 update README.MD 2019-05-04 09:58:24 +08:00
binaryify c8d456add7 v3.9.0 新增 云盘歌曲删除, 热门话题, 电台 - 推荐类型, 电台 - 非热门类型, 电台 - 今日优选, 心动模式/智能播放等接口 2019-05-03 23:44:06 +08:00
binaryify 9e1c701a6f 更新文档 2019-04-29 15:51:56 +08:00
binaryify a260e3b352 修复歌词接口出错问题 2019-04-24 19:29:48 +08:00
binaryify ded6dc74a7 update CHANGELOG 2019-04-16 17:51:07 +08:00
binaryify 36bef95b2a Merge branch 'test' 2019-04-14 18:17:41 +08:00
binaryify c79717794c 增加注册,发送验证码,校验验证码接口 via:#460 2019-04-14 18:15:38 +08:00
阿发 b8852fe66f Update issue_template.md 2019-04-12 14:02:19 +08:00
阿发 6a407a2df8 Merge pull request #460 from KongValley/master
添加手机注册相关接口
2019-04-09 16:14:36 +08:00
binaryify af8355f609 修复登录460问题 #459 2019-04-09 16:08:41 +08:00
KongValley 74c19ecd08 修改注释 2019-04-09 15:44:35 +08:00
KongValley 2dce97d800 添加手机号注册,检验验证码,校验用户名接口 2019-04-09 15:41:02 +08:00
binaryify 4555c12959 修复喜欢音乐接口参数判断问题 #453,增加歌单收藏者列表接口#452,更新文档 2019-03-20 14:15:35 +08:00
binaryify 9bd91df86c 修复文档显示错误 2019-03-18 14:59:40 +08:00
binaryify d225437271 v3.6.0 调整动态评论获取接口 url,使之和其他评论获取接口更统一 2019-03-15 15:12:46 +08:00
binaryify a61c1250fc v3.5.0 增加获取动态评论接口,增加点赞和评论对动态的支持 2019-03-14 16:03:56 +08:00
binaryify bcfdbe4406 增加已收藏专辑列表接口 #372 2019-01-29 16:41:55 +08:00
binaryify d7406a1b05 增加视频标签下的视频获取接口,增加 pac 代理支持,v3.3.0 #432 #434 2019-01-28 00:03:32 +08:00
binaryify 2311b90743 Merge pull request #432 from trazyn/master
Add pac proxy support
2019-01-27 23:11:44 +08:00
binaryify 2de499095b Merge pull request #434 from v6v/master
增加视频标签下的视频获取
2019-01-27 23:11:30 +08:00
trazyn 903c2de7ca Log in foreign phone 2019-01-24 21:13:40 +08:00
v6v def8a6b8d3 fix 2019-01-21 17:50:54 +08:00
Liu Enze c453c1dc95 增加videogroup的获取 2019-01-21 14:13:03 +08:00
trazyn 87dbf1d35e Add pac proxy support 2019-01-19 19:21:51 +08:00
binaryify 41b3f7e893 update README.MD 2019-01-19 19:10:36 +08:00
binaryify 901bde6630 增加获取首页新碟上架数据以及更新听歌排行 #431,更新搜索建议接口 #416 2019-01-19 18:59:55 +08:00
binaryify 49b3b46c7a Merge pull request #416 from BySyang/master
更新 搜索建议 接口
2019-01-19 18:53:47 +08:00
binaryify 67031a0b98 Merge pull request #431 from trazyn/master
获取首页新碟上架数据以及更新听歌排行
2019-01-19 18:49:21 +08:00
trazyn 3bf65d8233 Update docs 2019-01-19 16:48:00 +08:00
trazyn 333efd4040 Newest albums 2019-01-17 17:21:59 +08:00
trazyn 60642de76c Scrobble song 2019-01-17 17:21:46 +08:00
binaryify 09b66934b6 更新文档 2019-01-11 13:48:25 +08:00
binaryify 7a63614c2f 新增已收藏MV接口,更新文档 修复评论接口返回 460 Cheating 的问题 2019-01-06 17:54:00 +08:00
binaryify f9c85c0893 Merge pull request #418 from Birjemin/master
增加已收藏MV接口
2019-01-05 18:01:33 +08:00
birjemin 69ec96413f 修改注释:已收藏MV列表 2019-01-05 10:38:02 +08:00
birjemin f8d4024b1f 增加已收藏MV 接口 2019-01-05 00:08:19 +08:00
Birjemin Master 00844f9860 Merge pull request #1 from Binaryify/master
update from origin
2019-01-03 18:22:58 +08:00
BySyang 15d680745b 更新 搜索建议 接口 2019-01-03 15:15:53 +08:00
binaryify c8ccadd0bd 更新文档 2019-01-03 10:14:37 +08:00
binaryify a441808012 update docs 2018-12-21 10:43:05 +08:00
binaryify b15ff33bd2 修复关注异常的问题 #399 2018-12-15 14:14:58 +08:00
binaryify 813e0a45b2 优化电台节目接口,更新文档 #386 #394 2018-12-12 14:31:46 +08:00
binaryify abba859bdf 修复歌单详情列表,排行榜,所有榜单失效的问题,更新文档 #380 #381 2018-11-22 14:35:25 +08:00
binaryify 0dd6c4a49a 修复歌单详情列表失效的问题 #380 #381 2018-11-21 17:06:17 +08:00
binaryify f3eb7df160 修复歌单详情列表失效的问题 #380 #381 2018-11-21 11:28:00 +08:00
binaryify 4b735daa41 修复 /song/url 接口无法返回多个音乐数据的问题 #374 2018-11-15 11:57:49 +08:00
binaryify 6c60c9d13d improve docs 2018-11-09 18:32:29 +08:00
binaryify 8bb37684f8 修复取消喜欢歌曲失败问题 #360 补充已喜欢音乐列表接口说明文档 #370 默认关闭 debug 模式 #365 更新 Dockerfile 文件 #367 2018-11-09 15:23:48 +08:00
binaryify aea538c8ee Merge pull request #365 from wshow/master
fix #364 rm debug
2018-11-09 15:02:55 +08:00
binaryify 0a344840f2 Merge pull request #367 from xingdao/master
Update Dockerfile
2018-11-09 14:50:32 +08:00
xingdao 7d1e63d7c5 Update Dockerfile
默认下载打包, 没有这文件
2018-11-07 18:15:05 +08:00
Willin Wang b91fcb1436 rm debug 2018-11-07 10:54:40 +08:00
binaryify 24d5cbb2ce 3.0.2 2018-10-31 21:42:20 +08:00
binaryify 9c8755b009 Merge pull request #358 from nondanee/bandage
支持 POST 请求
2018-10-31 20:49:22 +08:00
Nzix bfa194e849 POST method support fixed 2018-10-31 00:29:58 +08:00
Nzix fa8b9a22e5 Merge pull request #13 from Binaryify/master
sync
2018-10-31 00:15:12 +08:00
binaryify 3ad61baf96 improve docs #353 2018-10-23 23:51:10 +08:00
binaryify da63d97145 update to 3.0.1, #351 2018-10-21 12:36:56 +08:00
binaryify a3ab099147 Merge pull request #351 from nondanee/bandage
又是我😂
2018-10-21 12:15:58 +08:00
Nzix d5c0039566 unified code style 2018-10-21 03:23:46 +08:00
Nzix 87ed3314bb individual patch 2018-10-20 13:41:23 +08:00
Nzix 4c8e2260bd internal modify 2018-10-20 13:17:58 +08:00
Nzix 6421a6c9e3 refactor encryption (support linux api) 2018-10-20 13:16:47 +08:00
Nzix 9be0feccd8 modify comments 2018-10-19 18:42:21 +08:00
Nzix 5a7bd4baf3 Merge pull request #12 from Binaryify/master
sync
2018-10-19 18:05:05 +08:00
binaryify 80d49fcd6d improve docs 2018-10-14 23:46:49 +08:00
binaryify e44cc285e4 improve docs 2018-10-14 22:59:26 +08:00
binaryify 7a041a7f54 improve docs 2018-10-14 22:58:19 +08:00
binaryify 36c85cb0a3 v3.0.0 2018-10-14 22:51:57 +08:00
binaryify 986a4b0dd5 v3.0.0 2018-10-14 22:45:10 +08:00
binaryify 7aca52e1b8 Merge pull request #340 from nondanee/bandage
国庆节大礼包😳
2018-10-06 13:05:58 +08:00
Nzix 8fb18f030b error fixed 2018-10-05 16:15:54 +08:00
Nzix d1ae7f4b56 no intrusive with legacy code 2018-10-05 16:12:52 +08:00
Nzix 71d832384c redo cookie modification with cookie parser 2018-10-05 15:57:50 +08:00
Nzix 2bcccd46df modify callback data format 2018-10-04 23:46:49 +08:00
Nzix a37c34092f check every module 2018-10-04 16:02:28 +08:00
Nzix b84fb38a7d fix copy faults 2018-09-30 21:31:01 +08:00
Nzix 08b5d5af27 change router export mode 2018-09-30 20:45:10 +08:00
Nzix b03914bd1f Merge pull request #11 from Binaryify/master
sync
2018-09-30 11:59:29 +08:00
binaryify 701bfdbd24 修复非法参数403 #335, 修复代理错误 #334 2018-09-29 09:10:23 +08:00
binaryify ec21f0600d Merge pull request #336 from kouchao/master
修复非法参数403 #335, 修复代理错误 #334
2018-09-29 09:08:41 +08:00
kouchao 6fead9a79e 修复非法参数403 #335, 修复代理错误 #334 2018-09-29 08:51:11 +08:00
binaryify 57c3b0f307 修复点赞问题,更新文档 2018-09-27 21:52:55 +08:00
binaryify 23b9a0e72f 更新文档 2018-09-27 00:47:46 +08:00
binaryify e410bef045 v2.20.3 2018-09-26 20:19:01 +08:00
binaryify 9924f233e4 Merge pull request #331 from nondanee/bandage
修复单测里的小问题
2018-09-26 17:43:05 +08:00
Nzix 1bef762d74 correct some mistakes for global variable 2018-09-26 14:19:52 +08:00
binaryify 5826b245e5 Merge pull request #330 from nondanee/bandage
中秋节翌日大礼包😂
2018-09-25 23:52:59 +08:00
Nzix 981c0f7d39 rename for neatness 2018-09-25 19:52:54 +08:00
Nzix 0d373be689 rewrite unit tests 2018-09-25 19:49:10 +08:00
Nzix a26ab583f3 modify regular expression 2018-09-25 19:38:10 +08:00
Nzix 44bcaad9fe add logout router 2018-09-25 19:33:04 +08:00
Nzix 50adbfd804 allocate js cookie in middleware, update res cookie distribution 2018-09-25 19:31:47 +08:00
Nzix f8660cdca6 Merge branch 'bandage' of https://github.com/nondanee/NeteaseCloudMusicApi into bandage 2018-09-24 17:09:13 +08:00
Nzix b018318251 fix /check/music judging error 2018-09-24 17:08:28 +08:00
Nzix 145db79661 Merge pull request #10 from Binaryify/master
sync
2018-09-24 16:57:17 +08:00
Nzix ac66ae339f optimize base cookie for multiple users 2018-09-24 16:45:05 +08:00
Nzix fbd969e36b make the response of /login/status corresponding to /login 2018-09-24 16:40:17 +08:00
binaryify c91beb4aa6 增加热门评论和视频评论接口,更新文档 v2.20.2 2018-09-22 14:52:58 +08:00
binaryify 42249ebba4 优化版本检查功能 2018-09-17 21:45:03 +08:00
binaryify d4acd75a95 Merge pull request #322 from jjeejj/remove-npmview-dependency
Remove npmview dependency
2018-09-17 21:43:21 +08:00
jjeejj 0c04f03717 version 2018-09-16 11:34:55 +08:00
jjeejj 3435d5e8dd remove-npmview-dependency 2018-09-16 11:28:11 +08:00
jjeejj 710a9b6ed2 remove-npmview-dependency 2018-09-16 11:26:50 +08:00
jjeejj 55c3b3e45a gitignore .vscode 2018-09-16 09:49:47 +08:00
binaryify 106a153597 新增版本检查功能 v2.20.0 2018-09-06 21:11:27 +08:00
binaryify b485c8ed40 更新文档 2018-08-31 14:08:39 +08:00
binaryify 33ba035216 增加发送/删除评论接口 #307 2018-08-29 21:57:30 +08:00
binaryify 2ae9aa5f22 Merge pull request #308 from nondanee/bandage
修复登录状态查询问题
2018-08-29 21:31:42 +08:00
Nzix 2cfd81b24b fix login status query bug 2018-08-29 21:08:03 +08:00
Nzix 231f08bca5 Merge pull request #9 from Binaryify/master
sync
2018-08-29 21:05:40 +08:00
binaryify e0dd7a0836 新增获取视频数据接口,完善文档 #301 2018-08-29 11:00:13 +08:00
binaryify 4fa3f7b53b 新增登录状态查询接口 #302 ,完善文档,完善路由注册 #297 v2.17.0 2018-08-28 10:05:30 +08:00
binaryify 3ce4deaafe Merge pull request #302 from nondanee/bandage
登录状态查询
2018-08-28 09:39:59 +08:00
binaryify d3b267e2d5 Merge pull request #297 from Gavin-Gong/master
使用绝对路径读取路由文件注册
2018-08-28 09:39:22 +08:00
Nzix a1a32d1cb2 login status query 2018-08-25 01:53:33 +08:00
Nzix 481a37a3f7 Merge pull request #8 from Binaryify/master
sync
2018-08-25 01:34:15 +08:00
Gavin Gong 1d9935fb07 use absolute path to read router files 2018-08-22 18:16:37 +08:00
binaryify 8b912ced17 解决歌曲URL请求被判 Cheating,修复私信接收异常 #291 2018-08-09 12:44:16 +08:00
binaryify 5b28a17c55 Merge pull request #291 from nondanee/bandage
解决歌曲URL请求被判Cheating
2018-08-09 12:41:26 +08:00
Nzix 1e8ed2d556 [informal] solve -460 cheating 2018-08-08 21:36:25 +08:00
Nzix 9a42fc1a78 Merge pull request #7 from Binaryify/master
sync
2018-08-08 17:01:36 +08:00
binaryify 10f8e0abdc v2.15.0 新增相关歌单推荐和付费精选接口,增加歌手列表接口按首字母索引查找参数 2018-07-30 22:37:44 +08:00
binaryify 926375077a Merge pull request #287 from Means88/master
添加付费精选的 API
2018-07-30 21:29:58 +08:00
binaryify 49d82d7988 Merge pull request #286 from nondanee/bandage
相关歌单推荐自制接口
2018-07-30 21:29:44 +08:00
Nzix af07374ba9 modify initial parameter for artist list 2018-07-27 21:07:41 +08:00
Xingyu Xu b95dd6e069 Merge pull request #1 from Means88/add-pay
添加获取付费电台的 API
2018-07-27 16:21:18 +08:00
徐星宇 f4661b5166 add doc 2018-07-27 16:19:45 +08:00
徐星宇 02766dfabb add dj-paygift api 2018-07-27 16:00:28 +08:00
Nzix 2c5dcdfe8e related playlist recommendation 2018-07-27 00:19:18 +08:00
Nzix adf9ae21d1 support inital index for artist list 2018-07-27 00:17:50 +08:00
Nzix 0b5e4ce77e fix cookie check regexp 2018-07-27 00:14:54 +08:00
Nzix d8043ecdef Merge pull request #6 from Binaryify/master
sync
2018-07-26 22:50:21 +08:00
binaryify f80c588789 更新 issues 模板 2018-07-04 14:02:01 +08:00
binaryify 411f62f987 优化文档 2018-07-03 11:38:47 +08:00
binaryify ea6cfefb69 修复无法使用邮箱问题 2018-07-03 09:11:09 +08:00
binaryify 2cdec0ac64 fix: 手机登陆异常 2018-06-13 21:10:42 +08:00
binaryify 96f105aae1 Merge pull request #264 from Gavin-Gong/master
fix: 手机登陆异常
2018-06-13 21:09:29 +08:00
Gavin Gong ac1fa995d3 fix: 手机登陆异常 2018-06-13 20:56:59 +08:00
binaryify 9687c94c36 improve 2018-06-05 16:20:11 +08:00
binaryify 22e6c0116f update to 2.13.0 2018-06-05 16:02:55 +08:00
binaryify 685041c0ab Merge pull request #260 from xqin/master
增加自动注册路由的功能,简化路由注册逻辑
2018-06-05 15:59:29 +08:00
dds_feng cc2783a248 简化路由导出方式 2018-05-31 13:11:18 +08:00
dds_feng f34dce37b4 util 中导出 request 对象 2018-05-31 12:38:19 +08:00
dds_feng b8d9fac78f 自动注册 router 目录中的js文件为对应的路由, 免除在app.js中不停的添加 router 的问题 2018-05-31 12:32:33 +08:00
dds_feng 7b9b151319 调整 对外路由 与 router 目录中文件的对应关系 2018-05-31 11:53:06 +08:00
binaryify 4610c50ea0 update to v2.12.0 2018-05-27 13:22:40 +08:00
binaryify d9272b95bf Merge pull request #253 from nondanee/bandage
歌单详情调整
2018-05-26 14:43:03 +08:00
Nzix 8460e76026 Merge pull request #5 from Binaryify/master
sync
2018-05-24 23:54:54 +08:00
Nzix be58ec7870 Merge branch 'bandage' of https://github.com/nondanee/NeteaseCloudMusicApi into bandage 2018-05-24 23:46:33 +08:00
Nzix 1cf8a8e16d subscriber data for playlist detail 2018-05-24 23:44:12 +08:00
binaryify 3477542818 更新文档,优化接口 #251 2018-05-24 10:38:16 +08:00
binaryify 5ba31b67ed 增加收藏歌手列表&订阅电台列表 2018-05-21 09:55:55 +08:00
binaryify 15f6a6b0c2 Merge pull request #249 from nondanee/bandage
收藏歌手列表&订阅电台列表
2018-05-21 09:45:16 +08:00
Nzix 063feac04d Merge pull request #4 from Binaryify/master
sync
2018-05-20 02:42:39 +08:00
Nzix dde6e00910 artist sublist & dj sublist 2018-05-20 02:30:35 +08:00
binaryify b1403ed009 improve 2018-05-17 10:03:21 +08:00
binaryify e02b01070c 歌单操作调整为批量操作,更新到 v2.10.0 2018-05-17 10:02:24 +08:00
binaryify fbf5c299dc Merge pull request #246 from nondanee/bandage
歌单批量操作
2018-05-17 09:48:34 +08:00
Nzix f1201eee7b playlist batch operation 2018-05-17 01:06:12 +08:00
Nzix 8ef0287023 Merge pull request #3 from Binaryify/master
sync
2018-05-16 23:44:35 +08:00
binaryify 3710984679 更新文档 2018-05-16 18:50:42 +08:00
binaryify 4cc9dfabd4 fix bug, update to v2.9.9,更新文档 2018-05-16 10:33:04 +08:00
binaryify 94a5404867 Merge pull request #244 from nondanee/bandage
解决403 illegal request
2018-05-16 10:16:51 +08:00
Nzix a737e1f2f2 deal with csrf token 2018-05-16 02:58:06 +08:00
Nzix d258e900b1 Merge pull request #2 from Binaryify/master
sync
2018-05-10 22:37:01 +08:00
binaryify 36726b5e90 update 2018-05-10 10:22:23 +08:00
binaryify 1d42dbd2f2 新增更新用户信息,更新歌单接口 2018-05-10 10:17:43 +08:00
binaryify ff0bab3d65 Merge pull request #242 from LightStrawberry/master
user_update and playlist_update api
2018-05-10 10:04:30 +08:00
binaryify bd9695e4e4 Merge branch 'master' into master 2018-05-10 10:04:20 +08:00
binaryify 65d2a3f918 新增歌手分类列表,收藏/取消收藏歌手接口 2018-05-10 10:00:52 +08:00
binaryify d510468bc9 Merge branch 'master' of github.com:Binaryify/NeteaseCloudMusicApi 2018-05-10 09:35:10 +08:00
binaryify 8d0a0590b9 Merge pull request #241 from nondanee/bandage
收藏/取消收藏歌手&歌手分类列表
2018-05-10 09:34:59 +08:00
LightStrawberry 69162ac6c0 user_update and playlist_update 2018-05-10 04:07:06 +08:00
Nzix 821607f031 artist catalogue 2018-05-10 01:10:02 +08:00
Nzix 5e363fb2ee artist subscribe & unsubscribe 2018-05-09 20:01:08 +08:00
Nzix 7c524ec79f Merge pull request #1 from Binaryify/master
sync
2018-05-09 19:06:17 +08:00
binaryify 420b7d1bc1 更新依赖 2018-05-08 14:22:44 +08:00
binaryify 43bbc4410d 更新文档 2018-05-08 14:20:14 +08:00
binaryify becafe67a6 更新文档 2018-05-08 14:19:52 +08:00
binaryify a8e76255ae 新增新建歌单,收藏/取消收藏歌单接口 2018-05-08 14:02:52 +08:00
binaryify 44a9308fc6 Merge pull request #240 from LightStrawberry/master
create playlist api and subscribe playlist api
2018-05-08 11:05:04 +08:00
binaryify a41cb262f2 Merge branch 'master' into master 2018-05-08 11:04:41 +08:00
Betta cf084acb84 Update send_playlist.js 2018-05-08 10:35:37 +08:00
binaryify 1f53b62ee0 更新文档 2018-05-08 10:16:12 +08:00
binaryify df257cde7b 新增发送私信相关接口 2018-05-08 10:01:21 +08:00
LightStrawberry b69f9d3792 add unsubscribe and fix args to id 2018-05-07 23:48:53 +08:00
LightStrawberry b6c3b0591f playlist_create and playlist_subscribe 2018-05-07 23:40:07 +08:00
binaryify 97b6e5d67c Merge pull request #239 from LightStrawberry/master
private msg
2018-05-07 09:41:15 +08:00
LightStrawberry 4350f85ccd private msg 2018-05-05 13:34:33 +08:00
binaryify 2bed2a6b52 新增热搜接口,更新 banner 接口 2018-05-04 23:04:16 +08:00
binaryify 078a433e14 Merge pull request #238 from nondanee/bandage
banner接口修改
2018-05-04 22:56:12 +08:00
Nzix 9a6bd2a33f modify banner data format 2018-05-04 20:47:50 +08:00
Nzix f454beb902 make banner api more useful 2018-05-04 20:13:40 +08:00
binaryify ebcf1f192b 更新文档 2018-05-04 17:46:55 +08:00
binaryify c37e763b2e 增加热搜接口 #233 2018-05-04 17:43:10 +08:00
binaryify 13b93fda04 修复登录失败会崩溃的问题 2018-02-28 15:10:39 +08:00
binaryify 6ecf6183f0 修复了docker自动构建的一些问题, 更新了文档 2018-01-26 15:13:51 +08:00
binaryify 854ac29d29 Merge pull request #184 from twesix/master
修复了docker自动构建的一些问题, 更新了文档
2018-01-26 15:11:16 +08:00
孟政元 e5ad5e1eaf remove .idea directory created by IDE 2018-01-26 14:12:07 +08:00
孟政元 d2e6e8269c 修复了docker自动构建的一些问题, 更新了文档 2018-01-26 13:40:50 +08:00
binaryify d9e8ffadf2 docker 构建文件的一些增强以及增加访问日志和调试输出 2018-01-26 09:22:08 +08:00
binaryify 1ca1f234ba Merge pull request #183 from twesix/master
docker构建文件的一些增强以及增加访问日志和调试输出
2018-01-26 09:17:31 +08:00
孟政元 a2bb888de8 更新了文档,添加了一些使用docker时候的注意事项 2018-01-26 01:59:54 +08:00
孟政元 0cbcdf8117 Merge branch 'master' of https://github.com/Binaryify/NeteaseCloudMusicApi 2018-01-26 00:55:19 +08:00
孟政元 544d2c7379 add some log and debug ouput 2018-01-26 00:52:51 +08:00
孟政元 0a8680eaa3 improve docker build config 2018-01-25 23:46:24 +08:00
binaryify c230be6ec3 修复歌单详情数据不完整的问题,更新依赖 2018-01-24 10:51:43 +08:00
binaryify b18fe7c21b Merge pull request #180 from zhangzhengyi12/fixPlaylistDetailApi
fix: playlist-detail api can't get all tracks , update source api
2018-01-24 10:31:10 +08:00
laoliu a3d87faa7f fix: playlist-detail api can't get all tracks , update source api 2018-01-24 01:40:35 +08:00
binaryify c6d3fd95bc 去除多余代码 2018-01-22 17:06:24 +08:00
binaryify 79489a40df improve 2018-01-22 16:44:23 +08:00
binaryify 35dbd5cb6d 修复歌单详情接口数据不完整的问题 #167 2018-01-16 22:40:34 +08:00
binaryify 4856050bb1 improve 2018-01-16 13:40:03 +08:00
binaryify 1e7606077d fix comment like bug #166 2018-01-16 13:38:54 +08:00
binaryify 477719569d 优化 cookie 设置 2018-01-15 09:51:23 +08:00
binaryify b9fa1eff03 Merge pull request #174 from LengYXin/master
还是网易云的cookie问题
2018-01-15 09:49:19 +08:00
lengyx 9401f7547d 解决 网易云 cookie 添加 .music.163.com 域设置。 2018-01-14 00:23:20 +08:00
LENG小鑫 21e33a8a9f Merge pull request #1 from Binaryify/master
1
2018-01-13 23:54:24 +08:00
binaryify 3afe5fae7c improve 2018-01-12 14:51:23 +08:00
binaryify 7f69947f2c improve 2018-01-12 14:48:13 +08:00
binaryify 642d6f5353 improve 2018-01-12 14:47:31 +08:00
binaryify 480b1696eb 增加Dockerfile,支持以Docker容器模式运行 #165 2018-01-05 14:46:21 +08:00
binaryify 7a354cdd15 Merge pull request #165 from pengx17/master
增加Dockerfile,支持以Docker容器模式运行。
2018-01-05 14:43:54 +08:00
Peng Xiao 4c01e3e30e 增加Dockerfile,支持以Docker容器模式运行。 2018-01-05 14:23:09 +08:00
binaryify 40fe20dba4 增加 proxy 功能,修复 cookie 丢失问题 2018-01-04 17:06:56 +08:00
binaryify 752d1965f7 Merge pull request #163 from twesix/master
添加了代理功能
2018-01-04 17:03:38 +08:00
binaryify 76e850f573 Merge pull request #164 from LengYXin/master
修改Domain  cookie 丢失问题
2018-01-04 17:02:38 +08:00
lengyx f7ae26f067 修改Domain cookie 丢失问题 2018-01-04 16:24:25 +08:00
孟政元 cec2561040 close debug mode 2018-01-04 13:21:34 +08:00
孟政元 ef20046451 update docs for adding proxy 2018-01-04 12:54:19 +08:00
孟政元 597b648bba update README.MD 2018-01-04 12:16:25 +08:00
孟政元 179acb3540 Merge branch 'master' of https://github.com/Binaryify/NeteaseCloudMusicApi into dev 2018-01-04 12:14:12 +08:00
孟政元 027e11ad84 改正了文档中的一些错误和无效id 2018-01-04 11:17:01 +08:00
binaryify dc186506f8 improve 2018-01-04 10:17:05 +08:00
binaryify 5ec46a12a6 improve 2018-01-04 10:14:55 +08:00
binaryify e8b18d03ab Merge pull request #162 from twesix/master
用request重写了请求函数
2018-01-04 10:13:09 +08:00
孟政元 a47a0e17ae use proxy from query.proxy 2018-01-04 00:53:54 +08:00
孟政元 f12c17ee93 close debug mode 2018-01-03 21:15:18 +08:00
孟政元 9f6d3f1f98 Merge branch 'dev' 2018-01-03 21:04:02 +08:00
孟政元 602a4dbc4c 用request重写了请求部分 2017-12-31 18:45:33 +08:00
孟政元 4cddeb6a2e Merge remote-tracking branch 'Binaryify/master' into dev 2017-12-30 13:57:50 +08:00
孟政元 1c5b4664d2 Merge remote-tracking branch 'Binaryify/master' 2017-12-29 16:38:06 +08:00
waterdanceTV 4dfab51739 improve 2017-12-29 15:47:44 +08:00
binaryify df3176444a Merge pull request #161 from LengYXin/master
解决 网易云 set-cookie 中 设置 Domain=.music.163.com 本地cookie无效问题
2017-12-29 15:45:55 +08:00
lengyx 2f573e0437 解决 网易云 set-cookie 中 设置 Domain=.music.163.com 本地cookie无效问题 2017-12-29 15:10:22 +08:00
binaryify 67bc5f240f 修复文档描述错误 2017-12-12 19:52:18 +08:00
binaryify aaac172e1f 更新排行榜接口,新增云音乐ACG音乐榜,云音乐嘻哈榜 2017-12-11 19:06:44 +08:00
binaryify 7a0b77ec7f Merge pull request #151 from nujhong/hotfix/toplist-update
新增两个排行榜
2017-12-11 19:04:16 +08:00
nujhong 3536649aa6 增加排行榜接口,更新文档 2017-12-11 19:37:03 +11:00
binaryify 8f33edb746 improve 2017-12-04 10:52:45 +08:00
binaryify c034f01852 修复了express.static的路径问题 2017-12-02 01:22:08 +08:00
binaryify a54bb4b78d Merge pull request #142 from twesix/master
修复了express.static的路径问题
2017-12-02 01:16:25 +08:00
孟政元 6709ca371e 修复了express.static的路径问题
把express.static的路径改成绝对路径,防止在使用pm2部署的时候由于cwd不确定产生static文件404的问题
2017-12-01 21:17:39 +08:00
binaryify 48d0af5713 更新 / 修复推荐歌单接口 2017-11-27 16:53:43 +08:00
binaryify cb6ce5bb65 更新 / 修复排行榜接口 2017-11-27 16:46:43 +08:00
binaryify 74211d01d9 update 2017-11-26 07:13:47 +08:00
hzw758 085ee14cc8 歌手榜bug修复 2017-11-21 21:25:17 +08:00
binaryify 9de0ab9787 update docs 2017-11-21 11:28:48 +08:00
binaryify 34a2c1f93f update docs 2017-11-21 11:13:15 +08:00
binaryify 22d5dd4e09 update docs 2017-11-21 11:12:04 +08:00
binaryify 70657c4035 improve docs 2017-10-16 09:56:34 +08:00
waterdanceTV e02dc66150 update docs 2017-10-16 09:32:49 +08:00
binaryify 8f74ac1b19 修复搜索接口 offset 参数失效问题 #100 2017-09-07 17:14:39 +08:00
binaryify f787f6630e update to 2.7.1 2017-08-24 13:20:43 +08:00
binaryify 97daa4e309 修复变量错误 2017-08-24 13:17:22 +08:00
binaryify 966d4f56ad 优化刷新登录代码 2017-08-21 22:27:17 +08:00
binaryify 5648fbefe9 修复文档描述错误 #91 2017-08-21 09:33:49 +08:00
binaryify bbd33153b8 improve docs 2017-08-18 09:32:49 +08:00
binaryify 9b12fe3895 improve 2017-08-17 16:43:06 +08:00
binaryify 53b75c31cc 优化缓存 2017-08-17 16:39:32 +08:00
binaryify cde7863060 improve 2017-08-17 15:10:53 +08:00
binaryify 1d8b13de2f 优化代码 2017-08-17 15:08:49 +08:00
binaryify bf0057ba1d 更新热门歌手接口 2017-08-17 13:51:20 +08:00
binaryify 1ff82e59af improve 2017-08-17 13:03:06 +08:00
binaryify f62b5e7c04 格式化代码 2017-08-17 12:11:38 +08:00
binaryify 64f781ee1f 加入 Prettier 2017-08-17 12:05:03 +08:00
binaryify 1904d82b5a 更新文档 2017-08-17 11:13:00 +08:00
binaryify f71f586073 优化 cors 设置 2017-08-17 11:09:38 +08:00
binaryify a91bae2e86 增加缓存机制 2017-08-17 10:57:18 +08:00
binaryify 2bccab0e73 加入随机 userAgent 机制 2017-08-17 10:01:19 +08:00
binaryify 5e4f410f8b improve docs 2017-08-12 16:22:15 +08:00
binaryify 3db3584f9f improve 2017-07-16 18:02:58 +08:00
binaryify 21fffb5f8b 修复垃圾桶接口问题 #75 2017-07-16 18:01:39 +08:00
binaryify fbad2de39b 修复红心功能 #75 2017-07-16 14:33:18 +08:00
binaryify b940bbf53b 增加 issue 模版 2017-06-27 15:50:57 +08:00
binaryify f78526ad19 修复签到接口 #62 2017-06-25 11:03:43 +08:00
binaryify 5ecf33eb0a 增加启动说明页 2017-06-14 17:27:34 +08:00
binaryify 6aa09557d2 更新文档 2017-06-13 20:26:37 +08:00
binaryify 7e4887b8a2 更新文档 2017-06-08 19:47:54 +08:00
binaryify 889f3dd7e3 修复若干细节问题 2017-06-01 20:06:34 +08:00
binaryify c1b28c506c improve docs 2017-05-27 21:57:37 +08:00
binaryify 842009219d improve document 2017-05-22 15:01:39 +08:00
binaryify c5f798b1e5 update to 2.5.7 2017-05-22 09:15:51 +08:00
binaryify ae19c229ae improve doc 2017-05-22 09:14:25 +08:00
binaryify ed4cd48fc6 improve docs 2017-05-20 22:42:44 +08:00
binaryify 5eb9920392 增加邮箱登录注意 2017-05-20 19:42:07 +08:00
binaryify a0114df488 修复文档描述错误,调整歌单详情接口 2017-05-20 18:10:15 +08:00
binaryify 4a8008761a 增加动态消息接口 2017-05-14 21:59:30 +08:00
binaryify 0d122d3753 Merge pull request #38 from zhixuanziben/master
增加动态消息接口
2017-05-14 21:54:48 +08:00
zhixuan e4906b9a40 Update README.md 2017-05-14 21:10:51 +08:00
zhixuan b176b94e07 新增动态消息接口 2017-05-14 21:07:25 +08:00
zhixuan 47c3525b24 获取动态消息的接口 2017-05-14 21:05:44 +08:00
binaryify a4366ec93d improve 2017-05-10 18:29:36 +08:00
binaryify 0db014e560 improve 2017-05-10 18:26:23 +08:00
binaryify be2e0dd05a fix mv api error 2017-05-10 18:25:12 +08:00
binaryify f4df416ba4 improce readme.md 2017-05-07 12:10:20 +08:00
binaryify a3188e3141 improve document 2017-05-05 15:43:23 +08:00
binaryify e8d56d5e05 improve document 2017-05-05 15:42:41 +08:00
binaryify ace874a810 improve document 2017-05-05 15:41:50 +08:00
binaryify df8f8b7ff4 improve docuemnt 2017-05-05 15:40:26 +08:00
binaryify f4c14f772c improve docuemnt 2017-05-05 15:39:35 +08:00
binaryify ed0bca03cd 新增点赞接口 2017-05-05 15:38:32 +08:00
binaryify 176d08b4fe update CHANGELELOG.MD 2017-05-02 10:57:49 +08:00
binaryify 05bfb906fb update package.json 2017-05-02 10:56:47 +08:00
binaryify c7ec5ec63c 修复歌手单曲数据空白问题和文档获取歌手单曲url 描述问题 2017-05-02 09:55:41 +08:00
binaryify 4189bc8903 增加国外服务器使用方法 2017-05-01 23:55:11 +08:00
binaryify b63e4d847f improve document 2017-05-01 17:00:35 +08:00
binaryify 13b721f49b improve document #30 2017-04-30 17:54:46 +08:00
binaryify 0712353b53 修正文档序号错误 2017-04-29 23:54:40 +08:00
binaryify 12ae881b97 improve document 2017-04-29 23:46:03 +08:00
binaryify 37ffe991f3 improve document 2017-04-29 22:43:03 +08:00
binaryify 7efb2fc17f improve document 2017-04-29 22:41:10 +08:00
binaryify 737b947238 improve document 2017-04-29 22:40:55 +08:00
binaryify 345561af59 improve 2017-04-29 22:38:53 +08:00
binaryify 5d5e26f685 improve 2017-04-29 22:32:16 +08:00
binaryify e3c4377b4c improve 2017-04-29 22:30:29 +08:00
binaryify 9cb3723ed1 improve document 2017-04-29 22:11:29 +08:00
binaryify d390c03fd5 improve document 2017-04-29 22:06:58 +08:00
binaryify 1c8fcb863f improve document 2017-04-29 22:04:06 +08:00
binaryify 24476792f1 improve document 2017-04-29 22:01:54 +08:00
binaryify 13f2dfd0ce improve document 2017-04-29 22:00:20 +08:00
binaryify b6feed4796 version 2.5.0 增加 mv/专辑/歌单评论接口,增加云盘相关接口,增加获取用户动态/信息接口,增加关注/粉丝列表接口,增加收藏歌单接口,增加相似 mv/歌曲/用户接口,增加 banner 接口,增加刷新登录接口,增加电台相关接口,补充评论接口,更新文档 2017-04-29 21:57:19 +08:00
binaryify b236b5024e 文档增加搜索歌词和电台的 type 2017-04-21 23:00:46 +08:00
binaryify c99fc7b2db 文档更新搜索 mv 的 type 2017-04-21 22:59:07 +08:00
binaryify dd03d8dca6 improve document 2017-04-21 21:40:48 +08:00
binaryify 484230d226 improve document 2017-04-21 16:33:28 +08:00
binaryify 99e1b8989b 增加播放mv 接口 2017-04-21 16:18:49 +08:00
binaryify 2ce2284297 improve document 2017-04-21 00:14:40 +08:00
binaryify faefc77726 improve document 2017-04-21 00:09:07 +08:00
binaryify aedd7b8b05 improve document 2017-04-21 00:07:41 +08:00
binaryify f4b0a022ba improve document 2017-04-21 00:00:07 +08:00
binaryify 873b70f626 improve document 2017-04-20 23:56:57 +08:00
binaryify 9e5224ada4 improve document 2017-04-20 23:53:12 +08:00
binaryify ade1b14516 improve document 2017-04-20 23:51:08 +08:00
binaryify 57747b6beb improve document 2017-04-20 23:49:51 +08:00
binaryify e4baca1a00 add mv.png 2017-04-20 23:48:30 +08:00
binaryify 3635d44f9c improve document 2017-04-20 23:44:45 +08:00
binaryify f47851cb75 增加歌手单曲和歌手专辑接口,修复/album 接口描述错误 2017-04-20 23:42:27 +08:00
binaryify f8bbf7a29b improve document 2017-04-20 23:16:09 +08:00
binaryify 5483cd158d 增加截图 2017-04-20 17:24:50 +08:00
binaryify 0baed1a634 增加歌单(网友精选碟),新碟上架,热门歌手等接口,更新文档,版本更新到2.4.0 2017-04-20 17:22:33 +08:00
binaryify 0911a5b630 improve document 2017-04-20 13:22:25 +08:00
binaryify 6d2d7e3b9c 增加获取歌曲详情接口 2017-04-20 13:19:17 +08:00
binaryify f8599bf334 improve document 2017-04-17 14:08:16 +08:00
binaryify a352f37831 improve document 2017-04-17 14:06:45 +08:00
binaryify a05fbd3a2c improve document 2017-04-15 21:29:33 +08:00
binaryify ba58156bbe improve document 2017-04-15 21:07:25 +08:00
binaryify 5654601ea0 新增排行榜接口 2017-04-15 21:04:55 +08:00
binaryify 02e7582db6 新增排行榜接口 2017-04-15 21:03:14 +08:00
binaryify e4327ecad5 优化图片显示 2017-04-15 20:58:55 +08:00
binaryify 2ca81a35d9 增加排行榜图片 2017-04-15 20:54:48 +08:00
binaryify d9d11b2d33 improve document 2017-04-14 18:37:45 +08:00
binaryify d6d0c5090e improve document 2017-04-14 18:30:56 +08:00
binaryify e9fb55cb53 improve document 2017-04-14 18:23:28 +08:00
binaryify 5fdc25506a improve 2017-04-14 17:15:48 +08:00
binaryify 502538d619 improve document 2017-04-14 17:09:07 +08:00
binaryify 69da1315c5 improve document 2017-04-14 17:08:19 +08:00
binaryify 2e361aaafe improve document 2017-04-14 17:03:06 +08:00
binaryify 3d571d0438 improve 2017-04-14 16:57:55 +08:00
binaryify 60e919f950 improve 2017-04-14 16:57:32 +08:00
binaryify 6f492092b9 improve document 2017-04-14 16:55:50 +08:00
binaryify 6f85779152 增加私人 FM, 喜欢歌曲,垃圾桶,每日签到等接口,更新文档 2017-04-14 16:54:20 +08:00
binaryify 106fea02bd Merge pull request #12 from mchome/patch-1
document mistakes
2017-04-09 01:19:11 -05:00
fuyumi f52db9c18e document mistakes
获取音乐url的api写错了
2017-04-09 12:39:39 +08:00
binaryify dc0ff3f7e4 add npm keyword info 2017-04-08 18:56:46 +08:00
binaryify a52ec2bfe5 improve unit test 2017-04-08 11:48:06 +08:00
binaryify e36d4a24d0 improve unit test 2017-04-08 11:45:43 +08:00
binaryify 48d51123a2 improve document 2017-04-08 11:33:17 +08:00
binaryify da6a9c8a11 improve document & add offset param of the comment api 2017-04-08 11:10:00 +08:00
binaryify b4a9c17ad3 improve document 2017-04-07 09:25:25 +08:00
binaryify e36583fc1f improve document 2017-04-07 09:24:03 +08:00
binaryify d2cb1cfada improve README.MD & CHANGELOG.MD 2017-04-06 23:10:18 +08:00
binaryify 77f848b74e 增加获取评论接口以及对应单元测试,增加更新日志 2017-04-06 23:03:48 +08:00
binaryify 1eb6f3a59f add comment api screenshot 2017-04-06 22:40:12 +08:00
binaryify 9f760ef532 improve 2017-04-06 10:56:15 +08:00
binaryify 53ef00440c upgrade to v2.0.2 2017-04-06 10:49:29 +08:00
binaryify 109e999de7 add license info 2017-04-06 10:48:33 +08:00
binaryify c83cec40db improve document 2017-04-05 18:00:46 +08:00
binaryify 0a8ee997de improve 2017-04-05 17:59:06 +08:00
binaryify 8c5485da6f 增加'关于本文档'介绍 2017-04-05 17:50:57 +08:00
binaryify 8146d58a84 upgrade version to 2.0.1 2017-04-05 13:27:51 +08:00
binaryify dffa68bc39 improve document 2017-04-05 13:27:20 +08:00
binaryify caaa981caa fix album unit test description error 2017-04-05 12:49:12 +08:00
binaryify 7acdd0fce6 improve document 2017-04-05 11:18:07 +08:00
binaryify 3f9684f872 improve document 2017-04-05 10:11:49 +08:00
binaryify 6630fa1e14 add album api & unit test, improve document 2017-04-05 09:50:28 +08:00
binaryify f6b9ff2441 add album api screenshot 2017-04-05 09:37:30 +08:00
binaryify 51643e4116 add login api notice 2017-04-02 11:28:11 +08:00
binaryify 50b8705345 improve document 2017-04-01 21:16:52 +08:00
binaryify 179cec67d0 improve document 2017-04-01 20:56:49 +08:00
binaryify 14e373ca92 Delete .DS_Store 2017-04-01 20:55:57 +08:00
binaryify 617180f391 Delete .DS_Store 2017-04-01 20:55:46 +08:00
binaryify 5265526133 improve document 2017-04-01 20:43:37 +08:00
binaryify 9ed9cc8169 improve document 2017-04-01 20:37:35 +08:00
binaryify a1e4865025 improve seo 2017-04-01 20:35:13 +08:00
binaryify 26444f6ea8 improve document 2017-04-01 20:23:24 +08:00
binaryify ff0bd65aa2 improve document 2017-04-01 19:45:25 +08:00
binaryify 084d348a76 improve document 2017-04-01 19:44:46 +08:00
binaryify 072968e102 improve document 2017-04-01 19:41:29 +08:00
binaryify 22c933c082 add favicon.ico 2017-04-01 19:35:28 +08:00
binaryify eddd08f757 improve 2017-04-01 19:24:37 +08:00
binaryify 95ae4b98c1 improve document 2017-04-01 19:19:26 +08:00
binaryify b3ac7e9ecf add serviceWorker 2017-04-01 19:05:35 +08:00
binaryify a2e4d26401 upgrade version 2.0,add login api,upgrade api verison,add document and unit test 2017-04-01 18:42:51 +08:00
binaryify 35f37afd77 add docs 2017-04-01 17:48:23 +08:00
binaryify a9caa0eb2a add screenshot 2017-04-01 17:29:40 +08:00
binaryify e62d3e904b 'improve' 2017-02-15 17:29:39 +08:00
binaryify 1e0e6266b9 'improve' 2017-02-15 17:27:15 +08:00
binaryify dc2abbc96d 'update' 2016-08-19 18:04:45 +08:00
binaryify aae785cad9 'update' 2016-08-19 17:51:49 +08:00
binaryify 07c5933e78 'update' 2016-07-09 14:28:37 +08:00
binaryify 2cf9868494 add travis-ci badge 2016-07-09 11:07:39 +08:00
binaryify 928bdd4dcf add travis 2016-07-09 11:00:08 +08:00
binaryify c5f164a094 fix error 2016-07-09 10:55:49 +08:00
binaryify 68a8635f4b fix error 2016-07-09 10:49:55 +08:00
binaryify 79e837cebf Merge pull request #5 from CeBkCn/master
Add getPlaylists
2016-07-09 10:47:49 +08:00
CeBkCn 49554adb0b Add getPlaylists 2016-07-07 17:09:17 +08:00
CeBkCn 79143e60f2 Add getPlaylists 2016-07-07 17:06:51 +08:00
CeBkCn 86e54c0032 Add getPlaylists 2016-07-07 17:06:15 +08:00
CeBkCn c2460b0369 Add getPlaylists 2016-07-07 17:05:22 +08:00
CeBkCn 344b452e7d Add getPlaylists
Add getPlaylists
2016-07-07 17:00:27 +08:00
CeBkCn 2ef4dfa1a9 Add getPlaylists
Add getPlaylists
2016-07-07 16:58:01 +08:00
binaryify 162974442f update 2016-07-01 21:52:45 +08:00
binaryify 4cc08d8c9f update README.MD 2016-07-01 20:46:43 +08:00
binaryify 4e0e9ef989 update npm version 2016-07-01 16:40:08 +08:00
binaryify bb76b4b5c2 fix link error 2016-07-01 16:38:22 +08:00
binaryify 71f5e43498 update npm version 2016-07-01 16:33:23 +08:00
binaryify 746e08d550 Merge pull request #4 from rccoder/master
add getArtistAblums and getAblums & Update README & Update test & rep…
2016-07-01 16:28:39 +08:00
rccoder 7890e4a0e8 add getArtistAblums and getAblums & Update README & Update test & replan directory 2016-07-01 16:21:04 +08:00
binaryify 5fb70c3717 update README.MD 2016-07-01 13:30:52 +08:00
binaryify 3301d91ad7 update README.MD 2016-07-01 13:29:36 +08:00
binaryify 457abe9730 update README.MD 2016-07-01 13:28:35 +08:00
binaryify 7cfd77c6d3 update listen & README.MD 2016-07-01 13:27:38 +08:00
binaryify 53417c6c82 update listen & README.MD 2016-07-01 13:26:41 +08:00
binaryify fda54149ea fix something 2016-07-01 13:18:20 +08:00
binaryify af7e5aac89 update 2016-07-01 13:18:00 +08:00
binaryify 8270c7318b update README.MD 2016-07-01 10:14:11 +08:00
binaryify 660be09d51 update version & update test.js 2016-07-01 10:11:19 +08:00
binaryify b22ceafadb update version 2016-07-01 10:03:55 +08:00
binaryify 9798e969cd Merge pull request #3 from rccoder/master
Update README & Fix proxy bug & plan directory
2016-07-01 10:01:19 +08:00
binaryify ee05821801 update 2016-07-01 09:51:41 +08:00
binaryify bed5d08755 update 2016-07-01 09:50:37 +08:00
rccoder f4c1b6ccb5 Update README & Fix proxy bug & plan directory 2016-06-30 23:53:38 +08:00
binaryify 2093fea6a1 update 2016-06-29 19:37:31 +08:00
binaryify f3404ce41f update 2016-06-28 09:11:26 +08:00
binaryify 3f79c3c526 update 2016-06-27 23:21:29 +08:00
binaryify acdfd6f1ff update 2016-06-24 07:39:26 +08:00
binaryify 572659f3ab fix error 2016-06-23 21:16:39 +08:00
binaryify 8c2db97dbb update 2016-06-23 10:34:58 +08:00
binaryify 178630f82d update 2016-06-23 10:28:55 +08:00
binaryify 9a3bba3453 update 2016-06-23 10:21:20 +08:00
binaryify 6c80dbc4aa update 2016-06-22 23:54:11 +08:00
binaryify 774de65ca5 update 2016-06-22 23:44:13 +08:00
binaryify 51bb402376 update 2016-06-22 22:38:24 +08:00
binaryify 7029aa2a4b update 2016-06-22 22:20:47 +08:00
binaryify 4151608edb update 2016-06-22 20:21:35 +08:00
binaryify c987542e86 update 2016-06-22 20:06:49 +08:00
binaryify ae69e262c3 init 2016-06-22 19:58:57 +08:00
132 changed files with 17455 additions and 20127 deletions
+2 -1
View File
@@ -7,8 +7,9 @@
!/app.js
!/server.js
!/package.json
!/package-lock.json
!/index.js
!/generateConfig.js
!/main.js
!/data
!/.env
!/pnpm-lock.yaml
-2
View File
@@ -1,2 +0,0 @@
# 解灰接口支持无损音质
ENABLE_FLAC = true
+27
View File
@@ -0,0 +1,27 @@
### CORS资源共享设置
## 如果你需要配置, 请取消下面的注释并设置具体的域名
# CORS_ALLOW_ORIGIN = "*"
### 代理设置
## 启用反向代理
ENABLE_PROXY = false
## 代理配置
PROXY_URL = "https://your-proxy-url.com/?proxy="
### 随机IP设置
## 启用随机中国IP(默认关闭);启用后,所有请求默认使用随机中国IP,除非请求参数randomCNIP显式关闭
ENABLE_RANDOM_CN_IP = false
### UnblockNeteaseMusic 设置项
## 启用全局解灰, 无论是否调用参数都会使用解灰(不推荐开启)
ENABLE_GENERAL_UNBLOCK = false
## 歌曲启用无损音质
ENABLE_FLAC = true
## 启用无损音质时,是否选择音质最高的
SELECT_MAX_BR = false
## 严格按照配置音源设置顺序进行匹配
FOLLOW_SOURCE_ORDER = true
## Cookie设置项; 推荐在Vercel等平台进行环境变量的设置或者设置github secret
# 网易云 cookie
# 格式:MUSIC_U=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# NETEASE_COOKIE = ""
-57
View File
@@ -1,57 +0,0 @@
module.exports = {
root: true,
ignorePatterns: ['public/'],
parserOptions: {
parser: 'babel-eslint',
ecmaVersion: 2018,
sourceType: 'module',
},
plugins: ['html'],
extends: ['plugin:prettier/recommended'],
env: {
browser: true,
node: true,
},
rules: {
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
indent: ['error', 2, { SwitchCase: 1 }],
'space-infix-ops': ['error', { int32Hint: false }],
'key-spacing': [
2,
{
beforeColon: false,
afterColon: true,
},
],
'no-octal': 2,
'no-redeclare': 2,
'comma-spacing': 2,
'no-new-object': 2,
'arrow-spacing': 2,
quotes: [
2,
'single',
{
avoidEscape: true,
allowTemplateLiterals: true,
},
],
},
overrides: [
{
files: ['**/*.ts'],
parser: '@typescript-eslint/parser',
extends: [
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
// 'prettier/@typescript-eslint',
],
},
],
}
+1
View File
@@ -0,0 +1 @@
custom: ["https://rewards.focalors.ltd"]
-42
View File
@@ -1,42 +0,0 @@
---
name: 创建问题反馈
about: 问题反馈
title: "<不按照模版格式或者删除模版信息将得不到处理,确认看完了调用前须知再发 issues>"
labels: ''
assignees: ''
---
## 环境
- 系统/平台: <你的系统和平台>
- nodejs 版本: <你的 NodeJS 版本号>
- API版本: <运行的云音乐 API 的版本号, 对应 package.json 里面的 version>
## 出现问题
<请清晰描述出现的问题,不要使用xxx不行之类的模糊不清的语句,我没有读心术>
## 重现步骤
<请清晰描述重现步骤,调用的接口链接和参数以及命令行错误信息,最好贴上截图(命令行错误信息和接口返回内容)>
## 期待效果
<请清晰描述现在的效果和期待的效果>
---
>维护项目都是业余时间,精力有限,我只能挑容易解决的issues处理,为了节约双方时间,请尽可能提供足够的有用的信息,给的信息不够我只能根据精力和时间看情况处理,如果模板信息看都不看就删掉,我不会进行任何回复,并且一个月后close掉issue
>先看文档有没有相关说明,调用前须知必看,确认看完了调用前须知再发 issues
>先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭
>不处理别人搭建的线上服务的问题,此项目不提供任何线上服务,请自行搭建
>重现步骤尽量详细,不能含糊不清,包含请求地址和对应参数以及操作过程描述,不是每个人都喜欢猜别人遇到了什么问题和找参数一个个试,也比较浪费时间
>如果不是提建议,提 issues 如果不照着模版来将不会优先处理或放着不管
>460 cheating 的问题把 `utils/request.js` 里面的 `headers['X-Real-IP']` 的注释取消掉就好
-11
View File
@@ -1,11 +0,0 @@
---
name: 功能需求
about: 希望添加新接口
title: ''
labels: 功能需求
assignees: ''
---
**功能描述**
- 请清晰描述你所希望添加的功能,最好贴上对应客户端界面的截图
+117
View File
@@ -0,0 +1,117 @@
name: 🐛 Bug报告
description: 报告API其中的错误或问题
title: "[Bug] "
labels: ["bug"]
assignees: []
body:
- type: markdown
attributes:
value: |
感谢您报告Bug!请填写以下信息帮助我们快速定位和修复问题。
- type: checkboxes
id: terms
attributes:
label: 确认事项
description: |
在提交Bug报告前,请确认以下事项:
- 我已经搜索了现有的issues,确认这不是重复问题
- 我使用的是最新版本的API, 而且是官方发布的版本,而不是fork或修改版
- 不处理别人搭建的线上服务的问题,此项目提供任何线上服务不保证质量
- 如果不是提建议,提 issues 如果不照着模版来将不会优先处理或放着不管
- 维护项目都是业余时间,精力有限,我只能挑容易解决的issues处理,为了节约双方时间,请尽可能提供足够的有用的信息,给的信息不够我只能根据精力和时间看情况处理,如果模板信息看都不看就删掉,我不会进行任何回复,并且一个月后close掉issue
options:
- label: 我已确认以上事项
required: true
- type: input
id: version
attributes:
label: API版本
description: 请提供您使用的API版本以及nodejs版本
placeholder: "v4.2x.x, Node.js v22.x.x"
validations:
required: true
- type: dropdown
id: deployment
attributes:
label: 部署方式
description: 此项目支持本地部署和云平台部署,您使用的是哪种方式?
options:
- 本机直接运行 (node / pm2)
- 本机 Docker 部署
- Vercel
- Heroku
- Railway
- 其他云平台 (请在描述中说明)
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Bug描述
description: 请详细描述您遇到的问题
placeholder: |
清晰简洁地描述bug的具体表现...
validations:
required: true
- type: textarea
id: reproduction-steps
attributes:
label: 重现步骤
description: 请提供详细的重现步骤
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: 期望行为
description: 请描述您期望发生的行为
placeholder: 清晰简洁地描述您期望应该发生什么...
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: 实际行为
description: 请描述实际发生的行为
placeholder: 清晰简洁地描述实际发生了什么...
validations:
required: true
- type: textarea
id: error-output
attributes:
label: 错误输出日志
description: 请提供完整的错误信息日志
render: shell
placeholder: |
错误信息输出...
- type: textarea
id: additional-context
attributes:
label: 额外信息
description: 添加任何其他有助于理解问题的信息
placeholder: |
- 截图
- 相关配置文件
- 其他相关信息
- type: checkboxes
id: help
attributes:
label: 愿意协助
description: 您是否愿意帮助修复这个bug?
options:
- label: 我愿意提交PR来修复这个bug
- label: 我可以提供更多测试用例
- label: 我可以帮助测试修复方案
+8
View File
@@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: ↑请尽量使用议题模板创建议题↑
url: https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced/issues/new/choose
about: 选择适合的议题模板可以帮助我们更快地定位和解决问题
- name: 提问的艺术
url: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md
about: 默认所有 Issues 发起者均已了解此处的内容
@@ -0,0 +1,72 @@
name: ✨ 接口添加请求
description: 希望添加新接口
title: "[Feature] "
labels: ["enhancement"]
assignees: []
body:
- type: markdown
attributes:
value: |
感谢您提出新功能建议!请填写以下信息帮助我们理解您的需求。
- type: checkboxes
id: terms
attributes:
label: 确认事项
description: 在提交功能请求前,请确认以下事项
options:
- label: 我已经搜索了现有的issues,确认这不是重复请求
required: true
- label: 我已经查看了项目文档
required: true
- label: 该项目符合该项目的目标和范围
required: true
- label: 我确认我提供的接口请求是合理且有意义的
required: true
- type: textarea
id: proposed-solution
attributes:
label: 功能描述
description: 请详细描述您希望添加的功能,最好贴上对应客户端界面的截图
placeholder: |
请详细描述您期望的功能:
- 新的网易云音乐api 接口?
validations:
required: true
- type: dropdown
id: priority
attributes:
label: 优先级
description: 您认为这个功能的优先级如何?
options:
- 低 (可有可无的改进)
- 中 (会显著改善使用体验)
- 高 (严重影响了我使用)
- 紧急 (阻塞了重要工作)
validations:
required: true
- type: textarea
id: compatibility
attributes:
label: 兼容性考虑
description: 这个功能是否会影响现有代码的兼容性?
placeholder: |
- 是否是破坏性变更?
- 是否需要语法变更?
- 对性能的影响?
- type: checkboxes
id: implementation
attributes:
label: 实现意愿
description: 您是否愿意参与这个功能的实现?
options:
- label: 我愿意提交PR来实现这个功能
- label: 我可以协助设计API接口
- label: 我可以提供测试用例
- label: 我可以帮助编写文档
+41
View File
@@ -0,0 +1,41 @@
# .github/dependabot.yml
version: 2
updates:
# 更新 npm (JavaScript) 依赖
- package-ecosystem: "npm"
directory: "/" # package.json 所在的位置
schedule:
interval: "weekly" # 每周一检查
# 默认情况下,Dependabot 会自动获取最新版本。
# 你可以使用 `ignore` 来排除某些特定更新
ignore:
- dependency-name: "eslint"
# 对于 ESLint,忽略主版本 8 以上的所有更新
versions: ["> 8"]
# 自动合并小版本更新的 PR (可选)
# 可以设置针对 patch 或 minor 版本更新自动合并
commit-message:
prefix: "build(packages):" # PR 合并提交信息的前缀
# 更新 GitHub Actions 依赖
- package-ecosystem: "github-actions"
directory: "/" # .github/workflows/ 目录所在的位置
schedule:
interval: "monthly"
# 更新 Python (pip) 依赖,如果你的项目有 requirements.txt
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
# 如果你有多个目录(例如一个 monorepo),可以为每个目录单独配置
# - package-ecosystem: "npm"
# directory: "/packages/frontend"
# schedule:
# interval: "weekly"
# - package-ecosystem: "npm"
# directory: "/packages/backend"
# schedule:
# interval: "weekly"
+53
View File
@@ -0,0 +1,53 @@
name: Build Artifacts
on:
workflow_dispatch: # 手动触发
push:
branches: [main]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
include:
- os: ubuntu-latest
platform: linux
target: node18-linux-x64
output: precompiled/app
- os: windows-latest
platform: win
target: node18-win-x64
output: precompiled/app.exe
- os: macos-latest
platform: macos
target: node18-macos-x64
output: precompiled/app
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '18'
- name: Install dependencies
run: |
npm install -g pnpm
pnpm install
- name: Build for ${{ matrix.platform }}
run: |
npm run pkg${{ matrix.platform }}
env:
PKG_TARGET: ${{ matrix.target }}
- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: app-${{ matrix.platform }}
path: ${{ matrix.output }}
if-no-files-found: error
+79
View File
@@ -0,0 +1,79 @@
name: Issue Management
permissions:
issues: write
contents: read
on:
issues:
types: [opened, labeled]
issue_comment:
types: [created]
jobs:
welcome-new-issues:
if: github.event.action == 'opened'
runs-on: ubuntu-latest
steps:
- name: Welcome new issue
uses: peter-evans/create-or-update-comment@v5
with:
issue-number: ${{ github.event.issue.number }}
body: |
## 快速链接
在我们处理您的问题之前,您可以先查看以下资源:
- 📖 查看[项目文档](https://neteasecloudmusicapienhanced.js.org)
- 💬 加入[QQ交流群](https://qm.qq.com/q/TpeP9Uv2yk)
- 🔍 搜索[现有issues](https://github.com/neteasecloudmusicapienhanced/api-enhanced/issues) 看是否有类似问题
handle-help-wanted:
if: contains(github.event.issue.labels.*.name, 'question')
runs-on: ubuntu-latest
steps:
- name: Add help resources
uses: peter-evans/create-or-update-comment@v5
with:
issue-number: ${{ github.event.issue.number }}
body: |
🆘 需要帮助?
这里有一些可能对您有用的资源:
📚 **文档资源**
- [项目文档](https://neteasecloudmusicapienhanced.js.org)
🔍 **常见问题**
- 搜索[已关闭的issues](https://github.com/neteasecloudmusicapienhanced/api-enhanced/issues?q=is%3Aissue+is%3Aclosed) 看看是否有类似的问题已经被解答。
💬 **即时帮助**
- 加入QQ群:https://qm.qq.com/q/TpeP9Uv2yk
如果以上资源无法解决您的问题,请提供更多详细信息,我们会尽快为您解答!
stale-issues:
if: github.event.action == 'opened'
runs-on: ubuntu-latest
steps:
- name: Mark stale issues
uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: |
这个issue已经30天没有活动了。
如果这个问题仍然存在,请回复此评论说明当前状态。
否则,这个issue将在7天后自动关闭。
您可以随时重新打开已关闭的issue。
stale-pr-message: |
这个PR已经30天没有活动了。
如果您仍在处理这个PR,请回复此评论。
否则,这个PR将在7天后自动关闭。
days-before-stale: 30
days-before-close: 7
stale-issue-label: "stale"
stale-pr-label: "stale"
exempt-issue-labels: "pinned,enhancement,priority:high,ongoing,fatal"
exempt-pr-labels: "pinned,priority:high,ongoing,fatal"
@@ -0,0 +1,315 @@
name: Create Release on Version Change
on:
push:
branches:
- main
paths:
- package.json
workflow_dispatch:
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
jobs:
detect:
name: Detect Version Change
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.value }}
should_release: ${{ steps.check.outputs.should_release }}
tag_exists: ${{ steps.tagcheck.outputs.exists }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Extract version from package.json
id: version
run: |
echo "value=$(jq -r .version package.json)" >> $GITHUB_OUTPUT
- name: Check if version changed
id: check
shell: bash
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "should_release=true" >> $GITHUB_OUTPUT
exit 0
fi
if git diff "${{ github.event.before }}" "${{ github.sha }}" -- package.json | grep -q '"version"'; then
echo "should_release=true" >> $GITHUB_OUTPUT
else
echo "should_release=false" >> $GITHUB_OUTPUT
fi
- name: Check if tag already exists
id: tagcheck
shell: bash
run: |
VERSION="${{ steps.version.outputs.value }}"
if git rev-parse "v$VERSION" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
build:
name: Build ${{ matrix.platform }}
needs: detect
if: |
needs.detect.outputs.should_release == 'true' &&
needs.detect.outputs.tag_exists != 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
platform: linux
target: node18-linux-x64
output: ncm-api-linux-x64
- os: windows-latest
platform: windows
target: node18-win-x64
output: ncm-api-win-x64.exe
- os: macos-latest
platform: macos
target: node18-macos-x64
output: ncm-api-macos-x64
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v6
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 24
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build binary
shell: bash
env:
PKG_TARGET: ${{ matrix.target }}
run: |
mkdir -p release-artifacts
case "${{ matrix.platform }}" in
linux)
npm run pkglinux
mv precompiled/app "release-artifacts/${{ matrix.output }}"
;;
windows)
npm run pkgwin
mv precompiled/app.exe "release-artifacts/${{ matrix.output }}"
;;
macos)
npm run pkgmacos
mv precompiled/app "release-artifacts/${{ matrix.output }}"
;;
esac
- name: Upload build artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.platform }}-binary
path: release-artifacts/*
release:
name: Create GitHub Release
needs:
- detect
- build
if: |
needs.detect.outputs.should_release == 'true' &&
needs.detect.outputs.tag_exists != 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
fetch-tags: true
- name: Download build artifacts
uses: actions/download-artifact@v8
with:
path: release-artifacts
merge-multiple: true
- name: List flattened artifacts
shell: bash
run: |
mkdir -p final-artifacts
cp release-artifacts/* final-artifacts/
ls -lah final-artifacts
- name: Generate release notes
shell: bash
run: |
VERSION="${{ needs.detect.outputs.version }}"
PREV_TAG=$(git tag --sort=-v:refname | head -1)
{
echo "# Release v${VERSION}"
echo ""
echo "## 更新内容 / Changelog"
echo ""
if [ -n "$PREV_TAG" ]; then
echo "从 \`$PREV_TAG\` 到 \`v$VERSION\` 的提交记录:"
echo ""
git log "$PREV_TAG..HEAD" \
--no-merges \
--pretty=format:"- %s (%h)"
else
echo "首次发布,包含以下提交:"
echo ""
git log \
--no-merges \
--pretty=format:"- %s (%h)"
fi
echo ""
echo ""
echo "---"
echo "自动发布 via GitHub Actions"
} > release-notes.md
cat release-notes.md
- name: Create Git tag
run: |
git tag "v${{ needs.detect.outputs.version }}"
git push origin "v${{ needs.detect.outputs.version }}"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ needs.detect.outputs.version }}
name: Release v${{ needs.detect.outputs.version }}
body_path: release-notes.md
files: final-artifacts/*
draft: false
prerelease: false
publish-docker:
name: Publish Docker Image
needs: detect
if: |
needs.detect.outputs.should_release == 'true' &&
needs.detect.outputs.tag_exists != 'true'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Read package version
id: pkg
run: echo "VERSION=$(jq -r .version package.json)" >> $GITHUB_ENV
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
context: .
push: true
tags: |
moefurina/ncm-api:latest
moefurina/ncm-api:${{ env.VERSION }}
ghcr.io/neteasecloudmusicapienhanced/ncm-api:latest
ghcr.io/neteasecloudmusicapienhanced/ncm-api:${{ env.VERSION }}
platforms: linux/amd64,linux/arm64/v8
publish-npm:
name: Publish to npm
needs: detect
if: |
needs.detect.outputs.should_release == 'true' &&
needs.detect.outputs.tag_exists != 'true'
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
with:
version: 9
- uses: actions/setup-node@v6
with:
node-version: 24
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm publish --access public --provenance
+36
View File
@@ -0,0 +1,36 @@
name: Upstream Sync
permissions:
contents: write
on:
schedule:
- cron: "0 4 * * *" # At 12PM UTC+8
workflow_dispatch:
jobs:
sync_latest_from_upstream:
name: Sync latest commits from upstream repo
runs-on: ubuntu-latest
if: ${{ github.event.repository.fork }}
steps:
# Step 1: run a standard checkout action
- name: Checkout target repo
uses: actions/checkout@v6
# Step 2: run the sync action
- name: Sync upstream changes
id: sync
uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.3
with:
upstream_sync_repo: NeteaseCloudMusicApiEnhanced/api-enhanced
upstream_sync_branch: main
target_sync_branch: main
target_repo_token: ${{ secrets.GITHUB_TOKEN }}
- name: Sync check
if: failure()
run: |
echo "[Error] Due to a change in the workflow file of the upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork."
exit 1
+2
View File
@@ -8,3 +8,5 @@ examples/moddef.json
bin
anonymous_token
.vercel
.env
IFLOW.md
+1 -1
View File
@@ -1,4 +1,4 @@
language: node_js
node_js:
- 12
- 22
+23
View File
@@ -0,0 +1,23 @@
# Agent Instructions for NeteaseCloudMusicApiEnhanced
## Quick Start
- **Package Manager**: Use `pnpm` (not npm or yarn).
- **Node Version**: Requires Node.js 18 or later.
## Developer Commands
- **Install dependencies**: `pnpm i`
- **Start server**: `pnpm start` or `node app.js`
- **Start dev server**: `pnpm dev` (uses nodemon)
- **Run tests**: `pnpm test` (uses Mocha)
- **Linting**: `pnpm lint` (check) or `pnpm lint-fix` (auto-fix)
## Architecture & Entrypoints
- **Executable Server**: `app.js` is the main entrypoint for running the API server.
- **Module Exports**: `main.js` is the entrypoint when the project is imported as a Node.js dependency.
- **API Endpoints**: Located in the `module/` directory. Each file typically corresponds to an API route.
- **Core Utilities**: Request handling, encryption, and core utilities are found in the `util/` directory.
## Important Gotchas & Quirks
- **Environment Variables**: The server defaults to port 3000 but can be overridden with the `PORT` environment variable.
- **Proxy Variables**: Be very careful with proxy environment variables (`http_proxy`, `https_proxy`, `no_proxy`). The request library (like axios) will automatically pick these up. If they point to an unavailable proxy (especially common in Docker environments), requests will fail silently or throw connection errors.
- **Code Style**: The project uses ESLint and Prettier. Always run `pnpm lint-fix` before committing changes to ensure formatting consistency.
-1390
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -13,4 +13,4 @@ RUN yarn --network-timeout=100000
EXPOSE 3000
CMD [ "/sbin/tini", "--", "node", "app.js" ]
CMD [ "/sbin/tini", "--", "node", "app.js" ]
+184 -501
View File
@@ -1,76 +1,90 @@
# 网易云音乐 API
网易云音乐 Node.js API service
<p>
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/npm/v/NeteaseCloudMusicApi.svg" alt="Version"></a>
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/npm/l/NeteaseCloudMusicApi.svg" alt="License"></a>
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/david/dev/binaryify/NeteaseCloudMusicApi.svg" alt="devDependencies" ></a>
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/david/binaryify/NeteaseCloudMusicApi.svg" alt="devDependencies" ></a>
<a href="https://codeclimate.com/github/Binaryify/NeteaseCloudMusicApi"><img src="https://codeclimate.com/github/Binaryify/NeteaseCloudMusicApi/badges/gpa.svg" /></a>
<p align="center">
<img src="./public/static/neteaselogo.png" alt="网易云音乐 API Enhanced Logo" />
</p>
## 灵感来自
<p align="center">
<a href="https://www.npmjs.com/package/@neteasecloudmusicapienhanced/api">
<img src="https://img.shields.io/npm/v/@neteasecloudmusicapienhanced/api?style=flat-square" alt="NPM Version" />
</a>
<a href="https://www.npmjs.com/package/@neteasecloudmusicapienhanced/api">
<img src="https://img.shields.io/npm/dm/@neteasecloudmusicapienhanced/api?style=flat-square" alt="NPM Downloads" />
</a>
<a href="https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced">
<img src="https://img.shields.io/github/license/NeteaseCloudMusicApiEnhanced/api-enhanced?style=flat-square" alt="License" />
</a>
<a href="https://nodejs.org/">
<img src="https://img.shields.io/node/v/@neteasecloudmusicapienhanced/api?style=flat-square" alt="Node Version" />
</a>
<a href="https://hub.docker.com/r/moefurina/ncm-api">
<img src="https://img.shields.io/docker/v/moefurina/ncm-api?style=flat-square" alt="Docker Version" />
</a>
<a href="https://hub.docker.com/r/moefurina/ncm-api">
<img src="https://img.shields.io/docker/pulls/moefurina/ncm-api?style=flat-square" alt="Docker Pulls" />
</a>
<a href="https://www.typescriptlang.org/">
<img src="https://img.shields.io/badge/TypeScript-Ready-blue?style=flat-square&logo=typescript" alt="TypeScript" />
</a>
</p>
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
[darknessomi/musicbox](https://github.com/darknessomi/musicbox)
[sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node)
## 项目简介
[greats3an/pyncm](https://github.com/greats3an/pyncm)
网易云音乐第三方 Node.js API, 支持丰富的音乐相关接口,适合自建服务、二次开发和多平台部署
## 环境要求
> [!IMPORTANT]
>
> ## 注意
>
> - 本项目是自由项目, 不带任何担保, 在基于`MIT License`的许可下, 任何人都可以自由使用、修改和分发本项目的代码, 包括用于商业目的.
> - 该项目是个合作计划, 有很多人参与了此次贡献, 前往 [Contributors](https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced/graphs/contributors) 页面查看所有贡献者
> - 原作者项目 [Binaryify/NeteaseCloudMusicApi](https://github.com/binaryify/NeteaseCloudMusicApi) 并非完全停止维护, 你可以在 [NeteaseCloudMusicApi 的 NPMJS 页面](https://www.npmjs.com/package/NeteaseCloudMusicApi) 查看最新版本信息。
> - 感谢尊重和理解!
需要 NodeJS 18+ 环境
## 快速开始
## 安装
### 环境要求
```shell
$ git clone git@gitlab.com:Binaryify/NeteaseCloudMusicApi.git
$ cd NeteaseCloudMusicApi
$ npm install
```
- Node.js 22 及以上
- 推荐使用 pnpm 进行依赖管理
或者
```shell
$ git clone https://gitlab.com/Binaryify/NeteaseCloudMusicApi.git
$ cd NeteaseCloudMusicApi
$ npm install
```
## 运行
调用前务必阅读文档的`调用前须知`
```shell
$ node app.js
```
服务器启动默认端口为 3000,若不想使用 3000 端口,可使用以下命令: Mac/Linux
```shell
$ PORT=4000 node app.js
```
windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
```shell
$ set PORT=4000 && node app.js
```
## npx 方式运行
可在终端直接执行
### 安装
```bash
npx NeteaseCloudMusicApi@latest
git clone https://github.com/neteasecloudmusicapienhanced/api-enhanced.git
cd api-enhanced
pnpm i
```
使用此命令,可直接启动服务,无需下载或者 clone 项目
### 启动服务
## Docker 容器运行
```bash
# 默认端口 3000
node app.js
# 指定端口(如 4000)
PORT=4000 node app.js # Mac/Linux
set PORT=4000 && node app.js # Windows
```
### 重要提示
- 调用前请务必阅读文档的 [调用前须知](https://neteasecloudmusicapienhanced.js.org/#/?id=%e8%b0%83%e7%94%a8%e5%89%8d%e9%a1%bb%e7%9f%a5) 部分。
- 推荐将敏感信息(如 cookie)通过部署平台的环境变量进行配置。
## 在线体验与文档
- [在线文档](https://neteasecloudmusicapienhanced.js.org/)
- [NPM 包地址](https://www.npmjs.com/package/@neteasecloudmusicapienhanced/api)
- [Dockerhub 主页](https://hub.docker.com/r/moefurina/ncm-api)
## 常见部署方式
- 推荐参考[在线文档](https://neteasecloudmusicapienhanced.js.org/)
## Docker 部署说明
本项目支持通过 Docker 一键部署,无需手动安装 Node.js 或依赖。
> 注意: 在 docker 中运行的时候, 由于使用了 request 来发请求, 所以会检查几个 proxy 相关的环境变量(如下所列), 这些环境变量 会影响到 request 的代理, 详情请参考[request 的文档](https://github.com/request/request#proxies), 如果这些环境变量 指向的代理不可用, 那么就会造成错误, 所以在使用 docker 的时候一定要注意这些环境变量. 不过, 要是你在 query 中加上了 proxy 参数, 那么环境变量会被覆盖, 就会用你通过 proxy 参数提供的代理了.
@@ -84,487 +98,156 @@ request 相关的环境变量
6. NO_PROXY
```shell
docker pull binaryify/netease_cloud_music_api
docker pull moefurina/ncm-api:latest
docker run -d -p 3000:3000 --name netease_cloud_music_api binaryify/netease_cloud_music_api
docker run -d -p 3000:3000 --name ncm-api moefurina/ncm-api:latest
// 或者
docker run -d -p 3000:3000 binaryify/netease_cloud_music_api
docker run -d -p 3000:3000 moefurina/ncm-api:latest
// 去掉或者设置相关的环境变量
docker run -d -p 3000:3000 --name netease_cloud_music_api -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
docker run -d -p 3000:3000 --name ncm-api -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= moefurina/ncm-api:latest
// 或者
docker run -d -p 3000:3000 -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
docker run -d -p 3000:3000 -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= moefurina/ncm-api:latest
```
> 以下是自行 build docker 镜像方式
```
$ git clone https://gitlab.com/Binaryify/neteasecloudmusicapi.git && cd NeteaseCloudMusicApi
```shell
$ git clone https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced && cd api-enhanced
$ sudo docker build . -t netease-music-api
$ sudo docker build . -t ncm-api
$ sudo docker run -d -p 3000:3000 netease-music-api
## Vercel 部署
v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器
### 操作方法
1. fork 此项目
2. 在 Vercel 官网点击 `New Project`
3. 点击 `Import Git Repository` 并选择你 fork 的此项目并点击`import`
4. 点击 `PERSONAL ACCOUNT` 的 `select`
5. 直接点`Continue`
6. `PROJECT NAME`自己填,`FRAMEWORK PRESET` 选 `Other` 然后直接点 `Deploy` 接着等部署完成即可
## 腾讯云 serverless 部署
因 `Vercel` 在国内访问太慢,在此提供腾讯云 serverless 部署方法(注意:腾讯云 serverless 并不是免费的,前三个月有免费额度,之后收费)
### 操作方法
1. fork 此项目
2. 在腾讯云 serverless 应用管理页面( https://console.cloud.tencent.com/sls ),点击`新建应用`
3. 顶部`创建方式`选择 `Web 应用`
4. 选择 `Express框架`,点击底部`下一步按钮`
5. 输入`应用名`,上传方式选择`代码仓库`,进行 GitHub 授权(如已授权可跳过这一步),代码仓库选择刚刚 fork 的项目
6. 启动文件填入:
```
#!/bin/bash
export PORT=9000
/var/lang/node16/bin/node app.js
$ sudo docker run -d -p 3000:3000 ncm-api
```
7. 点击`完成`,等待部署完成,点击`资源列表`的 `API网关` 里的 `URL`,正常情况会打开文档地址,点击文档`例子`可查看接口调用效果
## 3. 环境变量
## 可以在 Node.js 调用
| 变量名 | 默认值 | 说明 |
|----------------------------|--------------------------------------|----------------------------------------------------|
| **CORS_ALLOW_ORIGIN** | `*` | 允许跨域请求的域名。可填写单个源,或使用逗号分隔多个源(例如 `https://a.com,https://b.com`)。 |
| **ENABLE_PROXY** | `false` | 是否启用反向代理功能。 |
| **PROXY_URL** | `https://your-proxy-url.com/?proxy=` | 代理服务地址。仅当 `ENABLE_PROXY=true` 时生效。 |
| **ENABLE_RANDOM_CN_IP** | `false` | 是否默认启用随机中国IP。启用后,所有请求默认使用随机中国IP,除非请求参数 `randomCNIP` 显式关闭。 |
| **ENABLE_GENERAL_UNBLOCK** | `true` | 是否启用全局解灰(推荐开启)。开启后所有歌曲都尝试自动解锁。 |
| **ENABLE_FLAC** | `true` | 是否启用无损音质(FLAC)。 |
| **SELECT_MAX_BR** | `false` | 启用无损音质时,是否选择最高码率音质。 |
| **FOLLOW_SOURCE_ORDER** | `true` | 是否严格按照音源列表顺序进行匹配。 |
v3.31.0 后支持 Node.js 调用,导入的方法为`module`内的文件名,返回内容包含`status`和`body`,`status`为状态码,`body`为请求返回内容,参考`module_example` 文件夹下的 `test.js`
---
### 4. 更新镜像
更新到最新版本:
```bash
docker pull moefurina/ncm-api:latest
docker stop ncm-api && docker rm ncm-api
docker run -d -p 3000:3000 moefurina/ncm-api:latest
```
## Vercel 一键部署
1. fork 本项目
2. 在 Vercel 官网新建项目,导入 fork 的仓库
3. 直接 Deploy
## 腾讯云 Serverless 部署
1. fork 本项目
2. 在腾讯云 serverless 控制台新建 Web 应用,选择 Express 框架
3. 代码仓库选择 fork 的项目,启动文件填写:
```bash
#!/bin/bash
export PORT=9000
/var/lang/node16/bin/node app.js
```
4. 完成部署后,访问 API 网关的 URL 即可
## Node.js 方式调用
支持直接在 Node.js 项目中引入和调用,返回 Promise:
```js
const { login_cellphone, user_cloud } = require('NeteaseCloudMusicApi')
const {
login_cellphone,
user_cloud,
} = require('@neteasecloudmusicapienhanced/api')
async function main() {
try {
const result = await login_cellphone({
phone: '手机号',
password: '密码',
})
console.log(result)
const result2 = await user_cloud({
cookie: result.body.cookie, // 凭证
})
console.log(result2.body)
} catch (error) {
console.log(error)
}
const result = await login_cellphone({ phone: '手机号', password: '密码' })
console.log(result)
const result2 = await user_cloud({ cookie: result.body.cookie })
console.log(result2.body)
}
main()
```
## 支持 TypeScript
## TypeScript 支持
```ts
// test.ts
import { banner } from 'NeteaseCloudMusicApi'
banner({ type: 0 }).then((res) => {
console.log(res)
})
import { banner } from '@neteasecloudmusicapienhanced/api'
banner({ type: 0 }).then((res) => console.log(res))
```
## 使用文档
[文档地址](https://docs-neteasecloudmusicapi.vercel.app)
## 调试工具
- `eapi` 请求参数或返回内容可在 `/eapi_decrypt.html` 里解析
- 请求参数模式下, 解密结果可直接带到 `/api.html` 继续调试
- 需要返回值加密时, 可传 `e_r=1`, `weapi` 和 `eapi` 都支持
## 功能特性
1. 登录
2. 刷新登录
3. 发送验证码
4. 校验验证码
5. 注册(修改密码)
6. 获取用户信息 , 歌单,收藏,mv, dj 数量
7. 获取用户歌单
8. 获取用户电台
9. 获取用户关注列表
10. 获取用户粉丝列表
11. 获取用户动态
12. 获取用户播放记录
13. 获取精品歌单
14. 获取歌单详情
15. 搜索
16. 搜索建议
17. 获取歌词
18. 歌曲评论
19. 收藏单曲到歌单
20. 专辑评论
21. 歌单评论
22. mv 评论
23. 电台节目评论
24. banner
25. 获取歌曲详情
26. 获取专辑内容
27. 获取歌手单曲
28. 获取歌手 mv
29. 获取歌手专辑
30. 获取歌手描述
31. 获取相似歌手
32. 获取相似歌单
33. 相似 mv
34. 获取相似音乐
35. 获取最近 5 个听了这首歌的用户
36. 获取每日推荐歌单
37. 获取每日推荐歌曲
38. 私人 FM
39. 签到
40. 喜欢音乐
41. 垃圾桶
42. 歌单 ( 网友精选碟 )
43. 新碟上架
44. 热门歌手
45. 最新 mv
46. 推荐 mv
47. 推荐歌单
48. 推荐新音乐
49. 推荐电台
50. 推荐节目
51. 独家放送
52. mv 排行
53. 获取 mv 数据
54. 播放 mv/视频
55. 排行榜
56. 歌手榜
57. 云盘
58. 电台 - 推荐
59. 电台 - 分类
60. 电台 - 分类推荐
61. 电台 - 订阅
62. 电台 - 详情
63. 电台 - 节目
64. 给评论点赞
65. 获取动态列表
66. 热搜列表(简略)
67. 发送私信
68. 发送私信歌单
69. 新建歌单
70. 收藏/取消收藏歌单
71. 歌单分类
72. 收藏的歌手列表
73. 订阅的电台列表
74. 相关歌单
75. 付费精选接口
76. 音乐是否可用检查接口
77. 登录状态
78. 获取视频播放地址
79. 发送/删除评论
80. 热门评论
81. 视频评论
82. 退出登录
83. 所有榜单
84. 所有榜单内容摘要
85. 收藏视频
86. 收藏 MV
87. 视频详情
88. 相关视频
89. 关注用户
90. 新歌速递
91. 喜欢音乐列表(无序)
92. 收藏的 MV 列表
93. 获取最新专辑
94. 听歌打卡
95. 获取视频标签/分类下的视频
96. 已收藏专辑列表
97. 获取动态评论
98. 歌单收藏者列表
99. 云盘歌曲删除
100. 热门话题
101. 电台 - 推荐类型
102. 电台 - 非热门类型
103. 电台 - 今日优选
104. 心动模式/智能播放
105. 转发动态
106. 删除动态
107. 分享歌曲、歌单、mv、电台、电台节目到动态
108. 通知-私信
109. 通知-评论
110. 通知-@我
111. 通知-通知
112. 设置
113. 云盘数据详情
114. 私信内容
115. 我的数字专辑
116. batch 批量请求接口
117. 获取视频标签列表
118. 全部 mv
119. 网易出品 mv
120. 收藏/取消收藏专辑
121. 专辑动态信息
122. 热搜列表(详细)
123. 更换绑定手机
124. 检测手机号码是否已注册
125. 初始化昵称
126. 更新歌单描述
127. 更新歌单名
128. 更新歌单标签
129. 默认搜索关键词
130. 删除歌单
131. 电台 banner
132. 用户电台
133. 热门电台
134. 电台 - 节目详情
135. 电台 - 节目榜
136. 电台 - 新晋电台榜/热门电台榜
137. 类别热门电台
138. 云村热评(官方下架,暂不能用)
139. 电台 24 小时节目榜
140. 电台 24 小时主播榜
141. 电台最热主播榜
142. 电台主播新人榜
143. 电台付费精品榜
144. 歌手热门 50 首歌曲
145. 购买数字专辑
146. 获取 mv 点赞转发评论数数据
147. 获取视频点赞转发评论数数据
148. 调整歌单顺序
149. 调整歌曲顺序
150. 独家放送列表
151. 获取推荐视频
152. 获取视频分类列表
153. 获取全部视频列表接口
154. 获取历史日推可用日期列表
155. 获取历史日推详细数据
156. 国家编码列表
157. 首页-发现
158. 首页-发现-圆形图标入口列表
159. 全部新碟
160. 数字专辑-新碟上架
161. 数字专辑&数字单曲-榜单
162. 数字专辑-语种风格馆
163. 数字专辑详情
164. 更新头像
165. 歌单封面上传
166. 楼层评论
167. 歌手全部歌曲
168. 精品歌单标签列表
169. 用户等级信息
170. 电台个性推荐
171. 用户绑定信息
172. 用户绑定手机
173. 新版评论
174. 点赞过的视频
175. 收藏视频到视频歌单
176. 删除视频歌单里的视频
177. 最近播放的视频
178. 音乐日历
179. 电台订阅者列表
180. 云贝签到信息
181. 云贝签到
182. 云贝所有任务
183. 云贝 todo 任务
184. 云贝今日签到信息
185. 云贝完成任务
186. 云贝收入
187. 云贝支出
188. 云贝账户信息
189. 账号信息
190. 最近联系人
191. 私信音乐
192. 抱一抱评论
193. 评论抱一抱列表
194. 收藏的专栏
195. 关注歌手新歌
196. 关注歌手新 MV
197. 歌手详情
198. 云盘上传
199. 二维码登录
200. 话题详情
201. 话题详情热门动态
202. 歌单详情动态
203. 绑定手机
204. 一起听状态
205. 用户历史评论
206. 云盘歌曲信息匹配纠正
207. 云贝推歌
208. 云贝推歌历史记录
209. 已购单曲
210. 获取 mlog 播放地址
211. 将 mlog id 转为视频 id
212. vip 成长值
213. vip 成长值获取记录
214. vip 任务
215. 领取 vip 成长值
216. 歌手粉丝
217. 数字专辑详情
218. 数字专辑销量
219. 音乐人数据概况
220. 音乐人播放趋势
221. 音乐人任务
222. 账号云豆数
223. 领取云豆
224. 获取 VIP 信息
225. 音乐人签到
226. 获取客户端歌曲下载 url
227. 获取歌单所有歌曲
228. 乐签信息
229. 获取歌手视频
230. 最近播放-歌曲
231. 最近播放-视频
232. 最近播放-声音
233. 最近播放-歌单
234. 最近播放-专辑
235. 最近播放-播客
236. 签到进度
237. 重复昵称检测
238. 歌手粉丝数量
239. 音乐人任务(新)
240. 内部版本接口
241. 歌单更新播放量
242. 黑胶时光机
243. 音乐百科 - 简要信息
244. 乐谱列表
245. 乐谱内容
246. 曲风列表
247. 曲风偏好
248. 曲风详情
249. 曲风-歌曲
250. 曲风-专辑
251. 曲风-歌单
252. 曲风-歌手
253. 私信和通知接口
254. 回忆坐标
255. 播客搜索
256. 播客声音上传
257. 验证接口-二维码生成
258. 验证接口-二维码检测
259. 听歌识曲
260. 根据nickname获取userid接口
261. 播客声音列表
262. 专辑简要百科信息
263. 歌曲简要百科信息
264. 歌手简要百科信息
265. mv简要百科信息
266. 搜索歌手
267. 用户贡献内容
268. 用户贡献条目、积分、云贝数量
269. 年度听歌报告
270. 播客声音搜索
271. 播客声音排序
272. 播客列表详情
273. 本地歌曲文件匹配网易云歌曲信息
274. 歌曲音质详情
275. 歌曲红心数量
276. 私人 FM 模式选择
277. 播客删除
278. 电台排行榜获取
279. 获取声音歌词
280. 获取专辑歌曲的音质
281. 歌手动态信息
282. 最近听歌列表
283. 云盘导入歌曲
284. 获取客户端歌曲下载链接 - 新版
285. 当前账号关注的用户/歌手
286. 会员下载歌曲记录
287. 会员本月下载歌曲记录
288. 已购买单曲
289. 歌曲是否喜爱
290. 用户是否互相关注
291. 歌曲动态封面
292. 用户徽章
293. 用户状态
294. 用户状态 - 支持设置的状态
295. 用户状态 - 相同状态的用户
296. 用户状态 - 编辑
297. 听歌足迹 - 年度听歌足迹
298. 听歌足迹 - 今日收听
299. 听歌足迹 - 总收听时长
300. 听歌足迹 - 本周/本月收听时长
301. 听歌足迹 - 周/月/年收听报告
302. 歌单导入 - 元数据/文字/链接导入
303. 歌单导入 - 任务状态
304. 副歌时间
305. 相关歌单推荐
306. 歌词摘录 - 歌词摘录信息
307. 歌词摘录 - 我的歌词本
308. 歌词摘录 - 添加/修改摘录歌词
309. 歌词摘录 - 删除摘录歌词
310. 广播电台 - 分类/地区信息
311. 广播电台 - 我的收藏
312. 广播电台 - 电台信息
313. 广播电台 - 全部电台
314. 广播电台 - 收藏/取消收藏电台
315. 用户的创建歌单列表
316. 用户的收藏歌单列表
317. DIFM电台 - 分类
318. DIFM电台 - 收藏列表
319. DIFM电台 - 收藏频道
320. DIFM电台 - 取消收藏频道
321. DIFM电台 - 播放列表
322. 助眠解压 - 特定时间场景下的推荐资源
323. 助眠解压 - 标签列表
324. 助眠解压 - 获取标签下资源列表
325. 助眠解压 - 查看同类推荐
326. 助眠解压 - 收藏
327. 助眠解压 - 收藏列表
328. 跑步漫游
329. 歌曲创作者信息
330. 获取用户详情
331. 更新用户信息
332. 更新歌单
333. 歌手分类列表
334. 收藏/取消收藏歌手
335. 获取音乐 url
336. 获取音乐 url - 新版
337. 搜索多重匹配
338. 对歌单添加或删除歌曲
339. 获取逐字歌词
340. 资源点赞( MV,电台,视频)
341. 每日推荐歌曲-不感兴趣
342. mv 地址
343. 排行榜详情
344. 电台 - 付费精品
345. 电台 - 付费精选
346. 发送私信(带专辑)
347. 云贝
348. 一起听相关
349. 获取 VIP 信息(app端)
350. 公开隐私歌单
351. 云村星评馆 - 简要评论
352. 私人 DJ
353. 播客列表
354. 播客声音详情
355. 多级行政区划数据
356. 指定维度音乐排行榜详情
357. 指定维度音乐排行榜列表
## 单元测试
```shell
$ npm test
```bash
pnpm test
```
## SDK
## 主要功能特性
| 语言 | 作者 | 地址 | 类型 |
| :----: | :-----------------------------------------: | :--------------------------------------------------------------------------------------------------------: | :----: |
| Java | [JackuXL](https://github.com/JackuXL) | [https://github.com/JackuXL/NeteaseCloudMusicApi-SDK](https://github.com/JackuXL/NeteaseCloudMusicApi-SDK) | 第三方 |
| Java | [1015770492](https://github.com/1015770492) | https://github.com/1015770492/yumbo-music-utils | 第三方 |
| Python | [盧瞳](https://github.com/2061360308) | [NeteaseCloudMusic_PythonSDK](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK) | 第三方 |
- 登录/注册/验证码
- 用户信息、歌单、动态、播放记录
- 歌曲、专辑、歌手、MV、歌词、评论、排行榜
- 搜索、推荐、私人 FM、签到、云盘
- 歌曲解锁(解灰)
## 贡献者
## 贡献与社区
![](https://opencollective.com/NeteaseCloudMusicApi/contributors.svg?width=890)
- 欢迎提交 PR、Issue 参与维护
- 要贡献新接口, 请参考[这篇文章](https://www.focalors.ltd/post/how-to-contribute-ncm-api)
### 致谢
原作者 [Binaryify/NeteaseCloudMusicApi](https://github.com/binaryify/NeteaseCloudMusicApi) 项目为本项目基础 (该项目在`npmjs`网站上仍持续维护, 但 github 仓库已不再更新)
感谢大佬们为逆向eapi, weapi, xeapi等加密算法所做的贡献
项目参考:
[trazyn/ieaseMusic](https://github.com/trazyn/ieaseMusic)
[listen1/listen1_chrome_extension](https://github.com/listen1/listen1_chrome_extension)
[chaunsin/netease-cloud-music](https://github.com/chaunsin/netease-cloud-music)
[folltoshe/netease-report-listen-song](https://github.com/folltoshe/netease-report-listen-song)
### SDK 生态
| 语言 | 作者 | 地址 | 类型 |
|--------|---------------------------------------------|------------------------------------------------------------------------------------------|-----|
| Java | [JackuXL](https://github.com/JackuXL) | [NeteaseCloudMusicApi-SDK](https://github.com/JackuXL/NeteaseCloudMusicApi-SDK) | 第三方 |
| Java | [1015770492](https://github.com/1015770492) | [yumbo-music-utils](https://github.com/1015770492/yumbo-music-utils) | 第三方 |
| Python | [盧瞳](https://github.com/2061360308) | [NeteaseCloudMusic_PythonSDK](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK) | 第三方 |
| Swift | [Lincb522](https://github.com/Lincb522) | [NeteaseCloudMusicApi-Swift](https://github.com/Lincb522/NeteaseCloudMusicAPI-Swift) | 第三方 |
| Rust | [SPlayer-Dev](https://github.com/splayer-dev) | [ncm-api-rs](https://github.com/SPlayer-Dev/ncm-api-rs) | 第三方 |
### 依赖此项目的优秀开源项目
- [qier2222/YesPlayMusic](https://github.com/qier222/YesPlayMusic)
- [MaigoLabs/amaoke.app](https://github.com/MaigoLabs/amaoke.app)
- [Yueby/music-together](https://github.com/Yueby/music-together)
- [chthollyphlie/folia-major](https://github.com/chthollyphile/folia-major)
## License
[The MIT License (MIT)](https://gitlab.com/Binaryify/NeteaseCloudMusicApi/blob/main/LICENSE)
[MIT License](https://github.com/MoeFurina/NeteaseCloudMusicApiEnhanced/blob/main/LICENSE)
File diff suppressed because it is too large Load Diff
+91
View File
@@ -0,0 +1,91 @@
const { defineConfig, globalIgnores } = require('eslint/config')
const html = require('eslint-plugin-html')
const globals = require('globals')
const tsParser = require('@typescript-eslint/parser')
const js = require('@eslint/js')
const { FlatCompat } = require('@eslint/eslintrc')
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
})
module.exports = defineConfig([
{
languageOptions: {
ecmaVersion: 2020,
sourceType: 'module',
parserOptions: {
parser: 'babel-eslint',
},
globals: {
...globals.browser,
...globals.node,
},
},
plugins: {
html,
},
extends: compat.extends('plugin:prettier/recommended'),
rules: {
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
indent: [
'error',
2,
{
SwitchCase: 1,
},
],
'space-infix-ops': [
'error',
{
int32Hint: false,
},
],
'key-spacing': [
2,
{
beforeColon: false,
afterColon: true,
},
],
'no-octal': 2,
'no-redeclare': 2,
'comma-spacing': 2,
'no-new-object': 2,
'arrow-spacing': 2,
quotes: [
2,
'single',
{
avoidEscape: true,
allowTemplateLiterals: true,
},
],
},
},
globalIgnores(['**/public/']),
{
files: ['**/*.ts'],
languageOptions: {
parser: tsParser,
},
extends: compat.extends('plugin:@typescript-eslint/recommended'),
},
])
+2 -1
View File
@@ -1,6 +1,7 @@
const fsPromises = require('fs/promises')
const path = require('path')
const server = require('../server')
const logger = require('../util/logger.js')
const exportFile = path.join(__dirname, 'moddef.json')
@@ -16,7 +17,7 @@ async function main() {
)
fsPromises.writeFile(exportFile, JSON.stringify(def, null, 4))
console.log(`👍 Get your own definition at: ${exportFile}`)
logger.info(`👍 Get your own definition at: ${exportFile}`)
}
main()
+17
View File
@@ -2,6 +2,7 @@ const fs = require('fs')
const path = require('path')
const { register_anonimous } = require('./main')
const { cookieToJson, generateRandomChineseIP } = require('./util/index')
const { getXeapiPublicKey } = require('./util/xeapiKey')
const tmpPath = require('os').tmpdir()
async function generateConfig() {
@@ -20,5 +21,21 @@ async function generateConfig() {
} catch (error) {
console.log(error)
}
try {
let currentPublicKey = {}
try {
currentPublicKey = JSON.parse(
fs.readFileSync(path.resolve(tmpPath, 'xeapi_public_key'), 'utf-8'),
)
} catch (_) {}
const publicKey = await getXeapiPublicKey(currentPublicKey, global.deviceId)
fs.writeFileSync(
path.resolve(tmpPath, 'xeapi_public_key'),
JSON.stringify(publicKey),
'utf-8',
)
} catch (error) {
console.log(error)
}
}
module.exports = generateConfig
+1
View File
@@ -0,0 +1 @@
import './app.js'
+756
View File
@@ -2,6 +2,7 @@ export interface RequestBaseConfig {
cookie?: string
realIP?: string // IPv4/IPv6 filled in X-Real-IP
proxy?: string // HTTP proxy
randomCNIP?: boolean // Whether to use a random Chinese IP address filled in X-Real-IP
}
export interface MultiPageConfig {
@@ -1165,6 +1166,13 @@ export function song_url_v1(
params: { id: string | number; level: SoundQualityType } & RequestBaseConfig,
): Promise<Response>
export function song_copyright_rcmd(
params: {
songid?: string | number
id?: string | number
} & RequestBaseConfig,
): Promise<Response>
export function top_album(
params: {
area?: AlbumListArea
@@ -1466,6 +1474,20 @@ export function artist_new_song(
} & RequestBaseConfig,
): Promise<Response>
export function artist_new_song_playall(
params: RequestBaseConfig,
): Promise<Response>
export function artist_new_song_mv_list_v2(
params: {
startTimestamp?: number | string
before?: number | string
sourceType?: number | string
limit?: number | string
firstRequest?: boolean | string
} & RequestBaseConfig,
): Promise<Response>
export function artist_detail(
params: {
id: number | string
@@ -1586,6 +1608,10 @@ export function vip_growthpoint_get(
} & RequestBaseConfig,
): Promise<Response>
export function vip_growthpoint_getall(
params: RequestBaseConfig,
): Promise<Response>
export function artist_fans(
params: { id: number | string } & MultiPageConfig & RequestBaseConfig,
): Promise<Response>
@@ -1714,6 +1740,8 @@ export function nickname_check(
export function musician_tasks_new(params: RequestBaseConfig): Promise<Response>
export function musician_vip_tasks(params: RequestBaseConfig): Promise<Response>
export function playlist_update_playcount(
params: {
id?: number | string
@@ -1831,3 +1859,731 @@ 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_song_play_rank(
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>
-29
View File
@@ -1,29 +0,0 @@
## 环境
- 系统/平台: <你的系统和平台>
- nodejs 版本: <你的 NodeJS 版本号>
- API版本:<运行的云音乐 API 的版本号, 对应 package.json 里面的 version>
## 出现问题
<出现的问题>
## 重现步骤
<重现步骤>
## 期待效果
<现在的效果,期待的效果>
>先看文档有没有相关说明,调用前须知必看
>先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭
>不处理别人搭建的线上服务的问题,此项目不提供任何线上服务,请自行搭建
>重现步骤尽量详细,不能含糊不清,包含请求地址和对应参数以及操作过程描述,不是每个人都喜欢猜别人遇到了什么问题和找参数一个个试,也比较浪费时间
>如果不是提建议,提 issues 如果不照着模版来将不会优先处理或直接关闭
>460 cheating 的问题把 `util/request.js` 里面的 `headers['X-Real-IP']` 的注释取消掉就好
+43
View File
@@ -0,0 +1,43 @@
// 获取广告
// 基于逆向网易云音乐 v9.5.45 RN Hermes 源码:
// - adService.getAd() → Network.nativeRequest → /api/ad/get
// - 需要 X-antiCheatToken 易盾反作弊头
// - 使用 xeapi 加密
//
// 返回 extra.reqId 可用于 ad_listening_rights_gain 的 reqUid
//
const createOption = require('../util/option.js')
module.exports = async (query, request) => {
const data = {
type_ids: query.type_ids || '["400002_0"]',
}
const option = createOption(query, 'xeapi')
option.checkToken = true
const res = await request(`/api/ad/get`, data, option)
const raw = res.body
// 提取广告中的 req_id (用于领取权益)
let reqId = ''
try {
if (raw?.ads) {
const ad = Object.values(raw.ads)[0]
if (ad?.extJson) {
const ext = JSON.parse(ad.extJson)
reqId = ext?.contextInfo?.req_id || ''
}
}
} catch (_) {}
return {
status: 200,
body: {
code: 200,
ads: raw?.ads || null,
message: raw?.message || null,
extra: { reqId },
},
}
}
+88
View File
@@ -0,0 +1,88 @@
// 看广告免费听歌 - 领取免费听权益
// 请求流程(基于逆向网易云音乐 v9.5.45 RN Hermes 源码):
// 1. 从广告平台拉广告 → 用户看完/点击广告 → 获取 ad 对象的 extJson.contextInfo.req_id 作为 reqUid
// 2. 调用本接口传入 reqUid 及相关权益参数,领取免费听权益
// 3. 服务器返回 gainFlag 等标识,用于展示领取结果
const createOption = require('../util/option.js')
const adGet = require('./ad_get.js')
module.exports = async (query, request) => {
const time = Date.now()
// 如果未传入 reqUid,自动从 ad_get 获取最新广告的 req_id
let reqUid = query.reqUid || ''
if (!reqUid) {
try {
const adRes = await adGet(
{ ...query, type_ids: query.type_ids || '["400002_0"]' },
request,
)
reqUid = adRes?.body?.extra?.reqId || ''
console.log(`自动获取 reqUid: ${reqUid}`)
} catch (e) {
// 获取广告失败,后续请求会因缺少 reqUid 被拒绝
}
}
const rightsParam = {
// 必填: 广告请求 ID,自动从 ad_get 获取
reqUid,
// 广告创意类型 (默认 1)
creativeType: parseInt(query.creativeType || 2),
// 时间戳
exposureTime: query.exposureTime || time,
clickTime: query.clickTime || time,
// 权益领取方式
rightsGainMethod: parseInt(query.rightsGainMethod || 2),
// 权益时长相关
rightsGainDuration: query.rightsGainDuration
? parseInt(query.rightsGainDuration)
: undefined,
extraRightsGainMethod: query.extraRightsGainMethod
? parseInt(query.extraRightsGainMethod)
: undefined,
extraRightsGainDuration: query.extraRightsGainDuration
? parseInt(query.extraRightsGainDuration)
: undefined,
nextRightsGainDuration: query.nextRightsGainDuration
? parseInt(query.nextRightsGainDuration)
: undefined,
// 来源标识 | 权益扩展信息
source: query.source || undefined,
rightsExtJson: query.rightsExtJson || undefined,
// 应用信息(下载类广告)
appInfo: query.appInfo ? JSON.parse(query.appInfo) : undefined,
installed: query.installed ? parseInt(query.installed) : undefined,
}
// 清理 undefined 字段
Object.keys(rightsParam).forEach((key) => {
if (rightsParam[key] === undefined) delete rightsParam[key]
})
// 将参数序列化为 reqParam 字符串 (与 RN 源码完全一致)
const data = {
reqParam: JSON.stringify(rightsParam),
}
const option = createOption(query, 'xeapi')
// 关键: 开启 X-antiCheatToken 头
option.checkToken = true
const res = await request(`/api/ad/listening/rights/gain`, data, option)
return {
status: 200,
body: {
code: 200,
data: res.body,
},
}
}
+2 -1
View File
@@ -4,6 +4,7 @@
// 可按需修改此 API 的代码
/* {"extInfo":"{\"lastRequestTimestamp\":1692358373509,\"lbsInfoList\":[{\"lat\":40.23076381,\"lon\":129.07545186,\"time\":1692358543},{\"lat\":40.23076381,\"lon\":129.07545186,\"time\":1692055283}],\"listenedTs\":false,\"noAidjToAidj\":true}","header":"{}"} */
const logger = require('../util/logger.js')
const createOption = require('../util/option.js')
module.exports = (query, request) => {
var extInfo = {}
@@ -22,6 +23,6 @@ module.exports = (query, request) => {
const data = {
extInfo: JSON.stringify(extInfo),
}
// console.log(data)
// logger.info(data)
return request(`/api/aidj/content/rcmd/info`, data, createOption(query))
}
+16
View File
@@ -0,0 +1,16 @@
// 获取关注歌手的新歌曲和 MV
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
startTimestamp: query.startTimestamp || query.before || Date.now(),
sourceType: query.sourceType || 1,
limit: query.limit || 10,
firstRequest: query.firstRequest ?? true,
}
return request(
`/api/sub/artist/new/works/song-mv/list/v2`,
data,
createOption(query, 'eapi'),
)
}
+10
View File
@@ -0,0 +1,10 @@
// 获取所有关注歌手最近的 50 首新歌
const createOption = require('../util/option.js')
module.exports = (query, request) => {
return request(
`/api/sub/artist/new/works/song/playall`,
{},
createOption(query, 'eapi'),
)
}
+142 -123
View File
@@ -1,23 +1,26 @@
const mm = require('music-metadata')
const uploadPlugin = require('../plugins/songUpload')
const md5 = require('md5')
const createOption = require('../util/option.js')
const logger = require('../util/logger.js')
const {
isTempFile,
getFileSize,
getFileMd5,
cleanupTempFile,
getFileExtension,
sanitizeFilename,
} = require('../util/fileHelper')
let mm
module.exports = async (query, request) => {
let ext = 'mp3'
// if (query.songFile.name.indexOf('flac') > -1) {
// ext = 'flac'
// }
if (query.songFile.name.includes('.')) {
ext = query.songFile.name.split('.').pop()
}
mm = require('music-metadata')
query.songFile.name = Buffer.from(query.songFile.name, 'latin1').toString(
'utf-8',
)
const filename = query.songFile.name
.replace('.' + ext, '')
.replace(/\s/g, '')
.replace(/\./g, '_')
const ext = getFileExtension(query.songFile.name)
const filename = sanitizeFilename(query.songFile.name)
const bitrate = 999000
if (!query.songFile) {
return Promise.reject({
status: 500,
@@ -27,119 +30,135 @@ module.exports = async (query, request) => {
},
})
}
if (!query.songFile.md5) {
// 命令行上传没有md5和size信息,需要填充
query.songFile.md5 = md5(query.songFile.data)
query.songFile.size = query.songFile.data.byteLength
}
const res = await request(
`/api/cloud/upload/check`,
{
bitrate: String(bitrate),
ext: '',
length: query.songFile.size,
md5: query.songFile.md5,
songId: '0',
version: 1,
},
createOption(query),
)
let artist = ''
let album = ''
let songName = ''
const useTemp = isTempFile(query.songFile)
let fileSize = await getFileSize(query.songFile)
let fileMd5 = await getFileMd5(query.songFile)
query.songFile.md5 = fileMd5
query.songFile.size = fileSize
try {
const metadata = await mm.parseBuffer(
query.songFile.data,
query.songFile.mimetype,
const res = await request(
`/api/cloud/upload/check`,
{
bitrate: String(bitrate),
ext: '',
length: fileSize,
md5: fileMd5,
songId: '0',
version: 1,
},
createOption(query),
)
const info = metadata.common
if (info.title) {
songName = info.title
}
if (info.album) {
album = info.album
}
if (info.artist) {
artist = info.artist
}
// if (metadata.native.ID3v1) {
// metadata.native.ID3v1.forEach((item) => {
// // console.log(item.id, item.value)
// if (item.id === 'title') {
// songName = item.value
// }
// if (item.id === 'artist') {
// artist = item.value
// }
// if (item.id === 'album') {
// album = item.value
// }
// })
// // console.log({
// // songName,
// // album,
// // songName,
// // })
// }
// console.log({
// songName,
// album,
// songName,
// })
} catch (error) {
console.log(error)
}
const tokenRes = await request(
`/api/nos/token/alloc`,
{
bucket: '',
ext: ext,
filename: filename,
local: false,
nos_product: 3,
type: 'audio',
md5: query.songFile.md5,
},
createOption(query),
)
let artist = ''
let album = ''
let songName = ''
if (res.body.needUpload) {
const uploadInfo = await uploadPlugin(query, request)
// console.log('uploadInfo', uploadInfo.body.result.resourceId)
}
// console.log(tokenRes.body.result)
const res2 = await request(
`/api/upload/cloud/info/v2`,
{
md5: query.songFile.md5,
songid: res.body.songId,
filename: query.songFile.name,
song: songName || filename,
album: album || '未知专辑',
artist: artist || '未知艺术家',
bitrate: String(bitrate),
resourceId: tokenRes.body.result.resourceId,
},
createOption(query),
)
// console.log({ res2, privateCloud: res2.body.privateCloud })
// console.log(res.body.songId, 'songid')
const res3 = await request(
`/api/cloud/pub/v2`,
{
songid: res2.body.songId,
},
createOption(query),
)
// console.log({ res3 })
return {
status: 200,
body: {
...res.body,
...res3.body,
// ...uploadInfo,
},
cookie: res.cookie,
try {
let metadata
if (useTemp) {
metadata = await mm.parseFile(query.songFile.tempFilePath)
} else {
metadata = await mm.parseBuffer(
query.songFile.data,
query.songFile.mimetype,
)
}
const info = metadata.common
if (info.title) songName = info.title
if (info.album) album = info.album
if (info.artist) artist = info.artist
} catch (error) {
logger.info('元数据解析错误:', error.message)
}
const tokenRes = await request(
`/api/nos/token/alloc`,
{
bucket: '',
ext: ext,
filename: filename,
local: false,
nos_product: 3,
type: 'audio',
md5: fileMd5,
},
createOption(query),
)
if (!tokenRes.body.result || !tokenRes.body.result.resourceId) {
logger.error('Token分配失败:', tokenRes.body)
return Promise.reject({
status: 500,
body: {
code: 500,
msg: '获取上传token失败',
detail: tokenRes.body,
},
})
}
if (res.body.needUpload) {
logger.info('需要上传,开始上传流程...')
try {
const uploadInfo = await uploadPlugin(query, request)
logger.info('上传完成:', uploadInfo?.body?.result?.resourceId)
} catch (uploadError) {
logger.error('上传失败:', uploadError)
return Promise.reject(uploadError)
}
} else {
logger.info('文件已存在,跳过上传')
}
const res2 = await request(
`/api/upload/cloud/info/v2`,
{
md5: fileMd5,
songid: res.body.songId,
filename: query.songFile.name,
song: songName || filename,
album: album || '未知专辑',
artist: artist || '未知艺术家',
bitrate: String(bitrate),
resourceId: tokenRes.body.result.resourceId,
},
createOption(query),
)
if (res2.body.code !== 200) {
logger.error('云盘信息上传失败:', res2.body)
return Promise.reject({
status: res2.status || 500,
body: {
code: res2.body.code || 500,
msg: res2.body.msg || '上传云盘信息失败',
detail: res2.body,
},
})
}
const res3 = await request(
`/api/cloud/pub/v2`,
{
songid: res2.body.songId,
},
createOption(query),
)
return {
status: 200,
body: {
...res.body,
...res3.body,
},
cookie: res.cookie,
}
} finally {
if (useTemp) {
await cleanupTempFile(query.songFile.tempFilePath)
}
}
}
+11
View File
@@ -0,0 +1,11 @@
// 获取云盘歌词
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
userId: query.uid,
songId: query.sid,
lv: -1,
kv: -1,
}
return request(`/api/cloud/lyric/get`, data, createOption(query, 'eapi'))
}
+72
View File
@@ -0,0 +1,72 @@
const createOption = require('../util/option.js')
module.exports = async (query, request) => {
const {
songId,
resourceId,
md5,
filename,
song,
artist,
album,
bitrate = 999000,
} = query
if (!songId || !resourceId || !md5 || !filename) {
return Promise.reject({
status: 400,
body: {
code: 400,
msg: '缺少必要参数: songId, resourceId, md5, filename',
},
})
}
const songName = song || filename.replace(/\.[^.]+$/, '')
const res2 = await request(
`/api/upload/cloud/info/v2`,
{
md5: md5,
songid: songId,
filename: filename,
song: songName,
album: album || '未知专辑',
artist: artist || '未知艺术家',
bitrate: String(bitrate),
resourceId: resourceId,
},
createOption(query),
)
if (res2.body.code !== 200) {
return Promise.reject({
status: res2.status || 500,
body: {
code: res2.body.code || 500,
msg: res2.body.msg || '上传云盘信息失败',
detail: res2.body,
},
})
}
const res3 = await request(
`/api/cloud/pub/v2`,
{
songid: res2.body.songId,
},
createOption(query),
)
return {
status: 200,
body: {
code: 200,
data: {
songId: res2.body.songId,
...res3.body,
},
},
cookie: res2.cookie,
}
}
+111
View File
@@ -0,0 +1,111 @@
const { default: axios } = require('axios')
const createOption = require('../util/option.js')
module.exports = async (query, request) => {
const { md5, fileSize, filename, bitrate = 999000 } = query
if (!md5 || !fileSize || !filename) {
return Promise.reject({
status: 400,
body: {
code: 400,
msg: '缺少必要参数: md5, fileSize, filename',
},
})
}
const ext = filename.includes('.') ? filename.split('.').pop() : 'mp3'
const checkRes = await request(
`/api/cloud/upload/check`,
{
bitrate: String(bitrate),
ext: '',
length: fileSize,
md5: md5,
songId: '0',
version: 1,
},
createOption(query),
)
const bucket = 'jd-musicrep-privatecloud-audio-public'
const tokenRes = await request(
`/api/nos/token/alloc`,
{
bucket: bucket,
ext: ext,
filename: filename
.replace(/\.[^.]+$/, '')
.replace(/\s/g, '')
.replace(/\./g, '_'),
local: false,
nos_product: 3,
type: 'audio',
md5: md5,
},
createOption(query, 'weapi'),
)
if (!tokenRes.body.result || !tokenRes.body.result.objectKey) {
return Promise.reject({
status: 500,
body: {
code: 500,
msg: '获取上传token失败',
detail: tokenRes.body,
},
})
}
let lbs
try {
lbs = (
await axios({
method: 'get',
url: `https://wanproxy.127.net/lbs?version=1.0&bucketname=${bucket}`,
timeout: 10000,
})
).data
} catch (error) {
return Promise.reject({
status: 500,
body: {
code: 500,
msg: '获取上传服务器地址失败',
detail: error.message,
},
})
}
if (!lbs || !lbs.upload || !lbs.upload[0]) {
return Promise.reject({
status: 500,
body: {
code: 500,
msg: '获取上传服务器地址无效',
detail: lbs,
},
})
}
return {
status: 200,
body: {
code: 200,
data: {
needUpload: checkRes.body.needUpload,
songId: checkRes.body.songId,
uploadToken: tokenRes.body.result.token,
objectKey: tokenRes.body.result.objectKey,
resourceId: tokenRes.body.result.resourceId,
uploadUrl: `${lbs.upload[0]}/${bucket}/${tokenRes.body.result.objectKey.replace(/\//g, '%2F')}?offset=0&complete=true&version=1.0`,
bucket: bucket,
md5: md5,
fileSize: fileSize,
filename: filename,
},
},
cookie: checkRes.cookie,
}
}
+30
View File
@@ -0,0 +1,30 @@
// 评论统计数据
// type: 0=歌曲 1=MV 2=歌单 3=专辑 4=电台节目 5=视频 6=动态 7=电台
// ids: 资源 ID 列表,多个用逗号分隔,如 "123,456"
const { resourceTypeMap } = require('../util/config.json')
const createOption = require('../util/option.js')
// 从 resourceTypeMap 的前缀值中提取网易云内部资源类型编号
// 例如 "R_SO_4_" -> "4", "A_DR_14_" -> "14"
const resourceTypeIdMap = Object.fromEntries(
Object.entries(resourceTypeMap).map(([key, prefix]) => [
key,
prefix.replace(/_$/, '').split('_').pop(),
]),
)
module.exports = (query, request) => {
const ids = String(query.ids || query.id || '')
.split(',')
.map((id) => id.trim())
.filter(Boolean)
return request(
`/api/resource/commentInfo/list`,
{
resourceType: resourceTypeIdMap[String(query.type || 0)],
resourceIds: JSON.stringify(ids),
},
createOption(query, 'weapi'),
)
}
+11
View File
@@ -0,0 +1,11 @@
// 举报评论
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
threadId: 'R_SO_4_' + query.id,
commentId: query.cid,
reason: query.reason,
}
return request(`/api/report/reportcomment`, data, createOption(query))
}
+97
View File
@@ -0,0 +1,97 @@
const {
eapiResDecrypt,
eapiReqDecrypt,
aesDecrypt,
xeapiResDecrypt,
} = require('../util/crypto')
const CryptoJS = require('crypto-js')
const linuxapiKey = 'rFgB&h#%2?^eDg:Q'
module.exports = async (query, request) => {
const crypto = query.crypto || 'eapi'
const data = query.data || query.hexString || ''
const isReq = query.isReq !== 'false'
if (!data) {
return {
status: 400,
body: { code: 400, message: 'data is required' },
}
}
try {
let result
switch (crypto) {
case 'eapi': {
const pureHex = data.replace(/\s/g, '')
result = isReq ? eapiReqDecrypt(pureHex) : eapiResDecrypt(pureHex)
break
}
case 'weapi': {
if (isReq) {
return {
status: 400,
body: {
code: 400,
message:
'weapi 请求解密需要 RSA 私钥,暂不支持;仅支持 weapi 返回数据解密(e_r=true 时与 eapi 相同)',
},
}
}
const pureHex = data.replace(/\s/g, '')
result = eapiResDecrypt(pureHex)
break
}
case 'linuxapi': {
if (isReq) {
const pureHex = data.replace(/\s/g, '')
const decrypted = aesDecrypt(pureHex, linuxapiKey, '', 'hex')
result = JSON.parse(decrypted.toString(CryptoJS.enc.Utf8))
} else {
result = typeof data === 'string' ? JSON.parse(data) : data
}
break
}
case 'xeapi': {
if (isReq) {
return {
status: 400,
body: {
code: 400,
message:
'xeapi 请求解密涉及 X25519 ECDH 密钥交换,流程复杂,暂不支持;仅支持 xeapi 返回数据解密',
},
}
}
const buf = Buffer.from(data, 'base64')
result = xeapiResDecrypt(buf)
break
}
case 'api': {
result = typeof data === 'string' ? JSON.parse(data) : data
break
}
default:
return {
status: 400,
body: { code: 400, message: `未知加密方式: ${crypto}` },
}
}
return {
status: 200,
body: { code: 200, data: result },
}
} catch (error) {
return {
status: 400,
body: { code: 400, message: `解密失败: ${error.message}` },
}
}
}
+12
View File
@@ -0,0 +1,12 @@
// 听歌足迹 - 歌曲播放排行 (Top20)
const createOption = require('../util/option.js')
module.exports = (query, request) => {
return request(
`/api/content/activity/listen/data/song/play/rank`,
{
type: query.type || 'month', //周 week 月 month
endTime: query.endTime, // 不填就是本周/月的
},
createOption(query),
)
}
+11
View File
@@ -0,0 +1,11 @@
// 获取音乐人任务
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
return request(
`/api/nmusician/workbench/special/right/vip/info`,
data,
createOption(query, 'eapi'),
)
}
+1
View File
@@ -1,4 +1,5 @@
// 私信和通知接口
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
+2 -1
View File
@@ -1,4 +1,5 @@
const createOption = require('../util/option.js')
const logger = require('../util/logger.js')
module.exports = async (query, request) => {
query.ids = query.ids || ''
const data = {
@@ -9,7 +10,7 @@ module.exports = async (query, request) => {
}),
),
}
console.log(data)
logger.info(data)
return request(`/api/playlist/track/add`, data, createOption(query, 'weapi'))
}
+3 -1
View File
@@ -2,7 +2,9 @@
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
const data = {
afresh: query.afresh,
}
return request(
`/api/v3/discovery/recommend/songs`,
data,
+5 -2
View File
@@ -1,7 +1,10 @@
// 获取游客cookie
const CryptoJS = require('crypto-js')
const path = require('path')
const fs = require('fs')
const ID_XOR_KEY_1 = '3go8&$8*3*3h0k(2)2'
const logger = require('../util/logger.js')
const createOption = require('../util/option.js')
const { generateDeviceId } = require('../util/index')
@@ -23,7 +26,7 @@ function cloudmusic_dll_encode_id(some_id) {
module.exports = async (query, request) => {
const deviceId = generateDeviceId()
console.log(`[register_anonimous] deviceId: ${deviceId}`)
logger.info(`Successfully registered anonimous token, deviceId: ${deviceId}`)
global.deviceId = deviceId
const encodedId = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse(
@@ -36,7 +39,7 @@ module.exports = async (query, request) => {
let result = await request(
`/api/register/anonimous`,
data,
createOption(query, 'weapi'),
createOption(query, 'xeapi'),
)
if (result.body.code === 200) {
result = {
+37
View File
@@ -0,0 +1,37 @@
// 易盾反作弊 Token 注册端点
// 调用后获取实时 token 并存入共享存储,供后续带 checkToken 的请求使用
//
// GET /register/checktoken → 返回当前 token(尚无则自动获取)
// POST /register/checktoken → 强制刷新 token
// GET /register/checktoken?refresh=1 → 强制刷新
//
const { default: axios } = require('axios')
const { APP_CONF } = require('../util/config.json')
const URL = APP_CONF.dunDomain + '/v3/b?pn=YD00000558929251'
let _token = ''
async function fetch() {
const res = await axios.get(URL, { timeout: 10000 })
const body = String(res.data)
const m = body.match(/null\(\[(\d+),\d+,\"([^\"]+)\"\]\)/)
if (m && m[1] === '200') return m[2]
throw new Error('易盾返回异常: ' + body.substring(0, 100))
}
// 端点处理
module.exports = async (query) => {
const refresh = query.refresh === '1' || query.refresh === 'true'
let token = refresh ? null : _token
if (!token) {
token = await fetch()
_token = token
}
return {
status: 200,
body: { code: 200, token, registered: !!token },
}
}
// 给 request.js 读取用
module.exports.getToken = () => _token
+74
View File
@@ -0,0 +1,74 @@
const { default: axios } = require('axios')
const encrypt = require('../util/crypto')
const { APP_CONF } = require('../util/config.json')
const generateNonce = () => {
let nonce = ''
for (let i = 0; i < 16; i++) {
nonce += Math.floor(Math.random() * 10).toString()
}
return nonce
}
module.exports = async (query, request) => {
const nonce = generateNonce()
const timestamp = String(Date.now())
const deviceId = query.deviceId || global.deviceId || ''
const currentKeyVersion = query.currentKeyVersion || ''
const data = {
appVersion: '9.1.65',
currentKeyVersion,
deviceId,
nonce,
os: 'android',
requestType: 'active',
signature: encrypt.xeapiSign(timestamp, nonce),
t1: '',
t2: '',
timestamp,
uid: '',
}
const res = await axios({
method: 'POST',
url: APP_CONF.apiDomain + '/api/gorilla/anti/crawler/security/key/get',
headers: {
'User-Agent':
'NeteaseMusic/9.1.65.240927161425(9001065);Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)',
Cookie: deviceId ? `deviceId=${encodeURIComponent(deviceId)}` : '',
},
data: new URLSearchParams(data).toString(),
proxy: false,
})
if (
!res.data ||
res.data.code !== 200 ||
!res.data.data ||
!res.data.data.encryptedData
) {
throw new Error('xeapi public key request failed')
}
if (
!res.data.data.signature ||
encrypt.xeapiSign(res.data.data.timestamp, nonce) !==
res.data.data.signature
) {
throw new Error('xeapi public key response signature mismatch')
}
const publicKey = encrypt.xeapiDecryptPublicKey(res.data.data.encryptedData)
if (!publicKey.sk) {
throw new Error('xeapi public key response missing sk')
}
return {
status: 200,
body: {
...publicKey,
deviceId,
},
cookie: [],
}
}
+49
View File
@@ -0,0 +1,49 @@
// 提交歌曲播放状态
const createOption = require('../util/option.js')
const generateSessionId = () =>
Array.from(
{ length: 12 },
() =>
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'[Math.floor(Math.random() * 36)],
).join('')
module.exports = (query, request) => {
const {
id,
sessionId,
progress = 0,
playMode = 'list_loop',
type = 'song',
} = query
if (!id) {
return Promise.reject({
status: 400,
body: {
code: 400,
msg: '缺少必要参数:id',
},
})
}
const playStateSubmitReq = JSON.stringify({
resource: {
id: String(id),
type: type,
},
progress: Number(progress) || 0,
sessionId: sessionId || generateSessionId(),
playMode: playMode,
})
const data = {
playStateSubmitReq: playStateSubmitReq,
}
return request(
'/api/relay/play/state/submit',
data,
createOption(query, 'weapi'),
)
}
+57 -5
View File
@@ -1,8 +1,42 @@
// 听歌打卡
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
const { APP_CONF } = require('../util/config.json')
const DOMAIN = APP_CONF.clDomian
module.exports = async (query, request) => {
// 注入 os=osx 的 cookie
let cookie = query.cookie || ''
if (typeof cookie === 'object') {
cookie = Object.assign({ os: 'osx' }, cookie)
} else if (typeof cookie === 'string') {
if (cookie.indexOf('os=') > -1) {
cookie = cookie.replace(/os=[^;]+/g, 'os=osx')
} else {
cookie = cookie + '; os=osx'
}
} else {
cookie = 'os=osx'
}
query.cookie = cookie
// 1) startplay → 进「最近播放」
const startplayData = {
logs: JSON.stringify([
{
action: 'startplay',
json: {
id: query.id,
type: 'song',
mainsite: '1',
mainsiteWeb: '1',
content: `id=${query.sourceid}`,
},
},
]),
}
// 2) play → 涨「听歌排行」计数
const playData = {
logs: JSON.stringify([
{
action: 'play',
@@ -15,12 +49,30 @@ module.exports = (query, request) => {
type: 'song',
wifi: 0,
source: 'list',
mainsite: 1,
content: '',
mainsite: '1',
mainsiteWeb: '1',
content: `id=${query.sourceid}`,
},
},
]),
}
return request(`/api/feedback/weblog`, data, createOption(query, 'weapi'))
const option = createOption(query, 'eapi')
option.domain = DOMAIN
// 发送两次请求
const res1 = await request(`/api/feedback/weblog`, startplayData, option)
const res2 = await request(`/api/feedback/weblog`, playData, option)
return {
status: 200,
body: {
code: 200,
data: 'success',
details: {
startplay: res1.body,
play: res2.body,
},
},
}
}
+128
View File
@@ -0,0 +1,128 @@
// 听歌打卡 - NCBL 加密版 (仿桌面客户端 PLV/PLD 上报)
// 复制自 https://github.com/folltoshe/netease-report-listen-song 的 PC 端日志上报方式
//
// PLV 和 PLD 分两次独立上传
const {
buildPlv,
buildPld,
buildRecords,
extractContext,
parseCookie,
buildCookieStr,
buildMetaJson,
doUpload,
} = require('../util/ncbl')
module.exports = async (query, request) => {
// --- 参数校验 ---
const songId = Number(query.id)
if (!songId || isNaN(songId)) {
return { status: 400, body: { code: 400, msg: '缺少有效的 id (歌曲ID)' } }
}
const playTime = Number(query.time)
if (isNaN(playTime) || playTime <= 0) {
return {
status: 400,
body: { code: 400, msg: '缺少有效的 time (播放时长)' },
}
}
const totalTime = Number(query.total) || playTime
const sourceId = String(query.sourceid || query.sourceId || '')
const sourceName = query.source || 'list'
// --- 解析认证上下文 ---
const rawCookie = query.cookie || ''
const cookieObj = parseCookie(rawCookie)
cookieObj.os = 'pc'
const ctx = extractContext(cookieObj)
// 兜底取 token
if (!ctx.auth.token && rawCookie) {
const parsed =
typeof rawCookie === 'string' ? parseCookie(rawCookie) : rawCookie
ctx.auth.token = parsed.MUSIC_U || ''
}
if (!ctx.auth.token) {
return { status: 401, body: { code: 401, msg: '缺少 MUSIC_U 鉴权令牌' } }
}
// --- 构建歌曲和来源 ---
const song = {
id: songId,
name: query.name || '',
artist: query.artist || '',
bitrate: Number(query.bitrate) || 320,
level: query.level || 'exhigh',
vip: query.vip === 'true' || query.vip === true,
time: totalTime,
}
const source = {
id: sourceId || String(songId),
type: 'track',
name: sourceName,
}
const metaJson = buildMetaJson(ctx)
const cookieStr = buildCookieStr(ctx)
const ts = Math.floor(Date.now() / 1000)
const played = Math.min(playTime, totalTime)
const plvBody = buildRecords([
{ time: ts, action: '_plv', data: buildPlv(ctx, song, source) },
])
const pldBody = buildRecords([
{ time: ts, action: '_pld', data: buildPld(ctx, song, source, played) },
])
try {
// 1) 上传 PLV
const plv = await doUpload(ctx, metaJson, plvBody, cookieStr, 'PLV')
if (!plv.success) {
const rateMsg =
plv.respBody?.data?.rate != null
? ` (rate=${plv.respBody.data.rate})`
: ''
return {
status: 200,
body: {
code: plv.respBody?.code || -1,
msg: `PLV 上报失败${rateMsg}`,
details: plv.respBody,
},
}
}
// 2) 上传 PLD
const pld = await doUpload(ctx, metaJson, pldBody, cookieStr, 'PLD')
if (!pld.success) {
return {
status: 200,
body: {
code: pld.respBody?.code || -1,
msg: 'PLV 成功但 PLD 失败',
details: { plv: plv.respBody, pld: pld.respBody },
},
}
}
return {
status: 200,
body: {
code: 200,
data: 'scrobble_v1 上报成功',
details: {
plv: { fileName: plv.fileName, payloadSize: plv.payload.length },
pld: { fileName: pld.fileName, payloadSize: pld.payload.length },
},
},
}
} catch (err) {
return {
status: 502,
body: { code: 502, msg: `请求异常: ${err.message || err}` },
}
}
}
+13
View File
@@ -0,0 +1,13 @@
// 搜索建议pc端
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
keyword: query.keyword || '',
}
return request(
`/api/search/pc/suggest/keyword/get`,
data,
createOption(query),
)
}
+9
View File
@@ -0,0 +1,9 @@
// 从云盘获取歌曲下载链接
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
songId: query.id,
}
return request(`/api/cloud/dowonload`, data, createOption(query, 'eapi'))
}
+9
View File
@@ -0,0 +1,9 @@
// 灰色歌曲的其他版本推荐
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
songid: query.songid || query.id,
}
return request(`/api/song/copyright/rcmd`, data, createOption(query, 'eapi'))
}
+12
View File
@@ -0,0 +1,12 @@
// 喜欢歌曲
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const like = query.like !== 'false'
const data = {
trackId: query.id,
userid: query.uid,
like: like,
}
return request(`/api/song/like`, data, createOption(query))
}
+38
View File
@@ -0,0 +1,38 @@
// 网易云歌曲解灰(适配SPlayer的UNM-Server)
// 支持qq音乐、酷狗音乐、酷我音乐、咪咕音乐、第三方网易云API等等(来自GD音乐台)
const createOption = require('../util/option.js')
const logger = require('../util/logger.js')
module.exports = async (query, request) => {
try {
const {
matchID,
} = require('@neteasecloudmusicapienhanced/unblockmusic-utils')
const result = await matchID(query.id, query.source)
const proxy = process.env.PROXY_URL
logger.info('开始解灰', query.id, result)
const useProxy = process.env.ENABLE_PROXY || 'false'
if (result.data.url && result.data.url.includes('kuwo')) {
result.proxyUrl =
useProxy === 'true' ? proxy + result.data.url : result.data.url
}
return {
status: 200,
body: {
code: 200,
data: result.data.url,
proxyUrl: result.proxyUrl || '',
},
}
} catch (e) {
return {
status: 500,
body: {
code: 500,
msg: e.message || 'unblock error',
data: [],
},
}
}
}
+5
View File
@@ -0,0 +1,5 @@
// 夹带私货的东西就不要放在这里了
module.exports = async (query, request) => {
return { status: 200, body: { code: 200, data: [] } }
}
+47 -2
View File
@@ -1,16 +1,61 @@
// 歌曲链接 - v1
// 此版本不再采用 br 作为音质区分的标准
// 而是采用 standard, exhigh, lossless, hires, jyeffect(高清环绕声), sky(沉浸环绕声), jymaster(超清母带) 进行音质判断
// 当unblock为true时, 会尝试使用unblockmusic-utils进行解锁, 同时音质设置不会生效, 但仍然为必须传入参数
const logger = require('../util/logger.js')
const createOption = require('../util/option.js')
module.exports = (query, request) => {
module.exports = async (query, request) => {
const {
matchID,
} = require('@neteasecloudmusicapienhanced/unblockmusic-utils')
require('dotenv').config()
const data = {
ids: '[' + query.id + ']',
level: query.level,
encodeType: 'flac',
}
if (query.unblock === 'true') {
try {
const result = await matchID(query.id, query.source)
logger.info('Starting unblock(uses modules unblock):', query.id, result)
const useProxy = process.env.ENABLE_PROXY || 'false'
let proxyUrl = ''
if (result.data.url && result.data.url.includes('kuwo')) {
proxyUrl =
useProxy === 'true' && process.env.PROXY_URL
? process.env.PROXY_URL + result.data.url
: result.data.url
}
return {
status: 200,
body: {
code: 200,
msg: 'Warning: Customizing unblock sources is not supported on this endpoint. Please use `/song/url/match` instead.',
data: [
{
id: Number(query.id),
url: result.data.url,
type: 'flac',
level: query.level,
freeTrialInfo: 'null',
fee: 0,
proxyUrl: proxyUrl || '',
},
],
},
cookie: [],
}
} catch (e) {
console.error('Error in unblocking music:', e)
}
}
if (data.level == 'sky') {
data.immerseType = 'c51'
}
return request(`/api/song/enhance/player/url/v1`, data, createOption(query))
return request(
`/api/song/enhance/player/url/v1`,
data,
createOption(query, 'xeapi'),
)
}
+53
View File
@@ -0,0 +1,53 @@
// 获取客户端歌曲下载链接 - v1
// 此版本不再采用 br 作为音质区分的标准
// 而是采用 standard, exhigh, lossless, hires, jyeffect(高清环绕声), sky(沉浸环绕声), jymaster(超清母带) 进行音质判断
const createOption = require('../util/option.js')
module.exports = async (query, request) => {
const data = {
id: query.id,
immerseType: 'c51',
level: query.level,
}
const response = await request(
`/api/song/enhance/download/url/v1`,
data,
createOption(query),
)
let url = response?.body?.data?.[0]?.url
if (!url) {
const fallbackData = {
ids: `[${query.id}]`,
level: query.level,
encodeType: 'flac',
}
if (query.level === 'sky') {
fallbackData.immerseType = 'c51'
}
const fallback = await request(
`/api/song/enhance/player/url/v1`,
fallbackData,
createOption(query),
)
url = fallback?.body?.data?.[0]?.url
if (!url) {
return fallback
}
return {
status: 302,
body: '',
cookie: fallback.cookie || [],
redirectUrl: url,
}
}
return {
status: 302,
body: '',
cookie: response.cookie || [],
redirectUrl: url,
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ module.exports = (query, request) => {
const data = {
userId: query.uid,
time: '0',
limit: query.limit || 30,
limit: query.limit || 20,
offset: query.offset || 0,
getcounts: 'true',
}
+11
View File
@@ -0,0 +1,11 @@
// 一键领取所有会员成长值
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
return request(
`/api/vipnewcenter/app/level/task/reward/getall`,
data,
createOption(query, 'xeapi'),
)
}
+40
View File
@@ -0,0 +1,40 @@
// 黑胶乐签打卡
const createOption = require('../util/option.js')
module.exports = async (query, request) => {
const results = {}
const taskSign = await request(
'/api/vip-center-bff/task/sign',
{},
createOption(query, 'weapi'),
)
results.taskSign = taskSign.body
const checkinDetail = await request(
'/api/vipnewcenter/app/level/user/checkin/history/detail',
{
signDayTime: Date.now(),
type: 1,
},
createOption(query, 'eapi'),
)
results.checkinDetail = checkinDetail.body
// 两个接口都返回 code=200 即视为打卡成功
const signed =
Number(results.taskSign?.code) === 200 &&
Number(results.checkinDetail?.code) === 200
return {
body: {
code: 200,
...results,
signed,
message: signed ? '黑胶乐签打卡成功' : '黑胶乐签打卡失败',
},
cookie: taskSign.cookie,
status: 200,
}
}
+14
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'),
)
}
+14
View File
@@ -0,0 +1,14 @@
// 黑胶乐签打卡历史 / 状态查询
// 支持传入 type=0(用户信息栏)或 type=1(黑胶乐签)
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
type: query.type || '0',
}
return request(
`/api/vipnewcenter/app/minidesk/music/sign/pc`,
data,
createOption(query, 'eapi'),
)
}
+11
View File
@@ -0,0 +1,11 @@
// 黑胶乐签未来签到信息
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {}
return request(
`/api/vipnewcenter/app/user/sign/info`,
data,
createOption(query, 'weapi'),
)
}
+14
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'),
)
}
+36 -22
View File
@@ -1,25 +1,26 @@
const { default: axios } = require('axios')
const fs = require('fs')
var xml2js = require('xml2js')
const createOption = require('../util/option.js')
var parser = new xml2js.Parser(/* options */)
const { getFileExtension, readFileChunk } = require('../util/fileHelper')
var parser = new xml2js.Parser()
function createDupkey() {
// 格式:3b443c7c-a87f-468d-ba38-46d407aaf23a
var s = []
var hexDigits = '0123456789abcdef'
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[14] = '4'
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
s[8] = s[13] = s[18] = s[23] = '-'
return s.join('')
}
module.exports = async (query, request) => {
let ext = 'mp3'
if (query.songFile.name.indexOf('flac') > -1) {
ext = 'flac'
}
const ext = getFileExtension(query.songFile.name)
const filename =
query.songName ||
query.songFile.name
@@ -50,43 +51,58 @@ module.exports = async (query, request) => {
createOption(query, 'weapi'),
)
const objectKey = tokenRes.body.result.objectKey.replace('/', '%2F')
const objectKey = tokenRes.body.result.objectKey.replace(/\//g, '%2F')
const docId = tokenRes.body.result.docId
const res = await axios({
method: 'post',
url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploads`,
headers: {
'x-nos-token': tokenRes.body.result.token,
'X-Nos-Meta-Content-Type': 'audio/mpeg',
'X-Nos-Meta-Content-Type': query.songFile.mimetype || 'audio/mpeg',
},
data: null,
})
// return xml
const res2 = await parser.parseStringPromise(res.data)
const fileSize = query.songFile.data.length
const blockSize = 10 * 1024 * 1024 // 10MB
const useTempFile = !!query.songFile.tempFilePath
let fileSize = query.songFile.size
if (useTempFile) {
const stats = await fs.promises.stat(query.songFile.tempFilePath)
fileSize = stats.size
}
const blockSize = 10 * 1024 * 1024
let offset = 0
let blockIndex = 1
let etags = []
while (offset < fileSize) {
const chunk = query.songFile.data.slice(
offset,
Math.min(offset + blockSize, fileSize),
)
let chunk
if (useTempFile) {
chunk = await readFileChunk(
query.songFile.tempFilePath,
offset,
Math.min(blockSize, fileSize - offset),
)
} else {
chunk = query.songFile.data.slice(
offset,
Math.min(offset + blockSize, fileSize),
)
}
const res3 = await axios({
method: 'put',
url: `https://ymusic.nos-hz.163yun.com/${objectKey}?partNumber=${blockIndex}&uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
headers: {
'x-nos-token': tokenRes.body.result.token,
'Content-Type': 'audio/mpeg',
'Content-Type': query.songFile.mimetype || 'audio/mpeg',
},
data: chunk,
})
// get etag
const etag = res3.headers.etag
etags.push(etag)
offset += blockSize
@@ -101,19 +117,17 @@ module.exports = async (query, request) => {
}
completeStr += '</CompleteMultipartUpload>'
// 文件处理
await axios({
method: 'post',
url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
headers: {
'Content-Type': 'text/plain;charset=UTF-8',
'X-Nos-Meta-Content-Type': 'audio/mpeg',
'X-Nos-Meta-Content-Type': query.songFile.mimetype || 'audio/mpeg',
'x-nos-token': tokenRes.body.result.token,
},
data: completeStr,
})
// preCheck
await request(
`/api/voice/workbench/voice/batch/upload/preCheck`,
{
+13
View File
@@ -0,0 +1,13 @@
// 我创建的播客声音
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
limit: query.limit || 20,
}
return request(
`/api/social/my/created/voicelist/v1`,
data,
createOption(query, 'weapi'),
)
}
+6 -9
View File
@@ -1,14 +1,11 @@
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
fee: '-1',
limit: query.limit || '200',
offset: query.offset || '0',
podcastName: query.podcastName || '',
keyword: query.keyword || '',
scene: 'normal',
limit: query.limit || '10',
offset: query.offset || '30',
e_r: true,
}
return request(
`/api/voice/workbench/voicelist/search`,
data,
createOption(query),
)
return request(`/api/search/voicelist/get`, data, createOption(query))
}
+4 -3
View File
@@ -1,4 +1,5 @@
const { eapiResDecrypt, eapiReqDecrypt } = require('../util/crypto')
const logger = require('../util/logger.js')
let reqParamsHex =
'6E0B1C712DCB3648589D7C950C296204072A88C3E080C4CFFD0A71A553EC2533BA88E11B1E1C6DF3BE8EFA26177FCB6FCA34EB3FAFAB4671B2BBAFA9781AFDA2BF53A3DC423722493837B9BC6E80CED5BBD2DDC2856920E4D4E3E7F3EB77ECF265217A66AE677BE36F2D6FB203F721CA250E1453EA61A34904E33D5FCB9D483601D744BE0AE979AC911A00F25828538844F4B1C24F6C34880A4AB257F530C7FB10A81FED32B18D09D70C0B1B9D34A2E58A3C3FAD382C6F958077059C4F801AD7B3B248FDB9D7A59B6A9EEFF8C781A84315B33A7AFD48BE9FCFCBE1902CCC27949ACF2BDE3FA34D116E230C3597E8320B8C42BBBF371A00C03EC428E0440EB94C1540F3FD4173D29E310AFE43AB0EF449852904103EF305FC435AD43B7D8673642F74C89CCB2F1A6A79B3BE14F1235D3843C3B241D12C05DBDDF37B68CA8B5D0230AF1FCF2A9705886F4D126B33FFF6948DE1E4046DB6423D687E96C5B65122464D2E71AEC7722935FF2C3796FAE253A16AA3B102FBE7296AB0DB9EA5C46AD12B'.replaceAll(
@@ -10,6 +11,6 @@ const resHex =
' ',
'',
)
console.log(reqParamsHex)
console.log(eapiReqDecrypt(reqParamsHex))
console.log(eapiResDecrypt(resHex))
logger.info(reqParamsHex)
logger.info(eapiReqDecrypt(reqParamsHex))
logger.info(eapiResDecrypt(resHex))
+8 -7
View File
@@ -2,6 +2,7 @@ const { cloud, login_cellphone } = require('../main')
const fs = require('fs')
const path = require('path')
const yargs = require('yargs')
const logger = require('../util/logger.js')
const MUSIC_FILE_EXTENSIONS = new Set(['.mp3', '.flac'])
@@ -37,11 +38,11 @@ async function uploadArrayOfFile(token, arrayOfFiles) {
cookie: token.body.cookie,
})
} catch (error) {
console.log(error)
logger.info(error)
failed += 1
failedFiles.push(file)
}
console.log(`Uploaded ${k + 1}/${fileCount} songs`)
logger.info(`Uploaded ${k + 1}/${fileCount} songs`)
}
return { failedFiles, failed }
}
@@ -86,19 +87,19 @@ async function main() {
const files = args.file ? [args.file] : getAllMusicFiles(args.dir)
const fileCount = files.length
console.log(`Found ${fileCount} files, uploading...`)
logger.info(`Found ${fileCount} files, uploading...`)
let res = await uploadArrayOfFile(token, files)
if (res.failed) {
console.log(`Failed to upload ${res.failed} songs, retrying...`)
logger.info(`Failed to upload ${res.failed} songs, retrying...`)
res = await uploadArrayOfFile(token, res.failedFiles)
}
console.log(`Uploaded ${fileCount - res.failed} songs`)
console.log(
logger.info(`Uploaded ${fileCount - res.failed} songs`)
logger.info(
`Failed to upload ${res.failed} songs, you can reupload the files below`,
)
for (let k in res.failedFiles) {
console.log(res.failedFiles[k])
logger.info(res.failedFiles[k])
}
}
main()
+2 -1
View File
@@ -1,6 +1,7 @@
const { cloud, login_cellphone } = require('../main')
const fs = require('fs')
const path = require('path')
const logger = require('../util/logger.js')
async function main() {
const result = await login_cellphone({
@@ -17,7 +18,7 @@ async function main() {
cookie: result.body.cookie,
})
} catch (error) {
console.log(error, 'error')
logger.info(error, 'error')
}
}
main()
+6 -5
View File
@@ -1,3 +1,4 @@
const logger = require('../util/logger.js')
const {
login_cellphone,
user_cloud,
@@ -10,22 +11,22 @@ async function test() {
phone: '手机号',
password: '密码',
})
console.log(result)
logger.info(result)
const result2 = await user_cloud({
cookie: result.body.cookie,
})
console.log(result2.body)
logger.info(result2.body)
const result3 = await album_sublist({
cookie: result.body.cookie,
})
console.log(result3.body)
logger.info(result3.body)
const result4 = await song_url({
cookie: result.body.cookie,
id: 33894312,
})
console.log(result4.body)
logger.info(result4.body)
} catch (error) {
console.log(error)
logger.info(error)
}
}
test()
+4 -3
View File
@@ -1,9 +1,10 @@
import { banner, lyric } from 'NeteaseCloudMusicApi'
import { banner, lyric } from '@neteasecloudmusicapienhanced/api'
import { logger } from '../util/logger.js'
banner({ type: 0 }).then((res) => {
console.log(res)
logger.info(res)
})
lyric({
id: '33894312',
}).then((res) => {
console.log(res)
logger.info(res)
})
-11051
View File
File diff suppressed because it is too large Load Diff
+50 -30
View File
@@ -1,16 +1,19 @@
{
"name": "NeteaseCloudMusicApi",
"version": "4.32.0",
"description": "网易云音乐 NodeJS 版 API",
"name": "@neteasecloudmusicapienhanced/api",
"version": "4.37.0",
"description": "全网最全的网易云音乐API接口 || A revival project for NeteaseCloudMusicApi Node.js Services (Half Refactor & Enhanced) || 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护",
"scripts": {
"dev": "nodemon app.js",
"start": "node app.js",
"test": "mocha -r intelli-espower-loader -t 60000 server.test.js main.test.js --exit",
"lint": "eslint \"**/*.{js,ts}\"",
"lint-fix": "eslint --fix \"**/*.{js,ts}\"",
"prepare": "husky install",
"pkgwin": "pkg . -t node18-win-x64 -C GZip -o bin/app --no-bytecode",
"pkglinux": "pkg . -t node18-linux-x64 -C GZip -o bin/app --no-bytecode",
"pkgmacos": "pkg . -t node18-macos-x64 -C GZip -o bin/app --no-bytecode"
"docs:format": "node scripts/format-docs.js",
"docs:check": "node scripts/format-docs.js --check",
"pkgwin": "pkg . -t node18-win-x64 -C GZip -o precompiled/app",
"pkglinux": "pkg . -t node18-linux-x64 -C GZip -o precompiled/app",
"pkgmacos": "pkg . -t node18-macos-x64 -C GZip -o precompiled/app"
},
"bin": "./app.js",
"pkg": {
@@ -19,7 +22,6 @@
"node_modules/axios",
"node_modules/express",
"node_modules/express-fileupload",
"node_modules/md5",
"node_modules/music-metadata",
"node_modules/pac-proxy-agent",
"node_modules/qrcode",
@@ -41,6 +43,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"
},
@@ -50,7 +60,7 @@
"git add"
]
},
"author": "binaryify",
"author": "MoeFurina",
"license": "MIT",
"files": [
"module",
@@ -65,38 +75,48 @@
"data"
],
"dependencies": {
"axios": "^1.13.6",
"@neteasecloudmusicapienhanced/unblockmusic-utils": "^0.3.4",
"axios": "^1.18.1",
"crypto-js": "^4.2.0",
"express": "^4.22.1",
"dotenv": "^17.4.2",
"express": "^5.2.1",
"express-fileupload": "^1.5.2",
"md5": "^2.3.0",
"music-metadata": "^7.14.0",
"node-forge": "^1.3.3",
"gzip": "^0.1.0",
"music-metadata": "^11.14.0",
"node-forge": "^1.4.0",
"pac-proxy-agent": "^7.2.0",
"qrcode": "^1.5.4",
"safe-decode-uri-component": "^1.2.1",
"tunnel": "^0.0.6",
"xml2js": "^0.6.2",
"yargs": "^17.7.2"
"yargs": "^18.0.0"
},
"devDependencies": {
"@types/express": "^4.17.25",
"@eslint/eslintrc": "^3.3.6",
"@eslint/js": "^9.39.5",
"@types/express": "^5.0.6",
"@types/express-fileupload": "^1.5.1",
"@types/mocha": "^9.1.1",
"@types/node": "16.11.19",
"@typescript-eslint/eslint-plugin": "5.0.0",
"@typescript-eslint/parser": "5.0.0",
"eslint": "8.7.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-html": "7.1.0",
"eslint-plugin-prettier": "4.0.0",
"husky": "7.0.4",
"intelli-espower-loader": "1.1.0",
"lint-staged": "12.1.7",
"mocha": "10.0.0",
"@types/mocha": "^10.0.10",
"@types/node": "25.9.2",
"@typescript-eslint/eslint-plugin": "^8.64.0",
"@typescript-eslint/parser": "^8.64.0",
"eslint": "^9.39.5",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-html": "^8.1.4",
"eslint-plugin-prettier": "^5.5.6",
"globals": "^17.7.0",
"husky": "^9.1.7",
"intelli-espower-loader": "^1.1.0",
"lint-staged": "^16.4.0",
"mocha": "^11.7.6",
"nodemon": "^3.1.14",
"pkg": "^5.8.1",
"power-assert": "1.6.1",
"prettier": "2.7.1",
"typescript": "4.5.2"
"power-assert": "^1.6.1",
"prettier": "^3.9.5",
"typescript": "^5.9.3"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
}
}
+68 -19
View File
@@ -1,19 +1,17 @@
const { default: axios } = require('axios')
const createOption = require('../util/option.js')
const logger = require('../util/logger.js')
const {
getUploadData,
getFileExtension,
sanitizeFilename,
} = require('../util/fileHelper')
module.exports = async (query, request) => {
let ext = 'mp3'
// if (query.songFile.name.indexOf('flac') > -1) {
// ext = 'flac'
// }
if (query.songFile.name.includes('.')) {
ext = query.songFile.name.split('.').pop()
}
const filename = query.songFile.name
.replace('.' + ext, '')
.replace(/\s/g, '')
.replace(/\./g, '_')
const ext = getFileExtension(query.songFile.name)
const filename = sanitizeFilename(query.songFile.name)
const bucket = 'jd-musicrep-privatecloud-audio-public'
// 获取key和token
const tokenRes = await request(
`/api/nos/token/alloc`,
{
@@ -28,31 +26,82 @@ module.exports = async (query, request) => {
createOption(query, 'weapi'),
)
// 上传
const objectKey = tokenRes.body.result.objectKey.replace('/', '%2F')
if (!tokenRes.body.result || !tokenRes.body.result.objectKey) {
logger.error('Token分配失败:', tokenRes.body)
throw {
status: 500,
body: {
code: 500,
msg: '获取上传token失败',
detail: tokenRes.body,
},
}
}
const objectKey = tokenRes.body.result.objectKey.replace(/\//g, '%2F')
let lbs
try {
const lbs = (
lbs = (
await axios({
method: 'get',
url: `https://wanproxy.127.net/lbs?version=1.0&bucketname=${bucket}`,
timeout: 10000,
})
).data
} catch (error) {
logger.error('LBS获取失败:', error.message)
throw {
status: 500,
body: {
code: 500,
msg: '获取上传服务器地址失败',
detail: error.message,
},
}
}
if (!lbs || !lbs.upload || !lbs.upload[0]) {
logger.error('无效的LBS响应:', lbs)
throw {
status: 500,
body: {
code: 500,
msg: '获取上传服务器地址无效',
detail: lbs,
},
}
}
try {
await axios({
method: 'post',
url: `${lbs.upload[0]}/${bucket}/${objectKey}?offset=0&complete=true&version=1.0`,
headers: {
'x-nos-token': tokenRes.body.result.token,
'Content-MD5': query.songFile.md5,
'Content-Type': 'audio/mpeg',
'Content-Type': query.songFile.mimetype || 'audio/mpeg',
'Content-Length': String(query.songFile.size),
},
data: query.songFile.data,
data: getUploadData(query.songFile),
maxContentLength: Infinity,
maxBodyLength: Infinity,
timeout: 300000,
})
logger.info('上传成功:', filename)
} catch (error) {
console.log('error', error.response)
throw error.response
logger.error('上传失败:', {
status: error.response?.status,
data: error.response?.data,
message: error.message,
})
throw {
status: error.response?.status || 500,
body: {
code: error.response?.status || 500,
msg: '文件上传失败',
detail: error.response?.data || error.message,
},
}
}
return {
...tokenRes,
+5 -7
View File
@@ -1,5 +1,7 @@
const { default: axios } = require('axios')
const createOption = require('../util/option.js')
const { getUploadData } = require('../util/fileHelper')
module.exports = async (query, request) => {
const data = {
bucket: 'yyimgs',
@@ -10,27 +12,23 @@ module.exports = async (query, request) => {
return_body: `{"code":200,"size":"$(ObjectSize)"}`,
type: 'other',
}
// 获取key和token
const res = await request(
`/api/nos/token/alloc`,
data,
createOption(query, 'weapi'),
)
// 上传图片
const res2 = await axios({
method: 'post',
url: `https://nosup-hz1.127.net/yyimgs/${res.body.result.objectKey}?offset=0&complete=true&version=1.0`,
headers: {
'x-nos-token': res.body.result.token,
'Content-Type': 'image/jpeg',
'Content-Type': query.imgFile.mimetype || 'image/jpeg',
},
data: query.imgFile.data,
data: getUploadData(query.imgFile),
})
return {
// ...res.body.result,
// ...res2.data,
// ...res3.body,
url_pre: 'https://p1.music.126.net/' + res.body.result.objectKey,
imgId: res.body.result.docId,
}
+1681 -1030
View File
File diff suppressed because it is too large Load Diff
+599 -82
View File
@@ -5,83 +5,358 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API 调试界面</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
margin: 20px;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
display: flex;
flex-direction: column;
flex-grow: 1;
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 24px;
}
form {
display: flex;
flex-direction: row;
align-items: center;
gap: 10px;
margin-bottom: 10px;
display: flex;
flex-direction: column;
gap: 16px;
margin-bottom: 24px;
}
input, button {
padding: 10px;
box-sizing: border-box;
flex: 1;
.form-row {
display: flex;
gap: 12px;
align-items: center;
}
label {
font-size: 14px;
font-weight: 500;
color: #555;
min-width: 80px;
}
input, select {
padding: 10px 14px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
flex: 1;
outline: none;
}
input:focus, select:focus {
border-color: #333;
}
button {
background-color: #4CAF50;
color: white;
border: none;
cursor: pointer;
background: #333;
color: white;
padding: 10px 24px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s ease;
}
button:hover {
background: #555;
}
.data-result {
display: flex;
flex-direction: row;
flex-grow: 1;
display: flex;
gap: 16px;
min-height: 400px;
}
.data-result > div {
display: flex;
flex-direction: column;
flex-grow: 1;
padding: 10px;
box-sizing: border-box;
flex: 1;
display: flex;
flex-direction: column;
}
.data-result label {
margin-bottom: 10px;
margin-bottom: 8px;
padding: 0;
}
#data, #result {
height: 100%;
box-sizing: border-box;
textarea {
flex: 1;
padding: 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-family: 'Courier New', monospace;
font-size: 13px;
resize: vertical;
min-height: 350px;
outline: none;
}
#data {
border-right: 1px solid #ccc;
textarea:focus {
border-color: #333;
}
/* ===== 自定义选项区域 ===== */
.section-container {
margin-top: 20px;
padding: 16px 20px;
background: #fafafa;
border: 1px solid #e8e8e8;
border-radius: 8px;
}
.section-container + .section-container {
margin-top: 12px;
}
.section-title {
font-size: 14px;
font-weight: 600;
color: #555;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.section-title .count-badge {
font-size: 11px;
background: #ddd;
color: #666;
padding: 1px 8px;
border-radius: 10px;
font-weight: 400;
}
.dynamic-row {
display: flex;
gap: 8px;
margin-bottom: 8px;
align-items: center;
}
.dynamic-row .key-input {
flex: 0 0 200px;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 13px;
outline: none;
font-family: 'Courier New', monospace;
}
.dynamic-row .value-input {
flex: 1;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 13px;
outline: none;
}
.dynamic-row .key-input:focus,
.dynamic-row .value-input:focus {
border-color: #333;
}
.remove-btn {
width: 28px;
height: 28px;
padding: 0;
background: #fff;
color: #999;
border: 1px solid #ddd;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
line-height: 1;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
flex-shrink: 0;
}
.remove-btn:hover {
background: #fee;
color: #e33;
border-color: #fcc;
}
.add-btn {
background: #fff;
color: #333;
border: 1px dashed #ccc;
padding: 6px 16px;
border-radius: 6px;
font-size: 13px;
cursor: pointer;
transition: all 0.2s;
margin-top: 4px;
}
.add-btn:hover {
border-color: #999;
background: #f5f5f5;
}
/* ===== 参数编辑区 Tab ===== */
.param-container {
flex: 1;
display: flex;
flex-direction: column;
}
.param-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.param-header-title {
font-size: 14px;
font-weight: 500;
color: #555;
}
.param-tabs {
display: flex;
gap: 0;
background: #f0f0f0;
border-radius: 6px;
padding: 2px;
}
.tab-btn {
padding: 4px 14px;
border: none;
background: transparent;
color: #888;
font-size: 12px;
font-weight: 500;
cursor: pointer;
border-radius: 4px;
transition: all 0.2s;
}
.tab-btn:hover {
color: #555;
}
.tab-btn.active {
background: #fff;
color: #333;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.param-panel {
flex: 1;
display: flex;
flex-direction: column;
}
.param-panel textarea {
flex: 1;
padding: 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-family: 'Courier New', monospace;
font-size: 13px;
resize: vertical;
min-height: 350px;
outline: none;
}
.param-panel textarea:focus {
border-color: #333;
}
</style>
</head>
<body>
<div class="container">
<h1>API 调试界面</h1>
<form onsubmit="event.preventDefault(); sendRequest();">
<label for="uri">uri</label>
<input type="text" id="uri" name="uri" value="/api/song/lyric/v1">
<label for="crypto">crypto</label>
<select id="crypto" name="crypto">
<option value="weapi">weapi</option>
<option value="eapi">eapi</option>
<option value="api">api</option>
<option value="linuxapi">linuxapi</option>
<option value="" selected>(默认)</option>
</select>
<button type="submit">发送</button>
<div class="form-row">
<label for="uri">URI</label>
<input type="text" id="uri" name="uri" value="/api/song/lyric/v1">
</div>
<div class="form-row">
<label for="method">请求方法</label>
<select id="method" name="method">
<option value="POST" selected>POST</option>
<option value="GET">GET</option>
<option value="PUT">PUT</option>
<option value="DELETE">DELETE</option>
<option value="PATCH">PATCH</option>
</select>
</div>
<div class="form-row">
<label for="crypto">加密方式</label>
<select id="crypto" name="crypto">
<option value="weapi">weapi</option>
<option value="eapi">eapi</option>
<option value="api">api</option>
<option value="linuxapi">linuxapi</option>
<option value="xeapi">xeapi</option>
<option value="" selected>(默认)</option>
</select>
</div>
<div class="form-row">
<label for="timeout">超时(ms)</label>
<input type="number" id="timeout" name="timeout" value="30000" min="0" step="1000" placeholder="0 表示无超时">
</div>
<div class="form-row">
<label></label>
<button type="submit">发送请求</button>
</div>
</form>
<!-- ===== 自定义请求头 ===== -->
<div class="section-container" id="headersSection">
<div class="section-title">
请求头 (Headers)
<span class="count-badge" id="headerCount">4</span>
</div>
<div id="headersList"></div>
<button class="add-btn" onclick="addHeaderRow('', '')">+ 添加请求头</button>
</div>
<div class="data-result">
<div>
<label for="result">result</label>
<textarea id="result" name="result"></textarea>
<label for="result">响应结果</label>
<textarea id="result" name="result" readonly></textarea>
</div>
<div>
<label for="data">data</label>
<textarea id="data" name="data">
<div class="param-container">
<div class="param-header">
<span class="param-header-title">请求参数</span>
<div class="param-tabs">
<button class="tab-btn active" data-mode="json" onclick="switchParamTab('json')">JSON</button>
<button class="tab-btn" data-mode="kv" onclick="switchParamTab('kv')">键值对</button>
</div>
</div>
<div class="param-panel" id="jsonPanel">
<textarea id="data" name="data">
{
"cp": false,
"id": "2058263032",
@@ -93,61 +368,303 @@
"ytv": 0,
"yv": 0
}</textarea>
</div>
<div class="param-panel" id="kvPanel" style="display:none">
<div id="kvList"></div>
<button class="add-btn" onclick="addKvRow('', '')">+ 添加参数</button>
</div>
</div>
</div>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
async function sendRequest() {
document.getElementById('result').value = ""
// ===== 动态行管理 =====
function escapeHtml(str) {
if (!str) return '';
return String(str)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;');
}
const uri = document.getElementById('uri').value;
const crypto = document.getElementById('crypto').value;
const data = document.getElementById('data').value;
function addHeaderRow(key, value) {
const list = document.getElementById('headersList');
const row = document.createElement('div');
row.className = 'dynamic-row';
row.innerHTML =
'<input type="text" class="key-input" placeholder="Header 名称" value="' +
escapeHtml(key) +
'">' +
'<input type="text" class="value-input" placeholder="值" value="' +
escapeHtml(value) +
'">' +
'<button class="remove-btn" onclick="removeRow(this)" title="删除">✕</button>';
list.appendChild(row);
updateCount();
}
function addKvRow(key, value) {
const list = document.getElementById('kvList');
const row = document.createElement('div');
row.className = 'dynamic-row';
row.innerHTML =
'<input type="text" class="key-input" placeholder="参数名" value="' +
escapeHtml(key) +
'">' +
'<input type="text" class="value-input" placeholder="值" value="' +
escapeHtml(value) +
'">' +
'<button class="remove-btn" onclick="removeRow(this)" title="删除">✕</button>';
list.appendChild(row);
}
function removeRow(btn) {
btn.parentElement.remove();
}
function collectHeaders() {
const headers = {};
document.querySelectorAll('#headersList .dynamic-row').forEach(function (row) {
var key = row.querySelector('.key-input').value.trim();
var value = row.querySelector('.value-input').value;
if (key) headers[key] = value;
});
return headers;
}
function collectKvData() {
var obj = {};
document.querySelectorAll('#kvList .dynamic-row').forEach(function (row) {
var key = row.querySelector('.key-input').value.trim();
var val = row.querySelector('.value-input').value;
if (!key) return;
// 自动类型转换
if (val === 'true') obj[key] = true;
else if (val === 'false') obj[key] = false;
else if (val === 'null') obj[key] = null;
else if (/^-?\d+(\.\d+)?$/.test(val) && !isNaN(Number(val))) obj[key] = Number(val);
else obj[key] = val;
});
return obj;
}
// ===== Tab 切换 =====
function syncJsonToKv() {
try {
const res = await axios({
url: `/api?timestamp=${Date.now()}`,
method: 'post',
data: {
uri: uri,
data: JSON.parse(data),
crypto: crypto,
},
var data = JSON.parse(document.getElementById('data').value);
var list = document.getElementById('kvList');
list.innerHTML = '';
Object.keys(data).forEach(function (k) {
addKvRow(k, String(data[k]));
});
document.getElementById('result').value = JSON.stringify(res.data, null, 2);
} catch (error) {
document.getElementById('result').value = 'Request failed: ' + error.message;
return true;
} catch (e) {
return false;
}
}
(function fillFromQuery() {
const params = new URLSearchParams(window.location.search);
if (!params.toString()) return;
const uri = params.get('uri');
const crypto = params.get('crypto');
const dataParam = params.get('data');
if (uri) {
document.getElementById('uri').value = uri;
function syncKvToJson() {
var obj = collectKvData();
document.getElementById('data').value = JSON.stringify(obj, null, 2);
}
function switchParamTab(mode) {
var jsonPanel = document.getElementById('jsonPanel');
var kvPanel = document.getElementById('kvPanel');
if (mode === 'kv') {
if (!syncJsonToKv()) {
alert('JSON 格式有误,无法切换到键值对模式,请先修正 JSON');
return;
}
jsonPanel.style.display = 'none';
kvPanel.style.display = 'block';
} else {
syncKvToJson();
kvPanel.style.display = 'none';
jsonPanel.style.display = 'block';
}
document.querySelectorAll('.tab-btn').forEach(function (btn) {
btn.classList.toggle('active', btn.dataset.mode === mode);
});
}
// ===== 默认请求头(直接套用后端预设值)=====
var defaultHeaders = [
{ key: 'Cookie', value: '' },
{
key: 'User-Agent',
value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
},
{ key: 'Referer', value: 'https://music.163.com' },
{ key: 'Content-Type', value: 'application/json' },
];
// ===== 发送请求 =====
async function sendRequest() {
document.getElementById('result').value = '';
var uri = document.getElementById('uri').value;
var method = document.getElementById('method').value;
var crypto = document.getElementById('crypto').value;
var timeout = parseInt(document.getElementById('timeout').value, 10) || 0;
var headers = collectHeaders();
// 根据当前激活的 tab 读取数据
var parsedData;
var activeTab = document.querySelector('.tab-btn.active');
if (activeTab && activeTab.dataset.mode === 'kv') {
parsedData = collectKvData();
} else {
var rawData = document.getElementById('data').value;
try {
parsedData = rawData.trim() ? JSON.parse(rawData) : {};
} catch (e) {
document.getElementById('result').value =
'请求数据格式错误:' + e.message;
return;
}
}
var axiosConfig = {
url: '/api?timestamp=' + Date.now(),
method: method,
};
if (timeout > 0) {
axiosConfig.timeout = timeout;
}
if (method === 'GET') {
axiosConfig.params = {
uri: uri,
crypto: crypto,
data: JSON.stringify(parsedData),
headers: Object.keys(headers).length ? JSON.stringify(headers) : undefined,
};
} else {
axiosConfig.data = {
uri: uri,
crypto: crypto,
data: parsedData,
headers: Object.keys(headers).length ? headers : undefined,
};
}
try {
var res = await axios(axiosConfig);
document.getElementById('result').value = JSON.stringify(
res.data,
null,
2,
);
} catch (error) {
document.getElementById('result').value =
'Request failed: ' + error.message;
}
}
// ===== 从 URL 查询参数恢复 =====
(function fillFromQuery() {
var params = new URLSearchParams(window.location.search);
if (!params.toString()) {
// 没有查询参数,用默认 header
defaultHeaders.forEach(function (h) {
addHeaderRow(h.key, h.value);
});
return;
}
var uri = params.get('uri');
var crypto = params.get('crypto');
var dataParam = params.get('data');
var method = params.get('method');
var timeout = params.get('timeout');
var headersParam = params.get('headers');
var kvParams = params.get('kvParams');
var paramMode = params.get('paramMode');
if (uri) document.getElementById('uri').value = uri;
if (method) {
var methodSelect = document.getElementById('method');
if (
[].slice.call(methodSelect.options).some(function (opt) {
return opt.value === method;
})
) {
methodSelect.value = method;
}
}
if (timeout) document.getElementById('timeout').value = timeout;
if (crypto) {
const cryptoSelect = document.getElementById('crypto');
if ([...cryptoSelect.options].some((opt) => opt.value === crypto)) {
var cryptoSelect = document.getElementById('crypto');
if (
[].slice.call(cryptoSelect.options).some(function (opt) {
return opt.value === crypto;
})
) {
cryptoSelect.value = crypto;
}
}
if (dataParam) {
const decoded = dataParam;
try {
document.getElementById('data').value = JSON.stringify(
JSON.parse(decoded),
JSON.parse(dataParam),
null,
2,
);
} catch (error) {
document.getElementById('data').value = decoded;
} catch (_) {
document.getElementById('data').value = dataParam;
}
}
if (headersParam) {
try {
var parsed = JSON.parse(headersParam);
Object.keys(parsed).forEach(function (k) {
addHeaderRow(k, parsed[k]);
});
} catch (_) {
// fallback: 用默认 header
defaultHeaders.forEach(function (h) {
addHeaderRow(h.key, h.value);
});
}
} else {
defaultHeaders.forEach(function (h) {
addHeaderRow(h.key, h.value);
});
}
if (kvParams) {
try {
var parsed = JSON.parse(kvParams);
// 先填充 kv 列表,再切换到 kv 模式
Object.keys(parsed).forEach(function (k) {
addKvRow(k, String(parsed[k]));
});
if (paramMode === 'kv') {
switchParamTab('kv');
}
} catch (_) {
/* ignore */
}
} else if (paramMode === 'kv' && dataParam) {
// 从 data 参数同步到键值对模式
try {
var data = JSON.parse(dataParam);
Object.keys(data).forEach(function (k) {
addKvRow(k, String(data[k]));
});
switchParamTab('kv');
} catch (_) {
/* ignore */
}
}
})();
+695
View File
@@ -0,0 +1,695 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>API 参数和返回内容解析</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 900px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 24px;
}
.form-group {
margin-bottom: 24px;
}
label {
display: block;
font-size: 14px;
font-weight: 500;
color: #555;
margin-bottom: 8px;
}
textarea {
width: 100%;
padding: 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-family: 'Courier New', monospace;
font-size: 13px;
resize: vertical;
min-height: 200px;
outline: none;
}
textarea:focus {
border-color: #333;
}
.radio-group {
display: flex;
gap: 24px;
margin-bottom: 24px;
}
.radio-item {
display: flex;
align-items: center;
gap: 8px;
}
.radio-item input[type="radio"] {
cursor: pointer;
}
.radio-item label {
margin: 0;
cursor: pointer;
font-size: 14px;
}
button {
background: #333;
color: white;
padding: 12px 28px;
border: none;
border-radius: 6px;
font-size: 15px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s ease;
}
button + button {
margin-left: 12px;
}
button:hover {
background: #555;
}
.result-section {
margin-top: 24px;
}
.result-section label {
margin-bottom: 12px;
}
.decode-result {
white-space: pre-wrap;
word-break: break-all;
background: #f9f9f9;
padding: 16px;
border-radius: 6px;
border: 1px solid #eee;
min-height: 200px;
max-height: 400px;
overflow: auto;
font-family: 'Courier New', monospace;
font-size: 13px;
}
.decode-result .json-key { color: #881391; }
.decode-result .json-string { color: #1a7f37; }
.decode-result .json-number { color: #0550ae; }
.decode-result .json-boolean { color: #cf222e; }
.decode-result .json-null { color: #656d76; }
.example-section {
margin-top: 32px;
padding-top: 24px;
border-top: 1px solid #eee;
}
.example-section h2 {
font-size: 18px;
font-weight: 600;
color: #333;
margin-bottom: 16px;
}
.example-section img {
max-width: 100%;
height: auto;
border-radius: 6px;
margin-bottom: 16px;
border: 1px solid #eee;
}
/* new elements for multi-crypto support */
.crypto-bar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 20px;
padding: 12px 16px;
background: #fafafa;
border-radius: 6px;
border: 1px solid #eee;
}
.crypto-bar .bar-label {
font-size: 13px;
font-weight: 500;
color: #555;
margin-right: 8px;
}
.crypto-btn {
padding: 5px 14px;
border-radius: 4px;
border: 1px solid #ddd;
background: #fff;
cursor: pointer;
font-size: 13px;
font-weight: 500;
color: #666;
transition: all 0.15s ease;
}
.crypto-btn:hover {
border-color: #333;
color: #333;
background: #f5f5f5;
}
.crypto-btn.active {
border-color: #333;
background: #333;
color: #fff;
}
.crypto-btn .badge {
display: inline-block;
font-size: 10px;
background: rgba(0,0,0,0.08);
border-radius: 4px;
padding: 0 5px;
margin-left: 3px;
}
.crypto-btn.active .badge {
background: rgba(255,255,255,0.2);
}
.mode-row {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.mode-row .mode-label {
font-size: 13px;
font-weight: 500;
color: #555;
}
.mode-row .radio-group {
margin-bottom: 0;
}
.info-hint {
font-size: 12px;
color: #888;
margin-top: 6px;
padding: 6px 10px;
background: #fafafa;
border-radius: 4px;
border-left: 3px solid #999;
}
.info-hint.warn {
border-left-color: #e67e22;
background: #fef9f0;
color: #d35400;
}
.action-row {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 4px;
}
.action-row button + button {
margin-left: 0;
}
button.btn-secondary {
background: #e8e8e8;
color: #444;
}
button.btn-secondary:hover {
background: #d5d5d5;
}
button.btn-secondary:disabled {
opacity: 0.4;
cursor: not-allowed;
pointer-events: none;
}
button.btn-success {
background: #4caf50;
}
button.btn-success:hover {
background: #43a047;
}
button.btn-success:disabled {
opacity: 0.4;
cursor: not-allowed;
pointer-events: none;
}
.result-section .section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.result-section .section-header label {
margin: 0;
}
.copy-btn {
font-size: 12px;
padding: 3px 12px;
border-radius: 4px;
border: 1px solid #ddd;
background: #fff;
cursor: pointer;
color: #666;
transition: all 0.15s;
}
.copy-btn:hover {
background: #333;
color: #fff;
border-color: #333;
}
.example-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 12px;
}
.example-card {
background: #fafafa;
border-radius: 6px;
padding: 16px;
border: 1px solid #eee;
}
.example-card h3 {
font-size: 14px;
font-weight: 600;
color: #555;
margin-bottom: 8px;
}
.example-card pre {
font-family: 'Courier New', monospace;
font-size: 12px;
line-height: 1.5;
background: #fff;
padding: 10px;
border-radius: 4px;
overflow-x: auto;
border: 1px solid #e8e8e8;
max-height: 120px;
overflow-y: auto;
margin-bottom: 8px;
}
.example-card .tag {
display: inline-block;
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 3px;
margin-bottom: 6px;
}
.tag-eapi { background: #e3f2fd; color: #1565c0; }
.tag-weapi { background: #fce4ec; color: #c62828; }
.tag-linuxapi { background: #e8f5e9; color: #2e7d32; }
.tag-xeapi { background: #f3e5f5; color: #7b1fa2; }
.tag-api { background: #fff3e0; color: #e65100; }
@media (max-width: 640px) {
.example-grid { grid-template-columns: 1fr; }
.crypto-bar { gap: 4px; }
.crypto-btn { padding: 4px 10px; font-size: 12px; }
}
</style>
</head>
<body>
<div id="app" class="container">
<h1>API 参数和返回内容解析</h1>
<!-- 加密方式选择 -->
<div class="crypto-bar">
<span class="bar-label">加密方式</span>
<button
v-for="c in cryptoList"
:key="c.value"
class="crypto-btn"
:class="{ active: crypto === c.value }"
@click="selectCrypto(c.value)"
>
{{ c.label }}
<span class="badge">{{ c.badge }}</span>
</button>
</div>
<div class="mode-row">
<span class="mode-label">数据类型</span>
<div class="radio-group">
<div class="radio-item">
<input
type="radio"
id="mode-req"
:value="true"
v-model="isReq"
:disabled="cryptoInfo.reqDisabled"
/>
<label for="mode-req">请求数据 request</label>
</div>
<div class="radio-item">
<input
type="radio"
id="mode-resp"
:value="false"
v-model="isReq"
:disabled="cryptoInfo.respDisabled"
/>
<label for="mode-resp">返回数据 response</label>
</div>
</div>
</div>
<div class="form-group">
<label for="dataInput">{{ cryptoInfo.inputLabel }}</label>
<textarea
id="dataInput"
v-model="encryptedData"
:rows="crypto === 'xeapi' ? 8 : 10"
:placeholder="cryptoInfo.placeholder"
></textarea>
<div class="info-hint" :class="{ warn: cryptoInfo.warning }">
{{ cryptoInfo.hint }}
</div>
</div>
<div class="action-row">
<button @click="decrypt">解密</button>
<button class="btn-success" @click="sendToApi" :disabled="!canSend">
填入 API 调试
</button>
<button class="btn-secondary" @click="loadExample">加载示例</button>
<button class="btn-secondary" @click="clearAll">清空</button>
</div>
<div class="result-section">
<div class="section-header">
<label>解密结果:</label>
<button
v-if="result && result !== '{}' && result !== 'null'"
class="copy-btn"
@click="copyResult"
>
复制
</button>
</div>
<pre class="decode-result" v-html="highlightedResult"></pre>
</div>
<div class="example-section">
<h2>使用示例</h2>
<img src="/static/eapi_params.png" alt="请求示例" />
<img src="/static/eapi_response.png" alt="响应示例" />
<div class="example-grid">
<div class="example-card">
<span class="tag tag-eapi">eapi</span>
<h3>请求参数解密</h3>
<pre>输入 hex 字符串,解密后得到请求 URL 和参数</pre>
<button class="copy-btn" @click="loadExampleData('eapi_req')">加载示例</button>
</div>
<div class="example-card">
<span class="tag tag-linuxapi">linuxapi</span>
<h3>请求 eparams 解密</h3>
<pre>AES-ECB 解密 linuxapi 的 eparams 参数(hex)</pre>
<button class="copy-btn" @click="loadExampleData('linuxapi_req')">加载示例</button>
</div>
</div>
</div>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios"></script>
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
<script>
const cryptoInfos = {
eapi: {
label: 'eapi',
badge: 'AES-ECB',
inputLabel: '十六进制字符串(Hex)',
placeholder: '粘贴 eapi 加密后的 Hex 字符串...',
hint: 'eapi 使用 AES-ECB 加密,密钥 e82ckenh8dichen8。请求格式: url-36cd479b6b5-data-36cd479b6b5-md5',
warning: false,
reqDisabled: false,
respDisabled: false,
},
weapi: {
label: 'weapi',
badge: 'AES-CBC+RSA',
inputLabel: '十六进制字符串(Hex)',
placeholder: '粘贴 weapi 返回数据的 Hex 字符串(e_r=true 时)...',
hint: 'weapi 请求解密需要 RSA 私钥,暂不支持。仅支持返回数据解密(同 eapi 的 AES-ECB)',
warning: true,
reqDisabled: true,
respDisabled: false,
},
linuxapi: {
label: 'linuxapi',
badge: 'AES-ECB',
inputLabel: '十六进制字符串(Hex)',
placeholder: '粘贴 linuxapi 的 eparams (Hex 格式)...',
hint: 'linuxapi 请求 eparams 使用 AES-ECB 加密,密钥 rFgB&h#%2?^eDg:Q。返回为明文 JSON',
warning: false,
reqDisabled: false,
respDisabled: false,
},
xeapi: {
label: 'xeapi',
badge: 'X25519+AES',
inputLabel: 'Base64 编码字符串',
placeholder: '粘贴 xeapi 返回数据的 Base64 原始二进制...',
hint: 'xeapi 请求涉及 X25519 ECDH 密钥交换,暂不支持。返回数据使用 AES-ECB + eapiKey 加密,可能带 gzip',
warning: true,
reqDisabled: true,
respDisabled: false,
},
api: {
label: 'api',
badge: '明文',
inputLabel: 'JSON 文本',
placeholder: '粘贴 api 的请求或返回 JSON...',
hint: 'api(明文)不经加密,直接传递 JSON 数据',
warning: false,
reqDisabled: false,
respDisabled: false,
},
}
const examples = {
eapi_req:
'AD96DDB984491E79B6F429DD650C6E2AE524627AC223AC9A123C66BB0997965950FED137544A93DFC718E16F57C8C121AF537086F395570A5602A3922366D11964DAFACD7830AACABF62E5650E67F457E79C1D2E13502391FC3487216CC5BF8681843FCB8E05559487EB18AAC1BE0EFEA4F7B6A050478366153A9426C238B8869600B275704555A9EB94C92E4F3FDABE9E0BCE07645410D0AA7B675698A4CAE6CD3620633ABF0B849A4244CC8DFC5DB2646D5EA9B3954E62BFEF19AFEAFDDC34E55C3E9A1DD3167CF53D443617108141',
linuxapi_req:
'A0D9583F4C5FF68DE851D2893A49DE98CC059A8845B664AA2459CEA7271A2C0E5BCA8A188E1BE398DB4C9A3FC117E19C9BAC491F454D17D403C2389476AB0FF4296B00294AD1EBDA141C188DF918F6B9599DAA5739928FD52B4AE580D8657903CE3C6633D2E46AD242408AE219B8191E',
}
const app = Vue.createApp({
data() {
return {
crypto: 'eapi',
encryptedData: '',
result: '{}',
isReq: true,
cryptoList: [
{ value: 'eapi', label: 'eapi', badge: 'AES-ECB' },
{ value: 'weapi', label: 'weapi', badge: 'AES-CBC+RSA' },
{ value: 'linuxapi', label: 'linuxapi', badge: 'AES-ECB' },
{ value: 'xeapi', label: 'xeapi', badge: 'X25519+AES' },
{ value: 'api', label: 'api', badge: '明文' },
],
}
},
mounted() {
this.loadExample()
},
computed: {
cryptoInfo() {
return cryptoInfos[this.crypto] || cryptoInfos.eapi
},
isRequestMode() {
return this.isReq === true || this.isReq === 'true'
},
canSend() {
if (!this.isRequestMode) return false
if (!this.result || this.result === '{}' || this.result === 'null') return false
try {
JSON.parse(this.result)
return true
} catch (error) {
return false
}
},
highlightedResult() {
if (!this.result || this.result === '') return ''
try {
const parsed = typeof this.result === 'string' ? JSON.parse(this.result) : this.result
const json = JSON.stringify(parsed, null, 2)
return this.syntaxHighlight(json)
} catch (error) {
return this.escapeHtml(String(this.result))
}
},
},
watch: {
crypto(val) {
const info = cryptoInfos[val]
if (this.isReq && info.reqDisabled) {
this.isReq = false
} else if (!this.isReq && info.respDisabled) {
this.isReq = true
}
},
},
methods: {
selectCrypto(val) {
this.crypto = val
},
syntaxHighlight(json) {
const escaped = this.escapeHtml(json)
return escaped
.replace(/(?:"(?:\\.|[^"\\])*")\s*:/g, '<span class="json-key">$&</span>')
.replace(/:(\s*)(?:"(?:\\.|[^"\\])*")/g, ':<span class="json-string">$1$2</span>')
.replace(/:\s*(\d+(?:\.\d+)?)/g, ': <span class="json-number">$1</span>')
.replace(/:\s*(true|false)/g, ': <span class="json-boolean">$1</span>')
.replace(/:\s*(null)/g, ': <span class="json-null">$1</span>')
},
escapeHtml(text) {
const div = document.createElement('div')
div.textContent = text
return div.innerHTML
},
formatResult(value) {
if (value == null || value === '') return ''
try {
const parsed = typeof value === 'string' ? JSON.parse(value) : value
return JSON.stringify(parsed, null, 2)
} catch (error) {
return String(value)
}
},
async decrypt() {
if (!this.encryptedData || !this.encryptedData.trim()) {
alert('请先输入要解密的数据')
return
}
try {
const res = await axios({
url: `/decrypt?crypto=${this.crypto}&isReq=${this.isReq}&timestamp=${Date.now()}`,
method: 'post',
data: { data: this.encryptedData },
})
this.result = JSON.stringify(res.data.data)
} catch (error) {
console.error(error)
const msg = error?.response?.data?.message || error?.message || '解密失败,数据格式错误'
alert(msg)
this.result = '{}'
}
},
sendToApi() {
if (!this.canSend) return
const payload = JSON.parse(this.result)
const params = new URLSearchParams()
const uri = payload.uri || payload.url || payload.path || ''
params.set('uri', uri)
params.set('crypto', this.crypto)
const data = payload.params || payload.data || payload.body || payload.payload || payload.request || {}
params.set('data', JSON.stringify(data))
window.open(`/api.html?${params.toString()}`, '_blank')
},
loadExample() {
switch (this.crypto) {
case 'eapi':
this.encryptedData = examples.eapi_req
break
case 'linuxapi':
this.isReq = true
this.encryptedData = examples.linuxapi_req
break
case 'xeapi':
this.isReq = false
this.encryptedData = ''
break
default:
this.encryptedData = ''
}
if (this.encryptedData) this.decrypt()
},
loadExampleData(type) {
switch (type) {
case 'eapi_req':
this.crypto = 'eapi'
this.isReq = true
this.encryptedData = examples.eapi_req
break
case 'linuxapi_req':
this.crypto = 'linuxapi'
this.isReq = true
this.encryptedData = examples.linuxapi_req
break
}
if (this.encryptedData) this.decrypt()
},
clearAll() {
this.encryptedData = ''
this.result = '{}'
},
copyResult() {
const text = typeof this.result === 'string' ? this.result : JSON.stringify(this.result, null, 2)
navigator.clipboard.writeText(text).then(() => {
alert('已复制到剪贴板')
})
},
},
})
app.mount('#app')
</script>
</body>
</html>
+2 -2
View File
@@ -1611,9 +1611,9 @@ function instantiateRuntime(){
function GenerateFP(floatArray) {
let PCMBuffer = Float32Array.from(floatArray)
console.log('[afp] input samples n=', PCMBuffer.length)
console.info('[afp] input samples n=', PCMBuffer.length)
return instantiateRuntime().then((fpRuntime) => {
console.log('[afp] begin fingerprinting')
console.info('[afp] begin fingerprinting')
let fp_vector = fpRuntime.ExtractQueryFP(PCMBuffer.buffer)
let result_buf = new Uint8Array(fp_vector.size());
for (let t = 0; t < fp_vector.size(); t++)
+212 -43
View File
@@ -1,27 +1,142 @@
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>听歌识曲 Demo</title>
<style>
* {
font-family: sans-serif;
margin: 0;
padding: 0;
box-sizing: border-box;
}
pre {
font-family: monospace;
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 8px;
}
.subtitle {
font-size: 13px;
color: #666;
margin-bottom: 24px;
}
hr {
border: none;
border-top: 1px solid #eee;
margin: 20px 0;
}
p {
font-size: 14px;
color: #555;
line-height: 1.6;
margin-bottom: 12px;
}
a {
font-family: sans-serif;
color: #333;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.section {
margin-bottom: 24px;
}
.section h3 {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 12px;
}
.control-group {
display: flex;
gap: 12px;
flex-wrap: wrap;
align-items: center;
margin-bottom: 16px;
}
button {
padding: 10px 20px;
background: #333;
color: white;
font-size: 14px;
font-weight: 500;
border: none;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
}
button:hover {
background: #555;
}
button:disabled {
background: #999;
cursor: not-allowed;
}
input[type="file"] {
padding: 10px 14px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
}
.checkbox-group {
display: flex;
align-items: center;
gap: 8px;
}
.checkbox-group input[type="checkbox"] {
cursor: pointer;
}
.checkbox-group label {
margin: 0;
cursor: pointer;
font-size: 14px;
color: #555;
}
audio {
width: 100%;
margin-bottom: 16px;
}
canvas {
width: 100%;
height: 0;
transition: all linear 0.1s;
background: #f9f9f9;
border-radius: 6px;
}
.canvas-active {
@@ -29,39 +144,80 @@
}
pre {
overflow: scroll;
font-family: 'Courier New', monospace;
font-size: 13px;
color: #666;
white-space: pre-wrap;
word-wrap: break-word;
max-height: 400px;
overflow-y: auto;
padding: 16px;
background: #f9f9f9;
border-radius: 6px;
border: 1px solid #eee;
}
.warning {
padding: 12px 16px;
background: #fef3c7;
border-radius: 6px;
font-size: 14px;
color: #92400e;
margin-bottom: 16px;
}
</style>
</head>
<body>
<h1>听歌识曲 Demo (Credit: <a href="https://github.com/mos9527/ncm-afp" target="_blank">https://github.com/mos9527/ncm-afp</a>)</h1>
<hr>
<p><b>DISCLAIMER: </b></p>
<p>This site uses the offical NetEase audio matcher APIs (reverse engineered from <a
href="https://fn.music.163.com/g/chrome-extension-home-page-beta/">https://fn.music.163.com/g/chrome-extension-home-page-beta/</a>)
</p>
<p>And DOES NOT condone copyright infringment nor intellectual property theft.</p>
<hr>
<p><b>NOTE:</b></p>
<p>Before start using the site, you may want to access this link first:</p>
<a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a>
<p>Since Netease APIs do not have CORS headers, this is required to alleviate this restriction.</p>
<hr>
<p>Usage:</p>
<li>Select your audio file through "Choose File" picker</li>
<li>Hit the "Clip" button and wait for the results!</li>
<div class="container">
<h1>听歌识曲 Demo</h1>
<p class="subtitle">Credit: <a href="https://github.com/mos9527/ncm-afp" target="_blank">https://github.com/mos9527/ncm-afp</a></p>
<audio id="audio" controls autoplay></audio>
<canvas id="canvas"></canvas>
<button id="invoke">Clip</button>
<input type="file" name="picker" accept="*" id="file">
<hr>
<label for="use-mic">Mix in Microphone input</label>
<input type="checkbox" name="use-mic" id="usemic">
<hr>
<pre id="logs"></pre>
<hr>
<div class="warning">
<strong>免责声明:</strong>本站点使用网易云音乐官方音频识别API(逆向自 <a href="https://fn.music.163.com/g/chrome-extension-home-page-beta/" target="_blank">Chrome 扩展页面</a>),不鼓励版权侵犯或知识产权盗窃。
</div>
<div class="section">
<h3>使用说明</h3>
<p>在使用本站点之前,您可能需要先访问以下链接:</p>
<p><a href="https://cors-anywhere.herokuapp.com/corsdemo" target="_blank">https://cors-anywhere.herokuapp.com/corsdemo</a></p>
<p>由于网易云音乐API没有CORS头,这是解决此限制的必要步骤。</p>
</div>
<div class="section">
<h3>使用方法</h3>
<ul style="padding-left: 20px; font-size: 14px; color: #555;">
<li>通过"选择文件"选择您的音频文件</li>
<li>点击"识别"按钮并等待结果</li>
</ul>
</div>
<hr>
<audio id="audio" controls autoplay></audio>
<canvas id="canvas"></canvas>
<div class="control-group">
<button id="invoke">识别</button>
<input type="file" name="picker" accept="*" id="file">
</div>
<div class="control-group">
<div class="checkbox-group">
<input type="checkbox" name="use-mic" id="usemic">
<label for="usemic">混合麦克风输入</label>
</div>
</div>
<hr>
<h3 style="font-size: 16px; font-weight: 600; color: #333; margin-bottom: 12px;">日志</h3>
<pre id="logs"></pre>
</div>
</body>
<script src="./afp.wasm.js"></script>
<script src="./afp.js"></script>
<script type="module">
@@ -76,13 +232,17 @@
let canvas = document.getElementById('canvas')
let canvasCtx = canvas.getContext('2d')
let logs = document.getElementById('logs')
logs.write = line => logs.innerHTML += line + '\n'
logs.write = line => {
// Append log lines as text to avoid interpreting content as HTML
logs.appendChild(document.createTextNode(line));
logs.appendChild(document.createElement('br'));
}
function RecorderCallback(channelL) {
let sampleBuffer = new Float32Array(channelL.subarray(0, duration * 8000))
GenerateFP(sampleBuffer).then(FP => {
logs.write(`[index] Generated FP ${FP}`)
logs.write('[index] Now querying, please wait...')
logs.write(`[index] 生成指纹 ${FP}`)
logs.write('[index] 正在查询,请稍候...')
fetch(
'/audio/match?' +
new URLSearchParams({
@@ -91,9 +251,9 @@
method: 'POST'
}).then(resp => resp.json()).then(resp => {
if (!resp.data.result) {
return logs.write('[index] Query failed with no results.')
return logs.write('[index] 查询失败,无结果')
}
logs.write(`[index] Query complete. Results=${resp.data.result.length}`)
logs.write(`[index] 查询完成。结果数量=${resp.data.result.length}`)
for (var song of resp.data.result) {
logs.write(
`[result] <a target="_blank" href="https://music.163.com/song?id=${song.song.id}">${song.song.name} - ${song.song.album.name} (${song.startTime / 1000}s)</a>`
@@ -104,20 +264,19 @@
}
function InitAudioCtx() {
// AFP.wasm can't do it with anything other than 8KHz
audioCtx = new AudioContext({ 'sampleRate': 8000 })
if (audioCtx.state == 'suspended')
return false
let audioNode = audioCtx.createMediaElementSource(audio)
audioCtx.audioWorklet.addModule('rec.js').then(() => {
recorderNode = new AudioWorkletNode(audioCtx, 'timed-recorder')
audioNode.connect(recorderNode) // recorderNode doesn't output anything
audioNode.connect(recorderNode)
audioNode.connect(audioCtx.destination)
recorderNode.port.onmessage = event => {
switch (event.data.message) {
case 'finished':
RecorderCallback(event.data.recording)
clip.innerHTML = 'Clip'
clip.innerHTML = '识别'
clip.disabled = false
canvas.classList.remove('canvas-active')
break
@@ -130,7 +289,6 @@
logs.write(event.data.message)
}
}
// Attempt to get user's microphone and connect it to the AudioContext.
navigator.mediaDevices.getUserMedia({
audio: {
echoCancellation: false,
@@ -142,7 +300,7 @@
micSourceNode = audioCtx.createMediaStreamSource(micStream);
micSourceNode.connect(recorderNode)
usemic.checked = true
logs.write('[rec.js] Microphone attached.')
logs.write('[rec.js] 麦克风已连接')
});
});
return true
@@ -161,10 +319,20 @@
else
micSourceNode.connect(recorderNode)
})
function escapeHtml(str) {
return String(str)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
.replace(/\//g, '&#x2F;');
}
file.addEventListener('change', event => {
file.files[0].arrayBuffer().then(
async buffer => {
logs.write(`[index] File ${file.files[0].name} loaded.`)
const safeName = escapeHtml(file.files[0].name)
logs.write(`[index] 文件 ${safeName} 已加载`)
audio.src = window.URL.createObjectURL(new Blob([buffer]))
clip.disabled = false
})
@@ -188,12 +356,13 @@
UpdateCanvas()
let requestCtx = setInterval(() => {
try {
if (InitAudioCtx()) { // Put this here so we don't have to deal with the 'user did not interact' thing
if (InitAudioCtx()) {
clearInterval(requestCtx)
logs.write('[rec.js] Audio Context started.')
logs.write('[rec.js] 音频上下文已启动')
}
} catch {
// Fail silently
}
}, 100)
</script>
</html>
+296 -43
View File
@@ -5,67 +5,320 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>更新头像</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.container {
background: white;
border-radius: 12px;
padding: 40px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
max-width: 400px;
width: 100%;
text-align: center;
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 8px;
}
.subtitle {
font-size: 14px;
color: #666;
margin-bottom: 32px;
}
.avatar-wrapper {
position: relative;
width: 160px;
height: 160px;
margin: 0 auto 32px;
}
.avatar {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
border: 3px solid #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.avatar-wrapper.loading .avatar {
opacity: 0.5;
}
.loading-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background: rgba(255, 255, 255, 0.9);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.2s ease;
}
.avatar-wrapper.loading .loading-overlay {
opacity: 1;
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid #e0e0e0;
border-top-color: #333;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.upload-btn {
display: inline-block;
position: relative;
padding: 12px 28px;
background: #333;
color: white;
font-size: 15px;
font-weight: 500;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
border: none;
}
.upload-btn:hover {
background: #555;
}
.upload-btn input[type="file"] {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
.login-link {
display: block;
margin-top: 24px;
color: #666;
font-size: 14px;
text-decoration: none;
}
.login-link:hover {
color: #333;
text-decoration: underline;
}
.toast {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%) translateY(100px);
padding: 12px 20px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
color: white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
opacity: 0;
transition: all 0.3s ease;
z-index: 1000;
max-width: 90%;
text-align: center;
}
.toast.show {
transform: translateX(-50%) translateY(0);
opacity: 1;
}
.toast.success {
background: #10b981;
}
.toast.error {
background: #ef4444;
}
.toast.info {
background: #3b82f6;
}
.hint {
margin-top: 20px;
font-size: 12px;
color: #999;
}
</style>
</head>
<body>
<div>
<a href="/qrlogin-nocookie.html">
如果没登录,请先登录
<div class="container">
<h1>更新头像</h1>
<p class="subtitle">选择一张图片作为您的新头像</p>
<div class="avatar-wrapper" id="avatarWrapper">
<img id="avatar" class="avatar" src="" alt="头像" />
<div class="loading-overlay">
<div class="spinner"></div>
</div>
</div>
<label class="upload-btn">
选择图片
<input id="file" type="file" accept="image/*" />
</label>
<a href="/qrlogin-nocookie.html" class="login-link">
还没有登录?点击登录
</a>
<p class="hint">支持 JPG、PNG 格式,建议尺寸 200x200</p>
</div>
<input id="file" type="file" />
<img id="avatar" style="height: 200px; width: 200px; border-radius: 50%" />
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js
"></script>
<div id="toast" class="toast"></div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script>
main()
async function main() {
document.querySelector('input[type="file"]').addEventListener(
'change',
function (e) {
var file = this.files[0]
upload(file)
},
false,
)
const res = await axios({
url: `/user/detail?uid=32953014&timestamp=${Date.now()}`,
withCredentials: true, //跨域的话必须设置
})
document.querySelector('#avatar').src = res.data.profile.avatarUrl
const fileInput = document.querySelector('input[type="file"]');
const avatarWrapper = document.getElementById('avatarWrapper');
fileInput.addEventListener('change', function(e) {
const file = this.files[0];
if (file) {
upload(file);
}
}, false);
try {
showToast('正在加载头像...', 'info');
avatarWrapper.classList.add('loading');
const res = await axios({
url: `/user/detail?uid=32953014&timestamp=${Date.now()}`,
withCredentials: true
});
document.querySelector('#avatar').src = res.data.profile.avatarUrl;
hideToast();
} catch (error) {
hideToast();
showToast('加载头像失败,请刷新页面重试', 'error');
console.error('加载头像失败:', error);
} finally {
avatarWrapper.classList.remove('loading');
}
}
async function upload(file) {
var formData = new FormData()
formData.append('imgFile', file)
const imgSize = await getImgSize(file)
const res = await axios({
method: 'post',
url: `/avatar/upload?cookie=${localStorage.getItem('cookie')}&imgSize=${imgSize.width
}&imgX=0&imgY=0&timestamp=${Date.now()}`,
headers: {
'Content-Type': 'multipart/form-data',
},
data: formData,
})
document.querySelector('#avatar').src = res.data.data.url
const avatarWrapper = document.getElementById('avatarWrapper');
if (!file.type.startsWith('image/')) {
showToast('请选择图片文件', 'error');
return;
}
try {
showToast('正在上传头像...', 'info');
avatarWrapper.classList.add('loading');
var formData = new FormData();
formData.append('imgFile', file);
const imgSize = await getImgSize(file);
const res = await axios({
method: 'post',
url: `/avatar/upload?cookie=${localStorage.getItem('cookie')}&imgSize=${imgSize.width}&imgX=0&imgY=0&timestamp=${Date.now()}`,
headers: {
'Content-Type': 'multipart/form-data',
},
data: formData,
});
document.querySelector('#avatar').src = res.data.data.url;
showToast('头像更新成功!', 'success');
} catch (error) {
console.error('上传失败:', error);
const errorMsg = error.response?.data?.message || error.message || '上传失败,请重试';
showToast(errorMsg, 'error');
} finally {
avatarWrapper.classList.remove('loading');
}
}
function getImgSize(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function (theFile) {
let image = new Image()
image.src = theFile.target.result
image.onload = function () {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(theFile) {
let image = new Image();
image.src = theFile.target.result;
image.onload = function() {
resolve({
width: this.width,
height: this.height,
})
}
}
})
});
};
image.onerror = function() {
reject(new Error('图片加载失败'));
};
};
reader.onerror = function() {
reject(new Error('文件读取失败'));
};
});
}
function showToast(message, type = 'info') {
const toast = document.getElementById('toast');
toast.textContent = message;
toast.className = `toast ${type}`;
requestAnimationFrame(() => {
toast.classList.add('show');
});
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
}
function hideToast() {
const toast = document.getElementById('toast');
toast.classList.remove('show');
}
</script>
</body>
+569 -90
View File
@@ -1,99 +1,578 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>云盘上传</title>
</head>
<body>
<div>
<a href="/qrlogin-nocookie.html">
如果没登录,请先登录
</a>
</div>
<input id="file" type="file" multiple />
<div id="app">
<ul>
<li v-for="(item,index) in songs" :key="index">
{{item.songName}}
</li>
</ul>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/vue"></script>
<script>
const app = Vue.createApp({
data() {
return {
songs: []
}
},
created() {
this.getData()
},
methods: {
getData() {
console.log('getdata');
const _this = this
axios({
url: `/user/cloud?time=${Date.now()}&cookie=${localStorage.getItem('cookie')}`,
}).then(res => {
console.log(res.data)
_this.songs = res.data.data
})
}
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>云盘上传</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
}).mount('#app')
const fileUpdateTime = {}
let fileLength = 0
function main() {
document
.querySelector('input[type="file"]')
.addEventListener('change', function (e) {
console.log(this.files)
let currentIndx = 0
fileLength = this.files.length
for (const item of this.files) {
currentIndx += 1
upload(item, currentIndx)
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 24px;
}
.login-link {
display: block;
margin-bottom: 24px;
color: #666;
font-size: 14px;
text-decoration: none;
}
.login-link:hover {
color: #333;
text-decoration: underline;
}
.mode-section {
margin-bottom: 24px;
padding: 16px;
background: #f9f9f9;
border-radius: 8px;
}
.mode-section label {
display: block;
font-size: 14px;
font-weight: 500;
color: #333;
margin-bottom: 12px;
}
.mode-options {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.mode-option {
display: flex;
align-items: flex-start;
gap: 8px;
cursor: pointer;
}
.mode-option input[type="radio"] {
margin-top: 3px;
}
.mode-option-text {
display: flex;
flex-direction: column;
}
.mode-option-title {
font-size: 14px;
color: #333;
}
.mode-option-desc {
font-size: 12px;
color: #999;
margin-top: 2px;
}
.mode-option input[type="radio"]:checked + .mode-option-text .mode-option-title {
color: #333;
font-weight: 500;
}
.upload-section {
margin-bottom: 32px;
}
.upload-btn {
display: inline-block;
padding: 12px 28px;
background: #333;
color: white;
font-size: 15px;
font-weight: 500;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
border: none;
}
.upload-btn:hover {
background: #555;
}
.upload-btn input[type="file"] {
display: none;
}
.upload-btn.disabled {
background: #ccc;
cursor: not-allowed;
}
.songs-list {
list-style: none;
}
.song-item {
padding: 12px 16px;
border-bottom: 1px solid #eee;
font-size: 14px;
color: #333;
}
.song-item:last-child {
border-bottom: none;
}
.empty-state {
text-align: center;
padding: 40px 20px;
color: #999;
font-size: 14px;
}
.loading {
text-align: center;
padding: 20px;
color: #666;
}
.progress-section {
margin-bottom: 24px;
display: none;
}
.progress-section.active {
display: block;
}
.progress-item {
margin-bottom: 12px;
padding: 12px;
background: #f9f9f9;
border-radius: 6px;
}
.progress-item .name {
font-size: 14px;
color: #333;
margin-bottom: 8px;
word-break: break-all;
}
.progress-item .status {
font-size: 12px;
color: #666;
margin-bottom: 6px;
}
.progress-bar {
height: 6px;
background: #e0e0e0;
border-radius: 3px;
overflow: hidden;
}
.progress-bar .fill {
height: 100%;
background: #333;
border-radius: 3px;
transition: width 0.3s ease;
width: 0%;
}
.progress-item.success .fill {
background: #4caf50;
}
.progress-item.error .fill {
background: #f44336;
}
.progress-item.error .status {
color: #f44336;
}
.info-text {
font-size: 12px;
color: #999;
margin-top: 8px;
}
.warning-text {
font-size: 12px;
color: #e65100;
margin-top: 8px;
}
</style>
</head>
<body>
<div class="container">
<h1>云盘上传</h1>
<a href="/qrlogin-nocookie.html" class="login-link">还没登录?点击登录</a>
<div class="mode-section">
<label>上传模式</label>
<div class="mode-options">
<label class="mode-option">
<input type="radio" name="uploadMode" value="direct" checked />
<span class="mode-option-text">
<span class="mode-option-title">客户端直传</span>
<span class="mode-option-desc">文件直接上传到云存储,支持大文件,适合 Vercel 等平台</span>
</span>
</label>
<label class="mode-option">
<input type="radio" name="uploadMode" value="proxy" />
<span class="mode-option-text">
<span class="mode-option-title">后端代理</span>
<span class="mode-option-desc">文件通过服务器转发,更简洁,需要服务器支持大文件</span>
</span>
</label>
</div>
</div>
<div class="upload-section">
<label class="upload-btn" id="uploadBtn">
选择文件(支持多选)
<input id="file" type="file" multiple accept="audio/*" />
</label>
<p class="info-text" id="modeInfo">支持大文件上传,文件将直接传输到云存储服务器</p>
</div>
<div id="progressSection" class="progress-section"></div>
<div id="app">
<div v-if="loading" class="loading">加载中...</div>
<ul v-else-if="songs.length > 0" class="songs-list">
<li v-for="(item, index) in songs" :key="index" class="song-item">
{{ item.songName }}
</li>
</ul>
<div v-else class="empty-state">暂无云盘歌曲</div>
</div>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsmediatags/3.9.5/jsmediatags.min.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
songs: [],
loading: false,
}
},
created() {
this.getData()
},
methods: {
getData() {
this.loading = true
axios({
url: `/user/cloud?time=${Date.now()}&cookie=${localStorage.getItem('cookie')}`,
})
.then((res) => {
this.songs = res.data.data || []
})
.catch((err) => {
console.error('获取云盘数据失败:', err)
})
.finally(() => {
this.loading = false
})
},
},
}).mount('#app')
let isUploading = false
let uploadMode = 'direct'
const progressSection = document.getElementById('progressSection')
const uploadBtn = document.getElementById('uploadBtn')
const fileInput = document.querySelector('input[type="file"]')
const modeInfo = document.getElementById('modeInfo')
document.querySelectorAll('input[name="uploadMode"]').forEach(radio => {
radio.addEventListener('change', function() {
uploadMode = this.value
if (uploadMode === 'direct') {
modeInfo.textContent = '支持大文件上传,文件将直接传输到云存储服务器'
modeInfo.className = 'info-text'
} else {
modeInfo.textContent = '文件将通过服务器转发,服务器需支持大文件上传(Vercel 限制 4.5MB)'
modeInfo.className = 'warning-text'
}
})
}
main()
function upload(file, currentIndx) {
var formData = new FormData()
formData.append('songFile', file)
axios({
method: 'post',
url: `/cloud?time=${Date.now()}&cookie=${localStorage.getItem('cookie')}`,
headers: {
'Content-Type': 'multipart/form-data',
},
data: formData,
}).then(res => {
console.log(`${file.name} 上传成功`)
if (currentIndx >= fileLength) { console.log('上传完毕') }
app.getData()
}).catch(async err => {
console.log(err)
console.log(fileUpdateTime)
fileUpdateTime[file.name] ? fileUpdateTime[file.name] += 1 : fileUpdateTime[file.name] = 1
if (fileUpdateTime[file.name] >= 4) {
console.error(`丢,这首歌怎么都传不上:${file.name}`)
return
} else {
console.error(`${file.name} 失败 ${fileUpdateTime[file.name]} 次`)
}
// await login()
upload(file, currentIndx)
})
}
</script>
</body>
function main() {
fileInput.addEventListener('change', function (e) {
const files = this.files
if (files.length === 0) return
if (isUploading) return
uploadFilesSequentially(Array.from(files))
this.value = ''
})
}
main()
async function uploadFilesSequentially(files) {
isUploading = true
uploadBtn.classList.add('disabled')
progressSection.classList.add('active')
progressSection.innerHTML = ''
for (let i = 0; i < files.length; i++) {
if (uploadMode === 'direct') {
await uploadFileDirect(files[i], i + 1, files.length)
} else {
await uploadFileProxy(files[i], i + 1, files.length)
}
}
isUploading = false
uploadBtn.classList.remove('disabled')
app.getData()
}
function createProgressItem(file, index, total) {
const item = document.createElement('div')
item.className = 'progress-item'
item.id = `progress-${index}`
item.innerHTML = `
<div class="name">${file.name} (${formatSize(file.size)})</div>
<div class="status">准备中...</div>
<div class="progress-bar"><div class="fill"></div></div>
`
progressSection.appendChild(item)
return item
}
function updateProgress(index, status, percent, isError = false) {
const item = document.getElementById(`progress-${index}`)
if (!item) return
item.querySelector('.status').textContent = status
item.querySelector('.fill').style.width = `${percent}%`
if (isError) {
item.classList.add('error')
} else if (percent >= 100) {
item.classList.add('success')
}
}
function formatSize(bytes) {
if (bytes < 1024) return bytes + ' B'
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'
return (bytes / (1024 * 1024)).toFixed(1) + ' MB'
}
async function uploadFileProxy(file, index, total) {
createProgressItem(file, index, total)
try {
updateProgress(index, '上传中...', 10)
const formData = new FormData()
formData.append('songFile', file)
await axios({
method: 'post',
url: `/cloud?time=${Date.now()}&cookie=${localStorage.getItem('cookie')}`,
headers: {
'Content-Type': 'multipart/form-data',
},
data: formData,
onUploadProgress: (progressEvent) => {
const percent = Math.round((progressEvent.loaded / progressEvent.total) * 90) + 10
updateProgress(index, `上传中... ${Math.round(progressEvent.loaded / progressEvent.total * 100)}%`, Math.min(percent, 100))
},
timeout: 600000,
})
updateProgress(index, '上传完成!', 100)
} catch (err) {
console.error(`${file.name} 上传失败:`, err)
const errorMsg = err.response?.data?.msg || err.message || '未知错误'
if (err.response?.status === 413 || errorMsg.includes('PAYLOAD_TOO_LARGE')) {
updateProgress(index, '文件过大,请切换到客户端直传模式', 0, true)
} else {
updateProgress(index, `上传失败: ${errorMsg}`, 0, true)
}
}
}
async function calculateMD5(file) {
return new Promise((resolve, reject) => {
const chunkSize = 2 * 1024 * 1024
const chunks = Math.ceil(file.size / chunkSize)
let currentChunk = 0
const spark = new SparkMD5.ArrayBuffer()
const reader = new FileReader()
reader.onload = (e) => {
spark.append(e.target.result)
currentChunk++
if (currentChunk < chunks) {
loadNext()
} else {
resolve(spark.end())
}
}
reader.onerror = () => reject(reader.error)
function loadNext() {
const start = currentChunk * chunkSize
const end = Math.min(start + chunkSize, file.size)
reader.readAsArrayBuffer(file.slice(start, end))
}
loadNext()
})
}
async function parseMediaTags(file) {
return new Promise((resolve) => {
jsmediatags.read(file, {
onSuccess: function(tag) {
resolve({
title: tag.tags.title || null,
artist: tag.tags.artist || null,
album: tag.tags.album || null,
})
},
onError: function() {
resolve({ title: null, artist: null, album: null })
}
})
})
}
async function uploadFileDirect(file, index, total) {
createProgressItem(file, index, total)
try {
updateProgress(index, '计算文件MD5...', 5)
const md5 = await calculateMD5(file)
const fileSize = file.size
const filename = file.name
updateProgress(index, '解析音频元数据...', 8)
const mediaTags = await parseMediaTags(file)
updateProgress(index, '获取上传凭证...', 10)
const tokenRes = await axios({
method: 'post',
url: `/cloud/upload/token?time=${Date.now()}`,
data: {
cookie: localStorage.getItem('cookie'),
md5: md5,
fileSize: fileSize,
filename: filename,
},
})
if (tokenRes.data.code !== 200) {
throw new Error(tokenRes.data.msg || '获取上传凭证失败')
}
const tokenData = tokenRes.data.data
if (!tokenData.needUpload) {
updateProgress(index, '文件已存在,直接导入云盘...', 80)
await completeUpload(tokenData, file, mediaTags)
updateProgress(index, '上传完成!', 100)
return
}
updateProgress(index, '开始上传到云存储...', 15)
await axios({
method: 'post',
url: tokenData.uploadUrl,
headers: {
'x-nos-token': tokenData.uploadToken,
'Content-MD5': md5,
'Content-Type': 'audio/mpeg',
'Content-Length': String(fileSize),
},
data: file,
onUploadProgress: (progressEvent) => {
const percent = Math.round((progressEvent.loaded / progressEvent.total) * 70) + 15
updateProgress(index, `上传中... ${Math.round(progressEvent.loaded / progressEvent.total * 100)}%`, Math.min(percent, 85))
},
maxContentLength: Infinity,
maxBodyLength: Infinity,
timeout: 600000,
})
updateProgress(index, '上传完成,正在导入云盘...', 90)
await completeUpload(tokenData, file, mediaTags)
updateProgress(index, '上传完成!', 100)
} catch (err) {
console.error(`${file.name} 上传失败:`, err)
const errorMsg = err.response?.data?.msg || err.message || '未知错误'
updateProgress(index, `上传失败: ${errorMsg}`, 0, true)
}
}
async function completeUpload(tokenData, file, mediaTags = {}) {
const songName = mediaTags.title || file.name.replace(/\.[^.]+$/, '')
const artist = mediaTags.artist || '未知艺术家'
const album = mediaTags.album || '未知专辑'
const completeRes = await axios({
method: 'post',
url: `/cloud/upload/complete?time=${Date.now()}`,
data: {
cookie: localStorage.getItem('cookie'),
songId: tokenData.songId,
resourceId: tokenData.resourceId,
md5: tokenData.md5,
filename: file.name,
song: songName,
artist: artist,
album: album,
},
})
if (completeRes.data.code !== 200) {
throw new Error(completeRes.data.msg || '导入云盘失败')
}
return completeRes.data
}
</script>
<script src="https://fastly.jsdelivr.net/npm/spark-md5@3.0.2/spark-md5.min.js"></script>
</body>
</html>
+8 -7
View File
@@ -1,13 +1,14 @@
# 网易云音乐 API
# NeteaseCloudMusicAPI Enhanced
> 网易云音乐 NodeJS 版 API
> 🎉 全网收集最全的网易云音乐api接口 基于[NeteaseCloudMusicAPI](https://github.com/binaryify/NeteaseCloudMusicApi)的复刻版本
- 全部接口已升级到最新
- 具备登录接口,多达200多个接口
- 更完善的文档
- ⚡ 四种加密模式 · 后端代理
- 🪛 具备多达200多个接口
- 📄 更完善的文档
[GitLab](https://gitlab.com/Binaryify/NeteaseCloudMusicApi)
[Get Started](#neteasecloudmusicapi)
[Github](https://github.com/neteasecloudmusicapienhanced/api-enhanced)
[前往本家](https://github.com/binaryify/NeteaseCloudMusicApi)
[快速开始](#neteasecloudmusicapienhanced)
![color](#ffffff)
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 14 KiB

+767 -681
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

+91 -9
View File
@@ -3,13 +3,56 @@
<head>
<meta charset="UTF-8">
<meta name="KEYWords" contect="网易云音乐,网易云音乐 api,网易云音乐 nodejs,网易云音乐 node.js">
<meta name="description" content="网易云音乐 NodeJS 版 API">
<title>网易云音乐 NodeJS 版 API</title>
<link rel="icon" href="favicon.ico">
<meta name="description" content="网易云音乐 NodeJS API Enhanced">
<title>网易云音乐 NodeJS API Enhanced</title>
<link rel="icon" href="netease.png">
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta name="referrer" content="never">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css" id="theme-css">
<style>
.theme-toggle {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 999;
width: 44px;
height: 44px;
border-radius: 50%;
border: 1px solid rgba(255,255,255,0.1);
background: rgba(30,30,46,0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
color: #fff;
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 12px rgba(0,0,0,0.15);
transition: all 0.3s cubic-bezier(0.4,0,0.2,1);
outline: none;
padding: 0;
line-height: 1;
user-select: none;
}
.theme-toggle:hover {
transform: scale(1.12) rotate(12deg);
box-shadow: 0 4px 20px rgba(0,0,0,0.25);
}
.theme-toggle:active {
transform: scale(0.92);
}
.theme-toggle.light {
background: rgba(255,255,255,0.85);
color: #333;
border-color: rgba(0,0,0,0.08);
}
html, body, .sidebar, .content, .markdown-section,
.sidebar-nav, .search, .docsify-pagination-container {
transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
</style>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
(adsbygoogle = window.adsbygoogle || []).push({
@@ -20,11 +63,50 @@
</head>
<body>
<div id="app"></div>
<button class="theme-toggle" id="themeToggle" aria-label="Toggle theme">🌙</button>
</body>
<script>
(function() {
var STORAGE_KEY = 'docsify-theme';
var link = document.getElementById('theme-css');
var btn = document.getElementById('themeToggle');
var LIGHT_URL = '//unpkg.com/docsify/lib/themes/vue.css';
var DARK_URL = '//unpkg.com/docsify/lib/themes/dark.css';
function setTheme(theme) {
link.href = theme === 'dark' ? DARK_URL : LIGHT_URL;
btn.textContent = theme === 'dark' ? '☀️' : '🌙';
btn.className = 'theme-toggle' + (theme === 'dark' ? '' : ' light');
localStorage.setItem(STORAGE_KEY, theme);
}
function toggleTheme() {
var isDark = link.href.includes('dark');
setTheme(isDark ? 'light' : 'dark');
}
var saved = localStorage.getItem(STORAGE_KEY);
if (saved) {
setTheme(saved);
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
setTheme('dark');
}
btn.addEventListener('click', toggleTheme);
try {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
if (!localStorage.getItem(STORAGE_KEY)) {
setTheme(e.matches ? 'dark' : 'light');
}
});
} catch(e) {}
})();
</script>
<script>
window.$docsify = {
name: '网易云音乐 API',
repo: 'https://gitlab.com/Binaryify/NeteaseCloudMusicApi',
name: '网易云音乐 API Enhanced',
repo: 'https://github.com/neteasecloudmusicapienhanced/api-enhanced',
coverpage: true,
homepage: 'home.md',
}
@@ -36,12 +118,12 @@
}
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-139996012-1"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-BPRGR23JEG"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'UA-139996012-1');
gtag('config', 'G-BPRGR23JEG');
</script>
</html>
+6
View File
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<g>
<path fill="none" d="M0 0h24v24H0z"/>
<path d="M10.421 11.375c-.294 1.028.012 2.064.784 2.653 1.061.81 2.565.3 2.874-.995.08-.337.103-.722.027-1.056-.23-1.001-.52-1.988-.792-2.996-1.33.154-2.543 1.172-2.893 2.394zm5.548-.287c.273 1.012.285 2.017-.127 3-1.128 2.69-4.721 3.14-6.573.826-1.302-1.627-1.28-3.961.06-5.734.78-1.032 1.804-1.707 3.048-2.054l.379-.104c-.084-.415-.188-.816-.243-1.224-.176-1.317.512-2.503 1.744-3.04 1.226-.535 2.708-.216 3.53.76.406.479.395 1.08-.025 1.464-.412.377-.996.346-1.435-.09-.247-.246-.51-.44-.877-.436-.525.006-.987.418-.945.937.037.468.173.93.3 1.386.022.078.216.135.338.153 1.334.197 2.504.731 3.472 1.676 2.558 2.493 2.861 6.531.672 9.44-1.529 2.032-3.61 3.168-6.127 3.409-4.621.44-8.664-2.53-9.7-7.058C2.515 10.255 4.84 5.831 8.795 4.25c.586-.234 1.143-.031 1.371.498.232.537-.019 1.086-.61 1.35-2.368 1.06-3.817 2.855-4.215 5.424-.533 3.433 1.656 6.776 5 7.72 2.723.77 5.658-.166 7.308-2.33 1.586-2.08 1.4-5.099-.427-6.873a3.979 3.979 0 0 0-1.823-1.013c.198.716.389 1.388.57 2.062z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

-132
View File
@@ -1,132 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>eapi 参数和返回内容解析</title>
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
</head>
<style>
.decode-result {
white-space: pre-wrap;
word-break: break-all;
background-color: #f0f0f0;
padding: 10px;
border-radius: 5px;
margin-top: 10px;
height: 300px;
overflow: auto;
}
</style>
<body>
<div id="app" class="p-5 flex flex-col">
<h1 class="text-2xl font-bold mb-5">eapi 参数和返回内容解析</h1>
<textarea class="border border-gray-300 p-3 mb-5" v-model="hexString" rows="10"></textarea>
<div class="flex gap-3 mb-4">
<button @click="decrypt" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
解密
</button>
<button
@click="sendToApi"
:disabled="!canSend"
:class="[
'bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded',
{ 'opacity-50 cursor-not-allowed pointer-events-none': !canSend },
]"
>
填入 API 调试
</button>
</div>
<div class="mt-3">
<input type="radio" id="format" name="format" v-model="isReq" value="true">
<label for="format" class="ml-2">请求数据request params(针对请求数据的 params)</label>
<input type="radio" id="noFormat" name="format" v-model="isReq" value="false" class="ml-5">
<label for="noFormat" class="ml-2">返回数据 response 二进制数据(针对返回内容解析)</label>
</div>
<div>
<p>解密结果:
<pre class="decode-result">{{ JSON.stringify(JSON.parse(result), null, 2) }}</pre>
</p>
</div>
<div>
<p>使用例子:</p>
<img src="/static/eapi_params.png" />
<img src="/static/eapi_response.png" />
</div>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios"></script>
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
<script>
const app = Vue.createApp({
data() {
return {
hexString: 'AD96DDB984491E79B6F429DD650C6E2AE524627AC223AC9A123C66BB0997965950FED137544A93DFC718E16F57C8C121AF537086F395570A5602A3922366D11964DAFACD7830AACABF62E5650E67F457E79C1D2E13502391FC3487216CC5BF8681843FCB8E05559487EB18AAC1BE0EFEA4F7B6A050478366153A9426C238B8869600B275704555A9EB94C92E4F3FDABE9E0BCE07645410D0AA7B675698A4CAE6CD3620633ABF0B849A4244CC8DFC5DB2646D5EA9B3954E62BFEF19AFEAFDDC34E55C3E9A1DD3167CF53D443617108141',
result: '{}',
isReq: true
}
},
mounted() {
this.decrypt()
},
computed: {
isRequestMode() {
return this.isReq === true || this.isReq === 'true'
},
canSend() {
if (!this.isRequestMode) return false
if (!this.result || this.result === '{}' || this.result === 'null') return false
try {
JSON.parse(this.result)
return true
} catch (error) {
return false
}
},
},
methods: {
async decrypt() {
try {
const res = await axios({
url: `/eapi/decrypt?isReq=${this.isReq}&timestamp=${Date.now()}`,
method: 'post',
data: {
hexString: this.hexString
}
})
this.result = JSON.stringify(res.data.data)
console.log(res.data);
} catch (error) {
console.error(error)
alert(error?.response?.data?.message || '解密失败,数据格式错误')
}
},
sendToApi() {
if (!this.canSend) return
const payload = JSON.parse(this.result)
const params = new URLSearchParams()
params.set('uri', payload.uri || payload.url || payload.path || '')
params.set('crypto', 'eapi')
const data =
payload.params ||
payload.data ||
payload.body ||
payload.payload ||
payload.request ||
{}
params.set('data', JSON.stringify(data))
window.open(`/api.html?${params.toString()}`, '_blank')
},
}
})
app.mount('#app')
</script>
</body>
</html>
+312
View File
@@ -0,0 +1,312 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>免费听 — 网易云音乐 API Enhanced</title>
<style>
:root {
--fg: #333;
--muted: #666;
--border: #ddd;
--bg: #f5f5f5;
--panel: #ffffff;
--accent: #333;
}
* { box-sizing: border-box; }
html, body { height: 100%; }
body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--fg); background: var(--bg); line-height: 1.6; }
.container { max-width: 800px; margin: 40px auto; padding: 0 20px; }
@media (max-width: 480px) {
.container { margin: 20px auto; padding: 0 16px; }
header.site-header h1 { font-size: 22px; }
.block { padding: 16px; }
}
header.site-header { margin-bottom: 24px; }
header.site-header h1 { font-size: 24px; font-weight: 600; margin: 0; }
.sub { margin-top: 4px; color: var(--muted); font-size: 14px; }
.block { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 20px; margin-bottom: 16px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); }
.block h3 { margin: 0 0 4px; font-size: 15px; font-weight: 600; }
.block .desc { margin: 0 0 12px; color: var(--muted); font-size: 13px; }
pre { margin: 0; background: #f9f9f9; border: 1px solid var(--border); border-radius: 6px; padding: 12px; overflow-x: auto; white-space: pre-wrap; word-break: break-all; font-family: 'Courier New', monospace; font-size: 13px; max-height: 200px; overflow: auto; }
pre.data { max-height: 360px; }
.row { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
button { padding: 8px 18px; border-radius: 8px; border: 1px solid var(--border); font-size: 14px; font-weight: 500; cursor: pointer; background: var(--panel); color: var(--fg); transition: all .15s; }
button:hover { background: #eee; }
button.primary { background: var(--fg); color: var(--panel); border-color: var(--fg); }
button.primary:hover { opacity: .85; }
button:disabled { opacity: .4; cursor: not-allowed; }
button.danger { background: #a11; color: #fff; border-color: #a11; }
button.danger:hover { opacity: .85; }
.tag { display: inline-block; padding: 2px 10px; border-radius: 20px; font-size: 12px; font-weight: 500; border: 1px solid var(--border); }
.tag.ok { background: #e6f7e6; color: #1a7a1a; border-color: #b7e6b7; }
.tag.no { background: #ffe6e6; color: #a11; border-color: #f5c6c6; }
.tag.busy { background: #fff3cd; color: #856404; border-color: #ffeeba; }
.flex { display: flex; align-items: center; gap: 10px; }
.flex.sb { justify-content: space-between; }
.step { display: flex; gap: 12px; align-items: flex-start; }
.step .num { width: 26px; height: 26px; border-radius: 50%; background: var(--fg); color: var(--panel); display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; flex-shrink: 0; margin-top: 1px; }
.step .num.done { background: #1a7a1a; }
.step .body { flex: 1; min-width: 0; }
input[type=text] { width: 100%; padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border); font-size: 14px; font-family: inherit; margin-top: 6px; }
input[type=text]:focus { outline: 2px solid var(--fg); outline-offset: -1px; border-color: transparent; }
footer.site-footer { margin-top: 32px; padding-top: 12px; border-top: 1px solid var(--border); color: var(--muted); text-align: center; font-size: 13px; }
footer.site-footer a { color: var(--fg); text-decoration: none; }
footer.site-footer a:hover { border-bottom: 1px dotted var(--fg); }
.info-grid { display: grid; grid-template-columns: 80px 1fr; gap: 4px 12px; font-size: 13px; margin-top: 8px; }
.info-grid .lbl { color: var(--muted); }
</style>
</head>
<body>
<main class="container">
<header class="site-header">
<h1>🎧 免费听 · 看广告获取时长</h1>
<p class="sub">模拟 App 内看激励视频广告 → 领取免费听权益的完整流程</p>
</header>
<!-- 步骤 1: 注册 Token -->
<div class="block">
<div class="step">
<div class="num" id="s1num">1</div>
<div class="body">
<div class="flex sb">
<h3>注册反作弊 Token</h3>
<span id="s1tag" class="tag no">未开始</span>
</div>
<p class="desc">调用易盾接口获取实时 token,广告接口需要此 token 才能正常响应</p>
<pre id="s1pre">(尚未执行)</pre>
<div class="row">
<button id="step1" class="primary">① 注册 Token</button>
</div>
</div>
</div>
</div>
<!-- 步骤 2: 获取广告 -->
<div class="block">
<div class="step">
<div class="num" id="s2num">2</div>
<div class="body">
<div class="flex sb">
<h3>获取广告 &amp; 提取 reqId</h3>
<span id="s2tag" class="tag no">未开始</span>
</div>
<p class="desc">请求广告位,从返回的 extJson.contextInfo.req_id 提取用于领取权益的标识</p>
<pre id="s2pre" class="data">(尚未执行)</pre>
<div class="row">
<button id="step2" class="primary" disabled>② 获取广告</button>
<button id="step2b" disabled>换一个广告位</button>
</div>
<div class="info-grid" id="s2info" style="display:none">
<div class="lbl">广告 ID</div><div id="s2adId">-</div>
<div class="lbl">reqId</div><div id="s2reqId">-</div>
<div class="lbl">文案</div><div id="s2text">-</div>
</div>
</div>
</div>
</div>
<!-- 步骤 3: 领取权益 -->
<div class="block">
<div class="step">
<div class="num" id="s3num">3</div>
<div class="body">
<div class="flex sb">
<h3>领取免费听权益</h3>
<span id="s3tag" class="tag no">未开始</span>
</div>
<p class="desc">传入 reqId 及相关参数,领取免费听权益(模拟点击广告后的领取请求)</p>
<pre id="s3pre" class="data">(尚未执行)</pre>
<div class="row">
<button id="step3" class="primary" disabled>③ 领取权益</button>
</div>
<div class="info-grid" id="s3info" style="display:none">
<div class="lbl">结果</div><div id="s3result">-</div>
</div>
</div>
</div>
</div>
<!-- 一键全流程 -->
<div class="block">
<div class="flex sb">
<h3>一键运行</h3>
<span id="allTag" class="tag no">就绪</span>
</div>
<p class="desc" style="margin-top:4px">按顺序自动执行以上三个步骤</p>
<div class="row">
<button id="runAll" class="primary">▶ 一键获取免费听时长</button>
<button id="clearAll" class="danger">✕ 清空</button>
</div>
</div>
<footer class="site-footer">
<a href="/">← 返回首页</a>
</footer>
</main>
<script>
const $ = (id) => document.getElementById(id)
const base = location.origin
function setTag(id, type, text) {
const el = $(id)
el.className = 'tag ' + type
el.textContent = text
}
function setNum(id, done) {
$(id).className = 'num' + (done ? ' done' : '')
}
function nocache(url) {
const sep = url.indexOf('?') > -1 ? '&' : '?'
return url + sep + '_t=' + Date.now()
}
// ===== 步骤 1: 注册 Token =====
async function step1() {
const btn = $('step1')
btn.disabled = true
setTag('s1tag', 'busy', '注册中…')
setNum('s1num', false)
try {
const res = await fetch(nocache(base + '/register/checktoken?refresh=1'))
const data = await res.json()
$('s1pre').textContent = JSON.stringify(data, null, 2)
if (data.token) {
setTag('s1tag', 'ok', '已注册')
setNum('s1num', true)
$('step2').disabled = false
$('step2b').disabled = false
return data.token
}
setTag('s1tag', 'no', '失败')
return null
} catch (e) {
$('s1pre').textContent = JSON.stringify({ error: e.message }, null, 2)
setTag('s1tag', 'no', e.message)
return null
} finally {
btn.disabled = false
}
}
// ===== 步骤 2: 获取广告 =====
async function step2(typeId) {
const btn = $('step2')
const btnB = $('step2b')
btn.disabled = btnB.disabled = true
setTag('s2tag', 'busy', '获取中…')
setNum('s2num', false)
$('s2info').style.display = 'none'
try {
let url = base + '/ad/get' + (typeId ? '?type_ids=' + encodeURIComponent(typeId) : '')
const res = await fetch(nocache(url))
const data = await res.json()
$('s2pre').textContent = JSON.stringify(data, null, 2)
if (data.code === 200 && data.extra && data.extra.reqId) {
setTag('s2tag', 'ok', '已获取')
setNum('s2num', true)
$('s2info').style.display = 'grid'
const adKeys = data.ads ? Object.keys(data.ads) : []
let adId = '-', text = '-'
if (adKeys.length > 0) {
const ad = data.ads[adKeys[0]]
adId = ad.ad_id || '-'
text = ad.text || '-'
}
$('s2adId').textContent = adId
$('s2reqId').textContent = data.extra.reqId
$('s2text').textContent = text
$('step3').disabled = false
return data.extra.reqId
}
setTag('s2tag', 'no', '未获取到 reqId')
return null
} catch (e) {
$('s2pre').textContent = JSON.stringify({ error: e.message }, null, 2)
setTag('s2tag', 'no', e.message)
return null
} finally {
btn.disabled = false
btnB.disabled = false
}
}
$('step2').onclick = () => step2()
$('step2b').onclick = () => step2('["400002_0"]')
// ===== 步骤 3: 领取权益 =====
async function step3() {
const btn = $('step3')
btn.disabled = true
setTag('s3tag', 'busy', '领取中…')
setNum('s3num', false)
$('s3info').style.display = 'none'
try {
const res = await fetch(nocache(base + '/ad/listening/rights/gain'))
const data = await res.json()
$('s3pre').textContent = JSON.stringify(data, null, 2)
if (data.code === 200) {
setTag('s3tag', 'ok', '已领取')
setNum('s3num', true)
$('s3info').style.display = 'grid'
const body = data.data || {}
$('s3result').textContent = JSON.stringify(body).substring(0, 200)
return true
}
setTag('s3tag', 'no', '领取失败')
return false
} catch (e) {
$('s3pre').textContent = JSON.stringify({ error: e.message }, null, 2)
setTag('s3tag', 'no', e.message)
return false
} finally {
btn.disabled = false
}
}
$('step3').onclick = step3
// ===== 一键运行 =====
$('runAll').onclick = async function () {
const btn = this
btn.disabled = true
setTag('allTag', 'busy', '运行中…')
await step1()
await step2()
await step3()
setTag('allTag', 'ok', '完成')
btn.disabled = false
}
// ===== 清空 =====
$('clearAll').onclick = function () {
const steps = ['s1', 's2', 's3']
const tags = { s1: '未开始', s2: '未开始', s3: '未开始' }
steps.forEach(s => {
setTag(s + 'tag', 'no', tags[s])
setNum(s + 'num', false)
$(s + 'pre').textContent = '(尚未执行)'
const info = $(s + 'info')
if (info) info.style.display = 'none'
})
$('step1').disabled = false
$('step2').disabled = true
$('step2b').disabled = true
$('step3').disabled = true
setTag('allTag', 'no', '就绪')
$('runAll').disabled = false
}
</script>
</body>
</html>
+30 -34
View File
@@ -1,44 +1,40 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>home</title>
</head>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>home</title>
</head>
<body>
<div>
<a href="/qrlogin-nocookie.html">
如果没登录,请先登录
</a>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script>
async function main() {
const res = await axios({
url: `/homepage/block/page`,
data: {
cookie: localStorage.getItem('cookie'),
},
method: 'post',
})
let cursor = ''
console.log(res.data.data)
if (res.data.data.hasMore) {
cursor = res.data.data.cursor
const res2 = await axios({
url: `/homepage/block/page?time=${Date.now()}`,
<body>
<div>
<a href="/qrlogin-nocookie.html"> 如果没登录,请先登录 </a>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script>
async function main() {
const res = await axios({
url: `/homepage/block/page`,
data: {
cookie: localStorage.getItem('cookie'),
cursor: cursor,
},
method: 'post',
})
let cursor = ''
console.info(res.data.data)
if (res.data.data.hasMore) {
cursor = res.data.data.cursor
const res2 = await axios({
url: `/homepage/block/page?time=${Date.now()}`,
data: {
cookie: localStorage.getItem('cookie'),
cursor: cursor,
},
method: 'post',
})
}
}
}
main()
</script>
</body>
main()
</script>
</body>
</html>
+109 -119
View File
@@ -1,138 +1,128 @@
<!DOCTYPE html>
<html lang="zh">
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网易云音乐 API</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" href="docs/netease.png">
<title>网易云音乐 API Enhanced</title>
<style>
html, body {
height: 100vh;
width: 100vw;
margin: 0;
padding: 0;
background: #f9f9f9;
font-family: Arial, sans-serif;
color: #333;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
:root {
--fg: #333;
--muted: #666;
--border: #ddd;
--bg: #f5f5f5;
--panel: #ffffff;
--accent: #333;
}
h1 {
font-size: 2.5em;
margin-bottom: 1em;
color: #42b983;
* { box-sizing: border-box; }
html, body { height: 100%; }
body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--fg); background: var(--bg); line-height: 1.6; }
.container { max-width: 960px; margin: 40px auto; padding: 0 20px; }
@media (max-width: 480px) {
.container { margin: 20px auto; padding: 0 16px; }
header.site-header h1 { font-size: 22px; }
.block { padding: 16px; }
}
p {
font-size: 1.2em;
margin-bottom: 2em;
color: #666;
header.site-header { margin-bottom: 24px; }
header.site-header h1 { font-size: 28px; font-weight: 600; margin: 0; }
.badge { display: inline-block; margin-left: 8px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 12px; font-size: 12px; color: var(--muted); }
.sub { margin-top: 8px; color: var(--muted); font-size: 14px; }
.block { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 20px; margin-bottom: 16px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); }
.block h2 { margin: 0 0 12px; font-size: 18px; font-weight: 600; }
.kvs { display: grid; grid-template-columns: 100px 1fr; gap: 8px 12px; align-items: start; }
.kvs div:first-child { color: var(--muted); flex-shrink: 0; }
.kvs div:last-child { word-break: break-all; overflow-wrap: anywhere; min-width: 0; overflow: hidden; }
@media (max-width: 480px) {
.kvs { grid-template-columns: 1fr; gap: 4px 12px; }
.kvs div:first-child { font-weight: 500; }
}
a {
color: #42b983;
text-decoration: none;
transition: color 0.3s ease;
}
a:hover {
color: #329d6e;
}
ul {
list-style: none;
padding: 0;
margin: 0;
text-align: left;
max-width: 600px;
width: 100%;
}
li {
margin: 0.5em 0;
line-height: 1.5;
display: flex;
align-items: center;
}
.number {
margin-right: 10px;
color: #999;
font-weight: bold;
}
.container {
background: #fff;
padding: 2em;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
max-height: 80vh; /* 设置最大高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
.version {
margin-top: 0.5em;
font-size: 1.0em;
color: #666;
ul.links { list-style: none; padding: 0; margin: 0; }
ul.links li { margin: 8px 0; }
ul.links a { color: var(--fg); text-decoration: none; border-bottom: 1px dotted var(--border); transition: all 0.2s ease; }
ul.links a:hover { color: var(--accent); border-bottom-color: var(--accent); }
pre { margin: 0; background: #f9f9f9; border: 1px solid var(--border); border-radius: 6px; padding: 12px; overflow-x: auto; white-space: pre-wrap; word-break: break-all; }
code { font-family: 'Courier New', monospace; font-size: 13px; }
@media (max-width: 480px) {
code { font-size: 12px; }
}
footer.site-footer { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--border); color: var(--muted); text-align: center; }
footer.site-footer a { color: var(--fg); text-decoration: none; transition: color 0.2s ease; }
footer.site-footer a:hover { color: var(--accent); }
</style>
</head>
<body>
<div class="container">
<h1>网易云音乐 API 二改<span id="api-version"></span></h1>
<p>当你看到这个页面时,这个服务已经成功跑起来了~</p>
<p>本项目基于原版API二改, 添加了解灰接口</p>
<p>本项目更新是及时的</p>
<p class="current-url"><span id="current-url"></span></p>
<a href="/docs">查看文档</a>
<h2>例子:</h2>
<ul id="example-list">
<li><a href="./search?keywords=海阔天空">搜索</a></li>
<li><a href="./comment/music?id=186016&limit=1">歌曲评论</a></li>
<li><a href="./dj/program?rid=336355127">电台节目</a></li>
<li><a href="./qrlogin.html">二维码登录</a></li>
<li><a href="./audio_match_demo/index.html">听歌识曲</a></li>
<li><a href="./cloud.html">云盘上传</a></li>
<li><a href="./eapi_decrypt.html">eapi 参数/返回值解析</a></li>
<li><a href="./api.html">API 调试界面</a></li>
<li><a href="./playlist_import.html">歌单导入工具</a></li>
</ul>
</div>
<main class="container">
<header class="site-header">
<h1>网易云音乐 API Enhanced <span id="api-version" class="badge"></span></h1>
<p class="sub">🔍 A revival project for NeteaseCloudMusicApi Node.js Api Services || 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护</p>
</header>
<section class="block">
<h2>状态</h2>
<div class="kvs">
<div>Base URL</div><div id="base-url">—</div>
<div>当前页</div><div id="current-url">—</div>
</div>
</section>
<section class="block">
<h2>文档</h2>
<p><a href="/docs" target="_blank">查看在线文档</a></p>
</section>
<section class="block">
<h2>常用接口</h2>
<ul class="links">
<li><a href="/search?keywords=妖精小姐的魔法邀约">搜索音乐: <code>GET /search</code></a></li>
<li><a href="/song/detail?ids=2756058128">获取音乐详情: <code>GET /song/detail</code></a></li>
<li><a href="/comment/music?id=2756058128&limit=1">获取音乐评论: <code>GET /comment/music</code></a></li>
<li><a href="/song/url/v1?id=2756058128&level=exhigh">获取音乐播放链接: <code>GET /song/url/v1</code></a></li>
</ul>
</section>
<section class="block">
<h2>调试部分</h2>
<pre><code>curl -s {origin}/inner/version
curl -s {origin}/search?keywords=网易云</code></pre>
<div style="margin-top:10px; line-height:2;">
<a href="/api.html">交互式调试</a> ·
<a href="/qrlogin.html">二维码登录示例</a> ·
<a href="/unblock_test.html">解灰测试</a> ·
<a href="/audio_match_demo/index.html">听歌识曲 Demo</a> ·
<a href="/cloud.html">云盘上传</a> ·
<a href="/playlist_import.html">歌单导入</a> ·
<a href="/api_decrypt.html">API 解密</a> ·
<a href="/listen_together_host.html">一起听示例</a> ·
<a href="/playlist_cover_update.html">更新歌单封面示例</a> ·
<a href="/avatar_update.html">头像更新示例</a> ·
<a href="/scrobble.html">听歌打卡示例</a> ·
<a href="/yidun.html">获取 CheckToken</a> ·
<a href="/free_listen.html">免费听权益</a>
</div>
</section>
<footer class="site-footer">
<a href="https://github.com/neteasecloudmusicapienhanced/api-enhanced" target="_blank">GitHub</a>
</footer>
</main>
<script src="https://fastly.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const currentUrlElement = document.getElementById('current-url');
currentUrlElement.textContent = window.location.href;
document.addEventListener('DOMContentLoaded', function () {
var origin = window.location.origin;
document.getElementById('base-url').textContent = origin;
document.getElementById('current-url').textContent = window.location.href;
const exampleList = document.getElementById('example-list');
const items = exampleList.getElementsByTagName('li');
for (let i = 0; i < items.length; i++) {
const number = document.createElement('span');
number.className = 'number';
number.textContent = (i + 1) + '. ';
items[i].prepend(number);
}
// 获取API版本号
axios({
url: '/inner/version',
method: 'post',
data: {},
}).then((res) => {
const body = res.data;
const version = body.data.version;
const apiVersionElement = document.getElementById('api-version');
apiVersionElement.textContent = ` v${version}`;
});
fetch('/inner/version', { method: 'POST' })
.then(function (r) { return r.json(); })
.then(function (data) {
var v = data && data.data && data.data.version;
if (v) document.getElementById('api-version').textContent = 'v' + v;
var pre = document.querySelector('pre code');
if (pre) pre.textContent = pre.textContent.replace(/\{origin\}/g, origin);
})
.catch(function () {});
});
</script>
</body>
</html>
+531 -297
View File
@@ -1,159 +1,481 @@
<!-- eslint-disable prettier/prettier -->
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>一起听</title>
<script src="https://unpkg.com/petite-vue"></script>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/mdui@1.0.2/dist/css/mdui.min.css" />
<script src="https://unpkg.com/mdui@1.0.2/dist/js/mdui.min.js"></script>
</head>
<body class="mdui-container">
<div>
<a href="/qrlogin.html">
如果没登录,请先登录
</a>
</div>
<h1>一起听 - 主机模式</h1>
<div>消息: {{message}}</div>
<audio id="player" autoplay controls>
</audio>
<br />
<br />
<button v-if="!account.login" @click="login">获取登录状态</button>
<div>您的当前登录账号为: {{account.nickname}}</div>
<br />
<div v-if="account.login">
<button v-if="!roomInfo.roomId" @click="createRoom">创建房间</button>
<details>
<summary>加入房间</summary>
<div><span>房间ID: </span><input v-model="roomInfo.roomId" /></div>
<div><span>邀请者 ID: </span><input v-model="roomInfo.inviterId" /></div>
<button @click="joinRoom">点击加入</button>
</details>
<div v-if="roomInfo.roomId">
<div>分享链接为:
https://st.music.163.com/listen-together/share/?songId=1372188635&roomId={{roomInfo.roomId}}&inviterId={{roomInfo.inviterId}}
</div>
<br />
<button @click="refreshRoom">刷新房间状态</button>
<div>在线用户: </div>
<ul class="mdui-list">
<li v-for="user in roomInfo.roomUsers" class="mdui-list-item mdui-ripple">
<div class="mdui-list-item-avatar">
<img :src="user.avatarUrl" />
</div>
<div class="mdui-list-item-content">{{user.nickname}}</div>
</li>
</ul>
<button v-if="roomInfo.roomId" @click="closeRoom">关闭房间</button>
</div>
</div>
<button @click="playTrack">播放</button>
<button @click="pauseTrack">暂停</button>
<button @click="seekTrack">同步进度</button>
<details>
<summary>播放列表</summary>
<br />
<div><span>歌单ID: </span><input v-model="playlistInfo.playlistId" /></div>
<button @click="loadPlaylist">加载歌单到播放列表</button>
<span>{{playlistInfo.playlistName}}</span>
<br />
<br />
<div>歌单内容: </div>
<ul class="mdui-list">
<li @click="gotoTrack(track.id)" v-for="track in playlistInfo.playlistTracks" class="mdui-list-item mdui-ripple">
<div class="mdui-list-item-avatar">
<img :src="track.al.picUrl" />
</div>
<div class="mdui-list-item-content">{{track.name}}</div>
</li>
</ul>
</details>
</body>
<script>
PetiteVue.createApp({
message: '请点击获取登录状态',
account: {
login: false,
userId: 0,
nickname: '未登录',
},
roomInfo: {
roomId: null,
inviterId: 0,
roomUsers: [],
},
playlistInfo: {
playlistId: 0,
playlistName: '未获取',
playlistTrackIds: [],
playlistTracks: [],
},
playingInfo: {
trackId: 0,
status: 'PLAY',
progress: 1,
},
clientSeq: 1,
login: async function () {
const res = await axios({
url: `/login/status?timestamp=${new Date().getTime()}`,
method: 'get',
data: {
cookie: localStorage.getItem('cookie'),
},
})
if (res.data.data.code != 200) {
alert('请先使用登录 API 登录到网易云音乐')
} else {
this.account.userId = res.data.data.profile.userId
this.account.nickname = res.data.data.profile.nickname
this.account.login = true
this.message = '成功登录, 请创建房间'
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>一起听 - 主机模式</title>
<script src="https://unpkg.com/petite-vue"></script>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
},
joinRoom: async function () {
const res = await axios({
url: 'listentogether/accept',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
inviterId: this.roomInfo.inviterId,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
if (res.data.code != 200) {
this.message = '加入房间出现问题: ' + res.data.message
} else {
this.message = '加入房间成功: ' + this.roomInfo.roomId
const res2 = await axios({
url: 'listentogether/room/check',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res2)
const res3 = await axios({
url: 'listentogether/sync/playlist/get',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
this.playlistInfo.playlistName = "其他人的歌单"
this.playlistInfo.playlistTrackIds = res3.data.data.playlist.displayList.result
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 900px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 16px;
}
.login-link {
display: block;
margin-bottom: 24px;
color: #666;
font-size: 14px;
text-decoration: none;
}
.login-link:hover {
color: #333;
text-decoration: underline;
}
.message {
padding: 12px 16px;
background: #f9f9f9;
border-radius: 6px;
margin-bottom: 20px;
font-size: 14px;
color: #555;
}
.audio-player {
width: 100%;
margin-bottom: 20px;
}
.btn {
background: #333;
color: white;
padding: 10px 20px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s ease;
margin-right: 8px;
margin-bottom: 8px;
}
.btn:hover {
background: #555;
}
.section {
margin-bottom: 24px;
padding: 20px;
background: #f9f9f9;
border-radius: 6px;
}
.section h3 {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 12px;
}
input[type="text"], input[type="number"] {
padding: 10px 14px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
outline: none;
width: 200px;
}
input:focus {
border-color: #333;
}
.input-group {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.input-group label {
font-size: 14px;
color: #555;
min-width: 80px;
}
.share-link {
padding: 12px;
background: #f0f0f0;
border-radius: 6px;
font-size: 13px;
color: #666;
word-break: break-all;
margin-bottom: 12px;
}
.user-list {
list-style: none;
max-height: 200px;
overflow-y: auto;
}
.user-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px;
border-bottom: 1px solid #eee;
}
.user-item:last-child {
border-bottom: none;
}
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
object-fit: cover;
}
.user-name {
font-size: 14px;
color: #333;
}
.track-list {
list-style: none;
max-height: 300px;
overflow-y: auto;
}
.track-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px;
border-bottom: 1px solid #eee;
cursor: pointer;
transition: background 0.2s ease;
}
.track-item:hover {
background: #f5f5f5;
}
.track-item:last-child {
border-bottom: none;
}
.track-cover {
width: 40px;
height: 40px;
border-radius: 4px;
object-fit: cover;
}
.track-name {
font-size: 14px;
color: #333;
}
details {
cursor: pointer;
}
details summary {
font-size: 14px;
font-weight: 500;
color: #555;
padding: 8px 0;
}
details summary:hover {
color: #333;
}
details[open] summary {
margin-bottom: 12px;
}
.control-buttons {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
</style>
</head>
<body class="container">
<a href="/qrlogin.html" class="login-link">还没登录?点击登录</a>
<h1>一起听 - 主机模式</h1>
<div class="message">消息: {{message}}</div>
<audio id="player" class="audio-player" autoplay controls></audio>
<div v-if="!account.login">
<button class="btn" @click="login">获取登录状态</button>
</div>
<div class="section">
<h3>账号信息</h3>
<div>当前登录账号: {{account.nickname}}</div>
</div>
<div v-if="account.login" class="section">
<h3>房间管理</h3>
<div class="control-buttons">
<button v-if="!roomInfo.roomId" class="btn" @click="createRoom">创建房间</button>
</div>
<details>
<summary>加入房间</summary>
<div class="input-group">
<label>房间ID:</label>
<input v-model="roomInfo.roomId" type="text" />
</div>
<div class="input-group">
<label>邀请者ID:</label>
<input v-model="roomInfo.inviterId" type="text" />
</div>
<button class="btn" @click="joinRoom">加入房间</button>
</details>
<div v-if="roomInfo.roomId" style="margin-top: 16px;">
<h4>分享链接</h4>
<div class="share-link">
https://st.music.163.com/listen-together/share/?songId=1372188635&roomId={{roomInfo.roomId}}&inviterId={{roomInfo.inviterId}}
</div>
<button class="btn" @click="refreshRoom">刷新房间状态</button>
<button class="btn" @click="closeRoom">关闭房间</button>
<h4 style="margin-top: 16px;">在线用户</h4>
<ul class="user-list">
<li v-for="user in roomInfo.roomUsers" :key="user.userId" class="user-item">
<img :src="user.avatarUrl" class="user-avatar" alt="avatar" />
<span class="user-name">{{user.nickname}}</span>
</li>
</ul>
</div>
</div>
<div class="section">
<h3>播放控制</h3>
<div class="control-buttons">
<button class="btn" @click="playTrack">播放</button>
<button class="btn" @click="pauseTrack">暂停</button>
<button class="btn" @click="seekTrack">同步进度</button>
</div>
</div>
<details>
<summary>播放列表</summary>
<div class="section">
<div class="input-group">
<label>歌单ID:</label>
<input v-model="playlistInfo.playlistId" type="text" />
</div>
<button class="btn" @click="loadPlaylist">加载歌单</button>
<div style="margin-top: 12px; font-size: 14px; color: #555;">
歌单名称: {{playlistInfo.playlistName}}
</div>
<h4 style="margin-top: 16px;">歌单内容</h4>
<ul class="track-list">
<li
@click="gotoTrack(track.id)"
v-for="track in playlistInfo.playlistTracks"
:key="track.id"
class="track-item"
>
<img :src="track.al.picUrl" class="track-cover" alt="cover" />
<span class="track-name">{{track.name}}</span>
</li>
</ul>
</div>
</details>
</body>
<script>
PetiteVue.createApp({
message: '请点击获取登录状态',
account: {
login: false,
userId: 0,
nickname: '未登录',
},
roomInfo: {
roomId: null,
inviterId: 0,
roomUsers: [],
},
playlistInfo: {
playlistId: 0,
playlistName: '未获取',
playlistTrackIds: [],
playlistTracks: [],
},
playingInfo: {
trackId: 0,
status: 'PLAY',
progress: 1,
},
clientSeq: 1,
login: async function () {
const res = await axios({
url: `/login/status?timestamp=${new Date().getTime()}`,
method: 'get',
data: {
cookie: localStorage.getItem('cookie'),
},
})
if (res.data.data.code != 200) {
alert('请先使用登录 API 登录到网易云音乐')
} else {
this.account.userId = res.data.data.profile.userId
this.account.nickname = res.data.data.profile.nickname
this.account.login = true
this.message = '成功登录,请创建房间'
}
},
joinRoom: async function () {
const res = await axios({
url: 'listentogether/accept',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
inviterId: this.roomInfo.inviterId,
cookie: localStorage.getItem('cookie'),
},
})
console.info(res)
if (res.data.code != 200) {
this.message = '加入房间出现问题: ' + res.data.message
} else {
this.message = '加入房间成功: ' + this.roomInfo.roomId
const res2 = await axios({
url: 'listentogether/room/check',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
console.info(res2)
const res3 = await axios({
url: 'listentogether/sync/playlist/get',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
this.playlistInfo.playlistName = '其他人的歌单'
this.playlistInfo.playlistTrackIds =
res3.data.data.playlist.displayList.result.join(',')
const resa = await axios({
url: '/song/detail',
method: 'post',
data: {
ids: this.playlistInfo.playlistTrackIds,
cookie: localStorage.getItem('cookie'),
},
})
console.info(resa)
this.playlistInfo.playlistTracks = resa.data.songs
}
},
createRoom: async function () {
const res = await axios({
url: 'listentogether/room/create',
method: 'get',
data: {
cookie: localStorage.getItem('cookie'),
},
})
console.info(res)
if (res.data.code != 200) {
this.message = '创建房间出现问题: ' + res.data.message
} else {
this.message = '创建房间成功: ' + res.data.data.roomInfo.roomId
this.roomInfo.inviterId = this.account.userId
this.roomInfo.roomId = res.data.data.roomInfo.roomId
const res2 = await axios({
url: 'listentogether/room/check',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
console.info(res2)
}
},
refreshRoom: async function () {
const res = await axios({
url: '/listentogether/status',
data: {
cookie: localStorage.getItem('cookie'),
},
})
console.info(res)
if (res.data.code != 200 || !res.data.data.inRoom) {
this.message = '房间状态获取失败,可能退出了房间'
} else {
this.roomInfo.roomUsers = res.data.data.roomInfo.roomUsers
}
},
closeRoom: async function () {
const res = await axios({
url: '/listentogether/end',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
console.info(res)
if (res.data.code != 200 || !res.data.data.success) {
this.message = '房间关闭失败'
} else {
this.message = '房间关闭成功'
this.roomInfo.roomId = null
}
},
loadPlaylist: async function () {
const res = await axios({
url: '/playlist/detail',
method: 'post',
data: {
id: this.playlistInfo.playlistId,
cookie: localStorage.getItem('cookie'),
},
})
console.info(res)
this.playlistInfo.playlistName = res.data.playlist.name
this.playlistInfo.playlistTrackIds = res.data.playlist.trackIds
.map((track) => track.id)
.join(',')
const resa = await axios({
url: '/song/detail',
@@ -163,156 +485,68 @@
cookie: localStorage.getItem('cookie'),
},
})
console.log(resa)
console.info(resa)
this.playlistInfo.playlistTracks = resa.data.songs
}
},
createRoom: async function () {
const res = await axios({
url: 'listentogether/room/create',
method: 'get',
data: {
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
if (res.data.code != 200) {
this.message = '创建房间出现问题: ' + res.data.message
} else {
this.message = '创建房间成功: ' + res.data.data.roomInfo.roomId
this.roomInfo.inviterId = this.account.userId
this.roomInfo.roomId = res.data.data.roomInfo.roomId
const res2 = await axios({
url: 'listentogether/room/check',
if (this.roomInfo.roomId) {
const resb = await axios({
url: 'listentogether/sync/list/command',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
commandType: 'REPLACE',
userId: this.account.userId,
version: this.clientSeq++,
playMode: 'ORDER_LOOP',
displayList: this.playlistInfo.playlistTrackIds,
randomList: this.playlistInfo.playlistTrackIds,
cookie: localStorage.getItem('cookie'),
},
})
console.info(resb)
}
},
gotoTrack: async function (trackId) {
this.playingInfo.trackId = trackId
if (this.roomInfo.roomId) {
await this.playCommand('GOTO')
}
document.getElementById('player').src =
'https://music.163.com/song/media/outer/url?id=' + trackId + '.mp3'
},
playTrack: async function () {
this.playingInfo.status = 'PLAY'
await this.playCommand('PLAY')
document.getElementById('player').play()
},
pauseTrack: async function () {
this.playingInfo.status = 'PAUSE'
await this.playCommand('PAUSE')
document.getElementById('player').pause()
},
seekTrack: async function () {
this.playingInfo.status = 'PLAY'
await this.playCommand('seek')
document.getElementById('player').play()
},
playCommand: async function (action) {
const res = await axios({
url: 'listentogether/play/command',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
progress: Math.floor(
document.getElementById('player').currentTime * 1000,
),
commandType: action,
formerSongId: '-1',
targetSongId: this.playingInfo.trackId,
clientSeq: this.clientSeq++,
playStatus: this.playingInfo.status,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res2)
}
},
refreshRoom: async function () {
const res = await axios({
url: '/listentogether/status',
data: {
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
if (res.data.code != 200 || !res.data.data.inRoom) {
this.message = '房间状态获取失败, 可能退出了房间'
} else {
this.roomInfo.roomUsers = res.data.data.roomInfo.roomUsers
}
},
closeRoom: async function () {
const res = await axios({
url: '/listentogether/end',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
if (res.data.code != 200 || !res.data.data.success) {
this.message = '房间关闭失败'
} else {
this.message = '房间关闭成功'
this.roomInfo.roomId = null
}
},
loadPlaylist: async function () {
const res = await axios({
url: '/playlist/detail',
method: 'post',
data: {
id: this.playlistInfo.playlistId,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
this.playlistInfo.playlistName = res.data.playlist.name
this.playlistInfo.playlistTrackIds = res.data.playlist.trackIds
.map((track) => track.id)
.join(',')
const resa = await axios({
url: '/song/detail',
method: 'post',
data: {
ids: this.playlistInfo.playlistTrackIds,
cookie: localStorage.getItem('cookie'),
},
})
console.log(resa)
this.playlistInfo.playlistTracks = resa.data.songs
if (this.roomInfo.roomId) {
const resb = await axios({
url: 'listentogether/sync/list/command',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
commandType: 'REPLACE',
userId: this.account.userId,
version: this.clientSeq++,
playMode: 'ORDER_LOOP',
displayList: this.playlistInfo.playlistTrackIds,
randomList: this.playlistInfo.playlistTrackIds,
cookie: localStorage.getItem('cookie'),
},
})
console.log(resb)
}
},
gotoTrack: async function (trackId) {
this.playingInfo.trackId = trackId
if (this.roomInfo.roomId) {
await this.playCommand('GOTO')
}
document.getElementById('player').src =
'https://music.163.com/song/media/outer/url?id=' + trackId + '.mp3'
},
playTrack: async function () {
this.playingInfo.status = 'PLAY'
await this.playCommand('PLAY')
document.getElementById('player').play()
},
pauseTrack: async function () {
this.playingInfo.status = 'PAUSE'
await this.playCommand('PAUSE')
document.getElementById('player').pause()
},
seekTrack: async function () {
this.playingInfo.status = 'PLAY'
await this.playCommand('seek')
document.getElementById('player').play()
},
playCommand: async function (action) {
const res = await axios({
url: 'listentogether/play/command',
method: 'post',
data: {
roomId: this.roomInfo.roomId,
progress: Math.floor(
document.getElementById('player').currentTime * 1000,
),
commandType: action,
formerSongId: '-1',
targetSongId: this.playingInfo.trackId,
clientSeq: this.clientSeq++,
playStatus: this.playingInfo.status,
cookie: localStorage.getItem('cookie'),
},
})
console.log(res)
},
}).mount()
</script>
console.info(res)
},
}).mount()
</script>
</html>
+190 -18
View File
@@ -5,21 +5,143 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>登录</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.container {
background: white;
border-radius: 12px;
padding: 40px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
max-width: 400px;
width: 100%;
text-align: center;
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 8px;
}
.subtitle {
font-size: 14px;
color: #666;
margin-bottom: 32px;
}
.form-group {
margin-bottom: 20px;
text-align: left;
}
label {
display: block;
font-size: 14px;
font-weight: 500;
color: #555;
margin-bottom: 8px;
}
input {
width: 100%;
padding: 12px 14px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 15px;
outline: none;
}
input:focus {
border-color: #333;
}
.btn {
width: 100%;
padding: 14px;
background: #333;
color: white;
font-size: 15px;
font-weight: 500;
border: none;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
}
.btn:hover {
background: #555;
}
.btn:disabled {
background: #999;
cursor: not-allowed;
}
.result {
margin-top: 24px;
padding: 16px;
background: #f9f9f9;
border-radius: 6px;
font-size: 13px;
color: #666;
text-align: left;
white-space: pre-wrap;
word-break: break-all;
}
.error {
color: #ef4444;
background: #fef2f2;
}
.success {
color: #10b981;
background: #f0fdf4;
}
</style>
</head>
<body>
<div class="container">
<h1>登录</h1>
<p class="subtitle">使用手机号和密码登录网易云音乐</p>
<div class="form-group">
<label for="phone">手机号</label>
<input type="tel" id="phone" placeholder="请输入手机号" />
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" placeholder="请输入密码" />
</div>
<button id="loginBtn" class="btn" onclick="handleLogin()">登录</button>
<div id="result" class="result" style="display: none;"></div>
</div>
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script>
const phone = '' // 这里填手机号
const password = '' // 这里填密码
const fileUpdateTime = {}
if (!phone || !password) {
const msg = '请设置你的手机号码和密码'
alert(msg)
throw new Error(msg)
}
async function login() {
async function login(phone, password) {
const res = await axios({
url: `/login/cellphone`,
method: 'post',
@@ -30,17 +152,67 @@
})
return res.data.cookie
}
async function main() {
const cookieToken = await login()
const res = await axios({
url: `/login/status`,
method: 'post',
data: {
cookie: cookieToken,
},
})
async function handleLogin() {
const phoneInput = document.getElementById('phone')
const passwordInput = document.getElementById('password')
const loginBtn = document.getElementById('loginBtn')
const resultDiv = document.getElementById('result')
const phone = phoneInput.value.trim()
const password = passwordInput.value
if (!phone || !password) {
showResult('请输入手机号和密码', 'error')
return
}
loginBtn.disabled = true
loginBtn.textContent = '登录中...'
showResult('正在登录...', 'info')
try {
const cookieToken = await login(phone, password)
localStorage.setItem('cookie', cookieToken)
const res = await axios({
url: `/login/status`,
method: 'post',
data: {
cookie: cookieToken,
},
})
showResult(`登录成功!\n${JSON.stringify(res.data, null, 2)}`, 'success')
} catch (error) {
console.error('登录失败:', error)
const errorMsg = error.response?.data?.message || error.message || '登录失败,请重试'
showResult(`登录失败:${errorMsg}`, 'error')
} finally {
loginBtn.disabled = false
loginBtn.textContent = '登录'
}
}
main()
function showResult(message, type = 'info') {
const resultDiv = document.getElementById('result')
resultDiv.style.display = 'block'
resultDiv.textContent = message
resultDiv.className = 'result ' + type
}
// 支持回车登录
document.getElementById('password').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
handleLogin()
}
})
document.getElementById('phone').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
document.getElementById('password').focus()
}
})
</script>
</body>
+276 -29
View File
@@ -5,56 +5,297 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>歌单封面上传</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 500px;
margin: 0 auto;
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
text-align: center;
}
h1 {
font-size: 24px;
font-weight: 600;
color: #333;
margin-bottom: 8px;
}
.subtitle {
font-size: 14px;
color: #666;
margin-bottom: 32px;
}
.login-link {
display: block;
margin-bottom: 24px;
color: #666;
font-size: 14px;
text-decoration: none;
}
.login-link:hover {
color: #333;
text-decoration: underline;
}
.cover-wrapper {
position: relative;
width: 180px;
height: 180px;
margin: 0 auto 24px;
}
.cover {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
border: 4px solid #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.form-group {
margin-bottom: 20px;
text-align: left;
}
label {
display: block;
font-size: 14px;
font-weight: 500;
color: #555;
margin-bottom: 8px;
}
input[type="text"] {
width: 100%;
padding: 10px 14px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
outline: none;
}
input[type="text"]:focus {
border-color: #333;
}
.upload-btn {
display: inline-block;
padding: 12px 28px;
background: #333;
color: white;
font-size: 15px;
font-weight: 500;
border-radius: 6px;
cursor: pointer;
transition: background 0.2s ease;
border: none;
}
.upload-btn:hover {
background: #555;
}
.upload-btn input[type="file"] {
display: none;
}
.loading {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background: rgba(255, 255, 255, 0.9);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.2s ease;
}
.loading.active {
opacity: 1;
}
.spinner {
width: 48px;
height: 48px;
border: 4px solid #e0e0e0;
border-top-color: #333;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.result {
margin-top: 20px;
padding: 12px 16px;
border-radius: 6px;
font-size: 14px;
text-align: left;
}
.result.success {
background: #d1fae5;
color: #065f46;
}
.result.error {
background: #fee2e2;
color: #991b1b;
}
</style>
</head>
<body>
<div>
<a href="/qrlogin-nocookie.html">
如果没登录,请先登录
</a>
<div class="container">
<h1>歌单封面上传</h1>
<p class="subtitle">上传自定义歌单封面图片</p>
<a href="/qrlogin-nocookie.html" class="login-link">还没登录?点击登录</a>
<div class="form-group">
<label for="playlistId">歌单 ID</label>
<input type="text" id="playlistId" placeholder="请输入歌单ID" />
</div>
<div class="cover-wrapper">
<img id="playlist_cover" class="cover" src="" alt="歌单封面" />
<div class="loading" id="loading">
<div class="spinner"></div>
</div>
</div>
<label class="upload-btn">
选择封面图片
<input id="file" type="file" name="filename" accept="image/*" />
</label>
<div id="result" class="result" style="display: none;"></div>
</div>
<input id="file" type="file" name="filename" />
<img id="playlist_cover" style="height: 200px; width: 200px; border-radius: 50%" />
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
<script>
const playlist_id = ''
if (!playlist_id) {
const msg = '请设置你的歌单id'
alert(msg)
throw new Error(msg)
const loadingOverlay = document.getElementById('loading')
const playlistIdInput = document.getElementById('playlistId')
const resultDiv = document.getElementById('result')
function showLoading() {
loadingOverlay.classList.add('active')
}
main()
async function main() {
document.querySelector('input[type="file"]').addEventListener(
'change',
function (e) {
var file = this.files[0]
upload(file)
},
false,
)
const res = await axios({
url: `/playlist/detail?id=${playlist_id}&timestamp=${Date.now()}`,
function hideLoading() {
loadingOverlay.classList.remove('active')
}
function showResult(message, type) {
resultDiv.textContent = message
resultDiv.className = 'result ' + type
resultDiv.style.display = 'block'
}
function hideResult() {
resultDiv.style.display = 'none'
}
async function loadPlaylistCover() {
const playlistId = playlistIdInput.value.trim()
if (!playlistId) {
return
}
showLoading()
hideResult()
try {
const res = await axios({
url: `/playlist/detail?id=${playlistId}&timestamp=${Date.now()}`,
})
document.querySelector('#playlist_cover').src = res.data.playlist.coverImgUrl
hideResult()
} catch (error) {
console.error('加载封面失败:', error)
showResult('加载封面失败,请检查歌单ID', 'error')
} finally {
hideLoading()
}
}
// 监听歌单ID输入变化
playlistIdInput.addEventListener('input', function() {
loadPlaylistCover()
})
// 监听文件选择
document
.querySelector('input[type="file"]')
.addEventListener('change', async function (e) {
const file = this.files[0]
const playlistId = playlistIdInput.value.trim()
if (!playlistId) {
showResult('请先输入歌单ID', 'error')
return
}
if (!file) {
return
}
showLoading()
hideResult()
try {
await upload(file, playlistId)
} catch (error) {
console.error('上传失败:', error)
showResult('上传失败,请重试', 'error')
} finally {
hideLoading()
}
})
document.querySelector('#playlist_cover').src = res.data.playlist.coverImgUrl
}
async function upload(file) {
async function upload(file, playlistId) {
var formData = new FormData()
formData.append('imgFile', file)
const imgSize = await getImgSize(file)
const res = await axios({
method: 'post',
url: `/playlist/cover/update?id=${playlist_id}&cookie=${localStorage.getItem('cookie')}&imgSize=${imgSize.width
}&imgX=0&imgY=0&timestamp=${Date.now()}`,
url: `/playlist/cover/update?id=${playlistId}&cookie=${localStorage.getItem('cookie')}&imgSize=${imgSize.width}&imgX=0&imgY=0&timestamp=${Date.now()}`,
headers: {
'Content-Type': 'multipart/form-data',
},
data: formData,
})
document.querySelector('#playlist_cover').src = res.data.data.url
showResult('封面上传成功!', 'success')
}
function getImgSize(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader()
@@ -68,10 +309,16 @@
height: this.height,
})
}
image.onerror = function() {
reject(new Error('图片加载失败'))
}
}
reader.onerror = function() {
reject(new Error('文件读取失败'))
}
})
}
</script>
</body>
</html>
</html>

Some files were not shown because too many files have changed in this diff Show More