# 動態牆 [TOC] ###### tags: `jkfans` --- ## 需求 - 動態牆(簡稱**牆**) - 女神發佈視頻**動態**到牆上 - 單則動態可設定❤️數量**上鎖** - 粉絲使用❤️**解鎖**單則動態 ## 規格 - 女神 vs. 動態 (一對多) - 女神(網頁)上傳動態 - 一張圖像或一個視頻(必要) - 文字內容(選填) - ❤️數量(選填) - 粉絲 vs. 動態 (多對多) ### 視頻前置作業 ![](https://i.imgur.com/dK7oI2B.png) 1. [x] EC2 - 接收上傳檔案 - [x] 驗證檔案類型(`video/mp4`、`video/quicktime`) - [x] 不符則刪除**本地暫存檔**後直接響應給**女神** - [x] 暫存檔名為 `UUID.randomUUID()` - [x] 暫存於 `System.getProperty("java.io.tmpdir")` 2. [x] RDS - 創建初始數據 - [x] 女神(`goddes`) - [x] 識別碼(`identifier`) - [x] 創建的時戳(`createdAt`) - [x] 解鎖愛心數量(`hearts`) - [x] S3 上的暫存檔案位址(`preProcessingUri`) - [x] Beanstalk 的網鉤位址(`webhookUrl`) 3. [x] S3 - 封存原檔 - [x] EC2 - 刪除本地暫存檔 4. [x] 發送消息到 SQS 佇列 ### 視頻後製作業 ![](https://i.imgur.com/8lDvOD0.png) 1. [x] SQS - 接收消息調用 Lambda 函數 2. [x] Lambda - [x] 從消息中取得 S3 的暫存檔案位址(`getPreProcessingUri()`) - [x] 將 S3 的暫存檔案上傳到 Cloudinary 3. [x] Cloudinary - [x] 後製(加上 emblem) - [x] 後製(套用濾鏡、加上 emblem) - [x] Cloudinary 完成後會發送 notification 到 webhook 4. [x] EC2 - 透過 webhook 接收 notification - [x] 從 RDS 取得 S3 的暫存檔案位址(`getPreProcessingUri()`) - [x] 刪除 S3 的暫存檔案 - [x] 將 RDS 中 S3 的暫存檔案位址設為 `null` 5. [ ] 發送消息到 SQS 佇列 ### 封存視頻 ![](https://i.imgur.com/tvVp1wX.png) 1. [x] SQS - 接收消息調用 Lambda 函數 2. [x] Lambda - 使 S3 從 Cloudinary 下載資產 3. [ ] RDS - 更新數據 4. [ ] Cloudinary - 刪除資產 5. [ ] MediaConvert - 視頻轉碼(`.m3u8`、`.ts`) 6. [ ] EventBridge - 構建事件調用 Lambda 函數 7. [ ] Lambda - 透過 LINE Messaging API 通知女神 ## LINE Notify | | Development | Production | | | -------- | --------------------------------------------- | --------------------------------------------- | ------ | | 接收视频 | `qqbrW2eLmnPl2LB6LI4UgnQWFwnwuxBj740ihSSljwY` | `qqbrW2eLmnPl2LB6LI4UgnQWFwnwuxBj740ihSSljwY` | Fēifēi | | 视频后制 | `XOE1KJ8OqtLPlQAeZwebgViNEpmzb70SmHdya7RjoiP` | `XOE1KJ8OqtLPlQAeZwebgViNEpmzb70SmHdya7RjoiP` | 林可可 | | 前製視頻 | | | | ## - [x] Upload to S3: - [x] `s3://{BUCKET}/prEprOcEssIng/{UUID}.(mov|mp4)` - Cloudinary to Lambda: - [ ] `/tmp/{UUID}/{PUBLIC_ID}.mp4` - [ ] `/tmp/{UUID}/preview.mp4` - Lambda to S3: - [ ] `s3://{BUCKET}/story/{UUID}/{PUBLIC_ID}.mp4` - [ ] `s3://{BUCKET}/story/{UUID}/preview.mp4` - S3 to MediaConvert: - [ ] `s3://{BUCKET}/story/{UUID}/{PUBLIC_ID}.(m3u8|ts)` - [ ] `s3://{BUCKET}/story/{UUID}/preview.(m3u8|ts)`