BBDown:高效便捷的哔哩哔哩视频下载工具

BBDown:高效便捷的哔哩哔哩视频下载工具

项目描述

BBDown是一个免费且便捷高效的哔哩哔哩下载/解析软件,支持命令行操作和HTTP API服务。该项目采用C#开发,提供完整的B站视频解析和下载解决方案,支持多种视频格式、多线程下载、弹幕下载等丰富功能。

功能特性

  • 多平台解析:支持Web端、TV端、APP端和国际版API解析模式
  • 多种下载方式:支持普通下载、aria2c下载和多线程下载
  • 格式支持:支持HEVC、AV1、AVC等多种视频编码格式
  • 画质选择:提供丰富的画质优先级设置,支持8K、杜比视界等高清格式
  • 弹幕处理:支持XML和ASS格式的弹幕下载
  • API服务:内置HTTP服务器,提供完整的RESTful API接口
  • 批量下载:支持收藏夹、合集、系列列表等批量下载功能
  • 交互式选择:提供交互式清晰度选择界面

安装指南

通过Dotnet Tool安装

如果你本地有dotnet环境,使用如下命令即可安装使用:

bash 复制代码
dotnet tool install --global BBDown

更新BBDown

bash 复制代码
dotnet tool update --global BBDown

系统要求

  • .NET运行时环境
  • 混流需要外部程序:ffmpeg或mp4box
  • 杜比视界需要ffmpeg 5.0以上或新版mp4box

下载地址

使用说明

基础使用

bash 复制代码
BBDown <url> [options]

常用参数示例

bash 复制代码
# 仅显示视频信息而不下载
BBDown "BV1qt4y1X7TW" --only-show-info

# 使用TV端API解析
BBDown "BV1qt4y1X7TW" --use-tv-api

# 设置编码优先级
BBDown "BV1qt4y1X7TW" --encoding-priority "hevc,av1,avc"

# 多线程下载
BBDown "BV1qt4y1X7TW" --multi-thread

# 使用aria2c下载
BBDown "BV1qt4y1X7TW" --use-aria2c

API服务器模式

启动服务器模式后,BBDown会在本地启动HTTP服务,提供以下API接口:

获取任务列表
bash 复制代码
curl http://localhost:58682/get-tasks/
添加下载任务
bash 复制代码
curl -X POST -H 'Content-Type: application/json' -d '{"Url": "BV1qt4y1X7TW"}' http://localhost:58682/add-task
下载到指定目录
bash 复制代码
curl -X POST -H 'Content-Type: application/json' -d '{"Url": "BV1qt4y1X7TW", "FilePattern": "/Downloads/<videoTitle>[<dfn>]"}' http://localhost:58682/add-task

核心代码

下载任务管理

csharp 复制代码
public class DownloadTask
{
    public string Aid { get; set; } = default!;
    public string Url { get; set; } = default!;
    public long TaskCreateTime { get; set; }
    public string? Title { get; set; }
    public string? Pic { get; set; }
    public long? VideoPubTime { get; set; }
    public long? TaskFinishTime { get; set; }
    public double Progress { get; set; }
    public double DownloadSpeed { get; set; }
    public double TotalDownloadedBytes { get; set; }
    public bool IsSuccessful { get; set; }
}

public class DownloadTaskCollection
{
    public List<DownloadTask> Running { get; set; } = new();
    public List<DownloadTask> Finished { get; set; } = new();
    
    public DownloadTaskCollection(List<DownloadTask> running, List<DownloadTask> finished)
    {
        Running = running;
        Finished = finished;
    }
}

多线程下载实现

csharp 复制代码
public static class BBDownDownloadUtil
{
    public class DownloadConfig
    {
        public bool UseAria2c { get; set; } = false;
        public string Aria2cArgs { get; set; } = string.Empty;
        public bool ForceHttp { get; set; } = false;
        public bool MultiThread { get; set; } = false;
        public DownloadTask? RelatedTask { get; set; } = null;
    }

    private static async Task RangeDownloadToTmpAsync(int id, string url, string tmpName, 
        long fromPosition, long? toPosition, Action<int, long, long> onProgress, 
        bool failOnRangeNotSupported = false)
    {
        // 实现范围下载和进度回调
        DateTimeOffset? lastTime = File.Exists(tmpName) ? 
            new FileInfo(tmpName).LastWriteTimeUtc : null;
        
        using var fileStream = new FileStream(tmpName, FileMode.OpenOrCreate);
        fileStream.Seek(0, SeekOrigin.End);
        
        // 下载逻辑实现...
    }
}

视频解析器工厂

csharp 复制代码
public static class FetcherFactory
{
    public static IFetcher CreateFetcher(string aidOri, bool useIntlApi)
    {
        IFetcher fetcher = new NormalInfoFetcher();
        
        if (aidOri.StartsWith("cheese"))
        {
            fetcher = new CheeseInfoFetcher();
        }
        else if (aidOri.StartsWith("ep"))
        {
            fetcher = useIntlApi ? 
                new IntlBangumiInfoFetcher() : new BangumiInfoFetcher();
        }
        else if (aidOri.StartsWith("mid"))
        {
            fetcher = new SpaceVideoFetcher();
        }
        // 更多解析器类型...
        
        return fetcher;
    }
}

进度条显示

csharp 复制代码
public class ProgressBar : IDisposable, IProgress<double>
{
    private const int blockCount = 40;
    private readonly TimeSpan animationInterval = TimeSpan.FromSeconds(1.0 / 8);
    private const string animation = @"|/-\";

    public void Report(double value)
    {
        // 确保进度值在0-1范围内
        value = Math.Max(0, Math.Min(1, value));
        Interlocked.Exchange(ref currentProgress, value);
    }

    public void Report(double value, long bytesCount)
    {
        value = Math.Max(0, Math.Min(1, value));
        Interlocked.Exchange(ref currentProgress, value);
        Interlocked.Exchange(ref downloadedBytes, bytesCount);
    }
    
    // 进度显示和速度计算实现...
}

配置文件解析

csharp 复制代码
internal static class BBDownConfigParser
{
    public static void HandleConfig(List<string> newArgsList, RootCommand rootCommand)
    {
        try
        {
            var configPath = newArgsList.Contains("--config-file")
                ? newArgsList.ElementAt(newArgsList.IndexOf("--config-file") + 1)
                : Path.Combine(Program.APP_DIR, "BBDown.config");
                
            if (File.Exists(configPath))
            {
                // 配置文件读取和解析逻辑
                var configArgs = File
                    .ReadAllLines(configPath)
                    .Where(s => !string.IsNullOrEmpty(s) && !s.StartsWith('#'))
                    .SelectMany(s => ParseConfigLine(s));
                
                // 命令行参数优先级 > 配置文件优先级
            }
        }
        catch (Exception)
        {
            LogError("配置文件读取异常,忽略");
        }
    }
}

BBDown项目提供了完整的哔哩哔哩视频下载解决方案,从视频解析到下载管理,再到进度跟踪和文件混流,每个环节都经过精心设计和实现,确保了软件的稳定性和易用性。

相关推荐
小鸡吃米…34 分钟前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫1 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan1 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd2 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟2 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然3 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
旅途中的宽~3 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1