Giter Club home page Giter Club logo

bilix's Introduction

bilix

GitHub license PyPI GitHub commit activity PyPI - Downloads

⚡️快如闪电的 bilibili 视频下载工具,基于 Python 现代 Async 异步特性,高速批量下载整部动漫,电视剧,电影,up投稿...

⚡️在200M宽带中实测可以拉满网速

特性 Features

高性能,高并发,Asynchronous everywhere,得益于Python对于协程的支持,以及现代 Async HTTP 框架 httpx ,和 anyio

  • 媒体文件(音频/视频)分段异步下载,以及备选服务器的同时利用
  • 视频的音画异步下载与合成
  • 视频之间乃至任务之间的异步下载
  • 断点续传
  • 用户可控的并发量设置
  • 与高并发配合的很好的进度条
  • HTTP/2协议支持

依赖环境 Environment

  1. pip安装(需要python3.8及以上)
pip install bilix
  1. FFmpeg :一个命令行视频工具,用于合成下载的音频和视频

    • macOS 下可以通过brew install ffmpeg进行安装。
    • Windows 下载请至官网 https://ffmpeg.org/download.html#build-windows ,安装好后需要配置环境变量。
    • 最终确保在命令行中可以调用ffmpeg命令即可。

快速上手 Quick Start

bilix提供了简单的命令行使用方式,打开终端开始下载吧~

批量下载

批量下载整部动漫,电视剧,电影,up投稿.....只需要把命令中的url替换成你要下载的系列中任意一个视频的网页链接。
到 bilibili 上找一个来试试吧~,比如这个李宏毅老师的机器学习视频:链接

bilix get_series 'url'

bilix会下载文件至命令行当前目录的videos文件夹中,默认自动创建。

💡提示:在zsh终端中可能要用''将url包住,其他终端暂未测试。

  • 目前支持的类型
    • 投稿视频
    • 番剧
    • 电视剧
    • 纪录片
    • 电影

get_series很强大,会自动识别系列所有视频并下载,如果该系列只有一个视频(比如单p投稿)也是可以正常下载的。

💡什么是一个系列:比如一个多p投稿的所有p,一部动漫的所有集。

另外get_series支持集数选择参数-p,例如通过-p 1 3即可指定下载P1至P3的视频

单个下载

用户😨:我不想下载那么多,只想下载单个视频。没问题,试试这个,只需要提供那个视频的网页链接:

bilix get_video 'url'

下载音频

假设你喜欢音乐区,只想下载音频,那么可以使用可选参数--only-audio,例如下面是下载A叔一个钢琴曲合集音频的例子

bilix get_series 'https://www.bilibili.com/video/BV1ts411D7mf' --only-audio

下载特定up主的投稿

假设你是一个嘉心糖,想要下载嘉然小姐最新投稿的100个视频,那么你可以使用命令:

bilix get_up 'https://space.bilibili.com/672328094' --num 100

https://space.bilibili.com/672328094 是up空间页url,另外用up主id672328094替换url同样也是可以的

下载分区视频

假设你喜欢看舞蹈区👍,想要下载最近30天播放量最高的20个超级敏感宅舞视频,那么你可以使用

bilix get_cate 宅舞 --keyword 超级敏感 --order click --num 20 --days 30

get_cate支持大部分分区,可以使用排序,关键词搜索等,详细请参考bilix -h或代码注释

下载收藏夹视频

如果你需要下载自己或者其他人收藏夹中的视频,你可以使用get_favour方法

bilix get_favour 'https://space.bilibili.com/11499954/favlist?fid=1445680654' --num 20

https://space.bilibili.com/11499954/favlist?fid=1445680654 是收藏夹url,如果要知道一个收藏夹的url是什么, 最简单的办法是在b站网页左侧列表中点击切换到该收藏夹,url就会出现在浏览器的地址栏中。另外直接使用url中的fid1445680654替换url也是可以的。

下载合集或视频列表

如果你需要下载up主发布的合集或视频列表,你可以使用get_collect方法

bilix get_collect 'url'

url替换为某个合集或视频列表详情页的url(例如这个)即可下载合集或列表内所有视频

💡合集和视频列表有什么区别?b站的合集可以订阅,列表则没有这个功能,但是他们都在up主空间页面的合集和列表菜单中,例如这个get_collect则会根据详情页url中的信息判断这个链接是合集还是列表

下载字幕,弹幕,封面...

在命令中加入可选参数--subtitle(字幕) --dm(弹幕) --image(封面),即可下载这些附属文件

bilix get_series 'url' --subtitle --dm --image

进阶使用 Advance Guide

请使用bilix -h查看更多参数提示,包括方法名简写,视频画面质量选择,并发量控制,下载目录等。

方法名简写

觉得get_series,get_video这些方法名写起来太麻烦了?同感!你可以使用他们的简写,这样快多了:

bilix s 'url'
bilix v 'url'
...

你是大会员?🥸

请在--cookie参数中填写浏览器缓存的SESSDATAcookie,填写后可以下载需要大会员的视频。

另外如果你总是需要附加--cookie参数,可以使用alias命令,例如alias bilix=/.../python -m bilix --cookie xxxxxxxx

在 python 中调用

觉得命令行太麻烦,不够强大?想要直接调用模块?下面是一个小例子。

import asyncio
from bilix import DownloaderBilibili


async def main():
    d = DownloaderBilibili(video_concurrency=5, part_concurrency=10)
    cor1 = d.get_series(
        'https://www.bilibili.com/bangumi/play/ss28277?spm_id_from=333.337.0.0'
        , quality=999)
    cor2 = d.get_up_videos(url_or_mid='436482484')
    cor3 = d.get_video('https://www.bilibili.com/bangumi/play/ep477122?from_spmid=666.4.0.0')
    await asyncio.gather(cor1, cor2, cor3)
    await d.aclose()


if __name__ == '__main__':
    asyncio.run(main())

DownloaderBilibili类的下载方法都是异步的,例如d.get_series(...)返回的是一个协程Coroutine对象,我们可以自由组合这些方法的返回值,然后通过await asyncio.gather 方法并发执行这些任务。例如上面的例子中我们同时执行了三种不同的任务。

你要组合很多很多任务?不用担心!d对象执行这些任务的并发度受到初始化参数的严格控制🫡,video_concurrency控制了同时下载的视频数量,而part_concurrency 则控制了每个媒体文件(音频/画面)的分段并发数,如果你不太明白可以在代码和注释中找到他们的详细作用,或者就让他们保持默认吧。

关于断点重连

用户可以通过Ctrl+C中断任务,对于未完成的文件,重新执行命令会在之前的进度基础上下载,已完成的文件会进行跳过。但是对于未完成的文件,以下情况不能使用断点重连,建议清除未完成任务的临时文件再执行命令。

  • 中断后改变画面质量
  • 中断后改变分段并发数--part-con

🫠在0.6.4版本之前的断点重连存在bug,可能导致视频音画缺失,请通过命令升级最新版本

pip install bilix --upgrade

欢迎提问

由于本项目受到b站接口或者网站前端变动的影响,如果你发现任何bug或者其他问题,欢迎提issue,作者会保证最新版本可以正常运行。

如果觉得该项目对你有所帮助,可以给作者一个小小的Star🌟

未来工作

功能

  • 支持合成封面
  • 支持切片下载

工程

  • 每日测试(GitHub Action)

已知的bug 🤡

  • 当两个视频名字完全一样时,任务冲突但不会报错,可能导致视频缺胳膊少腿
  • 不支持少数没有音画分开下载方式(dash)的视频

bilix's People

Contributors

hfrost0 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.