Spaces:
Sleeping
Sleeping
""" | |
bilibili_api.opus | |
图文相关 | |
""" | |
import enum | |
import yaml | |
from typing import Optional | |
from . import article | |
from . import dynamic | |
from .utils.credential import Credential | |
from .utils.network import Api | |
from .utils.utils import get_api, raise_for_statement | |
from .utils import cache_pool | |
API = get_api("opus") | |
class OpusType(enum.Enum): | |
""" | |
图文类型 | |
+ ARTICLE: 专栏 | |
+ DYNAMIC: 动态 | |
""" | |
ARTICLE = 1 | |
DYNAMIC = 0 | |
class Opus: | |
""" | |
图文类。 | |
Attributes: | |
credential (Credential): 凭据类 | |
""" | |
def __init__(self, opus_id: int, credential: Optional[Credential] = None): | |
self.__id = opus_id | |
self.credential = credential if credential else Credential() | |
if cache_pool.opus_type.get(self.__id): | |
self.__info = cache_pool.opus_info[self.__id] | |
self.__type = OpusType(cache_pool.opus_type[self.__id]) | |
else: | |
api = API["info"]["detail"] | |
params = {"timezone_offset": -480, "id": self.__id} | |
self.__info = ( | |
Api(**api, credential=self.credential) | |
.update_params(**params) | |
.result_sync | |
)["item"] | |
self.__type = OpusType(self.__info["type"]) | |
cache_pool.opus_info[self.__id] = self.__info | |
cache_pool.opus_type[self.__id] = self.__type.value | |
def get_opus_id(self): | |
return self.__id | |
def get_type(self): | |
""" | |
获取图文类型(专栏/动态) | |
Returns: | |
OpusType: 图文类型 | |
""" | |
return self.__type | |
def turn_to_article(self) -> "article.Article": | |
""" | |
对专栏图文,转换为专栏 | |
""" | |
raise_for_statement(self.__type == OpusType.ARTICLE, "仅支持专栏图文") | |
cvid = int(self.__info["basic"]["rid_str"]) | |
cache_pool.article_is_opus[cvid] = 1 | |
cache_pool.article_dyn_id[cvid] = self.__id | |
return article.Article(cvid=cvid, credential=self.credential) | |
def turn_to_dynamic(self) -> "dynamic.Dynamic": | |
""" | |
转为动态 | |
""" | |
cache_pool.dynamic_is_opus[self.__id] = 1 | |
return dynamic.Dynamic(dynamic_id=self.__id, credential=self.credential) | |
async def get_info(self): | |
""" | |
获取图文基本信息 | |
Returns: | |
dict: 调用 API 返回的结果 | |
""" | |
api = API["info"]["detail"] | |
params = {"timezone_offset": -480, "id": self.__id} | |
return ( | |
await Api(**api, credential=self.credential).update_params(**params).result | |
) | |
def markdown(self) -> str: | |
""" | |
将图文转为 markdown | |
Returns: | |
str: markdown 内容 | |
""" | |
title, author, content = self.__info["modules"][:3] | |
markdown = f'# {title["module_title"]["text"]}\n\n' | |
for para in content["module_content"]["paragraphs"]: | |
para_raw = "" | |
if para["para_type"] == 1: | |
for node in para["text"]["nodes"]: | |
raw = node["word"]["words"] | |
if node["word"].get("style"): | |
if node["word"]["style"].get("bold"): | |
if node["word"]["style"]["bold"]: | |
raw = f" **{raw}**" | |
para_raw += raw | |
else: | |
for pic in para["pic"]["pics"]: | |
para_raw += f'![]({pic["url"]})\n' | |
markdown += f"{para_raw}\n\n" | |
meta_yaml = yaml.safe_dump(self.__info, allow_unicode=True) | |
content = f"---\n{meta_yaml}\n---\n\n{markdown}" | |
return content | |