""" 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