Files

229 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LLM 媒体服务器 — 需求文档(中文对照版)
## 项目概述
一个自托管的视频媒体服务器,使用 LLM 对个人视频库(电影、电视剧、家庭录像)进行自动索引、标签分类、元数据生成与字幕生成。参考 Plex/Jellyfin 设计,但深度集成 LLM 能力。支持 Docker 或裸机部署。
---
## 1. 功能需求
### 1.1 媒体摄入与库管理
- [ ] 监听配置目录,自动发现新媒体文件
- [ ] 支持格式:MKV、MP4、AVI、MOV、WEBM、TS
- [ ] 文件指纹识别,防止重复入库
- [ ] 按类型组织库:电影 / 电视剧 / 家庭录像
- [ ] 本地数据库存储库状态(SQLite 或嵌入式数据库)
### 1.2 LLM 自动分类
- [ ] 根据文件名与视频内容识别类型(电影、电视剧集、家庭录像)
- [ ] 匹配已知电影/电视剧标题(本地启发式规则 + LLM 辅助判断)
- [ ] 提取电视剧季号与集号
- [ ] 分类内容类型:类型、情绪、分级(家庭友好等)
- [ ] 对所有 LLM 生成标签进行置信度评分,低置信度标记待人工审核
### 1.3 元数据生成
**元数据优先级:外部数据源优先 → LLM 作为补充/兜底**
#### 主要来源:外部数据源
| 内容类型 | 主要来源 | 次要来源 | 兜底 |
|---|---|---|---|
| 电影 | TMDB | IMDB(通过 TMDB ID | LLM |
| 电视剧 | TMDB + TVDB | Trakt | LLM |
| 动漫 | AniDB / AniList | TMDB | LLM |
| 家庭录像 | — | — | 仅 LLM |
- [ ] 从 TMDB 获取结构化元数据:标题、年份、导演、演员、类型、时长、语言、海报、背景图
- [ ] 从 IMDB 获取评分与 ID(通过 TMDB 的 IMDB ID 字段)
- [ ] 从 TVDB 获取电视剧集详情:剧情简介、播出日期、客串演员
- [ ] 从 Trakt 获取观看数据与社区评分(可选)
- [ ] 动漫内容从 AniDB 或 AniList 获取专项元数据
- [ ] 本地缓存 API 响应,避免重复外部请求
- [ ] 每条记录存储来源标注(如 `metadata_source: tmdb`
#### 其他可接入数据源(待决策)
- [ ] OMDb API — IMDB 的简化封装,有免费额度
- [ ] MyAnimeList (MAL) — 动漫社区评分与元数据
- [ ] Rotten Tomatoes — 影评人 + 观众评分(无官方 API,需爬取)
- [ ] Metacritic — 专业影评评分(同上)
#### 兜底/补充:LLM 生成
LLM 仅在以下情况使用:
- [ ] 外部数据源未匹配到标题时,生成描述/摘要
- [ ] 填充 TMDB/IMDB 未返回的缺失字段
- [ ] 对家庭录像进行标签与描述生成(外部无此类数据)
- [ ] 所有 LLM 生成字段标记 `llm_generated: true`,保持透明度
#### 通用
- [ ] 最终元数据写入旁文件(NFO/JSON)与媒体文件同目录存放
- [ ] 封面/海报:优先使用 TMDB 海报,无则通过 ffmpeg 提取关键帧缩略图
### 1.4 LLM 提供商抽象层
- [ ] 支持本地 LLM(通过 Ollama REST API
- [ ] 支持 Claude APIAnthropic)云端推理
- [ ] 支持 OpenAI 兼容 API
- [ ] 按任务类型选择提供商(如:标签用本地,摘要用云端)
- [ ] 优雅降级:云端不可用时自动回退本地
- [ ] 记录云端提供商的 token 用量与费用
### 1.5 流媒体与播放
- [ ] HTTP 流媒体,支持 Range 请求
- [ ] HLS 自适应码率转码(通过 ffmpeg)
- [ ] 支持客户端直接播放(无需转码)
- [ ] 基础 Web UI,支持浏览与播放
### 1.6 搜索与发现
- [ ] 全文搜索(标题、描述、标签)
- [ ] 自然语言搜索(如"90年代动作片"、"海边的孩子视频"
- [ ] 按类型、年份、评分、标签、置信度筛选
### 1.7 API
- [ ] REST API,覆盖所有库操作
- [ ] Webhook/事件系统,推送处理状态更新
- [ ] API 密钥认证
---
## 2. 非功能需求
### 2.1 性能
- 处理流水线不阻塞流媒体,后台 Worker 异步执行
- 直接播放延迟 < 2 秒;转码流延迟 < 5 秒
- 支持至少 2 路并发流(受硬件限制)
### 2.2 存储
- 元数据与索引本地存储(无强制云依赖)
- 旁文件(.nfo、.json)与媒体文件同目录存放
- SQLite 作为元数据库(可通过配置升级为 PostgreSQL
### 2.3 隐私
- LLM 推理可完全本地运行(数据不出本机)
- 云端 LLM 调用为可选项,明确记录日志
- 默认无遥测
### 2.4 可靠性
- 崩溃恢复:重启后自动续跑中断的处理任务
- 幂等处理:重新索引文件不会产生重复元数据
- 优雅降级:LLM 提供商不可用时服务器继续正常运行
### 2.5 可移植性
- Docker 镜像内置 ffmpeg
- 单二进制文件支持裸机部署(Go 首选)
- 配置通过 TOML 文件 + 环境变量覆盖
---
## 3. 架构概览
```
┌─────────────────────────────────────────────────────────┐
│ 媒体服务器核心 │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 目录监听 │→ │ 摄入流水线 │→ │ 处理队列(Worker)│ │
│ │(inotify) │ │ │ │ │ │
│ └──────────┘ └──────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────────────────────────┤ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 元数据 │ │ 分类 │ │
│ │ Worker │ │ Worker │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ └─────────────────┘ │
│ │ │
│ ┌────────────▼──────────────┐ │
│ │ 外部数据源路由器 │ │
│ │ TMDB / TVDB / AniDB / │ │
│ │ OpenSubtitles / Trakt │ │
│ └────────────┬──────────────┘ │
│ │ 未匹配/缺失字段 │
│ ┌──────▼──────┐ │
│ │ LLM 路由器 │ │
│ └──┬──────┬───┘ │
│ │ │ │
│ ┌────────┘ └──────────┐ │
│ ┌────▼─────┐ ┌────────▼─────┐ │
│ │ Ollama │ │ Claude/OpenAI│ │
│ │ (本地) │ │ (云端) │ │
│ └──────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌─────────────┐ ┌───────────────┐ │
│ │ SQLite DB │ │ HTTP API │ │ Web UI │ │
│ │ (元数据) │ │ (REST) │ │ (播放器) │ │
│ └──────────────┘ └─────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
```
---
## 4. 技术栈决策
| 关注点 | 选型 | 理由 |
|---|---|---|
| 后端语言 | **Rust** | 内存安全、零成本抽象、媒体处理吞吐量优秀 |
| Web 框架 | Axum | 异步、tower 兼容、REST 路由简洁 |
| 异步运行时 | Tokio | Rust 生态事实标准异步运行时 |
| 数据库 | SQLite (sqlx) | 零配置、可嵌入、sqlx 支持异步 |
| 媒体处理 | ffmpeg(子进程) | 行业标准,格式支持广泛 |
| LLM 本地 | Ollama REST API | HTTP 接口简单,内置模型管理 |
| LLM 云端 | Anthropic + OpenAI HTTP API | 通过 reqwest,抽象层统一管理 |
| 容器化 | Docker + Compose | 多服务:server + ollama + 可选 GPU |
| 配置格式 | TOML | 人类友好,serde 兼容(toml crate |
| 前端 | 待定 | 纯后端阶段,API-First 设计 |
> **前端暂缓**:服务端提供完整 REST API,前端技术栈待后端核心稳定后再决策。
---
## 5. MVP 范围(第一阶段)
目标:可用的库扫描 + LLM 辅助标签 + REST API + 流媒体播放(纯后端)
- [ ] 目录监听 + 文件摄入
- [ ] 电影/电视剧分类(文件名启发式 + LLM 辅助)
- [ ] TMDB 元数据获取(主要来源);LLM 填补缺失字段
- [ ] 缩略图提取(TMDB 海报优先,ffmpeg 关键帧兜底)
- [ ] SQLite 元数据存储(sqlx 异步)
- [ ] REST API:库列表、获取条目、触发重扫
- [ ] HTTP 直接播放流媒体
- [ ] Ollama 集成(本地 LLM
- [ ] Docker Compose 配置
- [ ] 前端:待定(API-FirstMVP 阶段无 UI
---
## 6. 第二阶段(MVP 后)
- [ ] HLS 转码
- [ ] Claude API / OpenAI API 集成 + 提供商路由
- [ ] 自然语言搜索
- [ ] TVDB 集成(电视剧强化)
- [ ] Trakt 集成(观看历史与社区数据)
- [ ] 多用户支持与观看记录
---
## 7. 第三阶段(未来规划)
- [ ] 移动端友好 UI / PWA
- [ ] GPU 加速转码
- [ ] 家庭录像场景检测 + 自动章节标记
- [ ] 家庭录像人脸识别标签
- [ ] 合集与播放列表
- [ ] Jellyfin 协议兼容(接入 Infuse、Swiftfin 等现有客户端)
- [ ] AniDB / AniList / MAL 动漫数据源集成
- [ ] Rotten Tomatoes / Metacritic 评分爬取(无官方 API
---
## 8. 待决策事项
- [ ] 是否暴露 Jellyfin 兼容 API 以复用现有客户端(Infuse、Swiftfin)?
- [ ] Docker 中 GPU 直通:必选还是可选?
- [ ] 家庭录像帧分析是否引入视觉模型(LLaVA / Claude Vision)?
- [ ] 是否支持多用户(MVP 单用户是否可接受)?
- [x] ~~TMDB/TVDB 是否接入~~:**已决策** — TMDB 为主要数据源,LLM 仅作补充