Files
momentry_core_0_1/docs/DEVELOPMENT_LOG.md
accusys bfc4317b88 feat: Add HTTP API for progress monitoring
- Add /api/v1/progress/:uuid endpoint for real-time progress查询
- Implement Redis Hash storage for progress persistence
- Increase DB connection pool (5->10)
- Add get_processor_status method to RedisClient
- Update DEVELOPMENT_LOG with HTTP API implementation

Test: curl http://127.0.0.1:3002/api/v1/progress/<uuid>
2026-03-18 02:14:49 +08:00

13 KiB
Raw Permalink Blame History

Momentry Core 開發日誌

文檔維護開始2026-03-18 ⚠️ 補充說明事後補記2026-03-18 以前),僅供參考。未來紀錄將即時記錄,參考價值較高。


開發工具

Coding LLM 模型

階段 工具 模型 ID 說明
初期 Claude CLI - - 初始專案架構建立
中期 OpenCode big-pickle opencode/big-pickle 主要開發協作者

切換記錄

  • 初期使用 Claude CLI 建立專案基本架構
  • 中期切換至 OpenCode (big-pickle) 進行主要功能開發

2026-03-17

ML 模型選用

Processor 模型 版本/大小 說明
ASR WhisperX (faster-whisper) base, int8 語音識別 + 對話分段
CUT PySceneDetect 0.6.7.1 ContentDetector 場景檢測
YOLO YOLOv8n yolov8n.pt (6.2MB) 物體檢測nano 版本最快)
OCR EasyOCR 1.7.2 文字識別
Face OpenCV Haar Cascade built-in 人臉檢測(無需額外下載)
Pose YOLOv8n-Pose yolov8n-pose.pt (6.5MB) 姿態估計nano 版本)

模型下載

  • YOLOv8n: yolov8n.pt (6.2MB)
  • YOLOv8n-Pose: yolov8n-pose.pt (6.5MB)

Python 依賴

torch==2.8.0
whisperx==3.8.2
ultralytics==8.4.23
scenedetect==0.6.7.1
easyocr==1.7.2
opencv-python==4.13.0.92

ASR 實作完成

  • 完成 Python ML processor scripts使用本地模型

    • asrx_processor.py - whisperx for speaker diarization
    • cut_processor.py - PySceneDetect for scene detection
    • yolo_processor.py - YOLOv8 for object detection
    • ocr_processor.py - EasyOCR for text recognition
    • face_processor.py - OpenCV Haar Cascade for face detection
    • pose_processor.py - YOLOv8 Pose for pose estimation
  • 更新 requirements.txt with all dependencies

  • 安裝完成torch 2.8.0, whisperx 3.8.2, ultralytics 8.4.23, scenedetect 0.6.7.1, easyocr 1.7.2, opencv-python 4.13.0.92

  • 下載模型YOLOv8n.pt (6.2MB), YOLOv8n-Pose.pt (6.5MB)

Async Streaming 實作

  • 更新 Rust processor modules 使用 async streaming 進行 real-time progress
    • src/core/processor/asr.rs
    • src/core/processor/cut.rs
    • src/core/processor/yolo.rs
    • src/core/processor/ocr.rs
    • src/core/processor/face.rs
    • src/core/processor/pose.rs

測試結果

  • 測試影片BigBuckBunny_320x180.mp4
  • ASR: 4 segments
  • CUT: 134 scenes
  • YOLO: 14315 frames每幀處理耗時
  • OCR: 40 frames with text
  • Face: 44 frames with faces
  • Pose: Timeout

Warning 清理

修復 clippy warnings

  • 移除未使用的 imports (HashMap in mongodb_db.rs, postgres_db.rs)
  • 新增 #[allow(dead_code)] 標註未使用變數
  • 新增 Default implementation for MongoDb, QdrantDb
  • probe module 重新命名為 ffprobe
  • 新增 player feature in Cargo.toml
  • 修復 format_in_format_args 警告

TUI Progress Window 實作

建立新的 UI module

  • 建立 src/ui/mod.rs
  • 建立 src/ui/progress/mod.rs

實作功能:

  • ProcessorProgress 結構(追蹤每個 processor 狀態)
  • ProgressState 結構(管理所有 processors
  • ProgressUi 結構ratatui TUI 渲染)
  • 整合到 src/main.rs 的 process 命令

TUI 顯示:

┌ Processing: BigBuckBunny_320x180.mp4 ────────────────────────────────────────┐
│ ASR     [████████████] 100% (4 segs)                                       │
│ CUT     [████████████] 100% (134 scenes)                                  │
│ ASRX    [████████████] 100% (0 segs)                                       │
│ YOLO    [██░░░░░░░░░░░]  30% (4200/14315) ETA 2:30                      │
│ OCR     [---------]   0%                                                   │
│ Face    [---------]   0%                                                  │
│ Pose    [---------]   0%                                                   │
└──────────────────────────────────────────────────────────────────────────────┘

輸出位置討論

討論 stdout vs stderr vs TUI 的輸出配置:

  • 最終結果 → stdout
  • Python progress → 需改用 Redis Pub/Sub
  • TUI Progress → stderr (ratatui)

2026-03-18

Redis Message Bus 設計

討論使用 Redis 作為消息總線,分離 Python 輸出與 Rust TUI 顯示。

設計重點:

  1. 頻道命名:momentry:progress:{uuid}
  2. 本地 Redislocalhost:6379
  3. 失敗策略:完全失效(因 stdout 問題未解決)

UUID 使用時機分析

分析 Redis Key 上使用 UUID 的時機:

全局 Keys無 UUID

  • health, stats, jobs 管理

Per-Video KeysUUID 必要)

  • job:{uuid}, progress:{uuid}, metrics:{uuid}

Per-Processor KeysUUID + Processor 必要)

  • job:{uuid}:processor:{name}

備份系統整合

參考 docs/SERVICE_ADDITION_GUIDE.md 設計規範,規劃 OutputDir 模組:

  1. 環境變數

    • MOMENTRY_OUTPUT_DIR - JSON 輸出目錄
    • MOMENTRY_BACKUP_DIR - 備份目錄(預設:/Users/accusys/momentry/backup/momentry
    • MOMENTRY_BACKUP_ENABLED - 啟用備份
  2. 命名格式

    • 備份格式:momentry_data_{YYYYMMDD}_{HHMMSS}_{uuid}.{ext}
    • 校驗和:{filename}.sha256
  3. CLI 命令

    • cargo run -- backup list - 列出備份
    • cargo run -- backup cleanup - 清理舊備份
    • cargo run -- backup verify - 驗證備份

監控系統整合

討論將 momentry_core 納入監控系統:

  1. Layer 2: Service 監控

    • 新增 momentry_core CLI 檢查
  2. Layer 7: Backup 監控

    • 新增 momentry 備份配置
  3. Redis 監控

    • 健康檢查
    • Job 狀態監控
    • 即時進度監控

實作完成項目

程式碼變更

日期 檔案 變更
2026-03-17 src/core/processor/*.rs Async streaming 更新
2026-03-17 src/ui/mod.rs 新增 UI module
2026-03-17 src/ui/progress/mod.rs 新增 Progress TUI
2026-03-17 src/main.rs 整合 Progress UI
2026-03-18 src/core/storage/output_dir.rs 新增 OutputDir 模組
2026-03-18 src/core/storage/mod.rs 新增 output_dir export
2026-03-18 src/core/db/redis_client.rs 新增 Redis 客戶端Hash + Pub/Sub
2026-03-18 src/core/db/mod.rs 新增 redis_client export

新增檔案

日期 檔案 說明
2026-03-18 docs/MOMENTRY_CORE_REDIS_KEYS.md Redis Key 設計規範
2026-03-18 docs/MOMENTRY_CORE_MONITORING.md 監控規範(暫定)
2026-03-18 scripts/redis_publisher.py Redis 訊息發布模組

更新檔案

日期 檔案 說明
2026-03-17 Cargo.toml 新增 player feature
2026-03-17 src/lib.rs 新增 ui module exports
2026-03-18 docs/PENDING_ISSUES.md 新增問題 #2, #3
2026-03-18 src/core/storage/output_dir.rs 預設改為 ./output
2026-03-18 scripts/yolo_processor.py 新增 --uuid 參數 + Redis
2026-03-18 scripts/cut_processor.py 新增 Redis
2026-03-18 scripts/ocr_processor.py 新增 Redis
2026-03-18 scripts/face_processor.py 新增 --uuid 參數 + Redis
2026-03-18 scripts/pose_processor.py 新增 --uuid 參數 + Redis
2026-03-18 scripts/asr_processor.py 新增 --uuid 參數 + Redis
2026-03-18 scripts/asrx_processor.py 新增 --uuid 參數 + Redis
2026-03-18 requirements.txt 新增 redis>=5.0.0
2026-03-18 src/core/processor/yolo.rs 新增 uuid 參數
2026-03-18 src/core/processor/cut.rs 新增 uuid 參數
2026-03-18 src/core/processor/ocr.rs 新增 uuid 參數
2026-03-18 src/core/processor/face.rs 新增 uuid 參數
2026-03-18 src/core/processor/pose.rs 新增 uuid 參數
2026-03-18 src/core/processor/asr.rs 新增 uuid 參數
2026-03-18 src/core/processor/asrx.rs 新增 uuid 參數
2026-03-18 src/main.rs 更新所有 processor 調用傳入 uuid
2026-03-18 Cargo.toml 新增 futures-util 依賴
2026-03-18 src/core/db/redis_client.rs 新增 subscribe_and_callback 方法,密碼認證
2026-03-18 src/ui/progress/mod.rs 新增 update_from_redis 方法
2026-03-18 scripts/redis_publisher.py 新增密碼認證支援
2026-03-18 測試 Redis Pub/Sub 成功運作

待解決問題

問題 #1: sqlx async INSERT 不會實際寫入數據庫

  • 狀態:待解決
  • 影響:store_vector 函數PVector 存儲

問題 #2: TUI 與 stdout 輸出混合

  • 狀態:已解決
  • 解決方案:使用 Redis Message Bus
  • 進度:
    • Redis 客戶端 (src/core/db/redis_client.rs)
    • Python redis_publisher.py
    • 所有 Python processors 更新完成
    • 所有 Rust processor 函數更新完成
    • main.rs 調用更新完成
    • Rust TUI Redis 訂閱已完成

問題 #3: Redis Message Bus 尚未實作

  • 狀態:已解決
  • 詳細設計:參考 docs/MOMENTRY_CORE_REDIS_KEYS.md
  • 進度Python 端 + Rust 端均已完成

環境變數

# 輸出目錄
MOMENTRY_OUTPUT_DIR=./output        # 預設

# 備份
MOMENTRY_BACKUP_ENABLED=false       # 預設
MOMENTRY_BACKUP_DIR=/Users/accusys/momentry/backup/momentry

# Redis未來實作
REDIS_URL=redis://localhost:6379
REDIS_PASSWORD=accusys

數據庫

  • PostgreSQL: postgres://accusys@localhost:5432/momentry
  • Redis: localhost:6379(待實作)
  • Qdrant: localhost:6333

指令範例

# 註冊視頻
cargo run -- register /path/to/video.mp4

# 處理視頻
cargo run -- process <uuid>

# 列出備份
cargo run -- backup list

# 清理備份
cargo run -- backup cleanup

# 驗證備份
cargo run -- backup verify

# 查看狀態
cargo run -- status

# API Server
cargo run -- server --host 0.0.0.0 --port 3000

2026-03-18 (進行中)

Redis Message Bus 實作

問題TUI 與 Python stdout 輸出混合,導致 TUI 顯示混亂

解決方案:使用 Redis Pub/Sub 作為訊息匯流排

實作內容

元件 檔案 狀態
Redis 客戶端 src/core/db/redis_client.rs
Progress 訂閱 src/main.rs
UI 更新 src/ui/progress/mod.rs
Python Publisher scripts/redis_publisher.py
Python Processors 7 個 scripts/*_processor.py
Rust 函數 src/core/processor/*.rs

流程

Python Processor ──(Redis Pub)──> Redis ──(Subscribe)──> Rust TUI

測試結果

  • Redis 連線
  • 密碼認證
  • 即時進度發布
  • TUI 即時更新

新增依賴

  • futures-util = "0.3" (Cargo.toml)
  • redis >= 5.0.0 (requirements.txt)

2026-03-18 (HTTP API)

HTTP API 實作

問題TUI 運作正常但使用者偏好 HTTP API 來查詢進度

解決方案:建立 HTTP 端點 + Redis Hash 儲存

實作內容

元件 檔案 變更
HTTP 端點 src/api/server.rs 新增 /api/v1/progress/:uuid
Redis Hash 查詢 src/core/db/redis_client.rs 新增 get_processor_status 方法
Progress 儲存 src/main.rs 新增 Redis HSET 儲存進度

API 端點

GET /api/v1/progress/:uuid

Response:
{
  "uuid": "5dea6618a606e7c7",
  "processors": [
    {"name": "asr", "status": "complete", "current": 0, "total": 0, "message": "7 segments"},
    {"name": "cut", "status": "complete", "current": 134, "total": 134, "message": "134 scenes"},
    {"name": "yolo", "status": "complete", "current": 14300, "total": 14315, "message": "..."},
    ...
  ]
}

流程

Python Processor ──(Redis Pub)──> Redis ──(Subscribe)──> Rust TUI
                              └──(HSET)──> Redis Hash
                                               │
HTTP Client ──(GET /progress/:uuid)──> Rust API ─(HGETALL)──> Redis Hash

測試結果

  • 編譯成功
  • API 伺服器啟動 (port 3002)
  • 即時進度查詢
  • 完整流程測試 (BigBuckBunny_320x180.mp4)

除錯記錄

  1. 語法錯誤main.rs 有重複程式碼區塊 (lines 297-322),已移除
  2. DB 連線池:從 5 增加到 10 個連線
  3. PostgreSQL 狀態:處理 shutdown 狀態,殺掉 stale 連線

新增變更

  • src/api/server.rs - 新增進度端點
  • src/core/db/redis_client.rs - 新增 get_processor_status 方法
  • src/core/db/postgres_db.rs - 連線池 5→10
  • src/main.rs - Redis Hash 儲存 + 語法修復

使用方式

# 啟動 API 伺服器
cargo run --bin momentry -- server --host 127.0.0.1 --port 3002

# 註冊影片
cargo run --bin momentry -- register ~/test_video/BigBuckBunny_320x180.mp4

# 處理影片
cargo run --bin momentry -- process <uuid>

# 查詢進度
curl http://127.0.0.1:3002/api/v1/progress/<uuid>