一个基于 Docker 的媒体库字幕搜索与下载工具。支持递归扫描媒体文件、识别影片标题、关联本地封面,并通过多个字幕源聚合搜索结果。
poster、folder、cover、movie 等常见封面文件# 1. 克隆项目
git clone https://github.com/Double-Stack-Workshop/doublestack-sub.git
cd doublestack-sub
# 2. 创建默认映射目录
mkdir -p media subtitles
# 3. 启动服务
docker compose up -d
# 4. 查看运行状态
docker compose ps
启动后访问:
docker logs doublestack-subtitle
自动生成的令牌保存在字幕映射目录的 .doublestack-sub/doublestack-sub.db 数据库中,容器重建后会继续使用相同令牌。
为兼容已有安装并避免设置、历史记录和媒体索引丢失,内部数据目录继续使用旧路径 .doublestack-sub;这不影响新的项目英文名和镜像名称。
# 创建映射目录
mkdir -p media subtitles
# 启动容器
docker run -d \
--name doublestack-subtitle \
-p 8000:8000 \
-e API_TOKEN='请替换为高强度随机令牌' \
-v "$(pwd)/media:/media:ro" \
-v "$(pwd)/subtitles:/downloads" \
--shm-size=1g \
--restart unless-stopped \
lastthree/doublestack-subtitle:v0.0.1
| 宿主机目录 | 容器目录 | 权限 | 用途 |
|---|---|---|---|
./media | /media | 只读 | 存放视频文件及本地封面 |
./subtitles | /downloads | 读写 | 保存下载的字幕及应用设置 |
支持以下常见视频扩展名:
3gp, avi, divx, flv, m2ts, m4v, mkv, mov, mp4,
mpeg, mpg, mts, rm, rmvb, ts, webm, wmv
媒体页会递归遍历 /media,展示识别后的标题及封面。点击媒体卡片上的字幕搜索按钮,可将标题带到字幕页面继续搜索。
支持 JPG、JPEG、PNG、WebP 和 AVIF。程序会优先查找:
影片名-poster.jpg影片名.poster.jpg影片名_poster.jpgposter、folder、cover、movie 等图片当目录中只有一张支持的图片时,也会将其作为封面。
设置页面最多可添加 20 条正则,每条最长 300 个字符。程序按顺序使用第一条匹配成功的规则;存在捕获组时,使用第一个捕获组作为媒体标题。
默认规则:
(.*?)\s*\(\d{4}\)
示例:
文件名:十二生肖 (2012) - 1080p.mkv
识别结果:十二生肖
其他示例:
| 文件名形式 | 正则示例 |
|---|---|
电影名称.2024.1080p.mkv | (.*?)\.\d{4} |
电影名称 [2024] 2160p.mkv | (.*?)\s*\[\d{4}\] |
电影名称 - 2024 - BluRay.mkv | (.*?)\s*-\s*\d{4} |
doublestack-subtitle/
├── app/
│ ├── main.py # FastAPI 应用入口与接口路由
│ ├── config.py # 运行参数
│ ├── models.py # API 数据模型
│ ├── version.py # 项目名称与版本
│ ├── services/
│ │ ├── media_library.py # 媒体扫描、标题和封面识别
│ │ └── settings_store.py # SQLite 设置、迁移及数据校验
│ └── static/
│ ├── index.html # 前端页面
│ ├── app.js # 前端交互
│ ├── styles.css # 页面样式
│ └── logo.png # 项目标识
├── Dockerfile # Docker 镜像构建文件
├── docker-compose.yml # 无需构建的 Compose 配置
├── requirements.txt # Python 依赖
└── README.md # 项目说明
Web 页面可直接访问,无需输入 Token。对外提供的 /api/* 接口除健康检查外均需要 Bearer Token;页面内部使用的公开接口不会显示在 Swagger API 文档中。
命令行调用示例:
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
http://localhost:8000/api/media
Swagger API 文档右上角的 Authorize 按钮也可填写同一令牌。
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/health | 服务健康状态 |
GET | /api/config | 应用名称、版本及公共配置 |
GET | /api/media | 扫描并返回媒体文件 |
GET | /api/media/{media_id}/poster | 获取媒体本地封面 |
GET | /api/search | 按媒体或关键词搜索字幕 |
POST | /api/download | 下载字幕 |
GET | /api/history/downloads | 获取字幕下载历史 |
GET | /api/history/searches | 获取字幕搜索历史 |
DELETE | /api/cache/search | 清空全部或指定字幕源的搜索缓存 |
GET | /api/database/stats | 获取历史、缓存和媒体索引数量 |
GET | /api/settings/title-patterns | 获取标题识别正则 |
PUT | /api/settings/title-patterns | 保存标题识别正则 |
POST | /api/settings/title-patterns/test | 测试标题识别结果 |
GET | /api/settings/flaresolverr | 获取 FlareSolverr 地址 |
PUT | /api/settings/flaresolverr | 保存 FlareSolverr 地址 |
GET | /api/settings/providers | 获取字幕源启用状态 |
PUT | /api/settings/providers | 保存字幕源启用状态 |
GET | /api/settings/opensubtitles-api | 获取官方 API 凭据配置状态,不返回明文 |
PUT | /api/settings/opensubtitles-api | 保存官方 API 凭据并开启字幕源五 |
DELETE | /api/settings/opensubtitles-api | 清除官方 API 凭据并关闭字幕源五 |
| 版本 | 日期 | 更新内容 |
|---|---|---|
| v0.0.1 | 2026-09-04 | 初始版本:支持 API 令牌鉴权、媒体库扫描、本地封面识别、正则标题提取、多字幕源搜索与字幕下载。 |
本项目当前未附带开源许可证。除非获得项目所有者授权,否则不授予复制、修改或分发源代码的权利。
Content type
Image
Digest
sha256:3cf7c86ea…
Size
699.1 MB
Last updated
18 days ago
docker pull lastthree/doublestack-subtitle:v0.0.1