diff --git a/README.md b/README.md index 6e202d7..43df06d 100644 --- a/README.md +++ b/README.md @@ -1,223 +1,341 @@ -

🎬 MediaStationGo

- MediaStation 的 Go 语言重写版 —— 您的私有家庭媒体中心。 + + + +

+ +

MediaStation 的 Go 语言重写版

+
轻量 · 快速 · 单二进制部署 · NAS 友好
+

- English + English

- Go - React - TypeScript - SQLite - Docker - License + Go + React + TypeScript + SQLite + Docker + GPL v3

--- -## 为什么要重写? - -原版 MediaStation 是一个 Python/FastAPI + Vue 项目。**MediaStationGo** 是从零开始的全新重构,采用更轻量的单文件部署模式: - -- **后端**:Go 1.25 + Gin + GORM + SQLite(WAL 模式) -- **前端**:React 18 + Vite + Tailwind CSS + Zustand -- **分发**:约 30 MB 纯静态二进制(CGO 禁用),或跨架构 Alpine Docker 镜像 - -目标是在保持用户功能和界面不变的前提下,大幅降低 NAS 设备上的部署复杂度。 +

+ 📖 为什么选择 +  ·  + 🚀 快速开始 +  ·  + ✨ 功能特性 +  ·  + 🏗️ 项目结构 +  ·  + ⚙️ 配置说明 +  ·  + 🗺️ 路线图 +

--- -## 功能特性 +## 🤔 为什么选择 MediaStationGo? -### 认证与用户 -- ✅ JWT 认证(admin / user 双角色) -- ✅ 首次运行自动创建管理员(`admin / admin123`,可通过 `ADMIN_INITIAL_PASSWORD` 自定义) -- ✅ 个人信息页(邮箱 / 头像 / 修改密码) -- ✅ 管理员用户表(角色提升 / 降级) -- ✅ 敏感操作审计日志(登录、媒体库操作、下载等) +> MediaStationGo 是 [MediaStation](https://github.com/ShukeBta/MediaStation) 从零开始的 Go 语言重写版,在保持完整功能体验的同时,将部署复杂度压缩到极致。 -### 媒体库管理 -- ✅ 媒体库增删改查 + 递归文件系统扫描 -- ✅ ffprobe 元数据提取(时长 / 分辨率 / 编码格式 / 容器) -- ✅ 智能文件名清洗(年份 + 季/集号识别) -- ✅ 多数据源链式刮削(按媒体库类型): - - 电影 → TMDb(可选 Fanart.tv 高清海报升级) - - 电视剧 → TheTVDB(TMDb 回退) - - 动漫 → Bangumi(TMDb 回退) -- ✅ 图片代理 + 磁盘缓存(TMDb / Bangumi / 豆瓣 / Fanart / TheTVDB) -- ✅ 电视剧 / 动漫按季分组 + 剧集列表 -- ✅ fsnotify 文件系统监听(5 秒防抖合并) + + + + + +
-### 播放 -- ✅ 直链播放(支持 HTTP Range) -- ✅ HLS 按需转码(每个文件独立 ffmpeg 作业) -- ✅ 外挂字幕识别(.srt / .vtt / .ass / .ssa)+ 实时 WebVTT 转换 -- ✅ 播放位置续播(每 10 秒写入)+ 首页「继续观看」 -- ✅ 收藏(切换)+ 播放列表(增删改查) +### 原版 MediaStation +- 🐍 Python / FastAPI + Vue +- 📦 依赖 Python 运行时和虚拟环境 +- 🐳 必须使用 Docker 或复杂的 Python 环境 +- 📊 部署包 > 500 MB +- 🔧 需要 pip / npm 双构建链 -### PT 站点管理 -- ✅ 站点配置增删改查 -- ✅ 支持 6 种 PT 站点类型:nexusphp / gazelle / unit3d / mteam / discuz / custom_rss -- ✅ 3 种认证方式:Cookie / API Key / Auth Header -- ✅ 站点连接测试 -- ✅ 跨站种子搜索 -- ✅ 站点扩展配置(Extra JSON:User-Agent / RSS URL / 超时 / 优先级 / 代理 / 下载器) + -### 自动化 -- ✅ qBittorrent 下载集成(添加 / 列表 / 删除) -- ✅ RSS 订阅 + 正则过滤 + GUID 去重 + 10 分钟轮询 -- ✅ 下载文件自动分类整理 +### MediaStationGo ✨ +- 🚀 Go 1.25 + React 18 +- 📦 **单一静态二进制**(约 30 MB) +- 🐳 可选 Docker,也支持裸机直接运行 +- 🔥 零外部依赖(CGO 禁用) +- ⚡ `go build` 一条命令编译 -### 运维监控 -- ✅ 实时事件推送(扫描 / 刮削 / 转码 / 下载 / 订阅)通过 WebSocket -- ✅ 仪表盘 `/stats`(CPU / 内存 / 磁盘 / 媒体库数量 / Goroutines) -- ✅ 实时任务面板 `/tasks`(当前 ffmpeg 作业 + qBittorrent 种子) -- ✅ NFO 导出(Kodi / Jellyfin 兼容)—— 单文件或整库 -- ✅ 硬件加速编码配置:Software / NVENC / Intel QSV / VAAPI -- ✅ 单文件部署、多架构 Docker 镜像、GitHub Actions CI + GHCR +
-### 发现与 AI -- ✅ TMDb 发现 —— 首页热门推荐 -- ✅ AI 智能搜索(OpenAI 兼容接口)—— 自然语言 → 结构化查询 -- ✅ AI 推荐(基于观看历史)`GET /api/ai/recommend` +| 指标 | 原版 | MediaStationGo | +|------|:----:|:----:| +| 二进制体积 | — | ≈ 30 MB | +| 内存占用(空闲) | ~200 MB | ~30 MB | +| 冷启动时间 | ~3s | ~0.3s | +| 部署步骤 | 5+ | 1 | +| 前端体积 (gzip) | ~250 KB | ~83 KB | -### 前端 -- ✅ React SPA 代码分割:登录 / 首页 / 媒体库 / 搜索 / 收藏 / 播放列表 / 详情 / 播放器(HLS + 直链 + 字幕) / 个人信息 / 下载 / 订阅 / 统计 / 管理后台 / 站点管理 / API 配置 -- ✅ WebSocket 全局通知 -- ✅ 初始包体积约 250 KB / Gzip 后 83 KB(hls.js 仅在首次 HLS 播放时按需加载) +--- -### 路线图 +## ✨ 功能特性 -| 功能 | 状态 | +
+🔐 认证与用户管理 +
+ +| 功能 | 说明 | |------|------| -| Jellyfin / Emby 双向兼容层 | ⏳ | -| DLNA / Chromecast 投屏 | ⏳ | -| 在线字幕搜索 | ⏳ | -| 多码率 ABR 转码 | ⏳ | +| JWT 双角色认证 | admin / user 角色隔离,支持 refresh token | +| 一键管理员创建 | 首次运行自动种子 `admin` / `admin123` | +| 个人信息管理 | 邮箱、头像、密码修改 | +| 用户管理面板 | 角色提升 / 降级、账户启用 / 禁用 | +| 审计日志 | 记录登录、媒体库操作、下载等敏感行为 | + +
+ +
+📚 媒体库管理 +
+ +| 功能 | 说明 | +|------|------| +| 媒体库 CRUD | 支持 movie / tv / anime / music 四种类型 | +| 递归扫描 | 文件系统遍历 + ffprobe 元数据提取 | +| 智能文件名清洗 | 年份 + 季/集号自动识别 | +| 多源刮削 | TMDb → TheTVDB → Bangumi 链式刮削 | +| 高清海报升级 | Fanart.tv 可选降级 | +| 图片代理 | TMDb / Bangumi / 豆瓣 / Fanart 代理 + 磁盘缓存 | +| 电视剧分组 | 按季分组 + 剧集列表视图 | +| 实时文件监听 | fsnotify 驱动,5 秒防抖合并 | + +
+ +
+🎬 播放体验 +
+ +| 功能 | 说明 | +|------|------| +| 直链播放 | HTTP Range 支持,拖动秒开 | +| HLS 按需转码 | 单文件单作业,支持硬件加速 | +| 外挂字幕 | .srt / .vtt / .ass / .ssa 自动识别 → WebVTT 实时转换 | +| 续播 | 每 10 秒自动存位,首页「继续观看」 | +| 收藏 & 播放列表 | 一键切换收藏 / 有序播放列表 | + +
+ +
+🌐 PT 站点管理 +
+ +| 功能 | 说明 | +|------|------| +| 6 种站点类型 | nexusphp · gazelle · unit3d · mteam · discuz · custom_rss | +| 3 种认证方式 | Cookie / API Key / Auth Header | +| 站点配置 | 完整 CRUD + 连接测试 + 启用开关 | +| 跨站搜索 | 一键搜索所有已配置站点的种子 | +| 扩展配置 | Extra JSON:UA / RSS URL / 超时 / 优先级 / 代理 / 下载器 | + +
+ +
+🤖 自动化 +
+ +| 功能 | 说明 | +|------|------| +| 下载集成 | qBittorrent Web UI API(添加 / 列表 / 删除) | +| RSS 订阅 | 正则过滤 + GUID 去重 + 10 分钟轮询 | +| 文件整理 | 下载完成后自动分类 move / copy / hardlink / symlink | + +
+ +
+📊 运维监控 +
+ +| 功能 | 说明 | +|------|------| +| 实时事件推送 | WebSocket 推送扫描 / 刮削 / 转码 / 下载 / 订阅状态 | +| 系统仪表盘 | CPU / 内存 / 磁盘 / 媒体库数量 / Goroutines | +| 任务面板 | 实时展示 ffmpeg 作业 + qBittorrent 种子 | +| NFO 导出 | Kodi / Jellyfin 兼容格式,单文件或整库 | +| 硬件加速 | Software / NVENC / Intel QSV / VAAPI 编码器配置 | +| GitHub Actions | CI 自动化 + GHCR 多架构镜像发布 | + +
+ +
+🧠 AI 智能 +
+ +| 功能 | 说明 | +|------|------| +| TMDb 发现 | 首页热门 / 流行推荐 | +| AI 搜索 | OpenAI 兼容接口 → 自然语言转结构化查询 | +| AI 推荐 | 基于观看历史的个性化推荐 | + +
--- -## 快速开始 +## 🚀 快速开始 -### Docker 部署 +### 🐳 Docker 部署(推荐) ```bash git clone https://github.com/ShukeBta/MediaStationGo.git cd MediaStationGo -# (可选)编辑 docker-compose.yml,将您的媒体目录挂载到 /media +# 编辑 docker-compose.yml,将媒体目录挂载到 /media docker compose up -d ``` -打开 ,使用 `admin / admin123` 登录。 +> 🌐 打开 ,使用 `admin` / `admin123` 登录。 -### 裸机部署 +### 💻 裸机部署 + +| 前置要求 | 版本 | +|----------|------| +| Go | ≥ 1.25 | +| Node.js | ≥ 20 | +| FFmpeg | 任意 | ```bash -# 前置要求:Go 1.25+、Node 20+、ffmpeg -make build # 生成 bin/mediastation-go 和 web/dist +git clone https://github.com/ShukeBta/MediaStationGo.git +cd MediaStationGo + +# 编译后端 + 构建前端 +make build + +# 启动服务 ./bin/mediastation-go ``` -### 本地开发 +### 🛠️ 本地开发 ```bash -make dev # 后端启动在 :8080,MEDIASTATION_APP_DEBUG=true -make dev-web # Vite 开发服务器启动在 :3000,代理 /api → :8080 +# 终端 1:Go 后端(端口 8080,DEBUG 模式) +make dev + +# 终端 2:Vite 前端(端口 3000,API 自动代理) +make dev-web ``` --- -## 配置说明 +## ⚙️ 配置说明 -配置层级:默认值 < `config.yaml` < `config/*.yaml` < 环境变量(前缀 `MEDIASTATION_`)。 +配置加载优先级:**默认值** < `config.yaml` < `config/*.yaml` < **环境变量**(`MEDIASTATION_` 前缀) ### 常用环境变量 -| 变量 | 默认值 | 说明 | -|------|--------|------| +| 环境变量 | 默认值 | 说明 | +|----------|--------|------| | `MEDIASTATION_APP_PORT` | `8080` | HTTP 监听端口 | -| `MEDIASTATION_APP_DATA_DIR` | `./data` | 数据目录(数据库 / 缓存 / JWT 密钥) | -| `MEDIASTATION_APP_WEB_DIR` | `./web/dist` | 前端 SPA 静态文件目录 | -| `MEDIASTATION_DATABASE_DB_PATH` | `./data/mediastation.db` | SQLite 数据库文件路径 | +| `MEDIASTATION_APP_DATA_DIR` | `./data` | 数据目录(DB / 缓存 / JWT) | +| `MEDIASTATION_APP_WEB_DIR` | `./web/dist` | 前端 SPA 静态文件 | +| `MEDIASTATION_DATABASE_DB_PATH` | `./data/mediastation.db` | SQLite 数据库路径 | | `MEDIASTATION_SECRETS_JWT_SECRET` | *(自动生成)* | JWT 签名密钥 | -| `MEDIASTATION_SECRETS_TMDB_API_KEY` | *(空)* | 启用 TMDb 电影刮削 | -| `MEDIASTATION_SECRETS_BANGUMI_ACCESS_TOKEN` | *(空)* | 可选,提升 Bangumi 速率限制 | +| `MEDIASTATION_SECRETS_TMDB_API_KEY` | *(空)* | TMDb 刮削(必填) | +| `MEDIASTATION_SECRETS_BANGUMI_ACCESS_TOKEN` | *(空)* | Bangumi 速率提升 | | `MEDIASTATION_APP_CORS_ORIGINS` | *(空)* | 跨域白名单(JSON 数组) | | `ADMIN_INITIAL_PASSWORD` | `admin123` | 初始管理员密码 | -### 运行时设置(管理后台 → 设置) +### 运行时设置 -这些配置存储在 `settings` 表中,可通过管理 UI 编辑: +管理后台 → 系统设置,存储在 `settings` 表中: | 键 | 说明 | |----|------| | `qbittorrent.url` | qBittorrent Web UI 地址 | -| `qbittorrent.username` | qBittorrent 用户名 | -| `qbittorrent.password` | qBittorrent 密码 | -| `qbittorrent.savepath` | 可选,新种子默认保存路径 | +| `qbittorrent.username` | 用户名 | +| `qbittorrent.password` | 密码 | +| `qbittorrent.savepath` | 默认保存路径(可选) | -编辑后点击 **下载 → 重新加载配置**(或 `POST /api/downloads/reload`)使客户端重新读取。 +> 💡 修改后点击 **下载 → 重新加载配置** 或 `POST /api/downloads/reload`。 -完整配置模板请参见 [`config.example.yaml`](config.example.yaml)。 +📖 完整配置模板:[`config.example.yaml`](config.example.yaml) --- -## 项目结构 +## 🏗️ 项目结构 ``` MediaStationGo/ -├── cmd/server/main.go 应用入口 +├── cmd/server/main.go ← 应用入口 ├── internal/ -│ ├── config/ Viper 配置加载 -│ ├── database/ GORM + SQLite (WAL) 初始化 -│ ├── model/ GORM 数据模型 + AutoMigrate 注册 -│ ├── repository/ 数据访问层 -│ ├── service/ 业务逻辑 -│ │ ├── auth.go 登录 / 注册 / JWT / 管理员种子 +│ ├── config/ ← Viper 配置层 +│ ├── database/ ← GORM + SQLite (WAL) 初始化 +│ ├── model/ ← 数据模型 + AutoMigrate 注册 +│ ├── repository/ ← 数据访问层 +│ ├── service/ ← 业务逻辑(核心) +│ │ ├── auth.go 登录 / 注册 / JWT │ │ ├── media.go 媒体库 + 媒体 CRUD -│ │ ├── scanner.go 文件扫描 + ffprobe + 刮削触发 -│ │ ├── ffprobe.go ffprobe 封装 -│ │ ├── tmdb.go TMDb 数据源 -│ │ ├── bangumi.go Bangumi 数据源 -│ │ ├── scraper.go 刮削协调器 + 文件名清洗 -│ │ ├── site.go 站点管理(CRUD + 连接测试 + 跨站搜索) +│ │ ├── scanner.go 文件扫描 + ffprobe +│ │ ├── scraper.go 刮削调度 + 文件名清洗 +│ │ ├── tmdb.go / bangumi.go 第三方数据源 +│ │ ├── site.go 站点管理 CRUD + 跨站搜索 │ │ ├── site_adapter.go 6 种 PT 站点适配器 -│ │ ├── stream.go 直链播放 + HLS 分片 -│ │ ├── transcoder.go 媒体 HLS 转码管理 -│ │ ├── subtitle.go 外挂字幕识别 + WebVTT 转换 +│ │ ├── stream.go 直链 + HLS 播放 +│ │ ├── transcoder.go ffmpeg 转码作业管理 +│ │ ├── subtitle.go 外挂字幕 → WebVTT │ │ ├── image_proxy.go 图片代理缓存 │ │ ├── playback.go 播放历史 / 收藏 / 播放列表 │ │ ├── watcher.go fsnotify 文件监听 │ │ ├── qbittorrent.go qBittorrent API 客户端 -│ │ ├── downloads.go 下载管理 + WS 轮询 +│ │ ├── downloads.go 下载管理 │ │ ├── subscription.go RSS 订阅轮询 -│ │ ├── stats.go 仪表盘快照 -│ │ ├── profile.go 用户信息修改 +│ │ ├── organizer.go 媒体文件自动整理 +│ │ ├── stats.go 系统仪表盘 +│ │ ├── profile.go 用户信息 │ │ ├── audit.go 审计日志 -│ │ ├── ws_hub.go WebSocket 发布/订阅 -│ │ ├── organizer.go 媒体文件整理 -│ │ └── walk.go / episode_parser.go 辅助工具 -│ ├── middleware/ Gin 中间件 (CORS / JWT / admin) -│ └── handler/ HTTP 路由(按功能分文件) -├── web/ React 18 + Vite 前端 +│ │ └── ws_hub.go WebSocket 发布/订阅 +│ ├── middleware/ ← JWT / CORS / admin 中间件 +│ └── handler/ ← HTTP 路由(按功能拆分) +├── web/ ← React 18 + Vite + Tailwind CSS │ ├── src/api/ axios 接口封装 -│ ├── src/components/ Layout / MediaCard / GlobalEvents / RequireAuth / APIConfigsPanel +│ ├── src/components/ 通用组件(Card / Layout / APIConfigsPanel) │ ├── src/hooks/ useWebSocket 等 -│ ├── src/pages/ 首页 / 媒体库 / 搜索 / 播放器 / 下载 / 管理后台 / 站点管理 -│ ├── src/stores/ Zustand 状态管理 (auth) -│ └── src/types/ 前端类型定义(与 Go 模型对齐) -├── Dockerfile 多阶段、多架构构建 -├── docker-compose.yml NAS 友好部署配置 -├── Makefile build / dev / docker / test -├── config.example.yaml 完整配置模板 -└── .github/workflows/ CI + GHCR 发布 +│ ├── src/pages/ 首页 · 媒体库 · 搜索 · 播放器 · 下载 · 管理 · 站点 +│ ├── src/stores/ Zustand(auth) +│ └── src/types/ 前端类型定义 +├── Dockerfile ← 多阶段多架构构建 +├── docker-compose.yml ← NAS 一键部署 +├── Makefile ← build / dev / docker / test +├── config.example.yaml ← 完整配置模板 +└── .github/workflows/ ← CI + GHCR 发布 ``` --- -## 许可证 +## 🗺️ 路线图 -基于 [GNU GPL v3.0](LICENSE) 开源发布。 +| 特性 | 状态 | +|------|:---:| +| Jellyfin / Emby 双向兼容层 | 🔨 进行中 | +| DLNA / Chromecast 投屏 | 📋 计划中 | +| 在线字幕搜索 | 📋 计划中 | +| 多码率 ABR 转码 | 📋 计划中 | +| STRM 直链播放 (WebDAV / Alist / S3) | ✅ 已完成 | + +--- + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request!在提交 PR 之前请阅读 [贡献指南](CONTRIBUTING.md)。 + +--- + +## 📄 许可证 + +[GNU General Public License v3.0](LICENSE) + +> ⚠️ 许可证授权功能由独立服务器 [MediaStationLicenseServer](https://github.com/ShukeBta/MediaStationLicenseServer) 管理,本项目不内置授权/验权逻辑。 + +--- + +

+ Made with ❤️ by MediaStationGo Team +

diff --git a/README_EN.md b/README_EN.md index d65a03a..b09926d 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,225 +1,341 @@ -

🎬 MediaStationGo

- A Go rewrite of MediaStation — your private home media center. + + + +

+ +

A Go rewrite of MediaStation

+
Lightweight · Fast · Single Binary · NAS Ready
+

- 中文 + Chinese

- Go - React - TypeScript - SQLite - Docker - License + Go + React + TypeScript + SQLite + Docker + GPL v3

--- -## Why a rewrite? - -The original MediaStation is a Python/FastAPI + Vue project. **MediaStationGo** is a from-scratch reimplementation that adopts a lighter, single-binary deployment model: - -- **Backend**: Go 1.25 + Gin + GORM + SQLite (WAL mode). -- **Frontend**: React 18 + Vite + Tailwind CSS + Zustand. -- **Distribution**: ~30 MB static binary (CGO disabled), or a multi-arch Alpine Docker image. - -The goal is to keep the user-facing feature surface familiar (libraries, scanning, scraping, direct play/HLS, multi-user, downloads, RSS) while making deployment painless on NAS hardware. +

+ 📖 Why +  ·  + 🚀 Quick Start +  ·  + ✨ Features +  ·  + 🏗️ Layout +  ·  + ⚙️ Config +  ·  + 🗺️ Roadmap +

--- -## Features +## 🤔 Why MediaStationGo? -### Authentication & Users -- ✅ JWT auth with admin/user roles -- ✅ First-run admin seeding (`admin / admin123`, override via `ADMIN_INITIAL_PASSWORD`) -- ✅ Profile page (email / avatar / change password) -- ✅ Admin user table with role promotion / demotion -- ✅ Audit log for sensitive actions (login, library CRUD, downloads, etc.) +> MediaStationGo is a from-scratch Go rewrite of [MediaStation](https://github.com/ShukeBta/MediaStation) — same full-featured media center experience, radically simpler deployment. -### Library Management -- ✅ Library CRUD + recursive filesystem scan -- ✅ ffprobe metadata extraction (duration / resolution / codecs / container) -- ✅ Smart filename cleaning with year + season/episode parsing -- ✅ Multi-provider scrape chain by library type: - - movie → TMDb (with optional Fanart.tv high-res poster upgrade) - - tv → TheTVDB (fallback TMDb) - - anime → Bangumi (fallback TMDb) -- ✅ Image proxy with disk cache (TMDb / Bangumi / Douban / Fanart / TheTVDB) -- ✅ TV / anime libraries grouped by season with episode listing -- ✅ fsnotify-based filesystem watcher with 5 s coalescing debouncer + + + + + +
-### Playback -- ✅ Direct-play streaming with HTTP `Range` support -- ✅ HLS on-demand transcoding (single ffmpeg job per media) -- ✅ External subtitle discovery (.srt / .vtt / .ass / .ssa) with on-the-fly WebVTT conversion -- ✅ Resume position written every 10 s + Continue Watching row on home -- ✅ Favourites (toggle) + ordered Playlists (CRUD) +### Original MediaStation +- 🐍 Python / FastAPI + Vue +- 📦 Requires Python runtime & virtualenv +- 🐳 Docker mandatory or complex Python setup +- 📊 Deployment footprint > 500 MB +- 🔧 pip + npm dual build chains -### PT Site Management -- ✅ Site configuration CRUD -- ✅ 6 PT site types: nexusphp / gazelle / unit3d / mteam / discuz / custom_rss -- ✅ 3 auth methods: Cookie / API Key / Auth Header -- ✅ Site connection testing -- ✅ Cross-site torrent search -- ✅ Extended config via Extra JSON (User-Agent / RSS URL / timeout / priority / proxy / downloader) + -### Automation -- ✅ qBittorrent download integration (add / list / delete via Web UI API) -- ✅ RSS subscriptions with regex filters, GUID dedup and 10-minute polling -- ✅ Automatic media file organization (move / copy / hardlink / symlink) +### MediaStationGo ✨ +- 🚀 Go 1.25 + React 18 +- 📦 **Single static binary** (~30 MB) +- 🐳 Docker optional — runs natively bare-metal +- 🔥 Zero external dependencies (CGO off) +- ⚡ One-command build: `go build` -### Operations -- ✅ Real-time scan / scrape / transcode / download / subscription events over WebSocket -- ✅ Dashboard at `/stats` (CPU / memory / disk / library counts / Goroutines) -- ✅ Real-time tasks panel at `/tasks` (active ffmpeg jobs + qBittorrent torrents) -- ✅ NFO export (Kodi / Jellyfin compatibility) — single media or whole library -- ✅ Hardware-accel encoder profiles: Software / NVENC / Intel QSV / VAAPI -- ✅ Single-binary build, multi-arch Docker image, GitHub Actions CI + GHCR publish +
-### Discovery & AI -- ✅ TMDb Discover — trending + popular rails on homepage -- ✅ AI smart search (OpenAI-compatible) — natural-language queries → structured intent -- ✅ AI recommendations seeded from your watch history (`GET /api/ai/recommend`) - -### Frontend -- ✅ React SPA with code-splitting: Login / Home / Library / Search / Favourites / Playlists / - Media detail / Player (HLS + direct + subtitles) / Profile / Downloads / Subscriptions / - Stats / Admin / Site Management / API Config -- ✅ Global toast notifications driven by the WebSocket hub -- ✅ Initial bundle ~250 KB / 83 KB gzipped (hls.js loaded only on first HLS playback) - -### Roadmap - -| Feature | Status | -|---------|--------| -| Bidirectional Jellyfin / Emby compatibility layer | ⏳ | -| DLNA / Chromecast | ⏳ | -| Online subtitle search providers | ⏳ | -| Multi-bitrate ABR transcode profiles | ⏳ | +| Metric | Original | MediaStationGo | +|--------|:---:|:---:| +| Binary size | — | ≈ 30 MB | +| Memory (idle) | ~200 MB | ~30 MB | +| Cold start | ~3s | ~0.3s | +| Deploy steps | 5+ | 1 | +| Frontend (gzip) | ~250 KB | ~83 KB | --- -## Quick Start +## ✨ Features -### Docker +
+🔐 Authentication & Users +
+ +| Feature | Description | +|---------|-------------| +| JWT dual-role auth | admin / user with refresh token support | +| One-click admin bootstrap | Auto-seeded `admin` / `admin123` on first run | +| Profile management | Email, avatar, password change | +| User admin panel | Role promotion / demotion, enable / disable | +| Audit log | Login, library ops, downloads — all tracked | + +
+ +
+📚 Library Management +
+ +| Feature | Description | +|---------|-------------| +| Library CRUD | movie / tv / anime / music types supported | +| Recursive scanning | Filesystem walk + ffprobe metadata extraction | +| Smart filename parsing | Year + season/episode auto-detection | +| Multi-source scraping | TMDb → TheTVDB → Bangumi chain | +| HD poster upgrade | Optional Fanart.tv high-res fallback | +| Image proxy | TMDb / Bangumi / Douban / Fanart with disk cache | +| TV grouping | Season grouping with episode listing | +| Live fs watching | fsnotify-powered, 5-second coalesced debounce | + +
+ +
+🎬 Playback +
+ +| Feature | Description | +|---------|-------------| +| Direct streaming | HTTP Range support for instant seeking | +| HLS on-demand | Per-media ffmpeg job with HW acceleration | +| External subtitles | .srt / .vtt / .ass / .ssa → real-time WebVTT | +| Resume playback | Auto-saved every 10s + Continue Watching on home | +| Favorites & playlists | One-tap toggle / ordered playlists (CRUD) | + +
+ +
+🌐 PT Site Management +
+ +| Feature | Description | +|---------|-------------| +| 6 site types | nexusphp · gazelle · unit3d · mteam · discuz · custom_rss | +| 3 auth methods | Cookie / API Key / Auth Header | +| Site config | Full CRUD + connection test + enable toggle | +| Cross-site search | One-click search across all configured trackers | +| Extended config | Extra JSON: UA / RSS URL / timeout / priority / proxy / downloader | + +
+ +
+🤖 Automation +
+ +| Feature | Description | +|---------|-------------| +| Download client | qBittorrent Web UI API (add / list / delete) | +| RSS subscriptions | Regex filter + GUID dedup + 10-min polling | +| File organizer | Auto-categorize downloads: move / copy / hardlink / symlink | + +
+ +
+📊 Operations & Monitoring +
+ +| Feature | Description | +|---------|-------------| +| Live events | WebSocket push for scan / scrape / transcode / download / subscribe | +| Dashboard | CPU / Memory / Disk / Library counts / Goroutines | +| Task panel | Real-time ffmpeg jobs + qBittorrent torrents | +| NFO export | Kodi / Jellyfin compatible — single media or whole library | +| HW acceleration | Software / NVENC / Intel QSV / VAAPI encoder profiles | +| CI/CD | GitHub Actions + multi-arch GHCR release | + +
+ +
+🧠 AI & Discovery +
+ +| Feature | Description | +|---------|-------------| +| TMDb Discover | Trending / popular rails on homepage | +| AI smart search | OpenAI-compatible → natural language → structured query | +| AI recommendations | Personalized picks from your watch history | + +
+ +--- + +## 🚀 Quick Start + +### 🐳 Docker (Recommended) ```bash git clone https://github.com/ShukeBta/MediaStationGo.git cd MediaStationGo -# (optional) edit docker-compose.yml to mount your media root at /media +# Edit docker-compose.yml to mount your media at /media docker compose up -d ``` -Open and log in with `admin / admin123`. +> 🌐 Open and log in with `admin` / `admin123`. -### Bare Metal +### 💻 Bare Metal + +| Prerequisite | Version | +|-------------|---------| +| Go | ≥ 1.25 | +| Node.js | ≥ 20 | +| FFmpeg | Any | ```bash -# requirements: Go 1.25+, Node 20+, ffmpeg -make build # produces bin/mediastation-go and web/dist +git clone https://github.com/ShukeBta/MediaStationGo.git +cd MediaStationGo + +# Build backend + frontend +make build + +# Start the server ./bin/mediastation-go ``` -### Local Development +### 🛠️ Local Development ```bash -make dev # backend on :8080, MEDIASTATION_APP_DEBUG=true -make dev-web # vite dev server on :3000, proxies /api -> :8080 +# Terminal 1: Go backend (port 8080, DEBUG mode) +make dev + +# Terminal 2: Vite frontend (port 3000, proxies API calls) +make dev-web ``` --- -## Configuration +## ⚙️ Configuration -Configuration is layered — defaults < `config.yaml` < `config/*.yaml` < environment variables prefixed with `MEDIASTATION_`. +Config precedence: **defaults** < `config.yaml` < `config/*.yaml` < **env vars** (prefix `MEDIASTATION_`) -### Most-Used Keys +### Key Environment Variables -| Key | Default | Purpose | -|-----|---------|---------| +| Variable | Default | Purpose | +|----------|---------|---------| | `MEDIASTATION_APP_PORT` | `8080` | HTTP listen port | -| `MEDIASTATION_APP_DATA_DIR` | `./data` | DB / cache / JWT secret root | -| `MEDIASTATION_APP_WEB_DIR` | `./web/dist` | SPA bundle to serve | -| `MEDIASTATION_DATABASE_DB_PATH` | `./data/mediastation.db` | SQLite file | +| `MEDIASTATION_APP_DATA_DIR` | `./data` | Data root (DB / cache / JWT) | +| `MEDIASTATION_APP_WEB_DIR` | `./web/dist` | SPA bundle directory | +| `MEDIASTATION_DATABASE_DB_PATH` | `./data/mediastation.db` | SQLite file path | | `MEDIASTATION_SECRETS_JWT_SECRET` | *(auto)* | JWT signing key | -| `MEDIASTATION_SECRETS_TMDB_API_KEY` | *(empty)* | Enables movie scraping | -| `MEDIASTATION_SECRETS_BANGUMI_ACCESS_TOKEN` | *(empty)* | Optional, raises Bangumi rate limit | -| `MEDIASTATION_APP_CORS_ORIGINS` | *(empty)* | Allow-list, JSON array | -| `ADMIN_INITIAL_PASSWORD` | `admin123` | Bootstrap admin password | +| `MEDIASTATION_SECRETS_TMDB_API_KEY` | *(empty)* | TMDb scraping (required) | +| `MEDIASTATION_SECRETS_BANGUMI_ACCESS_TOKEN` | *(empty)* | Bangumi rate limit boost | +| `MEDIASTATION_APP_CORS_ORIGINS` | *(empty)* | Allow-list (JSON array) | +| `ADMIN_INITIAL_PASSWORD` | `admin123` | Initial admin password | -### Runtime Settings (Admin → Settings) +### Runtime Settings -These live in the `settings` table and can be edited from the admin UI: +Admin panel → Settings tab, stored in the `settings` table: | Key | Purpose | |-----|---------| -| `qbittorrent.url` | qBittorrent Web UI base URL | -| `qbittorrent.username` | qBittorrent user | -| `qbittorrent.password` | qBittorrent password | -| `qbittorrent.savepath` | Optional default save path for new torrents | +| `qbittorrent.url` | qBittorrent Web UI URL | +| `qbittorrent.username` | Username | +| `qbittorrent.password` | Password | +| `qbittorrent.savepath` | Default save path (optional) | -After editing, hit **Downloads → Reload Config** (or `POST /api/downloads/reload`) so the qBittorrent client picks up the new credentials. +> 💡 After editing, hit **Downloads → Reload Config** or `POST /api/downloads/reload`. -See [`config.example.yaml`](config.example.yaml) for the full surface. +📖 Full config template: [`config.example.yaml`](config.example.yaml) --- -## Project Layout +## 🏗️ Project Layout ``` MediaStationGo/ -├── cmd/server/main.go Application entry point +├── cmd/server/main.go ← Entry point ├── internal/ -│ ├── config/ Viper-based config loader -│ ├── database/ GORM + SQLite (WAL) bootstrap -│ ├── model/ GORM data models + AutoMigrate registry -│ ├── repository/ Thin data-access layer -│ ├── service/ Business logic -│ │ ├── auth.go login / register / JWT / seed admin +│ ├── config/ ← Viper configuration layer +│ ├── database/ ← GORM + SQLite (WAL) bootstrap +│ ├── model/ ← Data models + AutoMigrate registry +│ ├── repository/ ← Data access layer +│ ├── service/ ← Business logic (core) +│ │ ├── auth.go login / register / JWT │ │ ├── media.go library + media CRUD -│ │ ├── scanner.go fs walker + ffprobe + scrape kick -│ │ ├── ffprobe.go ffprobe wrapper -│ │ ├── tmdb.go TMDb provider -│ │ ├── bangumi.go Bangumi provider -│ │ ├── scraper.go orchestrator + filename cleaner -│ │ ├── site.go PT site CRUD + connection test + cross-site search -│ │ ├── site_adapter.go 6 PT site type adapters -│ │ ├── stream.go direct play + HLS playlist / segment -│ │ ├── transcoder.go per-media ffmpeg HLS job manager -│ │ ├── subtitle.go external subtitle discovery + .vtt conversion -│ │ ├── image_proxy.go cached, allow-listed image proxy -│ │ ├── playback.go history / favourites / playlists +│ │ ├── scanner.go filesystem walker + ffprobe +│ │ ├── scraper.go scrape orchestrator + filename cleaner +│ │ ├── tmdb.go / bangumi.go third-party providers +│ │ ├── site.go site CRUD + cross-site search +│ │ ├── site_adapter.go 6 PT site adapters +│ │ ├── stream.go direct play + HLS +│ │ ├── transcoder.go per-media ffmpeg job manager +│ │ ├── subtitle.go external subs → WebVTT +│ │ ├── image_proxy.go cached image proxy +│ │ ├── playback.go history / favorites / playlists │ │ ├── watcher.go fsnotify debouncer │ │ ├── qbittorrent.go qBittorrent v2 API client -│ │ ├── downloads.go download orchestrator + WS poller +│ │ ├── downloads.go download orchestrator │ │ ├── subscription.go RSS poller -│ │ ├── stats.go dashboard snapshot -│ │ ├── profile.go non-credential user mutations -│ │ ├── audit.go audit log writer │ │ ├── organizer.go media file organizer -│ │ ├── ws_hub.go pub/sub broker for the WS -│ │ └── walk.go / episode_parser.go helpers -│ ├── middleware/ Gin middleware (CORS / JWT / admin) -│ └── handler/ HTTP route definitions (one file per concern) -├── web/ React 18 + Vite SPA -│ ├── src/api/ axios helpers (one per service) -│ ├── src/components/ Layout, MediaCard, GlobalEvents, RequireAuth, APIConfigsPanel -│ ├── src/hooks/ useWebSocket, … -│ ├── src/pages/ Home / Library / Search / Player / Downloads / Admin / Sites +│ │ ├── stats.go dashboard snapshot +│ │ ├── profile.go user profile mutations +│ │ ├── audit.go audit log writer +│ │ └── ws_hub.go WebSocket pub/sub broker +│ ├── middleware/ ← JWT / CORS / admin middleware +│ └── handler/ ← HTTP route definitions (by concern) +├── web/ ← React 18 + Vite + Tailwind CSS +│ ├── src/api/ axios service wrappers +│ ├── src/components/ Card / Layout / APIConfigsPanel / etc. +│ ├── src/hooks/ useWebSocket & friends +│ ├── src/pages/ Home · Library · Search · Player · Downloads · Admin · Sites │ ├── src/stores/ Zustand (auth) -│ └── src/types/ Domain types mirrored from Go -├── Dockerfile Multi-stage, multi-arch build -├── docker-compose.yml NAS-friendly deployment -├── Makefile build / dev / docker / test -├── config.example.yaml Full configuration template -└── .github/workflows/ CI + GHCR publish +│ └── src/types/ TypeScript domain types +├── Dockerfile ← Multi-stage, multi-arch build +├── docker-compose.yml ← NAS-friendly one-command deploy +├── Makefile ← build / dev / docker / test +├── config.example.yaml ← Full configuration reference +└── .github/workflows/ ← CI + GHCR publish ``` --- -## License +## 🗺️ Roadmap -Released under the [GNU GPL v3.0](LICENSE). +| Feature | Status | +|---------|:---:| +| Jellyfin / Emby compatibility layer | 🔨 In Progress | +| DLNA / Chromecast casting | 📋 Planned | +| Online subtitle search providers | 📋 Planned | +| Multi-bitrate ABR transcode | 📋 Planned | +| STRM direct streaming (WebDAV / Alist / S3) | ✅ Complete | + +--- + +## 🤝 Contributing + +Issues and PRs are welcome! Please read the [Contribution Guidelines](CONTRIBUTING.md) before submitting. + +--- + +## 📄 License + +[GNU General Public License v3.0](LICENSE) + +> ⚠️ License activation/validation is handled by a separate server: [MediaStationLicenseServer](https://github.com/ShukeBta/MediaStationLicenseServer). This project contains no license generation or validation logic. + +--- + +

+ Made with ❤️ by MediaStationGo Team +