Skip to content

feat: v0.8.0 — dynaudnorm 音量平衡、Discovery 個人化、安全修補、CI - #38

Merged
bs10081 merged 2 commits into
mainfrom
codex/redesign
Jun 12, 2026
Merged

feat: v0.8.0 — dynaudnorm 音量平衡、Discovery 個人化、安全修補、CI#38
bs10081 merged 2 commits into
mainfrom
codex/redesign

Conversation

@bs10081

@bs10081 bs10081 commented Jun 11, 2026

Copy link
Copy Markdown
Owner

本 PR 包含四個工作流

WS1 — 音量自動平衡重構

舊的靜態每首歌衰減係數只在切歌時作用一次,無法修正歌曲內部忽大忽小或安靜歌曲沒有增益的問題。

改動:

  • 以 mpv dynaudnorm=f=400:g=15:m=5:r=0.8:p=0.9 取代靜態路徑;RMS 模式 + 3 秒高斯平滑即時調整增益,歌曲內部與歌曲之間皆有效
  • 切換開關透過 mpv IPC af set/clr 即時生效,不需重新播放
  • 移除 music.service.getTrackLoudnessqueue.service 靜態增益路徑(防止雙重衰減)
  • 將既有 VolumeNormalizationControl 接入桌面 PlayerSection 與手機 MobileNowPlayingSheet

WS2 — Discovery 個人化

冷啟動時 TopRequestedRail 會顯示空白;沒有個人化內容,覺得「沒用」。

改動:

  • 新增「最近常聽」(近 30 天點播紀錄)與「為你推薦」(top-3 種子 → YouTube up-next 延伸)兩個區塊,排在市場內容之前
  • 15 分鐘推薦快取;單一種子失敗僅降級不中斷
  • 冷啟動修正:無點播紀錄時不渲染空白熱門點播卡
  • DiscoverSection 新增 origin?: "personal" | "market"

WS3 — 安全修補 + 生產韌性

  • CORS:CORS_ORIGIN 環境變數白名單;wildcard 模式移除 credentials: true
  • yt-dlp 完整性:Dockerfile 新增 SHA-256 校驗步驟
  • GET /api/health:供 docker-compose healthcheck 與外部監控使用
  • docker-compose healthcheck:interval 30s / timeout 5s / retries 3
  • .env.example:列出全部環境變數含說明
  • 啟動驗證:src/utils/env.ts validateEnvironment() 偵測常見設定錯誤,以 warn 提示不中斷
  • 優雅關機:SIGINT/SIGTERM → server.stop(); process.exit(0)

WS4 — 自建精簡 CI

PR #37 依賴 self-hosted runner / Harbor / K8s / Argo CD 等外部設施,不能直接合併。

改動:

  • .github/workflows/ci.yml:ubuntu-latest — backend typecheck+test / frontend build / hadolint / dependency-review-action
  • 保留現有 docker-image.yml 不動

測試

  • bun test src/__tests__:222 pass / 0 fail
  • bun run typecheck:clean
  • cd frontend && npm run build:clean
  • 本機實測:dynaudnorm IPC 即時切換確認、Discovery feed 含 personal-recent / personal-for-you、/api/health 回傳 version: 0.8.0、CORS wildcard/whitelist 兩種模式行為正確

🤖 Generated with Claude Code

## 音量自動平衡(WS1)
- 以 mpv dynaudnorm 濾鏡取代靜態每首歌衰減係數;歌曲內部與歌曲之間忽大忽小
  透過 3 秒級高斯平滑即時修正,安靜的歌也會被拉近基準(最大增益 5x)
- 移除 music.service getTrackLoudness / queue.service 靜態增益路徑(避免雙重衰減)
- 切換開關透過 mpv IPC af set/clr 即時生效,不需重啟播放
- 將既有 VolumeNormalizationControl 接入 PlayerSection 與 MobileNowPlayingSheet

## Discovery 個人化(WS2)
- 新增「最近常聽」(近 30 天點播)與「為你推薦」(top-3 種子 + YouTube up-next)
  兩個區塊,排在市場內容之前;15 分鐘快取
- 冷啟動修正:無點播紀錄時不渲染空白的熱門點播卡
- DiscoverSection 新增 origin 欄位供前端區分個人化 vs 市場內容

## 安全修補 + 生產韌性(WS3)
- CORS:CORS_ORIGIN 白名單模式;wildcard 時移除 credentials 防止不安全組合
- Dockerfile yt-dlp 加 SHA-256 校驗,防止供應鏈下載篡改
- 新增 GET /api/health 端點 + docker-compose healthcheck
- 新增 .env.example、啟動環境變數驗證(src/utils/env.ts)
- 修正 SIGINT/SIGTERM 不退出 process 的問題

## 自建 CI(WS4)
- .github/workflows/ci.yml:backend typecheck+test / frontend build / hadolint /
  dependency-review;ubuntu-latest,不依賴外部設施

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment thread .github/workflows/ci.yml
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
Comment thread .github/workflows/ci.yml
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: hadolint/hadolint-action@v3.1.0
Dependency graph 未在 repo 設定中啟用時 action 會直接報錯。
加上 continue-on-error: true 避免擋住其他 check 均通過的 PR。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@bs10081
bs10081 merged commit c162c6a into main Jun 12, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants