# MediaStation 原版完整功能迁移清单 > 基于 `MediaStation-py`(Python/FastAPI + Vue 3)源代码分析,供 MediaStationGo(Go/Gin + React)重写参考。 > > 分析日期:2025-07-09 --- ## 目录 - [1. 项目概览](#1-项目概览) - [2. 后端功能清单](#2-后端功能清单) - [2.1 用户与认证模块](#21-用户与认证模块) - [2.2 媒体库模块](#22-媒体库模块) - [2.3 播放模块](#23-播放模块) - [2.4 下载模块](#24-下载模块) - [2.5 订阅与站点模块](#25-订阅与站点模块) - [2.6 系统模块](#26-系统模块) - [2.7 管理后台模块](#27-管理后台模块) - [2.8 统计模块](#28-统计模块) - [2.9 播放列表模块](#29-播放列表模块) - [2.10 STRM 文件支持模块](#210-strm-文件支持模块) - [2.11 DLNA/投屏模块](#211-dlna投屏模块) - [2.12 授权管理模块](#212-授权管理模块) - [2.13 Emby API 兼容层](#213-emby-api-兼容层) - [2.14 发现/探索模块](#214-发现探索模块) - [3. 数据模型清单](#3-数据模型清单) - [4. 前端功能清单](#4-前端功能清单) - [5. 部署配置清单](#5-部署配置清单) - [6. 中间件与基础设施](#6-中间件与基础设施) - [7. 配置系统](#7-配置系统) - [8. 技术栈对照表](#8-技术栈对照表) --- ## 1. 项目概览 ### 原版架构 - **后端**: Python 3.11+ / FastAPI / SQLAlchemy (async) / APScheduler - **前端**: Vue 3 + Pinia + Vue Router + TypeScript - **数据库**: SQLite(默认)/ PostgreSQL(可选) - **部署**: Docker / Nginx 反向代理 / Helm Chart ### 核心定位 MediaStation 是一个轻量级家庭媒体服务器,融合 **媒体播放 + 自动化订阅下载 + 多平台资源聚合**。 --- ## 2. 后端功能清单 ### 2.1 用户与认证模块 > 源文件:`backend/app/user/` (router.py, service.py, repository.py, auth.py, models.py, schemas.py) > 依赖注入:`backend/app/deps.py` | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 用户登录 | POST | `/api/auth/login` | 用户名+密码登录,返回 JWT access_token + refresh_token | 公开 | | Token 刷新 | POST | `/api/auth/refresh` | 通过 refresh_token 获取新的 access_token | 公开 | | 获取当前用户 | GET | `/api/auth/me` | 返回当前登录用户信息 | 登录 | | 修改密码 | POST | `/api/auth/change-password` | 当前用户修改自己的密码 | 登录 | | 更新资料 | PATCH | `/api/auth/profile` | 更新头像等个人资料 | 登录 | | 获取权限 | GET | `/api/auth/permissions` | 获取当前用户的功能权限列表 | 登录 | | 用户列表 | GET | `/api/users` | 获取所有用户列表 | 管理员 | | 创建用户 | POST | `/api/users` | 创建用户(免费版限30人) | 管理员 | | 更新用户 | PUT | `/api/users/{id}` | 更新用户信息 | 管理员 | | 删除用户 | DELETE | `/api/users/{id}` | 删除用户 | 管理员 | | 获取用户权限 | GET | `/api/users/{id}/permissions` | 获取指定用户的功能权限 | 管理员 | | 更新用户权限 | PUT | `/api/users/{id}/permissions` | 更新指定用户的功能权限 | 管理员 | | 重置用户权限 | POST | `/api/users/{id}/permissions/reset` | 重置为默认权限 | 管理员 | | 系统配置(用户) | GET | `/api/system/config` | 获取系统级用户配置(FREE/PLUS) | 管理员 | | 更新系统配置 | PUT | `/api/system/config` | 更新系统配置(tier/最大用户数) | 管理员 | | 观看历史统计 | GET | `/api/watch-history/stats` | 获取当前用户观看历史统计 | 登录 | | 观看历史列表 | GET | `/api/watch-history` | 分页获取观看历史 | 登录 | | 继续观看列表 | GET | `/api/watch-history/continue` | 获取未看完的媒体列表 | 登录 | | 删除单条历史 | DELETE | `/api/watch-history/{id}` | 删除单条历史(管理员可删任何人的) | 登录 | | 清空历史 | DELETE | `/api/watch-history` | 清空历史(可指定媒体ID) | 登录 | **认证机制细节**: - JWT (HS256) access_token(60分钟)+ refresh_token(30天) - 密码哈希:pbkdf2_sha256 - 依赖注入:`get_current_user`, `require_admin`, `require_permission(permission_field)`, `get_user_permissions` **权限系统(19 项细粒度权限)**: - 基础权限(默认开启):`can_view_dashboard`, `can_play_media`, `can_cast`, `can_external_player`, `can_favorite`, `can_view_history` - 受限功能(默认关闭):`can_edit_media`, `can_rescrape`, `can_use_ai`, `can_capture_frames`, `can_manage_downloads`, `can_view_discover`, `can_manage_subscriptions`, `can_manage_sites`, `can_use_ai_assistant`, `can_manage_users`, `can_manage_files`, `can_manage_strm`, `can_access_settings` - Plus 用户(tier=plus)自动获得所有权限 - 管理员(role=admin)自动获得所有权限 **用户角色与层级**: - 角色:admin / user - 层级:free / plus(免费版限30用户,Plus 无限) --- ### 2.2 媒体库模块 > 源文件:`backend/app/media/` (router.py, service.py, repository.py, models.py, schemas.py, scanner.py, scraper.py, organizer.py, watcher.py, subtitle_service.py, duplicate.py, image_proxy.py, bangumi_scraper.py, douban_scraper.py, parse_code.py, providers/) #### 2.2.1 媒体库管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 媒体库列表 | GET | `/api/libraries` | 获取所有媒体库 | 登录 | | 创建媒体库 | POST | `/api/libraries` | 创建新媒体库 | 管理员 | | 扫描媒体库 | POST | `/api/libraries/{id}/scan` | 触发媒体库扫描+自动刮削 | 管理员 | | 更新媒体库 | PUT | `/api/libraries/{id}` | 更新媒体库配置 | 管理员 | | 删除媒体库 | DELETE | `/api/libraries/{id}` | 删除媒体库 | 管理员 | #### 2.2.2 媒体条目管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 媒体列表 | GET | `/api/media` | 分页+多维筛选(类型/类型/年份/评分/排序) | 登录 | | 最近添加 | GET | `/api/media/recent` | 获取最近添加的媒体 | 登录 | | 媒体统计 | GET | `/api/media/stats` | 获取媒体数量统计 | 登录 | | 媒体详情 | GET | `/api/media/{id}` | 获取媒体详情(含季/集/字幕) | 登录 | | 删除媒体 | DELETE | `/api/media/{id}` | 删除媒体条目 | 管理员 | | 更新媒体 | PUT | `/api/media/{id}` | 手动编辑媒体元数据 | 管理员 | | 视频截帧 | GET | `/api/media/{id}/thumbnail` | FFmpeg 视频截帧(缩略图) | 登录 | #### 2.2.3 元数据刮削 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 刮削媒体 | POST | `/api/media/{id}/scrape` | 手动触发刮削(可指定 TMDb ID) | 管理员 | | 搜索 TMDb | GET | `/api/search/tmdb` | 搜索 TMDb 数据库 | 登录 | | 搜索豆瓣 | GET | `/api/search/douban` | 搜索豆瓣影视 | 登录 | | 搜索 Bangumi | GET | `/api/search/bangumi` | 搜索 Bangumi 动漫数据库 | 登录 | | Adult 刮削测试 | POST | `/api/media/scrape/test` | 测试 Adult Provider 刮削 | 管理员 | **元数据 Provider Chain(多源聚合)**: - `TMDbProvider` — TMDb 主数据源(电影/剧集) - `DoubanProvider` — 豆瓣中文元数据补充 - `BangumiProvider` — Bangumi 番剧/动画数据源 - `AdultProvider` — 18+ 番号刮削(多层 Fallback:JavBus → JavDB → 微服务) - Provider Chain 支持优先级调度和自动降级 #### 2.2.4 搜索功能 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 全局搜索 | GET | `/api/search` | 搜索本地媒体库 | 登录 | | 高级搜索 | GET | `/api/search/advanced` | 多条件组合搜索(标题/类型/年份/评分/分辨率/字幕) | 登录 | | 混合搜索 | GET | `/api/search/mixed` | 并发搜索本地+TMDb | 登录 | #### 2.2.5 推荐系统 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 智能推荐 | GET | `/api/recommend` | 基于高评分+热度的推荐 | 登录 | | 相似推荐 | GET | `/api/recommend/similar/{id}` | 基于同类型/标签/年代的相似内容 | 登录 | #### 2.2.6 字幕管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 字幕列表 | GET | `/api/media/{id}/subtitles` | 获取媒体字幕列表 | 登录 | | 扫描外挂字幕 | POST | `/api/media/{id}/subtitles/scan` | 扫描外挂字幕文件 | 管理员 | | 检测内嵌字幕 | POST | `/api/media/{id}/subtitles/extract` | 检测内嵌字幕流 | 管理员 | | 提取内嵌字幕 | POST | `/api/media/{id}/subtitles/extract/{idx}` | 提取内嵌字幕为 SRT | 管理员 | | 上传字幕 | POST | `/api/media/{id}/subtitles/upload` | 上传字幕文件 | 管理员 | | 获取字幕内容 | GET | `/api/subtitles/{id}/content` | 获取字幕文件内容 | 登录 | | 删除字幕 | DELETE | `/api/subtitles/{id}` | 删除字幕(可选删除文件) | 管理员 | #### 2.2.7 收藏功能 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 添加收藏 | POST | `/api/media/{id}/favorite` | 添加收藏 | 登录 | | 取消收藏 | DELETE | `/api/media/{id}/favorite` | 取消收藏 | 登录 | | 检查收藏状态 | GET | `/api/media/{id}/favorite/status` | 检查是否已收藏 | 登录 | | 收藏列表 | GET | `/api/favorites` | 分页获取收藏列表 | 登录 | #### 2.2.8 重复检测 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 计算文件哈希 | POST | `/api/libraries/{id}/duplicates/hash` | 计算文件哈希(重复检测前置) | 管理员 | | 检测重复 | POST | `/api/libraries/{id}/duplicates/scan` | 检测并标记重复文件 | 管理员 | | 重复文件列表 | GET | `/api/libraries/{id}/duplicates` | 获取重复文件列表 | 登录 | | 取消重复标记 | DELETE | `/api/libraries/{id}/duplicates` | 取消所有重复标记 | 管理员 | | 取消单项重复标记 | POST | `/api/media/{id}/duplicate/unmark` | 取消单个条目重复标记 | 管理员 | #### 2.2.9 文件整理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 整理文件 | POST | `/api/media/organize` | 手动触发文件整理到媒体库 | 管理员 | #### 2.2.10 图片代理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 本地图片访问 | GET | `/api/media/image/{filename}` | 访问本地保存的图片(防路径遍历) | 登录 | | 图片代理 | GET | `/api/media/proxy-image` | 代理外部图片(绕过防盗链) | 登录 | --- ### 2.3 播放模块 > 源文件:`backend/app/playback/` (router.py, external.py, service.py, transcoder.py, models.py) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 播放信息 | GET | `/api/playback/{id}/info` | 获取媒体播放信息 | 登录 | | 视频流 | GET | `/api/playback/{id}/stream` | 直接视频流(支持 Range 断点续传 + query token) | 登录 | | 外部播放器直链 | GET | `/api/playback/{id}/external-url` | 生成带 token 的外部播放直链 | 登录 | | 外部播放器协议 | GET | `/api/playback/{id}/external-players` | 生成各播放器协议直链(PotPlayer/VLC/IINA/Infuse/NPlayer/MX/MPV/MPC-HC) | 登录 | | 外部播放流 | GET | `/api/playback/{id}/external-stream` | 外部播放器流式传输(支持 Range) | Token | | HLS 播放列表 | GET | `/api/playback/hls/{job}/playlist.m3u8` | HLS m3u8 播放列表 | Token | | HLS 分片 | GET | `/api/playback/hls/{job}/{segment}` | HLS ts 分片 | Token | | 转码状态 | GET | `/api/playback/transcode/{job}/status` | 获取转码任务状态 | 登录 | | 字幕文件 | GET | `/api/playback/subtitles/{id}` | 获取字幕文件流 | 登录 | | 上报进度 | POST | `/api/playback/{id}/progress` | 上报播放进度 | 登录 | **播放功能特性**: - HTTP Range 断点续传(206 Partial Content) - 多种认证方式:Bearer Token / Query Token / 一次性票据 - 硬件加速转码(auto/qsv/vaapi/nvenc/videotoolbox/none) - HLS 转码输出 - 外部播放器协议直链(8种播放器) - 转码并发控制(max_transcode_jobs) - 转码缓存自动清理 --- ### 2.4 下载模块 > 源文件:`backend/app/download/` (router.py, service.py, clients.py, models.py, schemas.py) #### 2.4.1 下载客户端管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 客户端列表 | GET | `/api/download/clients` | 获取所有下载客户端 | 登录 | | 创建客户端 | POST | `/api/download/clients` | 添加下载客户端 | 管理员 | | 获取客户端 | GET | `/api/download/clients/{id}` | 获取客户端详情 | 登录 | | 更新客户端 | PUT | `/api/download/clients/{id}` | 更新客户端配置 | 管理员 | | 删除客户端 | DELETE | `/api/download/clients/{id}` | 删除客户端 | 管理员 | | 测试连接 | POST | `/api/download/clients/{id}/test` | 测试客户端连接 | 管理员 | #### 2.4.2 下载任务管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 任务列表 | GET | `/api/download/tasks` | 分页获取下载任务 | 登录 | | 添加任务 | POST | `/api/download/add` | 添加下载任务 | 登录 | | 暂停任务 | POST | `/api/download/{id}/pause` | 暂停下载 | 登录 | | 恢复任务 | POST | `/api/download/{id}/resume` | 恢复下载 | 登录 | | 删除任务 | DELETE | `/api/download/{id}` | 删除任务(可选删除文件) | 登录 | | 同步状态 | POST | `/api/download/sync` | 手动同步下载状态 | 管理员 | | 自动同步 | POST | `/api/download/start-auto-sync` | 启动后台自动进度同步(5秒间隔) | 登录 | #### 2.4.3 Aria2 扩展 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | Aria2 统计 | GET | `/api/download/aria2/stats` | Aria2 全局统计(活跃/等待/停止/速度) | 登录 | #### 2.4.4 整理入库 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 批量整理 | POST | `/api/download/organize` | 手动触发所有已完成任务整理入库 | 管理员 | | 单个整理 | POST | `/api/download/{id}/organize` | 手动整理单个下载任务 | 管理员 | **下载客户端适配器**: - qBittorrent(WebUI API) - Transmission(RPC API) - Aria2(JSON-RPC) --- ### 2.5 订阅与站点模块 > 源文件:`backend/app/subscribe/` (router.py, service.py, site_adapter.py, notifier.py, models.py, schemas.py) #### 2.5.1 站点管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 站点列表 | GET | `/api/sites` | 获取所有站点配置 | 登录 | | 创建站点 | POST | `/api/sites` | 添加站点 | 管理员 | | 更新站点 | PUT | `/api/sites/{id}` | 更新站点配置 | 管理员 | | 删除站点 | DELETE | `/api/sites/{id}` | 删除站点 | 管理员 | | 测试站点 | POST | `/api/sites/{id}/test` | 测试站点连接 | 管理员 | | 浏览站点资源 | GET | `/api/sites/{id}/resource` | 分页浏览站点资源列表 | 登录 | | 刷新用户数据 | GET | `/api/sites/{id}/userdata` | 获取站点用户数据(上传/下载量等) | 管理员 | **支持站点类型**: - **NexusPHP** — 国内绝大多数 PT 站 - **Gazelle/Luminance** — HDBits/OPS 等 - **UNIT3D** — BeyondHD/BluTopia 等 - **MTeam** — 馒头专用 REST API - **Discuz** — 论坛型资源站 - **Custom RSS** — 自定义 RSS **认证方式**: - Cookie / API Key / Authorization Header #### 2.5.2 资源搜索(跨站聚合) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 跨站搜索 | GET | `/api/search/sites` | 多站点资源聚合搜索 | 登录 | #### 2.5.3 订阅管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 订阅列表 | GET | `/api/subscriptions` | 获取订阅列表 | 登录 | | 创建订阅 | POST | `/api/subscriptions` | 创建订阅 | 登录 | | 更新订阅 | PUT | `/api/subscriptions/{id}` | 更新订阅 | 登录 | | 删除订阅 | DELETE | `/api/subscriptions/{id}` | 删除订阅 | 管理员 | | 按媒体查订阅 | GET | `/api/subscriptions/media/{mediaid}` | 支持 tmdb:/douban:/bangumi: 前缀 | 登录 | | 触发搜索 | POST | `/api/subscriptions/{id}/search` | 手动触发订阅搜索 | 登录 | | 分享订阅 | POST | `/api/subscriptions/{id}/share` | 创建订阅分享 | 登录 | | 复制订阅 | POST | `/api/subscriptions/{id}/fork` | 从分享链接复制订阅 | 登录 | **订阅过滤条件**: - 画质优先级列表 - 最小/最大文件大小 - 包含/排除关键词 #### 2.5.4 通知渠道 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 渠道列表 | GET | `/api/notify/channels` | 获取通知渠道列表 | 登录 | | 创建渠道 | POST | `/api/notify/channels` | 创建通知渠道 | 管理员 | | 更新渠道 | PUT | `/api/notify/channels/{id}` | 更新通知渠道 | 管理员 | | 删除渠道 | DELETE | `/api/notify/channels/{id}` | 删除通知渠道 | 管理员 | | 测试渠道 | POST | `/api/notify/channels/{id}/test` | 发送测试通知 | 管理员 | **通知渠道类型**: - Telegram - 微信(Server酱) - Bark (iOS) - Webhook - Email #### 2.5.5 RSS | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 拉取 RSS | POST | `/api/rss/pull` | 手动拉取所有站点 RSS | 管理员 | --- ### 2.6 系统模块 > 源文件:`backend/app/system/` (router.py, settings_router.py, settings_service.py, api_config_router.py, api_config_service.py, api_config_models.py, scheduler.py, events.py, crypto.py, models.py) #### 2.6.1 系统信息 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 健康检查 | GET | `/api/health` | 健康检查端点 | 公开 | | 系统信息 | GET | `/api/system/info` | 获取系统详细信息 | 登录 | | 系统状态 | GET | `/api/system/status` | CPU/内存/磁盘使用率 | 登录 | | 系统配置 | GET | `/api/system/config` | 获取可编辑系统配置(密钥掩码) | 管理员 | | 更新系统配置 | PATCH | `/api/system/config` | 更新系统配置(写入 .env) | 管理员 | #### 2.6.2 SSE 实时事件 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 获取 SSE 票据 | GET | `/api/system/events/ticket` | 生成一次性 SSE 票据(OTP,10秒有效) | 登录 | | SSE 事件流 | GET | `/api/system/events` | SSE 实时事件推送 | 登录 | **SSE 安全机制**: - 一次性票据(OTP)认证(推荐,防 Nginx 日志泄露 JWT) - 兼容 Authorization Header 认证 - 兼容 URL query token 认证(旧版) **事件类型**:下载进度、扫描进度、通知消息等 #### 2.6.3 定时任务 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 调度器信息 | GET | `/api/system/scheduler` | 获取定时任务列表 | 管理员 | | 触发任务 | POST | `/api/system/scheduler/{id}/trigger` | 手动触发定时任务 | 管理员 | **内置定时任务**: | 任务 ID | 名称 | 间隔 | 说明 | |---------|------|------|------| | `media_scan` | 媒体库扫描 | 60分钟 | 扫描+增量刮削 | | `subscription_search` | 订阅搜索 | 60分钟 | 处理所有订阅 | | `download_sync` | 下载状态同步 | 30秒 | 同步下载进度 | | `rss_pull` | RSS 拉取 | 30分钟 | 拉取所有站点 RSS | | `cache_cleanup` | 转码缓存清理 | 每天3:00 | 清理24小时以上的转码缓存 | | `download_complete` | 下载完成整理 | 5分钟 | 检测完成并自动整理入库 | #### 2.6.4 整理与刮削配置 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 获取所有配置 | GET | `/api/settings` | 获取所有整理/刮削配置 | 管理员 | | 配置 Schema | GET | `/api/settings/schema` | 获取配置表单 Schema | 管理员 | | 获取单个配置 | GET | `/api/settings/{key}` | 获取单个配置 | 管理员 | | 更新单个配置 | PUT | `/api/settings/{key}` | 更新单个配置 | 管理员 | | 批量更新 | PATCH | `/api/settings` | 批量更新配置 | 管理员 | | 重置配置 | DELETE | `/api/settings/{key}` | 重置为默认值 | 管理员 | | 重置所有 | DELETE | `/api/settings` | 重置所有配置 | 管理员 | #### 2.6.5 API 配置管理 | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 配置列表 | GET | `/api/api-config` | 获取所有 API 配置 | 管理员 | | 获取配置 | GET | `/api/api-config/{provider}` | 获取指定 Provider 配置 | 管理员 | | 获取生效配置 | GET | `/api/api-config/{provider}/effective` | 获取合并后的生效配置 | 管理员 | | 更新配置 | POST | `/api/api-config/{provider}` | 更新 API 配置 | 管理员 | | 清除配置 | DELETE | `/api/api-config/{provider}` | 清除 API Key | 管理员 | | 测试连接 | POST | `/api/api-config/{provider}/test` | 测试 API 连接 | 管理员 | | Provider 列表 | GET | `/api/api-config/providers/list` | 获取支持的 Provider 列表 | 管理员 | **预置 Provider**: - `tmdb` — TMDb API - `douban` — 豆瓣 - `bangumi` — Bangumi - `thetvdb` — TheTVDB - `fanart` — Fanart.tv - `openai` — OpenAI 兼容 API - `siliconflow` — 硅基流动 - `deepseek` — DeepSeek - `adult` — Adult Provider (JavBus/JavDB) #### 2.6.6 敏感数据加密 > 源文件:`backend/app/system/crypto.py` - 使用 Fernet (AES-128-CBC) 加密存储 API Key、Passkey 等敏感字段 - 基于 APP_SECRET_KEY 派生加密密钥 - 加密数据前缀标识 `enc:v1:`,兼容旧版明文迁移 --- ### 2.7 管理后台模块 > 源文件:`backend/app/admin/` (router.py, service.py, schemas.py, backup_service.py) #### 2.7.1 定时任务管理 | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | 定时任务列表 | GET | `/api/admin/scheduler/tasks` | 获取可管理的定时任务 | | 创建定时任务 | POST | `/api/admin/scheduler/tasks` | 创建自定义定时任务 | | 更新定时任务 | PUT | `/api/admin/scheduler/tasks/{id}` | 更新定时任务 | | 删除定时任务 | DELETE | `/api/admin/scheduler/tasks/{id}` | 删除定时任务 | #### 2.7.2 批量操作 | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | 批量扫描 | POST | `/api/admin/media/batch/scan` | 批量扫描媒体库 | | 批量刮削 | POST | `/api/admin/media/batch/scrape` | 批量刮削媒体 | | 批量删除 | POST | `/api/admin/media/batch/delete` | 批量删除媒体 | | 批量移动 | POST | `/api/admin/media/batch/move` | 批量移动媒体到其他库 | | 批量收藏 | POST | `/api/admin/media/batch/favorite` | 批量收藏 | | 批量标记已看 | POST | `/api/admin/media/batch/watched` | 批量标记为已看 | | 批量重命名 | POST | `/api/admin/media/batch/rename` | 批量重命名文件 | | AI 重命名 | POST | `/api/admin/media/batch/ai-rename` | AI 智能重命名 | #### 2.7.3 内容分级 | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | 获取分级 | GET | `/api/admin/content-rating` | 获取内容分级配置 | | 更新分级 | PUT | `/api/admin/content-rating` | 更新内容分级 | #### 2.7.4 文件管理 | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | 浏览文件 | GET | `/api/admin/files/browse` | 浏览文件目录 | | 文件操作 | POST | `/api/admin/files/operation` | 文件操作(移动/复制/删除) | | 重命名预览 | GET | `/api/admin/files/rename/preview` | 重命名预览 | | 批量重命名预览 | POST | `/api/admin/files/rename/batch-preview` | 批量重命名预览 | | 执行重命名 | POST | `/api/admin/files/rename/execute` | 执行重命名 | | 创建文件夹 | POST | `/api/admin/files/folder` | 创建文件夹 | | 重命名文件夹 | PUT | `/api/admin/files/folder/{path}` | 重命名文件夹 | | 删除文件夹 | DELETE | `/api/admin/files/folder/{path}` | 删除文件夹 | #### 2.7.5 系统管理 | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | 系统设置 | GET/PUT | `/api/admin/settings` | 获取/更新系统设置 | | 系统统计 | GET | `/api/admin/stats` | 获取系统统计信息 | | 系统备份 | POST | `/api/admin/backup` | 触发系统备份 | | 备份列表 | GET | `/api/admin/backup/list` | 获取备份列表 | | 恢复备份 | POST | `/api/admin/backup/restore` | 从备份恢复 | --- ### 2.8 统计模块 > 源文件:`backend/app/stats/` (router.py, service.py, schemas.py) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 概览统计 | GET | `/api/stats/overview` | 媒体总数/电影/剧集/大小/用户/播放次数 | 公开 | | 播放趋势 | GET | `/api/stats/trend` | 按小时/天/周的播放趋势 | 公开 | | 热门内容 | GET | `/api/stats/top-content` | 播放次数最多的媒体 | 公开 | | 活跃用户 | GET | `/api/stats/top-users` | 播放次数最多的用户 | 公开 | | 媒体库统计 | GET | `/api/stats/libraries` | 各媒体库统计 | 管理员 | | 系统监控 | GET | `/api/stats/monitor` | CPU/内存/磁盘/网络监控 | 管理员 | | 用户统计 | GET | `/api/stats/user/{id}` | 用户播放统计 | 管理员 | | 记录播放 | POST | `/api/stats/play` | 记录播放事件 | 登录 | --- ### 2.9 播放列表模块 > 源文件:`backend/app/playlist/` (router.py, service.py, models.py, schemas.py) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 播放列表列表 | GET | `/api/playlists` | 获取用户播放列表 | 登录 | | 播放列表详情 | GET | `/api/playlists/{id}` | 获取列表详情(含媒体项) | 登录 | | 创建播放列表 | POST | `/api/playlists` | 创建播放列表 | 登录 | | 更新播放列表 | PUT | `/api/playlists/{id}` | 更新播放列表 | 登录 | | 删除播放列表 | DELETE | `/api/playlists/{id}` | 删除播放列表 | 登录 | | 添加项目 | POST | `/api/playlists/{id}/items` | 添加媒体到播放列表 | 登录 | | 移除项目 | DELETE | `/api/playlists/{id}/items/{item_id}` | 从播放列表移除 | 登录 | | 重新排序 | PUT | `/api/playlists/{id}/reorder` | 重新排序播放列表 | 登录 | --- ### 2.10 STRM 文件支持模块 > 源文件:`backend/app/strm/` (router.py, schemas.py, __init__.py) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | STRM 配置 | GET | `/api/admin/strm/config` | 获取 STRM 配置 | 管理员 | | 更新 STRM 配置 | PUT | `/api/admin/strm/config` | 更新 STRM 配置 | 管理员 | | 获取 STRM URL | GET | `/api/admin/strm/media/{id}` | 获取媒体 STRM URL | 管理员 | | 设置 STRM URL | PUT | `/api/admin/strm/media/{id}` | 设置媒体 STRM URL(协议白名单校验) | 管理员 | | 清除 STRM URL | DELETE | `/api/admin/strm/media/{id}` | 清除 STRM URL | 管理员 | | Emby STRM 播放信息 | GET | `/api/admin/strm/emby/Items/{id}/PlaybackInfo` | Emby 兼容 STRM 播放 | 公开 | **STRM 功能**:将外部存储(WebDAV/Alist/S3/HTTP 直链)以"文件"形式加入媒体库,播放时直接访问远程 URL。 --- ### 2.11 DLNA/投屏模块 > 源文件:`backend/app/dlna/__init__.py`(当前为 stub 实现) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 发现设备 | GET | `/api/dlna/devices` | 发现 DLNA 设备 | 登录 | | 获取设备 | GET | `/api/dlna/devices/{id}` | 获取设备信息 | 登录 | | 投屏 | POST | `/api/dlna/cast` | 投屏媒体到设备 | 登录 | > **注意**:当前 DLNA 为 stub 实现,返回空列表。Go 版可考虑完整实现。 --- ### 2.12 授权管理模块 > 源文件:`backend/app/license/` (router.py, schemas.py, __init__.py) | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 授权信息 | GET | `/api/license/info` | 获取基本授权信息 | 登录 | | 授权状态 | GET | `/api/license/status` | 获取详细授权状态 | 登录 | | 激活授权 | POST | `/api/license/activate` | 通过授权码激活 Plus | 登录 | | 解绑授权 | POST | `/api/license/unbind` | 解绑当前设备 | 登录 | | 授权配置 | GET/POST | `/api/license/config` | 获取/更新授权配置 | 管理员 | | 测试连接 | POST | `/api/license/config/test` | 测试授权服务器连接 | 管理员 | | 心跳状态 | GET | `/api/license/heartbeat-status` | 获取心跳状态 | 登录 | | 刷新授权 | POST | `/api/license/refresh` | 刷新授权状态 | 登录 | | 生成授权码 | POST | `/api/license/generate` | 生成授权码 | 管理员 | | 授权码列表 | GET | `/api/license/list` | 获取授权码列表 | 管理员 | | 激活记录 | GET | `/api/license/{id}/activations` | 获取激活记录 | 管理员 | | 吊销授权码 | POST | `/api/license/{id}/revoke` | 吊销授权码 | 管理员 | | 解绑设备 | POST | `/api/license/activation/{id}/unbind` | 解绑指定设备 | 管理员 | **Plus 版特性**: - 无用户数量限制(免费版限30人) - Plus 用户自动获得所有功能权限 - 授权码格式:`MS-XXXX-XXXX-XXXX-XXXX` - 验证模式:本地验证 / 在线服务器验证 --- ### 2.13 Emby API 兼容层 > 源文件:`backend/app/emby_api.py`(~1800 行,完整的 Emby Server API v3 兼容) 提供 Emby API 子集,让 **Infuse、Kodi、Fileball** 等客户端可以直接连接 MediaStation。 **核心 Emby 端点**(仅列出关键部分,实际约 50+ 端点): | 功能 | HTTP 方法 | 端点 | 说明 | |------|----------|------|------| | Emby 认证 | POST | `/api/emby/Users/AuthenticateByName` | Emby 客户端认证 | | 系统信息 | GET | `/api/emby/System/Info` | Emby 系统信息 | | 媒体库列表 | GET | `/api/emby/Library/VirtualFolders` | 虚拟文件夹(媒体库) | | 媒体列表 | GET | `/api/emby/Items` | 媒体条目列表 | | 媒体详情 | GET | `/api/emby/Users/{uid}/Items/{id}` | 媒体详情 | | 搜索 | GET | `/api/emby/Items?searchTerm=` | 媒体搜索 | | 播放信息 | GET | `/api/emby/Items/{id}/PlaybackInfo` | 获取播放流信息 | | 视频流 | GET | `/api/emby/Videos/{id}/stream` | 视频流直链 | | 字幕流 | GET | `/api/emby/Videos/{id}/Subtitles/{sid}/Stream` | 字幕流 | | 播放进度上报 | POST | `/api/emby/Sessions/Playing` | 上报播放进度 | | 播放停止 | POST | `/api/emby/Sessions/Playing/Stopped` | 播放停止上报 | | 最新添加 | GET | `/api/emby/Users/{uid}/Items/Latest` | 最新添加的媒体 | | 继续观看 | GET | `/api/emby/Users/{uid}/Items/Resume` | 继续观看列表 | **Emby 认证方式**: - X-Emby-Token Header - Authorization: Bearer Token - Emby 用户名/密码认证 --- ### 2.14 发现/探索模块 > 源文件:`backend/app/media/discover_router.py` | 功能 | HTTP 方法 | 端点 | 说明 | 权限 | |------|----------|------|------|------| | 可用区块列表 | GET | `/api/discover/sections` | 获取所有推荐区块(含可用状态) | 登录 | | 聚合发现页 | GET | `/api/discover/feed` | 聚合各数据源推荐内容 | 登录 | | 图片代理 | GET | `/api/discover/image-proxy` | 代理外部图片(绕过豆瓣防盗链) | 登录 | **推荐区块(12 个)**: | Key | 标签 | 数据源 | |-----|------|--------| | `recent_movies` | 最近添加电影 | 本地 | | `recent_tv` | 最近添加剧集 | 本地 | | `top_rated` | 评分最高 | 本地 | | `anime` | 动漫推荐 | 本地 | | `tmdb_trending` | 流行趋势 | TMDb | | `tmdb_now_playing` | 正在热映 | TMDb | | `tmdb_popular_movies` | TMDB 热门电影 | TMDb | | `tmdb_popular_tv` | TMDB 热门电视剧 | TMDb | | `douban_hot_movies` | 豆瓣热门电影 | 豆瓣 | | `douban_hot_tv` | 豆瓣热门电视剧 | 豆瓣 | | `douban_hot_anime` | 豆瓣热门动漫 | 豆瓣 | | `douban_top250` | 豆瓣 TOP250 | 豆瓣 | | `bangumi_daily` | Bangumi 每日放送 | Bangumi | --- ## 3. 数据模型清单 > 源文件:`backend/app/base_models.py`, 各模块 `models.py` ### 公共基类 | 模型 | 说明 | |------|------| | `Base` | SQLAlchemy 声明基类 | | `TimestampMixin` | 时间戳混入(created_at, updated_at) | ### 用户模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `users` | User | id, username, password_hash, role, tier, avatar, nickname, is_active, last_login | 用户表 | | `user_permissions` | UserPermission | id, user_id, can_* (19个权限字段) | 用户功能权限表 | | `system_config` | SystemConfig | id, key, value, value_type | 系统配置表 | | `watch_history` | WatchHistory | id, user_id, media_item_id, episode_id, progress, duration, completed, last_watched | 观看历史 | ### 媒体模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `media_libraries` | MediaLibrary | id, name, path, media_type, scan_interval, enabled, min_file_size, metadata_language, adult_content, prefer_nfo, enable_watch | 媒体库 | | `media_items` | MediaItem | id, library_id, tmdb_id, douban_id, bangumi_id, title, original_title, year, overview, poster_url, backdrop_url, media_type, rating, genres, file_path, file_size, duration, video/audio_codec, resolution, strm_url, hdr_format, audio_channels, frame_rate, color_space, bit_depth, is_duplicate, duplicate_of, file_hash | 媒体条目 | | `media_seasons` | MediaSeason | id, media_item_id, season_number, name, poster_url | 季 | | `media_episodes` | MediaEpisode | id, season_id, episode_number, title, file_path, file_size, duration, air_date, video/audio_codec | 集 | | `subtitles` | Subtitle | id, media_item_id, episode_id, language, language_name, path, source | 字幕 | | `favorites` | Favorite | id, user_id, media_item_id (unique) | 收藏 | ### 下载模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `download_clients` | DownloadClient | id, name, client_type, host, port, username, password, enabled, category | 下载客户端 | | `download_tasks` | DownloadTask | id, client_id, subscription_id, media_id, torrent_name, torrent_url, info_hash, save_path, status, progress, total_size, downloaded, speed, seeders, eta, message | 下载任务 | ### 订阅模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `sites` | Site | id, name, base_url, site_type, auth_type, cookie, api_key, auth_header, user_agent, rss_url, timeout, priority, use_proxy, rate_limit, browser_emulation, enabled, login_status, upload/download_bytes, downloader | 站点配置 | | `subscriptions` | Subscription | id, name, original_name, tmdb_id, media_type, year, quality_filter, min/max_size, exclude/include_keywords, status, last_search, total_downloaded | 订阅 | | `subscription_logs` | SubscriptionLog | id, subscription_id, action, resource_title, message | 订阅日志 | | `notify_channels` | NotifyChannel | id, name, channel_type, config, enabled, events | 通知渠道 | ### 播放模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `play_history` | PlayHistory | id, user_id, media_item_id, played_at, duration, device_type, ip_address | 播放历史 | | `playlists` | Playlist | id, user_id, name, description, cover_url, is_public | 播放列表 | | `playlist_items` | PlaylistItem | id, playlist_id, media_item_id, position, added_at | 播放列表项 | ### 系统模块 | 表名 | 模型 | 关键字段 | 说明 | |------|------|---------|------| | `settings` | SettingsKV | id, key, value | KV 设置表 | | `api_configs` | ApiConfig | id, provider, api_key, base_url, extra, enabled, description | API 配置表 | --- ## 4. 前端功能清单 > 源文件:`frontend/src/` ### 4.1 页面/视图 | 路由 | 视图文件 | 功能 | 权限 | |------|---------|------|------| | `/login` | LoginView.vue | 登录页 | 公开 | | `/` | DashboardView.vue | 仪表盘(继续观看/最近添加/统计数据) | can_view_dashboard | | `/media` | MediaLibraryView.vue | 媒体库浏览(列表/海报墙切换) | can_play_media | | `/poster-wall` | PosterWallView.vue | 海报墙视图 | can_play_media | | `/favorites` | FavoritesView.vue | 收藏列表 | can_favorite | | `/tv/:id` | TvSeasonView.vue | 剧集季详情 | can_play_media | | `/media/:id` | MediaDetailView.vue | 媒体详情页 | can_play_media | | `/player/:id` | PlayerView.vue | 视频播放器 | can_play_media | | `/downloads` | DownloadView.vue | 下载管理 | can_manage_downloads | | `/discover` | DiscoverView.vue | 发现/探索页(多源聚合) | can_view_discover | | `/search` | SearchResultView.vue | 搜索结果页 | 登录 | | `/subscriptions` | SubscribeView.vue | 订阅管理 | can_manage_subscriptions | | `/sites` | SitesView.vue | 站点管理 | can_manage_sites | | `/site-search` | SiteSearchView.vue | 跨站资源搜索 | can_manage_sites | | `/settings` | SettingsView.vue | 系统设置(多 Tab) | can_access_settings | | `/history` | WatchHistoryView.vue | 观看历史 | can_view_history | | `/profile` | ProfileView.vue | 个人资料 | 登录 | | `/files` | FileManagerView.vue | 文件管理器 | can_manage_files | | `/playlists` | PlaylistView.vue | 播放列表 | 登录 | | `/playlists/:id` | PlaylistDetailView.vue | 播放列表详情 | 登录 | | `/ai-assistant` | AIAssistantView.vue | AI 助手 | can_use_ai_assistant | | `/profiles-management` | ProfileManagementView.vue | 用户管理 | 管理员 | | `/storage` | StorageView.vue | 存储管理 | 管理员 | | `/strm` | StrmView.vue | STRM 文件管理 | can_manage_strm | | `/dlna` | DlnaView.vue | DLNA 投屏 | can_cast | ### 4.2 组件 | 组件 | 说明 | |------|------| | AppEmpty.vue | 空状态占位组件 | | AppModal.vue | 通用模态框 | | AppToast.vue | 消息提示 | | BackendStatus.vue | 后端状态检测 | | FileTree.vue / FileTreeNode.vue | 文件树组件 | | settings/GeneralTab.vue | 通用设置 Tab | | settings/AccountTab.vue | 账户设置 Tab | | settings/UsersTab.vue | 用户管理 Tab | | settings/LibrariesTab.vue | 媒体库设置 Tab | | settings/OrganizeScrapeTab.vue | 整理与刮削设置 Tab | | settings/DownloadTab.vue | 下载设置 Tab | | settings/NotifyTab.vue | 通知设置 Tab | | settings/SchedulerTab.vue | 定时任务设置 Tab | | settings/SystemTab.vue | 系统设置 Tab | | settings/ApiConfigTab.vue | API 配置 Tab | | settings/LicenseTab.vue | 授权管理 Tab | | settings/AdultTab.vue | Adult Provider 设置 Tab | | settings/ConfigGroup.vue / ConfigRow.vue | 配置表单通用组件 | ### 4.3 状态管理(Pinia Stores) | Store | 文件 | 说明 | |-------|------|------| | auth | stores/auth.ts | 认证状态 + 用户权限 | | player | stores/player.ts | 播放器状态 | ### 4.4 API 调用模块 | 模块 | 文件 | 说明 | |------|------|------| | auth | api/auth.ts | 认证相关 API | | media | api/media.ts | 媒体库 API | | playback | api/playback.ts | 播放 API | | download | api/download.ts | 下载 API | | subscribe | api/subscribe.ts | 订阅 API | | system | api/system.ts | 系统 API | | settings | api/settings.ts | 设置 API | | config | api/config.ts | 配置 API | | admin | api/admin.ts | 管理后台 API | | license | api/license.ts | 授权 API | | profiles | api/profiles.ts | 用户配置 API | | playlist | api/playlist.ts | 播放列表 API | | strm | api/strm.ts | STRM API | | dlna | api/dlna.ts | DLNA API | | client | api/client.ts | HTTP 客户端封装 | ### 4.5 Composables | 模块 | 说明 | |------|------| | useFormat.ts | 格式化工具(文件大小、时长等) | | useImageError.ts | 图片加载错误处理(默认占位图) | | useSSE.ts | SSE 实时事件连接 | | useToast.ts | 消息提示封装 | ### 4.6 前端路由守卫 - 认证检查(requiresAuth) - 游客页面重定向(guest) - 管理员权限检查(adminOnly) - 功能权限检查(requiredPermission)— 与后端 19 项权限对齐 --- ## 5. 部署配置清单 ### 5.1 Docker | 文件 | 说明 | |------|------| | `docker/Dockerfile` | 多阶段构建(前端构建 + Python 运行时) | | `docker/docker-compose.yml` | Docker Compose 编排 | | `docker/docker-compose.template.yml` | 模板版本 | | `docker/.env.template` | 环境变量模板 | | `docker/deploy-docker.sh` | Linux 部署脚本 | | `docker/deploy-docker.ps1` | Windows 部署脚本 | | `docker/check-image-security.sh` | 镜像安全检查 | | `docker-compose.example.yml` | 根目录示例 | ### 5.2 Helm Chart | 文件 | 说明 | |------|------| | `deploy/charts/helm/Chart.yaml` | Chart 定义 | | `deploy/charts/helm/values.yaml` | 默认值 | | `deploy/charts/helm/templates/deployment.yaml` | Deployment 模板 | | `deploy/charts/helm/templates/service.yaml` | Service 模板 | | `deploy/charts/helm/templates/ingress.yaml` | Ingress 模板 | | `deploy/charts/helm/templates/pvc.yaml` | PVC 模板 | | `deploy/charts/helm/templates/secret.yaml` | Secret 模板 | | `deploy/charts/helm/templates/serviceaccount.yaml` | ServiceAccount 模板 | | `deploy/charts/helm/templates/_helpers.tpl` | Helm 辅助模板 | ### 5.3 其他部署 | 文件/目录 | 说明 | |-----------|------| | `nginx.example.conf` | Nginx 反向代理配置(含 SSE/视频流/HTTPS) | | `deploy/scripts/install-linux.sh` | Linux 安装脚本 | | `deploy/scripts/install-windows.ps1` | Windows 安装脚本 | | `deploy/templates/unraid/mediastation.xml` | Unraid 模板 | | `deploy/charts/truenas/media-station.yaml` | TrueNAS Chart | | `deploy/packages/synology/build-spk.sh` | 群晖 SPK 打包 | | `deploy/DEPLOYMENT.md` | 部署文档 | --- ## 6. 中间件与基础设施 | 功能 | 源文件 | 说明 | |------|--------|------| | CORS 中间件 | main.py | 可配置 origins,支持凭证 | | 全局异常处理 | main.py | AppError 层级 + 422/500 兜底 | | SPA 路由回退 | main.py | 非API请求返回 index.html | | 路径遍历防护 | main.py, image_proxy.py | resolve() 后校验 | | SQLite WAL 模式 | database.py | 预设 WAL + NORMAL 同步 | | SQLite busy_timeout | database.py | 5000ms 忙等待 | | PostgreSQL 连接池 | database.py | pool_size=10, max_overflow=20 | | JWT 认证 | deps.py, user/auth.py | HS256, access + refresh token | | 权限检查 | deps.py | require_permission() 工厂函数 | | 敏感数据加密 | system/crypto.py | Fernet (AES-128-CBC) | | SSE 事件总线 | system/events.py | 僵尸队列检测 + 心跳 + 自动清理 | | 文件监控 | media/watcher.py | 文件系统实时监控 | | 后台任务调度 | system/scheduler.py | APScheduler (AsyncIO) | ### 异常层级 | 异常类 | HTTP 状态码 | 说明 | |--------|-----------|------| | AppError | 500 | 基础业务异常 | | NotFoundError | 404 | 资源不存在 | | ValidationError | 422 | 参数校验失败 | | UnauthorizedError | 401 | 未认证 | | ForbiddenError | 403 | 无权限 | | ConflictError | 409 | 资源冲突 | | ExternalServiceError | 502 | 外部服务错误 | | ScraperError | 404 | 刮削失败 | | TranscodeError | 500 | 转码失败 | | DownloadClientError | 502 | 下载客户端错误 | | SiteError | 502 | 站点错误 | --- ## 7. 配置系统 > 源文件:`backend/app/config.py` ### 环境变量配置 | 分类 | 变量 | 默认值 | 说明 | |------|------|--------|------| | **应用** | APP_NAME | MediaStation | 应用名 | | | APP_PORT | 3001 | 端口 | | | APP_DEBUG | false | 调试模式 | | | APP_SECRET_KEY | AUTO_GENERATE | JWT 密钥(自动生成警告) | | | DATA_DIR | ./data | 数据目录 | | | SERVER_URL | "" | 服务器地址(外部播放器用) | | **数据库** | DATABASE_URL | "" | 留空用 SQLite | | **TMDb** | TMDB_API_KEY | "" | TMDb API Key | | | TMDB_LANGUAGE | zh-CN | TMDb 语言 | | | TMDB_BASE_URL | https://api.themoviedb.org/3 | TMDb API 地址 | | **豆瓣** | DOUBAN_COOKIE | "" | 豆瓣 Cookie | | **Bangumi** | BANGUMI_TOKEN | "" | Bangumi Token | | **qBittorrent** | QB_HOST | "" | qBittorrent 地址 | | | QB_USERNAME | admin | 用户名 | | | QB_PASSWORD | adminadmin | 密码 | | **Transmission** | TR_HOST | "" | Transmission 地址 | | | TR_USERNAME | "" | 用户名 | | | TR_PASSWORD | "" | 密码 | | **Telegram** | TELEGRAM_BOT_TOKEN | "" | Bot Token | | | TELEGRAM_CHAT_ID | "" | Chat ID | | **微信** | WECHAT_SENDKEY | "" | Server酱 SendKey | | **Bark** | BARK_SERVER | "" | Bark 服务器 | | | BARK_KEY | "" | Bark Key | | **AI** | OPENAI_API_KEY | "" | OpenAI API Key | | | OPENAI_BASE_URL | https://api.openai.com/v1 | API 地址 | | | OPENAI_MODEL | gpt-4o-mini | 模型 | | **FFmpeg** | FFMPEG_PATH | ffmpeg | FFmpeg 路径 | | | FFPROBE_PATH | ffprobe | FFprobe 路径 | | | HW_ACCEL | auto | 硬件加速 (auto/qsv/vaapi/nvenc/videotoolbox/none) | | | MAX_TRANSCODE_JOBS | 2 | 最大并发转码 | | | TRANSCODE_ENABLED | false | 默认关闭转码 | | **媒体目录** | MOVIES_DIR | "" | 电影目录 | | | TV_DIR | "" | 剧集目录 | | | ANIME_DIR | "" | 动漫目录 | | **JWT** | JWT_ACCESS_EXPIRE_MINUTES | 60 | Access Token 有效期 | | | JWT_REFRESH_EXPIRE_DAYS | 30 | Refresh Token 有效期 | | **安全** | VERIFY_CLIENT_SSL | true | 下载客户端 SSL 校验 | | **CORS** | CORS_ORIGINS | "" | 逗号分隔的允许源 | ### 数据库存储配置(settings 表) 整理/刮削相关配置通过 `SettingsKV` 表存储,通过 `/api/settings` 端点管理。 ### API 配置(api_configs 表) 各数据源 API Key 通过 `ApiConfig` 表存储,支持加密,通过 `/api/api-config` 端点管理。 --- ## 8. 技术栈对照表 | 层次 | 原版 (Python) | 目标 (Go) | |------|--------------|-----------| | **Web 框架** | FastAPI | Gin | | **ORM** | SQLAlchemy (async) | GORM | | **数据库** | SQLite / PostgreSQL | SQLite / PostgreSQL | | **认证** | python-jose (JWT) + passlib | golang-jwt + bcrypt | | **任务调度** | APScheduler | robfig/cron 或类似 | | **SSE** | sse-starlette | 原生实现 | | **HTTP 客户端** | httpx | net/http | | **模板引擎** | 无(SPA) | 无(SPA) | | **前端** | Vue 3 + Pinia + Vue Router | React + Zustand + React Router | | **UI 框架** | 未明确(推测自定义/Vuetify) | MUI + Tailwind CSS | | **构建工具** | Vite | Vite | | **加密** | cryptography (Fernet) | crypto/aes | | **视频处理** | FFmpeg (subprocess) | FFmpeg (exec) | | **容器化** | Docker + Helm | Docker + Helm | | **反向代理** | Nginx | Nginx | --- ## 附录:API 端点总数统计 | 模块 | 端点数量 | |------|---------| | 用户与认证 | 19 | | 媒体库 | 31 | | 播放 | 11 | | 下载 | 12 | | 订阅与站点 | 20 | | 系统 | 15 | | 管理后台 | ~20 | | 统计 | 8 | | 播放列表 | 8 | | STRM | 6 | | DLNA | 3 | | 授权管理 | 13 | | Emby 兼容层 | ~50 | | 发现/探索 | 3 | | **总计** | **~220** | --- > **文档版本**: v1.0 | **分析范围**: `MediaStation-py` 全量源代码