# ADR-0005：本機優先播放

已採用

## 狀態

已採用

## 背景

播放裝置要怎麼取得要播的影片？

1. 從伺服器串流。
2. 先下載到本機再播放。

## 決策

**素材必須先完整下載到裝置本機並通過 SHA-256 驗證，才會播放。** 正常播放時裝置不會去讀 RustFS。

新版本的切換是原子的：所有檔案就緒之後才切換，任何一個失敗就留在舊版本。

## 理由

**現場網路是整套系統裡最不可靠的一環。** 看板裝在賣場後場、電梯口、展場角落，用的是延伸出去的 Wi-Fi 或別人插著的網路線。串流播放意味著網路一抖畫面就卡，網路一斷就是黑畫面。

**黑畫面是這個產品最嚴重的失效模式。** 一面看板的價值就是它一直亮著。客戶不會知道是網路的問題，他們只會看到自己花錢買的螢幕變成一塊黑板。

**先下載讓失敗變得無害。** 網路斷了，裝置照播現有內容；新版本下載失敗，裝置照播舊版本。網路問題從「立刻可見的故障」降級成「延遲更新」。

**原子切換避免了半新半舊的狀態。** 如果邊下載邊切換，使用者會看到左邊已經是新影片、右邊還是舊圖片。全部就緒才切換讓每一次更新都是一次乾淨的轉換。

## 後果

- 裝置需要足夠的本機儲存空間。這帶來了儲存管理的需求：空間門檻檢查、垃圾回收，以及空間不足時向後台回報。
- 更新有延遲。發布之後裝置要先下載完才會顯示，一支大影片可能要幾分鐘。這對數位看板完全可以接受。
- **絕對不能先刪舊版本再下載新版本。** 舊版本的檔案要等新版本成功啟用並經過保留期之後才回收。
- 垃圾回收永遠不能刪除目前啟用版本的素材、下一個排程版本需要的素材，或正在下載的檔案。

## 替代方案

**串流播放**：實作簡單、不需要本機儲存，但完全不能接受黑畫面的風險。

**串流加上本機快取**：看起來兩全其美，實際上是最糟的組合——首播仍然依賴網路，而且要同時維護串流與快取兩套邏輯，失效模式比任何一種單獨的做法都多。
