mirror of
https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
synced 2025-10-23 07:33:10 +00:00
commit
8f9d38529c
14
.dockerignore
Normal file
14
.dockerignore
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
!/module
|
||||||
|
!/plugins
|
||||||
|
!/public
|
||||||
|
!/static
|
||||||
|
!/util
|
||||||
|
!/app.js
|
||||||
|
!/server.js
|
||||||
|
!/package.json
|
||||||
|
!/package-lock.json
|
||||||
|
!/index.js
|
||||||
|
!/generateConfig.js
|
||||||
|
!/main.js
|
||||||
|
!/data
|
34
.editorconfig
Normal file
34
.editorconfig
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
# EditorConfig is awesome: http://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
# Matches multiple files with brace expansion notation
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# 4 space indentation
|
||||||
|
[*.py]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
# Indentation override for all JS under lib directory
|
||||||
|
[*.{js,ts}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
57
.eslintrc.js
Normal file
57
.eslintrc.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
|
||||||
|
ignorePatterns: ['public/'],
|
||||||
|
parserOptions: {
|
||||||
|
parser: 'babel-eslint',
|
||||||
|
ecmaVersion: 2018,
|
||||||
|
sourceType: 'module',
|
||||||
|
},
|
||||||
|
plugins: ['html'],
|
||||||
|
extends: ['plugin:prettier/recommended'],
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'prettier/prettier': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
endOfLine: 'auto',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
indent: ['error', 2, { SwitchCase: 1 }],
|
||||||
|
'space-infix-ops': ['error', { int32Hint: false }],
|
||||||
|
'key-spacing': [
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
beforeColon: false,
|
||||||
|
afterColon: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'no-octal': 2,
|
||||||
|
'no-redeclare': 2,
|
||||||
|
'comma-spacing': 2,
|
||||||
|
'no-new-object': 2,
|
||||||
|
'arrow-spacing': 2,
|
||||||
|
quotes: [
|
||||||
|
2,
|
||||||
|
'single',
|
||||||
|
{
|
||||||
|
avoidEscape: true,
|
||||||
|
allowTemplateLiterals: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ['**/*.ts'],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
extends: [
|
||||||
|
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
|
||||||
|
// 'prettier/@typescript-eslint',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
42
.github/ISSUE_TEMPLATE/------.md
vendored
Normal file
42
.github/ISSUE_TEMPLATE/------.md
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
name: 创建问题反馈
|
||||||
|
about: 问题反馈
|
||||||
|
title: "<不按照模版格式或者删除模版信息将得不到处理,确认看完了调用前须知再发 issues>"
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 环境
|
||||||
|
- 系统/平台: <你的系统和平台>
|
||||||
|
|
||||||
|
- nodejs 版本: <你的 NodeJS 版本号>
|
||||||
|
|
||||||
|
- API版本: <运行的云音乐 API 的版本号, 对应 package.json 里面的 version>
|
||||||
|
|
||||||
|
## 出现问题
|
||||||
|
<请清晰描述出现的问题,不要使用xxx不行之类的模糊不清的语句,我没有读心术>
|
||||||
|
|
||||||
|
## 重现步骤
|
||||||
|
<请清晰描述重现步骤,调用的接口链接和参数以及命令行错误信息,最好贴上截图(命令行错误信息和接口返回内容)>
|
||||||
|
|
||||||
|
## 期待效果
|
||||||
|
<请清晰描述现在的效果和期待的效果>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
>维护项目都是业余时间,精力有限,我只能挑容易解决的issues处理,为了节约双方时间,请尽可能提供足够的有用的信息,给的信息不够我只能根据精力和时间看情况处理,如果模板信息看都不看就删掉,我不会进行任何回复,并且一个月后close掉issue
|
||||||
|
|
||||||
|
>先看文档有没有相关说明,调用前须知必看,确认看完了调用前须知再发 issues
|
||||||
|
|
||||||
|
>先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭
|
||||||
|
|
||||||
|
>不处理别人搭建的线上服务的问题,此项目不提供任何线上服务,请自行搭建
|
||||||
|
|
||||||
|
>重现步骤尽量详细,不能含糊不清,包含请求地址和对应参数以及操作过程描述,不是每个人都喜欢猜别人遇到了什么问题和找参数一个个试,也比较浪费时间
|
||||||
|
|
||||||
|
>如果不是提建议,提 issues 如果不照着模版来将不会优先处理或放着不管
|
||||||
|
|
||||||
|
>460 cheating 的问题把 `utils/request.js` 里面的 `headers['X-Real-IP']` 的注释取消掉就好
|
11
.github/ISSUE_TEMPLATE/----.md
vendored
Normal file
11
.github/ISSUE_TEMPLATE/----.md
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
name: 功能需求
|
||||||
|
about: 希望添加新接口
|
||||||
|
title: ''
|
||||||
|
labels: 功能需求
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**功能描述**
|
||||||
|
- 请清晰描述你所希望添加的功能,最好贴上对应客户端界面的截图
|
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules
|
||||||
|
*.log
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
.history
|
||||||
|
examples/moddef.json
|
||||||
|
bin
|
||||||
|
anonymous_token
|
||||||
|
.vercel
|
1
.husky/.gitignore
vendored
Normal file
1
.husky/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
_
|
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx lint-staged
|
1
.npmignore
Normal file
1
.npmignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
5
.prettierrc
Normal file
5
.prettierrc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"semi": false,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
4
.travis.yml
Normal file
4
.travis.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
language: node_js
|
||||||
|
|
||||||
|
node_js:
|
||||||
|
- 12
|
1390
CHANGELOG.MD
Normal file
1390
CHANGELOG.MD
Normal file
File diff suppressed because it is too large
Load Diff
16
Dockerfile
Normal file
16
Dockerfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
FROM node:lts-alpine
|
||||||
|
|
||||||
|
RUN apk add --no-cache tini
|
||||||
|
|
||||||
|
ENV NODE_ENV production
|
||||||
|
USER node
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --chown=node:node . ./
|
||||||
|
|
||||||
|
RUN yarn --network-timeout=100000
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
CMD [ "/sbin/tini", "--", "node", "app.js" ]
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013-2022 Binaryify
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
477
README.MD
Normal file
477
README.MD
Normal file
@ -0,0 +1,477 @@
|
|||||||
|
# 网易云音乐 API
|
||||||
|
|
||||||
|
网易云音乐 Node.js API service
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/npm/v/NeteaseCloudMusicApi.svg" alt="Version"></a>
|
||||||
|
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/npm/l/NeteaseCloudMusicApi.svg" alt="License"></a>
|
||||||
|
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/david/dev/binaryify/NeteaseCloudMusicApi.svg" alt="devDependencies" ></a>
|
||||||
|
<a href="https://www.npmjs.com/package/NeteaseCloudMusicApi"><img src="https://img.shields.io/david/binaryify/NeteaseCloudMusicApi.svg" alt="devDependencies" ></a>
|
||||||
|
<a href="https://codeclimate.com/github/Binaryify/NeteaseCloudMusicApi"><img src="https://codeclimate.com/github/Binaryify/NeteaseCloudMusicApi/badges/gpa.svg" /></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## 灵感来自
|
||||||
|
|
||||||
|
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
|
||||||
|
|
||||||
|
[darknessomi/musicbox](https://github.com/darknessomi/musicbox)
|
||||||
|
|
||||||
|
[sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node)
|
||||||
|
|
||||||
|
[greats3an/pyncm](https://github.com/greats3an/pyncm)
|
||||||
|
|
||||||
|
## 环境要求
|
||||||
|
|
||||||
|
需要 NodeJS 14+ 环境
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone git@gitlab.com:Binaryify/NeteaseCloudMusicApi.git
|
||||||
|
$ cd NeteaseCloudMusicApi
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
或者
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://gitlab.com/Binaryify/NeteaseCloudMusicApi.git
|
||||||
|
$ cd NeteaseCloudMusicApi
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
调用前务必阅读文档的`调用前须知`
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
服务器启动默认端口为 3000,若不想使用 3000 端口,可使用以下命令: Mac/Linux
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ PORT=4000 node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ set PORT=4000 && node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## npx 方式运行
|
||||||
|
|
||||||
|
可在终端直接执行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx NeteaseCloudMusicApi@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
使用此命令,可直接启动服务,无需下载或者 clone 项目
|
||||||
|
|
||||||
|
## Vercel 部署
|
||||||
|
|
||||||
|
v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器
|
||||||
|
|
||||||
|
### 操作方法
|
||||||
|
|
||||||
|
1. fork 此项目
|
||||||
|
2. 在 Vercel 官网点击 `New Project`
|
||||||
|
3. 点击 `Import Git Repository` 并选择你 fork 的此项目并点击`import`
|
||||||
|
4. 点击 `PERSONAL ACCOUNT` 的 `select`
|
||||||
|
5. 直接点`Continue`
|
||||||
|
6. `PROJECT NAME`自己填,`FRAMEWORK PRESET` 选 `Other` 然后直接点 `Deploy` 接着等部署完成即可
|
||||||
|
|
||||||
|
## 腾讯云 serverless 部署
|
||||||
|
|
||||||
|
因 `Vercel` 在国内访问太慢,在此提供腾讯云 serverless 部署方法(注意:腾讯云 serverless 并不是免费的,前三个月有免费额度,之后收费)
|
||||||
|
|
||||||
|
### 操作方法
|
||||||
|
|
||||||
|
1. fork 此项目
|
||||||
|
2. 在腾讯云 serverless 应用管理页面( https://console.cloud.tencent.com/sls ),点击`新建应用`
|
||||||
|
3. 顶部`创建方式`选择 `Web 应用`
|
||||||
|
4. 选择 `Express框架`,点击底部`下一步按钮`
|
||||||
|
5. 输入`应用名`,上传方式选择`代码仓库`,进行 GitHub 授权(如已授权可跳过这一步),代码仓库选择刚刚 fork 的项目
|
||||||
|
6. 启动文件填入:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
export PORT=9000
|
||||||
|
/var/lang/node16/bin/node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
7. 点击`完成`,等待部署完成,点击`资源列表`的 `API网关` 里的 `URL`,正常情况会打开文档地址,点击文档`例子`可查看接口调用效果
|
||||||
|
|
||||||
|
## 可以在 Node.js 调用
|
||||||
|
|
||||||
|
v3.31.0 后支持 Node.js 调用,导入的方法为`module`内的文件名,返回内容包含`status`和`body`,`status`为状态码,`body`为请求返回内容,参考`module_example` 文件夹下的 `test.js`
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { login_cellphone, user_cloud } = require('NeteaseCloudMusicApi')
|
||||||
|
async function main() {
|
||||||
|
try {
|
||||||
|
const result = await login_cellphone({
|
||||||
|
phone: '手机号',
|
||||||
|
password: '密码',
|
||||||
|
})
|
||||||
|
console.log(result)
|
||||||
|
const result2 = await user_cloud({
|
||||||
|
cookie: result.body.cookie, // 凭证
|
||||||
|
})
|
||||||
|
console.log(result2.body)
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
## 支持 TypeScript
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// test.ts
|
||||||
|
import { banner } from 'NeteaseCloudMusicApi'
|
||||||
|
banner({ type: 0 }).then((res) => {
|
||||||
|
console.log(res)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用文档
|
||||||
|
|
||||||
|
[文档地址](https://docs-neteasecloudmusicapi.vercel.app)
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
1. 登录
|
||||||
|
2. 刷新登录
|
||||||
|
3. 发送验证码
|
||||||
|
4. 校验验证码
|
||||||
|
5. 注册(修改密码)
|
||||||
|
6. 获取用户信息 , 歌单,收藏,mv, dj 数量
|
||||||
|
7. 获取用户歌单
|
||||||
|
8. 获取用户电台
|
||||||
|
9. 获取用户关注列表
|
||||||
|
10. 获取用户粉丝列表
|
||||||
|
11. 获取用户动态
|
||||||
|
12. 获取用户播放记录
|
||||||
|
13. 获取精品歌单
|
||||||
|
14. 获取歌单详情
|
||||||
|
15. 搜索
|
||||||
|
16. 搜索建议
|
||||||
|
17. 获取歌词
|
||||||
|
18. 歌曲评论
|
||||||
|
19. 收藏单曲到歌单
|
||||||
|
20. 专辑评论
|
||||||
|
21. 歌单评论
|
||||||
|
22. mv 评论
|
||||||
|
23. 电台节目评论
|
||||||
|
24. banner
|
||||||
|
25. 获取歌曲详情
|
||||||
|
26. 获取专辑内容
|
||||||
|
27. 获取歌手单曲
|
||||||
|
28. 获取歌手 mv
|
||||||
|
29. 获取歌手专辑
|
||||||
|
30. 获取歌手描述
|
||||||
|
31. 获取相似歌手
|
||||||
|
32. 获取相似歌单
|
||||||
|
33. 相似 mv
|
||||||
|
34. 获取相似音乐
|
||||||
|
35. 获取最近 5 个听了这首歌的用户
|
||||||
|
36. 获取每日推荐歌单
|
||||||
|
37. 获取每日推荐歌曲
|
||||||
|
38. 私人 FM
|
||||||
|
39. 签到
|
||||||
|
40. 喜欢音乐
|
||||||
|
41. 垃圾桶
|
||||||
|
42. 歌单 ( 网友精选碟 )
|
||||||
|
43. 新碟上架
|
||||||
|
44. 热门歌手
|
||||||
|
45. 最新 mv
|
||||||
|
46. 推荐 mv
|
||||||
|
47. 推荐歌单
|
||||||
|
48. 推荐新音乐
|
||||||
|
49. 推荐电台
|
||||||
|
50. 推荐节目
|
||||||
|
51. 独家放送
|
||||||
|
52. mv 排行
|
||||||
|
53. 获取 mv 数据
|
||||||
|
54. 播放 mv/视频
|
||||||
|
55. 排行榜
|
||||||
|
56. 歌手榜
|
||||||
|
57. 云盘
|
||||||
|
58. 电台 - 推荐
|
||||||
|
59. 电台 - 分类
|
||||||
|
60. 电台 - 分类推荐
|
||||||
|
61. 电台 - 订阅
|
||||||
|
62. 电台 - 详情
|
||||||
|
63. 电台 - 节目
|
||||||
|
64. 给评论点赞
|
||||||
|
65. 获取动态列表
|
||||||
|
66. 热搜列表(简略)
|
||||||
|
67. 发送私信
|
||||||
|
68. 发送私信歌单
|
||||||
|
69. 新建歌单
|
||||||
|
70. 收藏/取消收藏歌单
|
||||||
|
71. 歌单分类
|
||||||
|
72. 收藏的歌手列表
|
||||||
|
73. 订阅的电台列表
|
||||||
|
74. 相关歌单
|
||||||
|
75. 付费精选接口
|
||||||
|
76. 音乐是否可用检查接口
|
||||||
|
77. 登录状态
|
||||||
|
78. 获取视频播放地址
|
||||||
|
79. 发送/删除评论
|
||||||
|
80. 热门评论
|
||||||
|
81. 视频评论
|
||||||
|
82. 退出登录
|
||||||
|
83. 所有榜单
|
||||||
|
84. 所有榜单内容摘要
|
||||||
|
85. 收藏视频
|
||||||
|
86. 收藏 MV
|
||||||
|
87. 视频详情
|
||||||
|
88. 相关视频
|
||||||
|
89. 关注用户
|
||||||
|
90. 新歌速递
|
||||||
|
91. 喜欢音乐列表(无序)
|
||||||
|
92. 收藏的 MV 列表
|
||||||
|
93. 获取最新专辑
|
||||||
|
94. 听歌打卡
|
||||||
|
95. 获取视频标签/分类下的视频
|
||||||
|
96. 已收藏专辑列表
|
||||||
|
97. 获取动态评论
|
||||||
|
98. 歌单收藏者列表
|
||||||
|
99. 云盘歌曲删除
|
||||||
|
100. 热门话题
|
||||||
|
101. 电台 - 推荐类型
|
||||||
|
102. 电台 - 非热门类型
|
||||||
|
103. 电台 - 今日优选
|
||||||
|
104. 心动模式/智能播放
|
||||||
|
105. 转发动态
|
||||||
|
106. 删除动态
|
||||||
|
107. 分享歌曲、歌单、mv、电台、电台节目到动态
|
||||||
|
108. 通知-私信
|
||||||
|
109. 通知-评论
|
||||||
|
110. 通知-@我
|
||||||
|
111. 通知-通知
|
||||||
|
112. 设置
|
||||||
|
113. 云盘数据详情
|
||||||
|
114. 私信内容
|
||||||
|
115. 我的数字专辑
|
||||||
|
116. batch 批量请求接口
|
||||||
|
117. 获取视频标签列表
|
||||||
|
118. 全部 mv
|
||||||
|
119. 网易出品 mv
|
||||||
|
120. 收藏/取消收藏专辑
|
||||||
|
121. 专辑动态信息
|
||||||
|
122. 热搜列表(详细)
|
||||||
|
123. 更换绑定手机
|
||||||
|
124. 检测手机号码是否已注册
|
||||||
|
125. 初始化昵称
|
||||||
|
126. 更新歌单描述
|
||||||
|
127. 更新歌单名
|
||||||
|
128. 更新歌单标签
|
||||||
|
129. 默认搜索关键词
|
||||||
|
130. 删除歌单
|
||||||
|
131. 电台 banner
|
||||||
|
132. 用户电台
|
||||||
|
133. 热门电台
|
||||||
|
134. 电台 - 节目详情
|
||||||
|
135. 电台 - 节目榜
|
||||||
|
136. 电台 - 新晋电台榜/热门电台榜
|
||||||
|
137. 类别热门电台
|
||||||
|
138. 云村热评
|
||||||
|
139. 电台 24 小时节目榜
|
||||||
|
140. 电台 24 小时主播榜
|
||||||
|
141. 电台最热主播榜
|
||||||
|
142. 电台主播新人榜
|
||||||
|
143. 电台付费精品榜
|
||||||
|
144. 歌手热门 50 首歌曲
|
||||||
|
145. 购买数字专辑
|
||||||
|
146. 获取 mv 点赞转发评论数数据
|
||||||
|
147. 获取视频点赞转发评论数数据
|
||||||
|
148. 调整歌单顺序
|
||||||
|
149. 调整歌曲顺序
|
||||||
|
150. 独家放送列表
|
||||||
|
151. 获取推荐视频
|
||||||
|
152. 获取视频分类列表
|
||||||
|
153. 获取全部视频列表接口
|
||||||
|
154. 获取历史日推可用日期列表
|
||||||
|
155. 获取历史日推详细数据
|
||||||
|
156. 国家编码列表
|
||||||
|
157. 首页-发现
|
||||||
|
158. 首页-发现-圆形图标入口列表
|
||||||
|
159. 数字专辑-全部新碟
|
||||||
|
160. 数字专辑-热门新碟
|
||||||
|
161. 数字专辑&数字单曲-榜单
|
||||||
|
162. 数字专辑-语种风格馆
|
||||||
|
163. 数字专辑详情
|
||||||
|
164. 更新头像
|
||||||
|
165. 歌单封面上传
|
||||||
|
166. 楼层评论
|
||||||
|
167. 歌手全部歌曲
|
||||||
|
168. 精品歌单标签列表
|
||||||
|
169. 用户等级信息
|
||||||
|
170. 电台个性推荐
|
||||||
|
171. 用户绑定信息
|
||||||
|
172. 用户绑定手机
|
||||||
|
173. 新版评论
|
||||||
|
174. 点赞过的视频
|
||||||
|
175. 收藏视频到视频歌单
|
||||||
|
176. 删除视频歌单里的视频
|
||||||
|
177. 最近播放的视频
|
||||||
|
178. 音乐日历
|
||||||
|
179. 电台订阅者列表
|
||||||
|
180. 云贝签到信息
|
||||||
|
181. 云贝签到
|
||||||
|
182. 云贝所有任务
|
||||||
|
183. 云贝 todo 任务
|
||||||
|
184. 云贝今日签到信息
|
||||||
|
185. 云贝完成任务
|
||||||
|
186. 云贝收入
|
||||||
|
187. 云贝支出
|
||||||
|
188. 云贝账户信息
|
||||||
|
189. 账号信息
|
||||||
|
190. 最近联系人
|
||||||
|
191. 私信音乐
|
||||||
|
192. 抱一抱评论
|
||||||
|
193. 评论抱一抱列表
|
||||||
|
194. 收藏的专栏
|
||||||
|
195. 关注歌手新歌
|
||||||
|
196. 关注歌手新 MV
|
||||||
|
197. 歌手详情
|
||||||
|
198. 云盘上传
|
||||||
|
199. 二维码登录
|
||||||
|
200. 话题详情
|
||||||
|
201. 话题详情热门动态
|
||||||
|
202. 歌单详情动态
|
||||||
|
203. 绑定手机
|
||||||
|
204. 一起听状态
|
||||||
|
205. 用户历史评论
|
||||||
|
206. 云盘歌曲信息匹配纠正
|
||||||
|
207. 云贝推歌
|
||||||
|
208. 云贝推歌历史记录
|
||||||
|
209. 已购单曲
|
||||||
|
210. 获取 mlog 播放地址
|
||||||
|
211. 将 mlog id 转为视频 id
|
||||||
|
212. vip 成长值
|
||||||
|
213. vip 成长值获取记录
|
||||||
|
214. vip 任务
|
||||||
|
215. 领取 vip 成长值
|
||||||
|
216. 歌手粉丝
|
||||||
|
217. 数字专辑详情
|
||||||
|
218. 数字专辑销量
|
||||||
|
219. 音乐人数据概况
|
||||||
|
220. 音乐人播放趋势
|
||||||
|
221. 音乐人任务
|
||||||
|
222. 账号云豆数
|
||||||
|
223. 领取云豆
|
||||||
|
224. 获取 VIP 信息
|
||||||
|
225. 音乐人签到
|
||||||
|
226. 发送文本动态
|
||||||
|
227. 获取客户端歌曲下载 url
|
||||||
|
228. 获取歌单所有歌曲
|
||||||
|
229. 乐签信息
|
||||||
|
230. 最近播放-歌曲
|
||||||
|
231. 最近播放-视频
|
||||||
|
232. 最近播放-声音
|
||||||
|
233. 最近播放-歌单
|
||||||
|
234. 最近播放-专辑
|
||||||
|
235. 最近播放-播客
|
||||||
|
236. 签到进度
|
||||||
|
237. 重复昵称检测
|
||||||
|
238. 歌手粉丝数量
|
||||||
|
239. 音乐人任务(新)
|
||||||
|
240. 内部版本接口
|
||||||
|
241. 歌单更新播放量
|
||||||
|
242. 黑胶时光机
|
||||||
|
243. 音乐百科 - 简要信息
|
||||||
|
244. 乐谱列表
|
||||||
|
245. 乐谱内容
|
||||||
|
246. 曲风列表
|
||||||
|
247. 曲风偏好
|
||||||
|
248. 曲风详情
|
||||||
|
249. 曲风-歌曲
|
||||||
|
250. 曲风-专辑
|
||||||
|
251. 曲风-歌单
|
||||||
|
252. 曲风-歌手
|
||||||
|
253. 私信和通知接口
|
||||||
|
254. 回忆坐标
|
||||||
|
255. 播客搜索
|
||||||
|
256. 播客声音上传
|
||||||
|
257. 验证接口-二维码生成
|
||||||
|
258. 验证接口-二维码检测
|
||||||
|
259. 听歌识曲
|
||||||
|
260. 根据 nickname 获取 userid 接口
|
||||||
|
261. 播客声音列表
|
||||||
|
262. 专辑简要百科信息
|
||||||
|
263. 歌曲简要百科信息
|
||||||
|
264. 歌手简要百科信息
|
||||||
|
265. mv 简要百科信息
|
||||||
|
266. 搜索歌手
|
||||||
|
267. 用户贡献内容
|
||||||
|
268. 用户贡献条目、积分、云贝数量
|
||||||
|
269. 年度听歌报告
|
||||||
|
270. 播客声音搜索
|
||||||
|
271. 播客声音排序
|
||||||
|
272. 播客列表详情
|
||||||
|
273. 本地歌曲文件匹配网易云歌曲信息
|
||||||
|
274. 歌曲音质详情
|
||||||
|
275. 歌曲红心数量
|
||||||
|
276. 私人 FM 模式选择
|
||||||
|
277. 播客删除
|
||||||
|
278. 电台排行榜获取
|
||||||
|
279. 获取声音歌词
|
||||||
|
280. 获取专辑歌曲的音质
|
||||||
|
281. 歌手动态信息
|
||||||
|
282. 最近听歌列表
|
||||||
|
283. 云盘导入歌曲
|
||||||
|
284. 获取客户端歌曲下载链接 - 新版
|
||||||
|
285. 当前账号关注的用户/歌手
|
||||||
|
286. 会员下载歌曲记录
|
||||||
|
287. 会员本月下载歌曲记录
|
||||||
|
288. 已购买单曲
|
||||||
|
289. 歌曲是否喜爱
|
||||||
|
290. 用户是否互相关注
|
||||||
|
291. 歌曲动态封面
|
||||||
|
292. 用户徽章
|
||||||
|
293. 用户状态
|
||||||
|
294. 用户状态 - 支持设置的状态
|
||||||
|
295. 用户状态 - 相同状态的用户
|
||||||
|
296. 用户状态 - 编辑
|
||||||
|
297. 听歌足迹 - 年度听歌足迹
|
||||||
|
298. 听歌足迹 - 今日收听
|
||||||
|
299. 听歌足迹 - 总收听时长
|
||||||
|
300. 听歌足迹 - 本周/本月收听时长
|
||||||
|
301. 听歌足迹 - 周/月/年收听报告
|
||||||
|
302. 歌单导入 - 元数据/文字/链接导入
|
||||||
|
303. 歌单导入 - 任务状态
|
||||||
|
304. 副歌时间
|
||||||
|
305. 相关歌单推荐
|
||||||
|
306. 歌词摘录 - 歌词摘录信息
|
||||||
|
307. 歌词摘录 - 我的歌词本
|
||||||
|
308. 歌词摘录 - 添加/修改摘录歌词
|
||||||
|
309. 歌词摘录 - 删除摘录歌词
|
||||||
|
|
||||||
|
## 单元测试
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## SDK
|
||||||
|
|
||||||
|
| 语言 | 作者 | 地址 | 类型 |
|
||||||
|
| :----: | :-----------------------------------------: | :--------------------------------------------------------------------------------------------------------: | :----: |
|
||||||
|
| Java | [JackuXL](https://github.com/JackuXL) | [https://github.com/JackuXL/NeteaseCloudMusicApi-SDK](https://github.com/JackuXL/NeteaseCloudMusicApi-SDK) | 第三方 |
|
||||||
|
| Java | [1015770492](https://github.com/1015770492) | https://github.com/1015770492/yumbo-music-utils | 第三方 |
|
||||||
|
| Python | [盧瞳](https://github.com/2061360308) | [NeteaseCloudMusic_PythonSDK](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK) | 第三方 |
|
||||||
|
|
||||||
|
## 贡献者
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[The MIT License (MIT)](https://gitlab.com/Binaryify/NeteaseCloudMusicApi/blob/main/LICENSE)
|
18
app.js
Executable file
18
app.js
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const tmpPath = require('os').tmpdir()
|
||||||
|
|
||||||
|
async function start() {
|
||||||
|
// 检测是否存在 anonymous_token 文件,没有则生成
|
||||||
|
if (!fs.existsSync(path.resolve(tmpPath, 'anonymous_token'))) {
|
||||||
|
fs.writeFileSync(path.resolve(tmpPath, 'anonymous_token'), '', 'utf-8')
|
||||||
|
}
|
||||||
|
// 启动时更新anonymous_token
|
||||||
|
const generateConfig = require('./generateConfig')
|
||||||
|
await generateConfig()
|
||||||
|
require('./server').serveNcmApi({
|
||||||
|
checkVersion: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
start()
|
24641
data/deviceid.txt
Normal file
24641
data/deviceid.txt
Normal file
File diff suppressed because it is too large
Load Diff
22
examples/get_static_moddef.js
Normal file
22
examples/get_static_moddef.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const fsPromises = require('fs/promises')
|
||||||
|
const path = require('path')
|
||||||
|
const server = require('../server')
|
||||||
|
|
||||||
|
const exportFile = path.join(__dirname, 'moddef.json')
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const def = await server.getModulesDefinitions(
|
||||||
|
path.join(__dirname, '..', 'module'),
|
||||||
|
{
|
||||||
|
'daily_signin.js': '/daily_signin',
|
||||||
|
'fm_trash.js': '/fm_trash',
|
||||||
|
'personal_fm.js': '/personal_fm',
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
|
||||||
|
fsPromises.writeFile(exportFile, JSON.stringify(def, null, 4))
|
||||||
|
console.log(`👍 Get your own definition at: ${exportFile}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
24
generateConfig.js
Normal file
24
generateConfig.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const { register_anonimous } = require('./main')
|
||||||
|
const { cookieToJson, generateRandomChineseIP } = require('./util/index')
|
||||||
|
const tmpPath = require('os').tmpdir()
|
||||||
|
|
||||||
|
async function generateConfig() {
|
||||||
|
global.cnIp = generateRandomChineseIP()
|
||||||
|
try {
|
||||||
|
const res = await register_anonimous()
|
||||||
|
const cookie = res.body.cookie
|
||||||
|
if (cookie) {
|
||||||
|
const cookieObj = cookieToJson(cookie)
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.resolve(tmpPath, 'anonymous_token'),
|
||||||
|
cookieObj.MUSIC_A,
|
||||||
|
'utf-8',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
module.exports = generateConfig
|
1833
interface.d.ts
vendored
Normal file
1833
interface.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
29
issue_template.md
Normal file
29
issue_template.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
## 环境
|
||||||
|
- 系统/平台: <你的系统和平台>
|
||||||
|
|
||||||
|
- nodejs 版本: <你的 NodeJS 版本号>
|
||||||
|
|
||||||
|
- API版本:<运行的云音乐 API 的版本号, 对应 package.json 里面的 version>
|
||||||
|
|
||||||
|
## 出现问题
|
||||||
|
<出现的问题>
|
||||||
|
|
||||||
|
## 重现步骤
|
||||||
|
<重现步骤>
|
||||||
|
|
||||||
|
## 期待效果
|
||||||
|
<现在的效果,期待的效果>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
>先看文档有没有相关说明,调用前须知必看
|
||||||
|
|
||||||
|
>先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭
|
||||||
|
|
||||||
|
>不处理别人搭建的线上服务的问题,此项目不提供任何线上服务,请自行搭建
|
||||||
|
|
||||||
|
>重现步骤尽量详细,不能含糊不清,包含请求地址和对应参数以及操作过程描述,不是每个人都喜欢猜别人遇到了什么问题和找参数一个个试,也比较浪费时间
|
||||||
|
|
||||||
|
>如果不是提建议,提 issues 如果不照着模版来将不会优先处理或直接关闭
|
||||||
|
|
||||||
|
>460 cheating 的问题把 `util/request.js` 里面的 `headers['X-Real-IP']` 的注释取消掉就好
|
49
main.js
Normal file
49
main.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const tmpPath = require('os').tmpdir()
|
||||||
|
const { cookieToJson } = require('./util')
|
||||||
|
|
||||||
|
if (!fs.existsSync(path.resolve(tmpPath, 'anonymous_token'))) {
|
||||||
|
fs.writeFileSync(path.resolve(tmpPath, 'anonymous_token'), '', 'utf-8')
|
||||||
|
}
|
||||||
|
|
||||||
|
let firstRun = true
|
||||||
|
/** @type {Record<string, any>} */
|
||||||
|
let obj = {}
|
||||||
|
fs.readdirSync(path.join(__dirname, 'module'))
|
||||||
|
.reverse()
|
||||||
|
.forEach((file) => {
|
||||||
|
if (!file.endsWith('.js')) return
|
||||||
|
let fileModule = require(path.join(__dirname, 'module', file))
|
||||||
|
let fn = file.split('.').shift() || ''
|
||||||
|
obj[fn] = function (data = {}) {
|
||||||
|
if (typeof data.cookie === 'string') {
|
||||||
|
data.cookie = cookieToJson(data.cookie)
|
||||||
|
}
|
||||||
|
return fileModule(
|
||||||
|
{
|
||||||
|
...data,
|
||||||
|
cookie: data.cookie ? data.cookie : {},
|
||||||
|
},
|
||||||
|
async (...args) => {
|
||||||
|
if (firstRun) {
|
||||||
|
firstRun = false
|
||||||
|
const generateConfig = require('./generateConfig')
|
||||||
|
await generateConfig()
|
||||||
|
}
|
||||||
|
// 待优化
|
||||||
|
const request = require('./util/request')
|
||||||
|
|
||||||
|
return request(...args)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Record<string, any> & import("./server")}
|
||||||
|
*/
|
||||||
|
module.exports = {
|
||||||
|
...require('./server'),
|
||||||
|
...obj,
|
||||||
|
}
|
18
main.test.js
Normal file
18
main.test.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const assert = require('assert')
|
||||||
|
const main = require('./main')
|
||||||
|
|
||||||
|
describe('methods in server.js', () => {
|
||||||
|
it('has serveNcmApi', () => {
|
||||||
|
assert.strictEqual(typeof main.serveNcmApi, 'function')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('has getModulesDefinitions', () => {
|
||||||
|
assert.strictEqual(typeof main.getModulesDefinitions, 'function')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('methods in module', () => {
|
||||||
|
it('has activate_init_profile', () => {
|
||||||
|
assert.strictEqual(typeof main.activate_init_profile, 'function')
|
||||||
|
})
|
||||||
|
})
|
9
module/activate_init_profile.js
Normal file
9
module/activate_init_profile.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 初始化名字
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
nickname: query.nickname,
|
||||||
|
}
|
||||||
|
return request(`/api/activate/initProfile`, data, createOption(query))
|
||||||
|
}
|
27
module/aidj_content_rcmd.js
Normal file
27
module/aidj_content_rcmd.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// 私人 DJ
|
||||||
|
|
||||||
|
// 实际请求参数如下, 部分内容省略, 敏感信息已进行混淆
|
||||||
|
// 可按需修改此 API 的代码
|
||||||
|
/* {"extInfo":"{\"lastRequestTimestamp\":1692358373509,\"lbsInfoList\":[{\"lat\":40.23076381,\"lon\":129.07545186,\"time\":1692358543},{\"lat\":40.23076381,\"lon\":129.07545186,\"time\":1692055283}],\"listenedTs\":false,\"noAidjToAidj\":true}","header":"{}"} */
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
var extInfo = {}
|
||||||
|
if (query.latitude != undefined) {
|
||||||
|
extInfo.lbsInfoList = [
|
||||||
|
{
|
||||||
|
lat: query.latitude,
|
||||||
|
lon: query.longitude,
|
||||||
|
time: Date.parse(new Date()) / 1000,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
extInfo.noAidjToAidj = false
|
||||||
|
extInfo.lastRequestTimestamp = new Date().getTime()
|
||||||
|
extInfo.listenedTs = false
|
||||||
|
const data = {
|
||||||
|
extInfo: JSON.stringify(extInfo),
|
||||||
|
}
|
||||||
|
// console.log(data)
|
||||||
|
return request(`/api/aidj/content/rcmd/info`, data, createOption(query))
|
||||||
|
}
|
6
module/album.js
Normal file
6
module/album.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 专辑内容
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(`/api/v1/album/${query.id}`, {}, createOption(query, 'weapi'))
|
||||||
|
}
|
12
module/album_detail.js
Normal file
12
module/album_detail.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 数字专辑详情
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/vipmall/albumproduct/detail`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
12
module/album_detail_dynamic.js
Normal file
12
module/album_detail_dynamic.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 专辑动态信息
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/album/detail/dynamic`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/album_list.js
Normal file
16
module/album_list.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 数字专辑-新碟上架
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
area: query.area || 'ALL', //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本
|
||||||
|
type: query.type,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/vipmall/albumproduct/list`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
15
module/album_list_style.js
Normal file
15
module/album_list_style.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 数字专辑-语种风格馆
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 10,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
area: query.area || 'Z_H', //Z_H:华语,E_A:欧美,KR:韩国,JP:日本
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/vipmall/appalbum/album/style`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
11
module/album_new.js
Normal file
11
module/album_new.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 全部新碟
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
area: query.area || 'ALL', //ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本
|
||||||
|
}
|
||||||
|
return request(`/api/album/new`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
6
module/album_newest.js
Normal file
6
module/album_newest.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 最新专辑
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(`/api/discovery/newAlbum`, {}, createOption(query, 'weapi'))
|
||||||
|
}
|
9
module/album_privilege.js
Normal file
9
module/album_privilege.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 获取专辑歌曲的音质
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/album/privilege`, data, createOption(query))
|
||||||
|
}
|
19
module/album_songsaleboard.js
Normal file
19
module/album_songsaleboard.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// 数字专辑&数字单曲-榜单
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
let data = {
|
||||||
|
albumType: query.albumType || 0, //0为数字专辑,1为数字单曲
|
||||||
|
}
|
||||||
|
const type = query.type || 'daily' // daily,week,year,total
|
||||||
|
if (type === 'year') {
|
||||||
|
data = {
|
||||||
|
...data,
|
||||||
|
year: query.year,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/feealbum/songsaleboard/${type}/type`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
10
module/album_sub.js
Normal file
10
module/album_sub.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 收藏/取消收藏专辑
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.t = query.t == 1 ? 'sub' : 'unsub'
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/album/${query.t}`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
11
module/album_sublist.js
Normal file
11
module/album_sublist.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 已收藏专辑列表
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 25,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(`/api/album/sublist`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
21
module/api.js
Normal file
21
module/api.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const { cookieToJson } = require('../util/index')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const uri = query.uri
|
||||||
|
let data = {}
|
||||||
|
try {
|
||||||
|
data =
|
||||||
|
typeof query.data === 'string' ? JSON.parse(query.data) : query.data || {}
|
||||||
|
if (typeof data.cookie === 'string') {
|
||||||
|
data.cookie = cookieToJson(data.cookie)
|
||||||
|
query.cookie = data.cookie
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
data = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const crypto = query.crypto || ''
|
||||||
|
|
||||||
|
const res = request(uri, data, createOption(query, crypto))
|
||||||
|
return res
|
||||||
|
}
|
15
module/artist_album.js
Normal file
15
module/artist_album.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 歌手专辑列表
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/artist/albums/${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
9
module/artist_desc.js
Normal file
9
module/artist_desc.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 歌手介绍
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/introduction`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/artist_detail.js
Normal file
10
module/artist_detail.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(
|
||||||
|
`/api/artist/head/info/get`,
|
||||||
|
{
|
||||||
|
id: query.id,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
}
|
9
module/artist_detail_dynamic.js
Normal file
9
module/artist_detail_dynamic.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 歌手动态信息
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/detail/dynamic`, data, createOption(query))
|
||||||
|
}
|
11
module/artist_fans.js
Normal file
11
module/artist_fans.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 歌手粉丝
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/fans/get`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
13
module/artist_follow_count.js
Normal file
13
module/artist_follow_count.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 歌手粉丝数量
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/artist/follow/count/get`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
33
module/artist_list.js
Normal file
33
module/artist_list.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// 歌手分类
|
||||||
|
|
||||||
|
/*
|
||||||
|
type 取值
|
||||||
|
1:男歌手
|
||||||
|
2:女歌手
|
||||||
|
3:乐队
|
||||||
|
|
||||||
|
area 取值
|
||||||
|
-1:全部
|
||||||
|
7华语
|
||||||
|
96欧美
|
||||||
|
8:日本
|
||||||
|
16韩国
|
||||||
|
0:其他
|
||||||
|
|
||||||
|
initial 取值 a-z/A-Z
|
||||||
|
*/
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (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(`/api/v1/artist/list`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
12
module/artist_mv.js
Normal file
12
module/artist_mv.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 歌手相关MV
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
artistId: query.id,
|
||||||
|
limit: query.limit,
|
||||||
|
offset: query.offset,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/mvs`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
12
module/artist_new_mv.js
Normal file
12
module/artist_new_mv.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 20,
|
||||||
|
startTimestamp: query.before || Date.now(),
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/sub/artist/new/works/mv/list`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
12
module/artist_new_song.js
Normal file
12
module/artist_new_song.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 20,
|
||||||
|
startTimestamp: query.before || Date.now(),
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/sub/artist/new/works/song/list`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
12
module/artist_songs.js
Normal file
12
module/artist_songs.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
private_cloud: 'true',
|
||||||
|
work_type: 1,
|
||||||
|
order: query.order || 'hot', //hot,time
|
||||||
|
offset: query.offset || 0,
|
||||||
|
limit: query.limit || 100,
|
||||||
|
}
|
||||||
|
return request(`/api/v1/artist/songs`, data, createOption(query))
|
||||||
|
}
|
11
module/artist_sub.js
Normal file
11
module/artist_sub.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 收藏与取消收藏歌手
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.t = query.t == 1 ? 'sub' : 'unsub'
|
||||||
|
const data = {
|
||||||
|
artistId: query.id,
|
||||||
|
artistIds: '[' + query.id + ']',
|
||||||
|
}
|
||||||
|
return request(`/api/artist/${query.t}`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
11
module/artist_sublist.js
Normal file
11
module/artist_sublist.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 关注歌手列表
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 25,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/sublist`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
8
module/artist_top_song.js
Normal file
8
module/artist_top_song.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// 歌手热门 50 首歌曲
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/artist/top/song`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
15
module/artist_video.js
Normal file
15
module/artist_video.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 歌手相关视频
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
artistId: query.id,
|
||||||
|
page: JSON.stringify({
|
||||||
|
size: query.size || 10,
|
||||||
|
cursor: query.cursor || 0,
|
||||||
|
}),
|
||||||
|
tab: 0,
|
||||||
|
order: query.order || 0,
|
||||||
|
}
|
||||||
|
return request(`/api/mlog/artist/video`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
6
module/artists.js
Normal file
6
module/artists.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 歌手单曲
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(`/api/v1/artist/${query.id}`, {}, createOption(query, 'weapi'))
|
||||||
|
}
|
19
module/audio_match.js
Normal file
19
module/audio_match.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const { default: axios } = require('axios')
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = async (query, request) => {
|
||||||
|
const res = await axios({
|
||||||
|
method: 'get',
|
||||||
|
url: `https://interface.music.163.com/api/music/audio/match?sessionId=0123456789abcdef&algorithmCode=shazam_v2&duration=${
|
||||||
|
query.duration
|
||||||
|
}&rawdata=${encodeURIComponent(query.audioFP)}×=1&decrypt=1`,
|
||||||
|
data: null,
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
code: 200,
|
||||||
|
data: res.data.data,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
22
module/avatar_upload.js
Normal file
22
module/avatar_upload.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const uploadPlugin = require('../plugins/upload')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = async (query, request) => {
|
||||||
|
const uploadInfo = await uploadPlugin(query, request)
|
||||||
|
const res = await request(
|
||||||
|
`/api/user/avatar/upload/v1`,
|
||||||
|
{
|
||||||
|
imgid: uploadInfo.imgId,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
code: 200,
|
||||||
|
data: {
|
||||||
|
...uploadInfo,
|
||||||
|
...res.body,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
16
module/banner.js
Normal file
16
module/banner.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 首页轮播图
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const type =
|
||||||
|
{
|
||||||
|
0: 'pc',
|
||||||
|
1: 'android',
|
||||||
|
2: 'iphone',
|
||||||
|
3: 'ipad',
|
||||||
|
}[query.type || 0] || 'pc'
|
||||||
|
return request(
|
||||||
|
`/api/v2/banner/get`,
|
||||||
|
{ clientType: type },
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
}
|
12
module/batch.js
Normal file
12
module/batch.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 批量请求接口
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {}
|
||||||
|
Object.keys(query).forEach((i) => {
|
||||||
|
if (/^\/api\//.test(i)) {
|
||||||
|
data[i] = query[i]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return request(`/api/batch`, data, createOption(query))
|
||||||
|
}
|
8
module/calendar.js
Normal file
8
module/calendar.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
startTime: query.startTime || Date.now(),
|
||||||
|
endTime: query.endTime || Date.now(),
|
||||||
|
}
|
||||||
|
return request(`/api/mcalendar/detail`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/captcha_sent.js
Normal file
10
module/captcha_sent.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 发送验证码
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
ctcode: query.ctcode || '86',
|
||||||
|
cellphone: query.phone,
|
||||||
|
}
|
||||||
|
return request(`/api/sms/captcha/sent`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
11
module/captcha_verify.js
Normal file
11
module/captcha_verify.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// 校验验证码
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
ctcode: query.ctcode || '86',
|
||||||
|
cellphone: query.phone,
|
||||||
|
captcha: query.captcha,
|
||||||
|
}
|
||||||
|
return request(`/api/sms/captcha/verify`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/cellphone_existence_check.js
Normal file
10
module/cellphone_existence_check.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 检测手机号码是否已注册
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
cellphone: query.phone,
|
||||||
|
countrycode: query.countrycode,
|
||||||
|
}
|
||||||
|
return request(`/api/cellphone/existence/check`, data, createOption(query))
|
||||||
|
}
|
30
module/check_music.js
Normal file
30
module/check_music.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// 歌曲可用性
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
ids: '[' + parseInt(query.id) + ']',
|
||||||
|
br: parseInt(query.br || 999000),
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/song/enhance/player/url`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
).then((response) => {
|
||||||
|
let playable = false
|
||||||
|
if (response.body.code == 200) {
|
||||||
|
if (response.body.data[0].code == 200) {
|
||||||
|
playable = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (playable) {
|
||||||
|
response.body = { code: 200, success: true, message: 'ok' }
|
||||||
|
return response
|
||||||
|
} else {
|
||||||
|
// response.status = 404
|
||||||
|
response.body = { code: 200, success: false, message: '亲爱的,暂无版权' }
|
||||||
|
return response
|
||||||
|
// return Promise.reject(response)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
145
module/cloud.js
Normal file
145
module/cloud.js
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
const mm = require('music-metadata')
|
||||||
|
const uploadPlugin = require('../plugins/songUpload')
|
||||||
|
const md5 = require('md5')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = async (query, request) => {
|
||||||
|
let ext = 'mp3'
|
||||||
|
// if (query.songFile.name.indexOf('flac') > -1) {
|
||||||
|
// ext = 'flac'
|
||||||
|
// }
|
||||||
|
if (query.songFile.name.includes('.')) {
|
||||||
|
ext = query.songFile.name.split('.').pop()
|
||||||
|
}
|
||||||
|
query.songFile.name = Buffer.from(query.songFile.name, 'latin1').toString(
|
||||||
|
'utf-8',
|
||||||
|
)
|
||||||
|
const filename = query.songFile.name
|
||||||
|
.replace('.' + ext, '')
|
||||||
|
.replace(/\s/g, '')
|
||||||
|
.replace(/\./g, '_')
|
||||||
|
const bitrate = 999000
|
||||||
|
if (!query.songFile) {
|
||||||
|
return Promise.reject({
|
||||||
|
status: 500,
|
||||||
|
body: {
|
||||||
|
msg: '请上传音乐文件',
|
||||||
|
code: 500,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (!query.songFile.md5) {
|
||||||
|
// 命令行上传没有md5和size信息,需要填充
|
||||||
|
query.songFile.md5 = md5(query.songFile.data)
|
||||||
|
query.songFile.size = query.songFile.data.byteLength
|
||||||
|
}
|
||||||
|
const res = await request(
|
||||||
|
`/api/cloud/upload/check`,
|
||||||
|
{
|
||||||
|
bitrate: String(bitrate),
|
||||||
|
ext: '',
|
||||||
|
length: query.songFile.size,
|
||||||
|
md5: query.songFile.md5,
|
||||||
|
songId: '0',
|
||||||
|
version: 1,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
let artist = ''
|
||||||
|
let album = ''
|
||||||
|
let songName = ''
|
||||||
|
try {
|
||||||
|
const metadata = await mm.parseBuffer(
|
||||||
|
query.songFile.data,
|
||||||
|
query.songFile.mimetype,
|
||||||
|
)
|
||||||
|
const info = metadata.common
|
||||||
|
|
||||||
|
if (info.title) {
|
||||||
|
songName = info.title
|
||||||
|
}
|
||||||
|
if (info.album) {
|
||||||
|
album = info.album
|
||||||
|
}
|
||||||
|
if (info.artist) {
|
||||||
|
artist = info.artist
|
||||||
|
}
|
||||||
|
// if (metadata.native.ID3v1) {
|
||||||
|
// metadata.native.ID3v1.forEach((item) => {
|
||||||
|
// // console.log(item.id, item.value)
|
||||||
|
// if (item.id === 'title') {
|
||||||
|
// songName = item.value
|
||||||
|
// }
|
||||||
|
// if (item.id === 'artist') {
|
||||||
|
// artist = item.value
|
||||||
|
// }
|
||||||
|
// if (item.id === 'album') {
|
||||||
|
// album = item.value
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// // console.log({
|
||||||
|
// // songName,
|
||||||
|
// // album,
|
||||||
|
// // songName,
|
||||||
|
// // })
|
||||||
|
// }
|
||||||
|
// console.log({
|
||||||
|
// songName,
|
||||||
|
// album,
|
||||||
|
// songName,
|
||||||
|
// })
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
const tokenRes = await request(
|
||||||
|
`/api/nos/token/alloc`,
|
||||||
|
{
|
||||||
|
bucket: '',
|
||||||
|
ext: ext,
|
||||||
|
filename: filename,
|
||||||
|
local: false,
|
||||||
|
nos_product: 3,
|
||||||
|
type: 'audio',
|
||||||
|
md5: query.songFile.md5,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (res.body.needUpload) {
|
||||||
|
const uploadInfo = await uploadPlugin(query, request)
|
||||||
|
// console.log('uploadInfo', uploadInfo.body.result.resourceId)
|
||||||
|
}
|
||||||
|
// console.log(tokenRes.body.result)
|
||||||
|
const res2 = await request(
|
||||||
|
`/api/upload/cloud/info/v2`,
|
||||||
|
{
|
||||||
|
md5: query.songFile.md5,
|
||||||
|
songid: res.body.songId,
|
||||||
|
filename: query.songFile.name,
|
||||||
|
song: songName || filename,
|
||||||
|
album: album || '未知专辑',
|
||||||
|
artist: artist || '未知艺术家',
|
||||||
|
bitrate: String(bitrate),
|
||||||
|
resourceId: tokenRes.body.result.resourceId,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
// console.log({ res2, privateCloud: res2.body.privateCloud })
|
||||||
|
// console.log(res.body.songId, 'songid')
|
||||||
|
const res3 = await request(
|
||||||
|
`/api/cloud/pub/v2`,
|
||||||
|
{
|
||||||
|
songid: res2.body.songId,
|
||||||
|
},
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
// console.log({ res3 })
|
||||||
|
return {
|
||||||
|
status: 200,
|
||||||
|
body: {
|
||||||
|
...res.body,
|
||||||
|
...res3.body,
|
||||||
|
// ...uploadInfo,
|
||||||
|
},
|
||||||
|
cookie: res.cookie,
|
||||||
|
}
|
||||||
|
}
|
39
module/cloud_import.js
Normal file
39
module/cloud_import.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// 云盘导入歌曲
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = async (query, request) => {
|
||||||
|
query.id = query.id || -2
|
||||||
|
query.artist = query.artist || '未知'
|
||||||
|
query.album = query.album || '未知'
|
||||||
|
const checkData = {
|
||||||
|
uploadType: 0,
|
||||||
|
songs: JSON.stringify([
|
||||||
|
{
|
||||||
|
md5: query.md5,
|
||||||
|
songId: query.id,
|
||||||
|
bitrate: query.bitrate,
|
||||||
|
fileSize: query.fileSize,
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
}
|
||||||
|
const res = await request(
|
||||||
|
`/api/cloud/upload/check/v2`,
|
||||||
|
checkData,
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
//res.body.data[0].upload 0:文件可导入,1:文件已在云盘,2:不能导入
|
||||||
|
//只能用song决定云盘文件名,且上传后的文件名后缀固定为mp3
|
||||||
|
const importData = {
|
||||||
|
uploadType: 0,
|
||||||
|
songs: JSON.stringify([
|
||||||
|
{
|
||||||
|
songId: res.body.data[0].songId,
|
||||||
|
bitrate: query.bitrate,
|
||||||
|
song: query.song,
|
||||||
|
artist: query.artist,
|
||||||
|
album: query.album,
|
||||||
|
fileName: query.song + '.' + query.fileType,
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
}
|
||||||
|
return request(`/api/cloud/user/song/import`, importData, createOption(query))
|
||||||
|
}
|
13
module/cloud_match.js
Normal file
13
module/cloud_match.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
userId: query.uid,
|
||||||
|
songId: query.sid,
|
||||||
|
adjustSongId: query.asid,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/cloud/user/song/match`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
13
module/cloudsearch.js
Normal file
13
module/cloudsearch.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 搜索
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
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,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(`/api/cloudsearch/pc`, data, createOption(query))
|
||||||
|
}
|
30
module/comment.js
Normal file
30
module/comment.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
// 发送与删除评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.t = {
|
||||||
|
1: 'add',
|
||||||
|
0: 'delete',
|
||||||
|
2: 'reply',
|
||||||
|
}[query.t]
|
||||||
|
query.type = resourceTypeMap[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(
|
||||||
|
`/api/resource/comments/${query.t}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_album.js
Normal file
16
module/comment_album.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 专辑评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/R_AL_3_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_dj.js
Normal file
16
module/comment_dj.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 电台评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/A_DJ_1_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
15
module/comment_event.js
Normal file
15
module/comment_event.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 获取动态评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/${query.threadId}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_floor.js
Normal file
16
module/comment_floor.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.type = resourceTypeMap[query.type]
|
||||||
|
const data = {
|
||||||
|
parentCommentId: query.parentCommentId,
|
||||||
|
threadId: query.type + query.id,
|
||||||
|
time: query.time || -1,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/resource/comment/floor/get`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
18
module/comment_hot.js
Normal file
18
module/comment_hot.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
// 热门评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.type = resourceTypeMap[query.type]
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/hotcomments/${query.type}${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
20
module/comment_hug_list.js
Normal file
20
module/comment_hug_list.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.type = resourceTypeMap[query.type || 0]
|
||||||
|
const threadId = query.type + query.sid
|
||||||
|
const data = {
|
||||||
|
targetUserId: query.uid,
|
||||||
|
commentId: query.cid,
|
||||||
|
cursor: query.cursor || '-1',
|
||||||
|
threadId: threadId,
|
||||||
|
pageNo: query.page || 1,
|
||||||
|
idCursor: query.idCursor || -1,
|
||||||
|
pageSize: query.pageSize || 100,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v2/resource/comments/hug/list`,
|
||||||
|
data,
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
}
|
20
module/comment_like.js
Normal file
20
module/comment_like.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
// 点赞与取消点赞评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.t = query.t == 1 ? 'like' : 'unlike'
|
||||||
|
query.type = resourceTypeMap[query.type]
|
||||||
|
const data = {
|
||||||
|
threadId: query.type + query.id,
|
||||||
|
commentId: query.cid,
|
||||||
|
}
|
||||||
|
if (query.type == 'A_EV_2_') {
|
||||||
|
data.threadId = query.threadId
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/comment/${query.t}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_music.js
Normal file
16
module/comment_music.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 歌曲评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/R_SO_4_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_mv.js
Normal file
16
module/comment_mv.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// MV评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/R_MV_5_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
37
module/comment_new.js
Normal file
37
module/comment_new.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
const { resourceTypeMap } = require('../util/config.json')
|
||||||
|
// 评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
query.type = resourceTypeMap[query.type]
|
||||||
|
const threadId = query.type + query.id
|
||||||
|
const pageSize = query.pageSize || 20
|
||||||
|
const pageNo = query.pageNo || 1
|
||||||
|
let sortType = Number(query.sortType) || 99
|
||||||
|
if (sortType === 1) {
|
||||||
|
sortType = 99
|
||||||
|
}
|
||||||
|
let cursor = ''
|
||||||
|
switch (sortType) {
|
||||||
|
case 99:
|
||||||
|
cursor = (pageNo - 1) * pageSize
|
||||||
|
break
|
||||||
|
case 2:
|
||||||
|
cursor = 'normalHot#' + (pageNo - 1) * pageSize
|
||||||
|
break
|
||||||
|
case 3:
|
||||||
|
cursor = query.cursor || '0'
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
const data = {
|
||||||
|
threadId: threadId,
|
||||||
|
pageNo,
|
||||||
|
showInner: query.showInner || true,
|
||||||
|
pageSize,
|
||||||
|
cursor: cursor,
|
||||||
|
sortType: sortType, //99:按推荐排序,2:按热度排序,3:按时间排序
|
||||||
|
}
|
||||||
|
return request(`/api/v2/resource/comments`, data, createOption(query))
|
||||||
|
}
|
16
module/comment_playlist.js
Normal file
16
module/comment_playlist.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 歌单评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/A_PL_0_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
16
module/comment_video.js
Normal file
16
module/comment_video.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 视频评论
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
rid: query.id,
|
||||||
|
limit: query.limit || 20,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
beforeTime: query.before || 0,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/v1/resource/comments/R_VI_62_${query.id}`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
6
module/countries_code_list.js
Normal file
6
module/countries_code_list.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 国家编码列表
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {}
|
||||||
|
return request(`/api/lbs/countries/v1`, data, createOption(query))
|
||||||
|
}
|
6
module/creator_authinfo_get.js
Normal file
6
module/creator_authinfo_get.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 获取达人用户信息
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {}
|
||||||
|
return request(`/api/user/creator/authinfo/get`, data, createOption(query))
|
||||||
|
}
|
16
module/daily_signin.js
Normal file
16
module/daily_signin.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 签到
|
||||||
|
|
||||||
|
/*
|
||||||
|
0为安卓端签到 3点经验, 1为网页签到,2点经验
|
||||||
|
签到成功 {'android': {'point': 3, 'code': 200}, 'web': {'point': 2, 'code': 200}}
|
||||||
|
重复签到 {'android': {'code': -2, 'msg': '重复签到'}, 'web': {'code': -2, 'msg': '重复签到'}}
|
||||||
|
未登录 {'android': {'code': 301}, 'web': {'code': 301}}
|
||||||
|
*/
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
type: query.type || 0,
|
||||||
|
}
|
||||||
|
return request(`/api/point/dailyTask`, data, createOption(query))
|
||||||
|
}
|
13
module/digitalAlbum_detail.js
Normal file
13
module/digitalAlbum_detail.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 数字专辑详情
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/vipmall/albumproduct/detail`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
22
module/digitalAlbum_ordering.js
Normal file
22
module/digitalAlbum_ordering.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 购买数字专辑
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
business: 'Album',
|
||||||
|
paymentMethod: query.payment,
|
||||||
|
digitalResources: JSON.stringify([
|
||||||
|
{
|
||||||
|
business: 'Album',
|
||||||
|
resourceID: query.id,
|
||||||
|
quantity: query.quantity,
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
from: 'web',
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/ordering/web/digital`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
15
module/digitalAlbum_purchased.js
Normal file
15
module/digitalAlbum_purchased.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 我的数字专辑
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
total: true,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/digitalAlbum/purchased`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
13
module/digitalAlbum_sales.js
Normal file
13
module/digitalAlbum_sales.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 数字专辑销量
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
albumIds: query.ids,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/vipmall/albumproduct/album/query/sales`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
15
module/djRadio_top.js
Normal file
15
module/djRadio_top.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//电台排行榜获取
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
djRadioId: query.djRadioId || null, // 电台id
|
||||||
|
sortIndex: query.sortIndex || 1, // 排序 1:播放数 2:点赞数 3:评论数 4:分享数 5:收藏数
|
||||||
|
dataGapDays: query.dataGapDays || 7, // 天数 7:一周 30:一个月 90:三个月
|
||||||
|
dataType: query.dataType || 3, // 未知
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
'/api/expert/worksdata/works/top/get',
|
||||||
|
data,
|
||||||
|
createOption(query),
|
||||||
|
)
|
||||||
|
}
|
6
module/dj_banner.js
Normal file
6
module/dj_banner.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 电台banner
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(`/api/djradio/banner/get`, {}, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/dj_category_excludehot.js
Normal file
10
module/dj_category_excludehot.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 电台非热门类型
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(
|
||||||
|
`/api/djradio/category/excludehot`,
|
||||||
|
{},
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
10
module/dj_category_recommend.js
Normal file
10
module/dj_category_recommend.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 电台推荐类型
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(
|
||||||
|
`/api/djradio/home/category/recommend`,
|
||||||
|
{},
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
6
module/dj_catelist.js
Normal file
6
module/dj_catelist.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// 电台分类列表
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(`/api/djradio/category/get`, {}, createOption(query, 'weapi'))
|
||||||
|
}
|
9
module/dj_detail.js
Normal file
9
module/dj_detail.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 电台详情
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.rid,
|
||||||
|
}
|
||||||
|
return request(`/api/djradio/v2/get`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/dj_hot.js
Normal file
10
module/dj_hot.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 热门电台
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
}
|
||||||
|
return request(`/api/djradio/hot/v1`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
15
module/dj_paygift.js
Normal file
15
module/dj_paygift.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 付费电台
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
_nmclfl: 1,
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/djradio/home/paygift/list`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
12
module/dj_personalize_recommend.js
Normal file
12
module/dj_personalize_recommend.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 电台个性推荐
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
return request(
|
||||||
|
`/api/djradio/personalize/rcmd`,
|
||||||
|
{
|
||||||
|
limit: query.limit || 6,
|
||||||
|
},
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
12
module/dj_program.js
Normal file
12
module/dj_program.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 电台节目列表
|
||||||
|
const { toBoolean } = require('../util')
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
radioId: query.rid,
|
||||||
|
limit: query.limit || 30,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
asc: toBoolean(query.asc),
|
||||||
|
}
|
||||||
|
return request(`/api/dj/program/byradio`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
9
module/dj_program_detail.js
Normal file
9
module/dj_program_detail.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 电台节目详情
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
id: query.id,
|
||||||
|
}
|
||||||
|
return request(`/api/dj/program/detail`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
10
module/dj_program_toplist.js
Normal file
10
module/dj_program_toplist.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// 电台节目榜
|
||||||
|
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 100,
|
||||||
|
offset: query.offset || 0,
|
||||||
|
}
|
||||||
|
return request(`/api/program/toplist/v1`, data, createOption(query, 'weapi'))
|
||||||
|
}
|
13
module/dj_program_toplist_hours.js
Normal file
13
module/dj_program_toplist_hours.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 电台24小时节目榜
|
||||||
|
const createOption = require('../util/option.js')
|
||||||
|
module.exports = (query, request) => {
|
||||||
|
const data = {
|
||||||
|
limit: query.limit || 100,
|
||||||
|
// 不支持 offset
|
||||||
|
}
|
||||||
|
return request(
|
||||||
|
`/api/djprogram/toplist/hours`,
|
||||||
|
data,
|
||||||
|
createOption(query, 'weapi'),
|
||||||
|
)
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user