本期来介绍一个开源的一站式影视媒体库:MediaStationGo,简称 MGO。
笔者目前用的是MP,据本项目作者叙述,MGO与MP的最主要差异:
MP需要额外安装emby等服务配合播放,MGO只需要配合QB下载就可以在第三方播放器中实现登录观看。
如果你在MP部署使用过程中有诸多阻碍,无论是本地还是网盘资源,那不妨来试试这个项目。

项目介绍
完整项目名:ShukeBta/MediaStationGo,可于GitHub搜索。
MediaStationGo 是一个自托管媒体管理系统,面向 NAS、小主机、家庭影音和多用户共享场景。它把媒体库、刮削、下载整理、订阅、网盘播放、Emby 协议兼容、用户权限和 Bot 通知放在一个后台里,目标是让用户只维护一套服务,就能给网页端、手机端、电视端和第三方播放器使用,无需部署Emby服务端。
项目特点
-
媒体库管理:电影、电视剧、动漫、综艺、音乐和自定义媒体库统一管理。
-
Emby 协议兼容:Infuse、VidHub、SenPlayer、Fileball 等客户端可按 Emby/Jellyfin 方式添加服务器。
-
本地 + 网盘:支持本地硬盘、下载目录、OpenList、CloudDrive2、WebDAV、STRMURL 和 302 反代播放。
-
订阅下载入库:连接 qBittorrent 后支持搜索、订阅、下载完成整理、刮削和入库通知。
-
多用户与权限:管理员/普通用户、有效期、成人内容开关、设备管理、注册码和 TGBot 绑定。
-
三挡部署:按规模选择 PostgreSQL、Redis、OpenSearch,低配 NAS 到大库检索都能覆盖。
部署流程
以威联通NAS为例,通过Docker Compose的方式进行部署。
需要注意的是,本文介绍的是完整部署方式,也就是下图所示的第三档。如果你对于设备性能不自信,可选择第一档的默认推荐部署方式,资源占用最低且适合绝大多数NAS。三个档的docker-compose.yml点我获取。

部署代码如下:
services:
mediastation-go:
image: ghcr.io/shukebta/mediastation-go:latest
container_name: mediastation-go
restart: unless-stopped
init: true
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
opensearch:
condition: service_healthy
ports:
- "18080:8080"
volumes:
- /share/Container/MediaStationGo/data:/data
- /share/Container/MediaStationGo/cache:/cache
- /share/Multimedia:/media
- /share/Download:/downloads
environment:
TZ: Asia/Shanghai
PUID: "1000"
PGID: "1000"
MEDIASTATION_APP_HOST: 0.0.0.0
MEDIASTATION_APP_PORT: 8080
MEDIASTATION_APP_WEB_DIR: /app/web/dist
MEDIASTATION_APP_DATA_DIR: /data
MEDIASTATION_LOGGING_LEVEL: warn
MEDIASTATION_LOGGING_FORMAT: console
MEDIASTATION_LOGGING_OUTPUT_PATH: /data/logs
MEDIASTATION_DATABASE_TYPE: postgres
MEDIASTATION_DATABASE_DSN: postgres://mediastation:mediastation@postgres:5432/mediastation?sslmode=disable
MEDIASTATION_CACHE_CACHE_DIR: /cache
MEDIASTATION_CACHE_REDIS_URL: redis://redis:6379/0
MEDIASTATION_SEARCH_BACKEND: opensearch
MEDIASTATION_SEARCH_OPENSEARCH_URL: http://opensearch:9200
MEDIASTATION_SEARCH_INDEX: mediastation_media
MEDIASTATION_MEDIA_DIR: /share/Multimedia
MEDIASTATION_MEDIA_CONTAINER_DIR: /media
MEDIASTATION_DOWNLOAD_DIR: /share/Download
MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /downloads
MEDIASTATION_TRANSCODER_ENABLED: "true"
MEDIASTATION_TRANSCODER_HARDWARE_ACCEL: "false"
MEDIASTATION_TRANSCODER_REALTIME: "true"
MEDIASTATION_TRANSCODER_THREADS: "2"
MEDIASTATION_TRANSCODER_MAX_CONCURRENT: "1"
MEDIASTATION_TRANSCODER_IDLE_TIMEOUT_SECONDS: "120"
networks:
- mediastation_net
healthcheck:
test: ["CMD-SHELL", "busybox wget -qO- http://127.0.0.1:8080/api/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
postgres:
image: postgres:16-alpine
container_name: mediastation-postgres
restart: unless-stopped
environment:
POSTGRES_DB: mediastation
POSTGRES_USER: mediastation
POSTGRES_PASSWORD: mediastation
TZ: Asia/Shanghai
volumes:
- /share/Container/MediaStationGo/postgres:/var/lib/postgresql/data
networks:
- mediastation_net
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mediastation -d mediastation"]
interval: 10s
timeout: 5s
retries: 10
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
redis:
image: redis:7-alpine
container_name: mediastation-redis
restart: unless-stopped
command:
- redis-server
- --appendonly
- "yes"
- --maxmemory
- 256mb
- --maxmemory-policy
- allkeys-lru
volumes:
- /share/Container/MediaStationGo/redis:/data
networks:
- mediastation_net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
opensearch:
image: opensearchproject/opensearch:2
container_name: mediastation-opensearch
restart: unless-stopped
environment:
discovery.type: single-node
plugins.security.disabled: "true"
DISABLE_INSTALL_DEMO_CONFIG: "true"
bootstrap.memory_lock: "false"
OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- /share/Container/MediaStationGo/opensearch:/usr/share/opensearch/data
networks:
- mediastation_net
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:9200 >/dev/null || exit 1"]
interval: 20s
timeout: 10s
retries: 15
start_period: 90s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
mediastation_net:
external: true
打开威联通的Container Station创建新的应用程序。

部署完毕后,你在该应用下,会得到如图4个容器。

配置一览
在浏览器界面输入NAS_IP:10080即可访问服务,默认账户/密码:admin/admin123。

因为这台机器啥也没有,所以界面为空,可以直接点击「前往管理后台」。

如下图,我的个人习惯一般是先配置下载器,点击「下载器管理」。

点击右上角「添加下载器」。

命名随意。类型按需求选择,我个人喜欢用QB。URL这个部分要注意,其他平台我不是太清楚,威联通如果不是像上面那样多个容器统一部署到一个应用内,网络一般是不能互通的。因此要更新你的QB部署代码,让QB加入MGO网络,在原本的yml中加入部分内容。假设MGO的网络为mediastation_net,大概如下:
services:
qbittorrent:
······
networks:
mediastation_net:
aliases:
- qbittorrent
networks:
mediastation_net:
external: true
因此URL的内容可如下图填写(name:port),当然写成QB当前的局域网访问地址也是没问题的。

填写完毕后进行测试,可以右上角的看到成功标志。

其实大部分配置项,以前玩过Nastool朋友,应该都会很熟悉。
再就是站点管理,比较常用的站都可以添加认证。配置这个主要用于站点搜索,订阅、自动抓取、自动下载这个我用不上,因此就不配置RSS。

馒头比较特殊,本想拿AGCV来测试,但作者目前并没适配这个站点。操作步骤嘛,其实就是正常的填入网址和cookie保存即可。

题外:你的站到底选啥,可以到站点的首页直接拉到最底下查看(会有大字标注),如果没有,则到 FAQ 页面查看,站长一般都会提供说明。NexusPHP 应该会占不小的比例。

最后没法子,还是用馒头吧。。。

跨站点搜索,能搜索出站点的内容,但是MGO这边的部分显示有点问题。

点击下载,会自动添加种子文件到QB自动下载。如下图也可以看到,下载目录是/downloads/外语电影自动分类上了的。不过这个自动归类,也是存在些许问题。

MT这边也是成功做上了。

接着,我们添加媒体库目录。因为文章开头的项目特性介绍过,以及上面的演示测试,我们可以直接用QB的/downloads,所以如下图填写。

添加媒体库后,便可扫描刮削,如果不满意,也支持手动调整。


可以添加很多平台的API,辅助刮削之类。

不过在我看来,最好的也是最经典的整理方式,还是通过硬链接自动整理入库。不过这里要注意的是,硬链接不支持跨共享文件夹~也就是说,你在部署时,需要调整映射文件目录,也就是 MGO 的媒体目录要和 QB 下载目录放一起。大概结构如下:
/share/Media/downloads
/share/Media/library/电影/外语电影
/share/Media/library/电影/国语电影
限于篇幅问题,大家可以参考前辈们过去的 NASTool 相关教程。

最后是网盘挂载,以及STRM支持。
个人建议自己轻易别整理,直接用大佬们分享的整理好的资源一键转存。
作者推荐把网盘等挂载到 OpenList、CloudDrive2 或 Alist 后,在这里选择 OpenList / CloudDrive2 / Alist转存。

因为我不太用网盘,所以直接挂上夸克咱们一起来看看效果。保存cookie,连通后,便会自动显示网盘文件夹。如果你一键转存别人整理好的,那几乎不用担心。但如果像我下图这种,建议还是提前规范命名,分门别类、一条一套的导入,用「自动识别」、「一键导入」识别错误反而会浪费更多时间。

能刮削成功,但是海报墙这里显示的是上级文件夹的名字。

还需要微调。


用infuse连接的话,大概率是因为网盘速率问题,导致并不能很好显示,本地的两部资源就没问题。Vidhub那边表现倒是好不少。

最后
项目仍然是在起步阶段,很多功能需要优化和完善,不过基础使用倒也差不多了。
感谢观看,本文完。
评论区