rogerxavier's picture
Upload 258 files
0aee47a verified
raw
history blame
No virus
2.06 kB
"""
ivitools.download
下载互动视频
"""
import os
import tqdm
import requests
from colorama import Fore
from bilibili_api import sync, interactive_video
async def download_file(url: str, out: str):
resp = requests.get(
url,
headers={"User-Agent": "Mozilla/5.0", "Referer": "https://www.bilibili.com"},
stream=True,
)
headers = resp.headers
CHUNK_SIZE = 1024
parts = int(headers["Content-Length"]) // CHUNK_SIZE
if int(headers["Content-Length"]) % CHUNK_SIZE != 0:
parts += 1
fp = open(out, "wb")
bar = tqdm.tqdm(range(parts))
bar.set_description("DOWNLOADING...")
bar.display()
for chunk in resp.iter_content(CHUNK_SIZE):
fp.write(chunk)
bar.update(1)
def download_interactive_video(bvid: str, out: str):
ivideo = interactive_video.InteractiveVideo(bvid)
downloader = interactive_video.InteractiveVideoDownloader(
ivideo, out, download_file
)
@downloader.on("START")
async def on_start(data):
print("Start downloading " + bvid + "...")
@downloader.on("GET")
async def on_get(data):
print(f'Get node {data["title"]} (node_id: {data["node_id"]}). ')
@downloader.on("PREPARE_DOWNLOAD")
async def on_prepare_download(data):
print(
f'Start download the video for cid {data["cid"]}'
)
@downloader.on("PACKAGING")
async def on_packaing(data):
print("Almost!!! It's packaging your interactive video now! ")
@downloader.on("SUCCESS")
async def on_success(data):
print(
Fore.GREEN
+ "Congratulations! Your IVI file is ready. Check it at "
+ os.path.abspath(out)
+ ". "
+ Fore.RESET
)
try:
sync(downloader.start())
except KeyboardInterrupt:
sync(downloader.abort())
print(Fore.YELLOW + "[WRN]: Aborted by user. " + Fore.RESET)
except Exception as e:
raise e