A self-hosted movie and TV resource automation system that brings recommendation browsing, resource search, subscription tracking, automatic downloading, file organization, and metadata scraping together in one place.
Inspired by MoviePilot, rewritten in Go + React, in pursuit of lightweight, high performance and zero external dependencies.
| Module | Features |
|---|---|
| Discovery | 13 built-in recommendation sources including TMDB popular/trending, Douban on-air/upcoming/Top250/weekly word-of-mouth, and the Bangumi calendar, with multi-dimensional filtering by genre / language / rating / year |
| Resource Search | Parallel multi-site search with real-time results streamed over SSE, exact search by TMDB/Douban/Bangumi/IMDB ID, and 14 built-in site parsers |
| Subtitle Search | A dedicated subtitle search channel, supporting Chinese / English / Japanese / Korean and bilingual subtitle detection |
| Subscription Management | Three modes — RSS / search / mixed — best-version upgrade tracking episode by episode, plus a subscription sharing marketplace (share / follow / fork) |
| Automatic Download | Supports qBittorrent, Transmission and custom HTTP downloaders (rTorrent, etc.), with torrent file selection, sequential download and seeding limits |
| Media Organization | Background queue with real-time SSE progress, four modes — copy / move / hardlink / softlink — smart episode-number format recognition, and AI retry on failure |
| File Management | Directory browsing, smart (media-aware) renaming, move/copy/delete, and storage usage statistics |
| Site Management | 20+ built-in indexers, CookieCloud sync, site user data (upload / download / ratio / bonus), and site resource browsing |
| Metadata Scraping | Automatic NFO generation plus poster/backdrop downloads, from both TMDB and Douban |
| Calendar View | A monthly calendar showing air dates of subscribed episodes, with available / missing / completed status markers |
| Notification System | Telegram / WeCom (Enterprise WeChat) / Webhook notification channels, with configurable templates |
| Scheduled Tasks | 5 automation jobs: subscription refresh, download check, directory scan, site data sync, and data maintenance |
| AI Recommendations | Integrates OpenAI to intelligently rank and recommend search results |
| Overseerr Integration | Native support for Overseerr / Jellyseerr webhooks to create subscriptions automatically |
| Recommendations | Search |
|---|---|
![]() |
![]() |
| Subscriptions | Calendar |
|---|---|
![]() |
![]() |
| Downloaders | Media Organization |
|---|---|
![]() |
![]() |
| File Management | System Settings |
|---|---|
![]() |
![]() |
Backend — Go 1.22+, zero external dependencies (pure standard library)
net/httpHTTP server- JSON file KV store (atomic writes)
- In-process event bus (async/sync pub/sub)
- Goroutine worker pool
Frontend — React 19 + TypeScript 5.9 + Ant Design 6
- Vite 8 build
- React Router v7
- SSE real-time data streams
- Go 1.22+
- Node.js 18+ (only for building the frontend)
# Build the frontend
cd web
npm install
npm run build
# Build the backend
cd ..
go build -o openmovie ./cmd/server./openmovieListens on :8090 by default; just visit http://localhost:8090.
| Variable | Default | Description |
|---|---|---|
OPENMOVIE_ADDR |
:8090 |
HTTP listen address |
OPENMOVIE_DATA_DIR |
data |
Data storage directory |
# Terminal 1: start the backend
OPENMOVIE_DATA_DIR=data-dev go run ./cmd/server
# Terminal 2: start the frontend (automatically proxies the API to the backend)
cd web
npm run devThe frontend dev server runs at http://localhost:5173 and automatically proxies /api requests to the backend on :8090.
To specify the backend address:
OPENMOVIE_API=http://192.168.1.100:8090 npm run devOpenMovie/
├── cmd/server/main.go # Entry point
├── internal/
│ ├── api/server.go # HTTP routes + middleware
│ ├── domain/models.go # Domain models (50+ types)
│ ├── event/bus.go # Event bus
│ ├── module/ # External module integrations
│ │ ├── downloader.go # qBittorrent / Transmission / HTTP downloaders
│ │ ├── media_source.go # TMDB / Douban / Bangumi APIs
│ │ ├── site.go # Site search + parsing
│ │ ├── site_access.go # CookieCloud / site authentication
│ │ └── site_indexer.go # Built-in indexer definitions
│ ├── repository/store.go # JSON KV store
│ └── usecase/service.go # Business logic orchestration
├── web/ # React frontend
│ ├── src/
│ │ ├── App.tsx # Main app (routes + pages)
│ │ ├── types.ts # TypeScript type definitions
│ │ └── index.css # Global styles
│ └── package.json
├── data-dev/ # Development seed data
│ ├── store/settings.json # Example settings
│ ├── store/sites.json # Example sites
│ ├── downloads/ # Download directory
│ └── library/ # Media library directory
└── docs/screenshots/ # Screenshots
After the first run, configure everything through the "System Settings" page in the web UI. Main configuration items:
Directory configuration
downloadRoots— list of download directorieslibraryRoots— list of media library directoriesdirectoryPairs— directory pairs (download → media library mapping, supports specifying the transfer mode and storage type)
Site configuration
sites— site list (name, address, cookie, proxy, browser emulation, etc.)siteCookieCloudIntervalMinutes— CookieCloud auto-sync interval
Subscription configuration
subscribeMode— subscription mode:rss/search/mixedsubscribeRefreshMinutes— subscription refresh intervalsubscribeBestVersionRules— best-version upgrade rules
Search configuration
searchIndexerSites— indexer sites used for searchingsearchResourcePages— number of pages per search
Rename formats
movieRenameFormat— movie rename format, e.g.{title} ({year})/{title} ({year})tvRenameFormat— TV rename format, e.g.{title}/Season {season2}/{title} S{season2}E{episode2}
Security
apiToken— API access tokensecurityAllowLan— whether to allow LAN access
Proxy
proxyUrl— global HTTP proxy address
All API endpoints live under /api/v1/ and require Authorization: Bearer <token> or X-API-Token: <token> in the request headers.
Main endpoints:
GET /api/v1/recommend # Recommendations
GET /api/v1/search # Resource search
GET /api/v1/search/stream # SSE streaming search
GET /api/v1/subscribes # Subscription list
POST /api/v1/subscribes # Create subscription
GET /api/v1/calendar # Calendar
GET /api/v1/downloads # Download tasks
POST /api/v1/downloads # Add download
GET /api/v1/transfers/queue # Transfer queue
GET /api/v1/transfers/events # SSE transfer events
GET /api/v1/sites # Site list
GET /api/v1/files/list # File list
GET /api/v1/settings # System settings
GET /api/v1/automation/jobs # Scheduled jobs
GET /api/v1/notifications # Notification list
GET /api/v1/health # Health check
- MoviePilot — the original project
- TMDB — movie and TV metadata
- Douban — Chinese movie and TV data
- Bangumi — anime data
一个自托管的影视资源自动化管理系统,集推荐浏览、资源搜索、订阅追踪、自动下载、文件整理、元数据刮削于一体。
灵感来源于 MoviePilot,使用 Go + React 重写,追求轻量、高性能、零外部依赖。
| 模块 | 功能 |
|---|---|
| 推荐浏览 | TMDB 热门/趋势、豆瓣热播/即将上映/Top250/一周口碑、Bangumi 日历等 13 个内置推荐源,支持类型/语言/评分/年代多维筛选 |
| 资源搜索 | 多站点并行搜索 + SSE 实时流式返回,支持 TMDB/Douban/Bangumi/IMDB ID 精确搜索,内置 14 种站点解析器 |
| 字幕搜索 | 独立字幕搜索通道,支持中/英/日/韩/双语字幕检测 |
| 订阅管理 | RSS / 搜索 / 混合三种模式,最佳版本逐集升级追踪,订阅分享市场(share / follow / fork) |
| 自动下载 | 支持 qBittorrent、Transmission、自定义 HTTP 下载器(rTorrent 等),种子文件选择、顺序下载、做种限制 |
| 媒体整理 | 后台队列 + SSE 实时进度,copy / move / hardlink / softlink 四种模式,智能集数格式识别,失败 AI 重试 |
| 文件管理 | 目录浏览、智能重命名(媒体感知)、移动/复制/删除,存储用量统计 |
| 站点管理 | 20+ 内置索引器,CookieCloud 同步,站点用户数据(上传/下载/比率/魔力),站点资源浏览 |
| 元数据刮削 | 自动 NFO 生成 + 海报/背景图下载,TMDB / 豆瓣双源 |
| 日历视图 | 月度日历展示订阅剧集播出时间,已有/缺失/已完成状态标记 |
| 通知系统 | Telegram / 企业微信 / Webhook 通知渠道,可配置模板 |
| 定时任务 | 订阅刷新、下载检查、目录扫描、站点数据同步、数据维护 5 个自动化任务 |
| AI 推荐 | 接入 OpenAI 对搜索结果智能排序推荐 |
| Overseerr 集成 | 原生支持 Overseerr / Jellyseerr Webhook 自动创建订阅 |
| 推荐 | 搜索 |
|---|---|
![]() |
![]() |
| 订阅 | 日历 |
|---|---|
![]() |
![]() |
| 下载器 | 媒体整理 |
|---|---|
![]() |
![]() |
| 文件管理 | 系统设置 |
|---|---|
![]() |
![]() |
后端 — Go 1.22+,零外部依赖(纯标准库)
net/httpHTTP 服务器- JSON 文件 KV 存储(原子写入)
- 进程内事件总线(async/sync pub/sub)
- Goroutine 工作池
前端 — React 19 + TypeScript 5.9 + Ant Design 6
- Vite 8 构建
- React Router v7
- SSE 实时数据流
- Go 1.22+
- Node.js 18+(仅构建前端)
# 构建前端
cd web
npm install
npm run build
# 构建后端
cd ..
go build -o openmovie ./cmd/server./openmovie默认监听 :8090,访问 http://localhost:8090 即可。
| 变量 | 默认值 | 说明 |
|---|---|---|
OPENMOVIE_ADDR |
:8090 |
HTTP 监听地址 |
OPENMOVIE_DATA_DIR |
data |
数据存储目录 |
# 终端 1:启动后端
OPENMOVIE_DATA_DIR=data-dev go run ./cmd/server
# 终端 2:启动前端(自动代理 API 到后端)
cd web
npm run dev前端开发服务器运行在 http://localhost:5173,自动代理 /api 请求到后端 :8090。
如需指定后端地址:
OPENMOVIE_API=http://192.168.1.100:8090 npm run devOpenMovie/
├── cmd/server/main.go # 入口
├── internal/
│ ├── api/server.go # HTTP 路由 + 中间件
│ ├── domain/models.go # 领域模型(50+ 类型)
│ ├── event/bus.go # 事件总线
│ ├── module/ # 外部模块集成
│ │ ├── downloader.go # qBittorrent / Transmission / HTTP 下载器
│ │ ├── media_source.go # TMDB / Douban / Bangumi API
│ │ ├── site.go # 站点搜索 + 解析
│ │ ├── site_access.go # CookieCloud / 站点认证
│ │ └── site_indexer.go # 内置索引器定义
│ ├── repository/store.go # JSON KV 存储
│ └── usecase/service.go # 业务逻辑编排
├── web/ # React 前端
│ ├── src/
│ │ ├── App.tsx # 主应用(路由 + 页面)
│ │ ├── types.ts # TypeScript 类型定义
│ │ └── index.css # 全局样式
│ └── package.json
├── data-dev/ # 开发种子数据
│ ├── store/settings.json # 示例配置
│ ├── store/sites.json # 示例站点
│ ├── downloads/ # 下载目录
│ └── library/ # 媒体库目录
└── docs/screenshots/ # 截图
首次运行后通过 Web 界面「系统设置」页面配置,主要配置项:
目录配置
downloadRoots— 下载目录列表libraryRoots— 媒体库目录列表directoryPairs— 目录对(下载 → 媒体库映射,支持指定传输模式和存储类型)
站点配置
sites— 站点列表(名称、地址、Cookie、代理、浏览器仿真等)siteCookieCloudIntervalMinutes— CookieCloud 自动同步间隔
订阅配置
subscribeMode— 订阅模式:rss/search/mixedsubscribeRefreshMinutes— 订阅刷新间隔subscribeBestVersionRules— 最佳版本升级规则
搜索配置
searchIndexerSites— 搜索使用的索引器站点searchResourcePages— 每次搜索页数
重命名格式
movieRenameFormat— 电影重命名格式,如{title} ({year})/{title} ({year})tvRenameFormat— 电视剧重命名格式,如{title}/Season {season2}/{title} S{season2}E{episode2}
安全
apiToken— API 访问令牌securityAllowLan— 是否允许局域网访问
代理
proxyUrl— 全局 HTTP 代理地址
所有 API 端点位于 /api/v1/ 下,需要在请求头携带 Authorization: Bearer <token> 或 X-API-Token: <token>。
主要端点:
GET /api/v1/recommend # 推荐列表
GET /api/v1/search # 资源搜索
GET /api/v1/search/stream # SSE 流式搜索
GET /api/v1/subscribes # 订阅列表
POST /api/v1/subscribes # 创建订阅
GET /api/v1/calendar # 日历
GET /api/v1/downloads # 下载任务
POST /api/v1/downloads # 添加下载
GET /api/v1/transfers/queue # 传输队列
GET /api/v1/transfers/events # SSE 传输事件
GET /api/v1/sites # 站点列表
GET /api/v1/files/list # 文件列表
GET /api/v1/settings # 系统设置
GET /api/v1/automation/jobs # 定时任务
GET /api/v1/notifications # 通知列表
GET /api/v1/health # 健康检查
- MoviePilot — 原始项目
- TMDB — 影视元数据
- 豆瓣 — 中文影视数据
- Bangumi — 动画数据







