""" bilibili_api.video_zone 分区相关操作,与频道不互通。 """ import os import copy import enum import json from typing import Dict, List, Tuple, Union from .utils.utils import get_api from .exceptions import ArgsException from .utils.credential import Credential from .utils.network import Api API = get_api("video_zone") def get_zone_info_by_tid(tid: int) -> Tuple[Union[dict, None], Union[dict, None]]: """ 根据 tid 获取分区信息。 Args: tid (int): 频道的 tid。 Returns: `Tuple[dict | None, dict | None]`: 第一个是主分区,第二个是子分区,没有时返回 None。 """ with open( os.path.join(os.path.dirname(__file__), "data/video_zone.json"), encoding="utf8" ) as f: channel = json.loads(f.read()) for main_ch in channel: if "tid" not in main_ch: continue if tid == int(main_ch["tid"]): return main_ch, None # 搜索子分区 if "sub" in main_ch.keys(): for sub_ch in main_ch["sub"]: if "tid" not in sub_ch: continue if tid == sub_ch["tid"]: return main_ch, sub_ch else: return None, None def get_zone_info_by_name(name: str) -> Tuple[Union[dict, None], Union[dict, None]]: """ 根据分区名称获取分区信息。 Args: name (str): 频道的名称。 Returns: Tuple[dict | None, dict | None]: 第一个是主分区,第二个是子分区,没有时返回 None。 """ with open( os.path.join(os.path.dirname(__file__), "data/video_zone.json"), encoding="utf8" ) as f: channel = json.loads(f.read()) for main_ch in channel: if name in main_ch["name"]: return main_ch, None if "sub" in main_ch.keys(): for sub_ch in main_ch["sub"]: if name in sub_ch["name"]: return main_ch, sub_ch else: return None, None async def get_zone_top10( tid: int, day: int = 7, credential: Union[Credential, None] = None ) -> dict: """ 获取分区前十排行榜。 Args: tid (int) : 频道的 tid。 day (int, optional) : 3 天排行还是 7 天排行。 Defaults to 7. credential (Credential | None, optional): Credential 类。Defaults to None. Returns: list: 前 10 的视频信息。 """ if credential is None: credential = Credential() if day not in (3, 7): raise ArgsException("参数 day 只能是 3,7。") api = API["ranking"]["get_top10"] params = {"rid": tid, "day": day} return await Api(**api, credential=credential).update_params(**params).result def get_zone_list() -> List[Dict]: """ 获取所有分区的数据 Returns: List[dict]: 所有分区的数据 """ with open( os.path.join(os.path.dirname(__file__), "data/video_zone.json"), encoding="utf8" ) as f: channel = json.loads(f.read()) channel_list = [] for channel_big in channel: channel_big_copy = copy.copy(channel_big) channel_list.append(channel_big_copy) if "sub" in channel_big.keys(): channel_big_copy.pop("sub") for channel_sub in channel_big["sub"]: channel_sub_copy = copy.copy(channel_sub) channel_sub_copy["father"] = channel_big_copy channel_list.append(channel_sub_copy) return channel_list def get_zone_list_sub() -> dict: """ 获取所有分区的数据 含父子关系(即一层次只有主分区) Returns: dict: 所有分区的数据 """ with open( os.path.join(os.path.dirname(__file__), "data/video_zone.json"), encoding="utf8" ) as f: channel = json.loads(f.read()) return channel async def get_zone_videos_count_today( credential: Union[Credential, None] = None ) -> dict: """ 获取每个分区当日最新投稿数量 Args: credential (Credential | None): 凭据类 Returns: dict: 调用 API 返回的结果 """ credential = credential if credential else Credential() api = API["count"] return (await Api(**api, credential=credential).result)["region_count"] async def get_zone_new_videos(tid: int, page_num: int = 1, page_size: int = 10) -> dict: """ 获取分区最新投稿 Args: tid (int) : 分区 id page_num (int) : 第几页. Defaults to 1. page_size (int) : 每页的数据大小. Defaults to 10. Returns: dict: 调用 API 返回的结果 """ api = API["new"] params = {"rid": tid, "pn": page_num, "ps": page_size} return await Api(**api).update_params(**params).result async def get_zone_hot_tags(tid: int) -> List[dict]: """ 获取分区热门标签 Args: tid (int) : 分区 id Returns: List[dict]: 热门标签 """ api = API["get_hot_tags"] params = {"rid": tid} return (await Api(**api).update_params(**params).result)[0] class VideoZoneTypes(enum.Enum): """ 所有分区枚举 - MAINPAGE: 主页 - ANIME: 番剧 - ANIME_SERIAL: 连载中番剧 - ANIME_FINISH: 已完结番剧 - ANIME_INFORMATION: 资讯 - ANIME_OFFICAL: 官方延伸 - MOVIE: 电影 - GUOCHUANG: 国创 - GUOCHUANG_CHINESE: 国产动画 - GUOCHUANG_ORIGINAL: 国产原创相关 - GUOCHUANG_PUPPETRY: 布袋戏 - GUOCHUANG_MOTIONCOMIC: 动态漫·广播剧 - GUOCHUANG_INFORMATION: 资讯 - TELEPLAY: 电视剧 - DOCUMENTARY: 纪录片 - DOUGA: 动画 - DOUGA_MAD: MAD·AMV - DOUGA_MMD: MMD·3D - DOUGA_HANDDRAWN: 短片·手书 - DOUGA_VOICE: 配音 - DOUGA_GARAGE_KIT: 手办·模玩 - DOUGA_TOKUSATSU: 特摄 - DOUGA_ACGNTALKS: 动漫杂谈 - DOUGA_OTHER: 综合 - GAME: 游戏 - GAME_STAND_ALONE: 单机游戏 - GAME_ESPORTS: 电子竞技 - GAME_MOBILE: 手机游戏 - GAME_ONLINE: 网络游戏 - GAME_BOARD: 桌游棋牌 - GAME_GMV: GMV - GAME_MUSIC: 音游 - GAME_MUGEN: Mugen - KICHIKU: 鬼畜 - KICHIKU_GUIDE: 鬼畜调教 - KICHIKU_MAD: 音MAD - KICHIKU_MANUAL_VOCALOID: 人力VOCALOID - KICHIKU_THEATRE: 鬼畜剧场 - KICHIKU_COURSE: 教程演示 - MUSIC: 音乐 - MUSIC_ORIGINAL: 原创音乐 - MUSIC_COVER: 翻唱 - MUSIC_PERFORM: 演奏 - MUSIC_VOCALOID: VOCALOID·UTAU - MUSIC_LIVE: 音乐现场 - MUSIC_MV: MV - MUSIC_COMMENTARY: 乐评盘点 - MUSIC_TUTORIAL: 音乐教学 - MUSIC_OTHER: 音乐综合 - DANCE: 舞蹈 - DANCE_OTAKU: 宅舞 - DANCE_HIPHOP: 街舞 - DANCE_STAR: 明星舞蹈 - DANCE_CHINA: 中国舞 - DANCE_THREE_D: 舞蹈综合 - DANCE_DEMO: 舞蹈教程 - DANGE_GESTURES: 手势·网红舞 - CINEPHILE: 影视 - CINEPHILE_CINECISM: 影视杂谈 - CINEPHILE_MONTAGE: 影视剪辑 - CINEPHILE_SHORTFILM: 短片 - CINEPHILE_SHORTPLAY: 小剧场 - CINEPHILE_TRAILER_INFO: 预告·资讯 - ENT: 娱乐 - ENT_VARIETY: 综艺 - ENT_TALKER: 娱乐杂谈 - ENT_FANS: 粉丝创作 - ENT_CELEBRITY: 明星综合 - KNOWLEDGE: 知识 - KNOWLEDGE_SCIENCE: 科学科普 - KNOWLEDGE_SOCIAL_SCIENCE: 社科·法律·心理 - KNOWLEDGE_HUMANITY_HISTORY: 人文历史 - KNOWLEDGE_BUSINESS: 财经商业 - KNOWLEDGE_CAMPUS: 校园学习 - KNOWLEDGE_CAREER: 职业职场 - KNOWLEDGE_DESIGN: 设计·创意 - KNOWLEDGE_SKILL: 野生技能协会 - TECH: 科技 - TECH_DIGITAL: 数码 - TECH_APPLICATION: 软件应用 - TECH_COMPUTER_TECH: 计算机技术 - TECH_INDUSTRY: 科工机械 - INFORMATION: 资讯 - INFORMATION_HOTSPOT: 热点 - INFORMATION_GLOBAL: 环球 - INFORMATION_SOCIAL: 社会 - INFORMATION_MULTIPLE: 综合 - FOOD: 美食 - FOOD_MAKE: 美食制作 - FOOD_DETECTIVE: 美食侦探 - FOOD_MEASUREMENT: 美食测评 - FOOD_RURAL: 田园美食 - FOOD_RECORD: 美食记录 - LIFE: 生活 - LIFE_FUNNY: 搞笑 - LIFE_TRAVEL: 出行 - LIFE_RURALLIFE: 三农 - LIFE_HOME: 家居房产 - LIFE_HANDMAKE: 手工 - LIFE_PAINTING: 绘画 - LIFE_DAILY: 日常 - CAR: 汽车 - CAR_RACING: 赛车 - CAR_MODIFIEDVEHICLE: 改装玩车 - CAR_NEWENERGYVEHICLE: 新能源车 - CAR_TOURINGCAR: 房车 - CAR_MOTORCYCLE: 摩托车 - CAR_STRATEGY: 购车攻略 - CAR_LIFE: 汽车生活 - FASHION: 时尚 - FASHION_MAKEUP: 美妆护肤 - FASHION_COS: 仿妆cos - FASHION_CLOTHING: 穿搭 - FASHION_TREND: 时尚潮流 - SPORTS: 运动 - SPORTS_BASKETBALL: 篮球 - SPORTS_FOOTBALL: 足球 - SPORTS_AEROBICS: 健身 - SPORTS_ATHLETIC: 竞技体育 - SPORTS_CULTURE: 运动文化 - SPORTS_COMPREHENSIVE: 运动综合 - ANIMAL: 动物圈 - ANIMAL_CAT: 喵星人 - ANIMAL_DOG: 汪星人 - ANIMAL_PANDA: 大熊猫 - ANIMAL_WILD_ANIMAL: 野生动物 - ANIMAL_REPTILES: 爬宠 - ANIMAL_COMPOSITE: 动物综合 - VLOG: VLOG """ MAINPAGE = 0 ANIME = 13 ANIME_SERIAL = 33 ANIME_FINISH = 32 ANIME_INFORMATION = 51 ANIME_OFFICAL = 152 MOVIE = 23 GUOCHUANG = 167 GUOCHUANG_CHINESE = 153 GUOCHUANG_ORIGINAL = 168 GUOCHUANG_PUPPETRY = 169 GUOCHUANG_MOTIONCOMIC = 195 GUOCHUANG_INFORMATION = 170 TELEPLAY = 11 DOCUMENTARY = 177 DOUGA = 1 DOUGA_MAD = 24 DOUGA_MMD = 25 DOUGA_HANDDRAWN = 47 DOUGA_VOICE = 257 DOUGA_GARAGE_KIT = 210 DOUGA_TOKUSATSU = 86 DOUGA_ACGNTALKS = 253 DOUGA_OTHER = 27 GAME = 4 GAME_STAND_ALONE = 17 GAME_ESPORTS = 171 GAME_MOBILE = 172 GAME_ONLINE = 65 GAME_BOARD = 173 GAME_GMV = 121 GAME_MUSIC = 136 GAME_MUGEN = 19 KICHIKU = 119 KICHIKU_GUIDE = 22 KICHIKU_MAD = 26 KICHIKU_MANUAL_VOCALOID = 126 KICHIKU_THEATRE = 216 KICHIKU_COURSE = 127 MUSIC = 3 MUSIC_ORIGINAL = 28 MUSIC_COVER = 31 MUSIC_PERFORM = 59 MUSIC_VOCALOID = 30 MUSIC_LIVE = 29 MUSIC_MV = 193 MUSIC_COMMENTARY = 243 MUSIC_TUTORIAL = 244 MUSIC_OTHER = 130 DANCE = 129 DANCE_OTAKU = 20 DANCE_HIPHOP = 198 DANCE_STAR = 199 DANCE_CHINA = 200 DANCE_THREE_D = 154 DANCE_DEMO = 156 DANCE_GESTURES = 255 CINEPHILE = 181 CINEPHILE_CINECISM = 182 CINEPHILE_MONTAGE = 183 CINEPHILE_SHORTPLAY = 85 CINEPHILE_SHORTFILM = 256 CINEPHILE_TRAILER_INFO = 184 ENT = 5 ENT_VARIETY = 71 ENT_TALKER = 241 ENT_FANS = 242 ENT_CELEBRITY = 137 KNOWLEDGE = 36 KNOWLEDGE_SCIENCE = 201 KNOWLEDGE_SOCIAL_SCIENCE = 124 KNOWLEDGE_HUMANITY_HISTORY = 228 KNOWLEDGE_BUSINESS = 207 KNOWLEDGE_CAMPUS = 208 KNOWLEDGE_CAREER = 209 KNOWLEDGE_DESIGN = 229 KNOWLEDGE_SKILL = 122 TECH = 188 TECH_DIGITAL = 95 TECH_APPLICATION = 230 TECH_COMPUTER_TECH = 231 TECH_INDUSTRY = 232 INFORMATION = 202 INFORMATION_HOTSPOT = 203 INFORMATION_GLOBAL = 204 INFORMATION_SOCIAL = 205 INFORMATION_MULTIPLE = 206 FOOD = 211 FOOD_MAKE = 76 FOOD_DETECTIVE = 212 FOOD_MEASUREMENT = 213 FOOD_RURAL = 214 FOOD_RECORD = 215 LIFE = 160 LIFE_FUNNY = 138 LIFE_TRAVEL = 250 LIFE_RURALLIFE = 251 LIFE_HOME = 239 LIFE_HANDMAKE = 161 LIFE_PAINTING = 162 LIFE_DAILY = 21 CAR = 223 CAR_RACING = 245 CAR_MODIFIEDVEHICLE = 246 CAR_NEWENERGYVEHICLE = 246 CAR_TOURINGCAR = 248 CAR_MOTORCYCLE = 240 CAR_STRATEGY = 227 CAR_LIFE = 176 FASHION = 155 FASHION_MAKEUP = 157 FASHION_COS = 252 FASHION_CLOTHING = 158 FASHION_TREND = 159 SPORTS = 234 SPORTS_BASKETBALL = 235 SPORTS_FOOTBALL = 249 SPORTS_AEROBICS = 164 SPORTS_ATHLETIC = 236 SPORTS_CULTURE = 237 SPORTS_COMPREHENSIVE = 238 ANIMAL = 217 ANIMAL_CAT = 218 ANIMAL_DOG = 219 ANIMAL_PANDA = 220 ANIMAL_WILD_ANIMAL = 221 ANIMAL_REPTILES = 222 ANIMAL_COMPOSITE = 75 VLOG = 19