Spaces:
Sleeping
Sleeping
""" | |
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 | |