Files
LLmBaseMediaServerDocs/REQUIREMENTS.zh.md
T
2026-05-11 13:03:31 +08:00

11 KiB
Raw Blame History

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. 技术栈决策

关注点 选型 理由
后端语言 Go 单二进制、HTTP/并发优秀、部署简单
数据库 SQLite (sqlx) 零配置、可嵌入、单用户足够
媒体处理 ffmpeg(子进程) 行业标准,格式支持广泛
LLM 本地 Ollama REST API HTTP 接口简单,内置模型管理
LLM 云端 Anthropic SDK + OpenAI SDK 抽象层双提供商支持
容器化 Docker + Compose 多服务:server + ollama + 可选 GPU
配置格式 TOML 人类友好,Go 生态支持(viper
Web UI HTMX + Tailwind 无 JS 框架,Go 模板渲染

Rust 备选:如果性能成为瓶颈(转码流水线),Rust 是可行选项,但 Go 开发速度更快,部署更简单,推荐作为首选。


5. MVP 范围(第一阶段)

目标:可用的库扫描 + LLM 辅助标签 + 基础 Web UI + 流媒体播放

  • 目录监听 + 文件摄入
  • 电影/电视剧分类(文件名启发式 + LLM 辅助)
  • TMDB 元数据获取(主要来源);LLM 填补缺失字段
  • 缩略图提取(TMDB 海报优先,ffmpeg 关键帧兜底)
  • SQLite 元数据存储
  • REST API:库列表、获取条目、触发重扫
  • 基础 Web UI:网格视图 + 视频播放器
  • HTTP 直接播放流媒体
  • Ollama 集成(本地 LLM
  • Docker Compose 配置

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 单用户是否可接受)?
  • TMDB/TVDB 是否接入已决策 — TMDB 为主要数据源,LLM 仅作补充