README.zh-TW.md
Rama main · réplica de lectura del repositorio original.
<p align="center">
<img src="web/public/icons/icon-512.png" width="120" alt="milmil logo" />
</p>
<h1 align="center">milmil</h1>
<p align="center">
自架動畫媒體伺服器<br/>
<sub>媒體庫管理、新番日曆、動畫趨勢、彈幕播放</sub>
</p>
<p align="center">
<a href="README.en.md">English</a> | <a href="README.ja.md">日本語</a> | <a href="README.ko.md">한국어</a> | <a href="README.zh-CN.md">简体中文</a> | 繁體中文(台灣) | <a href="README.md">粵語</a>
</p>
<p align="center">
<a href="#功能特色">功能特色</a> •
<a href="#截圖預覽">截圖預覽</a> •
<a href="#macos-桌面應用程式">macOS 應用程式</a> •
<a href="#快速開始">快速開始</a> •
<a href="#部署">部署</a> •
<a href="#設定">設定</a> •
<a href="#開發">開發</a> •
<a href="#授權條款">授權條款</a>
</p>
---
## 截圖預覽
<p align="center">
<img src="docs/screenshots/home.png" width="800" alt="首頁 — 精選輪播、今日時間表、趨勢排行" />
</p>
<p align="center">
<img src="docs/screenshots/discover.png" width="800" alt="探索 — 當季熱門、類型篩選" />
</p>
<p align="center">
<img src="docs/screenshots/schedule.png" width="800" alt="新番日曆 — 按星期排列當季動畫" />
</p>
<p align="center">
<img src="docs/screenshots/detail.png" width="800" alt="動畫詳情 — 劇集列表、角色、預告片" />
</p>
<p align="center">
<img src="docs/screenshots/watch.png" width="800" alt="觀看頁 — 具粵語彈幕疊加層的播放器" />
</p>
---
## macOS 桌面應用程式
原生 SwiftUI 客戶端,內建以 [mpv](https://mpv.io) 為核心的播放器、Core Animation 彈幕,以及離線下載。它使用與網頁版相同的 API,因此需要一台已在運行的 milmil 伺服器。
<p align="center">
<img src="docs/screenshots/macos/macos-home.png" width="800" alt="首頁——片架、今日時間表與熱門" />
<br/><sub>首頁——片架、今日時間表與熱門</sub>
</p>
<p align="center">
<img src="docs/screenshots/macos/macos-watch.png" width="800" alt="播放器——mpv 播放、彈幕列與分集列表" />
<br/><sub>播放器——mpv 播放、彈幕列與分集列表</sub>
</p>
### 安裝
```bash
brew install --cask milmil-dev/milmil/milmil
```
或從[最新發行版本](https://github.com/milmil-dev/milmil/releases/latest)下載 `milmil-macos-<version>.dmg`。
> [!NOTE]
> 應用程式為 ad-hoc 簽章且未經公證,macOS 會阻擋第一次啟動。請對 **milmil.app** 按右鍵選擇「**打開**」(若仍被拒絕,請前往「**系統設定 › 隱私權與安全性 › 強制打開**」),或自行執行 `xattr -d com.apple.quarantine /Applications/milmil.app` 清除旗標。Homebrew 的 `--no-quarantine` 已在 Homebrew 6 中移除。
### 系統需求
- **macOS 15(Sequoia)** 或更新版本
- 僅支援 **Apple Silicon**,沒有 Intel 版本
- 可連線的 milmil 伺服器(0.1.20 以上)
完整說明:[macOS 應用程式](https://milmil.vercel.app/zh-TW/docs/getting-started/macos)。
---
## 功能特色
### 媒體庫管理
- **多來源儲存** — 本地檔案系統、SMB、SFTP,以及透過 rclone 支援 40+ 雲端後端
- **自動掃描** — 可設定掃描間隔,搭配 FFmpeg 擷取媒體中繼資料
- **檔案比對** — 多來源動畫辨識(DandanPlay 雜湊、Bangumi、TMDB、AniList)
- **集數解析** — 自動從多個來源豐富集數中繼資料
### 探索
- **新番日曆** — 按星期排列新番動畫
- **趨勢排行** — 來自 Bangumi 的人氣動畫排名
- **搜尋** — 跨動畫資料庫全文搜尋
- **類型與標籤瀏覽** — 按類型、年份、季度、格式和評分篩選
### 播放
- **直接串流** — 相容格式的 byte-range 請求
- **容器重新封裝** — MKV 轉 MP4,無需轉碼
- **HLS 轉碼** — 基於 FFmpeg 的自適應串流,支援 session 快取
- **彈幕** — 來自 弹弹play开放弹幕网络(DandanPlay) 的彈幕留言覆蓋層
- **字幕支援** — 內嵌及外掛字幕軌
- **觀看進度** — 自動儲存位置及續播
- **外部播放器支援** — 透過 Jellyfin 相容 API 連接 Infuse、VLC、Kodi、mpv,支援 LAN 自動探索
### 下載
- **內建 torrent 用戶端** — 基於 anacrolix/torrent,可設定做種
- **HTTP 下載** — 直接檔案下載,支援中斷續傳
- **RSS 自動下載** — 訂閱動畫,支援正規表示式篩選、解析度/字幕組偏好
- **種子搜尋** — 聚合搜尋 Nyaa、DMHY、Mikan、Bangumi.moe、ACG.rip
- **下載後流程** — 完成後自動掃描、比對、解析
### 收藏
- **觀看狀態** — 想看、在看、看過、擱置、拋棄
- **使用者評分** — 個人評分系統
- **最近紀錄** — 從上次離開的地方繼續觀看
- **Bangumi 及 AniList 同步** — 基於 OAuth 的清單同步
### 系統
- **PWA** — 可安裝的漸進式網頁應用程式,支援離線
- **國際化** — 英文、日文、韓文、簡體中文、繁體中文(台灣/香港)
- **通知** — 基於 WebSocket 的即時推播(下載/掃描事件)
- **雙重驗證** — 基於 TOTP 的 2FA
- **設定匯出/匯入** — 完整組態備份
---
## 技術堆疊
| 層級 | 技術 |
|------|------|
| 後端 | Go 1.27, Echo v5, SQLite / PostgreSQL |
| 前端 | React 19, TanStack Router, Tailwind CSS v4 |
| 狀態 | Zustand (UI), TanStack Query (伺服器) |
| 打包 | Vite 8, Bun |
| 樣式 | Tailwind CSS v4, shadcn/ui, Hugeicons |
| 動畫 | Motion (Framer Motion) |
| 國際化 | Lingui v5 |
| 影片 | Video.js, FFmpeg |
| PWA | Serwist |
| 快取 | Redis(選用,記憶體回退) |
| 測試 | Vitest, Playwright, Go testing |
| 程式碼品質 | Vite+ (Oxlint/Oxfmt), Lefthook, Commitlint |
| macOS 客戶端 | Swift 6、SwiftUI、libmpv(MPVKit)、Core Animation |
---
## 快速開始
**Docker(建議):**
```bash
git clone https://github.com/milmil-dev/milmil.git
cd milmil
cp .env.example .env
cp api/.env.example api/.env
# 在 api/.env 中設定 JWT_SECRET(必填,32 字元以上)
openssl rand -hex 32
docker compose up -d
```
接著開啟 [http://localhost:3000](http://localhost:3000) 並執行安裝精靈。
完整安裝指南:[docs-site/content/docs/getting-started/installation.mdx](docs-site/content/docs/getting-started/installation.mdx)。
**從原始碼建置**(Go 1.27+、Bun 1.3+、FFmpeg):
```bash
make setup
make dev
```
API 執行於 `http://localhost:8080`,前端執行於 `http://localhost:5173`。
---
## 部署
環境變數、compose profile(`--profile postgres`)、資料卷及反向代理設定,請參閱 [docs-site/content/docs/getting-started/docker.mdx](docs-site/content/docs/getting-started/docker.mdx)。
---
## 設定
### 環境變數
| 變數 | 預設值 | 說明 |
|------|--------|------|
| `DATABASE_URL` | `sqlite://data/milmil.db` | 資料庫連線字串 |
| `REDIS_URL` | — | Redis URL(開發環境選用) |
| `JWT_SECRET` | — | JWT 簽章金鑰(最少 32 字元,必填) |
| `MILMIL_ENCRYPTION_KEY` | — | AES-256 金鑰,用於加密儲存憑證 |
| `API_PORT` | `8080` | API 伺服器埠 |
| `DATA_DIR` | `./data` | 下載及轉碼快取目錄 |
| `TORRENT_LISTEN_PORT` | `42069` | Torrent DHT/peer 埠 |
| `SEED_RATIO` | `1.0` | Torrent 做種比率目標 |
| `SEED_TIME_MINUTES` | `60` | Torrent 做種時長 |
| `DANDANPLAY_APP_ID` | — | DandanPlay API 憑證 |
| `DANDANPLAY_APP_SECRET` | — | DandanPlay API 憑證 |
| `DEBUG` | `0` | 啟用除錯紀錄 |
### 外部整合(選用)
| 服務 | 用途 | 設定 |
|------|------|------|
| **Bangumi** | 動畫中繼資料、OAuth 同步 | 設定 > 整合 |
| **AniList** | 替代中繼資料來源、OAuth 同步 | 設定 > 整合 |
| **弹弹play开放弹幕网络(DandanPlay)** | 檔案比對、彈幕留言 | 環境變數或設定頁面 |
| **TMDB** | TV 節目交叉參照 | 設定 > 整合 |
---
## 開發
### 專案結構
```
milmil/
api/ # Go 後端
cmd/server/ # 進入點
internal/
api/ # HTTP 處理器 + 路由
auth/ # JWT + 2FA
cache/ # Redis / 記憶體快取
config/ # 環境組態
db/ # 資料庫設定 + 遷移
downloader/ # Torrent + HTTP 引擎
ffmpeg/ # 轉碼
integration/ # Bangumi, AniList, DandanPlay, TMDB
matcher/ # 多來源動畫比對器
metadata/ # 中繼資料豐富化
notification/ # 事件通知
resolver/ # 集數解析器
rss/ # RSS 訂閱解析
scanner/ # 媒體庫檔案掃描器
storage/ # SMB/SFTP/本地儲存提供者
store/ # SQLc 產生查詢
torrent/ # 種子搜尋提供者
worker/ # 背景工作
ws/ # WebSocket hub
migrations/ # SQL 遷移
web/ # React 前端
src/
components/ # UI 元件
hooks/ # 自訂 hooks
lib/ # API 用戶端、工具函式
locales/ # 國際化翻譯(6 種語言)
pages/ # 頁面元件
routes/ # TanStack Router 定義
store/ # Zustand stores
styles/ # 全域 CSS + 主題
e2e/ # Playwright 測試
```
### 指令
```bash
# 開發
make dev # 啟動雙伺服器(熱重載)
make dev-api # 僅 API(使用 air)
make dev-web # 僅前端(使用 Vite)
# 建置
make build # 正式環境前端建置
# 測試
make test # 執行所有測試(Go + 前端)
cd web && bun run test:run # 前端單元測試
cd web && bun run test:e2e # Playwright E2E 測試
# 品質
make lint # Go vet + vp lint (Oxlint)
cd web && bun run check:all # 型別檢查 + lint + 格式化 + 測試
# 國際化
cd web && bun run i18n:extract # 擷取翻譯字串
cd web && bun run i18n:compile # 編譯翻譯
```
### 資料庫
- **開發:** SQLite(零設定)
- **正式:** PostgreSQL 16+
- **遷移:** 啟動時自動套用,使用 golang-migrate
- **查詢:** SQL-first,使用 sqlc 程式碼產生
---
## 支援語言
- English
- 日本語 (ja)
- 한국어 (ko)
- 简体中文 (zh-CN)
- 繁體中文 — 台灣 (zh-TW)
- 繁體中文 — 香港 (zh-HK)
---
## Star History
<a href="https://star-history.com/#milmil-dev/milmil&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=milmil-dev/milmil&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=milmil-dev/milmil&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=milmil-dev/milmil&type=Date" />
</picture>
</a>
---
## 授權條款
milmil 採用 [GNU Affero General Public License v3.0](LICENSE) 授權。
這表示您可以自由使用、修改及散布 milmil,但若您將修改版本作為網路服務執行,您必須向該服務的使用者提供原始碼。