Spaces:
Sleeping
Sleeping
""" | |
bilibili_api.article_category | |
专栏分类相关 | |
""" | |
import os | |
import copy | |
import json | |
from enum import Enum | |
from typing import List, Tuple, Optional | |
from .utils.utils import get_api | |
from .utils.network import Api | |
API = get_api("article-category") | |
class ArticleOrder(Enum): | |
""" | |
专栏排序方式. | |
+ DEFAULT: 默认 | |
+ TIME: 投稿时间排序 | |
+ LIKE: 点赞数最多 | |
+ COMMENTS: 评论数最多 | |
+ FAVORITES: 收藏数最多 | |
""" | |
DEFAULT = 0 | |
TIME = 1 | |
LIKE = 2 | |
COMMENTS = 3 | |
FAVORITES = 4 | |
def get_category_info_by_id(id: int) -> Tuple[Optional[dict], Optional[dict]]: | |
""" | |
获取专栏分类信息 | |
Args: | |
id (int): id | |
Returns: | |
Tuple[dict | None, dict | None]: 第一个是主分区,第二个是字分区。没有找到则为 (None, None) | |
""" | |
with open( | |
os.path.join(os.path.dirname(__file__), "data/article_category.json"), | |
encoding="utf-8", | |
) as f: | |
data = json.loads(f.read()) | |
for main_category in data: | |
if main_category["id"] == id: | |
return main_category, None | |
for sub_category in main_category["children"]: | |
if sub_category["id"] == id: | |
return main_category, sub_category | |
else: | |
return None, None | |
def get_category_info_by_name(name: str) -> Tuple[Optional[dict], Optional[dict]]: | |
""" | |
获取专栏分类信息 | |
Args: | |
name (str): 分类名 | |
Returns: | |
Tuple[dict | None, dict | None]: 第一个是主分区,第二个是字分区。没有找到则为 (None, None) | |
""" | |
with open( | |
os.path.join(os.path.dirname(__file__), "data/article_category.json"), | |
encoding="utf-8", | |
) as f: | |
data = json.loads(f.read()) | |
for main_category in data: | |
if main_category["name"] == name: | |
return main_category, None | |
for sub_category in main_category["children"]: | |
if sub_category["name"] == name: | |
return main_category, sub_category | |
else: | |
return None, None | |
def get_categories_list() -> List[dict]: | |
""" | |
获取所有的分类的数据 | |
Returns: | |
List[dict]: 所有分区的数据 | |
""" | |
with open( | |
os.path.join(os.path.dirname(__file__), "data/article_category.json"), | |
encoding="utf-8", | |
) as f: | |
data = json.loads(f.read()) | |
categories_list = [] | |
for main_category in data: | |
main_category_copy = copy.copy(main_category) | |
categories_list.append(main_category_copy) | |
main_category_copy.pop("children") | |
for sub_category in main_category["children"]: | |
sub_category_copy = copy.copy(sub_category) | |
sub_category_copy["father"] = main_category_copy | |
categories_list.append(sub_category_copy) | |
return categories_list | |
def get_categories_list_sub() -> dict: | |
""" | |
获取所有分区的数据 | |
含父子关系(即一层次只有主分区) | |
Returns: | |
dict: 所有分区的数据 | |
""" | |
with open( | |
os.path.join(os.path.dirname(__file__), "data/article_category.json"), | |
encoding="utf-8", | |
) as f: | |
return json.loads(f.read()) | |
async def get_category_recommend_articles( | |
category_id: int = 0, | |
order: ArticleOrder = ArticleOrder.DEFAULT, | |
page_num: int = 1, | |
page_size: int = 20, | |
) -> dict: | |
""" | |
获取指定分区的推荐文章 | |
Args: | |
category_id (int) : 专栏分类的 id, 0 为全部. Defaults to 0. | |
order (ArticleOrder): 排序方式. Defaults to ArticleOrder.DEFAULT. | |
page_num (int) : 页码. Defaults to 1. | |
page_size (int) : 每一页数据大小. Defaults to 20. | |
Returns: | |
dict: 调用 API 返回的结果 | |
""" | |
api = API["info"]["recommends"] | |
params = {"cid": category_id, "sort": order.value, "pn": page_num, "ps": page_size} | |
return await Api(**api).update_params(**params).result | |