Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ yutto = "yutto.__main__:main"

[dependency-groups]
dev = [
"pyright>=1.1.407",
"ruff>=0.14.6",
"typos>=1.40.0",
"pytest>=9.0.1",
"pyright>=1.1.408",
"ruff>=0.14.11",
"typos>=1.42.0",
"pytest>=9.0.2",
"pytest-rerunfailures>=16.1",
"syrupy>=5.0.0",
"pytest-codspeed>=4.2.0",
Expand Down
80 changes: 40 additions & 40 deletions src/yutto/api/bangumi.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
from yutto.exceptions import NoAccessPermissionError, UnSupportedTypeError
from yutto.media.codec import audio_codec_map, video_codec_map
from yutto.types import (
AudioUrlMeta,
BvId,
CId,
EpisodeId,
SeasonId,
VideoUrlMeta,
format_ids,
)
from yutto.utils.console.logger import Logger
Expand All @@ -22,11 +24,9 @@
from httpx import AsyncClient

from yutto.types import (
AudioUrlMeta,
AvId,
MediaId,
MultiLangSubtitle,
VideoUrlMeta,
)
from yutto.utils.fetcher import FetcherContext

Expand Down Expand Up @@ -75,22 +75,22 @@ async def get_bangumi_list(ctx: FetcherContext, client: AsyncClient, season_id:
# 如 https://www.bilibili.com/bangumi/play/ep409825 中的「次元发电机采访」
# 和 https://www.bilibili.com/bangumi/play/ep424859 中的「编辑推荐」
section_episodes += section["episodes"]
return {
"title": result["title"],
"pages": [
{
"id": i + 1,
"name": _bangumi_episode_title(item["title"], item["long_title"]),
"cid": CId(str(item["cid"])),
"episode_id": EpisodeId(str(item["id"])),
"avid": BvId(item["bvid"]),
"is_section": i >= len(result["episodes"]),
"is_preview": item["badge"] == "预告", # 并不是一种鲁棒的方式,但目前貌似没有更好的方式了
"metadata": _parse_bangumi_metadata(item),
}
return BangumiList(
title=result["title"],
pages=[
BangumiListItem(
id=i + 1,
name=_bangumi_episode_title(item["title"], item["long_title"]),
cid=CId(str(item["cid"])),
episode_id=EpisodeId(str(item["id"])),
avid=BvId(item["bvid"]),
is_section=i >= len(result["episodes"]),
is_preview=item["badge"] == "预告", # 并不是一种鲁棒的方式,但目前貌似没有更好的方式了
metadata=_parse_bangumi_metadata(item),
)
for i, item in enumerate(result["episodes"] + section_episodes)
],
}
)


async def get_bangumi_playurl(
Expand All @@ -113,38 +113,38 @@ async def get_bangumi_playurl(
raise UnSupportedTypeError(f"该视频({format_ids(avid, cid)})尚不支持 DASH 格式")

videos: list[VideoUrlMeta] = [
{
"url": video["base_url"],
"mirrors": video["backup_url"] if video["backup_url"] is not None else [],
"codec": video_codec_map[video["codecid"]],
"width": video["width"],
"height": video["height"],
"quality": video["id"],
}
VideoUrlMeta(
url=video["base_url"],
mirrors=video["backup_url"] if video["backup_url"] is not None else [],
codec=video_codec_map[video["codecid"]],
width=video["width"],
height=video["height"],
quality=video["id"],
)
for video in video_info["dash"]["video"]
]
audios: list[AudioUrlMeta] = [
{
"url": audio["base_url"],
"mirrors": audio["backup_url"] if audio["backup_url"] is not None else [],
"codec": audio_codec_map[audio["codecid"]],
"width": 0,
"height": 0,
"quality": audio["id"],
}
AudioUrlMeta(
url=audio["base_url"],
mirrors=audio["backup_url"] if audio["backup_url"] is not None else [],
codec=audio_codec_map[audio["codecid"]],
width=0,
height=0,
quality=audio["id"],
)
for audio in video_info["dash"]["audio"]
]
if video_info["dash"]["dolby"] is not None and video_info["dash"]["dolby"]["audio"] is not None:
dolby_audios_json = video_info["dash"]["dolby"]["audio"]
audios.extend(
{
"url": dolby_audio_json["base_url"],
"mirrors": dolby_audio_json["backup_url"] if dolby_audio_json["backup_url"] is not None else [],
"codec": "eac3", # TODO: 由于这里的 codecid 仍然是 0,所以无法通过 audio_codec_map 转换,暂时直接硬编码
"width": 0,
"height": 0,
"quality": dolby_audio_json["id"],
}
AudioUrlMeta(
url=dolby_audio_json["base_url"],
mirrors=dolby_audio_json["backup_url"] if dolby_audio_json["backup_url"] is not None else [],
codec="eac3", # TODO: 由于这里的 codecid 仍然是 0,所以无法通过 audio_codec_map 转换,暂时直接硬编码
width=0,
height=0,
quality=dolby_audio_json["id"],
)
for dolby_audio_json in dolby_audios_json
)
return (videos, audios)
Expand Down
60 changes: 30 additions & 30 deletions src/yutto/api/cheese.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
from yutto.media.codec import audio_codec_map, video_codec_map
from yutto.types import (
AId,
AudioUrlMeta,
CId,
EpisodeId,
SeasonId,
VideoUrlMeta,
format_ids,
)
from yutto.utils.console.logger import Logger
Expand All @@ -21,10 +23,8 @@
from httpx import AsyncClient

from yutto.types import (
AudioUrlMeta,
AvId,
MultiLangSubtitle,
VideoUrlMeta,
)
from yutto.utils.fetcher import FetcherContext

Expand Down Expand Up @@ -59,20 +59,20 @@ async def get_cheese_list(ctx: FetcherContext, client: AsyncClient, season_id: S
raise NoAccessPermissionError(f"无法解析该课程列表(season_id: {season_id}),原因:{resp_json.get('message')}")
result = resp_json["data"]
section_episodes = result["episodes"]
return {
"title": result["title"],
"pages": [
{
"id": i + 1,
"name": item["title"],
"cid": CId(str(item["cid"])),
"episode_id": EpisodeId(str(item["id"])),
"avid": AId(str(item["aid"])),
"metadata": _parse_cheese_metadata(item),
}
return CheeseList(
title=result["title"],
pages=[
CheeseListItem(
id=i + 1,
name=item["title"],
cid=CId(str(item["cid"])),
episode_id=EpisodeId(str(item["id"])),
avid=AId(str(item["aid"])),
metadata=_parse_cheese_metadata(item),
)
for i, item in enumerate(section_episodes)
],
}
)


async def get_cheese_playurl(
Expand All @@ -95,25 +95,25 @@ async def get_cheese_playurl(
raise UnSupportedTypeError(f"该视频({format_ids(avid, cid)})尚不支持 DASH 格式")
return (
[
{
"url": video["base_url"],
"mirrors": video["backup_url"] if video["backup_url"] is not None else [],
"codec": video_codec_map[video["codecid"]],
"width": video["width"],
"height": video["height"],
"quality": video["id"],
}
VideoUrlMeta(
url=video["base_url"],
mirrors=video["backup_url"] if video["backup_url"] is not None else [],
codec=video_codec_map[video["codecid"]],
width=video["width"],
height=video["height"],
quality=video["id"],
)
for video in resp_json["data"]["dash"]["video"]
],
[
{
"url": audio["base_url"],
"mirrors": audio["backup_url"] if audio["backup_url"] is not None else [],
"codec": audio_codec_map[audio["codecid"]],
"width": 0,
"height": 0,
"quality": audio["id"],
}
AudioUrlMeta(
url=audio["base_url"],
mirrors=audio["backup_url"] if audio["backup_url"] is not None else [],
codec=audio_codec_map[audio["codecid"]],
width=0,
height=0,
quality=audio["id"],
)
for audio in resp_json["data"]["dash"]["audio"]
],
)
Expand Down
Loading
Loading