@neteasecloudmusicapienhanced/api 4.29.11 → 4.29.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.MD CHANGED
@@ -175,4 +175,4 @@ pnpm test
175
175
 
176
176
  ## License
177
177
 
178
- [MIT License](https://github.com/IamFurina/NeteaseCloudMusicApiReborn/blob/main/LICENSE)
178
+ [MIT License](https://github.com/MoeFurina/NeteaseCloudMusicApiEnhanced/blob/main/LICENSE)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neteasecloudmusicapienhanced/api",
3
- "version": "4.29.11",
3
+ "version": "4.29.12",
4
4
  "description": "为停更的网易云音乐 NodeJs API 提供持续的维护!",
5
5
  "scripts": {
6
6
  "start": "node app.js",
@@ -68,7 +68,7 @@
68
68
  "@unblockneteasemusic/server": "^0.28.0",
69
69
  "axios": "^1.12.2",
70
70
  "crypto-js": "^4.2.0",
71
- "dotenv": "^16.6.1",
71
+ "dotenv": "^17.2.3",
72
72
  "express": "^5.1.0",
73
73
  "express-fileupload": "^1.5.2",
74
74
  "md5": "^2.3.0",
@@ -82,11 +82,11 @@
82
82
  "yargs": "^17.7.2"
83
83
  },
84
84
  "devDependencies": {
85
- "@types/express": "^5.0.3",
85
+ "@types/express": "^5.0.4",
86
86
  "@types/express-fileupload": "^1.5.1",
87
87
  "@types/mocha": "^9.1.1",
88
88
  "@types/node": "24.6.1",
89
- "@typescript-eslint/eslint-plugin": "5.0.0",
89
+ "@typescript-eslint/eslint-plugin": "5.62.0",
90
90
  "@typescript-eslint/parser": "5.0.0",
91
91
  "eslint": "8.7.0",
92
92
  "eslint-config-prettier": "8.5.0",
@@ -94,7 +94,7 @@
94
94
  "eslint-plugin-prettier": "4.0.0",
95
95
  "husky": "7.0.4",
96
96
  "intelli-espower-loader": "1.1.0",
97
- "lint-staged": "12.1.7",
97
+ "lint-staged": "16.2.4",
98
98
  "mocha": "11.7.3",
99
99
  "pkg": "^5.8.1",
100
100
  "power-assert": "1.6.1",
package/public/index.html CHANGED
@@ -1,312 +1,99 @@
1
1
  <!DOCTYPE html>
2
- <html lang="zh">
2
+ <html lang="zh-CN">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
7
  <title>网易云音乐 API Enhanced</title>
8
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@6.5.95/css/materialdesignicons.min.css">
9
8
  <style>
10
9
  :root {
11
- --primary-color: #2d8cf0;
12
- --secondary-color: #42b983;
13
- --text-color: #333;
14
- --text-secondary: #666;
15
- --bg-color: #f5f7fa;
16
- --card-bg: rgba(255,255,255,0.95);
17
- --hover-bg: #eaf4fb;
18
- --border-radius: 12px;
19
- --transition: all 0.3s ease;
20
- --shadow: 0 8px 24px rgba(31, 38, 135, 0.12);
21
- --container-width: 1200px;
22
- }
23
-
24
- * {
25
- margin: 0;
26
- padding: 0;
27
- box-sizing: border-box;
28
- }
29
-
30
- html, body {
31
- height: 100%;
32
- font-family: 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', Arial, sans-serif;
33
- background: linear-gradient(135deg, #e0eafc 0%, #cfdef3 100%);
34
- color: var(--text-color);
35
- line-height: 1.6;
36
- }
37
-
38
- .layout {
39
- min-height: 100%;
40
- padding: 2rem 1rem;
41
- display: flex;
42
- flex-direction: column;
43
- align-items: center;
44
- }
45
-
46
- .container {
47
- width: 100%;
48
- max-width: var(--container-width);
49
- margin: 0 auto;
50
- display: grid;
51
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
52
- gap: 2rem;
53
- animation: fadeIn 0.8s ease-out;
54
- }
55
-
56
- @keyframes fadeIn {
57
- from { opacity: 0; transform: translateY(20px); }
58
- to { opacity: 1; transform: translateY(0); }
59
- }
60
-
61
- .header {
62
- grid-column: 1 / -1;
63
- text-align: center;
64
- padding: 2rem;
65
- background: var(--card-bg);
66
- border-radius: var(--border-radius);
67
- box-shadow: var(--shadow);
68
- }
69
-
70
- .header h1 {
71
- font-size: 2.5rem;
72
- color: var(--primary-color);
73
- margin-bottom: 1rem;
74
- text-shadow: 0 2px 8px #e0eafc;
75
- }
76
-
77
- .header p {
78
- color: var(--text-secondary);
79
- font-size: 1.1rem;
80
- max-width: 800px;
81
- margin: 0 auto;
82
- }
83
-
84
- .card {
85
- background: var(--card-bg);
86
- border-radius: var(--border-radius);
87
- padding: 1.5rem;
88
- box-shadow: var(--shadow);
89
- transition: var(--transition);
90
- }
91
-
92
- .card:hover {
93
- transform: translateY(-5px);
94
- box-shadow: 0 12px 32px rgba(31, 38, 135, 0.15);
95
- }
96
-
97
- .card h2 {
98
- color: var(--primary-color);
99
- font-size: 1.5rem;
100
- margin-bottom: 1rem;
101
- display: flex;
102
- align-items: center;
103
- gap: 0.5rem;
104
- }
105
-
106
- .card h2 i {
107
- font-size: 1.8rem;
108
- }
109
-
110
- .feature-list {
111
- list-style: none;
112
- }
113
-
114
- .feature-item {
115
- display: flex;
116
- align-items: center;
117
- padding: 0.8rem;
118
- margin: 0.5rem 0;
119
- background: var(--bg-color);
120
- border-radius: 8px;
121
- transition: var(--transition);
122
- }
123
-
124
- .feature-item:hover {
125
- background: var(--hover-bg);
126
- transform: translateX(5px);
127
- }
128
-
129
- .feature-item a {
130
- color: var(--text-color);
131
- text-decoration: none;
132
- flex: 1;
133
- display: flex;
134
- align-items: center;
135
- gap: 0.5rem;
136
- }
137
-
138
- .feature-item i {
139
- color: var(--primary-color);
140
- font-size: 1.2rem;
141
- }
142
-
143
- .status {
144
- background: var(--card-bg);
145
- padding: 1rem;
146
- border-radius: var(--border-radius);
147
- margin-top: 2rem;
148
- text-align: center;
149
- font-size: 0.9rem;
150
- color: var(--text-secondary);
151
- }
152
-
153
- .version {
154
- display: inline-block;
155
- padding: 0.2rem 0.8rem;
156
- background: var(--primary-color);
157
- color: white;
158
- border-radius: 20px;
159
- font-size: 0.9rem;
160
- margin-left: 1rem;
161
- }
162
-
163
- .footer {
164
- grid-column: 1 / -1;
165
- text-align: center;
166
- margin-top: 2rem;
167
- padding: 1rem;
168
- color: var(--text-secondary);
169
- }
170
-
171
- .footer a {
172
- color: var(--primary-color);
173
- text-decoration: none;
174
- transition: var(--transition);
175
- }
176
-
177
- .footer a:hover {
178
- color: var(--secondary-color);
179
- }
180
-
181
- @media (max-width: 768px) {
182
- .container {
183
- grid-template-columns: 1fr;
184
- }
185
-
186
- .header h1 {
187
- font-size: 2rem;
188
- }
189
-
190
- .card {
191
- margin: 0 1rem;
192
- }
193
- }
10
+ --fg: #111827; /* gray-900 */
11
+ --muted: #6b7280; /* gray-500 */
12
+ --border: #e5e7eb; /* gray-200 */
13
+ --bg: #ffffff;
14
+ --panel: #f9fafb; /* gray-50 */
15
+ --accent: #2563eb; /* blue-600 */
16
+ }
17
+ * { box-sizing: border-box; }
18
+ html, body { height: 100%; }
19
+ body { margin: 0; font-family: system-ui, -apple-system, Segoe UI, PingFang SC, Helvetica, Arial, sans-serif; color: var(--fg); background: var(--bg); line-height: 1.6; }
20
+ .container { max-width: 960px; margin: 40px auto; padding: 0 20px; }
21
+ header.site-header { margin-bottom: 24px; }
22
+ header.site-header h1 { font-size: 28px; font-weight: 700; margin: 0; }
23
+ .badge { display: inline-block; margin-left: 8px; padding: 2px 8px; border: 1px solid var(--border); border-radius: 14px; font-size: 12px; color: var(--muted); }
24
+ .sub { margin-top: 6px; color: var(--muted); }
25
+ .block { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 16px; margin-bottom: 16px; }
26
+ .block h2 { margin: 0 0 10px; font-size: 18px; }
27
+ .kvs { display: grid; grid-template-columns: 140px 1fr; gap: 8px 16px; align-items: center; }
28
+ .kvs div:first-child { color: var(--muted); }
29
+ ul.links { list-style: none; padding: 0; margin: 0; }
30
+ ul.links li { margin: 6px 0; }
31
+ ul.links a { color: var(--fg); text-decoration: none; border-bottom: 1px dotted var(--border); }
32
+ ul.links a:hover { color: var(--accent); border-bottom-color: var(--accent); }
33
+ pre { margin: 0; background: #fff; border: 1px solid var(--border); border-radius: 6px; padding: 12px; overflow: auto; }
34
+ code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; font-size: 13px; }
35
+ footer.site-footer { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--border); color: var(--muted); }
36
+ footer.site-footer a { color: var(--fg); text-decoration: none; }
37
+ footer.site-footer a:hover { color: var(--accent); }
194
38
  </style>
195
39
  </head>
196
40
  <body>
197
- <div class="layout">
198
- <div class="container">
199
- <header class="header">
200
- <h1>网易云音乐 API Enhanced <span id="api-version" class="version"></span></h1>
201
- <p>🔍 A revival project for NeteaseCloudMusicApi Node.js Services</p>
202
- </header>
203
-
204
- <div class="card">
205
- <h2><i class="mdi mdi-book-open-page-variant"></i>文档与演示</h2>
206
- <ul class="feature-list">
207
- <li class="feature-item">
208
- <a href="/docs" target="_blank">
209
- <i class="mdi mdi-file-document"></i>
210
- API 文档
211
- </a>
212
- </li>
213
- <li class="feature-item">
214
- <a href="./api.html">
215
- <i class="mdi mdi-console"></i>
216
- API 调试界面
217
- </a>
218
- </li>
219
- <li class="feature-item">
220
- <a href="./qrlogin.html">
221
- <i class="mdi mdi-qrcode"></i>
222
- 二维码登录演示
223
- </a>
224
- </li>
225
- </ul>
226
- </div>
227
-
228
- <div class="card">
229
- <h2><i class="mdi mdi-music"></i>音乐功能</h2>
230
- <ul class="feature-list">
231
- <li class="feature-item">
232
- <a href="./search?keywords=这么可爱真是抱歉">
233
- <i class="mdi mdi-magnify"></i>
234
- 搜索歌曲
235
- </a>
236
- </li>
237
- <li class="feature-item">
238
- <a href="./unblock_test.html">
239
- <i class="mdi mdi-lock-open"></i>
240
- 解灰测试
241
- </a>
242
- </li>
243
- <li class="feature-item">
244
- <a href="./comment/music?id=1969519579&limit=1">
245
- <i class="mdi mdi-comment"></i>
246
- 获取评论
247
- </a>
248
- </li>
249
- </ul>
250
- </div>
251
-
252
- <div class="card">
253
- <h2><i class="mdi mdi-tools"></i>实用工具</h2>
254
- <ul class="feature-list">
255
- <li class="feature-item">
256
- <a href="./audio_match_demo/index.html">
257
- <i class="mdi mdi-music-note-search"></i>
258
- 听歌识曲
259
- </a>
260
- </li>
261
- <li class="feature-item">
262
- <a href="./cloud.html">
263
- <i class="mdi mdi-cloud-upload"></i>
264
- 云盘上传
265
- </a>
266
- </li>
267
- <li class="feature-item">
268
- <a href="./playlist_import.html">
269
- <i class="mdi mdi-playlist-plus"></i>
270
- 歌单导入
271
- </a>
272
- </li>
273
- <li class="feature-item">
274
- <a href="./eapi_decrypt.html">
275
- <i class="mdi mdi-decode"></i>
276
- EAPI 解析
277
- </a>
278
- </li>
279
- </ul>
41
+ <main class="container">
42
+ <header class="site-header">
43
+ <h1>网易云音乐 API Enhanced <span id="api-version" class="badge"></span></h1>
44
+ <p class="sub">🔍 A revival project for NeteaseCloudMusicApi Node.js Api Services || 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护</p>
45
+ </header>
46
+
47
+ <section class="block">
48
+ <h2>状态</h2>
49
+ <div class="kvs">
50
+ <div>Base URL</div><div id="base-url">—</div>
51
+ <div>当前页</div><div id="current-url">—</div>
280
52
  </div>
53
+ </section>
54
+
55
+ <section class="block">
56
+ <h2>文档</h2>
57
+ <p><a href="/docs" target="_blank">查看在线文档</a></p>
58
+ </section>
59
+
60
+ <section class="block">
61
+ <h2>常用接口</h2>
62
+ <ul class="links">
63
+ <li><a href="/search?keywords=这么可爱真是抱歉">搜索音乐: <code>GET /search</code></a></li>
64
+ <li><a href="/song/detail?ids=1969519579">获取音乐详情: <code>GET /song/detail</code></a></li>
65
+ <li><a href="/comment/music?id=1969519579&limit=1">获取音乐评论: <code>GET /comment/music</code></a></li>
66
+ <li><a href="/song/url/v1?id=1969519579&level=exhigh">获取音乐播放链接: <code>GET /song/url/v1</code></a></li>
67
+ </ul>
68
+ </section>
69
+
70
+ <section class="block">
71
+ <h2>调试部分</h2>
72
+ <pre><code>curl -s {origin}/inner/version
73
+ curl -s {origin}/search?keywords=网易云</code></pre>
74
+ <p style="margin-top:10px"> · <a href="/api.html">交互式调试</a> · <a href="/qrlogin.html">二维码登录示例</a> · <a href="/unblock_test.html">解灰测试</a></p> · <a href="/audio_match_demo/index.html">听歌识曲 Demo</a></p> · <a href="/unblock_test.html">云盘上传</a></p> · <a href="/playlist_import.html">歌单导入</a></p> · <a href="/eapi_decrypt.html">EAPI 解密</p>
75
+ </section>
76
+
77
+ <footer class="site-footer">
78
+ <a href="https://github.com/neteasecloudmusicapienhanced/api-enhanced" target="_blank">GitHub</a>
79
+ </footer>
80
+ </main>
281
81
 
282
- <div class="status">
283
- 当前访问地址:<span id="current-url"></span>
284
- </div>
285
-
286
- <footer class="footer">
287
- <span>© 2025 网易云音乐 API Enhanced(Reborn) | </span>
288
- <a href="https://github.com/neteasecloudmusicapienhanced/api-enhanced" target="_blank">
289
- <i class="mdi mdi-github"></i> GitHub
290
- </a>
291
- </footer>
292
- </div>
293
- </div>
294
-
295
- <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
296
82
  <script>
297
- document.addEventListener('DOMContentLoaded', function() {
298
- // 显示当前URL
83
+ document.addEventListener('DOMContentLoaded', function () {
84
+ var origin = window.location.origin;
85
+ document.getElementById('base-url').textContent = origin;
299
86
  document.getElementById('current-url').textContent = window.location.href;
300
-
301
- // 获取API版本号
302
- axios({
303
- url: '/inner/version',
304
- method: 'post',
305
- data: {},
306
- }).then((res) => {
307
- const version = res.data.data.version;
308
- document.getElementById('api-version').textContent = `v${version}`;
309
- });
87
+
88
+ fetch('/inner/version', { method: 'POST' })
89
+ .then(function (r) { return r.json(); })
90
+ .then(function (data) {
91
+ var v = data && data.data && data.data.version;
92
+ if (v) document.getElementById('api-version').textContent = 'v' + v;
93
+ var pre = document.querySelector('pre code');
94
+ if (pre) pre.textContent = pre.textContent.replace(/\{origin\}/g, origin);
95
+ })
96
+ .catch(function () {});
310
97
  });
311
98
  </script>
312
99
  </body>