在~/biliread/down.py 这个路径里创建脚本,内容如下:
import sys,os
import argparse
from pathlib import Path
try:
from bilix.sites.bilibili import DownloaderBilibili, api
from bilix.utils import legal_title, json2srt
import asyncio
except ImportError:
print("请先安装 bilix: pip install bilix", file=sys.stderr)
sys.exit(1)
script_path = os.path.realpath(__file__)
script_dir = os.path.dirname(script_path)
async def main():
parser = argparse.ArgumentParser(
description="下载 bilibili 视频的字幕或音频。优先下载字幕,若无字幕则下载音频。"
)
parser.add_argument("url", help="bilibili 视频 URL")
args = parser.parse_args()
url = args.url
async with DownloaderBilibili() as d:
video_info = await api.get_video_info(d.client, url)
path = Path(script_dir)
# 优先下载字幕
paths = await d.get_subtitle(url, path=path, video_info=video_info)
if paths:
for p in paths:
print(p)
return
# 无字幕,下载音频
p_name = legal_title(video_info.pages[video_info.p].p_name)
task_name = legal_title(video_info.title, p_name)
base_name = (
p_name
if len(video_info.title) > d.title_overflow and d.hierarchy and p_name
else task_name
)
media_name = base_name
video, audio = video_info.dash.choose_quality(0, "")
if not audio:
print("无法获取音频", file=sys.stderr)
sys.exit(1)
a_path = path / f"{media_name}{audio.suffix}"
if not os.path.exists(a_path):
await d.get_file(audio.urls, path=a_path)
print(a_path)
asyncio.run(main())
它的作用是,获取https://www.bilibili.com/video/ 开头的视频链接的字幕或音频。
然后,把它也做成一个skills,放到~/.openclaw/skills/里。脚本依然放在原位置,因为我希望下载过的视频缓存在那边文件夹,skills里面用绝对路径执行脚本即可。skills在需要访问(比如用户要总结某个视频的内容)指定的https://www.bilibili.com/video/ 开头的视频时激活,如果下载了音频,则在skills里提示,需要使用其他相关的语音转文字skills去识别音频中的内容。另外在skills里提到,不要删除下载了的文件,而是保留在脚本旁边的文件夹里