# NeteaseCloudMusic_PythonSDK
> 基于 [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 封装的 Python SDK。
> 网易云API Python版本。
> 现已同步原项目接口且测试通过的有200多个
> 已发布到PyPi，可直接使用pip安装
> 项目地址：[GitHub](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK)

![](https://img.shields.io/badge/py_mini_racer-@0.6.0-red.svg)
![License](https://img.shields.io/badge/license-MIT-yellow)

### 依赖于
- [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)
- [ NeteaseCloudMusicApi_V8 ](https://github.com/2061360308/NeteaseCloudMusicApi_V8)

### 原理
- 通过 `py_mini_racer` 调用 `NeteaseCloudMusicApi_V8` 的 `js` 方法。进一步进行了简单封装。

### 使用
- 安装 `pip install NeteaseCloudMusic`
- 导入API进行使用(具体查看`example.py`中的示例)
```python
from NeteaseCloudMusic import NeteaseCloudMusicApi, api_help, api_list
import os

netease_cloud_music_api = NeteaseCloudMusicApi()  # 初始化API
netease_cloud_music_api.cookie = "你的cookie"  # 设置cookie， 如果没有cookie需要先登录 具体见example.py
response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh"})  # 调用API

# 获取帮助
print(api_help())
print(api_help('song_url_v1'))
# 获取API列表
print(api_list())
```

> 注意： request(self, name, query=None) 的第一个参数为API名称，第二个参数为API参数，具体API名称和参数请参考 [NeteaseCloudMusicApi文档](https://docs.neteasecloudmusicapi.binaryify.com)，name支持`/song/url/v1`和`song_url_v1`两种写法。

> api已加入自动缓存，在测试接口时，如果频繁调用获取结果在query里应该加上timestamp参数来区分，例如
> ```python
> response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh", "timestamp": time.time()})
> ```

### 开发
- 克隆项目 `git clone git@github.com:2061360308/NeteaseCloudMusic_PythonSDK.git`
- 安装依赖 `pip install -r requirements.txt`
- 目录/文件说明
```
├── package  项目包根目录
├── test_gender  生成测试代码的脚本
├── test.py  手动测试/ 使用示例
```

### 更新
项目使用towncrier自动生成更新日志

在 newsfragments 目录下，创建一个新的文本文件。这个文件的名字应该是一个唯一的编号，后缀是 .rst。
例如，如果你正在处理编号为 123 的问题，你可以创建一个名为 123.feature.rst 的文件。

注意在 towncrier 中，新闻片段的类型通常由文件名的后缀决定。以下是一些常见的新闻片段类型：
- .feature: 用于描述新的特性或者功能。
- .bugfix: 用于描述一个 bug 修复。
- .doc: 用于描述文档的更改。
- .removal: 用于描述移除的特性或者功能。
- .misc: 用于描述其他类型的更改。
- 
在这个文件中，写下你的更改的描述。这个描述应该是简短的，通常只有一到两句话。
例如`Added support for the XYZ feature.`

### 发布新版本
使用bumpversion自动更新版本号，提交并发布标签
你需要安装bumpversion然后执行
```bash
bumpversion patch  # for a patch level increase (e.g., 1.0.0 to 1.0.1)
bumpversion minor  # for a minor level increase (e.g., 1.0.0 to 1.1.0)
bumpversion major  # for a major level increase (e.g., 1.0.0 to 2.0.0)
```

接下来会自动更新版本号并提交到远程仓库，然后发布一个新的标签
workflow会依据标签自动发布相应资源并且发布到pypi

### 改进
> 下列API未支持
>
- apicache.js
- memory-cache.js
- request_reference.js
- avatar_upload.js
- cloud.js
- playlist_cover_update.js
- voice_upload.js
- register_anonimous.js
- verify_getQr.js

> 以下api未测试(这些接口测试起来比较繁琐)
> 
- /user/replacephone
- /audio/match
- /rebind
- /nickname/check
- /activate/init/profile
- /cellphone/existence/check
- /register/cellphone
- /captcha/verify
- /captcha/sent
- /login/refresh
- /logout
- /user/update
- /pl/count
- /playlist/update
- /playlist/desc/update
- /playlist/name/update
- /playlist/tags/update
- /event/forward
- /event/del
- /share/resource
- /send/text
- /send/playlist
- /playlist/create
- /playlist/tracks
- /daily_signin
- /fm_trash

### 欢迎提交PR

更正request库返回多个cookie时自动用分号拼接导致后续cookie不好解析的问题
添加了对cookie中Max-Age为0的处理
改进判断cookie是否过期的逻辑
添加了自动处理cookie的更新操作
