MediaStationGo 当前实现分析报告
项目路径: D:\项目\MediaStationGo
技术栈: Go 1.25 + Gin + GORM + SQLite (WAL) + Viper + Zap + JWT (后端) | React 18 + Vite + TailwindCSS + Zustand + HLS.js (前端)
分析日期: 2026-02-04
分析者: Architect (Bob)
一、总体架构概览
后端架构
前端架构
数据模型(12个实体)
| 实体 |
说明 |
| User |
用户账户(角色: admin/user) |
| Library |
媒体库根目录(类型: movie/tv/anime/music) |
| Media |
单个可播放媒体项 |
| Series |
电视剧集分组 |
| PlaybackHistory |
播放进度记录 |
| Favorite |
收藏标记 |
| Playlist / PlaylistItem |
用户播放列表 |
| DownloadTask |
下载任务(qBittorrent) |
| Subscription |
RSS订阅规则 |
| Setting |
系统键值配置 |
| AccessLog |
操作审计日志 |
二、功能模块详细分析
1. 认证与用户系统 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| 用户注册(首用户自动提升为admin) |
✅ |
service/auth.go - Register() |
| 用户登录(JWT签发,24h有效期) |
✅ |
service/auth.go - Login() |
| 密码修改(验证旧密码) |
✅ |
service/auth.go - ChangePassword() |
| 初始化Admin种子用户 |
✅ |
service/auth.go - SeedAdmin() |
| JWT中间件认证 |
✅ |
middleware/middleware.go - AuthRequired() |
| Admin权限守卫 |
✅ |
middleware/middleware.go - AdminRequired() |
| CORS跨域支持 |
✅ |
middleware/middleware.go - CORS() |
| 用户列表/删除(管理员) |
✅ |
handler/admin.go, handler/profile.go |
| 角色更新(管理员) |
✅ |
handler/profile.go - adminUpdateRoleHandler |
| 个人资料更新 |
✅ |
service/profile.go, handler/profile.go |
API端点:
POST /api/auth/login - 登录
POST /api/auth/register - 注册
GET /api/me - 获取当前用户
PATCH /api/me - 更新资料
POST /api/me/password - 修改密码
GET /api/admin/users - 用户列表(管理员)
PATCH /api/admin/users/:id/role - 更新角色(管理员)
DELETE /api/admin/users/:id - 删除用户(管理员)
前端实现
| 功能 |
状态 |
文件位置 |
| 登录页面 |
✅ |
pages/LoginPage.tsx |
| 注册入口 |
✅ |
登录页集成 |
| JWT状态管理 |
✅ |
stores/auth.ts (Zustand) |
| 路由守卫 |
✅ |
components/RequireAuth.tsx |
| 自动401跳转登录 |
✅ |
api/client.ts 拦截器 |
| Profile页面 |
✅ |
pages/ProfilePage.tsx |
| Admin管理页面 |
✅ |
pages/AdminPage.tsx |
2. 媒体库管理 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| 创建媒体库 |
✅ |
service/media.go - CreateLibrary() |
| 列出所有媒体库 |
✅ |
service/media.go - ListLibraries() |
| 删除媒体库(级联删除媒体) |
✅ |
service/media.go - DeleteLibrary() |
| 扫描媒体库(发现视频文件) |
✅ |
service/scanner.go - ScanLibrary() |
| FFprobe元数据提取 |
✅ |
service/ffprobe.go |
| 文件系统监控自动扫描 |
✅ |
service/watcher.go (fsnotify) |
| 剧集季/集解析 |
✅ |
service/episode_parser.go - ParseEpisode() |
| 媒体分页查询 |
✅ |
service/media.go - ListMedia() |
| 媒体搜索(LIKE模糊匹配) |
✅ |
service/media.go - SearchMedia() |
| 媒体详情查询 |
✅ |
service/media.go - GetMedia() |
| TV剧按季分组API |
✅ |
handler/series.go - listSeasonsHandler |
| 软删除/恢复/永久删除 |
✅ |
service/media.go (回收站功能) |
支持的视频格式: .mkv, .mp4, .m4v, .avi, .mov, .webm, .ts, .rmvb, .rm, .3gp, .mpg, .mpeg, .strm
API端点:
GET /api/libraries - 列表
POST /api/libraries - 创建(需管理员)
DELETE /api/libraries/:id - 删除(需管理员)
POST /api/libraries/:id/scan - 扫描(需管理员)
POST /api/libraries/:id/scrape - 刮削(需管理员)
GET /api/libraries/:id/media - 媒体列表(分页)
GET /api/libraries/:id/seasons - 按季分组
GET /api/media/:id - 媒体详情
GET /api/media?q= - 搜索
DELETE /api/media/:id - 软删除
POST /api/media/:id/restore - 恢复
DELETE /api/media/:id/purge - 永久删除
POST /api/media/:id/probe - 重新探测
前端实现
| 功能 |
状态 |
文件位置 |
| 首页(继续观看+最近添加) |
✅ |
pages/HomePage.tsx |
| 媒体库详情页 |
✅ |
pages/LibraryPage.tsx |
| 媒体详情页 |
✅ |
pages/MediaDetailPage.tsx |
| 搜索页面 |
✅ |
pages/SearchPage.tsx |
| 媒体卡片组件 |
✅ |
components/MediaCard.tsx |
| 回收站页面 |
✅ |
pages/RecycleBinPage.tsx |
3. 刮削系统 ✅ 已完整实现(多数据源)
后端实现
| 功能 |
状态 |
文件位置 |
| TMDb电影刮削 |
✅ |
service/tmdb.go - SearchMovie() |
| Bangumi动漫刮削 |
✅ |
service/bangumi.go - Search() |
| TheTVDB电视剧刮削 |
🔶 |
service/thetvdb.go (结构存在,需确认实现完整性) |
| Fanart.tv封面升级 |
🔶 |
service/fanart.go (结构存在,需确认实现完整性) |
| 文件名智能清洗 |
✅ |
service/scraper.go - CleanQuery() |
| 年份提取 |
✅ |
正则 yearPattern |
| 噪声词过滤 |
✅ |
35+噪声词(分辨率、编码、字幕组等) |
| 季/集号正则提取 |
✅ |
service/episode_parser.go |
| 单个媒体刮削 |
✅ |
service/scraper.go - EnrichOne() |
| 批量库刮削(后台执行,4 RPS限流) |
✅ |
service/scraper.go - EnrichLibrary() |
| 刮削进度WebSocket推送 |
✅ |
通过WSHub发布"scrape"事件 |
| TMDb代理支持(GFW穿透) |
✅ |
配置 tmdb_api_proxy |
| 图片CDN代理 |
✅ |
配置 tmdb_image_proxy |
| NFO导出(Kodi/Jellyfin兼容) |
✅ |
service/nfo.go |
刮削策略链:
API端点:
POST /api/media/:id/scrape - 单个刮削(需管理员)
POST /api/libraries/:id/scrape - 批量刮削(需管理员,异步)
POST /api/media/:id/nfo - 导出NFO(需管理员)
POST /api/libraries/:id/nfo - 批量导出NFO(需管理员)
GET /api/img?url=... - 图片代理
4. 播放与转码 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| 直接播放(HTTP Range支持) |
✅ |
service/stream.go - ServeFile() |
| HLS转码播放 |
✅ |
service/transcoder.go |
| HLS M3U8播放列表服务 |
✅ |
service/stream.go - ServeHLSPlaylist() |
| HLS分段服务 |
✅ |
service/stream.go - ServeHLSSegment() |
| 转码任务管理 |
✅ |
TranscoderService (启动/停止/活跃列表) |
| 软件编码 (libx264) |
✅ |
默认编码器 |
| NVIDIA NVENC硬件加速 |
✅ |
encoder = "nvenc" |
| Intel QSV硬件加速 |
✅ |
encoder = "qsv" |
| VAAPI硬件加速 |
✅ |
encoder = "vaapi" |
| FFprobe媒体信息探测 |
✅ |
service/ffprobe.go |
| 字幕发现(同目录/subs/子目录) |
✅ |
service/subtitle.go - Discover() |
| SRT→WebVTT转换 |
✅ |
service/subtitle.go - srtToVTT() |
| ASS/SSA→WebVTT转换 |
✅ |
service/subtitle.go - assToVTT() |
| 字幕语言检测 |
✅ |
正则语言标签识别 |
| 转码进度WebSocket推送 |
✅ |
通过WSHub发布"transcode"事件 |
转码参数(可配置):
- 视频码率: 1500k(默认)
- 最大码率: 1800k
- 缓冲区: 3000k
- 最大高度: 720p(默认)
- 分段时长: 4秒(默认)
- 音频: AAC 128kHz 立体声
API端点:
GET /api/stream/:id - 直接播放
GET /api/hls/:id/index.m3u8 - HLS播放列表
GET /api/hls/:id/:seg - HLS分段
DELETE /api/hls/:id - 停止转码
GET /api/media/:id/subtitles - 字幕列表
GET /api/subtitles/:id?path=... - 字幕内容
前端实现
| 功能 |
状态 |
文件位置 |
| 播放器页面 |
✅ |
pages/PlayerPage.tsx |
| HLS.js集成 |
✅ |
通过HLS.js播放m3u8 |
| 直接播放回退 |
✅ |
<video> 标签直接播放 |
| 字幕轨道加载 |
✅ |
<track> 元素 |
| 全局事件处理 |
✅ |
components/GlobalEvents.tsx |
5. 下载管理 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| 添加下载任务(磁力链接/URL) |
✅ |
service/downloads.go - AddDownload() |
| qBittorrent集成 |
✅ |
service/qbittorrent.go - QBitClient |
| 下载列表(数据库+实时状态) |
✅ |
service/downloads.go - List() |
| 删除下载(可选删文件) |
✅ |
service/downloads.go - Delete() |
| 下载配置热重载 |
✅ |
service/downloads.go - ReloadConfig() |
| 后台轮询进度(5s间隔) |
✅ |
service/downloads.go - poll() |
| 进度WebSocket推送 |
✅ |
通过WSHub发布"download"事件 |
qBittorrent设置(通过Setting表动态配置):
qbittorrent.url - WebUI地址
qbittorrent.username - 用户名
qbittorrent.password - 密码
qbittorrent.savepath - 默认保存目录
API端点:
GET /api/downloads - 下载列表
POST /api/downloads - 添加下载
DELETE /api/downloads/:hash?delete_files=true - 删除下载
POST /api/downloads/reload - 重载配置(需管理员)
前端实现
| 功能 |
状态 |
文件位置 |
| 下载管理页面 |
✅ |
pages/DownloadsPage.tsx |
| 实时进度显示 |
✅ |
WebSocket + REST 双通道 |
后端实现
| 功能 |
状态 |
文件位置 |
| 创建订阅规则 |
✅ |
service/subscription.go - Create() |
| 订阅列表 |
✅ |
service/subscription.go - List() |
| 删除订阅 |
✅ |
service/subscription.go - Delete() |
| RSS/Atom Feed解析 |
✅ |
service/subscription.go - fetch() |
| 正则过滤规则 |
✅ |
service/subscription.go - compileFilter() |
| GUID去重(防重复下载) |
✅ |
Setting存储已见GUID列表(最近200条) |
| 自动轮询(10分钟间隔) |
✅ |
service/subscription.go - loop() |
| 启动后首次快速运行(30s) |
✅ |
Timer机制 |
| 手动触发运行 |
✅ |
service/subscription.go - RunNow() |
| 匹配项自动入队下载 |
✅ |
调用DownloadService.AddDownload() |
API端点:
GET /api/subscriptions - 订阅列表
POST /api/subscriptions - 创建订阅
DELETE /api/subscriptions/:id - 删除订阅
POST /api/subscriptions/:id/run - 手动触发
前端实现
| 功能 |
状态 |
文件位置 |
| 订阅管理页面 |
✅ |
pages/SubscriptionsPage.tsx |
7. AI 功能 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| AI智能搜索(自然语言→结构化查询) |
✅ |
service/ai.go - SmartSearch() |
| AI推荐(基于历史观看记录) |
✅ |
service/ai.go - Recommend() |
| OpenAI兼容API接入 |
✅ |
/v1/chat/completions |
| 多Provider支持 |
✅ |
OpenAI/DeepSeek/Qwen/Ollama等 |
| AI状态检查 |
✅ |
ai.go - Enabled() |
| 降级处理(AI不可用时返回原始查询) |
✅ |
SmartSearch的fallback逻辑 |
AI能力:
- SmartSearch: 将中英文自然语言查询转换为结构化搜索意图(query/year/genre/type/sort/language)
- Recommend: 根据最近观看标题生成推荐片单
配置项 (config.AIConfig):
enabled - 开关
provider - 提供商标识
api_base - API地址
api_key - API密钥
model - 模型名称(默认 gpt-4o-mini)
timeout - 超时时间(默认30s)
max_concurrent - 最大并发数
API端点:
GET /api/ai/status - AI状态
POST /api/ai/search - AI智能搜索
GET /api/ai/recommend - AI推荐
前端实现
| 功能 |
状态 |
文件位置 |
| AI搜索集成 |
✅ |
api/ai.ts |
| 推荐展示 |
✅ |
HomePage集成 |
8. 系统运维 ✅ 已完整实现
后端实现
| 功能 |
状态 |
文件位置 |
| 统计仪表盘 |
✅ |
service/stats.go - Compute() |
| CPU/内存/磁盘监控 |
✅ |
gopsutil 库 |
| Go运行时指标 |
✅ |
goroutine数量/版本号 |
| 系统设置CRUD |
✅ |
repository/setting.go |
| 操作审计日志 |
✅ |
service/audit.go |
| 日志查询 |
✅ |
handler/admin.go - recentLogsHandler |
| 活跃任务面板 |
✅ |
handler/tasks.go (转码+种子) |
| 健康检查 |
✅ |
handler/handler.go - healthCheck |
| 版本信息 |
✅ |
handler/handler.go - versionInfo |
| 优雅关闭 |
✅ |
main.go (SIGINT/SIGTERM处理) |
| SPA静态文件服务 |
✅ |
main.go - serveSPA() |
| 图片代理(CORS/GFW穿透) |
✅ |
service/image_proxy.go |
| WebSocket实时推送中心 |
✅ |
service/ws_hub.go (Hub发布/订阅) |
统计快照包含:
- 媒体库总数 / 媒体总数 / 用户总数
- 总磁盘占用 / 总时长
- 最近添加的12条媒体
- 硬件信息(CPU%/内存/磁盘/Go版本/goroutines数)
API端点:
GET /api/stats - 统计数据
GET /api/tasks - 活跃任务(管理员)
GET /api/settings - 设置列表(管理员)
PUT /api/settings - 更新设置(管理员)
GET /api/logs - 审计日志(管理员)
GET /api/health - 健康检查
GET /api/version - 版本信息
GET /api/ws - WebSocket连接
GET /api/discover/trending - TMDb热门趋势
GET /api/discover/popular - TMDb热门影片
GET /api/recycle - 回收站(管理员)
前端实现
| 功能 |
状态 |
文件位置 |
| Stats统计页面 |
✅ |
pages/StatsPage.tsx |
| Tasks任务页面 |
✅ |
pages/TasksPage.tsx |
| Admin管理面板 |
✅ |
pages/AdminPage.tsx |
| Discover发现页 |
✅ |
pages/DiscoverPage.tsx |
| RecycleBin回收站 |
✅ |
pages/RecycleBinPage.tsx |
| Layout布局组件 |
✅ |
components/Layout.tsx (导航/侧边栏) |
三、前端页面清单(18个路由)
| 路径 |
页面 |
认证要求 |
状态 |
/login |
LoginPage |
公开 |
✅ |
/ |
HomePage |
登录 |
✅ |
/library/:id |
LibraryPage |
登录 |
✅ |
/discover |
DiscoverPage |
登录 |
✅ |
/search |
SearchPage |
登录 |
✅ |
/favourites |
FavouritesPage |
登录 |
✅ |
/playlists |
PlaylistsPage |
登录 |
✅ |
/playlist/:id |
PlaylistDetailPage |
登录 |
✅ |
/media/:id |
MediaDetailPage |
登录 |
✅ |
/play/:id |
PlayerPage |
登录 |
✅ |
/downloads |
DownloadsPage |
登录 |
✅ |
/subscriptions |
SubscriptionsPage |
登录 |
✅ |
/profile |
ProfilePage |
登录 |
✅ |
/tasks |
TasksPage |
管理员 |
✅ |
/recycle |
RecycleBinPage |
管理员 |
✅ |
/stats |
StatsPage |
管理员 |
✅ |
/admin |
AdminPage |
管理员 |
✅ |
* |
重定向到首页 |
- |
✅ |
四、前端API模块清单(15个)
| 模块 |
文件 |
功能覆盖 |
| client.ts |
Axios实例 |
基础HTTP/JWT拦截/流媒体URL构建/图片代理URL |
| auth.ts |
认证API |
login/register/getMe/updateProfile/changePassword |
| library.ts |
媒体库API |
list/create/delete/scan/scrape/listMedia/listSeasons |
| playback.ts |
播放API |
history/favourites/playlists CRUD |
| downloads.ts |
下载API |
list/add/delete/reloadConfig |
| subscriptions.ts |
订阅API |
list/create/delete/runNow |
| ai.ts |
AI API |
status/smartSearch/recommend |
| discover.ts |
发现API |
trending/popular |
| admin.ts |
管理API |
users/roles/settings/logs |
| profile.ts |
资料API |
update |
| recycle.ts |
回收站API |
list/restore/purge/softDelete |
| series.ts |
剧集API |
seasons |
| stats.ts |
统计API |
getStats |
| subtitles.ts |
字幕API |
list/serve |
| tasks.ts |
任务API |
getTasks |
五、依赖清单
Go后端核心依赖
| 依赖 |
版本 |
用途 |
| github.com/gin-gonic/gin |
v1.9.1 |
HTTP框架 |
| github.com/glebarez/sqlite |
v1.11.0 |
SQLite驱动(CGo-free) |
| gorm.io/gorm |
v1.25.7 |
ORM |
| github.com/golang-jwt/jwt/v5 |
v5.2.0 |
JWT认证 |
| github.com/spf13/viper |
v1.18.2 |
配置管理 |
| go.uber.org/zap |
v1.27.0 |
结构化日志 |
| github.com/gorilla/websocket |
v1.5.3 |
WebSocket |
| github.com/fsnotify/fsnotify |
v1.7.0 |
文件系统监控 |
| github.com/shirou/gopsutil/v3 |
v3.24.5 |
系统监控 |
| github.com/google/uuid |
v1.6.0 |
UUID生成 |
| golang.org/x/crypto |
v0.21.0 |
bcrypt密码哈希 |
六、功能完成度总结
| 功能模块 |
完成度 |
备注 |
| 认证与用户系统 |
✅ 100% |
JWT + 角色 + 种子Admin + 审计 |
| 媒体库管理 |
✅ 100% |
CRUD + 扫描 + 监控 + 搜索 + 回收站 |
| 刮削系统 |
✅ 100% |
TMDb + Bangumi + TheTVDB + Fanart + NFO |
| 播放与转码 |
✅ 100% |
直播/HLS/4种硬件加速/字幕 |
| 下载管理 |
✅ 100% |
qBittorrent + 实时进度 + 热重载 |
| RSS订阅 |
✅ 100% |
RSS解析 + 过滤 + 去重 + 自动入队 |
| AI功能 |
✅ 100% |
智能搜索 + 推荐 + 多Provider |
| 系统运维 |
✅ 100% |
统计/审计/日志/任务/WS/健康检查 |
| 前端页面 |
✅ 100% |
18个路由全部定义 + API全覆盖 |
整体评估: MediaStationGo 的代码库是一个功能完整的媒体服务器实现,后端约30个Go源文件(~5000行),前端18个页面+15个API模块。所有核心功能模块均有对应的 Handler → Service → Repository 三层实现。项目采用了生产级的架构模式(分层配置、优雅关闭、WebSocket实时推送、硬件加速转码等)。