# Bilibili视频下载工具

一个功能强大的B站视频下载工具，支持扫码登录、高清晰度下载、断点续传等功能。

## ⚠️ 免责声明

**本工具仅供个人学习研究使用，请勿用于商业用途。**

- 下载的视频内容版权归原作者所有，请尊重创作者权益
- 使用本工具即表示您同意遵守相关法律法规和B站用户协议
- 下载的内容仅限个人观看，不得用于二次传播、商业用途或其他侵权行为
- 因使用本工具产生的任何法律责任由使用者自行承担

## ✨ 功能特性

- 🔐 **扫码登录** - 支持B站扫码登录，获取大会员权限
- 🎬 **高清下载** - 支持360P/480P/720P/1080P/1080P60/4K等多种清晰度
- 📦 **音视频合并** - 自动合并DASH格式的音视频流
- ⚡ **断点续传** - 支持断点续传，避免网络中断重新下载
- 📊 **进度显示** - 实时显示下载进度和速度
- 🔒 **安全存储** - 登录信息加密存储，保护隐私安全
- 🎯 **简单易用** - 命令行界面，操作简单直观
- 🎤 **视频转录** - 使用 Whisper AI 进行语音识别，生成字幕和文本
- 📄 **Markdown转PDF** - 自动化将Markdown文件转换为PDF，支持中文字体和图片嵌入

## 📦 安装

### 前置要求

1. **Python 3.7+**
2. **ffmpeg** (用于音视频合并)
3. **系统依赖** (用于PDF转换，macOS用户)
   - pango
   - gdk-pixbuf
   - libffi

#### 安装ffmpeg

```bash
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# 从 https://ffmpeg.org/download.html 下载并添加到PATH
```

#### 安装PDF转换依赖 (macOS)

```bash
# 安装系统库
brew install pango gdk-pixbuf libffi
```

### 安装工具

```bash
# 克隆项目
git clone https://github.com/yourusername/bilibili-dl.git
cd bilibili-dl

# 安装依赖
pip install -r requirements.txt

# 或者安装为命令行工具
pip install -e .
```

## 🚀 快速开始

### 1. 登录B站账号

#### 方法1: 手动导入Cookie (推荐,当前可用)

由于B站更新了登录API,扫码登录功能暂时需要手动导入Cookie:

```bash
# 运行Cookie导入工具
python3 import_cookie.py
```

然后按照提示:
1. 在浏览器中登录B站
2. 按F12打开开发者工具
3. 切换到"应用程序/Application" -> "Cookie" -> "https://www.bilibili.com"  
4. 找到`SESSDATA`的值并复制
5. 粘贴到导入工具中

#### 方法2: 扫码登录

```bash
bili-dl login  # 当前可能遇到Cookie获取问题
```

**如遇到"获取Cookie失败"错误,请使用方法1**

### 2. 下载视频

```bash
# 使用BV号下载
bili-dl download BV1ms4y1Y76i

# 使用完整链接下载
bili-dl download https://www.bilibili.com/video/BV1ms4y1Y76i

# 指定清晰度
bili-dl download BV1ms4y1Y76i --quality 4k

# 指定输出目录
bili-dl download BV1ms4y1Y76i -o /path/to/save

# 同时下载封面
bili-dl download BV1ms4y1Y76i --with-cover
```

### 3. 查看视频信息

```bash
bili-dl info BV1ms4y1Y76i
```

### 4. 查看登录状态

```bash
bili-dl status
```

### 5. 退出登录

```bash
bili-dl logout
```

## 🎤 视频转录功能

### 功能说明

使用 OpenAI Whisper AI 对下载的视频进行语音识别，生成文本转录和 SRT 字幕文件。支持 99 种语言，特别优化中文识别。

### 单视频转录

```bash
# 基础用法 - 生成纯文本
bili-dl transcribe video.mp4

# 生成 SRT 字幕文件
bili-dl transcribe video.mp4 --srt

# 指定模型和语言
bili-dl transcribe video.mp4 --model medium --language zh

# 自定义输出路径
bili-dl transcribe video.mp4 --output transcript.txt

# 使用英文识别
bili-dl transcribe video.mp4 -l en --srt
```

### 批量转录

```bash
# 转录目录下所有视频
bili-dl batch-transcribe ./downloads/

# 递归处理子目录
bili-dl batch-transcribe ./downloads/ --recursive

# 使用更高质量模型
bili-dl batch-transcribe ./downloads/ --model small -r
```

### 模型选择指南

| 模型 | 参数量 | 速度 | 准确度 | 内存占用 | 推荐场景 |
|------|--------|------|--------|----------|----------|
| tiny | 39M | ⚡⚡⚡⚡⚡ | ⭐⭐ | ~1GB | 快速预览、实时场景 |
| base | 74M | ⚡⚡⚡⚡ | ⭐⭐⭐ | ~1GB | **日常使用(默认)** |
| small | 244M | ⚡⚡⚡ | ⭐⭐⭐⭐ | ~2GB | 平衡选择、中文优化 |
| medium | 769M | ⚡⚡ | ⭐⭐⭐⭐⭐ | ~5GB | 高质量需求 |
| large | 1550M | ⚡ | ⭐⭐⭐⭐⭐ | ~10GB | 专业级、最高准确度 |

### 转录结果示例

转录结果保存在视频所在目录：

```
downloads/
└── 2026-02-27/
    └── BV1ms4y1Y76i_细胞聚团原因剖析/
        ├── 细胞聚团原因剖析.mp4              # 原视频
        ├── 细胞聚团原因剖析_transcript.txt   # 转录文本
        └── 细胞聚团原因剖析.srt              # SRT字幕
```

### 转录常见问题

#### Q: 首次使用很慢？
**A**: 首次使用需要下载模型文件（base 模型约 140MB），后续会使用缓存，速度很快。模型缓存位置：`~/.cache/whisper/`

#### Q: 如何使用 GPU 加速？
**A**: Whisper 自动检测 GPU：
- NVIDIA GPU：自动使用 CUDA 加速（约 10x 速度提升）
- Apple Silicon (M1/M2/M3)：自动使用 MPS 加速
- 无 GPU：使用 CPU 模式（较慢但稳定）

#### Q: 支持哪些视频格式？
**A**: 支持 MP4/MKV/AVI/MOV/FLV 等常见格式，Whisper 通过 FFmpeg 自动提取音频。

#### Q: 中文识别准确度如何？
**A**: 
- base 模型：满足日常需求（80-85% 准确度）
- small 模型：较好效果（85-90% 准确度）
- medium/large：专业级效果（90-95% 准确度）

#### Q: 转录需要多长时间？
**A**: 取决于视频长度和模型选择：
- tiny/base：约为视频时长的 0.5-1 倍（1小时视频 30-60分钟）
- small/medium：约为视频时长的 1-3 倍
- 使用 GPU 可大幅加速（提升 5-10 倍）

#### Q: 如何提升识别准确度？
**A**: 
1. 使用更大的模型（small/medium/large）
2. 确保音频清晰，背景噪音少
3. 正确指定语言参数（`--language zh`）
4. 对于专业术语，可能需要后期人工校对

## 📖 详细使用

### 命令列表

```bash
bili-dl --help                      # 查看帮助
bili-dl login                       # 扫码登录
bili-dl logout                      # 退出登录
bili-dl status                      # 查看登录状态
bili-dl download <URL>              # 下载视频
bili-dl info <URL>                  # 查看视频信息
bili-dl transcribe <PATH>           # 转录视频为文本
bili-dl batch-transcribe <DIR>      # 批量转录目录
bili-dl export-pdf <FILE>           # 转换Markdown为PDF
bili-dl batch-export-pdf <DIR>      # 批量转换Markdown为PDF
```

### 下载选项

| 选项 | 简写 | 说明 | 默认值 |
|------|------|------|--------|
| `--quality` | `-q` | 视频清晰度 | 1080p |
| `--output` | `-o` | 输出目录 | downloads |
| `--with-cover` | - | 下载封面 | 关闭 |

### 支持的清晰度

| 清晰度 | 是否需要登录 | 是否需要大会员 |
|--------|-------------|---------------|
| 360p | ❌ | ❌ |
| 480p | ❌ | ❌ |
| 720p | ❌ | ❌ |
| 1080p | ❌ | ❌ |
| 1080p+ | ✅ | ✅ |
| 1080p60 | ✅ | ✅ |
| 4k | ✅ | ✅ |

## 📂 项目结构

```
bilibili-dl/
├── bilibili_dl/
│   ├── __init__.py      # 包初始化
│   ├── auth.py          # 登录认证模块
│   ├── parser.py        # 视频信息解析
│   ├── downloader.py    # 视频下载模块
│   └── cli.py           # 命令行界面
├── requirements.txt     # 依赖列表
├── setup.py            # 安装配置
├── README.md           # 使用文档
└── .gitignore          # Git忽略文件
```

## 🔧 技术实现

### 登录流程

1. 请求生成二维码(获取qrcode_key)
2. 在终端显示二维码
3. 轮询扫码状态(每2秒检查一次)
4. 扫码确认后获取Cookie
5. 加密保存到本地

### 下载流程

1. 解析BV号/视频链接
2. 获取视频基本信息
3. 获取视频流信息(DASH/MP4)
4. 选择目标清晰度
5. 下载视频流和音频流
6. 使用ffmpeg合并音视频

### 下载目录结构

视频按**日期和"BV号+标题"**自动分类保存:

```
downloads/
├── 2026-02-27/                               # 下载日期
│   ├── BV1ms4y1Y76i_细胞聚团原因剖析/        # BV号_标题
│   │   ├── 细胞聚团原因剖析.mp4               # 合并后的视频
│   │   ├── BV1ms4y1Y76i_video.m4s           # 临时视频流
│   │   ├── BV1ms4y1Y76i_audio.m4s           # 临时音频流
│   │   └── BV1ms4y1Y76i_cover.jpg           # 封面(如果下载)
│   └── BV1xxx_Python教程第一课/              # 另一个视频
│       └── ...
└── 2026-02-28/                               # 第二天下载的视频
    └── ...
```

**优点**:
- ✅ **目录名包含标题** - 一眼就知道视频内容(最大亮点!)
- ✅ 按日期组织,便于管理
- ✅ 每个视频独立目录,避免混乱
- ✅ 支持同名视频,无冲突
- ✅ 方便批量处理和归档

**合并工具**自动递归扫描所有子目录:

```bash
# 自动查找并合并所有视频
python3 merge_video.py downloads/
```

### 安全措施

- Cookie使用Fernet对称加密存储
- 配置文件权限设置为600(仅用户可读写)
- 不上传任何用户数据
- 30天自动过期提醒

## 🐛 常见问题

### 1. 提示"未找到ffmpeg"

**解决方案**: 安装ffmpeg并确保在PATH中

```bash
# 验证ffmpeg是否可用
ffmpeg -version
```

### 2. 下载速度慢

**原因**: 可能是网络或CDN节点问题

**解决方案**:
- 使用代理
- 等待网络条件改善
- 尝试不同时段下载

### 3. 提示"登录失败: 获取Cookie失败,请重试"

**原因**: B站更新了登录API,Cookie获取方式发生变化

**解决方案**: 
1. **推荐**: 使用手动导入Cookie方式(见"快速开始"章节)
2. 等待工具更新支持新登录API
3. 详见 `TROUBLESHOOTING.md` 文档

### 4. 无法下载高清晰度

**原因**: 需要大会员权限

**解决方案**:
- 使用大会员账号登录
- 或选择较低清晰度(720p/1080p)

### 5. 下载中断

**原因**: 网络不稳定

**解决方案**: 工具支持断点续传，再次执行下载命令即可继续

## 📄 Markdown 转 PDF 功能

### 功能说明

自动化将 Markdown 文件转换为精美的 PDF 文档，特别适合转换学习笔记、报告文档等。

**核心特性**:
- ✅ **自动化转换** - 纯命令行操作，无需手动打印
- ✅ **中文字体支持** - 完美支持中文显示
- ✅ **图片嵌入** - 自动处理相对路径图片
- ✅ **精美排版** - 优化的CSS样式，专业的排版效果
- ✅ **批量转换** - 支持递归处理整个目录

### 单文件转换

```bash
# 基础用法
bili-dl export-pdf report.md

# 指定输出路径
bili-dl export-pdf notes.md -o output.pdf

# 使用自定义CSS样式
bili-dl export-pdf document.md --style custom.css
```

### 批量转换

```bash
# 转换目录下所有MD文件
bili-dl batch-export-pdf ./reports/

# 递归处理子目录
bili-dl batch-export-pdf ./notes/ --recursive

# 输出到指定目录
bili-dl batch-export-pdf ./docs/ -r -o ./pdf_output/

# 使用自定义样式批量转换
bili-dl batch-export-pdf ./content/ -r --style custom.css
```

### 使用示例

```bash
# 转换学习笔记
bili-dl export-pdf "reports/2026-02-28/BV1xxx/学习笔记.md"

# 批量转换所有报告
bili-dl batch-export-pdf reports/ -r

# 结果示例
# ✅ PDF 已生成: 学习笔记.pdf
# 📊 文件大小: 2834.0 KB
```

### 支持的 Markdown 特性

- **标题层级** (H1-H6)
- **列表** (有序/无序/嵌套)
- **代码块** (语法高亮)
- **表格**
- **图片** (支持相对路径和HTML标签)
- **引用块**
- **分隔线**
- **粗体/斜体**
- **链接**

### 常见问题

#### Q: 图片没有显示在PDF中？
**A**: 确保图片路径正确。工具会自动将相对路径转换为绝对路径，图片文件需要存在于指定位置。

#### Q: 中文字体显示异常？
**A**: macOS 用户需要安装系统依赖：
```bash
brew install pango gdk-pixbuf libffi
```

Ubuntu/Debian 用户：
```bash
sudo apt-get install libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0
```

#### Q: 如何自定义PDF样式？
**A**: 创建自定义 CSS 文件，然后使用 `--style` 参数：
```bash
bili-dl export-pdf notes.md --style my-style.css
```

#### Q: 生成的PDF文件很大？
**A**: PDF 大小取决于嵌入的图片。如果图片较多或分辨率高，PDF 文件会相应增大。可以考虑：
- 压缩图片
- 降低图片分辨率
- 只转换必要的内容

### 自定义CSS示例

创建 `custom.css`:

```css
body {
    font-family: "SimHei", sans-serif;
    font-size: 12pt;
    line-height: 1.6;
}

h1 {
    color: #e74c3c;
    border-bottom: 2px solid #e74c3c;
}

code {
    background: #ffe5e5;
    color: #c7254e;
}
```

然后使用:
```bash
bili-dl export-pdf notes.md --style custom.css
```

## 📝 开发计划

- [ ] 支持批量下载
- [ ] 支持播放列表/合集下载
- [ ] 支持弹幕下载
- [x] ~~支持字幕下载~~ (已实现 Whisper 转录)
- [ ] 添加Web图形界面
- [ ] 支持自定义代理
- [ ] 支持多线程下载加速
- [x] ~~视频转录和字幕生成~~ (已实现 Whisper AI)
- [x] ~~Markdown转PDF~~ (已实现自动化转换)

## 🤝 贡献

欢迎提交Issue和Pull Request！

## 📄 许可证

MIT License

## ⚖️ 法律声明

本项目:
- 不提供任何形式的视频资源
- 不破解或绕过任何付费内容
- 仅作为技术学习和研究用途
- 使用者需自行承担法律责任

**请合理使用本工具，尊重知识产权，支持正版内容。**

---

**⭐ 如果这个项目对你有帮助，请给个Star支持一下！**
