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