[\s\S]*?

[\s\S]*?
]*>([^<]+?)<\/a>[\s\S]*?]*>([^<]+?)<\/a>/g;
+ let result,
+ playlists = [];
+ while ((result = pattern.exec(response.body)) != null) {
+ playlists.push({
+ creator: {
+ userId: result[4].slice('/user/home?id='.length),
+ nickname: result[5],
+ },
+ coverImgUrl: result[1].slice(0, -'?param=50y50'.length),
+ name: result[3],
+ id: result[2].slice('/playlist?id='.length),
+ });
+ }
+ response.body = { code: 200, playlists: playlists };
+ return response;
+ } catch (err) {
+ response.status = 500;
+ response.body = { code: 500, msg: err.stack };
+ return Promise.reject(response);
+ }
+ });
+};
diff --git a/netease_api/module/resource_like.js b/netease_api/module/resource_like.js
new file mode 100644
index 0000000..3d289ba
--- /dev/null
+++ b/netease_api/module/resource_like.js
@@ -0,0 +1,29 @@
+// 点赞与取消点赞资源
+
+module.exports = (query, request) => {
+ query.cookie.os = 'pc';
+ query.t = query.t == 1 ? 'like' : 'unlike';
+ query.type = {
+ 1: 'R_MV_5_', // MV
+ 4: 'A_DJ_1_', // 电台
+ 5: 'R_VI_62_', // 视频
+ 6: 'A_EV_2_',
+ }[query.type];
+ const data = {
+ threadId: query.type + query.id,
+ };
+ if (query.type === 'A_EV_2_') {
+ data.threadId = query.threadId;
+ }
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/resource/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/scrobble.js b/netease_api/module/scrobble.js
new file mode 100644
index 0000000..5b6d3e7
--- /dev/null
+++ b/netease_api/module/scrobble.js
@@ -0,0 +1,27 @@
+// 听歌打卡
+
+module.exports = (query, request) => {
+ const data = {
+ logs: JSON.stringify([
+ {
+ action: 'play',
+ json: {
+ download: 0,
+ end: 'playend',
+ id: query.id,
+ sourceId: query.sourceid,
+ time: query.time,
+ type: 'song',
+ wifi: 0,
+ },
+ },
+ ]),
+ };
+
+ return request('POST', `https://music.163.com/weapi/feedback/weblog`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/search.js b/netease_api/module/search.js
new file mode 100644
index 0000000..471d781
--- /dev/null
+++ b/netease_api/module/search.js
@@ -0,0 +1,16 @@
+// 搜索
+
+module.exports = (query, request) => {
+ const data = {
+ s: query.keywords,
+ type: query.type || 1, // 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request('POST', `https://music.163.com/weapi/search/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/search_default.js b/netease_api/module/search_default.js
new file mode 100644
index 0000000..c231d18
--- /dev/null
+++ b/netease_api/module/search_default.js
@@ -0,0 +1,16 @@
+// 默认搜索关键词
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/search/defaultkeyword/get`,
+ {},
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/search/defaultkeyword/get',
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/search_hot.js b/netease_api/module/search_hot.js
new file mode 100644
index 0000000..dd6b6d4
--- /dev/null
+++ b/netease_api/module/search_hot.js
@@ -0,0 +1,14 @@
+// 热门搜索
+
+module.exports = (query, request) => {
+ const data = {
+ type: 1111,
+ };
+ return request('POST', `https://music.163.com/weapi/search/hot`, data, {
+ crypto: 'weapi',
+ ua: 'mobile',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/search_hot_detail.js b/netease_api/module/search_hot_detail.js
new file mode 100644
index 0000000..3e869da
--- /dev/null
+++ b/netease_api/module/search_hot_detail.js
@@ -0,0 +1,15 @@
+// 热搜列表
+module.exports = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/hotsearchlist/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/search_multimatch.js b/netease_api/module/search_multimatch.js
new file mode 100644
index 0000000..6777178
--- /dev/null
+++ b/netease_api/module/search_multimatch.js
@@ -0,0 +1,19 @@
+// 多类型搜索
+
+module.exports = (query, request) => {
+ const data = {
+ type: query.type || 1,
+ s: query.keywords || '',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/search/suggest/multimatch`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/search_suggest.js b/netease_api/module/search_suggest.js
new file mode 100644
index 0000000..6e6b9cc
--- /dev/null
+++ b/netease_api/module/search_suggest.js
@@ -0,0 +1,19 @@
+// 搜索建议
+
+module.exports = (query, request) => {
+ const data = {
+ s: query.keywords || '',
+ };
+ let type = query.type == 'mobile' ? 'keyword' : 'web';
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/search/suggest/` + type,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/send_playlist.js b/netease_api/module/send_playlist.js
new file mode 100644
index 0000000..15e9238
--- /dev/null
+++ b/netease_api/module/send_playlist.js
@@ -0,0 +1,17 @@
+// 私信歌单
+
+module.exports = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ id: query.playlist,
+ type: 'playlist',
+ msg: query.msg,
+ userIds: '[' + query.user_ids + ']',
+ };
+ return request('POST', `https://music.163.com/weapi/msg/private/send`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/send_text.js b/netease_api/module/send_text.js
new file mode 100644
index 0000000..72285d6
--- /dev/null
+++ b/netease_api/module/send_text.js
@@ -0,0 +1,16 @@
+// 私信
+
+module.exports = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ type: 'text',
+ msg: query.msg,
+ userIds: '[' + query.user_ids + ']',
+ };
+ return request('POST', `https://music.163.com/weapi/msg/private/send`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/setting.js b/netease_api/module/setting.js
new file mode 100644
index 0000000..d26ced6
--- /dev/null
+++ b/netease_api/module/setting.js
@@ -0,0 +1,11 @@
+// 设置
+
+module.exports = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/user/setting`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/share_resource.js b/netease_api/module/share_resource.js
new file mode 100644
index 0000000..cd8a3d0
--- /dev/null
+++ b/netease_api/module/share_resource.js
@@ -0,0 +1,20 @@
+// 分享歌曲到动态
+
+module.exports = (query, request) => {
+ const data = {
+ type: query.type || 'song', // song,playlist,mv,djprogram,djradio
+ msg: query.msg || '',
+ id: query.id || '',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/share/friends/resource`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/simi_artist.js b/netease_api/module/simi_artist.js
new file mode 100644
index 0000000..3c079a8
--- /dev/null
+++ b/netease_api/module/simi_artist.js
@@ -0,0 +1,18 @@
+// 相似歌手
+
+module.exports = (query, request) => {
+ const data = {
+ artistid: query.id,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiArtist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/simi_mv.js b/netease_api/module/simi_mv.js
new file mode 100644
index 0000000..bdf76a5
--- /dev/null
+++ b/netease_api/module/simi_mv.js
@@ -0,0 +1,13 @@
+// 相似MV
+
+module.exports = (query, request) => {
+ const data = {
+ mvid: query.mvid,
+ };
+ return request('POST', `https://music.163.com/weapi/discovery/simiMV`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/simi_playlist.js b/netease_api/module/simi_playlist.js
new file mode 100644
index 0000000..dbb6bce
--- /dev/null
+++ b/netease_api/module/simi_playlist.js
@@ -0,0 +1,20 @@
+// 相似歌单
+
+module.exports = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiPlaylist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/simi_song.js b/netease_api/module/simi_song.js
new file mode 100644
index 0000000..9cc1c4a
--- /dev/null
+++ b/netease_api/module/simi_song.js
@@ -0,0 +1,20 @@
+// 相似歌曲
+
+module.exports = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/discovery/simiSong`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/simi_user.js b/netease_api/module/simi_user.js
new file mode 100644
index 0000000..607277b
--- /dev/null
+++ b/netease_api/module/simi_user.js
@@ -0,0 +1,20 @@
+// 相似用户
+
+module.exports = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiUser`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/song_detail.js b/netease_api/module/song_detail.js
new file mode 100644
index 0000000..92c72ef
--- /dev/null
+++ b/netease_api/module/song_detail.js
@@ -0,0 +1,15 @@
+// 歌曲详情
+
+module.exports = (query, request) => {
+ query.ids = query.ids.split(/\s*,\s*/);
+ const data = {
+ c: '[' + query.ids.map((id) => '{"id":' + id + '}').join(',') + ']',
+ ids: '[' + query.ids.join(',') + ']',
+ };
+ return request('POST', `https://music.163.com/weapi/v3/song/detail`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/song_order_update.js b/netease_api/module/song_order_update.js
new file mode 100644
index 0000000..3fb6c8a
--- /dev/null
+++ b/netease_api/module/song_order_update.js
@@ -0,0 +1,22 @@
+// 更新歌曲顺序
+
+module.exports = (query, request) => {
+ const data = {
+ pid: query.pid,
+ trackIds: query.ids,
+ op: 'update',
+ };
+
+ return request(
+ 'POST',
+ `http://interface.music.163.com/api/playlist/manipulate/tracks`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/playlist/desc/update',
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/song_url.js b/netease_api/module/song_url.js
new file mode 100644
index 0000000..e2a55ae
--- /dev/null
+++ b/netease_api/module/song_url.js
@@ -0,0 +1,25 @@
+// 歌曲链接
+
+const crypto = require('crypto');
+
+module.exports = (query, request) => {
+ if (!('MUSIC_U' in query.cookie))
+ query.cookie._ntes_nuid = crypto.randomBytes(16).toString('hex');
+ query.cookie.os = 'pc';
+ const data = {
+ ids: '[' + query.id + ']',
+ br: parseInt(query.br || 999000),
+ };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/song/enhance/player/url`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ url: '/api/song/enhance/player/url',
+ },
+ );
+};
diff --git a/netease_api/module/top_album.js b/netease_api/module/top_album.js
new file mode 100644
index 0000000..2812f72
--- /dev/null
+++ b/netease_api/module/top_album.js
@@ -0,0 +1,27 @@
+// 新碟上架
+
+module.exports = (query, request) => {
+ const date = new Date();
+
+ const data = {
+ area: query.area || 'ALL', // //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ type: query.type || 'new',
+ year: query.year || date.getFullYear(),
+ month: query.month || date.getMonth() + 1,
+ total: false,
+ rcmd: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/discovery/new/albums/area`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/top_artists.js b/netease_api/module/top_artists.js
new file mode 100644
index 0000000..bd3dbad
--- /dev/null
+++ b/netease_api/module/top_artists.js
@@ -0,0 +1,15 @@
+// 热门歌手
+
+module.exports = (query, request) => {
+ const data = {
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/artist/top`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/top_list.js b/netease_api/module/top_list.js
new file mode 100644
index 0000000..5ab262b
--- /dev/null
+++ b/netease_api/module/top_list.js
@@ -0,0 +1,30 @@
+// 排行榜
+module.exports = (query, request) => {
+ query.cookie.os = 'pc';
+ if (query.idx) {
+ return Promise.resolve({
+ status: 500,
+ body: {
+ code: 500,
+ msg: '不支持此方式调用,只支持id调用',
+ },
+ });
+ }
+
+ const data = {
+ id: query.id,
+ n: '500',
+ s: '0',
+ };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/api/playlist/v4/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/top_mv.js b/netease_api/module/top_mv.js
new file mode 100644
index 0000000..4c77888
--- /dev/null
+++ b/netease_api/module/top_mv.js
@@ -0,0 +1,16 @@
+// MV排行榜
+
+module.exports = (query, request) => {
+ const data = {
+ area: query.area || '',
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/mv/toplist`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/top_playlist.js b/netease_api/module/top_playlist.js
new file mode 100644
index 0000000..7a2e5e0
--- /dev/null
+++ b/netease_api/module/top_playlist.js
@@ -0,0 +1,17 @@
+// 分类歌单
+
+module.exports = (query, request) => {
+ const data = {
+ cat: query.cat || '全部', // 全部,华语,欧美,日语,韩语,粤语,小语种,流行,摇滚,民谣,电子,舞曲,说唱,轻音乐,爵士,乡村,R&B/Soul,古典,民族,英伦,金属,朋克,蓝调,雷鬼,世界音乐,拉丁,另类/独立,New Age,古风,后摇,Bossa Nova,清晨,夜晚,学习,工作,午休,下午茶,地铁,驾车,运动,旅行,散步,酒吧,怀旧,清新,浪漫,性感,伤感,治愈,放松,孤独,感动,兴奋,快乐,安静,思念,影视原声,ACG,儿童,校园,游戏,70后,80后,90后,网络歌曲,KTV,经典,翻唱,吉他,钢琴,器乐,榜单,00后
+ order: query.order || 'hot', // hot,new
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/playlist/list`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/top_playlist_highquality.js b/netease_api/module/top_playlist_highquality.js
new file mode 100644
index 0000000..8eb5b88
--- /dev/null
+++ b/netease_api/module/top_playlist_highquality.js
@@ -0,0 +1,21 @@
+// 精品歌单
+
+module.exports = (query, request) => {
+ const data = {
+ cat: query.cat || '全部', // 全部,华语,欧美,韩语,日语,粤语,小语种,运动,ACG,影视原声,流行,摇滚,后摇,古风,民谣,轻音乐,电子,器乐,说唱,古典,爵士
+ limit: query.limit || 50,
+ lasttime: query.before || 0, // 歌单updateTime
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/highquality/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/top_song.js b/netease_api/module/top_song.js
new file mode 100644
index 0000000..a6d7d54
--- /dev/null
+++ b/netease_api/module/top_song.js
@@ -0,0 +1,21 @@
+// 新歌速递
+
+module.exports = (query, request) => {
+ const data = {
+ areaId: query.type || 0, // 全部:0 华语:7 欧美:96 日本:8 韩国:16
+ // limit: query.limit || 100,
+ // offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/discovery/new/songs`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/toplist.js b/netease_api/module/toplist.js
new file mode 100644
index 0000000..9239ba4
--- /dev/null
+++ b/netease_api/module/toplist.js
@@ -0,0 +1,15 @@
+// 所有榜单介绍
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/api/toplist`,
+ {},
+ {
+ crypto: 'linuxapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/toplist_artist.js b/netease_api/module/toplist_artist.js
new file mode 100644
index 0000000..3a71147
--- /dev/null
+++ b/netease_api/module/toplist_artist.js
@@ -0,0 +1,16 @@
+// 歌手榜
+
+module.exports = (query, request) => {
+ const data = {
+ type: query.type || 1,
+ limit: 100,
+ offset: 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/toplist/artist`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/toplist_detail.js b/netease_api/module/toplist_detail.js
new file mode 100644
index 0000000..e3e442f
--- /dev/null
+++ b/netease_api/module/toplist_detail.js
@@ -0,0 +1,15 @@
+// 所有榜单内容摘要
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/toplist/detail`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_account.js b/netease_api/module/user_account.js
new file mode 100644
index 0000000..f1bf505
--- /dev/null
+++ b/netease_api/module/user_account.js
@@ -0,0 +1,9 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/nuser/account/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_audio.js b/netease_api/module/user_audio.js
new file mode 100644
index 0000000..43aa231
--- /dev/null
+++ b/netease_api/module/user_audio.js
@@ -0,0 +1,18 @@
+// 用户创建的电台
+
+module.exports = (query, request) => {
+ const data = {
+ userId: query.uid,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/get/byuser`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_binding.js b/netease_api/module/user_binding.js
new file mode 100644
index 0000000..787984f
--- /dev/null
+++ b/netease_api/module/user_binding.js
@@ -0,0 +1,14 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/v1/user/bindings/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_cloud.js b/netease_api/module/user_cloud.js
new file mode 100644
index 0000000..0f0aa8e
--- /dev/null
+++ b/netease_api/module/user_cloud.js
@@ -0,0 +1,14 @@
+// 云盘数据
+
+module.exports = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request('POST', `https://music.163.com/weapi/v1/cloud/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_cloud_del.js b/netease_api/module/user_cloud_del.js
new file mode 100644
index 0000000..ab42bfe
--- /dev/null
+++ b/netease_api/module/user_cloud_del.js
@@ -0,0 +1,13 @@
+// 云盘歌曲删除
+
+module.exports = (query, request) => {
+ const data = {
+ songIds: [query.id],
+ };
+ return request('POST', `https://music.163.com/weapi/cloud/del`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_cloud_detail.js b/netease_api/module/user_cloud_detail.js
new file mode 100644
index 0000000..c41ff80
--- /dev/null
+++ b/netease_api/module/user_cloud_detail.js
@@ -0,0 +1,19 @@
+// 云盘数据详情
+
+module.exports = (query, request) => {
+ const id = query.id.replace(/\s/g, '').split(',');
+ const data = {
+ songIds: id,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/cloud/get/byids`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_detail.js b/netease_api/module/user_detail.js
new file mode 100644
index 0000000..be14276
--- /dev/null
+++ b/netease_api/module/user_detail.js
@@ -0,0 +1,15 @@
+// 用户详情
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/user/detail/${query.uid}`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_dj.js b/netease_api/module/user_dj.js
new file mode 100644
index 0000000..78f9c2a
--- /dev/null
+++ b/netease_api/module/user_dj.js
@@ -0,0 +1,19 @@
+// 用户电台节目
+
+module.exports = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/dj/program/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_event.js b/netease_api/module/user_event.js
new file mode 100644
index 0000000..35a287c
--- /dev/null
+++ b/netease_api/module/user_event.js
@@ -0,0 +1,21 @@
+// 用户动态
+
+module.exports = (query, request) => {
+ const data = {
+ getcounts: true,
+ time: query.lasttime || -1,
+ limit: query.limit || 30,
+ total: false,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/event/get/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_followeds.js b/netease_api/module/user_followeds.js
new file mode 100644
index 0000000..14dc835
--- /dev/null
+++ b/netease_api/module/user_followeds.js
@@ -0,0 +1,21 @@
+// 关注TA的人(粉丝)
+
+module.exports = (query, request) => {
+ const data = {
+ userId: query.uid,
+ time: query.lasttime || -1,
+ limit: query.limit || 30,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/eapi/user/getfolloweds/${query.uid}`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/user/getfolloweds',
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_follows.js b/netease_api/module/user_follows.js
new file mode 100644
index 0000000..3e12a21
--- /dev/null
+++ b/netease_api/module/user_follows.js
@@ -0,0 +1,20 @@
+// TA关注的人(关注)
+
+module.exports = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ limit: query.limit || 30,
+ order: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/user/getfollows/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_level.js b/netease_api/module/user_level.js
new file mode 100644
index 0000000..9eb9694
--- /dev/null
+++ b/netease_api/module/user_level.js
@@ -0,0 +1,11 @@
+// 类别热门电台
+
+module.exports = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/weapi/user/level`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_playlist.js b/netease_api/module/user_playlist.js
new file mode 100644
index 0000000..cdef629
--- /dev/null
+++ b/netease_api/module/user_playlist.js
@@ -0,0 +1,16 @@
+// 用户歌单
+
+module.exports = (query, request) => {
+ const data = {
+ uid: query.uid,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ includeVideo: true,
+ };
+ return request('POST', `https://music.163.com/api/user/playlist`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_record.js b/netease_api/module/user_record.js
new file mode 100644
index 0000000..a882701
--- /dev/null
+++ b/netease_api/module/user_record.js
@@ -0,0 +1,14 @@
+// 听歌排行
+
+module.exports = (query, request) => {
+ const data = {
+ uid: query.uid,
+ type: query.type || 0, // 1: 最近一周, 0: 所有时间
+ };
+ return request('POST', `https://music.163.com/weapi/v1/play/record`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/user_replacephone.js b/netease_api/module/user_replacephone.js
new file mode 100644
index 0000000..ee8d459
--- /dev/null
+++ b/netease_api/module/user_replacephone.js
@@ -0,0 +1,19 @@
+module.exports = (query, request) => {
+ const data = {
+ phone: query.phone,
+ captcha: query.captcha,
+ oldcaptcha: query.oldcaptcha,
+ countrycode: query.countrycode || '86',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/user/replaceCellphone`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_subcount.js b/netease_api/module/user_subcount.js
new file mode 100644
index 0000000..414ce01
--- /dev/null
+++ b/netease_api/module/user_subcount.js
@@ -0,0 +1,15 @@
+// 收藏计数
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/subcount`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/user_update.js b/netease_api/module/user_update.js
new file mode 100644
index 0000000..d84281c
--- /dev/null
+++ b/netease_api/module/user_update.js
@@ -0,0 +1,24 @@
+// 编辑用户信息
+
+module.exports = (query, request) => {
+ const data = {
+ avatarImgId: '0',
+ birthday: query.birthday,
+ city: query.city,
+ gender: query.gender,
+ nickname: query.nickname,
+ province: query.province,
+ signature: query.signature,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/user/profile/update`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_category_list.js b/netease_api/module/video_category_list.js
new file mode 100644
index 0000000..40305fb
--- /dev/null
+++ b/netease_api/module/video_category_list.js
@@ -0,0 +1,20 @@
+// 视频分类列表
+
+module.exports = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ total: 'true',
+ limit: query.limit || 99,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/cloudvideo/category/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_detail.js b/netease_api/module/video_detail.js
new file mode 100644
index 0000000..f668743
--- /dev/null
+++ b/netease_api/module/video_detail.js
@@ -0,0 +1,18 @@
+// 视频详情
+
+module.exports = (query, request) => {
+ const data = {
+ id: query.id,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/v1/video/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_detail_info.js b/netease_api/module/video_detail_info.js
new file mode 100644
index 0000000..c8ebd4b
--- /dev/null
+++ b/netease_api/module/video_detail_info.js
@@ -0,0 +1,19 @@
+// 视频点赞转发评论数数据
+
+module.exports = (query, request) => {
+ const data = {
+ threadid: `R_VI_62_${query.vid}`,
+ composeliked: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/comment/commentthread/info`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_group.js b/netease_api/module/video_group.js
new file mode 100644
index 0000000..77ae3f6
--- /dev/null
+++ b/netease_api/module/video_group.js
@@ -0,0 +1,21 @@
+// 视频标签/分类下的视频
+
+module.exports = (query, request) => {
+ const data = {
+ groupId: query.id,
+ offset: query.offset || 0,
+ need_preview_url: 'true',
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/videotimeline/videogroup/otherclient/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_group_list.js b/netease_api/module/video_group_list.js
new file mode 100644
index 0000000..babe3ab
--- /dev/null
+++ b/netease_api/module/video_group_list.js
@@ -0,0 +1,16 @@
+// 视频标签列表
+
+module.exports = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/cloudvideo/group/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_sub.js b/netease_api/module/video_sub.js
new file mode 100644
index 0000000..1e46591
--- /dev/null
+++ b/netease_api/module/video_sub.js
@@ -0,0 +1,19 @@
+// 收藏与取消收藏视频
+
+module.exports = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = {
+ id: query.id,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/video/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_timeline_all.js b/netease_api/module/video_timeline_all.js
new file mode 100644
index 0000000..9c107a6
--- /dev/null
+++ b/netease_api/module/video_timeline_all.js
@@ -0,0 +1,22 @@
+// 全部视频列表
+
+module.exports = (query, request) => {
+ const data = {
+ groupId: 0,
+ offset: query.offset || 0,
+ need_preview_url: 'true',
+ total: true,
+ };
+ // /api/videotimeline/otherclient/get
+ return request(
+ 'POST',
+ `https://music.163.com/api/videotimeline/otherclient/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/video_timeline_recommend.js b/netease_api/module/video_timeline_recommend.js
new file mode 100644
index 0000000..a249089
--- /dev/null
+++ b/netease_api/module/video_timeline_recommend.js
@@ -0,0 +1,17 @@
+// 推荐视频
+
+module.exports = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ filterLives: '[]',
+ withProgramInfo: 'true',
+ needUrl: '1',
+ resolution: '480',
+ };
+ return request('POST', `https://music.163.com/api/videotimeline/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/video_url.js b/netease_api/module/video_url.js
new file mode 100644
index 0000000..8d2673c
--- /dev/null
+++ b/netease_api/module/video_url.js
@@ -0,0 +1,19 @@
+// 视频链接
+
+module.exports = (query, request) => {
+ const data = {
+ ids: '["' + query.id + '"]',
+ resolution: query.res || 1080,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/playurl`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/weblog.js b/netease_api/module/weblog.js
new file mode 100644
index 0000000..2b8d0be
--- /dev/null
+++ b/netease_api/module/weblog.js
@@ -0,0 +1,15 @@
+// 操作记录
+
+module.exports = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/feedback/weblog`,
+ query.data || {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei.js b/netease_api/module/yunbei.js
new file mode 100644
index 0000000..367fe3e
--- /dev/null
+++ b/netease_api/module/yunbei.js
@@ -0,0 +1,10 @@
+module.exports = (query, request) => {
+ const data = {};
+ // /api/point/today/get
+ return request('POST', `https://music.163.com/api/point/signed/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/yunbei_expense.js b/netease_api/module/yunbei_expense.js
new file mode 100644
index 0000000..29ab8d0
--- /dev/null
+++ b/netease_api/module/yunbei_expense.js
@@ -0,0 +1,17 @@
+module.exports = (query, request) => {
+ const data = {
+ limit: query.limit || 10,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/store/api/point/expense`,
+ data,
+ {
+ crypto: 'api',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei_info.js b/netease_api/module/yunbei_info.js
new file mode 100644
index 0000000..7aa122a
--- /dev/null
+++ b/netease_api/module/yunbei_info.js
@@ -0,0 +1,9 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/v1/user/info`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/yunbei_receipt.js b/netease_api/module/yunbei_receipt.js
new file mode 100644
index 0000000..7b662ce
--- /dev/null
+++ b/netease_api/module/yunbei_receipt.js
@@ -0,0 +1,17 @@
+module.exports = (query, request) => {
+ const data = {
+ limit: query.limit || 10,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/store/api/point/receipt`,
+ data,
+ {
+ crypto: 'api',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei_sign.js b/netease_api/module/yunbei_sign.js
new file mode 100644
index 0000000..0f1c913
--- /dev/null
+++ b/netease_api/module/yunbei_sign.js
@@ -0,0 +1,11 @@
+module.exports = (query, request) => {
+ const data = {
+ type: '0',
+ };
+ return request('POST', `https://music.163.com/api/point/dailyTask`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/module/yunbei_task_finish.js b/netease_api/module/yunbei_task_finish.js
new file mode 100644
index 0000000..258c495
--- /dev/null
+++ b/netease_api/module/yunbei_task_finish.js
@@ -0,0 +1,17 @@
+module.exports = (query, request) => {
+ const data = {
+ userTaskId: query.userTaskId,
+ depositCode: query.depositCode || '0',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/point/receive`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei_tasks.js b/netease_api/module/yunbei_tasks.js
new file mode 100644
index 0000000..7515e00
--- /dev/null
+++ b/netease_api/module/yunbei_tasks.js
@@ -0,0 +1,14 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/list/all`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei_tasks_todo.js b/netease_api/module/yunbei_tasks_todo.js
new file mode 100644
index 0000000..924dced
--- /dev/null
+++ b/netease_api/module/yunbei_tasks_todo.js
@@ -0,0 +1,14 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/todo/query`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+};
diff --git a/netease_api/module/yunbei_today.js b/netease_api/module/yunbei_today.js
new file mode 100644
index 0000000..4f707f8
--- /dev/null
+++ b/netease_api/module/yunbei_today.js
@@ -0,0 +1,9 @@
+module.exports = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/point/today/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+};
diff --git a/netease_api/package-lock.json b/netease_api/package-lock.json
new file mode 100644
index 0000000..de5e769
--- /dev/null
+++ b/netease_api/package-lock.json
@@ -0,0 +1,4096 @@
+{
+ "name": "NeteaseCloudMusicApi",
+ "version": "3.45.2",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz?cache=0&sync_timestamp=1593522948158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.10.4.tgz",
+ "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz?cache=0&sync_timestamp=1593521083613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz?cache=0&sync_timestamp=1593521095576&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.10.4.tgz",
+ "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+ "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz",
+ "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npm.taobao.org/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.3.tgz",
+ "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.3",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.3.tgz",
+ "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npm.taobao.org/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.4.tgz",
+ "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.3",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/@tootallnate/once/download/@tootallnate/once-1.1.2.tgz",
+ "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I="
+ },
+ "@types/json-schema": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.6.tgz?cache=0&sync_timestamp=1598910403749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.6.tgz",
+ "integrity": "sha1-9MfsQ+gbMZqYFRFQMXCfJph4kfA=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "14.11.10",
+ "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.11.10.tgz",
+ "integrity": "sha1-jBAquhO/UlPzUUav+/iyYnUGm+8=",
+ "dev": true
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1596839394119&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fparse-json%2Fdownload%2F%40types%2Fparse-json-4.0.0.tgz",
+ "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=",
+ "dev": true
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-4.4.1.tgz?cache=0&sync_timestamp=1603565073344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Feslint-plugin%2Fdownload%2F%40typescript-eslint%2Feslint-plugin-4.4.1.tgz",
+ "integrity": "sha1-uKzqA3O9KjiKxH30RlLwC/izaPU=",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/experimental-utils": "4.4.1",
+ "@typescript-eslint/scope-manager": "4.4.1",
+ "debug": "^4.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "regexpp": "^3.0.0",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/experimental-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.4.1.tgz?cache=0&sync_timestamp=1603563239927&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Fexperimental-utils%2Fdownload%2F%40typescript-eslint%2Fexperimental-utils-4.4.1.tgz",
+ "integrity": "sha1-QGE7l1f6AXDePgBDJU27B3yvrAw=",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/scope-manager": "4.4.1",
+ "@typescript-eslint/types": "4.4.1",
+ "@typescript-eslint/typescript-estree": "4.4.1",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/parser/download/@typescript-eslint/parser-4.4.1.tgz?cache=0&sync_timestamp=1603563241160&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Fparser%2Fdownload%2F%40typescript-eslint%2Fparser-4.4.1.tgz",
+ "integrity": "sha1-Jf3pwIBhHzA/LzPO2xRdLFmRW4A=",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "4.4.1",
+ "@typescript-eslint/types": "4.4.1",
+ "@typescript-eslint/typescript-estree": "4.4.1",
+ "debug": "^4.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.4.1.tgz",
+ "integrity": "sha1-0ZRH5g2yzpxCWJjWL6A7LM6Oo/k=",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "4.4.1",
+ "@typescript-eslint/visitor-keys": "4.4.1"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/types/download/@typescript-eslint/types-4.4.1.tgz",
+ "integrity": "sha1-xQezXPUjvHugCq5fde6bgQzau8E=",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.4.1.tgz?cache=0&sync_timestamp=1603563238913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40typescript-eslint%2Ftypescript-estree%2Fdownload%2F%40typescript-eslint%2Ftypescript-estree-4.4.1.tgz",
+ "integrity": "sha1-WY9t5IgQbCWH1HyiRixg9uJ5fLg=",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "4.4.1",
+ "@typescript-eslint/visitor-keys": "4.4.1",
+ "debug": "^4.1.1",
+ "globby": "^11.0.1",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.4.1.tgz",
+ "integrity": "sha1-F2ncep4tfSz9Mxi3ftgkkYeu1cM=",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "4.4.1",
+ "eslint-visitor-keys": "^2.0.0"
+ }
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/@ungap/promise-all-settled/download/@ungap/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ=",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
+ "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-es7-plugin": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npm.taobao.org/acorn-es7-plugin/download/acorn-es7-plugin-1.1.7.tgz",
+ "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-6.0.2.tgz?cache=0&sync_timestamp=1603480100923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagent-base%2Fdownload%2Fagent-base-6.0.2.tgz",
+ "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=",
+ "requires": {
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1598049717562&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz",
+ "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1603561547443&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz",
+ "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-4.1.1.tgz",
+ "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.1.tgz",
+ "integrity": "sha1-pcR8xDGB8fOP/XB2g3cA05VSKmE=",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.11.0.tgz?cache=0&sync_timestamp=1602623859603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype-fest%2Fdownload%2Ftype-fest-0.11.0.tgz",
+ "integrity": "sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E=",
+ "dev": true
+ }
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz",
+ "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz",
+ "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz",
+ "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&sync_timestamp=1598649734444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz",
+ "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-filter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/array-filter/download/array-filter-1.0.0.tgz",
+ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
+ "dev": true
+ },
+ "array-find": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/array-find/download/array-find-1.0.0.tgz",
+ "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&sync_timestamp=1574313384951&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz",
+ "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=",
+ "dev": true
+ },
+ "ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npm.taobao.org/ast-types/download/ast-types-0.13.4.tgz?cache=0&sync_timestamp=1599935985242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fast-types%2Fdownload%2Fast-types-0.13.4.tgz",
+ "integrity": "sha1-7g13s0MmOWXsw/ti2hbnIisrZ4I=",
+ "requires": {
+ "tslib": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz",
+ "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.20.0.tgz",
+ "integrity": "sha1-BXujDwSIRpSZOozQf6OUz/EcUL0=",
+ "requires": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz",
+ "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz",
+ "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898189928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz",
+ "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz",
+ "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.1.tgz",
+ "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=",
+ "dev": true
+ },
+ "busboy": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npm.taobao.org/busboy/download/busboy-0.3.1.tgz",
+ "integrity": "sha1-FwiZJ0xb84quJ9XGK3EmjNWF/Rs=",
+ "requires": {
+ "dicer": "0.3.0"
+ }
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz",
+ "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY="
+ },
+ "call-matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/call-matcher/download/call-matcher-1.1.0.tgz",
+ "integrity": "sha1-I7LBvHqDlMi+KGCdd929V4ZoBDI=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "deep-equal": "^1.0.0",
+ "espurify": "^1.6.0",
+ "estraverse": "^4.0.0"
+ }
+ },
+ "call-signature": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npm.taobao.org/call-signature/download/call-signature-0.0.2.tgz",
+ "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz",
+ "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1602350083472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz",
+ "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-4.1.0.tgz",
+ "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz",
+ "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
+ "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585381749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz",
+ "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ }
+ },
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-2.0.0.tgz",
+ "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=",
+ "dev": true
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1592035524745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz",
+ "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz",
+ "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/cli-truncate/download/cli-truncate-2.1.0.tgz",
+ "integrity": "sha1-w54ovwXtzeW+O5iZKiLe7Vork8c=",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz",
+ "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz",
+ "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-3.0.0.tgz",
+ "integrity": "sha1-Md3BCTCht+C2ewjJbC9Jt3p4l4c=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz",
+ "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1602861367442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz",
+ "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz",
+ "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+ "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
+ "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npm.taobao.org/commander/download/commander-6.2.0.tgz?cache=0&sync_timestamp=1603599636161&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-6.2.0.tgz",
+ "integrity": "sha1-uZC/uKwDCu3G0RvATRSI/+9W23U=",
+ "dev": true
+ },
+ "compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npm.taobao.org/compare-versions/download/compare-versions-3.6.0.tgz",
+ "integrity": "sha1-GlaJkTaF5ah2N7jT/8p1UU7EHWI=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz",
+ "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
+ "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz?cache=0&sync_timestamp=1573003637425&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.7.0.tgz",
+ "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525865178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz",
+ "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz?cache=0&sync_timestamp=1586450269267&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.11.tgz",
+ "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-6.0.0.tgz?cache=0&sync_timestamp=1596310819353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-6.0.0.tgz",
+ "integrity": "sha1-2k/uhTxS9rHmk19BwaL8UL1KmYI=",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz",
+ "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz",
+ "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "data-uri-to-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npm.taobao.org/data-uri-to-buffer/download/data-uri-to-buffer-3.0.1.tgz?cache=0&sync_timestamp=1590800007667&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdata-uri-to-buffer%2Fdownload%2Fdata-uri-to-buffer-3.0.1.tgz",
+ "integrity": "sha1-WUuJc5OMW8LDMEZTV4U0GrxPNjY="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
+ "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz",
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
+ "dev": true
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz",
+ "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=",
+ "dev": true,
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz",
+ "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "degenerator": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npm.taobao.org/degenerator/download/degenerator-2.2.0.tgz",
+ "integrity": "sha1-SemMEfoCk8Wybt+7UvFXKa/NslQ=",
+ "requires": {
+ "ast-types": "^0.13.2",
+ "escodegen": "^1.8.1",
+ "esprima": "^4.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "dicer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npm.taobao.org/dicer/download/dicer-0.3.0.tgz",
+ "integrity": "sha1-6s2Ys7+/kuirXC/bcaqsRLsGuHI=",
+ "requires": {
+ "streamsearch": "0.1.2"
+ }
+ },
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npm.taobao.org/diff/download/diff-4.0.2.tgz?cache=0&sync_timestamp=1578890967183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdiff%2Fdownload%2Fdiff-4.0.2.tgz",
+ "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=",
+ "dev": true
+ },
+ "diff-match-patch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npm.taobao.org/diff-match-patch/download/diff-match-patch-1.0.5.tgz",
+ "integrity": "sha1-q7WE1fEM0Rlt/FWqA3AVkq4/ezc=",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz",
+ "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
+ "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.1.0.tgz",
+ "integrity": "sha1-X3yCjxv8RIh9wqMVq1xFaR1US1g=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.0.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.2.tgz?cache=0&sync_timestamp=1600028495728&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.0.2.tgz",
+ "integrity": "sha1-87blSSAeRvWItZRj3XcYcTH+aXE=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz",
+ "integrity": "sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1"
+ }
+ },
+ "domutils": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-2.4.2.tgz",
+ "integrity": "sha1-fuW+JhlE4a1IfZqgYWcgAQEjkis=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.3.0"
+ }
+ },
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npm.taobao.org/eastasianwidth/download/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=",
+ "dev": true
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz",
+ "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=",
+ "dev": true
+ },
+ "empower": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npm.taobao.org/empower/download/empower-1.3.1.tgz",
+ "integrity": "sha1-dol5y7s21x2PXtqrZj3qy52rkWw=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "empower-core": "^1.2.0"
+ }
+ },
+ "empower-assert": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/empower-assert/download/empower-assert-1.1.0.tgz",
+ "integrity": "sha1-jTJ/vmmoivkN2pjRv8mCnSok/WI=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.2.0"
+ }
+ },
+ "empower-core": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/empower-core/download/empower-core-1.2.0.tgz",
+ "integrity": "sha1-zj+ySE1Rh/opwj+6g0Swsv31YBw=",
+ "dev": true,
+ "requires": {
+ "call-signature": "0.0.2",
+ "core-js": "^2.0.0"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz",
+ "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz?cache=0&sync_timestamp=1593693291943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenquirer%2Fdownload%2Fenquirer-2.3.6.tgz",
+ "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.1.0.tgz?cache=0&sync_timestamp=1602897029273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.1.0.tgz",
+ "integrity": "sha1-mS0xKc999ocLlsV4WMJJoSD4uLU=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz",
+ "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.18.0-next.1.tgz?cache=0&sync_timestamp=1601502719982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz",
+ "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npm.taobao.org/es6-map/download/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-set": "~0.1.5",
+ "es6-symbol": "~3.1.1",
+ "event-emitter": "~0.3.5"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "~0.3.5"
+ },
+ "dependencies": {
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ }
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz",
+ "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=",
+ "dev": true,
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "escallmatch": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npm.taobao.org/escallmatch/download/escallmatch-1.5.0.tgz",
+ "integrity": "sha1-UAmdhugJGwkt+N37w/mm+wWgJNA=",
+ "dev": true,
+ "requires": {
+ "call-matcher": "^1.0.0",
+ "esprima": "^2.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ }
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz?cache=0&sync_timestamp=1596669832613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescodegen%2Fdownload%2Fescodegen-1.14.3.tgz",
+ "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "dev": true,
+ "requires": {
+ "es6-map": "^0.1.3",
+ "es6-weak-map": "^2.0.1",
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint": {
+ "version": "7.12.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz",
+ "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.2.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz",
+ "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz",
+ "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.9.1.tgz",
+ "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz",
+ "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz",
+ "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npm.taobao.org/eslint-config-prettier/download/eslint-config-prettier-6.13.0.tgz?cache=0&sync_timestamp=1603294035236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-config-prettier%2Fdownload%2Feslint-config-prettier-6.13.0.tgz",
+ "integrity": "sha1-IH2IeWtWJOW7gVu738WJHOuev/o=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^6.0.0"
+ }
+ },
+ "eslint-plugin-html": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npm.taobao.org/eslint-plugin-html/download/eslint-plugin-html-6.0.3.tgz?cache=0&sync_timestamp=1599391535931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-html%2Fdownload%2Feslint-plugin-html-6.0.3.tgz",
+ "integrity": "sha1-jZ0sGH0aSO142E9F4pgg8QJCXlE=",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "^4.1.0"
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npm.taobao.org/eslint-plugin-prettier/download/eslint-plugin-prettier-3.1.4.tgz",
+ "integrity": "sha1-Foq0MVTi6lfbmSos0JfIKBcfdcI=",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1599933651660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz",
+ "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-2.1.0.tgz?cache=0&sync_timestamp=1592222145079&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-utils%2Fdownload%2Feslint-utils-2.1.0.tgz",
+ "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1597435068105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-2.0.0.tgz?cache=0&sync_timestamp=1597435068105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha1-If3I+82ceVzAMh8FY3AglXUVEag=",
+ "dev": true
+ },
+ "espower": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/espower/download/espower-2.1.2.tgz",
+ "integrity": "sha1-gk+IeI+f7fTPD5KPXhG7kHzpuRg=",
+ "dev": true,
+ "requires": {
+ "array-find": "^1.0.0",
+ "escallmatch": "^1.5.0",
+ "escodegen": "^1.7.0",
+ "escope": "^3.3.0",
+ "espower-location-detector": "^1.0.0",
+ "espurify": "^1.3.0",
+ "estraverse": "^4.1.0",
+ "source-map": "^0.5.0",
+ "type-name": "^2.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "espower-loader": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npm.taobao.org/espower-loader/download/espower-loader-1.2.2.tgz",
+ "integrity": "sha1-7bRsPFmga6yOpzppXIblxaC8gto=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "^1.1.0",
+ "espower-source": "^2.0.0",
+ "minimatch": "^3.0.0",
+ "source-map-support": "^0.4.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "espower-location-detector": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/espower-location-detector/download/espower-location-detector-1.0.0.tgz",
+ "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=",
+ "dev": true,
+ "requires": {
+ "is-url": "^1.2.1",
+ "path-is-absolute": "^1.0.0",
+ "source-map": "^0.5.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "espower-source": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npm.taobao.org/espower-source/download/espower-source-2.3.0.tgz",
+ "integrity": "sha1-Q+k7LBivUAGL2xvqehJx9KHBJfQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.0",
+ "acorn-es7-plugin": "^1.0.10",
+ "convert-source-map": "^1.1.1",
+ "empower-assert": "^1.0.0",
+ "escodegen": "^1.10.0",
+ "espower": "^2.1.1",
+ "estraverse": "^4.0.0",
+ "merge-estraverse-visitors": "^1.0.0",
+ "multi-stage-sourcemap": "^0.2.1",
+ "path-is-absolute": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz",
+ "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=",
+ "dev": true
+ }
+ }
+ },
+ "espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+ "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
+ },
+ "espurify": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npm.taobao.org/espurify/download/espurify-1.8.1.tgz",
+ "integrity": "sha1-V0bGwatC0wLeEL0dW/fw6MBRUFY=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0"
+ }
+ },
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.3.1.tgz?cache=0&sync_timestamp=1587061286348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesquery%2Fdownload%2Fesquery-1.3.1.tgz",
+ "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz",
+ "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz?cache=0&sync_timestamp=1598898255610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesrecurse%2Fdownload%2Fesrecurse-4.3.0.tgz",
+ "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz",
+ "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz",
+ "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
+ "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "execa": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npm.taobao.org/execa/download/execa-4.0.3.tgz?cache=0&sync_timestamp=1594145085955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-4.0.3.tgz",
+ "integrity": "sha1-CjTau61tZhAL1vLFdshmlAPzF/I=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz",
+ "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ }
+ },
+ "express-fileupload": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/express-fileupload/download/express-fileupload-1.2.0.tgz",
+ "integrity": "sha1-NWxN/WRb5xq5+y9ObYTusA0keXk=",
+ "requires": {
+ "busboy": "^0.3.1"
+ }
+ },
+ "ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz",
+ "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=",
+ "dev": true,
+ "requires": {
+ "type": "^2.0.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/type/download/type-2.1.0.tgz?cache=0&sync_timestamp=1598016585110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-2.1.0.tgz",
+ "integrity": "sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8=",
+ "dev": true
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599697571&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz",
+ "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.2.0.tgz",
+ "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.4.tgz?cache=0&sync_timestamp=1592291968616&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.4.tgz",
+ "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&sync_timestamp=1576340291001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fastq": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npm.taobao.org/fastq/download/fastq-1.8.0.tgz?cache=0&sync_timestamp=1589280329638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffastq%2Fdownload%2Ffastq-1.8.0.tgz",
+ "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npm.taobao.org/figures/download/figures-3.2.0.tgz?cache=0&sync_timestamp=1581865349068&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffigures%2Fdownload%2Ffigures-3.2.0.tgz",
+ "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
+ "file-uri-to-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-2.0.0.tgz",
+ "integrity": "sha1-e0Fa66In1XWFHgpbDGQNdlZAP7o="
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz",
+ "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz",
+ "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz",
+ "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "find-versions": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npm.taobao.org/find-versions/download/find-versions-3.2.0.tgz",
+ "integrity": "sha1-ECl/mAMKeGgpaBaQVF72We0dJU4=",
+ "dev": true,
+ "requires": {
+ "semver-regex": "^2.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npm.taobao.org/flat/download/flat-5.0.2.tgz?cache=0&sync_timestamp=1602723468701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflat%2Fdownload%2Fflat-5.0.2.tgz",
+ "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz",
+ "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.2.tgz",
+ "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=",
+ "dev": true
+ },
+ "follow-redirects": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz",
+ "integrity": "sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs="
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz",
+ "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz",
+ "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=",
+ "dev": true,
+ "optional": true
+ },
+ "ftp": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npm.taobao.org/ftp/download/ftp-0.3.10.tgz",
+ "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
+ "requires": {
+ "readable-stream": "1.1.x",
+ "xregexp": "2.0.0"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz",
+ "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=",
+ "dev": true
+ },
+ "get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz?cache=0&sync_timestamp=1575993334275&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-own-enumerable-property-symbols%2Fdownload%2Fget-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha1-tf3nfyLL4185C04ImSLFC85u9mQ=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-6.0.0.tgz",
+ "integrity": "sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz",
+ "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-uri": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npm.taobao.org/get-uri/download/get-uri-3.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-uri%2Fdownload%2Fget-uri-3.0.2.tgz",
+ "integrity": "sha1-8O8TVvqrxw4flAT6O2ayupv8clw=",
+ "requires": {
+ "@tootallnate/once": "1",
+ "data-uri-to-buffer": "3",
+ "debug": "4",
+ "file-uri-to-path": "2",
+ "fs-extra": "^8.1.0",
+ "ftp": "^0.3.10"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz",
+ "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz",
+ "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "globby": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npm.taobao.org/globby/download/globby-11.0.1.tgz?cache=0&sync_timestamp=1591083783605&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-11.0.1.tgz",
+ "integrity": "sha1-mivxB6Bo8//qvEmtcCx57ejP01c=",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz",
+ "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs="
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npm.taobao.org/growl/download/growl-1.10.5.tgz",
+ "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+ "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz",
+ "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
+ "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz?cache=0&sync_timestamp=1601761730691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-4.1.0.tgz",
+ "integrity": "sha1-mk7xYfLkYl6/ffvmwKL1LRilnng=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.0.0",
+ "domutils": "^2.0.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407858306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz",
+ "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/http-proxy-agent/download/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=",
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-5.0.0.tgz?cache=0&sync_timestamp=1581106803611&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttps-proxy-agent%2Fdownload%2Fhttps-proxy-agent-5.0.0.tgz",
+ "integrity": "sha1-4qkFQqu2inYuCghQ9sntrf2FBrI=",
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1584198662293&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz",
+ "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=",
+ "dev": true
+ },
+ "husky": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npm.taobao.org/husky/download/husky-4.2.5.tgz?cache=0&sync_timestamp=1602813564105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhusky%2Fdownload%2Fhusky-4.2.5.tgz",
+ "integrity": "sha1-K092Imc6cVefkB2Yhe1Eg5S1+jY=",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "ci-info": "^2.0.0",
+ "compare-versions": "^3.6.0",
+ "cosmiconfig": "^6.0.0",
+ "find-versions": "^3.2.0",
+ "opencollective-postinstall": "^2.0.2",
+ "pkg-dir": "^4.2.0",
+ "please-upgrade-node": "^3.2.0",
+ "slash": "^3.0.0",
+ "which-pm-runs": "^1.0.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184264130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
+ "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.8.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-5.1.8.tgz",
+ "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz",
+ "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz",
+ "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "intelli-espower-loader": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/intelli-espower-loader/download/intelli-espower-loader-1.0.1.tgz",
+ "integrity": "sha1-LHsDFGvB1GvyENCgOXxckatMorA=",
+ "dev": true,
+ "requires": {
+ "espower-loader": "^1.0.0"
+ }
+ },
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM="
+ },
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz",
+ "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz",
+ "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.2.2.tgz?cache=0&sync_timestamp=1600719276620&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-callable%2Fdownload%2Fis-callable-1.2.2.tgz",
+ "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=",
+ "dev": true
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&sync_timestamp=1576729165697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz",
+ "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+ "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz",
+ "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=",
+ "dev": true
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-2.1.0.tgz?cache=0&sync_timestamp=1602541451286&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-2.1.0.tgz",
+ "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.1.1.tgz?cache=0&sync_timestamp=1596555762356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.1.1.tgz",
+ "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz",
+ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz",
+ "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz",
+ "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npm.taobao.org/is-url/download/is-url-1.2.4.tgz",
+ "integrity": "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1586796260005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz",
+ "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.0.tgz",
+ "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz?cache=0&sync_timestamp=1599064788298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-parse-even-better-errors%2Fdownload%2Fjson-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599333856086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz",
+ "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "lint-staged": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npm.taobao.org/lint-staged/download/lint-staged-10.4.0.tgz?cache=0&sync_timestamp=1602914408937&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flint-staged%2Fdownload%2Flint-staged-10.4.0.tgz",
+ "integrity": "sha1-0YYo9zcyjgu7+H0YP0Agkw6amE4=",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "cli-truncate": "^2.1.0",
+ "commander": "^6.0.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.1.1",
+ "dedent": "^0.7.0",
+ "enquirer": "^2.3.6",
+ "execa": "^4.0.3",
+ "listr2": "^2.6.0",
+ "log-symbols": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "normalize-path": "^3.0.0",
+ "please-upgrade-node": "^3.2.0",
+ "string-argv": "0.3.1",
+ "stringify-object": "^3.3.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-7.0.0.tgz?cache=0&sync_timestamp=1596310819353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-7.0.0.tgz",
+ "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM=",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ }
+ }
+ },
+ "listr2": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npm.taobao.org/listr2/download/listr2-2.6.2.tgz",
+ "integrity": "sha1-SRLrAeHi3XLsN/OJWla/JiLW82o=",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "cli-truncate": "^2.1.0",
+ "figures": "^3.2.0",
+ "indent-string": "^4.0.0",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rxjs": "^6.6.2",
+ "through": "^2.3.8"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
+ "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597335994883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
+ "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-4.0.0.tgz?cache=0&sync_timestamp=1587898912367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-symbols%2Fdownload%2Flog-symbols-4.0.0.tgz",
+ "integrity": "sha1-abPMRtIPRI7M23XqH6cz2eghySA=",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0"
+ }
+ },
+ "log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/log-update/download/log-update-4.0.0.tgz?cache=0&sync_timestamp=1582186170811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-update%2Fdownload%2Flog-update-4.0.0.tgz",
+ "integrity": "sha1-WJ7NNSRx8qHAxXAodUOmTf0g4KE=",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz",
+ "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-4.0.0.tgz",
+ "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ }
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "merge-estraverse-visitors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/merge-estraverse-visitors/download/merge-estraverse-visitors-1.0.0.tgz",
+ "integrity": "sha1-65aDOLXe1c7tgs7AMH3sui2OqZQ=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz",
+ "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz?cache=0&sync_timestamp=1591170027156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge2%2Fdownload%2Fmerge2-1.4.1.tgz",
+ "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz",
+ "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1590596706367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz",
+ "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831210195&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz",
+ "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I="
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz",
+ "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=",
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz",
+ "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz",
+ "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz",
+ "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "mocha": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npm.taobao.org/mocha/download/mocha-8.2.0.tgz?cache=0&sync_timestamp=1602881142408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmocha%2Fdownload%2Fmocha-8.2.0.tgz",
+ "integrity": "sha1-+Kp5EQtLWmWAxl1N2Ag8QlKCYk4=",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.4.3",
+ "debug": "4.2.0",
+ "diff": "4.0.2",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.6",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.14.0",
+ "log-symbols": "4.0.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.2",
+ "nanoid": "3.1.12",
+ "serialize-javascript": "5.0.1",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "7.2.0",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.0.2",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
+ "dev": true
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-5.0.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-5.0.0.tgz",
+ "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz",
+ "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-6.0.0.tgz",
+ "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-3.0.2.tgz?cache=0&sync_timestamp=1594559734248&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-3.0.2.tgz",
+ "integrity": "sha1-FmTgEK88rcaBuq/T4qQ3vnsPtf4=",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-5.0.0.tgz",
+ "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
+ "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "multi-stage-sourcemap": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npm.taobao.org/multi-stage-sourcemap/download/multi-stage-sourcemap-0.2.1.tgz",
+ "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU=",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.1.34"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.1.43",
+ "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.1.43.tgz",
+ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+ "dev": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.1.12",
+ "resolved": "https://registry.npm.taobao.org/nanoid/download/nanoid-3.1.12.tgz?cache=0&sync_timestamp=1603419433040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnanoid%2Fdownload%2Fnanoid-3.1.12.tgz",
+ "integrity": "sha1-b3c2xi6NOUIWAeSgx3YjqX6mllQ=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
+ "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
+ },
+ "netmask": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npm.taobao.org/netmask/download/netmask-1.0.6.tgz",
+ "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU="
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+ "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz",
+ "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.8.0.tgz?cache=0&sync_timestamp=1592545231350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.8.0.tgz",
+ "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.3.tgz?cache=0&sync_timestamp=1601502788762&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.3.tgz",
+ "integrity": "sha1-LjueZVYBN0Ve471irsTZCi6hzIE=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz",
+ "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.1.tgz?cache=0&sync_timestamp=1599844927493&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.1.tgz",
+ "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.0",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1597005345612&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz",
+ "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "opencollective-postinstall": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopencollective-postinstall%2Fdownload%2Fopencollective-postinstall-2.0.3.tgz",
+ "integrity": "sha1-eg//l49tv6TQBiOPusmO1BmMMlk=",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz",
+ "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=",
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559734248&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz",
+ "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz",
+ "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-4.0.0.tgz",
+ "integrity": "sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs=",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz",
+ "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=",
+ "dev": true
+ },
+ "pac-proxy-agent": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/pac-proxy-agent/download/pac-proxy-agent-4.1.0.tgz",
+ "integrity": "sha1-Zog+6rrckV/F6VRXMkyw8Kx43vs=",
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4",
+ "get-uri": "3",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "5",
+ "pac-resolver": "^4.1.0",
+ "raw-body": "^2.2.0",
+ "socks-proxy-agent": "5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "pac-resolver": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/pac-resolver/download/pac-resolver-4.1.0.tgz?cache=0&sync_timestamp=1581134452130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpac-resolver%2Fdownload%2Fpac-resolver-4.1.0.tgz",
+ "integrity": "sha1-SxLn0JayVaO4TlP2gx8y6cfl/pU=",
+ "requires": {
+ "degenerator": "^2.2.0",
+ "ip": "^1.1.5",
+ "netmask": "^1.0.6"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz",
+ "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.1.0.tgz?cache=0&sync_timestamp=1598129182781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.1.0.tgz",
+ "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY=",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
+ "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz",
+ "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz",
+ "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz",
+ "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz?cache=0&sync_timestamp=1584790434095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpicomatch%2Fdownload%2Fpicomatch-2.2.2.tgz",
+ "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz",
+ "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "please-upgrade-node": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npm.taobao.org/please-upgrade-node/download/please-upgrade-node-3.2.0.tgz",
+ "integrity": "sha1-rt3T+ZTJM+StmLmdmlVu+g4v6UI=",
+ "dev": true,
+ "requires": {
+ "semver-compare": "^1.0.0"
+ }
+ },
+ "power-assert": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npm.taobao.org/power-assert/download/power-assert-1.6.1.tgz",
+ "integrity": "sha1-soy8Aq6Aiv0UMdDNUJOjmsWlsf4=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "empower": "^1.3.1",
+ "power-assert-formatter": "^1.4.1",
+ "universal-deep-strict-equal": "^1.2.1",
+ "xtend": "^4.0.0"
+ }
+ },
+ "power-assert-context-formatter": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-context-formatter/download/power-assert-context-formatter-1.2.0.tgz",
+ "integrity": "sha1-j75yaSKI7FpyA83yFci4OKYGHSo=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "power-assert-context-traversal": "^1.2.0"
+ }
+ },
+ "power-assert-context-reducer-ast": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-context-reducer-ast/download/power-assert-context-reducer-ast-1.2.0.tgz",
+ "integrity": "sha1-x8ocnjmm+3F/esX+nnbhkr9SXfM=",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.0",
+ "acorn-es7-plugin": "^1.0.12",
+ "core-js": "^2.0.0",
+ "espurify": "^1.6.0",
+ "estraverse": "^4.2.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz",
+ "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=",
+ "dev": true
+ }
+ }
+ },
+ "power-assert-context-traversal": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-context-traversal/download/power-assert-context-traversal-1.2.0.tgz",
+ "integrity": "sha1-9ucUVLr2QN5cHJwnA0n1yasLLpQ=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "estraverse": "^4.1.0"
+ }
+ },
+ "power-assert-formatter": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npm.taobao.org/power-assert-formatter/download/power-assert-formatter-1.4.1.tgz",
+ "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "power-assert-context-formatter": "^1.0.7",
+ "power-assert-context-reducer-ast": "^1.0.7",
+ "power-assert-renderer-assertion": "^1.0.7",
+ "power-assert-renderer-comparison": "^1.0.7",
+ "power-assert-renderer-diagram": "^1.0.7",
+ "power-assert-renderer-file": "^1.0.7"
+ }
+ },
+ "power-assert-renderer-assertion": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-renderer-assertion/download/power-assert-renderer-assertion-1.2.0.tgz",
+ "integrity": "sha1-Pbb/zaEGs3vB4GQyrQ10imgrFHo=",
+ "dev": true,
+ "requires": {
+ "power-assert-renderer-base": "^1.1.1",
+ "power-assert-util-string-width": "^1.2.0"
+ }
+ },
+ "power-assert-renderer-base": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/power-assert-renderer-base/download/power-assert-renderer-base-1.1.1.tgz",
+ "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=",
+ "dev": true
+ },
+ "power-assert-renderer-comparison": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-renderer-comparison/download/power-assert-renderer-comparison-1.2.0.tgz",
+ "integrity": "sha1-5PiBEyJaab6KpYbq0FrvmUYsBJU=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "diff-match-patch": "^1.0.0",
+ "power-assert-renderer-base": "^1.1.1",
+ "stringifier": "^1.3.0",
+ "type-name": "^2.0.1"
+ }
+ },
+ "power-assert-renderer-diagram": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-renderer-diagram/download/power-assert-renderer-diagram-1.2.0.tgz",
+ "integrity": "sha1-N/ZuhULlZ3xbWObXKwHA2aMOIhk=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "power-assert-renderer-base": "^1.1.1",
+ "power-assert-util-string-width": "^1.2.0",
+ "stringifier": "^1.3.0"
+ }
+ },
+ "power-assert-renderer-file": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-renderer-file/download/power-assert-renderer-file-1.2.0.tgz",
+ "integrity": "sha1-P0vr2eFFXXXPKsVB57tRWofUzks=",
+ "dev": true,
+ "requires": {
+ "power-assert-renderer-base": "^1.1.1"
+ }
+ },
+ "power-assert-util-string-width": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/power-assert-util-string-width/download/power-assert-util-string-width-1.2.0.tgz",
+ "integrity": "sha1-bgbV41gbuHbF03fFMQn/+pW9kaA=",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prettier": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-2.1.2.tgz?cache=0&sync_timestamp=1600215482255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-2.1.2.tgz",
+ "integrity": "sha1-MFBwDa4uTItnxMP2Zs24r0BeHOU=",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz",
+ "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=",
+ "dev": true
+ },
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz",
+ "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
+ "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+ "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz",
+ "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw="
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz",
+ "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz",
+ "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz",
+ "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz?cache=0&sync_timestamp=1581624324274&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz?cache=0&sync_timestamp=1602584331621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.5.0.tgz",
+ "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz?cache=0&sync_timestamp=1576388141321&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.7.tgz?cache=0&sync_timestamp=1601502719982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.7.tgz",
+ "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ }
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-3.1.0.tgz",
+ "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz",
+ "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+ "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz",
+ "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz",
+ "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz",
+ "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-parallel": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.9.tgz",
+ "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=",
+ "dev": true
+ },
+ "rxjs": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1602770834162&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz",
+ "integrity": "sha1-jKhGNcTaqQDA05Z6buesYCce5VI=",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz",
+ "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=",
+ "dev": true
+ }
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+ "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+ "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.2.tgz",
+ "integrity": "sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg=",
+ "dev": true
+ },
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/semver-compare/download/semver-compare-1.0.0.tgz",
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+ "dev": true
+ },
+ "semver-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/semver-regex/download/semver-regex-2.0.0.tgz",
+ "integrity": "sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg=",
+ "dev": true
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz",
+ "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz",
+ "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-5.0.1.tgz?cache=0&sync_timestamp=1599740650381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-5.0.1.tgz",
+ "integrity": "sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ=",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz",
+ "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz",
+ "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz",
+ "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz",
+ "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz",
+ "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz",
+ "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz",
+ "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
+ "smart-buffer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/smart-buffer/download/smart-buffer-4.1.0.tgz",
+ "integrity": "sha1-kWBcJdkWUvRmHqacz0XxszHKIbo="
+ },
+ "socks": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npm.taobao.org/socks/download/socks-2.4.4.tgz?cache=0&sync_timestamp=1599605506578&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocks%2Fdownload%2Fsocks-2.4.4.tgz",
+ "integrity": "sha1-8aM4LngUrijJe7gqOLwawkshzKI=",
+ "requires": {
+ "ip": "^1.1.5",
+ "smart-buffer": "^4.1.0"
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npm.taobao.org/socks-proxy-agent/download/socks-proxy-agent-5.0.0.tgz?cache=0&sync_timestamp=1580845554635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocks-proxy-agent%2Fdownload%2Fsocks-proxy-agent-5.0.0.tgz",
+ "integrity": "sha1-fA82Tnsc9KekN+cSU77XLpAEvmA=",
+ "requires": {
+ "agent-base": "6",
+ "debug": "4",
+ "socks": "^2.3.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz",
+ "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk="
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
+ "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+ "optional": true
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz?cache=0&sync_timestamp=1587719289626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.4.18.tgz",
+ "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.6"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1587327902535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
+ },
+ "string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npm.taobao.org/string-argv/download/string-argv-0.3.1.tgz",
+ "integrity": "sha1-leL77AQnrhkYSTX4FtdKqkxcGdo=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz",
+ "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz",
+ "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz",
+ "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.2.tgz?cache=0&sync_timestamp=1603219618123&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimend%2Fdownload%2Fstring.prototype.trimend-1.0.2.tgz",
+ "integrity": "sha1-bd2ah5a8cUtImjriIkaiCPN7+kY=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.2.tgz?cache=0&sync_timestamp=1603219618047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.2.tgz",
+ "integrity": "sha1-ItRdqBAVMJzQzdeXh+iRn8XGE+c=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "stringifier": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npm.taobao.org/stringifier/download/stringifier-1.4.0.tgz",
+ "integrity": "sha1-1wRYFWf0UmJl0A7Y7LNUoCw/7Cg=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.0.0",
+ "traverse": "^0.6.6",
+ "type-name": "^2.0.1"
+ }
+ },
+ "stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npm.taobao.org/stringify-object/download/stringify-object-3.3.0.tgz",
+ "integrity": "sha1-cDBlrvyhkwDTzoivT1s5VtdVZik=",
+ "dev": true,
+ "requires": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz",
+ "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/strip-comments/download/strip-comments-2.0.1.tgz",
+ "integrity": "sha1-StEcP7ysF3pnpArCJMoznKHBups="
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz?cache=0&sync_timestamp=1594567532500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.1.1.tgz",
+ "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1598611709087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
+ "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz",
+ "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz",
+ "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz",
+ "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
+ },
+ "traverse": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz",
+ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
+ "dev": true
+ },
+ "tslib": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-2.0.3.tgz",
+ "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw="
+ },
+ "tsutils": {
+ "version": "3.17.1",
+ "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-3.17.1.tgz",
+ "integrity": "sha1-7XGZF/EcoN7lhicrKsSeAVot11k=",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz",
+ "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=",
+ "dev": true
+ }
+ }
+ },
+ "tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npm.taobao.org/tunnel/download/tunnel-0.0.6.tgz",
+ "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw="
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz?cache=0&sync_timestamp=1598016585110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-1.2.0.tgz",
+ "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz",
+ "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "type-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/type-name/download/type-name-2.0.2.tgz",
+ "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=",
+ "dev": true
+ },
+ "typescript": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npm.taobao.org/typescript/download/typescript-4.0.3.tgz?cache=0&sync_timestamp=1603608626888&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-4.0.3.tgz",
+ "integrity": "sha1-FTu9Ro7wdyXB35x36LRT+NNqu6U=",
+ "dev": true
+ },
+ "universal-deep-strict-equal": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npm.taobao.org/universal-deep-strict-equal/download/universal-deep-strict-equal-1.2.2.tgz",
+ "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=",
+ "dev": true,
+ "requires": {
+ "array-filter": "^1.0.0",
+ "indexof": "0.0.1",
+ "object-keys": "^1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz",
+ "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "uri-js": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.0.tgz?cache=0&sync_timestamp=1598814377097&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.0.tgz",
+ "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "v8-compile-cache": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz",
+ "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz",
+ "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "which-pm-runs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npm.taobao.org/which-pm-runs/download/which-pm-runs-1.0.0.tgz",
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz",
+ "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
+ "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
+ "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w="
+ },
+ "workerpool": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npm.taobao.org/workerpool/download/workerpool-6.0.2.tgz",
+ "integrity": "sha1-4kG0PY0DPxvrUseFEGlFYDnR1Dg=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839122515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1603212180491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz",
+ "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz",
+ "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz",
+ "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/xregexp/download/xregexp-2.0.0.tgz?cache=0&sync_timestamp=1581429204252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxregexp%2Fdownload%2Fxregexp-2.0.0.tgz",
+ "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",
+ "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz",
+ "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npm.taobao.org/yaml/download/yaml-1.10.0.tgz",
+ "integrity": "sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1602805561021&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz",
+ "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz",
+ "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz",
+ "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz",
+ "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1602861397132&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz",
+ "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/yargs-unparser/download/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.1.0.tgz?cache=0&sync_timestamp=1602350083472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.1.0.tgz",
+ "integrity": "sha1-J9wXYXNyX7Ct+KSLZH9NeHGUTXg=",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-4.0.0.tgz",
+ "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/netease_api/package.json b/netease_api/package.json
new file mode 100644
index 0000000..7dba2ab
--- /dev/null
+++ b/netease_api/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "NeteaseCloudMusicApi",
+ "version": "3.45.2",
+ "description": "网易云音乐 NodeJS 版 API",
+ "scripts": {
+ "start": "node app.js",
+ "test": "mocha -r intelli-espower-loader -t 20000 app.test.js --exit",
+ "lint": "eslint **/*.{js,ts}",
+ "lint-fix": "eslint --fix **/*.{js,ts}"
+ },
+ "keywords": [
+ "网易云音乐",
+ "网易云",
+ "音乐",
+ "网易云音乐nodejs"
+ ],
+ "main": "main.js",
+ "types": "./interface.d.ts",
+ "engines": {
+ "node": ">=12"
+ },
+ "author": "binaryify",
+ "license": "MIT",
+ "files": [
+ "module",
+ "util",
+ "plugins",
+ "main.d.ts",
+ "interface.d.ts",
+ "module_types"
+ ],
+ "dependencies": {
+ "axios": "^0.20.0",
+ "express": "^4.17.1",
+ "express-fileupload": "^1.1.9",
+ "pac-proxy-agent": "^4.0.0",
+ "strip-comments": "^2.0.1",
+ "tunnel": "^0.0.6"
+ },
+ "devDependencies": {
+ "@types/node": "14.11.10",
+ "@typescript-eslint/eslint-plugin": "4.4.1",
+ "@typescript-eslint/parser": "4.4.1",
+ "eslint": "7.12.0",
+ "eslint-config-prettier": "6.13.0",
+ "eslint-plugin-html": "6.0.3",
+ "eslint-plugin-prettier": "3.1.4",
+ "intelli-espower-loader": "1.0.1",
+ "mocha": "8.2.0",
+ "power-assert": "1.6.1",
+ "prettier": "2.1.2",
+ "typescript": "4.0.3"
+ }
+}
diff --git a/netease_api/plugins/upload.js b/netease_api/plugins/upload.js
new file mode 100644
index 0000000..f572759
--- /dev/null
+++ b/netease_api/plugins/upload.js
@@ -0,0 +1,48 @@
+const axios = require('axios');
+module.exports = async (query, request) => {
+ const data = {
+ bucket: 'yyimgs',
+ ext: 'jpg',
+ filename: query.imgFile.name,
+ local: false,
+ nos_product: 0,
+ return_body: `{"code":200,"size":"$(ObjectSize)"}`,
+ type: 'other',
+ };
+ // 获取key和token
+ const res = await request(
+ 'POST',
+ `https://music.163.com/weapi/nos/token/alloc`,
+ data,
+ { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy },
+ );
+ // 上传图片
+ 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',
+ },
+ data: query.imgFile.data,
+ });
+ // 获取裁剪后图片的id
+ const imgSize = query.imgSize || 300;
+ const imgX = query.imgX || 0;
+ const imgY = query.imgY || 0;
+ const res3 = await request(
+ 'POST',
+ `https://music.163.com/upload/img/op?id=${res.body.result.docId}&op=${imgX}y${imgY}y${imgSize}y${imgSize}`,
+ {},
+ { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy },
+ );
+
+ return {
+ // ...res.body.result,
+ // ...res2.data,
+ // ...res3.body,
+ url_pre: 'https://p1.music.126.net/' + res.body.result.objectKey,
+ url: res3.body.url,
+ imgId: res3.body.id,
+ };
+};
diff --git a/netease_api/public/avatar_update.html b/netease_api/public/avatar_update.html
new file mode 100644
index 0000000..41dd8e9
--- /dev/null
+++ b/netease_api/public/avatar_update.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+ 更新头像
+
+
+
+
+
+
+
+
+
diff --git a/netease_api/public/index.html b/netease_api/public/index.html
new file mode 100644
index 0000000..21c33b6
--- /dev/null
+++ b/netease_api/public/index.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+ 网易云音乐 API
+
+
+
+ 网易云音乐 API
+ 当你看到这个页面时,这个服务已经成功跑起来了~
+ 查看文档
+
例子:
+
+
+
+
diff --git a/netease_api/public/playlist_cover_update.html b/netease_api/public/playlist_cover_update.html
new file mode 100644
index 0000000..d09be2c
--- /dev/null
+++ b/netease_api/public/playlist_cover_update.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+
歌单封面上传
+
+
+
+
+
![]()
+
+
+
+
diff --git a/netease_api/public/test.html b/netease_api/public/test.html
new file mode 100644
index 0000000..64da33f
--- /dev/null
+++ b/netease_api/public/test.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
test
+
+
+
+
请在控制台看结果
+
+
+
+
+
diff --git a/netease_api/renovate.json b/netease_api/renovate.json
new file mode 100644
index 0000000..4f39080
--- /dev/null
+++ b/netease_api/renovate.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["config:base"]
+}
diff --git a/netease_api/routes/index.js b/netease_api/routes/index.js
new file mode 100644
index 0000000..4014cd0
--- /dev/null
+++ b/netease_api/routes/index.js
@@ -0,0 +1,8811 @@
+const { cookieToJson } = require('../util/index');
+const crypto = require('crypto');
+const request = require('../util/request');
+module.exports = {
+ '/yunbei/today': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_today = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/point/today/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_today(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/tasks/todo': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_tasks_todo = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/todo/query`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_tasks_todo(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/tasks': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_tasks = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/list/all`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_tasks(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/task/finish': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_task_finish = (query, request) => {
+ const data = {
+ userTaskId: query.userTaskId,
+ depositCode: query.depositCode || '0',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/usertool/task/point/receive`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_task_finish(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/sign': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_sign = (query, request) => {
+ const data = { type: '0' };
+ return request(
+ 'POST',
+ `https://music.163.com/api/point/dailyTask`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_sign(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/receipt': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_receipt = (query, request) => {
+ const data = { limit: query.limit || 10, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/store/api/point/receipt`,
+ data,
+ {
+ crypto: 'api',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_receipt(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/info': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_info = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/v1/user/info`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ yunbei_info(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei/expense': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei_expense = (query, request) => {
+ const data = { limit: query.limit || 10, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/store/api/point/expense`,
+ data,
+ {
+ crypto: 'api',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei_expense(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/yunbei': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const yunbei = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/point/signed/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ yunbei(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/weblog': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const weblog = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/feedback/weblog`,
+ query.data || {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ weblog(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/url': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_url = (query, request) => {
+ const data = {
+ ids: '["' + query.id + '"]',
+ resolution: query.res || 1080,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/playurl`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_url(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/timeline/recommend': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_timeline_recommend = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ filterLives: '[]',
+ withProgramInfo: 'true',
+ needUrl: '1',
+ resolution: '480',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/videotimeline/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_timeline_recommend(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/timeline/all': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_timeline_all = (query, request) => {
+ const data = {
+ groupId: 0,
+ offset: query.offset || 0,
+ need_preview_url: 'true',
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/videotimeline/otherclient/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_timeline_all(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/sub': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_sub = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/video/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_sub(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/group/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_group_list = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/cloudvideo/group/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_group_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/group': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_group = (query, request) => {
+ const data = {
+ groupId: query.id,
+ offset: query.offset || 0,
+ need_preview_url: 'true',
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/videotimeline/videogroup/otherclient/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_group(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/detail/info': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_detail_info = (query, request) => {
+ const data = { threadid: `R_VI_62_${query.vid}`, composeliked: true };
+ return request(
+ 'POST',
+ `https://music.163.com/api/comment/commentthread/info`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_detail_info(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_detail = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/v1/video/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/video/category/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const video_category_list = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ total: 'true',
+ limit: query.limit || 99,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/cloudvideo/category/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ video_category_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_update = (query, request) => {
+ const data = {
+ avatarImgId: '0',
+ birthday: query.birthday,
+ city: query.city,
+ gender: query.gender,
+ nickname: query.nickname,
+ province: query.province,
+ signature: query.signature,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/user/profile/update`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/subcount': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_subcount = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/subcount`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_subcount(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/replacephone': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_replacephone = (query, request) => {
+ const data = {
+ phone: query.phone,
+ captcha: query.captcha,
+ oldcaptcha: query.oldcaptcha,
+ countrycode: query.countrycode || '86',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/user/replaceCellphone`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_replacephone(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/record': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_record = (query, request) => {
+ const data = { uid: query.uid, type: query.type || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/play/record`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_record(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_playlist = (query, request) => {
+ const data = {
+ uid: query.uid,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ includeVideo: true,
+ };
+ return request('POST', `https://music.163.com/api/user/playlist`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ user_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/level': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_level = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/weapi/user/level`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ user_level(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/follows': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_follows = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ limit: query.limit || 30,
+ order: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/user/getfollows/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_follows(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/followeds': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_followeds = (query, request) => {
+ const data = {
+ userId: query.uid,
+ time: query.lasttime || -1,
+ limit: query.limit || 30,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/eapi/user/getfolloweds/${query.uid}`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/user/getfolloweds',
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_followeds(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/event': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_event = (query, request) => {
+ const data = {
+ getcounts: true,
+ time: query.lasttime || -1,
+ limit: query.limit || 30,
+ total: false,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/event/get/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_event(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/dj': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_dj = (query, request) => {
+ const data = { limit: query.limit || 30, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/dj/program/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_dj(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_detail = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/user/detail/${query.uid}`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/cloud/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_cloud_detail = (query, request) => {
+ const id = query.id.replace(/\s/g, '').split(',');
+ const data = { songIds: id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/cloud/get/byids`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_cloud_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/cloud/del': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_cloud_del = (query, request) => {
+ const data = { songIds: [query.id] };
+ return request('POST', `https://music.163.com/weapi/cloud/del`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ user_cloud_del(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/cloud': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_cloud = (query, request) => {
+ const data = { limit: query.limit || 30, offset: query.offset || 0 };
+ return request('POST', `https://music.163.com/weapi/v1/cloud/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ user_cloud(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/binding': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_binding = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/v1/user/bindings/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_binding(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/audio': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_audio = (query, request) => {
+ const data = { userId: query.uid };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/get/byuser`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_audio(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/user/account': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const user_account = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/nuser/account/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ user_account(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/toplist/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const toplist_detail = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/toplist/detail`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ toplist_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/toplist/artist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const toplist_artist = (query, request) => {
+ const data = {
+ type: query.type || 1,
+ limit: 100,
+ offset: 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/toplist/artist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ toplist_artist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/toplist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const toplist = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/api/toplist`,
+ {},
+ {
+ crypto: 'linuxapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ toplist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/song': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_song = (query, request) => {
+ const data = { areaId: query.type || 0, total: true };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/discovery/new/songs`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ top_song(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/playlist/highquality': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_playlist_highquality = (query, request) => {
+ const data = {
+ cat: query.cat || '全部',
+ limit: query.limit || 50,
+ lasttime: query.before || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/highquality/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ top_playlist_highquality(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_playlist = (query, request) => {
+ const data = {
+ cat: query.cat || '全部',
+ order: query.order || 'hot',
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ top_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/mv': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_mv = (query, request) => {
+ const data = {
+ area: query.area || '',
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/mv/toplist`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ top_mv(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_list = (query, request) => {
+ query.cookie.os = 'pc';
+ if (query.idx) {
+ return Promise.resolve({
+ status: 500,
+ body: { code: 500, msg: '不支持此方式调用,只支持id调用' },
+ });
+ }
+ const data = { id: query.id, n: '500', s: '0' };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/api/playlist/v4/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ top_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/artists': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_artists = (query, request) => {
+ const data = {
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/artist/top`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ top_artists(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/top/album': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const top_album = (query, request) => {
+ const date = new Date();
+ const data = {
+ area: query.area || 'ALL',
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ type: query.type || 'new',
+ year: query.year || date.getFullYear(),
+ month: query.month || date.getMonth() + 1,
+ total: false,
+ rcmd: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/discovery/new/albums/area`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ top_album(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/song/url': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const song_url = (query, request) => {
+ if (!('MUSIC_U' in query.cookie))
+ query.cookie._ntes_nuid = crypto.randomBytes(16).toString('hex');
+ query.cookie.os = 'pc';
+ const data = {
+ ids: '[' + query.id + ']',
+ br: parseInt(query.br || 999000),
+ };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/song/enhance/player/url`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ url: '/api/song/enhance/player/url',
+ },
+ );
+ };
+ song_url(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/song/order/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const song_order_update = (query, request) => {
+ const data = { pid: query.pid, trackIds: query.ids, op: 'update' };
+ return request(
+ 'POST',
+ `http://interface.music.163.com/api/playlist/manipulate/tracks`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/playlist/desc/update',
+ realIP: query.realIP,
+ },
+ );
+ };
+ song_order_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/song/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const song_detail = (query, request) => {
+ query.ids = query.ids.split(/\s*,\s*/);
+ const data = {
+ c: '[' + query.ids.map((id) => '{"id":' + id + '}').join(',') + ']',
+ ids: '[' + query.ids.join(',') + ']',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v3/song/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ song_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/simi/user': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const simi_user = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiUser`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ simi_user(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/simi/song': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const simi_song = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/discovery/simiSong`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ simi_song(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/simi/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const simi_playlist = (query, request) => {
+ const data = {
+ songid: query.id,
+ limit: query.limit || 50,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiPlaylist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ simi_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/simi/mv': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const simi_mv = (query, request) => {
+ const data = { mvid: query.mvid };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiMV`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ simi_mv(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/simi/artist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const simi_artist = (query, request) => {
+ const data = { artistid: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/discovery/simiArtist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ simi_artist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/share/resource': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const share_resource = (query, request) => {
+ const data = {
+ type: query.type || 'song',
+ msg: query.msg || '',
+ id: query.id || '',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/share/friends/resource`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ share_resource(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/setting': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const setting = (query, request) => {
+ const data = {};
+ return request('POST', `https://music.163.com/api/user/setting`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ setting(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/send/text': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const send_text = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ type: 'text',
+ msg: query.msg,
+ userIds: '[' + query.user_ids + ']',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/msg/private/send`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ send_text(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/send/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const send_playlist = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ id: query.playlist,
+ type: 'playlist',
+ msg: query.msg,
+ userIds: '[' + query.user_ids + ']',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/msg/private/send`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ send_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search/suggest': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search_suggest = (query, request) => {
+ const data = { s: query.keywords || '' };
+ let type = query.type == 'mobile' ? 'keyword' : 'web';
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/search/suggest/` + type,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ search_suggest(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search/multimatch': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search_multimatch = (query, request) => {
+ const data = { type: query.type || 1, s: query.keywords || '' };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/search/suggest/multimatch`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ search_multimatch(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search/hot/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search_hot_detail = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/hotsearchlist/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ search_hot_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search/hot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search_hot = (query, request) => {
+ const data = { type: 1111 };
+ return request('POST', `https://music.163.com/weapi/search/hot`, data, {
+ crypto: 'weapi',
+ ua: 'mobile',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ search_hot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search/default': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search_default = (query, request) => {
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/search/defaultkeyword/get`,
+ {},
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/search/defaultkeyword/get',
+ realIP: query.realIP,
+ },
+ );
+ };
+ search_default(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/search': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const search = (query, request) => {
+ const data = {
+ s: query.keywords,
+ type: query.type || 1,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request('POST', `https://music.163.com/weapi/search/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ search(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/scrobble': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const scrobble = (query, request) => {
+ const data = {
+ logs: JSON.stringify([
+ {
+ action: 'play',
+ json: {
+ download: 0,
+ end: 'playend',
+ id: query.id,
+ sourceId: query.sourceid,
+ time: query.time,
+ type: 'song',
+ wifi: 0,
+ },
+ },
+ ]),
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/feedback/weblog`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ scrobble(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/resource/like': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const resource_like = (query, request) => {
+ query.cookie.os = 'pc';
+ query.t = query.t == 1 ? 'like' : 'unlike';
+ query.type = { 1: 'R_MV_5_', 4: 'A_DJ_1_', 5: 'R_VI_62_', 6: 'A_EV_2_' }[
+ query.type
+ ];
+ const data = { threadId: query.type + query.id };
+ if (query.type === 'A_EV_2_') {
+ data.threadId = query.threadId;
+ }
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/resource/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ resource_like(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/related/allvideo': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const related_allvideo = (query, request) => {
+ const data = { id: query.id, type: /^\\d+$/.test(query.id) ? 0 : 1 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/v1/allvideo/rcmd`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ related_allvideo(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/register/cellphone': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const register_cellphone = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ captcha: query.captcha,
+ phone: query.phone,
+ password: crypto.createHash('md5').update(query.password).digest('hex'),
+ nickname: query.nickname,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/register/cellphone`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ register_cellphone(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/recommend/songs': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const recommend_songs = (query, request) => {
+ query.cookie.os = 'ios';
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/v3/discovery/recommend/songs`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ recommend_songs(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/recommend/resource': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const recommend_resource = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/discovery/recommend/resource`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ recommend_resource(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/rebind': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const rebind = (query, request) => {
+ const data = {
+ captcha: query.captcha,
+ phone: query.phone,
+ oldcaptcha: query.oldcaptcha,
+ ctcode: query.ctcode || '86',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/user/replaceCellphone`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ rebind(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/program/recommend': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const program_recommend = (query, request) => {
+ const data = {
+ cateId: query.type,
+ limit: query.limit || 10,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/program/recommend/v1`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ program_recommend(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playmode/intelligence/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playmode_intelligence_list = (query, request) => {
+ const data = {
+ songId: query.id,
+ type: 'fromPlayOne',
+ playlistId: query.pid,
+ startMusicId: query.sid || query.id,
+ count: query.count || 1,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playmode/intelligence/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playmode_intelligence_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/video/recent': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_video_recent = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/video/recent`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_video_recent(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_update = (query, request) => {
+ query.cookie.os = 'pc';
+ query.desc = query.desc || '';
+ query.tags = query.tags || '';
+ const data = {
+ '/api/playlist/desc/update': `{\"id\":${query.id},\"desc\":\"${query.desc}\"}`,
+ '/api/playlist/tags/update': `{\"id\":${query.id},\"tags\":\"${query.tags}\"}`,
+ '/api/playlist/update/name': `{\"id\":${query.id},\"name\":\"${query.name}\"}`,
+ };
+ return request('POST', `https://music.163.com/weapi/batch`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ playlist_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/tracks': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_tracks = async (query, request) => {
+ query.cookie.os = 'pc';
+ const tracks = query.tracks.split(',');
+ const data = {
+ op: query.op,
+ pid: query.pid,
+ trackIds: JSON.stringify(tracks),
+ imme: 'true',
+ };
+ try {
+ const res = await request(
+ 'POST',
+ `https://music.163.com/api/playlist/manipulate/tracks`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ return { status: 200, body: { ...res } };
+ } catch (error) {
+ if (error.body.code === 512) {
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/manipulate/tracks`,
+ {
+ op: query.op,
+ pid: query.pid,
+ trackIds: JSON.stringify([...tracks, ...tracks]),
+ imme: 'true',
+ },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ }
+ }
+ };
+ playlist_tracks(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/track/delete': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_track_delete = async (query, request) => {
+ query.cookie.os = 'pc';
+ query.ids = query.ids || '';
+ const data = {
+ id: query.id,
+ tracks: JSON.stringify(
+ query.ids.split(',').map((item) => {
+ return { type: 3, id: item };
+ }),
+ ),
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/track/delete`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_track_delete(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/track/add': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_track_add = async (query, request) => {
+ query.cookie.os = 'pc';
+ query.ids = query.ids || '';
+ const data = {
+ id: query.pid,
+ tracks: JSON.stringify(
+ query.ids.split(',').map((item) => {
+ return { type: 3, id: item };
+ }),
+ ),
+ };
+ console.log(data);
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/track/add`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_track_add(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/tags/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_tags_update = (query, request) => {
+ const data = { id: query.id, tags: query.tags };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/playlist/tags/update`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/playlist/tags/update',
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_tags_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/subscribers': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_subscribers = (query, request) => {
+ const data = {
+ id: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/subscribers`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_subscribers(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/subscribe': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_subscribe = (query, request) => {
+ query.t = query.t == 1 ? 'subscribe' : 'unsubscribe';
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_subscribe(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/order/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_order_update = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = { ids: query.ids };
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/order/update`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_order_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/name/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_name_update = (query, request) => {
+ const data = { id: query.id, name: query.name };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/playlist/update/name`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/playlist/update/name',
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_name_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/mylike': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_mylike = (query, request) => {
+ const data = { time: query.time || '-1', limit: query.limit || '12' };
+ return request(
+ 'POST',
+ `https://music.163.com/api/mlog/playlist/mylike/bytime/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_mylike(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/hot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_hot = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/hottags`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_hot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/highquality/tags': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_highquality_tags = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/highquality/tags`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_highquality_tags(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_detail = (query, request) => {
+ const data = { id: query.id, n: 100000, s: query.s || 8 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v6/playlist/detail`,
+ data,
+ {
+ crypto: 'linuxapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/desc/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_desc_update = (query, request) => {
+ const data = { id: query.id, desc: query.desc };
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/playlist/desc/update`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/playlist/desc/update',
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_desc_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/delete': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_delete = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = { ids: '[' + query.id + ']' };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/remove`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_delete(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/create': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_create = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ name: query.name,
+ privacy: query.privacy,
+ type: query.type || 'NORMAL',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/playlist/create`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_create(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/cover/update': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_cover_update = async (query, request) => {
+ const uploadInfo = await uploadPlugin(query, request);
+ const res = await request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/cover/update`,
+ { id: query.id, coverImgId: uploadInfo.imgId },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ return {
+ status: 200,
+ body: { code: 200, data: { ...uploadInfo, ...res.body } },
+ };
+ };
+ playlist_cover_update(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/playlist/catlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const playlist_catlist = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/playlist/catalogue`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ playlist_catlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized/privatecontent/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized_privatecontent_list = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ total: 'true',
+ limit: query.limit || 60,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v2/privatecontent/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized_privatecontent_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized/privatecontent': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized_privatecontent = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/personalized/privatecontent`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized_privatecontent(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized/newsong': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized_newsong = (query, request) => {
+ const data = {
+ type: 'recommend',
+ limit: query.limit || 10,
+ areaId: query.areaId || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/personalized/newsong`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized_newsong(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized/mv': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized_mv = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/personalized/mv`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized_mv(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized/djprogram': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized_djprogram = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/personalized/djprogram`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized_djprogram(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personalized': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personalized = (query, request) => {
+ const data = { limit: query.limit || 30, total: true, n: 1000 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/personalized/playlist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personalized(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/personal_fm': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const personal_fm = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/radio/get`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ personal_fm(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/url': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_url = (query, request) => {
+ const data = { id: query.id, r: query.r || 1080 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/song/enhance/play/mv/url`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_url(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/sublist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_sublist = (query, request) => {
+ const data = {
+ limit: query.limit || 25,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudvideo/allvideo/sublist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_sublist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/sub': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_sub = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = { mvId: query.mvid, mvIds: '["' + query.mvid + '"]' };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/mv/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_sub(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/first': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_first = (query, request) => {
+ const data = {
+ area: query.area || '',
+ limit: query.limit || 30,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://interface.music.163.com/weapi/mv/first`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_first(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/exclusive/rcmd': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_exclusive_rcmd = (query, request) => {
+ const data = { offset: query.offset || 0, limit: query.limit || 30 };
+ return request(
+ 'POST',
+ `https://interface.music.163.com/api/mv/exclusive/rcmd`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_exclusive_rcmd(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/detail/info': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_detail_info = (query, request) => {
+ const data = { threadid: `R_MV_5_${query.mvid}`, composeliked: true };
+ return request(
+ 'POST',
+ `https://music.163.com/api/comment/commentthread/info`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_detail_info(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_detail = (query, request) => {
+ const data = { id: query.mvid };
+ return request('POST', `https://music.163.com/api/v1/mv/detail`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ mv_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/mv/all': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const mv_all = (query, request) => {
+ const data = {
+ tags: JSON.stringify({
+ 地区: query.area || '全部',
+ 类型: query.type || '全部',
+ 排序: query.order || '上升最快',
+ }),
+ offset: query.offset || 0,
+ total: 'true',
+ limit: query.limit || 30,
+ };
+ return request(
+ 'POST',
+ `https://interface.music.163.com/api/mv/all`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ mv_all(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/msg/private/history': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const msg_private_history = (query, request) => {
+ const data = {
+ userId: query.uid,
+ limit: query.limit || 30,
+ time: query.before || 0,
+ total: 'true',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/msg/private/history`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ msg_private_history(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/msg/private': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const msg_private = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ limit: query.limit || 30,
+ total: 'true',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/msg/private/users`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ msg_private(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/msg/notices': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const msg_notices = (query, request) => {
+ const data = { limit: query.limit || 30, time: query.lasttime || -1 };
+ return request('POST', `https://music.163.com/api/msg/notices`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ msg_notices(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/msg/forwards': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const msg_forwards = (query, request) => {
+ const data = {
+ offset: query.offset || 0,
+ limit: query.limit || 30,
+ total: 'true',
+ };
+ return request('POST', `https://music.163.com/api/forwards/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ msg_forwards(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/msg/comments': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const msg_comments = (query, request) => {
+ const data = {
+ beforeTime: query.before || '-1',
+ limit: query.limit || 30,
+ total: 'true',
+ uid: query.uid,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v1/user/comments/${query.uid}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ msg_comments(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/lyric': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const lyric = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = { id: query.id, lv: -1, kv: -1, tv: -1 };
+ return request('POST', `https://music.163.com/api/song/lyric`, data, {
+ crypto: 'linuxapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ lyric(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/logout': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const logout = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/logout`,
+ {},
+ {
+ crypto: 'weapi',
+ ua: 'pc',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ logout(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/login/status': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const login_status = (query, request) => {
+ return request(
+ 'GET',
+ `https://music.163.com`,
+ {},
+ { cookie: query.cookie, proxy: query.proxy, realIP: query.realIP },
+ ).then((response) => {
+ try {
+ let profile = eval(
+ `(${/GUser\\s*=\\s*([^;]+);/.exec(response.body)[1]})`,
+ );
+ let bindings = eval(
+ `(${/GBinds\\s*=\\s*([^;]+);/.exec(response.body)[1]})`,
+ );
+ response.body = { code: 200, profile: profile, bindings: bindings };
+ return response;
+ } catch (err) {
+ response.status = 301;
+ response.body = { code: 301 };
+ return Promise.reject(response);
+ }
+ });
+ };
+ login_status(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/login/refresh': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const login_refresh = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/login/token/refresh`,
+ {},
+ {
+ crypto: 'weapi',
+ ua: 'pc',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ login_refresh(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/login/cellphone': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const login_cellphone = async (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ phone: query.phone,
+ countrycode: query.countrycode || '86',
+ password:
+ query.md5_password ||
+ crypto.createHash('md5').update(query.password).digest('hex'),
+ rememberLogin: 'true',
+ };
+ let result = await request(
+ 'POST',
+ `https://music.163.com/weapi/login/cellphone`,
+ data,
+ {
+ crypto: 'weapi',
+ ua: 'pc',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ if (result.body.code === 200) {
+ result = {
+ status: 200,
+ body: { ...result.body, cookie: result.cookie.join(';') },
+ cookie: result.cookie,
+ };
+ }
+ return result;
+ };
+ login_cellphone(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/login': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const login = async (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ username: query.email,
+ password:
+ query.md5_password ||
+ crypto.createHash('md5').update(query.password).digest('hex'),
+ rememberLogin: 'true',
+ };
+ let result = await request(
+ 'POST',
+ `https://music.163.com/weapi/login`,
+ data,
+ {
+ crypto: 'weapi',
+ ua: 'pc',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ if (result.body.code === 502) {
+ return {
+ status: 200,
+ body: { msg: '账号或密码错误', code: 502, message: '账号或密码错误' },
+ };
+ }
+ if (result.body.code === 200) {
+ result = {
+ status: 200,
+ body: { ...result.body, cookie: result.cookie.join(';') },
+ cookie: result.cookie,
+ };
+ }
+ return result;
+ };
+ login(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/likelist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const likelist = (query, request) => {
+ const data = { uid: query.uid };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/song/like/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ likelist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/like': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const like = (query, request) => {
+ query.like = query.like == 'false' ? false : true;
+ const data = { trackId: query.id, like: query.like };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/radio/like?alg=${
+ query.alg || 'itembased'
+ }&trackId=${query.id}&time=${query.time || 25}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ like(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/hot/topic': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const hot_topic = (query, request) => {
+ const data = { limit: query.limit || 20, offset: query.offset || 0 };
+ return request('POST', `https://music.163.com/weapi/act/hot`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ hot_topic(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/homepage/dragon/ball': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const homepage_dragon_ball = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/eapi/homepage/dragon/ball/static`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/homepage/dragon/ball/static',
+ realIP: query.realIP,
+ },
+ );
+ };
+ homepage_dragon_ball(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/homepage/block/page': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const homepage_block_page = (query, request) => {
+ const data = { refresh: query.refresh || true };
+ return request(
+ 'POST',
+ `https://music.163.com/api/homepage/block/page`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ homepage_block_page(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/history/recommend/songs/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const history_recommend_songs_detail = (query, request) => {
+ query.cookie.os = 'ios';
+ const data = { date: query.date || '' };
+ return request(
+ 'POST',
+ `https://music.163.com/api/discovery/recommend/songs/history/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ history_recommend_songs_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/history/recommend/songs': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const history_recommend_songs = (query, request) => {
+ query.cookie.os = 'ios';
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/discovery/recommend/songs/history/recent`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ history_recommend_songs(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/follow': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const follow = (query, request) => {
+ query.cookie.os = 'pc';
+ query.t = query.t == 1 ? 'follow' : 'delfollow';
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/user/${query.t}/${query.id}`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ follow(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/fm_trash': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const fm_trash = (query, request) => {
+ const data = { songId: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/radio/trash/add?alg=RT&songId=${
+ query.id
+ }&time=${query.time || 25}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ fm_trash(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/event/forward': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const event_forward = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ forwards: query.forwards,
+ id: query.evId,
+ eventUserId: query.uid,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/event/forward`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ event_forward(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/event/del': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const event_del = (query, request) => {
+ const data = { id: query.evId };
+ return request('POST', `https://music.163.com/eapi/event/delete`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ event_del(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/event': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const event = (query, request) => {
+ const data = {
+ pagesize: query.pagesize || 20,
+ lasttime: query.lasttime || -1,
+ };
+ return request('POST', `https://music.163.com/weapi/v1/event/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ event(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/toplist/popular': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_toplist_popular = (query, request) => {
+ const data = { limit: query.limit || 100 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/dj/toplist/popular`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_toplist_popular(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/toplist/pay': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_toplist_pay = (query, request) => {
+ const data = { limit: query.limit || 100 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/djradio/toplist/pay`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_toplist_pay(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/toplist/newcomer': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_toplist_newcomer = (query, request) => {
+ const data = { limit: query.limit || 100, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/dj/toplist/newcomer`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_toplist_newcomer(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/toplist/hours': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_toplist_hours = (query, request) => {
+ const data = { limit: query.limit || 100 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/dj/toplist/hours`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_toplist_hours(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/toplist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_toplist = (query, request) => {
+ const data = {
+ limit: query.limit || 100,
+ offset: query.offset || 0,
+ type: typeMap[query.type || 'new'] || '0',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/djradio/toplist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_toplist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/today/perfered': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_today_perfered = (query, request) => {
+ const data = { page: query.page || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/home/today/perfered`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_today_perfered(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/subscriber': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_subscriber = (query, request) => {
+ const data = {
+ time: query.time || '-1',
+ id: query.id,
+ limit: query.limit || '20',
+ total: 'true',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/djradio/subscriber`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_subscriber(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/sublist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_sublist = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/get/subed`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_sublist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/sub': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_sub = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = { id: query.rid };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_sub(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/recommend/type': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_recommend_type = (query, request) => {
+ const data = { cateId: query.type };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/recommend`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_recommend_type(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/recommend': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_recommend = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/recommend/v1`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_recommend(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/radio/hot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_radio_hot = (query, request) => {
+ const data = {
+ cateId: query.cateId,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request('POST', `https://music.163.com/api/djradio/hot`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ dj_radio_hot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/program/toplist/hours': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_program_toplist_hours = (query, request) => {
+ const data = { limit: query.limit || 100 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/djprogram/toplist/hours`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_program_toplist_hours(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/program/toplist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_program_toplist = (query, request) => {
+ const data = { limit: query.limit || 100, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/api/program/toplist/v1`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_program_toplist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/program/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_program_detail = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/api/dj/program/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_program_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/program': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_program = (query, request) => {
+ const data = {
+ radioId: query.rid,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ asc: toBoolean(query.asc),
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/dj/program/byradio`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_program(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/personalize/recommend': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_personalize_recommend = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/api/djradio/personalize/rcmd`,
+ { limit: query.limit || 6 },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_personalize_recommend(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/paygift': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_paygift = (query, request) => {
+ const data = { limit: query.limit || 30, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_paygift(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/hot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_hot = (query, request) => {
+ const data = { limit: query.limit || 30, offset: query.offset || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/hot/v1`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_hot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_detail = (query, request) => {
+ const data = { id: query.rid };
+ return request('POST', `https://music.163.com/api/djradio/v2/get`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ dj_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/catelist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_catelist = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/category/get`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_catelist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/category/recommend': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_category_recommend = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/home/category/recommend`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_category_recommend(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/category/excludehot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_category_excludehot = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/category/excludehot`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_category_excludehot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/dj/banner': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const dj_banner = (query, request) => {
+ const data = {};
+ query.cookie.os = 'pc';
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/djradio/banner/get`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ dj_banner(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/digitalAlbum/purchased': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const digitalAlbum_purchased = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/digitalAlbum/purchased`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ digitalAlbum_purchased(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/digitalAlbum/ordering': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const digitalAlbum_ordering = (query, request) => {
+ const data = {
+ business: 'Album',
+ paymentMethod: query.payment,
+ digitalResources: JSON.stringify([
+ { business: 'Album', resourceID: query.id, quantity: query.quantity },
+ ]),
+ from: 'web',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/ordering/web/digital`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ digitalAlbum_ordering(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/daily_signin': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const daily_signin = (query, request) => {
+ const data = { type: query.type || 0 };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/point/dailyTask`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ daily_signin(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/countries/code/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const countries_code_list = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://interface3.music.163.com/eapi/lbs/countries/v1`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/lbs/countries/v1',
+ realIP: query.realIP,
+ },
+ );
+ };
+ countries_code_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/video': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_video = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/R_VI_62_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_video(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_playlist = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/A_PL_0_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/new': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_new = (query, request) => {
+ query.cookie.os = 'pc';
+ query.type = {
+ 0: 'R_SO_4_',
+ 1: 'R_MV_5_',
+ 2: 'A_PL_0_',
+ 3: 'R_AL_3_',
+ 4: 'A_DJ_1_',
+ 5: 'R_VI_62_',
+ 6: 'A_EV_2_',
+ }[query.type];
+ const threadId = query.type + query.id;
+ const pageSize = query.pageSize || 20;
+ const pageNo = query.pageNo || 1;
+ const data = {
+ threadId: threadId,
+ pageNo,
+ showInner: query.showInner || true,
+ pageSize,
+ cursor:
+ +query.sortType === 3 ? query.cursor || '0' : (pageNo - 1) * pageSize,
+ sortType: query.sortType || 1,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v2/resource/comments`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ url: '/api/v2/resource/comments',
+ },
+ );
+ };
+ comment_new(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/mv': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_mv = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/R_MV_5_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_mv(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/music': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_music = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v1/resource/comments/R_SO_4_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_music(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/like': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_like = (query, request) => {
+ query.cookie.os = 'pc';
+ query.t = query.t == 1 ? 'like' : 'unlike';
+ query.type = {
+ 0: 'R_SO_4_',
+ 1: 'R_MV_5_',
+ 2: 'A_PL_0_',
+ 3: 'R_AL_3_',
+ 4: 'A_DJ_1_',
+ 5: 'R_VI_62_',
+ 6: 'A_EV_2_',
+ }[query.type];
+ const data = { threadId: query.type + query.id, commentId: query.cid };
+ if (query.type == 'A_EV_2_') {
+ data.threadId = query.threadId;
+ }
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/comment/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_like(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/hotwall/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_hotwall_list = (query, request) => {
+ const data = {};
+ return request(
+ 'POST',
+ `https://music.163.com/api/comment/hotwall/list/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_hotwall_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/hot': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_hot = (query, request) => {
+ query.cookie.os = 'pc';
+ query.type = {
+ 0: 'R_SO_4_',
+ 1: 'R_MV_5_',
+ 2: 'A_PL_0_',
+ 3: 'R_AL_3_',
+ 4: 'A_DJ_1_',
+ 5: 'R_VI_62_',
+ }[query.type];
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/hotcomments/${query.type}${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_hot(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/floor': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_floor = (query, request) => {
+ query.type = {
+ 0: 'R_SO_4_',
+ 1: 'R_MV_5_',
+ 2: 'A_PL_0_',
+ 3: 'R_AL_3_',
+ 4: 'A_DJ_1_',
+ 5: 'R_VI_62_',
+ }[query.type];
+ const data = {
+ parentCommentId: query.parentCommentId,
+ threadId: query.type + query.id,
+ time: query.time || -1,
+ limit: query.limit || 20,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/resource/comment/floor/get`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_floor(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/event': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_event = (query, request) => {
+ const data = {
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/${query.threadId}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_event(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/dj': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_dj = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/A_DJ_1_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_dj(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment/album': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment_album = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ rid: query.id,
+ limit: query.limit || 20,
+ offset: query.offset || 0,
+ beforeTime: query.before || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/resource/comments/R_AL_3_${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment_album(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/comment': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const comment = (query, request) => {
+ query.cookie.os = 'pc';
+ query.t = { 1: 'add', 0: 'delete', 2: 'reply' }[query.t];
+ query.type = {
+ 0: 'R_SO_4_',
+ 1: 'R_MV_5_',
+ 2: 'A_PL_0_',
+ 3: 'R_AL_3_',
+ 4: 'A_DJ_1_',
+ 5: 'R_VI_62_',
+ 6: 'A_EV_2_',
+ }[query.type];
+ const data = { threadId: query.type + query.id };
+ if (query.type == 'A_EV_2_') {
+ data.threadId = query.threadId;
+ }
+ if (query.t == 'add') data.content = query.content;
+ else if (query.t == 'delete') data.commentId = query.commentId;
+ else if (query.t == 'reply') {
+ data.commentId = query.commentId;
+ data.content = query.content;
+ }
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/resource/comments/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ comment(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/cloudsearch': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const cloudsearch = (query, request) => {
+ const data = {
+ s: query.keywords,
+ type: query.type || 1,
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/cloudsearch/get/web`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ cloudsearch(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/check/music': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const check_music = (query, request) => {
+ const data = {
+ ids: '[' + parseInt(query.id) + ']',
+ br: parseInt(query.br || 999000),
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/song/enhance/player/url`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ ).then((response) => {
+ let playable = false;
+ if (response.body.code == 200) {
+ if (response.body.data[0].code == 200) {
+ playable = true;
+ }
+ }
+ if (playable) {
+ response.body = { success: true, message: 'ok' };
+ return response;
+ } else {
+ response.status = 404;
+ response.body = { success: false, message: '亲爱的,暂无版权' };
+ return Promise.reject(response);
+ }
+ });
+ };
+ check_music(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/cellphone/existence/check': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const cellphone_existence_check = (query, request) => {
+ const data = { cellphone: query.phone, countrycode: query.countrycode };
+ return request(
+ 'POST',
+ `https://music.163.com/eapi/cellphone/existence/check`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ url: '/api/cellphone/existence/check',
+ realIP: query.realIP,
+ },
+ );
+ };
+ cellphone_existence_check(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/captcha/verify': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const captcha_verify = (query, request) => {
+ const data = {
+ ctcode: query.ctcode || '86',
+ cellphone: query.phone,
+ captcha: query.captcha,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/sms/captcha/verify`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ captcha_verify(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/captcha/sent': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const captcha_sent = (query, request) => {
+ const data = { ctcode: query.ctcode || '86', cellphone: query.phone };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/sms/captcha/sent`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ captcha_sent(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/calendar': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const calendar = (query, request) => {
+ const data = {
+ startTime: query.startTime || Date.now(),
+ endTime: query.endTime || Date.now(),
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/mcalendar/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ calendar(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/banner': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const banner = (query, request) => {
+ const type =
+ { 0: 'pc', 1: 'android', 2: 'iphone', 3: 'ipad' }[query.type || 0] ||
+ 'pc';
+ return request(
+ 'POST',
+ `https://music.163.com/api/v2/banner/get`,
+ { clientType: type },
+ { crypto: 'linuxapi', proxy: query.proxy, realIP: query.realIP },
+ );
+ };
+ banner(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/avatar/upload': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const avatar_upload = async (query, request) => {
+ const uploadInfo = await uploadPlugin(query, request);
+ const res = await request(
+ 'POST',
+ `https://music.163.com/weapi/user/avatar/upload/v1`,
+ { imgid: uploadInfo.imgId },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ return {
+ status: 200,
+ body: { code: 200, data: { ...uploadInfo, ...res.body } },
+ };
+ };
+ avatar_upload(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/audio/match': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const audio_match = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ algorithmCode: 'shazam_v2',
+ times: 1,
+ sessionId: 'C999431ACDC84EDBB984763654E6F8D7',
+ duration: 3.3066249999999995,
+ from: 'recognize-song',
+ rawdata: realData,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/music/audio/match`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ audio_match(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artists': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artists = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/artist/${query.id}`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artists(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/top/song': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_top_song = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/api/artist/top/song`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_top_song(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/sublist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_sublist = (query, request) => {
+ const data = {
+ limit: query.limit || 25,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/artist/sublist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_sublist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/sub': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_sub = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = { artistId: query.id, artistIds: '[' + query.id + ']' };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/artist/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_sub(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/songs': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_songs = (query, request) => {
+ query.cookie.os = 'pc';
+ const data = {
+ id: query.id,
+ private_cloud: 'true',
+ work_type: 1,
+ order: query.order || 'hot',
+ offset: query.offset || 0,
+ limit: query.limit || 100,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/api/v1/artist/songs`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_songs(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/mv': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_mv = (query, request) => {
+ const data = {
+ artistId: query.id,
+ limit: query.limit,
+ offset: query.offset,
+ total: true,
+ };
+ return request('POST', `https://music.163.com/weapi/artist/mvs`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ artist_mv(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_list = (query, request) => {
+ const data = {
+ initial: isNaN(query.initial)
+ ? (query.initial || '').toUpperCase().charCodeAt() || undefined
+ : query.initial,
+ offset: query.offset || 0,
+ limit: query.limit || 30,
+ total: true,
+ type: query.type || '1',
+ area: query.area,
+ };
+ return request('POST', `https://music.163.com/api/v1/artist/list`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ artist_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/desc': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_desc = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/artist/introduction`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_desc(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/artist/album': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const artist_album = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/artist/albums/${query.id}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ artist_album(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/sublist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_sublist = (query, request) => {
+ const data = {
+ limit: query.limit || 25,
+ offset: query.offset || 0,
+ total: true,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/album/sublist`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_sublist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/sub': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_sub = (query, request) => {
+ query.t = query.t == 1 ? 'sub' : 'unsub';
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/api/album/${query.t}`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_sub(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/songsaleboard': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_songsaleboard = (query, request) => {
+ let data = { albumType: query.albumType || 0 };
+ const type = query.type || 'daily';
+ if (type === 'year') {
+ data = { ...data, year: query.year };
+ }
+ return request(
+ 'POST',
+ `https://music.163.com/api/feealbum/songsaleboard/${type}/type`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_songsaleboard(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/newest': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_newest = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/api/discovery/newAlbum`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_newest(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/new': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_new = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ area: query.area || 'ALL',
+ };
+ return request('POST', `https://music.163.com/weapi/album/new`, data, {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ });
+ };
+ album_new(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/list/style': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_list_style = (query, request) => {
+ const data = {
+ limit: query.limit || 10,
+ offset: query.offset || 0,
+ total: true,
+ area: query.area || 'Z_H',
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/vipmall/appalbum/album/style`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_list_style(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/list': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_list = (query, request) => {
+ const data = {
+ limit: query.limit || 30,
+ offset: query.offset || 0,
+ total: true,
+ area: query.area || 'ALL',
+ type: query.type,
+ };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/vipmall/albumproduct/list`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_list(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/detail/dynamic': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_detail_dynamic = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/api/album/detail/dynamic`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_detail_dynamic(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album/detail': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album_detail = (query, request) => {
+ const data = { id: query.id };
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/vipmall/albumproduct/detail`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album_detail(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/album': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const album = (query, request) => {
+ return request(
+ 'POST',
+ `https://music.163.com/weapi/v1/album/${query.id}`,
+ {},
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ );
+ };
+ album(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/activate/init/profile': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const activate_init_profile = (query, request) => {
+ const data = { nickname: query.nickname };
+ return request(
+ 'POST',
+ `https://music.163.com/eapi/activate/initProfile`,
+ data,
+ {
+ crypto: 'eapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ url: '/api/activate/initProfile',
+ },
+ );
+ };
+ activate_init_profile(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+ '/related/playlist': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const related_playlist = (query, request) => {
+ return request(
+ 'GET',
+ `https://music.163.com/playlist?id=${query.id}`,
+ {},
+ {
+ ua: 'pc',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ ).then((response) => {
+ try {
+ const pattern = /
[\s\S]*?

[\s\S]*?
]*>([^<]+?)<\/a>[\s\S]*?]*>([^<]+?)<\/a>/g;
+ let result,
+ playlists = [];
+ while ((result = pattern.exec(response.body)) != null) {
+ playlists.push({
+ creator: {
+ userId: result[4].slice('/user/home?id='.length),
+ nickname: result[5],
+ },
+ coverImgUrl: result[1].slice(0, -'?param=50y50'.length),
+ name: result[3],
+ id: result[2].slice('/playlist?id='.length),
+ });
+ }
+ response.body = { code: 200, playlists: playlists };
+ return response;
+ } catch (err) {
+ response.status = 500;
+ response.body = { code: 500, msg: err.stack };
+ return Promise.reject(response);
+ }
+ });
+ };
+ related_playlist(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+
+ '/batch': (req, res) => {
+ if (typeof req.query.cookie === 'string') {
+ req.query.cookie = cookieToJson(req.query.cookie);
+ }
+ let query = Object.assign(
+ {},
+ { cookie: req.cookies },
+ req.query,
+ req.body,
+ req.files,
+ );
+ const batch = (query, request) => {
+ const data = {
+ e_r: true,
+ };
+ Object.keys(query).forEach((i) => {
+ if (/^\/api\//.test(i)) {
+ data[i] = query[i];
+ }
+ });
+ return request('POST', `https://music.163.com/eapi/batch`, data, {
+ crypto: 'eapi',
+ proxy: query.proxy,
+ url: '/api/batch',
+ cookie: query.cookie,
+ realIP: query.realIP,
+ });
+ };
+ batch(query, request)
+ .then((answer) => {
+ console.log('[OK]', decodeURIComponent(req.originalUrl));
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ })
+ .catch((answer) => {
+ console.log('[ERR]', decodeURIComponent(req.originalUrl), {
+ status: answer.status,
+ body: answer.body,
+ });
+ if (answer.body.code == '301') answer.body.msg = '需要登录';
+ res.append('Set-Cookie', answer.cookie);
+ res.status(answer.status).send(answer.body);
+ });
+ },
+};
diff --git a/netease_api/tsconfig.json b/netease_api/tsconfig.json
new file mode 100644
index 0000000..248536d
--- /dev/null
+++ b/netease_api/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2015",
+ "module": "commonjs",
+ "experimentalDecorators": true,
+ "moduleResolution": "node",
+ "lib": ["esnext", "esnext.asynciterable", "dom"],
+ "esModuleInterop": true,
+ "allowJs": true,
+ "sourceMap": true,
+ "strict": true,
+ "noEmit": true,
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./*"],
+ "@/*": ["./*"]
+ }
+ },
+ "exclude": ["node_modules"]
+}
diff --git a/netease_api/util/apicache.js b/netease_api/util/apicache.js
new file mode 100644
index 0000000..1b267ed
--- /dev/null
+++ b/netease_api/util/apicache.js
@@ -0,0 +1,830 @@
+var url = require('url');
+var MemoryCache = require('./memory-cache');
+
+var t = {
+ ms: 1,
+ second: 1000,
+ minute: 60000,
+ hour: 3600000,
+ day: 3600000 * 24,
+ week: 3600000 * 24 * 7,
+ month: 3600000 * 24 * 30,
+};
+
+var instances = [];
+
+var matches = function (a) {
+ return function (b) {
+ return a === b;
+ };
+};
+
+var doesntMatch = function (a) {
+ return function (b) {
+ return !matches(a)(b);
+ };
+};
+
+var logDuration = function (d, prefix) {
+ var str = d > 1000 ? (d / 1000).toFixed(2) + 'sec' : d + 'ms';
+ return '\x1b[33m- ' + (prefix ? prefix + ' ' : '') + str + '\x1b[0m';
+};
+
+function getSafeHeaders(res) {
+ return res.getHeaders ? res.getHeaders() : res._headers;
+}
+
+function ApiCache() {
+ var memCache = new MemoryCache();
+
+ var globalOptions = {
+ debug: false,
+ defaultDuration: 3600000,
+ enabled: true,
+ appendKey: [],
+ jsonp: false,
+ redisClient: false,
+ headerBlacklist: [],
+ statusCodes: {
+ include: [],
+ exclude: [],
+ },
+ events: {
+ expire: undefined,
+ },
+ headers: {
+ // 'cache-control': 'no-cache' // example of header overwrite
+ },
+ trackPerformance: false,
+ };
+
+ var middlewareOptions = [];
+ var instance = this;
+ var index = null;
+ var timers = {};
+ var performanceArray = []; // for tracking cache hit rate
+
+ instances.push(this);
+ this.id = instances.length;
+
+ function debug(a, b, c, d) {
+ var arr = ['\x1b[36m[apicache]\x1b[0m', a, b, c, d].filter(function (arg) {
+ return arg !== undefined;
+ });
+ var debugEnv =
+ process.env.DEBUG &&
+ process.env.DEBUG.split(',').indexOf('apicache') !== -1;
+
+ return (globalOptions.debug || debugEnv) && console.log.apply(null, arr);
+ }
+
+ function shouldCacheResponse(request, response, toggle) {
+ var opt = globalOptions;
+ var codes = opt.statusCodes;
+
+ if (!response) return false;
+
+ if (toggle && !toggle(request, response)) {
+ return false;
+ }
+
+ if (
+ codes.exclude &&
+ codes.exclude.length &&
+ codes.exclude.indexOf(response.statusCode) !== -1
+ )
+ return false;
+ if (
+ codes.include &&
+ codes.include.length &&
+ codes.include.indexOf(response.statusCode) === -1
+ )
+ return false;
+
+ return true;
+ }
+
+ function addIndexEntries(key, req) {
+ var groupName = req.apicacheGroup;
+
+ if (groupName) {
+ debug('group detected "' + groupName + '"');
+ var group = (index.groups[groupName] = index.groups[groupName] || []);
+ group.unshift(key);
+ }
+
+ index.all.unshift(key);
+ }
+
+ function filterBlacklistedHeaders(headers) {
+ return Object.keys(headers)
+ .filter(function (key) {
+ return globalOptions.headerBlacklist.indexOf(key) === -1;
+ })
+ .reduce(function (acc, header) {
+ acc[header] = headers[header];
+ return acc;
+ }, {});
+ }
+
+ function createCacheObject(status, headers, data, encoding) {
+ return {
+ status: status,
+ headers: filterBlacklistedHeaders(headers),
+ data: data,
+ encoding: encoding,
+ timestamp: new Date().getTime() / 1000, // seconds since epoch. This is used to properly decrement max-age headers in cached responses.
+ };
+ }
+
+ function cacheResponse(key, value, duration) {
+ var redis = globalOptions.redisClient;
+ var expireCallback = globalOptions.events.expire;
+
+ if (redis && redis.connected) {
+ try {
+ redis.hset(key, 'response', JSON.stringify(value));
+ redis.hset(key, 'duration', duration);
+ redis.expire(key, duration / 1000, expireCallback || function () {});
+ } catch (err) {
+ debug('[apicache] error in redis.hset()');
+ }
+ } else {
+ memCache.add(key, value, duration, expireCallback);
+ }
+
+ // add automatic cache clearing from duration, includes max limit on setTimeout
+ timers[key] = setTimeout(function () {
+ instance.clear(key, true);
+ }, Math.min(duration, 2147483647));
+ }
+
+ function accumulateContent(res, content) {
+ if (content) {
+ if (typeof content == 'string') {
+ res._apicache.content = (res._apicache.content || '') + content;
+ } else if (Buffer.isBuffer(content)) {
+ var oldContent = res._apicache.content;
+
+ if (typeof oldContent === 'string') {
+ oldContent = !Buffer.from
+ ? new Buffer(oldContent)
+ : Buffer.from(oldContent);
+ }
+
+ if (!oldContent) {
+ oldContent = !Buffer.alloc ? new Buffer(0) : Buffer.alloc(0);
+ }
+
+ res._apicache.content = Buffer.concat(
+ [oldContent, content],
+ oldContent.length + content.length,
+ );
+ } else {
+ res._apicache.content = content;
+ }
+ }
+ }
+
+ function makeResponseCacheable(
+ req,
+ res,
+ next,
+ key,
+ duration,
+ strDuration,
+ toggle,
+ ) {
+ // monkeypatch res.end to create cache object
+ res._apicache = {
+ write: res.write,
+ writeHead: res.writeHead,
+ end: res.end,
+ cacheable: true,
+ content: undefined,
+ };
+
+ // append header overwrites if applicable
+ Object.keys(globalOptions.headers).forEach(function (name) {
+ res.setHeader(name, globalOptions.headers[name]);
+ });
+
+ res.writeHead = function () {
+ // add cache control headers
+ if (!globalOptions.headers['cache-control']) {
+ if (shouldCacheResponse(req, res, toggle)) {
+ res.setHeader(
+ 'cache-control',
+ 'max-age=' + (duration / 1000).toFixed(0),
+ );
+ } else {
+ res.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
+ }
+ }
+
+ res._apicache.headers = Object.assign({}, getSafeHeaders(res));
+ return res._apicache.writeHead.apply(this, arguments);
+ };
+
+ // patch res.write
+ res.write = function (content) {
+ accumulateContent(res, content);
+ return res._apicache.write.apply(this, arguments);
+ };
+
+ // patch res.end
+ res.end = function (content, encoding) {
+ if (shouldCacheResponse(req, res, toggle)) {
+ accumulateContent(res, content);
+
+ if (res._apicache.cacheable && res._apicache.content) {
+ addIndexEntries(key, req);
+ var headers = res._apicache.headers || getSafeHeaders(res);
+ var cacheObject = createCacheObject(
+ res.statusCode,
+ headers,
+ res._apicache.content,
+ encoding,
+ );
+ cacheResponse(key, cacheObject, duration);
+
+ // display log entry
+ var elapsed = new Date() - req.apicacheTimer;
+ debug(
+ 'adding cache entry for "' + key + '" @ ' + strDuration,
+ logDuration(elapsed),
+ );
+ debug('_apicache.headers: ', res._apicache.headers);
+ debug('res.getHeaders(): ', getSafeHeaders(res));
+ debug('cacheObject: ', cacheObject);
+ }
+ }
+
+ return res._apicache.end.apply(this, arguments);
+ };
+
+ next();
+ }
+
+ function sendCachedResponse(
+ request,
+ response,
+ cacheObject,
+ toggle,
+ next,
+ duration,
+ ) {
+ if (toggle && !toggle(request, response)) {
+ return next();
+ }
+
+ var headers = getSafeHeaders(response);
+
+ Object.assign(
+ headers,
+ filterBlacklistedHeaders(cacheObject.headers || {}),
+ {
+ // set properly-decremented max-age header. This ensures that max-age is in sync with the cache expiration.
+ 'cache-control':
+ 'max-age=' +
+ Math.max(
+ 0,
+ (
+ duration / 1000 -
+ (new Date().getTime() / 1000 - cacheObject.timestamp)
+ ).toFixed(0),
+ ),
+ },
+ );
+
+ // only embed apicache headers when not in production environment
+
+ // unstringify buffers
+ var data = cacheObject.data;
+ if (data && data.type === 'Buffer') {
+ data =
+ typeof data.data === 'number'
+ ? new Buffer.alloc(data.data)
+ : new Buffer.from(data.data);
+ }
+
+ // test Etag against If-None-Match for 304
+ var cachedEtag = cacheObject.headers.etag;
+ var requestEtag = request.headers['if-none-match'];
+
+ if (requestEtag && cachedEtag === requestEtag) {
+ response.writeHead(304, headers);
+ return response.end();
+ }
+
+ response.writeHead(cacheObject.status || 200, headers);
+
+ return response.end(data, cacheObject.encoding);
+ }
+
+ function syncOptions() {
+ for (var i in middlewareOptions) {
+ Object.assign(
+ middlewareOptions[i].options,
+ globalOptions,
+ middlewareOptions[i].localOptions,
+ );
+ }
+ }
+
+ this.clear = function (target, isAutomatic) {
+ var group = index.groups[target];
+ var redis = globalOptions.redisClient;
+
+ if (group) {
+ debug('clearing group "' + target + '"');
+
+ group.forEach(function (key) {
+ debug('clearing cached entry for "' + key + '"');
+ clearTimeout(timers[key]);
+ delete timers[key];
+ if (!globalOptions.redisClient) {
+ memCache.delete(key);
+ } else {
+ try {
+ redis.del(key);
+ } catch (err) {
+ console.log('[apicache] error in redis.del("' + key + '")');
+ }
+ }
+ index.all = index.all.filter(doesntMatch(key));
+ });
+
+ delete index.groups[target];
+ } else if (target) {
+ debug(
+ 'clearing ' +
+ (isAutomatic ? 'expired' : 'cached') +
+ ' entry for "' +
+ target +
+ '"',
+ );
+ clearTimeout(timers[target]);
+ delete timers[target];
+ // clear actual cached entry
+ if (!redis) {
+ memCache.delete(target);
+ } else {
+ try {
+ redis.del(target);
+ } catch (err) {
+ console.log('[apicache] error in redis.del("' + target + '")');
+ }
+ }
+
+ // remove from global index
+ index.all = index.all.filter(doesntMatch(target));
+
+ // remove target from each group that it may exist in
+ Object.keys(index.groups).forEach(function (groupName) {
+ index.groups[groupName] = index.groups[groupName].filter(
+ doesntMatch(target),
+ );
+
+ // delete group if now empty
+ if (!index.groups[groupName].length) {
+ delete index.groups[groupName];
+ }
+ });
+ } else {
+ debug('clearing entire index');
+
+ if (!redis) {
+ memCache.clear();
+ } else {
+ // clear redis keys one by one from internal index to prevent clearing non-apicache entries
+ index.all.forEach(function (key) {
+ clearTimeout(timers[key]);
+ delete timers[key];
+ try {
+ redis.del(key);
+ } catch (err) {
+ console.log('[apicache] error in redis.del("' + key + '")');
+ }
+ });
+ }
+ this.resetIndex();
+ }
+
+ return this.getIndex();
+ };
+
+ function parseDuration(duration, defaultDuration) {
+ if (typeof duration === 'number') return duration;
+
+ if (typeof duration === 'string') {
+ var split = duration.match(/^([\d\.,]+)\s?(\w+)$/);
+
+ if (split.length === 3) {
+ var len = parseFloat(split[1]);
+ var unit = split[2].replace(/s$/i, '').toLowerCase();
+ if (unit === 'm') {
+ unit = 'ms';
+ }
+
+ return (len || 1) * (t[unit] || 0);
+ }
+ }
+
+ return defaultDuration;
+ }
+
+ this.getDuration = function (duration) {
+ return parseDuration(duration, globalOptions.defaultDuration);
+ };
+
+ /**
+ * Return cache performance statistics (hit rate). Suitable for putting into a route:
+ *
+ * app.get('/api/cache/performance', (req, res) => {
+ * res.json(apicache.getPerformance())
+ * })
+ *
+ */
+ this.getPerformance = function () {
+ return performanceArray.map(function (p) {
+ return p.report();
+ });
+ };
+
+ this.getIndex = function (group) {
+ if (group) {
+ return index.groups[group];
+ } else {
+ return index;
+ }
+ };
+
+ this.middleware = function cache(
+ strDuration,
+ middlewareToggle,
+ localOptions,
+ ) {
+ var duration = instance.getDuration(strDuration);
+ var opt = {};
+
+ middlewareOptions.push({
+ options: opt,
+ });
+
+ var options = function (localOptions) {
+ if (localOptions) {
+ middlewareOptions.find(function (middleware) {
+ return middleware.options === opt;
+ }).localOptions = localOptions;
+ }
+
+ syncOptions();
+
+ return opt;
+ };
+
+ options(localOptions);
+
+ /**
+ * A Function for non tracking performance
+ */
+ function NOOPCachePerformance() {
+ this.report = this.hit = this.miss = function () {}; // noop;
+ }
+
+ /**
+ * A function for tracking and reporting hit rate. These statistics are returned by the getPerformance() call above.
+ */
+ function CachePerformance() {
+ /**
+ * Tracks the hit rate for the last 100 requests.
+ * If there have been fewer than 100 requests, the hit rate just considers the requests that have happened.
+ */
+ this.hitsLast100 = new Uint8Array(100 / 4); // each hit is 2 bits
+
+ /**
+ * Tracks the hit rate for the last 1000 requests.
+ * If there have been fewer than 1000 requests, the hit rate just considers the requests that have happened.
+ */
+ this.hitsLast1000 = new Uint8Array(1000 / 4); // each hit is 2 bits
+
+ /**
+ * Tracks the hit rate for the last 10000 requests.
+ * If there have been fewer than 10000 requests, the hit rate just considers the requests that have happened.
+ */
+ this.hitsLast10000 = new Uint8Array(10000 / 4); // each hit is 2 bits
+
+ /**
+ * Tracks the hit rate for the last 100000 requests.
+ * If there have been fewer than 100000 requests, the hit rate just considers the requests that have happened.
+ */
+ this.hitsLast100000 = new Uint8Array(100000 / 4); // each hit is 2 bits
+
+ /**
+ * The number of calls that have passed through the middleware since the server started.
+ */
+ this.callCount = 0;
+
+ /**
+ * The total number of hits since the server started
+ */
+ this.hitCount = 0;
+
+ /**
+ * The key from the last cache hit. This is useful in identifying which route these statistics apply to.
+ */
+ this.lastCacheHit = null;
+
+ /**
+ * The key from the last cache miss. This is useful in identifying which route these statistics apply to.
+ */
+ this.lastCacheMiss = null;
+
+ /**
+ * Return performance statistics
+ */
+ this.report = function () {
+ return {
+ lastCacheHit: this.lastCacheHit,
+ lastCacheMiss: this.lastCacheMiss,
+ callCount: this.callCount,
+ hitCount: this.hitCount,
+ missCount: this.callCount - this.hitCount,
+ hitRate: this.callCount == 0 ? null : this.hitCount / this.callCount,
+ hitRateLast100: this.hitRate(this.hitsLast100),
+ hitRateLast1000: this.hitRate(this.hitsLast1000),
+ hitRateLast10000: this.hitRate(this.hitsLast10000),
+ hitRateLast100000: this.hitRate(this.hitsLast100000),
+ };
+ };
+
+ /**
+ * Computes a cache hit rate from an array of hits and misses.
+ * @param {Uint8Array} array An array representing hits and misses.
+ * @returns a number between 0 and 1, or null if the array has no hits or misses
+ */
+ this.hitRate = function (array) {
+ var hits = 0;
+ var misses = 0;
+ for (var i = 0; i < array.length; i++) {
+ var n8 = array[i];
+ for (j = 0; j < 4; j++) {
+ switch (n8 & 3) {
+ case 1:
+ hits++;
+ break;
+ case 2:
+ misses++;
+ break;
+ }
+ n8 >>= 2;
+ }
+ }
+ var total = hits + misses;
+ if (total == 0) return null;
+ return hits / total;
+ };
+
+ /**
+ * Record a hit or miss in the given array. It will be recorded at a position determined
+ * by the current value of the callCount variable.
+ * @param {Uint8Array} array An array representing hits and misses.
+ * @param {boolean} hit true for a hit, false for a miss
+ * Each element in the array is 8 bits, and encodes 4 hit/miss records.
+ * Each hit or miss is encoded as to bits as follows:
+ * 00 means no hit or miss has been recorded in these bits
+ * 01 encodes a hit
+ * 10 encodes a miss
+ */
+ this.recordHitInArray = function (array, hit) {
+ var arrayIndex = ~~(this.callCount / 4) % array.length;
+ var bitOffset = (this.callCount % 4) * 2; // 2 bits per record, 4 records per uint8 array element
+ var clearMask = ~(3 << bitOffset);
+ var record = (hit ? 1 : 2) << bitOffset;
+ array[arrayIndex] = (array[arrayIndex] & clearMask) | record;
+ };
+
+ /**
+ * Records the hit or miss in the tracking arrays and increments the call count.
+ * @param {boolean} hit true records a hit, false records a miss
+ */
+ this.recordHit = function (hit) {
+ this.recordHitInArray(this.hitsLast100, hit);
+ this.recordHitInArray(this.hitsLast1000, hit);
+ this.recordHitInArray(this.hitsLast10000, hit);
+ this.recordHitInArray(this.hitsLast100000, hit);
+ if (hit) this.hitCount++;
+ this.callCount++;
+ };
+
+ /**
+ * Records a hit event, setting lastCacheMiss to the given key
+ * @param {string} key The key that had the cache hit
+ */
+ this.hit = function (key) {
+ this.recordHit(true);
+ this.lastCacheHit = key;
+ };
+
+ /**
+ * Records a miss event, setting lastCacheMiss to the given key
+ * @param {string} key The key that had the cache miss
+ */
+ this.miss = function (key) {
+ this.recordHit(false);
+ this.lastCacheMiss = key;
+ };
+ }
+
+ var perf = globalOptions.trackPerformance
+ ? new CachePerformance()
+ : new NOOPCachePerformance();
+
+ performanceArray.push(perf);
+
+ var cache = function (req, res, next) {
+ function bypass() {
+ debug('bypass detected, skipping cache.');
+ return next();
+ }
+
+ // initial bypass chances
+ if (!opt.enabled) return bypass();
+ if (
+ req.headers['x-apicache-bypass'] ||
+ req.headers['x-apicache-force-fetch']
+ )
+ return bypass();
+
+ // REMOVED IN 0.11.1 TO CORRECT MIDDLEWARE TOGGLE EXECUTE ORDER
+ // if (typeof middlewareToggle === 'function') {
+ // if (!middlewareToggle(req, res)) return bypass()
+ // } else if (middlewareToggle !== undefined && !middlewareToggle) {
+ // return bypass()
+ // }
+
+ // embed timer
+ req.apicacheTimer = new Date();
+
+ // In Express 4.x the url is ambigious based on where a router is mounted. originalUrl will give the full Url
+ var key = req.originalUrl || req.url;
+
+ // Remove querystring from key if jsonp option is enabled
+ if (opt.jsonp) {
+ key = url.parse(key).pathname;
+ }
+
+ // add appendKey (either custom function or response path)
+ if (typeof opt.appendKey === 'function') {
+ key += '$$appendKey=' + opt.appendKey(req, res);
+ } else if (opt.appendKey.length > 0) {
+ var appendKey = req;
+
+ for (var i = 0; i < opt.appendKey.length; i++) {
+ appendKey = appendKey[opt.appendKey[i]];
+ }
+ key += '$$appendKey=' + appendKey;
+ }
+
+ // attempt cache hit
+ var redis = opt.redisClient;
+ var cached = !redis ? memCache.getValue(key) : null;
+
+ // send if cache hit from memory-cache
+ if (cached) {
+ var elapsed = new Date() - req.apicacheTimer;
+ debug(
+ 'sending cached (memory-cache) version of',
+ key,
+ logDuration(elapsed),
+ );
+
+ perf.hit(key);
+ return sendCachedResponse(
+ req,
+ res,
+ cached,
+ middlewareToggle,
+ next,
+ duration,
+ );
+ }
+
+ // send if cache hit from redis
+ if (redis && redis.connected) {
+ try {
+ redis.hgetall(key, function (err, obj) {
+ if (!err && obj && obj.response) {
+ var elapsed = new Date() - req.apicacheTimer;
+ debug(
+ 'sending cached (redis) version of',
+ key,
+ logDuration(elapsed),
+ );
+
+ perf.hit(key);
+ return sendCachedResponse(
+ req,
+ res,
+ JSON.parse(obj.response),
+ middlewareToggle,
+ next,
+ duration,
+ );
+ } else {
+ perf.miss(key);
+ return makeResponseCacheable(
+ req,
+ res,
+ next,
+ key,
+ duration,
+ strDuration,
+ middlewareToggle,
+ );
+ }
+ });
+ } catch (err) {
+ // bypass redis on error
+ perf.miss(key);
+ return makeResponseCacheable(
+ req,
+ res,
+ next,
+ key,
+ duration,
+ strDuration,
+ middlewareToggle,
+ );
+ }
+ } else {
+ perf.miss(key);
+ return makeResponseCacheable(
+ req,
+ res,
+ next,
+ key,
+ duration,
+ strDuration,
+ middlewareToggle,
+ );
+ }
+ };
+
+ cache.options = options;
+
+ return cache;
+ };
+
+ this.options = function (options) {
+ if (options) {
+ Object.assign(globalOptions, options);
+ syncOptions();
+
+ if ('defaultDuration' in options) {
+ // Convert the default duration to a number in milliseconds (if needed)
+ globalOptions.defaultDuration = parseDuration(
+ globalOptions.defaultDuration,
+ 3600000,
+ );
+ }
+
+ if (globalOptions.trackPerformance) {
+ debug(
+ 'WARNING: using trackPerformance flag can cause high memory usage!',
+ );
+ }
+
+ return this;
+ } else {
+ return globalOptions;
+ }
+ };
+
+ this.resetIndex = function () {
+ index = {
+ all: [],
+ groups: {},
+ };
+ };
+
+ this.newInstance = function (config) {
+ var instance = new ApiCache();
+
+ if (config) {
+ instance.options(config);
+ }
+
+ return instance;
+ };
+
+ this.clone = function () {
+ return this.newInstance(this.options());
+ };
+
+ // initialize index
+ this.resetIndex();
+}
+
+module.exports = new ApiCache();
diff --git a/netease_api/util/crypto.js b/netease_api/util/crypto.js
new file mode 100644
index 0000000..de80e15
--- /dev/null
+++ b/netease_api/util/crypto.js
@@ -0,0 +1,67 @@
+const crypto = require('crypto');
+const iv = Buffer.from('0102030405060708');
+const presetKey = Buffer.from('0CoJUm6Qyw8W8jud');
+const linuxapiKey = Buffer.from('rFgB&h#%2?^eDg:Q');
+const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+const publicKey =
+ '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6sXqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9SdB1Ua44oncaTWz7OBGLbCiK45wIDAQAB\n-----END PUBLIC KEY-----';
+const eapiKey = 'e82ckenh8dichen8';
+
+const aesEncrypt = (buffer, mode, key, iv) => {
+ const cipher = crypto.createCipheriv('aes-128-' + mode, key, iv);
+ return Buffer.concat([cipher.update(buffer), cipher.final()]);
+};
+
+const rsaEncrypt = (buffer, key) => {
+ buffer = Buffer.concat([Buffer.alloc(128 - buffer.length), buffer]);
+ return crypto.publicEncrypt(
+ { key: key, padding: crypto.constants.RSA_NO_PADDING },
+ buffer,
+ );
+};
+
+const weapi = (object) => {
+ const text = JSON.stringify(object);
+ const secretKey = crypto
+ .randomBytes(16)
+ .map((n) => base62.charAt(n % 62).charCodeAt());
+ return {
+ params: aesEncrypt(
+ Buffer.from(
+ aesEncrypt(Buffer.from(text), 'cbc', presetKey, iv).toString('base64'),
+ ),
+ 'cbc',
+ secretKey,
+ iv,
+ ).toString('base64'),
+ encSecKey: rsaEncrypt(secretKey.reverse(), publicKey).toString('hex'),
+ };
+};
+
+const linuxapi = (object) => {
+ const text = JSON.stringify(object);
+ return {
+ eparams: aesEncrypt(Buffer.from(text), 'ecb', linuxapiKey, '')
+ .toString('hex')
+ .toUpperCase(),
+ };
+};
+
+const eapi = (url, object) => {
+ const text = typeof object === 'object' ? JSON.stringify(object) : object;
+ const message = `nobody${url}use${text}md5forencrypt`;
+ const digest = crypto.createHash('md5').update(message).digest('hex');
+ const data = `${url}-36cd479b6b5-${text}-36cd479b6b5-${digest}`;
+ return {
+ params: aesEncrypt(Buffer.from(data), 'ecb', eapiKey, '')
+ .toString('hex')
+ .toUpperCase(),
+ };
+};
+
+const decrypt = (cipherBuffer) => {
+ const decipher = crypto.createDecipheriv('aes-128-ecb', eapiKey, '');
+ return Buffer.concat([decipher.update(cipherBuffer), decipher.final()]);
+};
+
+module.exports = { weapi, linuxapi, eapi, decrypt };
diff --git a/netease_api/util/index.js b/netease_api/util/index.js
new file mode 100644
index 0000000..6241c2c
--- /dev/null
+++ b/netease_api/util/index.js
@@ -0,0 +1,17 @@
+module.exports = {
+ toBoolean(val) {
+ if (typeof val === 'boolean') return val;
+ if (val === '') return val;
+ return val === 'true' || val == '1';
+ },
+ cookieToJson(cookie) {
+ if (!cookie) return {};
+ let cookieArr = cookie.split(';');
+ let obj = {};
+ cookieArr.forEach((i) => {
+ let arr = i.split('=');
+ obj[arr[0]] = arr[1];
+ });
+ return obj;
+ },
+};
diff --git a/netease_api/util/memory-cache.js b/netease_api/util/memory-cache.js
new file mode 100644
index 0000000..02e735a
--- /dev/null
+++ b/netease_api/util/memory-cache.js
@@ -0,0 +1,63 @@
+function MemoryCache() {
+ this.cache = {};
+ this.size = 0;
+}
+
+MemoryCache.prototype.add = function (key, value, time, timeoutCallback) {
+ var old = this.cache[key];
+ var instance = this;
+
+ var entry = {
+ value: value,
+ expire: time + Date.now(),
+ timeout: setTimeout(function () {
+ instance.delete(key);
+ return (
+ timeoutCallback &&
+ typeof timeoutCallback === 'function' &&
+ timeoutCallback(value, key)
+ );
+ }, time),
+ };
+
+ this.cache[key] = entry;
+ this.size = Object.keys(this.cache).length;
+
+ return entry;
+};
+
+MemoryCache.prototype.delete = function (key) {
+ var entry = this.cache[key];
+
+ if (entry) {
+ clearTimeout(entry.timeout);
+ }
+
+ delete this.cache[key];
+
+ this.size = Object.keys(this.cache).length;
+
+ return null;
+};
+
+MemoryCache.prototype.get = function (key) {
+ var entry = this.cache[key];
+
+ return entry;
+};
+
+MemoryCache.prototype.getValue = function (key) {
+ var entry = this.get(key);
+
+ return entry && entry.value;
+};
+
+MemoryCache.prototype.clear = function () {
+ Object.keys(this.cache).forEach(function (key) {
+ this.delete(key);
+ }, this);
+
+ return true;
+};
+
+module.exports = MemoryCache;
diff --git a/netease_api/util/request.js b/netease_api/util/request.js
new file mode 100644
index 0000000..84d448d
--- /dev/null
+++ b/netease_api/util/request.js
@@ -0,0 +1,177 @@
+const encrypt = require('./crypto');
+const axios = require('axios');
+const queryString = require('querystring');
+const PacProxyAgent = require('pac-proxy-agent');
+const http = require('http');
+const https = require('https');
+const tunnel = require('tunnel');
+const qs = require('url');
+// request.debug = true // 开启可看到更详细信息
+
+const chooseUserAgent = (ua = false) => {
+ const userAgentList = {
+ mobile: [
+ // iOS 13.5.1 14.0 beta with safari
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1',
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.',
+ // iOS with qq micromsg
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML like Gecko) Mobile/14A456 QQ/6.5.7.408 V1_IPH_SQ_6.5.7_1_APP_A Pixel/750 Core/UIWebView NetType/4G Mem/103',
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f27) NetType/WIFI Language/zh',
+ // Android -> Huawei Xiaomi
+ 'Mozilla/5.0 (Linux; Android 9; PCT-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.311 Mobile Safari/537.36',
+ 'Mozilla/5.0 (Linux; U; Android 9; zh-cn; Redmi Note 8 Build/PKQ1.190616.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.141 Mobile Safari/537.36 XiaoMi/MiuiBrowser/12.5.22',
+ // Android + qq micromsg
+ 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2581 MMWEBSDK/200801 Mobile Safari/537.36 MMWEBID/3027 MicroMessenger/7.0.18.1740(0x27001235) Process/toolsmp WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64',
+ 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BKK-AL10 Build/HONORBKK-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.6 Mobile Safari/537.36',
+ ],
+ pc: [
+ // macOS 10.15.6 Firefox / Chrome / Safari
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0',
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.30 Safari/537.36',
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15',
+ // Windows 10 Firefox / Chrome / Edge
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.30 Safari/537.36',
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586',
+ // Linux 就算了
+ ],
+ };
+ let realUserAgentList =
+ userAgentList[ua] || userAgentList.mobile.concat(userAgentList.pc);
+ return ['mobile', 'pc', false].indexOf(ua) > -1
+ ? realUserAgentList[Math.floor(Math.random() * realUserAgentList.length)]
+ : ua;
+};
+const createRequest = (method, url, data, options) => {
+ return new Promise((resolve, reject) => {
+ let headers = { 'User-Agent': chooseUserAgent(options.ua) };
+ if (method.toUpperCase() === 'POST')
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
+ if (url.includes('music.163.com'))
+ headers['Referer'] = 'https://music.163.com';
+ if (options.realIP) headers['X-Real-IP'] = options.realIP;
+ // headers['X-Real-IP'] = '118.88.88.88'
+ if (typeof options.cookie === 'object')
+ headers['Cookie'] = Object.keys(options.cookie)
+ .map(
+ (key) =>
+ encodeURIComponent(key) +
+ '=' +
+ encodeURIComponent(options.cookie[key]),
+ )
+ .join('; ');
+ else if (options.cookie) headers['Cookie'] = options.cookie;
+
+ if (!headers['Cookie']) {
+ headers['Cookie'] = options.token || '';
+ }
+ if (options.crypto === 'weapi') {
+ let csrfToken = (headers['Cookie'] || '').match(/_csrf=([^(;|$)]+)/);
+ data.csrf_token = csrfToken ? csrfToken[1] : '';
+ data = encrypt.weapi(data);
+ url = url.replace(/\w*api/, 'weapi');
+ } else if (options.crypto === 'linuxapi') {
+ data = encrypt.linuxapi({
+ method: method,
+ url: url.replace(/\w*api/, 'api'),
+ params: data,
+ });
+ headers['User-Agent'] =
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36';
+ url = 'https://music.163.com/api/linux/forward';
+ } else if (options.crypto === 'eapi') {
+ const cookie = options.cookie || {};
+ const csrfToken = cookie['__csrf'] || '';
+ const header = {
+ osver: cookie.osver, //系统版本
+ deviceId: cookie.deviceId, //encrypt.base64.encode(imei + '\t02:00:00:00:00:00\t5106025eb79a5247\t70ffbaac7')
+ appver: cookie.appver || '6.1.1', // app版本
+ versioncode: cookie.versioncode || '140', //版本号
+ mobilename: cookie.mobilename, //设备model
+ buildver: cookie.buildver || Date.now().toString().substr(0, 10),
+ resolution: cookie.resolution || '1920x1080', //设备分辨率
+ __csrf: csrfToken,
+ os: cookie.os || 'android',
+ channel: cookie.channel,
+ requestId: `${Date.now()}_${Math.floor(Math.random() * 1000)
+ .toString()
+ .padStart(4, '0')}`,
+ };
+ if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U;
+ if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A;
+ headers['Cookie'] = Object.keys(header)
+ .map(
+ (key) =>
+ encodeURIComponent(key) + '=' + encodeURIComponent(header[key]),
+ )
+ .join('; ');
+ data.header = header;
+ data = encrypt.eapi(options.url, data);
+ url = url.replace(/\w*api/, 'eapi');
+ }
+
+ const answer = { status: 500, body: {}, cookie: [] };
+ const settings = {
+ method: method,
+ url: url,
+ headers: headers,
+ data: queryString.stringify(data),
+ httpAgent: new http.Agent({ keepAlive: true }),
+ httpsAgent: new https.Agent({ keepAlive: true }),
+ };
+
+ if (options.crypto === 'eapi') settings.encoding = null;
+
+ if (options.proxy) {
+ if (options.proxy.indexOf('pac') > -1) {
+ settings.httpAgent = new PacProxyAgent(options.proxy);
+ settings.httpsAgent = new PacProxyAgent(options.proxy);
+ } else {
+ var purl = qs.parse(options.proxy);
+ if (purl.hostname) {
+ const agent = tunnel.httpsOverHttp({
+ proxy: {
+ host: purl.hostname,
+ port: purl.port || 80,
+ },
+ });
+ settings.httpsAgent = agent;
+ settings.httpAgent = agent;
+ settings.proxy = false;
+ } else {
+ console.error('代理配置无效,不使用代理');
+ }
+ }
+ }
+
+ axios(settings)
+ .then((res) => {
+ const body = res.data;
+ answer.cookie = (res.headers['set-cookie'] || []).map((x) =>
+ x.replace(/\s*Domain=[^(;|$)]+;*/, ''),
+ );
+ try {
+ answer.body = body;
+ answer.status = answer.body.code || res.status;
+ if (answer.body.code === 502) {
+ answer.status = 200;
+ }
+ } catch (e) {
+ answer.body = body;
+ answer.status = res.status;
+ }
+
+ answer.status =
+ 100 < answer.status && answer.status < 600 ? answer.status : 400;
+ if (answer.status == 200) resolve(answer);
+ else reject(answer);
+ })
+ .catch((err) => {
+ answer.status = 502;
+ answer.body = { code: 502, msg: err };
+ reject(answer);
+ });
+ });
+};
+
+module.exports = createRequest;
diff --git a/package.json b/package.json
index bb87fdd..5150418 100644
--- a/package.json
+++ b/package.json
@@ -1,85 +1,72 @@
{
- "name": "yesplaymusic",
- "version": "0.4.9",
+ "name": "YesPlayMusic",
+ "version": "0.3.1",
"private": true,
- "description": "A third party music player for Netease Music",
- "author": "qier222",
+ "description": "A third party music application for Netease Music",
+ "author": "hawtim",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
- "electron:build": "vue-cli-service electron:build -p never",
- "electron:build-all": "vue-cli-service electron:build -p never -mwl",
- "electron:build-mac": "vue-cli-service electron:build -p never -m",
- "electron:build-win": "vue-cli-service electron:build -p never -w",
- "electron:build-linux": "vue-cli-service electron:build -p never -l",
+ "electron:build": "vue-cli-service electron:build -mwl -p never",
+ "electron:build-mac": "vue-cli-service electron:build -m -p never",
+ "electron:build-win": "vue-cli-service electron:build -w -p never",
+ "electron:build-linux": "vue-cli-service electron:build -l -p never",
"electron:serve": "vue-cli-service electron:serve",
"electron:buildicon": "electron-icon-builder --input=./build/icons/icon.png --output=build --flatten",
"electron:publish": "vue-cli-service electron:build -mwl -p always",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps",
- "prettier": "npx prettier --write ./src",
- "netease_api:run": "npx NeteaseCloudMusicApi"
+ "prettier": "npx prettier --write ./src ./script",
+ "netease_api:run": "cd ./netease_api && npm run start",
+ "netease_api:pull": "node script/pull.js",
+ "netease_api:install": "cd ./netease_api && npm install",
+ "netease_api:setup": "npm run netease_api:pull && npm run netease_api:install"
},
"main": "background.js",
- "engines": {
- "node": "14 || 16"
- },
"dependencies": {
- "@unblockneteasemusic/rust-napi": "^0.4.0",
- "NeteaseCloudMusicApi": "^4.23.3",
- "axios": "^0.26.1",
- "change-case": "^4.1.2",
- "cli-color": "^2.0.0",
- "color": "^4.2.3",
+ "@njzy/unblockneteasemusic": "^0.25.3",
+ "axios": "^0.21.0",
+ "big-integer": "^1.6.48",
"core-js": "^3.6.5",
"crypto-js": "^4.0.0",
"dayjs": "^1.8.36",
- "dexie": "^3.0.3",
- "discord-rich-presence": "^0.0.8",
- "electron": "^13.6.7",
- "electron-builder": "^23.0.0",
- "electron-context-menu": "^3.1.2",
+ "electron": "11.0.2",
+ "electron-context-menu": "^2.3.0",
"electron-debug": "^3.1.0",
- "electron-devtools-installer": "^3.2",
- "electron-icon-builder": "^2.0.1",
- "electron-is-dev": "^2.0.0",
+ "electron-devtools-installer": "^3.1.1",
+ "electron-icon-builder": "^1.0.2",
+ "electron-is-dev": "^1.2.0",
"electron-log": "^4.3.0",
- "electron-store": "^8.0.1",
- "electron-updater": "^5.0.1",
- "esbuild": "^0.20.1",
- "esbuild-loader": "^4.0.3",
+ "electron-store": "^6.0.1",
+ "electron-updater": "^4.3.5",
"express": "^4.17.1",
"express-fileupload": "^1.2.0",
"express-http-proxy": "^1.6.2",
"extract-zip": "^2.0.1",
- "howler": "^2.2.3",
+ "howler": "^2.2.0",
"js-cookie": "^2.2.1",
- "jsbi": "^4.1.0",
+ "localforage": "^1.9.0",
"lodash": "^4.17.20",
- "md5": "^2.3.0",
- "mpris-service": "^2.1.2",
- "music-metadata": "^7.5.3",
- "node-vibrant": "^3.2.1-alpha.1",
"nprogress": "^0.2.0",
"pac-proxy-agent": "^4.1.0",
"plyr": "^3.6.2",
- "qrcode": "^1.4.4",
+ "prettier": "2.1.2",
"register-service-worker": "^1.7.1",
- "svg-sprite-loader": "^6.0.11",
+ "svg-sprite-loader": "^5.0.0",
"tunnel": "^0.0.6",
- "vscode-codicons": "^0.0.17",
"vue": "^2.6.11",
- "vue-clipboard2": "^0.3.1",
- "vue-gtag": "1",
+ "vue-analytics": "^5.22.1",
+ "vue-electron": "^1.0.6",
"vue-i18n": "^8.22.0",
"vue-router": "^3.4.3",
"vue-slider-component": "^3.2.5",
- "vuex": "^3.4.0",
- "x11": "^2.3.0"
+ "vuex": "^3.4.0"
},
"devDependencies": {
- "@types/node": "^17.0.0",
+ "@sentry/browser": "^5.27.0",
+ "@sentry/integrations": "^5.27.0",
+ "@sentry/tracing": "^5.27.0",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-pwa": "~4.5.0",
@@ -87,21 +74,13 @@
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
- "eslint-config-prettier": "^8.1.0",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-vue": "^7.9.0",
+ "eslint-plugin-vue": "^6.2.2",
"husky": "^4.3.0",
- "prettier": "2.5.1",
"sass": "^1.26.11",
"sass-loader": "^10.0.2",
- "vue-cli-plugin-electron-builder": "~2.1.1",
+ "vue-cli-plugin-electron-builder": "~2.0.0-rc.4",
"vue-template-compiler": "^2.6.11"
},
- "resolutions": {
- "icon-gen": "3.0.0",
- "degenerator": "2.2.0",
- "electron-builder": "^23.0.0"
- },
"eslintConfig": {
"root": true,
"env": {
@@ -110,8 +89,6 @@
},
"extends": [
"plugin:vue/essential",
- "plugin:vue/recommended",
- "plugin:prettier/recommended",
"eslint:recommended"
],
"parserOptions": {
diff --git a/public/img/icons/exit.png b/public/img/icons/exit.png
deleted file mode 100644
index 01e21b2..0000000
Binary files a/public/img/icons/exit.png and /dev/null differ
diff --git a/public/img/icons/left.png b/public/img/icons/left.png
deleted file mode 100644
index 9e49d7e..0000000
Binary files a/public/img/icons/left.png and /dev/null differ
diff --git a/public/img/icons/like.png b/public/img/icons/like.png
deleted file mode 100644
index 4bea102..0000000
Binary files a/public/img/icons/like.png and /dev/null differ
diff --git a/public/img/icons/menu-dark@88.png b/public/img/icons/menu-dark@88.png
deleted file mode 100644
index a2feb00..0000000
Binary files a/public/img/icons/menu-dark@88.png and /dev/null differ
diff --git a/public/img/icons/menu-light@88.png b/public/img/icons/menu@88.png
similarity index 100%
rename from public/img/icons/menu-light@88.png
rename to public/img/icons/menu@88.png
diff --git a/public/img/icons/pause.png b/public/img/icons/pause.png
deleted file mode 100644
index 509d738..0000000
Binary files a/public/img/icons/pause.png and /dev/null differ
diff --git a/public/img/icons/play.png b/public/img/icons/play.png
deleted file mode 100644
index 90537c8..0000000
Binary files a/public/img/icons/play.png and /dev/null differ
diff --git a/public/img/icons/repeat.png b/public/img/icons/repeat.png
deleted file mode 100644
index d4c3fc7..0000000
Binary files a/public/img/icons/repeat.png and /dev/null differ
diff --git a/public/img/icons/right.png b/public/img/icons/right.png
deleted file mode 100644
index 50c2e75..0000000
Binary files a/public/img/icons/right.png and /dev/null differ
diff --git a/public/img/icons/unlike.png b/public/img/icons/unlike.png
deleted file mode 100644
index a0afa24..0000000
Binary files a/public/img/icons/unlike.png and /dev/null differ
diff --git a/public/img/logos/lastfm.png b/public/img/logos/lastfm.png
deleted file mode 100644
index e3964f6..0000000
Binary files a/public/img/logos/lastfm.png and /dev/null differ
diff --git a/public/img/logos/nyancat-stop.png b/public/img/logos/nyancat-stop.png
deleted file mode 100644
index 72bf07e..0000000
Binary files a/public/img/logos/nyancat-stop.png and /dev/null differ
diff --git a/public/img/logos/yesplaymusic-white24x24.png b/public/img/logos/yesplaymusic-white24x24.png
deleted file mode 100644
index d8e4715..0000000
Binary files a/public/img/logos/yesplaymusic-white24x24.png and /dev/null differ
diff --git a/public/img/touchbar/backward.png b/public/img/touchbar/backward.png
deleted file mode 100644
index 83b2053..0000000
Binary files a/public/img/touchbar/backward.png and /dev/null differ
diff --git a/public/img/touchbar/forward.png b/public/img/touchbar/forward.png
deleted file mode 100644
index 5577bb5..0000000
Binary files a/public/img/touchbar/forward.png and /dev/null differ
diff --git a/public/img/touchbar/like.png b/public/img/touchbar/like.png
deleted file mode 100644
index 09f6534..0000000
Binary files a/public/img/touchbar/like.png and /dev/null differ
diff --git a/public/img/touchbar/like_fill.png b/public/img/touchbar/like_fill.png
deleted file mode 100644
index bbc2727..0000000
Binary files a/public/img/touchbar/like_fill.png and /dev/null differ
diff --git a/public/img/touchbar/next_up.png b/public/img/touchbar/next_up.png
deleted file mode 100644
index 60d67a0..0000000
Binary files a/public/img/touchbar/next_up.png and /dev/null differ
diff --git a/public/img/touchbar/page_next.png b/public/img/touchbar/page_next.png
deleted file mode 100644
index 24ab389..0000000
Binary files a/public/img/touchbar/page_next.png and /dev/null differ
diff --git a/public/img/touchbar/page_prev.png b/public/img/touchbar/page_prev.png
deleted file mode 100644
index 52cb588..0000000
Binary files a/public/img/touchbar/page_prev.png and /dev/null differ
diff --git a/public/img/touchbar/pause.png b/public/img/touchbar/pause.png
deleted file mode 100644
index 083f680..0000000
Binary files a/public/img/touchbar/pause.png and /dev/null differ
diff --git a/public/img/touchbar/play.png b/public/img/touchbar/play.png
deleted file mode 100644
index 101b92f..0000000
Binary files a/public/img/touchbar/play.png and /dev/null differ
diff --git a/public/img/touchbar/search.png b/public/img/touchbar/search.png
deleted file mode 100644
index e62e725..0000000
Binary files a/public/img/touchbar/search.png and /dev/null differ
diff --git a/public/index.html b/public/index.html
index ca6d1ad..193d42c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,25 +1,23 @@
+
+
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
-
-
-
-
-
-
-
- <%= htmlWebpackPlugin.options.title %>
-
-
-
-
-
+
+
+
diff --git a/public/robots.txt b/public/robots.txt
index 1f53798..eb05362 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,2 +1,2 @@
User-agent: *
-Disallow: /
+Disallow:
diff --git a/restyled.yml b/restyled.yml
deleted file mode 100644
index c31d3e8..0000000
--- a/restyled.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-commit_template: 'style: with ${restyler.name}'
-restylers:
- - prettier
- - prettier-json
- - prettier-markdown
- - prettier-yaml
- - whitespace
diff --git a/script/pull.js b/script/pull.js
new file mode 100644
index 0000000..8f75eb8
--- /dev/null
+++ b/script/pull.js
@@ -0,0 +1,103 @@
+// node module
+const fs = require("fs");
+const https = require("https");
+const resolve = require("path").resolve;
+const join = require("path").resolve;
+const extract = require("extract-zip");
+
+// 函数参数
+const dest = resolve(__dirname, "../");
+const fileName = "NeteaseCloudMusicApi-master.zip";
+const options = {
+ hostname: "github.91chifun.workers.dev",
+ path: `//https://github.com/Binaryify/NeteaseCloudMusicApi/archive/master.zip`,
+};
+
+// 完整的流程控制
+/**
+ * 1. 检查本地文件是否已有
+ * 2. 下载默认/指定版本的 zip 压缩包,等待下载
+ * 3. 解压缩
+ * 4. 进入目录安装依赖 npm install
+ */
+
+function fix2(number) {
+ return number.toFixed(2);
+}
+
+async function download(options, fileName, callback) {
+ return await new Promise((resolve, reject) => {
+ const destPath = join(__dirname, "../" + fileName);
+ // Check if exist
+ if (fs.existsSync(destPath)) return resolve(destPath);
+
+ const file = fs.createWriteStream(destPath);
+ const request = https.get(options, (res) => {
+ let len = res.headers && parseInt(res.headers["content-length"], 10);
+ let cur = 0;
+ // 1048576 - bytes in 1Megabyte
+ const MEGA = 1048576;
+ let total = 0;
+ if (len) {
+ total = len / MEGA;
+ }
+ if (!len) {
+ console.log(
+ "Downloading, but can not get content-length, please be patient."
+ );
+ }
+ res.on("data", (chunk) => {
+ if (len) {
+ cur += chunk.length;
+ console.log(
+ `Downloading ${fix2((100.0 * cur) / len)}% ${fix2(
+ cur / MEGA
+ )}/${fix2(total)}mb`
+ );
+ }
+ });
+ res.on("end", () => {
+ callback("Downloading complete!");
+ });
+ res.pipe(file);
+ file.on("finish", () => {
+ file.close(() => {
+ callback("File wrote complete!");
+ resolve(destPath);
+ });
+ });
+ file.on("error", (err) => {
+ fs.unlink(destPath);
+ reject(err);
+ });
+ request.on("error", (err) => {
+ console.log("Error: " + err.message);
+ });
+ });
+ });
+}
+
+async function unzip(source, target) {
+ try {
+ await extract(source, {
+ dir: target,
+ });
+ console.log("Extraction complete");
+ return true;
+ } catch (err) {
+ // handle any errors
+ if (err.message === "end of central directory record signature not found") {
+ console.log("Not a full_downloaded zip file, removed!");
+ fs.unlinkSync(source);
+ }
+ return false;
+ }
+}
+// Download process
+download(options, fileName, (text) => {
+ console.log(text);
+}).then((path) => {
+ console.log(path);
+ // Unzip process
+ return unzip(path, dest);
+});
diff --git a/src/App.vue b/src/App.vue
index 59392be..d834651 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,43 +1,39 @@
-
-
-
-
+
diff --git a/src/api/album.js b/src/api/album.js
index 18425d4..ef39d14 100644
--- a/src/api/album.js
+++ b/src/api/album.js
@@ -1,6 +1,5 @@
-import request from '@/utils/request';
-import { mapTrackPlayableStatus } from '@/utils/common';
-import { cacheAlbum, getAlbumFromCache } from '@/utils/db';
+import request from "@/utils/request";
+import { mapTrackPlayableStatus } from "@/utils/common";
/**
* 获取专辑内容
@@ -8,23 +7,15 @@ import { cacheAlbum, getAlbumFromCache } from '@/utils/db';
* @param {number} id
*/
export function getAlbum(id) {
- const fetchLatest = () => {
- return request({
- url: '/album',
- method: 'get',
- params: {
- id,
- },
- }).then(data => {
- cacheAlbum(id, data);
- data.songs = mapTrackPlayableStatus(data.songs);
- return data;
- });
- };
- fetchLatest();
-
- return getAlbumFromCache(id).then(result => {
- return result ?? fetchLatest();
+ return request({
+ url: "/album",
+ method: "get",
+ params: {
+ id,
+ },
+ }).then((data) => {
+ data.songs = mapTrackPlayableStatus(data.songs);
+ return data;
});
}
@@ -41,8 +32,8 @@ export function getAlbum(id) {
*/
export function newAlbums(params) {
return request({
- url: '/album/new',
- method: 'get',
+ url: "/album/new",
+ method: "get",
params,
});
}
@@ -55,8 +46,8 @@ export function newAlbums(params) {
*/
export function albumDynamicDetail(id) {
return request({
- url: '/album/detail/dynamic',
- method: 'get',
+ url: "/album/detail/dynamic",
+ method: "get",
params: { id, timestamp: new Date().getTime() },
});
}
@@ -72,8 +63,8 @@ export function albumDynamicDetail(id) {
*/
export function likeAAlbum(params) {
return request({
- url: '/album/sub',
- method: 'post',
+ url: "/album/sub",
+ method: "post",
params,
});
}
diff --git a/src/api/artist.js b/src/api/artist.js
index 925df45..31b0742 100644
--- a/src/api/artist.js
+++ b/src/api/artist.js
@@ -1,7 +1,5 @@
-import request from '@/utils/request';
-import { mapTrackPlayableStatus } from '@/utils/common';
-import { isAccountLoggedIn } from '@/utils/auth';
-import { getTrackDetail } from '@/api/track';
+import request from "@/utils/request";
+import { mapTrackPlayableStatus } from "@/utils/common";
/**
* 获取歌手单曲
@@ -10,19 +8,13 @@ import { getTrackDetail } from '@/api/track';
*/
export function getArtist(id) {
return request({
- url: '/artists',
- method: 'get',
+ url: "/artists",
+ method: "get",
params: {
id,
timestamp: new Date().getTime(),
},
- }).then(async data => {
- if (!isAccountLoggedIn()) {
- const trackIDs = data.hotSongs.map(t => t.id);
- const tracks = await getTrackDetail(trackIDs.join(','));
- data.hotSongs = tracks.songs;
- return data;
- }
+ }).then((data) => {
data.hotSongs = mapTrackPlayableStatus(data.hotSongs);
return data;
});
@@ -41,8 +33,8 @@ export function getArtist(id) {
*/
export function getArtistAlbum(params) {
return request({
- url: '/artist/album',
- method: 'get',
+ url: "/artist/album",
+ method: "get",
params,
});
}
@@ -58,14 +50,12 @@ export function getArtistAlbum(params) {
* @param {number=} type
*/
export function toplistOfArtists(type = null) {
- let params = {};
- if (type) {
- params.type = type;
- }
return request({
- url: '/toplist/artist',
- method: 'get',
- params,
+ url: "/toplist/artist",
+ method: "get",
+ params: {
+ type,
+ },
});
}
/**
@@ -77,8 +67,8 @@ export function toplistOfArtists(type = null) {
*/
export function artistMv(params) {
return request({
- url: '/artist/mv',
- method: 'get',
+ url: "/artist/mv",
+ method: "get",
params,
});
}
@@ -94,8 +84,8 @@ export function artistMv(params) {
*/
export function followAArtist(params) {
return request({
- url: '/artist/sub',
- method: 'post',
+ url: "/artist/sub",
+ method: "post",
params,
});
}
@@ -108,8 +98,8 @@ export function followAArtist(params) {
*/
export function similarArtists(id) {
return request({
- url: '/simi/artist',
- method: 'post',
+ url: "/simi/artist",
+ method: "post",
params: { id },
});
}
diff --git a/src/api/auth.js b/src/api/auth.js
index 294f551..461ac01 100644
--- a/src/api/auth.js
+++ b/src/api/auth.js
@@ -1,4 +1,4 @@
-import request from '@/utils/request';
+import request from "@/utils/request";
/**
* 手机登录
@@ -14,12 +14,11 @@ import request from '@/utils/request';
*/
export function loginWithPhone(params) {
return request({
- url: '/login/cellphone',
- method: 'post',
+ url: "/login/cellphone",
+ method: "post",
params,
});
}
-
/**
* 邮箱登录
* - email: 163 网易邮箱
@@ -32,60 +31,12 @@ export function loginWithPhone(params) {
*/
export function loginWithEmail(params) {
return request({
- url: '/login',
- method: 'post',
+ url: "/login",
+ method: "post",
params,
});
}
-/**
- * 二维码key生成接口
- */
-export function loginQrCodeKey() {
- return request({
- url: '/login/qr/key',
- method: 'get',
- params: {
- timestamp: new Date().getTime(),
- },
- });
-}
-
-/**
- * 二维码生成接口
- * 说明: 调用此接口传入上一个接口生成的key可生成二维码图片的base64和二维码信息,
- * 可使用base64展示图片,或者使用二维码信息内容自行使用第三方二维码生产库渲染二维码
- * @param {Object} params
- * @param {string} params.key
- * @param {string=} params.qrimg 传入后会额外返回二维码图片base64编码
- */
-export function loginQrCodeCreate(params) {
- return request({
- url: '/login/qr/create',
- method: 'get',
- params: {
- ...params,
- timestamp: new Date().getTime(),
- },
- });
-}
-
-/**
- * 二维码检测扫码状态接口
- * 说明: 轮询此接口可获取二维码扫码状态,800为二维码过期,801为等待扫码,802为待确认,803为授权登录成功(803状态码下会返回cookies)
- * @param {string} key
- */
-export function loginQrCodeCheck(key) {
- return request({
- url: '/login/qr/check',
- method: 'get',
- params: {
- key,
- timestamp: new Date().getTime(),
- },
- });
-}
-
/**
* 刷新登录
* 说明 : 调用此接口 , 可刷新登录状态
@@ -93,8 +44,8 @@ export function loginQrCodeCheck(key) {
*/
export function refreshCookie() {
return request({
- url: '/login/refresh',
- method: 'post',
+ url: "/login/refresh",
+ method: "post",
});
}
@@ -104,7 +55,7 @@ export function refreshCookie() {
*/
export function logout() {
return request({
- url: '/logout',
- method: 'post',
+ url: "/logout",
+ method: "post",
});
}
diff --git a/src/api/lastfm.js b/src/api/lastfm.js
deleted file mode 100644
index 41ad9c5..0000000
--- a/src/api/lastfm.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// Last.fm API documents 👉 https://www.last.fm/api
-
-import axios from 'axios';
-import md5 from 'crypto-js/md5';
-
-const apiKey = process.env.VUE_APP_LASTFM_API_KEY;
-const apiSharedSecret = process.env.VUE_APP_LASTFM_API_SHARED_SECRET;
-const baseUrl = window.location.origin;
-const url = 'https://ws.audioscrobbler.com/2.0/';
-
-const sign = params => {
- const sortParamsKeys = Object.keys(params).sort();
- const sortedParams = sortParamsKeys.reduce((acc, key) => {
- acc[key] = params[key];
- return acc;
- }, {});
- let signature = '';
- for (const [key, value] of Object.entries(sortedParams)) {
- signature += `${key}${value}`;
- }
- return md5(signature + apiSharedSecret).toString();
-};
-
-export function auth() {
- const url = process.env.IS_ELECTRON
- ? `https://www.last.fm/api/auth/?api_key=${apiKey}&cb=${baseUrl}/#/lastfm/callback`
- : `https://www.last.fm/api/auth/?api_key=${apiKey}&cb=${baseUrl}/lastfm/callback`;
- window.open(url);
-}
-
-export function authGetSession(token) {
- const signature = md5(
- `api_key${apiKey}methodauth.getSessiontoken${token}${apiSharedSecret}`
- ).toString();
- return axios({
- url,
- method: 'GET',
- params: {
- method: 'auth.getSession',
- format: 'json',
- api_key: apiKey,
- api_sig: signature,
- token,
- },
- });
-}
-
-export function trackUpdateNowPlaying(params) {
- params.api_key = apiKey;
- params.method = 'track.updateNowPlaying';
- params.sk = JSON.parse(localStorage.getItem('lastfm'))['key'];
- const signature = sign(params);
-
- return axios({
- url,
- method: 'POST',
- params: {
- ...params,
- api_sig: signature,
- format: 'json',
- },
- });
-}
-
-export function trackScrobble(params) {
- params.api_key = apiKey;
- params.method = 'track.scrobble';
- params.sk = JSON.parse(localStorage.getItem('lastfm'))['key'];
- const signature = sign(params);
-
- return axios({
- url,
- method: 'POST',
- params: {
- ...params,
- api_sig: signature,
- format: 'json',
- },
- });
-}
diff --git a/src/api/mv.js b/src/api/mv.js
index ecd2b10..f294785 100644
--- a/src/api/mv.js
+++ b/src/api/mv.js
@@ -1,4 +1,4 @@
-import request from '@/utils/request';
+import request from "@/utils/request";
/**
* 获取 mv 数据
@@ -9,8 +9,8 @@ import request from '@/utils/request';
*/
export function mvDetail(mvid) {
return request({
- url: '/mv/detail',
- method: 'get',
+ url: "/mv/detail",
+ method: "get",
params: {
mvid,
timestamp: new Date().getTime(),
@@ -30,8 +30,8 @@ export function mvDetail(mvid) {
*/
export function mvUrl(params) {
return request({
- url: '/mv/url',
- method: 'get',
+ url: "/mv/url",
+ method: "get",
params,
});
}
@@ -43,8 +43,8 @@ export function mvUrl(params) {
*/
export function simiMv(mvid) {
return request({
- url: '/simi/mv',
- method: 'get',
+ url: "/simi/mv",
+ method: "get",
params: { mvid },
});
}
@@ -62,8 +62,8 @@ export function simiMv(mvid) {
export function likeAMV(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/mv/sub',
- method: 'post',
+ url: "/mv/sub",
+ method: "post",
params,
});
}
diff --git a/src/api/others.js b/src/api/others.js
index 5c3cd63..f63423a 100644
--- a/src/api/others.js
+++ b/src/api/others.js
@@ -1,5 +1,5 @@
-import request from '@/utils/request';
-import { mapTrackPlayableStatus } from '@/utils/common';
+import request from "@/utils/request";
+import { mapTrackPlayableStatus } from "@/utils/common";
/**
* 搜索
@@ -18,33 +18,12 @@ import { mapTrackPlayableStatus } from '@/utils/common';
*/
export function search(params) {
return request({
- url: '/search',
- method: 'get',
+ url: "/search",
+ method: "get",
params,
- }).then(data => {
- if (data.result?.song !== undefined)
+ }).then((data) => {
+ if (data.result.song !== undefined)
data.result.song.songs = mapTrackPlayableStatus(data.result.song.songs);
return data;
});
}
-
-export function personalFM() {
- return request({
- url: '/personal_fm',
- method: 'get',
- params: {
- timestamp: new Date().getTime(),
- },
- });
-}
-
-export function fmTrash(id) {
- return request({
- url: '/fm_trash',
- method: 'post',
- params: {
- timestamp: new Date().getTime(),
- id,
- },
- });
-}
diff --git a/src/api/playlist.js b/src/api/playlist.js
index 08177ea..b0e5994 100644
--- a/src/api/playlist.js
+++ b/src/api/playlist.js
@@ -1,5 +1,5 @@
-import request from '@/utils/request';
-import { mapTrackPlayableStatus } from '@/utils/common';
+import request from "@/utils/request";
+import { mapTrackPlayableStatus } from "@/utils/common";
/**
* 推荐歌单
@@ -11,8 +11,8 @@ import { mapTrackPlayableStatus } from '@/utils/common';
*/
export function recommendPlaylist(params) {
return request({
- url: '/personalized',
- method: 'get',
+ url: "/personalized",
+ method: "get",
params,
});
}
@@ -24,12 +24,9 @@ export function recommendPlaylist(params) {
*/
export function dailyRecommendPlaylist(params) {
return request({
- url: '/recommend/resource',
- method: 'get',
- params: {
- params,
- timestamp: Date.now(),
- },
+ url: "/recommend/resource",
+ method: "get",
+ params,
});
}
/**
@@ -46,16 +43,14 @@ export function getPlaylistDetail(id, noCache = false) {
let params = { id };
if (noCache) params.timestamp = new Date().getTime();
return request({
- url: '/playlist/detail',
- method: 'get',
+ url: "/playlist/detail",
+ method: "get",
params,
- }).then(data => {
- if (data.playlist) {
- data.playlist.tracks = mapTrackPlayableStatus(
- data.playlist.tracks,
- data.privileges || []
- );
- }
+ }).then((data) => {
+ data.playlist.tracks = mapTrackPlayableStatus(
+ data.playlist.tracks,
+ data.privileges || []
+ );
return data;
});
}
@@ -72,8 +67,8 @@ export function getPlaylistDetail(id, noCache = false) {
*/
export function highQualityPlaylist(params) {
return request({
- url: '/top/playlist/highquality',
- method: 'get',
+ url: "/top/playlist/highquality",
+ method: "get",
params,
});
}
@@ -91,8 +86,8 @@ export function highQualityPlaylist(params) {
*/
export function topPlaylist(params) {
return request({
- url: '/top/playlist',
- method: 'get',
+ url: "/top/playlist",
+ method: "get",
params,
});
}
@@ -103,8 +98,8 @@ export function topPlaylist(params) {
*/
export function playlistCatlist() {
return request({
- url: '/playlist/catlist',
- method: 'get',
+ url: "/playlist/catlist",
+ method: "get",
});
}
@@ -114,8 +109,8 @@ export function playlistCatlist() {
*/
export function toplists() {
return request({
- url: '/toplist',
- method: 'get',
+ url: "/toplist",
+ method: "get",
});
}
@@ -131,8 +126,8 @@ export function toplists() {
export function subscribePlaylist(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/playlist/subscribe',
- method: 'post',
+ url: "/playlist/subscribe",
+ method: "post",
params,
});
}
@@ -145,8 +140,8 @@ export function subscribePlaylist(params) {
*/
export function deletePlaylist(id) {
return request({
- url: '/playlist/delete',
- method: 'post',
+ url: "/playlist/delete",
+ method: "post",
params: { id },
});
}
@@ -165,8 +160,8 @@ export function deletePlaylist(id) {
export function createPlaylist(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/playlist/create',
- method: 'post',
+ url: "/playlist/create",
+ method: "post",
params,
});
}
@@ -183,47 +178,8 @@ export function createPlaylist(params) {
export function addOrRemoveTrackFromPlaylist(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/playlist/tracks',
- method: 'post',
- params,
- });
-}
-
-/**
- * 每日推荐歌曲
- * 说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 )
- * @param {Object} params
- * @param {string} params.op
- * @param {string} params.pid
- */
-export function dailyRecommendTracks() {
- return request({
- url: '/recommend/songs',
- method: 'get',
- params: { timestamp: new Date().getTime() },
- }).then(result => {
- result.data.dailySongs = mapTrackPlayableStatus(
- result.data.dailySongs,
- result.data.privileges
- );
- return result;
- });
-}
-
-/**
- * 心动模式/智能播放
- * 说明 : 登录后调用此接口 , 可获取心动模式/智能播放列表 必选参数 : id : 歌曲 id
- * - id : 歌曲 id
- * - pid : 歌单 id
- * - sid : 要开始播放的歌曲的 id (可选参数)
- * @param {Object} params
- * @param {number=} params.id
- * @param {number=} params.pid
- */
-export function intelligencePlaylist(params) {
- return request({
- url: '/playmode/intelligence/list',
- method: 'get',
+ url: "/playlist/tracks",
+ method: "post",
params,
});
}
diff --git a/src/api/track.js b/src/api/track.js
index 490c91c..43a7d2a 100644
--- a/src/api/track.js
+++ b/src/api/track.js
@@ -1,13 +1,6 @@
-import store from '@/store';
-import request from '@/utils/request';
-import { mapTrackPlayableStatus } from '@/utils/common';
-import {
- cacheTrackDetail,
- getTrackDetailFromCache,
- cacheLyric,
- getLyricFromCache,
-} from '@/utils/db';
-
+import store from "@/store";
+import request from "@/utils/request";
+import { mapTrackPlayableStatus } from "@/utils/common";
/**
* 获取音乐 url
* 说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口, 传入的音乐 id( 可多个 , 用逗号隔开 ), 可以获取对应的音乐的 url,
@@ -15,85 +8,51 @@ import {
* @param {string} id - 音乐的 id,例如 id=405998841,33894312
*/
export function getMP3(id) {
- const getBr = () => {
- // 当返回的 quality >= 400000时,就会优先返回 hi-res
- const quality = store.state.settings?.musicQuality ?? '320000';
- return quality === 'flac' ? '350000' : quality;
- };
-
+ let br =
+ store.state.settings?.musicQuality !== undefined
+ ? store.state.settings.musicQuality
+ : 320000;
return request({
- url: '/song/url',
- method: 'get',
+ url: "/song/url",
+ method: "get",
params: {
id,
- br: getBr(),
+ br,
},
});
}
-
/**
* 获取歌曲详情
* 说明 : 调用此接口 , 传入音乐 id(支持多个 id, 用 , 隔开), 可获得歌曲详情(注意:歌曲封面现在需要通过专辑内容接口获取)
* @param {string} ids - 音乐 id, 例如 ids=405998841,33894312
*/
export function getTrackDetail(ids) {
- const fetchLatest = () => {
- return request({
- url: '/song/detail',
- method: 'get',
- params: {
- ids,
- },
- }).then(data => {
- data.songs.map(song => {
- const privileges = data.privileges.find(t => t.id === song.id);
- cacheTrackDetail(song, privileges);
- });
- data.songs = mapTrackPlayableStatus(data.songs, data.privileges);
- return data;
- });
- };
- fetchLatest();
-
- let idsInArray = [String(ids)];
- if (typeof ids === 'string') {
- idsInArray = ids.split(',');
- }
-
- return getTrackDetailFromCache(idsInArray).then(result => {
- if (result) {
- result.songs = mapTrackPlayableStatus(result.songs, result.privileges);
- }
- return result ?? fetchLatest();
+ return request({
+ url: "/song/detail",
+ method: "get",
+ params: {
+ ids,
+ },
+ }).then((data) => {
+ data.songs = mapTrackPlayableStatus(data.songs, data.privileges);
+ return data;
});
}
-
/**
* 获取歌词
* 说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 )
* @param {number} id - 音乐 id
*/
+
export function getLyric(id) {
- const fetchLatest = () => {
- return request({
- url: '/lyric',
- method: 'get',
- params: {
- id,
- },
- }).then(result => {
- cacheLyric(id, result);
- return result;
- });
- };
-
- fetchLatest();
-
- return getLyricFromCache(id).then(result => {
- return result ?? fetchLatest();
+ return request({
+ url: "/lyric",
+ method: "get",
+ params: {
+ id,
+ },
});
}
-
/**
* 新歌速递
* 说明 : 调用此接口 , 可获取新歌速递
@@ -101,14 +60,13 @@ export function getLyric(id) {
*/
export function topSong(type) {
return request({
- url: '/top/song',
- method: 'get',
+ url: "/top/song",
+ method: "get",
params: {
type,
},
});
}
-
/**
* 喜欢音乐
* 说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐
@@ -121,8 +79,8 @@ export function topSong(type) {
export function likeATrack(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/like',
- method: 'get',
+ url: "/like",
+ method: "get",
params,
});
}
@@ -141,8 +99,8 @@ export function likeATrack(params) {
export function scrobble(params) {
params.timestamp = new Date().getTime();
return request({
- url: '/scrobble',
- method: 'get',
+ url: "/scrobble",
+ method: "get",
params,
});
}
diff --git a/src/api/user.js b/src/api/user.js
index ec02014..aeeb719 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -1,4 +1,4 @@
-import request from '@/utils/request';
+import request from "@/utils/request";
/**
* 获取用户详情
@@ -8,25 +8,10 @@ import request from '@/utils/request';
*/
export function userDetail(uid) {
return request({
- url: '/user/detail',
- method: 'get',
+ url: "/user/detail",
+ method: "get",
params: {
uid,
- timestamp: new Date().getTime(),
- },
- });
-}
-
-/**
- * 获取账号详情
- * 说明 : 登录后调用此接口 ,可获取用户账号信息
- */
-export function userAccount() {
- return request({
- url: '/user/account',
- method: 'get',
- params: {
- timestamp: new Date().getTime(),
},
});
}
@@ -44,25 +29,8 @@ export function userAccount() {
*/
export function userPlaylist(params) {
return request({
- url: '/user/playlist',
- method: 'get',
- params,
- });
-}
-
-/**
- * 获取用户播放记录
- * 说明 : 登录后调用此接口 , 传入用户 id, 可获取用户播放记录
- * - uid : 用户 id
- * - type : type=1 时只返回 weekData, type=0 时返回 allData
- * @param {Object} params
- * @param {number} params.uid
- * @param {number} params.type
- */
-export function userPlayHistory(params) {
- return request({
- url: '/user/record',
- method: 'get',
+ url: "/user/playlist",
+ method: "get",
params,
});
}
@@ -75,8 +43,8 @@ export function userPlayHistory(params) {
*/
export function userLikedSongsIDs(uid) {
return request({
- url: '/likelist',
- method: 'get',
+ url: "/likelist",
+ method: "get",
params: {
uid,
timestamp: new Date().getTime(),
@@ -92,8 +60,8 @@ export function userLikedSongsIDs(uid) {
*/
export function dailySignin(type = 0) {
return request({
- url: '/daily_signin',
- method: 'post',
+ url: "/daily_signin",
+ method: "post",
params: {
type,
timestamp: new Date().getTime(),
@@ -104,18 +72,17 @@ export function dailySignin(type = 0) {
/**
* 获取收藏的专辑(需要登录)
* 说明 : 调用此接口可获取到用户收藏的专辑
- * - limit : 返回数量 , 默认为 25
- * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*25, 其中 25 为 limit 的值 , 默认为 0
+ * - limit : 返回数量 , 默认为 30
+ * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*30, 其中 30 为 limit 的值 , 默认为 0
* @param {Object} params
* @param {number} params.limit
* @param {number=} params.offset
*/
-export function likedAlbums(params) {
+export function likedAlbums() {
return request({
- url: '/album/sublist',
- method: 'get',
+ url: "/album/sublist",
+ method: "get",
params: {
- limit: params.limit,
timestamp: new Date().getTime(),
},
});
@@ -125,12 +92,11 @@ export function likedAlbums(params) {
* 获取收藏的歌手(需要登录)
* 说明 : 调用此接口可获取到用户收藏的歌手
*/
-export function likedArtists(params) {
+export function likedArtists() {
return request({
- url: '/artist/sublist',
- method: 'get',
+ url: "/artist/sublist",
+ method: "get",
params: {
- limit: params.limit,
timestamp: new Date().getTime(),
},
});
@@ -140,82 +106,12 @@ export function likedArtists(params) {
* 获取收藏的MV(需要登录)
* 说明 : 调用此接口可获取到用户收藏的MV
*/
-export function likedMVs(params) {
+export function likedMVs() {
return request({
- url: '/mv/sublist',
- method: 'get',
- params: {
- limit: params.limit,
- timestamp: new Date().getTime(),
- },
- });
-}
-
-/**
- * 上传歌曲到云盘(需要登录)
- */
-export function uploadSong(file) {
- let formData = new FormData();
- formData.append('songFile', file);
- return request({
- url: '/cloud',
- method: 'post',
+ url: "/mv/sublist",
+ method: "get",
params: {
timestamp: new Date().getTime(),
},
- data: formData,
- headers: {
- 'Content-Type': 'multipart/form-data',
- },
- timeout: 200000,
- }).catch(error => {
- alert(`上传失败,Error: ${error}`);
- });
-}
-
-/**
- * 获取云盘歌曲(需要登录)
- * 说明 : 登录后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一 次 /song/url 获取 url
- * - limit : 返回数量 , 默认为 200
- * - offset : 偏移数量,用于分页 , 如 :( 页数 -1)*200, 其中 200 为 limit 的值 , 默认为 0
- * @param {Object} params
- * @param {number} params.limit
- * @param {number=} params.offset
- */
-export function cloudDisk(params = {}) {
- params.timestamp = new Date().getTime();
- return request({
- url: '/user/cloud',
- method: 'get',
- params,
- });
-}
-
-/**
- * 获取云盘歌曲详情(需要登录)
- */
-export function cloudDiskTrackDetail(id) {
- return request({
- url: '/user/cloud/detail',
- method: 'get',
- params: {
- timestamp: new Date().getTime(),
- id,
- },
- });
-}
-
-/**
- * 删除云盘歌曲(需要登录)
- * @param {Array} id
- */
-export function cloudDiskTrackDelete(id) {
- return request({
- url: '/user/cloud/del',
- method: 'get',
- params: {
- timestamp: new Date().getTime(),
- id,
- },
});
}
diff --git a/src/assets/css/global.scss b/src/assets/css/global.scss
deleted file mode 100644
index 00c3915..0000000
--- a/src/assets/css/global.scss
+++ /dev/null
@@ -1,135 +0,0 @@
-@font-face {
- font-family: 'Barlow';
- font-weight: normal;
- src: url('~@/assets/fonts/Barlow-Regular.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-Regular.ttf') format('truetype');
-}
-@font-face {
- font-family: 'Barlow';
- font-weight: medium;
- src: url('~@/assets/fonts/Barlow-Medium.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-Medium.ttf') format('truetype');
-}
-@font-face {
- font-family: 'Barlow';
- font-weight: 600;
- src: url('~@/assets/fonts/Barlow-SemiBold.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-SemiBold.ttf') format('truetype');
-}
-@font-face {
- font-family: 'Barlow';
- font-weight: bold;
- src: url('~@/assets/fonts/Barlow-Bold.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-Bold.ttf') format('truetype');
-}
-@font-face {
- font-family: 'Barlow';
- font-weight: 800;
- src: url('~@/assets/fonts/Barlow-ExtraBold.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-ExtraBold.ttf') format('truetype');
-}
-@font-face {
- font-family: 'Barlow';
- font-weight: 900;
- src: url('~@/assets/fonts/Barlow-Black.woff2') format('woff2'),
- url('~@/assets/fonts/Barlow-Black.ttf') format('truetype');
-}
-
-:root {
- --color-body-bg: #ffffff;
- --color-text: #000;
- --color-primary: #335eea;
- --color-primary-bg: #eaeffd;
- --color-secondary: #7a7a7b;
- --color-secondary-bg: #f5f5f7;
- --color-navbar-bg: rgba(255, 255, 255, 0.86);
- --color-primary-bg-for-transparent: rgba(189, 207, 255, 0.28);
- --color-secondary-bg-for-transparent: rgba(209, 209, 214, 0.28);
- --html-overflow-y: overlay;
-}
-
-[data-theme='dark'] {
- --color-body-bg: #222222;
- --color-text: #ffffff;
- --color-primary: #335eea;
- --color-primary-bg: #bbcdff;
- --color-secondary: #7a7a7b;
- --color-secondary-bg: #323232;
- --color-navbar-bg: rgba(34, 34, 34, 0.86);
- --color-primary-bg-for-transparent: rgba(255, 255, 255, 0.12);
- --color-secondary-bg-for-transparent: rgba(255, 255, 255, 0.08);
-}
-
-#app,
-input {
- font-family: 'Barlow', ui-sans-serif, system-ui, -apple-system,
- BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei,
- Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif,
- microsoft uighur;
-}
-body {
- background-color: var(--color-body-bg);
-}
-
-html {
- overflow-y: var(--html-overflow-y);
- min-width: 768px;
- overscroll-behavior: none;
-}
-
-select,
-button {
- font-family: inherit;
-}
-button {
- background: none;
- border: none;
- cursor: pointer;
- user-select: none;
-}
-input,
-button {
- &:focus {
- outline: none;
- }
-}
-a {
- color: inherit;
- text-decoration: none;
- cursor: pointer;
- &:hover {
- text-decoration: underline;
- }
-}
-
-[data-electron='yes'] {
- button,
- .navigation-links a,
- .playlist-info .description {
- cursor: default !important;
- }
-}
-
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: transparent;
- border-left: 1px solid rgba(128, 128, 128, 0.18);
- background: var(--color-body-bg);
-}
-
-::-webkit-scrollbar-thumb {
- -webkit-border-radius: 10px;
- border-radius: 10px;
- background: rgba(128, 128, 128, 0.38);
-}
-
-[data-theme='dark'] ::-webkit-scrollbar-thumb {
- background: var(--color-secondary-bg);
-}
-
-.user-select-none {
- user-select: none;
-}
diff --git a/src/assets/css/plyr.css b/src/assets/css/plyr.css
index 1a128f0..584ba89 100644
--- a/src/assets/css/plyr.css
+++ b/src/assets/css/plyr.css
@@ -265,17 +265,17 @@ a.plyr__control::before {
display: none;
}
-.plyr [data-plyr='airplay'],
-.plyr [data-plyr='captions'],
-.plyr [data-plyr='fullscreen'],
-.plyr [data-plyr='pip'] {
+.plyr [data-plyr="airplay"],
+.plyr [data-plyr="captions"],
+.plyr [data-plyr="fullscreen"],
+.plyr [data-plyr="pip"] {
display: none;
}
-.plyr--airplay-supported [data-plyr='airplay'],
-.plyr--captions-enabled [data-plyr='captions'],
-.plyr--fullscreen-enabled [data-plyr='fullscreen'],
-.plyr--pip-supported [data-plyr='pip'] {
+.plyr--airplay-supported [data-plyr="airplay"],
+.plyr--captions-enabled [data-plyr="captions"],
+.plyr--fullscreen-enabled [data-plyr="fullscreen"],
+.plyr--pip-supported [data-plyr="pip"] {
display: inline-block;
}
@@ -288,11 +288,11 @@ a.plyr__control::before {
transition: transform 0.3s ease;
}
-.plyr__menu .plyr__control[aria-expanded='true'] svg {
+.plyr__menu .plyr__control[aria-expanded="true"] svg {
transform: rotate(90deg);
}
-.plyr__menu .plyr__control[aria-expanded='true'] .plyr__tooltip {
+.plyr__menu .plyr__control[aria-expanded="true"] .plyr__tooltip {
display: none;
}
@@ -327,7 +327,7 @@ a.plyr__control::before {
border: var(--plyr-menu-arrow-size, 4px) solid transparent;
border-top-color: rgba(255, 255, 255, 0.9);
border-top-color: var(--plyr-menu-background, rgba(255, 255, 255, 0.9));
- content: '';
+ content: "";
height: 0;
position: absolute;
right: calc(((18px / 2) + calc(10px * 0.7)) - (4px / 2));
@@ -341,18 +341,18 @@ a.plyr__control::before {
width: 0;
}
-.plyr__menu__container [role='menu'] {
+.plyr__menu__container [role="menu"] {
padding: calc(10px * 0.7);
padding: calc(var(--plyr-control-spacing, 10px) * 0.7);
}
-.plyr__menu__container [role='menuitem'],
-.plyr__menu__container [role='menuitemradio'] {
+.plyr__menu__container [role="menuitem"],
+.plyr__menu__container [role="menuitemradio"] {
margin-top: 2px;
}
-.plyr__menu__container [role='menuitem']:first-child,
-.plyr__menu__container [role='menuitemradio']:first-child {
+.plyr__menu__container [role="menuitem"]:first-child,
+.plyr__menu__container [role="menuitemradio"]:first-child {
margin-top: 0;
}
@@ -386,7 +386,7 @@ a.plyr__control::before {
.plyr__menu__container .plyr__control::after {
border: 4px solid transparent;
border: var(--plyr-menu-item-arrow-size, 4px) solid transparent;
- content: '';
+ content: "";
position: absolute;
top: 50%;
transform: translateY(-50%);
@@ -441,7 +441,7 @@ a.plyr__control::before {
background: var(--plyr-menu-back-border-color, #dcdfe5);
box-shadow: 0 1px 0 #fff;
box-shadow: 0 1px 0 var(--plyr-menu-back-border-shadow-color, #fff);
- content: '';
+ content: "";
height: 1px;
left: 0;
margin-top: calc(calc(10px * 0.7) / 2);
@@ -457,19 +457,19 @@ a.plyr__control::before {
border-right-color: currentColor;
}
-.plyr__menu__container .plyr__control[role='menuitemradio'] {
+.plyr__menu__container .plyr__control[role="menuitemradio"] {
padding-left: calc(10px * 0.7);
padding-left: calc(var(--plyr-control-spacing, 10px) * 0.7);
}
-.plyr__menu__container .plyr__control[role='menuitemradio']::after,
-.plyr__menu__container .plyr__control[role='menuitemradio']::before {
+.plyr__menu__container .plyr__control[role="menuitemradio"]::after,
+.plyr__menu__container .plyr__control[role="menuitemradio"]::before {
border-radius: 100%;
}
-.plyr__menu__container .plyr__control[role='menuitemradio']::before {
+.plyr__menu__container .plyr__control[role="menuitemradio"]::before {
background: rgba(0, 0, 0, 0.1);
- content: '';
+ content: "";
display: block;
flex-shrink: 0;
height: 16px;
@@ -479,7 +479,7 @@ a.plyr__control::before {
width: 16px;
}
-.plyr__menu__container .plyr__control[role='menuitemradio']::after {
+.plyr__menu__container .plyr__control[role="menuitemradio"]::after {
background: #fff;
border: 0;
height: 6px;
@@ -492,7 +492,7 @@ a.plyr__control::before {
}
.plyr__menu__container
- .plyr__control[role='menuitemradio'][aria-checked='true']::before {
+ .plyr__control[role="menuitemradio"][aria-checked="true"]::before {
background: #00b3ff;
background: var(
--plyr-control-toggle-checked-background,
@@ -501,14 +501,14 @@ a.plyr__control::before {
}
.plyr__menu__container
- .plyr__control[role='menuitemradio'][aria-checked='true']::after {
+ .plyr__control[role="menuitemradio"][aria-checked="true"]::after {
opacity: 1;
transform: translateY(-50%) scale(1);
}
.plyr__menu__container
- .plyr__control[role='menuitemradio'].plyr__tab-focus::before,
-.plyr__menu__container .plyr__control[role='menuitemradio']:hover::before {
+ .plyr__control[role="menuitemradio"].plyr__tab-focus::before,
+.plyr__menu__container .plyr__control[role="menuitemradio"]:hover::before {
background: rgba(35, 40, 47, 0.1);
}
@@ -524,7 +524,7 @@ a.plyr__control::before {
pointer-events: none;
}
-.plyr--full-ui input[type='range'] {
+.plyr--full-ui input[type="range"] {
-webkit-appearance: none;
background: 0 0;
border: 0;
@@ -547,7 +547,7 @@ a.plyr__control::before {
width: 100%;
}
-.plyr--full-ui input[type='range']::-webkit-slider-runnable-track {
+.plyr--full-ui input[type="range"]::-webkit-slider-runnable-track {
background: 0 0;
border: 0;
border-radius: calc(5px / 2);
@@ -566,7 +566,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui input[type='range']::-webkit-slider-thumb {
+.plyr--full-ui input[type="range"]::-webkit-slider-thumb {
background: #fff;
background: var(--plyr-range-thumb-background, #fff);
border: 0;
@@ -596,7 +596,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui input[type='range']::-moz-range-track {
+.plyr--full-ui input[type="range"]::-moz-range-track {
background: 0 0;
border: 0;
border-radius: calc(5px / 2);
@@ -608,7 +608,7 @@ a.plyr__control::before {
user-select: none;
}
-.plyr--full-ui input[type='range']::-moz-range-thumb {
+.plyr--full-ui input[type="range"]::-moz-range-thumb {
background: #fff;
background: var(--plyr-range-thumb-background, #fff);
border: 0;
@@ -628,7 +628,7 @@ a.plyr__control::before {
width: var(--plyr-range-thumb-height, 13px);
}
-.plyr--full-ui input[type='range']::-moz-range-progress {
+.plyr--full-ui input[type="range"]::-moz-range-progress {
background: currentColor;
border-radius: calc(5px / 2);
border-radius: calc(var(--plyr-range-track-height, 5px) / 2);
@@ -636,7 +636,7 @@ a.plyr__control::before {
height: var(--plyr-range-track-height, 5px);
}
-.plyr--full-ui input[type='range']::-ms-track {
+.plyr--full-ui input[type="range"]::-ms-track {
background: 0 0;
border: 0;
border-radius: calc(5px / 2);
@@ -650,7 +650,7 @@ a.plyr__control::before {
color: transparent;
}
-.plyr--full-ui input[type='range']::-ms-fill-upper {
+.plyr--full-ui input[type="range"]::-ms-fill-upper {
background: 0 0;
border: 0;
border-radius: calc(5px / 2);
@@ -663,7 +663,7 @@ a.plyr__control::before {
user-select: none;
}
-.plyr--full-ui input[type='range']::-ms-fill-lower {
+.plyr--full-ui input[type="range"]::-ms-fill-lower {
background: 0 0;
border: 0;
border-radius: calc(5px / 2);
@@ -677,7 +677,7 @@ a.plyr__control::before {
background: currentColor;
}
-.plyr--full-ui input[type='range']::-ms-thumb {
+.plyr--full-ui input[type="range"]::-ms-thumb {
background: #fff;
background: var(--plyr-range-thumb-background, #fff);
border: 0;
@@ -698,20 +698,20 @@ a.plyr__control::before {
margin-top: 0;
}
-.plyr--full-ui input[type='range']::-ms-tooltip {
+.plyr--full-ui input[type="range"]::-ms-tooltip {
display: none;
}
-.plyr--full-ui input[type='range']:focus {
+.plyr--full-ui input[type="range"]:focus {
outline: 0;
}
-.plyr--full-ui input[type='range']::-moz-focus-outer {
+.plyr--full-ui input[type="range"]::-moz-focus-outer {
border: 0;
}
.plyr--full-ui
- input[type='range'].plyr__tab-focus::-webkit-slider-runnable-track {
+ input[type="range"].plyr__tab-focus::-webkit-slider-runnable-track {
outline-color: #00b3ff;
outline-color: var(
--plyr-tab-focus-color,
@@ -722,7 +722,7 @@ a.plyr__control::before {
outline-width: 3px;
}
-.plyr--full-ui input[type='range'].plyr__tab-focus::-moz-range-track {
+.plyr--full-ui input[type="range"].plyr__tab-focus::-moz-range-track {
outline-color: #00b3ff;
outline-color: var(
--plyr-tab-focus-color,
@@ -733,7 +733,7 @@ a.plyr__control::before {
outline-width: 3px;
}
-.plyr--full-ui input[type='range'].plyr__tab-focus::-ms-track {
+.plyr--full-ui input[type="range"].plyr__tab-focus::-ms-track {
outline-color: #00b3ff;
outline-color: var(
--plyr-tab-focus-color,
@@ -769,7 +769,7 @@ a.plyr__control::before {
}
.plyr__time + .plyr__time::before {
- content: '\2044';
+ content: "\2044";
margin-right: 10px;
margin-right: var(--plyr-control-spacing, 10px);
}
@@ -821,7 +821,7 @@ a.plyr__control::before {
var(--plyr-tooltip-background, rgba(255, 255, 255, 0.9));
bottom: calc(4px * -1);
bottom: calc(var(--plyr-tooltip-arrow-size, 4px) * -1);
- content: '';
+ content: "";
height: 0;
left: 50%;
position: absolute;
@@ -906,7 +906,7 @@ a.plyr__control::before {
position: relative;
}
-.plyr__progress input[type='range'],
+.plyr__progress input[type="range"],
.plyr__progress__buffer {
margin-left: calc(13px * -0.5);
margin-left: calc(var(--plyr-range-thumb-height, 13px) * -0.5);
@@ -916,7 +916,7 @@ a.plyr__control::before {
width: calc(100% + var(--plyr-range-thumb-height, 13px));
}
-.plyr__progress input[type='range'] {
+.plyr__progress input[type="range"] {
position: relative;
z-index: 2;
}
@@ -1024,7 +1024,7 @@ a.plyr__control::before {
width: 20%;
}
-.plyr__volume input[type='range'] {
+.plyr__volume input[type="range"] {
margin-left: calc(10px / 2);
margin-left: calc(var(--plyr-control-spacing, 10px) / 2);
margin-right: calc(10px / 2);
@@ -1054,7 +1054,7 @@ a.plyr__control::before {
.plyr--audio .plyr__control.plyr__tab-focus,
.plyr--audio .plyr__control:hover,
-.plyr--audio .plyr__control[aria-expanded='true'] {
+.plyr--audio .plyr__control[aria-expanded="true"] {
background: #00b3ff;
background: var(
--plyr-audio-control-background-hover,
@@ -1064,7 +1064,7 @@ a.plyr__control::before {
color: var(--plyr-audio-control-color-hover, #fff);
}
-.plyr--full-ui.plyr--audio input[type='range']::-webkit-slider-runnable-track {
+.plyr--full-ui.plyr--audio input[type="range"]::-webkit-slider-runnable-track {
background-color: rgba(193, 200, 209, 0.6);
background-color: var(
--plyr-audio-range-track-background,
@@ -1072,7 +1072,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--audio input[type='range']::-moz-range-track {
+.plyr--full-ui.plyr--audio input[type="range"]::-moz-range-track {
background-color: rgba(193, 200, 209, 0.6);
background-color: var(
--plyr-audio-range-track-background,
@@ -1080,7 +1080,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--audio input[type='range']::-ms-track {
+.plyr--full-ui.plyr--audio input[type="range"]::-ms-track {
background-color: rgba(193, 200, 209, 0.6);
background-color: var(
--plyr-audio-range-track-background,
@@ -1088,7 +1088,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--audio input[type='range']:active::-webkit-slider-thumb {
+.plyr--full-ui.plyr--audio input[type="range"]:active::-webkit-slider-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(35, 40, 47, 0.1);
box-shadow: var(
@@ -1100,7 +1100,7 @@ a.plyr__control::before {
var(--plyr-audio-range-thumb-active-shadow-color, rgba(35, 40, 47, 0.1));
}
-.plyr--full-ui.plyr--audio input[type='range']:active::-moz-range-thumb {
+.plyr--full-ui.plyr--audio input[type="range"]:active::-moz-range-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(35, 40, 47, 0.1);
box-shadow: var(
@@ -1112,7 +1112,7 @@ a.plyr__control::before {
var(--plyr-audio-range-thumb-active-shadow-color, rgba(35, 40, 47, 0.1));
}
-.plyr--full-ui.plyr--audio input[type='range']:active::-ms-thumb {
+.plyr--full-ui.plyr--audio input[type="range"]:active::-ms-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(35, 40, 47, 0.1);
box-shadow: var(
@@ -1207,7 +1207,7 @@ a.plyr__control::before {
.plyr--video .plyr__control.plyr__tab-focus,
.plyr--video .plyr__control:hover,
-.plyr--video .plyr__control[aria-expanded='true'] {
+.plyr--video .plyr__control[aria-expanded="true"] {
background: #00b3ff;
background: var(
--plyr-video-control-background-hover,
@@ -1258,7 +1258,7 @@ a.plyr__control::before {
display: block;
}
-.plyr--full-ui.plyr--video input[type='range']::-webkit-slider-runnable-track {
+.plyr--full-ui.plyr--video input[type="range"]::-webkit-slider-runnable-track {
background-color: rgba(255, 255, 255, 0.25);
background-color: var(
--plyr-video-range-track-background,
@@ -1266,7 +1266,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--video input[type='range']::-moz-range-track {
+.plyr--full-ui.plyr--video input[type="range"]::-moz-range-track {
background-color: rgba(255, 255, 255, 0.25);
background-color: var(
--plyr-video-range-track-background,
@@ -1274,7 +1274,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--video input[type='range']::-ms-track {
+.plyr--full-ui.plyr--video input[type="range"]::-ms-track {
background-color: rgba(255, 255, 255, 0.25);
background-color: var(
--plyr-video-range-track-background,
@@ -1282,7 +1282,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--video input[type='range']:active::-webkit-slider-thumb {
+.plyr--full-ui.plyr--video input[type="range"]:active::-webkit-slider-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(255, 255, 255, 0.5);
box-shadow: var(
@@ -1297,7 +1297,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--video input[type='range']:active::-moz-range-thumb {
+.plyr--full-ui.plyr--video input[type="range"]:active::-moz-range-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(255, 255, 255, 0.5);
box-shadow: var(
@@ -1312,7 +1312,7 @@ a.plyr__control::before {
);
}
-.plyr--full-ui.plyr--video input[type='range']:active::-ms-thumb {
+.plyr--full-ui.plyr--video input[type="range"]:active::-ms-thumb {
box-shadow: 0 1px 1px rgba(35, 40, 47, 0.15), 0 0 0 1px rgba(35, 40, 47, 0.2),
0 0 0 3px rgba(255, 255, 255, 0.5);
box-shadow: var(
@@ -1713,7 +1713,7 @@ a.plyr__control::before {
var(--plyr-tooltip-background, rgba(255, 255, 255, 0.9));
bottom: calc(4px * -1);
bottom: calc(var(--plyr-tooltip-arrow-size, 4px) * -1);
- content: '';
+ content: "";
height: 0;
left: 50%;
position: absolute;
diff --git a/src/assets/css/slider.css b/src/assets/css/slider.css
index 071210b..2e5f40d 100644
--- a/src/assets/css/slider.css
+++ b/src/assets/css/slider.css
@@ -89,7 +89,7 @@
}
.nyancat .vue-slider-dot-handle {
- background: url('/img/logos/nyancat.gif');
+ background: url("/img/logos/nyancat.gif");
background-size: 36px;
width: 36px;
height: 24px;
@@ -100,11 +100,6 @@
visibility: visible;
}
-.nyancat-stop .vue-slider-dot-handle {
- background-image: url('/img/logos/nyancat-stop.png');
- transition: 300ms;
-}
-
/* lyrics */
.lyrics-page .vue-slider-rail {
background-color: rgba(128, 128, 128, 0.18);
@@ -126,19 +121,10 @@
display: none;
}
-body[data-theme='dark'] .lyrics-page .vue-slider-process {
+body[data-theme="dark"] .lyrics-page .vue-slider-process {
background-color: #fafafa;
}
-body[data-theme='dark'] .lyrics-page .vue-slider-dot-handle {
- background-color: #fff;
-}
-
-.lyrics-page[data-theme='dark'] .vue-slider-rail {
- background-color: rgba(255, 255, 255, 0.18);
-}
-
-.lyrics-page[data-theme='dark'] .vue-slider-process,
-.lyrics-page[data-theme='dark'] .vue-slider-dot-handle {
+body[data-theme="dark"] .lyrics-page .vue-slider-dot-handle {
background-color: #fff;
}
diff --git a/src/assets/fonts/Barlow-Black.ttf b/src/assets/fonts/Barlow-Black.ttf
deleted file mode 100755
index c4a4b05..0000000
Binary files a/src/assets/fonts/Barlow-Black.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Black.woff2 b/src/assets/fonts/Barlow-Black.woff2
deleted file mode 100644
index b3b05b0..0000000
Binary files a/src/assets/fonts/Barlow-Black.woff2 and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Bold.ttf b/src/assets/fonts/Barlow-Bold.ttf
deleted file mode 100755
index cf78fd4..0000000
Binary files a/src/assets/fonts/Barlow-Bold.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Bold.woff2 b/src/assets/fonts/Barlow-Bold.woff2
deleted file mode 100644
index 1e3542c..0000000
Binary files a/src/assets/fonts/Barlow-Bold.woff2 and /dev/null differ
diff --git a/src/assets/fonts/Barlow-ExtraBold.ttf b/src/assets/fonts/Barlow-ExtraBold.ttf
deleted file mode 100755
index 3d5f061..0000000
Binary files a/src/assets/fonts/Barlow-ExtraBold.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-ExtraBold.woff2 b/src/assets/fonts/Barlow-ExtraBold.woff2
deleted file mode 100644
index d5789b2..0000000
Binary files a/src/assets/fonts/Barlow-ExtraBold.woff2 and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Medium.ttf b/src/assets/fonts/Barlow-Medium.ttf
deleted file mode 100755
index 1ed9192..0000000
Binary files a/src/assets/fonts/Barlow-Medium.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Medium.woff2 b/src/assets/fonts/Barlow-Medium.woff2
deleted file mode 100644
index 93e9bcb..0000000
Binary files a/src/assets/fonts/Barlow-Medium.woff2 and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Regular.ttf b/src/assets/fonts/Barlow-Regular.ttf
deleted file mode 100755
index 8bc6a2e..0000000
Binary files a/src/assets/fonts/Barlow-Regular.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-Regular.woff2 b/src/assets/fonts/Barlow-Regular.woff2
deleted file mode 100644
index 65b4987..0000000
Binary files a/src/assets/fonts/Barlow-Regular.woff2 and /dev/null differ
diff --git a/src/assets/fonts/Barlow-SemiBold.ttf b/src/assets/fonts/Barlow-SemiBold.ttf
deleted file mode 100755
index 7b7320b..0000000
Binary files a/src/assets/fonts/Barlow-SemiBold.ttf and /dev/null differ
diff --git a/src/assets/fonts/Barlow-SemiBold.woff2 b/src/assets/fonts/Barlow-SemiBold.woff2
deleted file mode 100644
index 3f582a0..0000000
Binary files a/src/assets/fonts/Barlow-SemiBold.woff2 and /dev/null differ
diff --git a/src/assets/icons/arrow-down.svg b/src/assets/icons/arrow-down.svg
deleted file mode 100644
index 333ce72..0000000
--- a/src/assets/icons/arrow-down.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/arrow-up-alt.svg b/src/assets/icons/arrow-up-alt.svg
deleted file mode 100644
index 1980837..0000000
--- a/src/assets/icons/arrow-up-alt.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/arrow-up.svg b/src/assets/icons/arrow-up.svg
deleted file mode 100644
index bc5a0bd..0000000
--- a/src/assets/icons/arrow-up.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/circle.svg b/src/assets/icons/circle.svg
new file mode 100644
index 0000000..eb210da
--- /dev/null
+++ b/src/assets/icons/circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/dropdown.svg b/src/assets/icons/dropdown.svg
deleted file mode 100644
index e1d0723..0000000
--- a/src/assets/icons/dropdown.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/expand.svg b/src/assets/icons/expand.svg
new file mode 100644
index 0000000..41efe24
--- /dev/null
+++ b/src/assets/icons/expand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/fm.svg b/src/assets/icons/fm.svg
deleted file mode 100644
index fe760cd..0000000
--- a/src/assets/icons/fm.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/assets/icons/fullscreen-exit.svg b/src/assets/icons/fullscreen-exit.svg
deleted file mode 100644
index f76f601..0000000
--- a/src/assets/icons/fullscreen-exit.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/fullscreen.svg b/src/assets/icons/fullscreen.svg
deleted file mode 100644
index e6128c0..0000000
--- a/src/assets/icons/fullscreen.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js
index ee45a56..70c0243 100644
--- a/src/assets/icons/index.js
+++ b/src/assets/icons/index.js
@@ -1,7 +1,8 @@
-import Vue from 'vue';
-import SvgIcon from '@/components/SvgIcon';
+import Vue from "vue";
+import SvgIcon from "@/components/SvgIcon";
-Vue.component('svg-icon', SvgIcon);
-const requireAll = requireContext => requireContext.keys().map(requireContext);
-const req = require.context('./', true, /\.svg$/);
+Vue.component("svg-icon", SvgIcon);
+const requireAll = (requireContext) =>
+ requireContext.keys().map(requireContext);
+const req = require.context("./", true, /\.svg$/);
requireAll(req);
diff --git a/src/assets/icons/login.svg b/src/assets/icons/login.svg
deleted file mode 100644
index b4acd61..0000000
--- a/src/assets/icons/login.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg
deleted file mode 100644
index e254d52..0000000
--- a/src/assets/icons/plus.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/sort-up.svg b/src/assets/icons/sort-up.svg
deleted file mode 100644
index 3efe4cf..0000000
--- a/src/assets/icons/sort-up.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/src/assets/icons/thumbs-down.svg b/src/assets/icons/thumbs-down.svg
deleted file mode 100644
index 02fe63b..0000000
--- a/src/assets/icons/thumbs-down.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/translation.svg b/src/assets/icons/translation.svg
new file mode 100644
index 0000000..9cbd770
--- /dev/null
+++ b/src/assets/icons/translation.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/background.js b/src/background.js
index 94dbbc0..b5deff4 100644
--- a/src/background.js
+++ b/src/background.js
@@ -1,105 +1,37 @@
-'use strict';
-import {
- app,
- protocol,
- BrowserWindow,
- shell,
- dialog,
- globalShortcut,
- nativeTheme,
- screen,
-} from 'electron';
-import {
- isWindows,
- isMac,
- isLinux,
- isDevelopment,
- isCreateTray,
- isCreateMpris,
-} from '@/utils/platform';
-import { createProtocol } from 'vue-cli-plugin-electron-builder/lib';
-import { startNeteaseMusicApi } from './electron/services';
-import { initIpcMain } from './electron/ipcMain.js';
-import { createMenu } from './electron/menu';
-import { createTray } from '@/electron/tray';
-import { createTouchBar } from './electron/touchBar';
-import { createDockMenu } from './electron/dockMenu';
-import { registerGlobalShortcut } from './electron/globalShortcut';
-import { autoUpdater } from 'electron-updater';
-import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer';
-import { EventEmitter } from 'events';
-import express from 'express';
-import expressProxy from 'express-http-proxy';
-import Store from 'electron-store';
-import { createMpris, createDbus } from '@/electron/mpris';
-import { spawn } from 'child_process';
-const clc = require('cli-color');
-const log = text => {
- console.log(`${clc.blueBright('[background.js]')} ${text}`);
-};
-
-const closeOnLinux = (e, win, store) => {
- let closeOpt = store.get('settings.closeAppOption');
- if (closeOpt !== 'exit') {
- e.preventDefault();
- }
-
- if (closeOpt === 'ask') {
- dialog
- .showMessageBox({
- type: 'info',
- title: 'Information',
- cancelId: 2,
- defaultId: 0,
- message: '确定要关闭吗?',
- buttons: ['最小化到托盘', '直接退出'],
- checkboxLabel: '记住我的选择',
- })
- .then(result => {
- if (result.checkboxChecked && result.response !== 2) {
- win.webContents.send(
- 'rememberCloseAppOption',
- result.response === 0 ? 'minimizeToTray' : 'exit'
- );
- }
-
- if (result.response === 0) {
- win.hide(); //调用 最小化实例方法
- } else if (result.response === 1) {
- win = null;
- app.exit(); //exit()直接关闭客户端,不会执行quit();
- }
- })
- .catch(err => {
- log(err);
- });
- } else if (closeOpt === 'exit') {
- win = null;
- app.quit();
- } else {
- win.hide();
- }
-};
+"use strict";
+import { app, protocol, BrowserWindow, shell, dialog } from "electron";
+import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
+import { startNeteaseMusicApi } from "./electron/services";
+import { initIpcMain } from "./electron/ipcMain.js";
+import { createMenu } from "./electron/menu";
+import { createTray } from "@/electron/tray";
+import { createTouchBar } from "./electron/touchBar";
+import { createDockMenu } from "./electron/dockMenu";
+import { autoUpdater } from "electron-updater";
+import installExtension, { VUEJS_DEVTOOLS } from "electron-devtools-installer";
+import express from "express";
+import expressProxy from "express-http-proxy";
+import Store from "electron-store";
class Background {
constructor() {
this.window = null;
- this.ypmTrayImpl = null;
+ this.tray = null;
this.store = new Store({
windowWidth: {
- width: { type: 'number', default: 1440 },
- height: { type: 'number', default: 840 },
+ width: { type: "number", default: 1440 },
+ height: { type: "number", default: 840 },
},
});
this.neteaseMusicAPI = null;
this.expressApp = null;
- this.willQuitApp = !isMac;
+ this.willQuitApp = process.platform === "darwin" ? false : true;
this.init();
}
init() {
- log('initializing');
+ console.log("initializing");
// Make sure the app is singleton.
if (!app.requestSingleInstanceLock()) return app.quit();
@@ -110,21 +42,16 @@ class Background {
// create Express app
this.createExpressApp();
+ // init ipcMain
+ initIpcMain(this.window);
+
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
- { scheme: 'app', privileges: { secure: true, standard: true } },
+ { scheme: "app", privileges: { secure: true, standard: true } },
]);
// handle app events
this.handleAppEvents();
-
- // disable chromium mpris
- if (isCreateMpris) {
- app.commandLine.appendSwitch(
- 'disable-features',
- 'HardwareMediaKeyHandling,MediaSessionService'
- );
- }
}
async initDevtools() {
@@ -132,320 +59,163 @@ class Background {
try {
await installExtension(VUEJS_DEVTOOLS);
} catch (e) {
- console.error('Vue Devtools failed to install:', e.toString());
+ console.error("Vue Devtools failed to install:", e.toString());
}
// Exit cleanly on request from parent process in development mode.
- if (isWindows) {
- process.on('message', data => {
- if (data === 'graceful-exit') {
+ if (process.platform === "win32") {
+ process.on("message", (data) => {
+ if (data === "graceful-exit") {
app.quit();
}
});
} else {
- process.on('SIGTERM', () => {
+ process.on("SIGTERM", () => {
app.quit();
});
}
}
createExpressApp() {
- log('creating express app');
+ console.log("creating express app");
const expressApp = express();
- expressApp.use('/', express.static(__dirname + '/'));
- expressApp.use('/api', expressProxy('http://127.0.0.1:10754'));
- expressApp.use('/player', (req, res) => {
- this.window.webContents
- .executeJavaScript('window.yesplaymusic.player')
- .then(result => {
- res.send({
- currentTrack: result._isPersonalFM
- ? result._personalFMTrack
- : result._currentTrack,
- progress: result._progress,
- });
- });
- });
- this.expressApp = expressApp.listen(27232, '127.0.0.1');
+ expressApp.use("/", express.static(__dirname + "/"));
+ expressApp.use("/api", expressProxy("http://127.0.0.1:10754"));
+ this.expressApp = expressApp.listen(27232);
}
createWindow() {
- log('creating app window');
+ console.log("creating app window");
- const appearance = this.store.get('settings.appearance');
- const showLibraryDefault = this.store.get('settings.showLibraryDefault');
-
- const options = {
- width: this.store.get('window.width') || 1440,
- height: this.store.get('window.height') || 840,
+ this.window = new BrowserWindow({
+ width: this.store.get("window.width") | 1440,
+ height: this.store.get("window.height") | 840,
minWidth: 1080,
minHeight: 720,
- titleBarStyle: 'hiddenInset',
- frame: !(
- isWindows ||
- (isLinux && this.store.get('settings.linuxEnableCustomTitlebar'))
- ),
- title: 'YesPlayMusic',
- show: false,
+ titleBarStyle: "hiddenInset",
webPreferences: {
webSecurity: false,
nodeIntegration: true,
- enableRemoteModule: true,
- contextIsolation: false,
},
- backgroundColor:
- ((appearance === undefined || appearance === 'auto') &&
- nativeTheme.shouldUseDarkColors) ||
- appearance === 'dark'
- ? '#222'
- : '#fff',
- };
-
- if (this.store.get('window.x') && this.store.get('window.y')) {
- let x = this.store.get('window.x');
- let y = this.store.get('window.y');
-
- let displays = screen.getAllDisplays();
- let isResetWindiw = false;
- if (displays.length === 1) {
- let { bounds } = displays[0];
- if (
- x < bounds.x ||
- x > bounds.x + bounds.width - 50 ||
- y < bounds.y ||
- y > bounds.y + bounds.height - 50
- ) {
- isResetWindiw = true;
- }
- } else {
- isResetWindiw = true;
- for (let i = 0; i < displays.length; i++) {
- let { bounds } = displays[i];
- if (
- x > bounds.x &&
- x < bounds.x + bounds.width &&
- y > bounds.y &&
- y < bounds.y - bounds.height
- ) {
- // 检测到APP窗口当前处于一个可用的屏幕里,break
- isResetWindiw = false;
- break;
- }
- }
- }
-
- if (!isResetWindiw) {
- options.x = x;
- options.y = y;
- }
- }
-
- this.window = new BrowserWindow(options);
+ });
// hide menu bar on Microsoft Windows and Linux
this.window.setMenuBarVisibility(false);
+ // create tray only for Microsoft windows
+ if (process.platform === "win32") {
+ this.tray = createTray(this.window);
+ }
+
if (process.env.WEBPACK_DEV_SERVER_URL) {
// Load the url of the dev server if in development mode
- this.window.loadURL(
- showLibraryDefault
- ? `${process.env.WEBPACK_DEV_SERVER_URL}/#/library`
- : process.env.WEBPACK_DEV_SERVER_URL
- );
+ this.window.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) this.window.webContents.openDevTools();
} else {
- createProtocol('app');
- this.window.loadURL(
- showLibraryDefault
- ? 'http://localhost:27232/#/library'
- : 'http://localhost:27232'
- );
+ createProtocol("app");
+ this.window.loadURL("http://localhost:27232");
}
}
checkForUpdates() {
- if (isDevelopment) return;
- log('checkForUpdates');
autoUpdater.checkForUpdatesAndNotify();
- const showNewVersionMessage = info => {
+ const showNewVersionMessage = (info) => {
dialog
.showMessageBox({
- title: '发现新版本 v' + info.version,
- message: '发现新版本 v' + info.version,
- detail: '是否前往 GitHub 下载新版本安装包?',
- buttons: ['下载', '取消'],
- type: 'question',
+ title: "发现新版本 v" + info.version,
+ message: "发现新版本 v" + info.version,
+ detail: "是否前往 Github 下载新版本安装包?",
+ buttons: ["下载", "取消"],
+ type: "question",
noLink: true,
})
- .then(result => {
+ .then((result) => {
if (result.response === 0) {
shell.openExternal(
- 'https://github.com/qier222/YesPlayMusic/releases'
+ "https://github.com/qier222/YesPlayMusic/releases"
);
}
});
};
- autoUpdater.on('update-available', info => {
- showNewVersionMessage(info);
- });
+ if (process.platform === "darwin") {
+ autoUpdater.on("update-available", (info) => {
+ showNewVersionMessage(info);
+ });
+ }
}
handleWindowEvents() {
- this.window.once('ready-to-show', () => {
- log('window ready-to-show event');
+ this.window.once("ready-to-show", () => {
+ console.log("windows ready-to-show event");
this.window.show();
- this.store.set('window', this.window.getBounds());
});
- this.window.on('close', e => {
- log('window close event');
-
- if (isLinux) {
- closeOnLinux(e, this.window, this.store);
- } else if (isMac) {
- if (this.willQuitApp) {
- this.window = null;
- app.quit();
- } else {
- e.preventDefault();
- this.window.hide();
- }
+ this.window.on("close", (e) => {
+ console.log("windows close event");
+ if (this.willQuitApp) {
+ /* the user tried to quit the app */
+ this.window = null;
+ app.quit();
} else {
- let closeOpt = this.store.get('settings.closeAppOption');
- if (this.willQuitApp && (closeOpt === 'exit' || closeOpt === 'ask')) {
- this.window = null;
- app.quit();
- } else {
- e.preventDefault();
- this.window.hide();
- }
+ /* the user only tried to close the window */
+ e.preventDefault();
+ this.window.hide();
}
});
- this.window.on('resized', () => {
- this.store.set('window', this.window.getBounds());
+ this.window.on("resize", () => {
+ let { height, width } = this.window.getBounds();
+ this.store.set("window", { height, width });
});
- this.window.on('moved', () => {
- this.store.set('window', this.window.getBounds());
+ this.window.on("minimize", () => {
+ if (process.platform === "win32") {
+ this.window.hide();
+ }
});
- this.window.on('maximize', () => {
- this.window.webContents.send('isMaximized', true);
- });
-
- this.window.on('unmaximize', () => {
- this.window.webContents.send('isMaximized', false);
- });
-
- this.window.webContents.on('new-window', function (e, url) {
+ this.window.webContents.on("new-window", function (e, url) {
e.preventDefault();
- log('open url');
- const excludeHosts = ['www.last.fm'];
- const exclude = excludeHosts.find(host => url.includes(host));
- if (exclude) {
- const newWindow = new BrowserWindow({
- width: 800,
- height: 600,
- titleBarStyle: 'default',
- title: 'YesPlayMusic',
- webPreferences: {
- webSecurity: false,
- nodeIntegration: true,
- enableRemoteModule: true,
- contextIsolation: false,
- },
- });
- newWindow.loadURL(url);
- return;
- }
shell.openExternal(url);
});
}
handleAppEvents() {
- app.on('ready', async () => {
+ app.on("ready", async () => {
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
- log('app ready event');
+ console.log("app ready event");
// for development
- if (isDevelopment) {
+ if (process.env.NODE_ENV !== "production") {
this.initDevtools();
}
// create window
this.createWindow();
- this.window.once('ready-to-show', () => {
- this.window.show();
- });
this.handleWindowEvents();
- // create tray
- if (isCreateTray) {
- this.trayEventEmitter = new EventEmitter();
- this.ypmTrayImpl = createTray(this.window, this.trayEventEmitter);
- }
-
- // init ipcMain
- initIpcMain(this.window, this.store, this.trayEventEmitter);
-
- // set proxy
- const proxyRules = this.store.get('proxy');
- if (proxyRules) {
- this.window.webContents.session.setProxy({ proxyRules }, result => {
- log('finished setProxy', result);
- });
- }
-
// check for updates
this.checkForUpdates();
// create menu
- createMenu(this.window, this.store);
+ createMenu(this.window);
// create dock menu for macOS
- const createdDockMenu = createDockMenu(this.window);
- if (createDockMenu && app.dock) app.dock.setMenu(createdDockMenu);
+ app.dock.setMenu(createDockMenu(this.window));
// create touch bar
- const createdTouchBar = createTouchBar(this.window);
- if (createdTouchBar) this.window.setTouchBar(createdTouchBar);
-
- // register global shortcuts
- if (this.store.get('settings.enableGlobalShortcut') !== false) {
- registerGlobalShortcut(this.window, this.store);
- }
-
- // try to start osdlyrics process on start
- if (this.store.get('settings.enableOsdlyricsSupport')) {
- await createDbus(this.window);
- log('try to start osdlyrics process');
- const osdlyricsProcess = spawn('osdlyrics');
-
- osdlyricsProcess.on('error', err => {
- log(`failed to start osdlyrics: ${err.message}`);
- });
-
- osdlyricsProcess.on('exit', (code, signal) => {
- log(`osdlyrics process exited with code ${code}, signal ${signal}`);
- });
- }
-
- // create mpris
- if (isCreateMpris) {
- createMpris(this.window);
- }
+ this.window.setTouchBar(createTouchBar(this.window));
});
- app.on('activate', () => {
+ app.on("activate", () => {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
- log('app activate event');
+ console.log("app activate event");
if (this.window === null) {
this.createWindow();
} else {
@@ -453,36 +223,19 @@ class Background {
}
});
- app.on('window-all-closed', () => {
- if (!isMac) {
+ app.on("window-all-closed", () => {
+ if (process.platform !== "darwin") {
app.quit();
}
});
- app.on('before-quit', () => {
+ app.on("before-quit", () => {
this.willQuitApp = true;
});
- app.on('quit', () => {
+ app.on("quit", () => {
this.expressApp.close();
});
-
- app.on('will-quit', () => {
- // unregister all global shortcuts
- globalShortcut.unregisterAll();
- });
-
- if (!isMac) {
- app.on('second-instance', (e, cl, wd) => {
- if (this.window) {
- this.window.show();
- if (this.window.isMinimized()) {
- this.window.restore();
- }
- this.window.focus();
- }
- });
- }
}
}
diff --git a/src/components/ArtistsInLine.vue b/src/components/ArtistsInLine.vue
index e2c619d..b834f47 100644
--- a/src/components/ArtistsInLine.vue
+++ b/src/components/ArtistsInLine.vue
@@ -1,21 +1,16 @@
{{ computedPrefix }}
-
- {{
- ar.name
- }}
- {{ ar.name }}
- ,
+
+ {{ ar.name }}
+ ,
-
+
diff --git a/src/components/ButtonIcon.vue b/src/components/ButtonIcon.vue
index d6afee3..efa14d7 100644
--- a/src/components/ButtonIcon.vue
+++ b/src/components/ButtonIcon.vue
@@ -4,7 +4,7 @@
diff --git a/src/components/ButtonTwoTone.vue b/src/components/ButtonTwoTone.vue
index c72739a..d2cde2b 100644
--- a/src/components/ButtonTwoTone.vue
+++ b/src/components/ButtonTwoTone.vue
@@ -2,7 +2,7 @@