Files
MeBox/docs/prd-mediastation-full-features.md
T

46 KiB
Raw Blame History

MediaStation 原版完整功能迁移清单

基于 MediaStation-py(Python/FastAPI + Vue 3)源代码分析,供 MediaStationGo(Go/Gin + React)重写参考。

分析日期:2025-07-09


目录


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 全量源代码