|
"""
|
|
bilibili_api.music
|
|
|
|
音乐相关 API
|
|
|
|
注意: 目前 B 站的音频并不和 B 站的音乐相关信息互通。这里的 Music 类的数据来源于视频下面的 bgm 标签和全站音乐榜中的每一个 bgm/音乐。get_homepage_recommend 和 get_music_index_info 来源于 https://www.bilibili.com/v/musicplus/
|
|
"""
|
|
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
from .utils.utils import get_api
|
|
from .utils.credential import Credential
|
|
from .utils.network import Api
|
|
|
|
API_audio = get_api("audio")
|
|
API = get_api("music")
|
|
|
|
|
|
class MusicOrder(Enum):
|
|
"""
|
|
音乐排序类型
|
|
|
|
+ NEW: 最新
|
|
+ HOT: 最热
|
|
"""
|
|
|
|
NEW = 1
|
|
HOT = 2
|
|
|
|
|
|
class MusicIndexTags:
|
|
"""
|
|
音乐索引信息查找可以用的标签,有语言和类型两种标签,每种标签选一个
|
|
|
|
- Lang: 语言标签枚举类
|
|
- Genre: 类型标签枚举类
|
|
"""
|
|
|
|
class Lang(Enum):
|
|
"""
|
|
- ALL: 全部
|
|
- CHINESE: 华语
|
|
- EUROPE_AMERICA: 欧美
|
|
- JAPAN: 日语
|
|
- KOREA: 韩语
|
|
- OTHER: 其他
|
|
"""
|
|
|
|
ALL = ""
|
|
CHINESE = 3
|
|
EUROPE_AMERICA = 6
|
|
JAPAN = 7
|
|
KOREA = 61
|
|
OTHER = 1
|
|
|
|
class Genre(Enum):
|
|
"""
|
|
- ALL: 全部
|
|
- POPULAR: 流行
|
|
- ROCK: 摇滚
|
|
- ELECTRONIC: 电子音乐
|
|
- COUNTRYSIDE: 乡村
|
|
- FOLK: 民谣
|
|
- LIVE: 轻音乐
|
|
- CLASSICAL: 古典
|
|
- NEW_CENTURY: 新世纪
|
|
- REGGAE: 雷鬼
|
|
- BLUES: 布鲁斯
|
|
- RHYTHM_BLUES: 节奏与布鲁斯
|
|
- ORIGINAL: 原声
|
|
- WORLD: 世界音乐
|
|
- CHILDREN: 儿童音乐
|
|
- LATIN: 拉丁
|
|
- PUNK: 朋克
|
|
- MEDAL: 金属
|
|
- JAZZ: 爵士乐
|
|
- HIP_HOP: 嘻哈
|
|
- SINGER_SONGWRITER: 唱作人
|
|
- AMUSEMENT: 娱乐/舞台
|
|
- OTHER: 其他
|
|
"""
|
|
|
|
ALL = ""
|
|
POPULAR = 1
|
|
ROCK = 2
|
|
ELECTRONIC = 3
|
|
COUNTRYSIDE = 4
|
|
FOLK = 5
|
|
LIVE = 6
|
|
CLASSICAL = 7
|
|
NEW_CENTURY = 8
|
|
REGGAE = 9
|
|
BLUES = 10
|
|
RHYTHM_BLUES = 12
|
|
ORIGINAL = 13
|
|
WORLD = 14
|
|
CHILDREN = 15
|
|
LATIN = 16
|
|
PUNK = 17
|
|
MEDAL = 18
|
|
JAZZ = 19
|
|
HIP_HOP = 20
|
|
SINGER_SONGWRITER = 21
|
|
AMUSEMENT = 22
|
|
OTHER = 23
|
|
|
|
|
|
async def get_homepage_recommend(credential: Optional[Credential] = None):
|
|
"""
|
|
获取音频首页推荐
|
|
|
|
Args:
|
|
credential (Credential | None): 凭据类. Defaults to None.
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
credential = credential if credential else Credential()
|
|
api = API_audio["audio_info"]["homepage_recommend"]
|
|
return await Api(**api, credential=credential).result
|
|
|
|
|
|
async def get_music_index_info(
|
|
keyword: str = "",
|
|
lang: MusicIndexTags.Lang = MusicIndexTags.Lang.ALL,
|
|
genre: MusicIndexTags.Genre = MusicIndexTags.Genre.ALL,
|
|
order: MusicOrder = MusicOrder.NEW,
|
|
page_num: int = 1,
|
|
page_size: int = 10,
|
|
) -> dict:
|
|
"""
|
|
获取首页的音乐视频列表
|
|
|
|
Args:
|
|
keyword (str) : 关键词. Defaults to None.
|
|
|
|
lang (MusicIndexTags.Lang) : 语言. Defaults to MusicIndexTags.Lang.ALL
|
|
|
|
genre (MusicIndexTags.Genre): 类型. Defaults to MusicIndexTags.Genre.ALL
|
|
|
|
order (MusicOrder) : 排序方式. Defaults to OrderAudio.NEW
|
|
|
|
page_num (int) : 页码. Defaults to 1.
|
|
|
|
page_size (int) : 每页的数据大小. Defaults to 10.
|
|
"""
|
|
api = API_audio["audio_info"]["audio_list"]
|
|
params = {
|
|
"type": order.value,
|
|
"lang": lang.value,
|
|
"genre": genre.value,
|
|
"keyword": keyword,
|
|
"pn": page_num,
|
|
"ps": page_size,
|
|
}
|
|
return await Api(**api).update_params(**params).result
|
|
|
|
|
|
class Music:
|
|
"""
|
|
音乐类。
|
|
|
|
此处的“音乐”定义:部分视频的标签中有里面出现过的音乐的标签, 可以点击音乐标签查看音乐信息。此类将提供查询音乐信息的接口。
|
|
|
|
其中音乐的 ID 为 `video.get_tags` 返回值数据中的 `music_id` 键值
|
|
"""
|
|
|
|
def __init__(self, music_id: str):
|
|
"""
|
|
Args:
|
|
music_id (str): 音乐 id,例如 MA436038343856245020
|
|
"""
|
|
self.__music_id = music_id
|
|
|
|
def get_music_id(self):
|
|
return self.__music_id
|
|
|
|
async def get_info(self):
|
|
"""
|
|
获取音乐信息
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["info"]["detail"]
|
|
params = {"music_id": self.__music_id}
|
|
return await Api(**api).update_params(**params).result
|
|
|
|
async def get_music_videos(self):
|
|
"""
|
|
获取音乐的音乐视频
|
|
|
|
Returns:
|
|
dict: 调用 API 返回的结果
|
|
"""
|
|
api = API["info"]["video_recommend_list"]
|
|
params = {"music_id": self.__music_id}
|
|
return await Api(**api).update_params(**params).result
|
|
|