# 核心概念

理解這六個概念就理解了 HUAN。

理解這六個概念就理解了 HUAN。

## 素材（Media Asset）

一個上傳的檔案：影片、圖片或 HTML。文字與網址不需要上傳，它們直接寫在版面設定裡。

每個素材會產生數種產物：

| 產物        | 用途               | 保留                      |
| ----------- | ------------------ | ------------------------- |
| `original`  | 使用者上傳的原始檔 | 轉檔成功後刪除            |
| `thumbnail` | 素材庫縮圖         | 長期                      |
| `preview`   | 後台排版預覽       | 長期                      |
| `playback`  | 派送到裝置播放     | 全部 ACK 且過保留期後回收 |

詳見[素材生命週期](/huan/dev/asset-lifecycle)。

## 版面（Layout）

一份畫面的設計。包含畫布尺寸、背景、間距，以及一棵遞迴分割樹。

任何區塊都可以被水平或垂直切成兩塊，每一塊可以放文字、跑馬燈、圖片、影片、網址或上傳的 HTML。

分割用的是**比例**而不是像素，因此同一份版面在不同解析度上維持相同的構圖。詳見[版面與縮放](/huan/dev/layout-engine)。

## 修訂（Revision）

發布版面時建立的**不可變快照**。

草稿與已發布版本完全分離：你可以放心編輯草稿，現場播的還是上一次發布的內容。

裝置的目標狀態指向的是修訂 id，因此可以明確知道某台裝置在某個時刻播的是哪一版。

## 排程（Schedule）

「在哪些日子的哪個時段，哪些裝置播哪個版面」。

排程綁定 IANA 時區，正確處理日光節約時間。多筆排程同時生效時依明確定義的順序決勝：優先度 → 視窗較短 → 天數較少 → 有日期區間 → 較新 → id。

排程清單會下載到裝置本機，因此 **Server 離線時裝置仍會照時間切換版面**。詳見[排程與時區](/huan/dev/scheduling)。

## 裝置（Device）

一台已配對的播放器。

配對流程：裝置顯示 `XXXX-XXXX` 配對碼與 QR Code，已登入的管理員掃碼或輸入配對碼後確認綁定。裝置取得一組**專屬的憑證**，不同裝置不共用秘密。

裝置綁定後**不能在本機修改內容**。本機只提供裝置資訊、連線狀態與解除綁定。

## 目標狀態與回報狀態

Server 宣告「這台裝置應該是修訂 42」；裝置回報「我現在是 41」，然後自己下載、驗證、啟用，最後回報 42。

```text
Server:  desiredVersion = 42
Device:  reportedVersion = 41
            ↓ 下載
            ↓ 驗證 SHA-256
            ↓ 全部就緒才原子性切換
Device:  reportedVersion = 42
```

任何一個檔案失敗，裝置就留在 41 繼續播舊內容，稍後重試。**絕不會為了下載新版本而先刪掉舊版本。**

詳見 [Desired / Reported State](/huan/dev/desired-reported-state)。
