9 Commits

7 changed files with 430 additions and 40 deletions
+38 -2
View File
@@ -2,8 +2,19 @@
| 項目 | 內容 |
|------|------|
| 版本 | V1.1 |
| 日期 | 2026-03-25 |
| 建立者 | Warren |
| 建立時間 | 2026-03-18 |
| 文件版本 | V1.2 |
---
## 版本歷史
| 版本 | 日期 | 目的 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-18 | 創建文件 | OpenCode |
| V1.1 | 2026-03-23 | 更新端點與實際一致 | OpenCode |
| V1.2 | 2026-03-25 | 新增快取/刪除 API | OpenCode |
---
@@ -154,6 +165,29 @@ curl http://localhost:3002/api/v1/progress/5dea6618a606e7c7
---
### 系統管理
| 方法 | 端點 | 說明 |
|------|------|------|
| POST | `/api/v1/config/cache` | 切換快取功能(管理員) |
| POST | `/api/v1/unregister` | 刪除影片及其所有資料(管理員) |
**快取設定**:
```bash
curl -X POST http://localhost:3002/api/v1/config/cache \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
```
**刪除影片**:
```bash
curl -X POST http://localhost:3002/api/v1/unregister \
-H "Content-Type: application/json" \
-d '{"uuid": "5dea6618a606e7c7"}'
```
---
## 端點對照表
| 功能 | n8n 使用 | WordPress 使用 | curl 測試 |
@@ -165,6 +199,8 @@ curl http://localhost:3002/api/v1/progress/5dea6618a606e7c7
| 列出影片 | ✓ | ✓ | ✓ |
| 查詢影片 | ✓ | ✓ | ✓ |
| 處理進度 | ✓ | ✓ | ✓ |
| 快取設定 | ✓ (管理員) | ✓ (管理員) | ✓ (管理員) |
| 刪除影片 | ✓ (管理員) | ✓ (管理員) | ✓ (管理員) |
---
+8 -2
View File
@@ -2,7 +2,7 @@
| 項目 | 內容 |
|------|------|
| 版本 | V2.1 |
| 版本 | V2.2 |
| 日期 | 2026-03-25 |
---
@@ -14,11 +14,15 @@ docs/
├── API_INDEX.md ← 本文件:總覽與入口
├── API_ENDPOINTS.md ← API 端點完整說明
├── API_EXAMPLES.md ← 完整範例總覽(curl / n8n / WordPress)
├── API_REFERENCE.md ← 詳細技術參考
├── DEMO_MANUAL.md ← ⭐ 示範手冊(含 Demo API Key)
├── API_N8N_GUIDE.md ← n8n 詳細指南
├── API_WORDPRESS_GUIDE.md ← WordPress 詳細指南
├── API_CURL_EXAMPLES.md ← curl 快速範例
└── API_REFERENCE.md ← 詳細技術參考
│
├── API_TRAINING_MARCOM.md ← ⭐ marcom 團隊教育訓練手冊
├── API_WORKFLOW_WORDPRESS_N8N.md ← WordPress/n8n 完整工作流程
└── CHUNK_DATA_STRUCTURE.md ← Chunk 資料結構說明
```
---
@@ -29,7 +33,9 @@ docs/
|------|----------|
| **我要快速開始測試** | ⭐ [DEMO_MANUAL.md](./DEMO_MANUAL.md) |
| **我要查看所有範例** | [API_EXAMPLES.md](./API_EXAMPLES.md) |
| **我是 marcom 團隊** | ⭐ [API_TRAINING_MARCOM.md](./API_TRAINING_MARCOM.md) |
| 我想了解有哪些 API 端點 | [API_ENDPOINTS.md](./API_ENDPOINTS.md) |
| 我要整合 WordPress/n8n | [API_WORKFLOW_WORDPRESS_N8N.md](./API_WORKFLOW_WORDPRESS_N8N.md) |
| 我要在 n8n workflow 中呼叫 API | [DEMO_MANUAL.md](./DEMO_MANUAL.md#2-n8n-範例) |
| 我要在 WordPress 中呼叫 API | [DEMO_MANUAL.md](./DEMO_MANUAL.md#3-wordpress-範例) |
| 我要用 curl 快速測試 | [DEMO_MANUAL.md](./DEMO_MANUAL.md#1-curl-範例) |
+60
View File
@@ -14,6 +14,7 @@
|------|------|------|--------|-----------|
| V1.0 | 2026-03-18 | 創建文件 | Warren | OpenCode / MiniMax M2.5 |
| V1.1 | 2026-03-23 | 更新端點與實際一致 | OpenCode | - |
| V1.2 | 2026-03-25 | 新增快取/刪除 API | OpenCode | - |
---
@@ -384,6 +385,63 @@ curl http://localhost:3002/api/v1/videos
---
## Cache Toggle
Toggle caching at runtime.
**Endpoint:** `POST /api/v1/config/cache`
**Request Body:**
```json
{
"enabled": true
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `enabled` | boolean | Yes | Enable (true) or disable (false) cache |
**Response (200):**
```json
{
"cache_enabled": true,
"message": "Cache toggled successfully"
}
```
---
## Unregister Video
Delete a video and all associated data (chunks, processor results, thumbnails).
**Endpoint:** `POST /api/v1/unregister`
**Request Body:**
```json
{
"uuid": "5dea6618a606e7c7"
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `uuid` | string | Yes | Video UUID (16 character hex) |
**Response (200):**
```json
{
"success": true,
"message": "Video unregistered successfully",
"uuid": "5dea6618a606e7c7"
}
```
**Warning:** This operation is irreversible and will delete all associated chunks, processor results, and thumbnails.
---
## Error Responses
**400 Bad Request**
@@ -445,3 +503,5 @@ cargo run --bin momentry -- server --host 127.0.0.1 --port 3002
| Search | `POST /api/v1/search` |
| List videos | `GET /api/v1/videos` |
| Lookup | `GET /api/v1/lookup?uuid=<uuid>` |
| Toggle cache | `POST /api/v1/config/cache` |
| Delete video | `POST /api/v1/unregister` |
+127 -7
View File
@@ -1,7 +1,7 @@
# Momentry Core API 教育訓練手冊
> **對象**: marcom 團隊
> **版本**: V1.1 | **日期**: 2026-03-25
> **版本**: V1.2 | **日期**: 2026-03-25
---
@@ -15,12 +15,26 @@
| 認證方式 | Header `X-API-Key` |
| 格式 | JSON |
### API Key
### Demo 測試帳號
#### API Key(用於 API 認證)
```
X-API-Key: muser_68600856036340bcafc01930eb4bd839_1774418104_97221b69
```
#### SFTPGo(用於影片上傳)
| 項目 | 值 |
|------|-----|
| SFTP 主機 | `sftpgo.momentry.ddns.net` |
| SFTP 連接埠 | `2022` |
| 用戶名 | `demo` |
| 密碼 | `demopassword123` |
| Web 管理介面 | `https://sftpgo.momentry.ddns.net` |
**使用方式**:透過 SFTP 上傳影片,系統會自動註冊並處理。
---
## 2. 快速範例
@@ -73,7 +87,105 @@ curl -s -H "X-API-Key: muser_68600856036340bcafc01930eb4bd839_1774418104_97221b6
#### GET /api/v1/videos/:uuid
取得單一影片詳情
### 3.2 任務相關
### 3.2 搜尋與分段查詢
#### POST /api/v1/search
向量搜尋,查詢分段(Chunk)詳情
**請求參數**:
| 參數 | 類型 | 必填 | 說明 |
|------|------|------|------|
| `query` | string | 是 | 搜尋關鍵字 |
| `limit` | number | 否 | 回傳數量(預設 10) |
| `uuid` | string | 否 | 只搜尋指定影片 |
**請求範例**:
```json
{
"query": "天氣",
"limit": 10,
"uuid": "5dea6618a606e7c7"
}
```
**回應範例**:
```json
{
"results": [
{
"uuid": "39567a0eb16f39fd",
"chunk_id": "sentence_1471",
"chunk_type": "sentence",
"start_time": 5309.08,
"end_time": 5311.08,
"text": "influenced by a vital way,",
"score": 0.68
}
],
"query": "天氣"
}
```
**Chunk 欄位說明**:
| 欄位 | 說明 | 範例 |
|------|------|------|
| `uuid` | 影片唯一識別碼 | `39567a0eb16f39fd` |
| `chunk_id` | 分段識別碼 | `sentence_1471` |
| `chunk_type` | 分段類型 | `sentence` / `cut` / `time` / `trace` / `story` |
| `start_time` | 開始時間(秒) | `5309.08` |
| `end_time` | 結束時間(秒) | `5311.08` |
| `text` | 內容文字 | `influenced by a vital way` |
| `score` | 相似度分數(0-1) | `0.68` |
**Chunk 類型說明**:
| 類型 | 說明 | 來源 |
|------|------|------|
| `sentence` | 語音轉文字片段 | ASR 處理 |
| `cut` | 場景變化片段 | CUT 處理 |
| `time` | 固定時間分段 | 系統自動切割 |
| `trace` | 軌跡追蹤片段 | YOLO 追蹤 |
| `story` | 故事線片段(父子關係) | Story 分析 |
#### POST /api/v1/n8n/search
n8n 專用搜尋(包含完整影片網址 media_url)
**請求參數**: 與 `/search` 相同
**回應範例**:
```json
{
"query": "天氣",
"count": 2,
"hits": [
{
"id": "sentence_1471",
"vid": "39567a0eb16f39fd",
"start": 5309.08,
"end": 5311.08,
"title": "Chunk sentence_1471",
"text": "influenced by a vital way,",
"score": 0.68,
"media_url": "https://wp.momentry.ddns.net/影片檔名.mp4"
}
]
}
```
**與 /search 的差異**:
| 欄位 | `/search` | `/n8n/search` |
|------|-----------|----------------|
| 影片 UUID | `uuid` | `vid` |
| Chunk ID | `chunk_id` | `id` |
| 開始時間 | `start_time` | `start` |
| 結束時間 | `end_time` | `end` |
| 相似度分數 | `score` | `score` |
| **完整影片網址** | ❌ | ✅ `media_url` |
> **注意**: `media_url` 是根據 `uuid` 查詢資料庫中的 `file_name` 自動產生。影片可能不存在於該位置,請使用 `vid`(影片 UUID)搭配 `start`/`end`(時間軸)自行組建播放器連結。
### 3.3 任務相關
### 3.4 任務相關
#### GET /api/v1/jobs/:uuid
查詢處理任務狀態
@@ -105,7 +217,7 @@ curl -s -H "X-API-Key: ..." \
"https://api.momentry.ddns.net/api/v1/jobs?status=completed&limit=5"
```
### 3.3 系統管理
### 3.5 系統管理
#### POST /api/v1/config/cache
切換快取功能(管理員專用)
@@ -146,7 +258,7 @@ curl -s -H "X-API-Key: ..." \
**注意**: 此操作會刪除影片及其所有分段、處理結果、縮圖等關聯資料,**無法復原**。
### 3.4 健康檢查
### 3.6 健康檢查
#### GET /health
服務健康狀態(**無需認證**)
@@ -227,6 +339,8 @@ GET /api/v1/jobs/{uuid}
├─────────────────────────────────────────────────────────────┤
│ 查詢所有影片 GET /api/v1/videos │
│ 查詢單一影片 GET /api/v1/videos/:uuid │
│ 向量搜尋 POST /api/v1/search │
│ n8n 搜尋 POST /api/v1/n8n/search │
│ 查詢任務狀態 GET /api/v1/jobs/:uuid │
│ 查詢所有任務 GET /api/v1/jobs │
│ 快取設定 POST /api/v1/config/cache (管理員) │
@@ -263,5 +377,11 @@ GET /api/v1/jobs/{uuid}
---
**文件版本**: V1.1
**最後更新**: 2026-03-25
## 附錄:版本歷史
| 版本 | 日期 | 內容 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-25 | 初版建立 | OpenCode |
| V1.1 | 2026-03-25 | 新增快取/刪除 API、搜尋端點文件 | OpenCode |
| V1.2 | 2026-03-25 | 新增 Chunk 欄位說明、類型、播放方式 | OpenCode |
| V1.3 | 2026-03-25 | 新增 Demo 測試帳號(SFTPGo)| OpenCode |
+79 -9
View File
@@ -2,6 +2,7 @@
> **目標**: 從影片上傳到搜尋的完整流程
> **適用**: WordPress / n8n 整合
> **版本**: V1.0 | **日期**: 2026-03-25
---
@@ -22,7 +23,7 @@
```bash
# 連線資訊
主機: momentry.ddns.net
主機: sftpgo.momentry.ddns.net
連接埠: 2022
用戶名: demo
密碼: demopassword123
@@ -33,7 +34,7 @@
### 方式 B: SFTP 命令列
```bash
sshpass -p "demopassword123" sftp -P 2022 demo@momentry.ddns.net
sshpass -p "demopassword123" sftp -P 2022 demo@sftpgo.momentry.ddns.net
```
上傳後確認檔案在 SFTPGo 中的位置
@@ -153,10 +154,54 @@ curl -s -X POST "https://api.momentry.ddns.net/api/v1/search" \
-H "Content-Type: application/json" \
-d '{
"query": "測試關鍵字",
"top_k": 5
"limit": 5
}'
```
### 取得分段(Chunk)內容
搜尋結果會返回影片分段(Chunk),包含可播放的時間軸資訊:
```json
{
"results": [
{
"uuid": "39567a0eb16f39fd",
"chunk_id": "sentence_1471",
"chunk_type": "sentence",
"start_time": 5309.08,
"end_time": 5311.08,
"text": "influenced by a vital way,",
"score": 0.68
}
]
}
```
**Chunk 欄位說明**:
| 欄位 | 說明 |
|------|------|
| `uuid` | 影片 UUID(用於取得影片網址) |
| `chunk_id` | 分段 ID |
| `chunk_type` | 分段類型(sentence/cut/time/trace/story) |
| `start_time` | 開始時間(秒) |
| `end_time` | 結束時間(秒) |
| `text` | 語音內容文字 |
| `score` | 相似度分數(0-1) |
### 播放分段
取得 Chunk 後可組合成播放網址:
```
影片網址?start={start_time}&end={end_time}
```
範例:
```
https://wp.momentry.ddns.net/video.mp4?start=5309.08&end=5311.08
```
---
## 完整 n8n Workflow 範例
@@ -294,7 +339,7 @@ switch ($job['status']) {
}
```
### Step 5: 搜尋內容
### Step 5: 搜尋內容並取得 Chunk
```php
<?php
@@ -302,14 +347,18 @@ switch ($job['status']) {
$results = Momentry_API::search('測試關鍵字', 5);
foreach ($results['results'] as $result) {
echo "UUID: " . $result['chunk_id'] . "\n";
echo "分數: " . $result['score'] . "\n";
echo "影片 UUID: " . $result['uuid'] . "\n";
echo "Chunk ID: " . $result['chunk_id'] . "\n";
echo "類型: " . $result['chunk_type'] . "\n";
echo "開始: " . $result['start_time'] . "s\n";
echo "結束: " . $result['end_time'] . "s\n";
echo "內容: " . ($result['text'] ?? '') . "\n";
echo "相似度: " . $result['score'] . "\n";
echo "---\n";
}
```
### WordPress Shortcode 範例
### WordPress Shortcode 範例(可點擊播放)
```php
<?php
@@ -336,10 +385,21 @@ add_shortcode('momentry_search', function($atts) {
$html .= '<ul>';
foreach ($results['results'] as $result) {
$video_uuid = $result['uuid'];
$start = $result['start_time'] ?? 0;
$end = $result['end_time'] ?? 0;
$text = $result['text'] ?? '無文字描述';
$html .= '<li>';
$html .= '<strong>時間: ' . ($result['start_time'] ?? 'N/A') . 's</strong>';
$html .= '<a href="/player?uuid=' . esc_attr($video_uuid) .
'&start=' . esc_attr($start) .
'&end=' . esc_attr($end) . '">';
$html .= '播放 ' . $start . 's - ' . $end . 's';
$html .= '</a>';
$html .= '<br>';
$html .= esc_html($result['text'] ?? '無文字描述');
$html .= '<small>相似度: ' . round($result['score'] * 100) . '%</small>';
$html .= '<br>';
$html .= esc_html($text);
$html .= '</li>';
}
@@ -389,3 +449,13 @@ add_shortcode('momentry_search', function($atts) {
**注意**:
- 處理時間視影片長度而定(1分鐘影片約需 2-5 分鐘處理)
- 大量影片時建議分批上傳
---
## 附錄:版本歷史
| 版本 | 日期 | 內容 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-25 | 初版建立 | OpenCode |
| V1.1 | 2026-03-25 | 新增 Chunk 取得與播放說明、Shortcode 範例 | OpenCode |
| V1.2 | 2026-03-25 | 修正 SFTPGo 主機名稱為 sftpgo.momentry.ddns.net | OpenCode |
+105 -7
View File
@@ -236,7 +236,33 @@ Chunk(片段)是影片處理後的最小單位。當影片上傳後,系統
## 6. 如何使用 Chunk
### 6.1 搜尋相關片段
### 6.1 API 取得 Chunk
使用搜尋 API 取得 Chunk:
```bash
curl -X POST "https://api.momentry.ddns.net/api/v1/search" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "關鍵字",
"limit": 10
}'
```
**指定影片搜尋**:
```bash
curl -X POST "https://api.momentry.ddns.net/api/v1/search" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "關鍵字",
"uuid": "39567a0eb16f39fd",
"limit": 5
}'
```
### 6.2 搜尋相關片段
當使用者搜尋「天氣」時,系統會:
@@ -245,22 +271,90 @@ Chunk(片段)是影片處理後的最小單位。當影片上傳後,系統
3. 找到相關的 Chunk
4. 返回時間軸和內容
### 6.2 播放指定片段
### 6.3 播放指定片段
取得 Chunk 後可播放:
```
開始時間: 12.5 秒
結束時間: 18.3 秒
影片 UUID: 39567a0eb16f39fd
```
### 6.3 組合多個 Chunk
**播放器連結格式**:
```
/player?uuid={uuid}&start={start_time}&end={end_time}
```
### 6.4 組合多個 Chunk
多個相關 Chunk 可以組合成一個章節或故事線。
### 6.5 Story Chunk(父子關係)
Story Chunk 可包含多個子 Chunk:
```json
{
"chunk_id": "story_001",
"chunk_type": "story",
"content": {
"story_id": "story_001",
"title": "開場介紹",
"child_chunk_ids": ["sentence_00001", "sentence_00002", "cut_00001"]
}
}
```
---
## 7. 快速參考
## 7. API 回應格式
### /search 回應
```json
{
"results": [
{
"uuid": "39567a0eb16f39fd",
"chunk_id": "sentence_1471",
"chunk_type": "sentence",
"start_time": 5309.08,
"end_time": 5311.08,
"text": "influenced by a vital way,",
"score": 0.68
}
],
"query": "關鍵字"
}
```
### /n8n/search 回應
```json
{
"query": "關鍵字",
"count": 1,
"hits": [
{
"id": "sentence_1471",
"vid": "39567a0eb16f39fd",
"start": 5309.08,
"end": 5311.08,
"title": "Chunk sentence_1471",
"text": "influenced by a vital way,",
"score": 0.68,
"media_url": "https://wp.momentry.ddns.net/影片檔名.mp4"
}
]
}
```
> **注意**: `media_url` 根據資料庫中的 `file_name` 自動產生。建議使用 `vid` + `start`/`end` 自行組建播放器連結。
---
## 8. 快速參考
| 項目 | 說明 |
|------|------|
@@ -273,9 +367,13 @@ Chunk(片段)是影片處理後的最小單位。當影片上傳後,系統
| content | 詳細 JSON 結構 |
| metadata | 人臉、OCR、姿態等偵測結果 |
| parent_chunk_id | 父區塊 ID(用於 story 區塊) |
| child_chunk_ids | 子區塊 ID 列表(story 區塊專用) |
| child_chunk_ids | 子區塊 ID 列表(story 區塊專用) | |
---
**文件版本**: V1.0
**最後更新**: 2026-03-25
## 附錄:版本歷史
| 版本 | 日期 | 內容 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-25 | 初版建立 | OpenCode |
| V1.1 | 2026-03-25 | 新增 API 取得 Chunk 方式、播放連結格式 | OpenCode |
+12 -12
View File
@@ -22,7 +22,7 @@
| 項目 | 值 |
|------|-----|
| **主機** | `momentry.ddns.net` |
| **主機** | `sftpgo.momentry.ddns.net` |
| **SFTP 連接埠** | `2022` |
| **用戶名** | `demo` |
| **密碼** | `demopassword123` |
@@ -36,15 +36,15 @@
```bash
# 使用密碼連線
sshpass -p "demopassword123" sftp -P 2022 demo@momentry.ddns.net
sshpass -p "demopassword123" sftp -P 2022 demo@sftpgo.momentry.ddns.net
# 使用金鑰連線 (需先設定)
sftp -P 2022 -i ~/.ssh/id_rsa demo@momentry.ddns.net
sftp -P 2022 -i ~/.ssh/id_rsa demo@sftpgo.momentry.ddns.net
```
### 2. FileZilla
1. **主機**: `sftp://momentry.ddns.net`
1. **主機**: `sftp://sftpgo.momentry.ddns.net`
2. **連接埠**: `2022`
3. **協定**: `SFTP`
4. **登入類型**: `一般`
@@ -55,7 +55,7 @@ sftp -P 2022 -i ~/.ssh/id_rsa demo@momentry.ddns.net
1. 選擇 **連線 > 新連線**
2. 協定選擇 **SFTP (SSH File Transfer Protocol)**
3. 伺服器: `momentry.ddns.net`
3. 伺服器: `sftpgo.momentry.ddns.net`
4. 連接埠: `2022`
5. 使用者名稱: `demo`
6. 密碼: `demopassword123`
@@ -65,7 +65,7 @@ sftp -P 2022 -i ~/.ssh/id_rsa demo@momentry.ddns.net
```bash
curl -u demo:demopassword123 \
-T /path/to/video.mp4 \
sftp://momentry.ddns.net:2022/demo/
sftp://sftpgo.momentry.ddns.net:2022/demo/
```
---
@@ -76,7 +76,7 @@ curl -u demo:demopassword123 \
```bash
# 進入互動式模式
sftp demo@momentry.ddns.net -P 2022
sftp demo@sftpgo.momentry.ddns.net -P 2022
# 常用指令
sftp> pwd # 顯示目前目錄
@@ -94,7 +94,7 @@ sftp> exit # 斷線
```bash
# 上傳多個檔案
sshpass -p "demopassword123" sftp -P 2022 demo@momentry.ddns.net <<EOF
sshpass -p "demopassword123" sftp -P 2022 demo@sftpgo.momentry.ddns.net <<EOF
cd uploads
put video1.mp4
put video2.mp4
@@ -103,7 +103,7 @@ bye
EOF
# 使用 glob 上傳
sshpass -p "demopassword123" sftp -P 2022 demo@momentry.ddns.net <<EOF
sshpass -p "demopassword123" sftp -P 2022 demo@sftpgo.momentry.ddns.net <<EOF
mput /path/to/videos/*.mp4
bye
EOF
@@ -119,7 +119,7 @@ EOF
#!/bin/bash
# upload.sh - 上傳視頻到 Momentry
HOST="momentry.ddns.net"
HOST="sftpgo.momentry.ddns.net"
PORT="2022"
USER="demo"
PASS="demopassword123"
@@ -160,7 +160,7 @@ import sys
import os
def upload_file(local_path, remote_dir="/demo/uploads"):
host = "momentry.ddns.net"
host = "sftpgo.momentry.ddns.net"
port = 2022
username = "demo"
password = "demopassword123"
@@ -250,7 +250,7 @@ curl -u demo:demopassword123 \
上傳目錄可能需要先建立:
```bash
sshpass -p "demopassword123" sftp -P 2022 demo@momentry.ddns.net <<EOF
sshpass -p "demopassword123" sftp -P 2022 demo@sftpgo.momentry.ddns.net <<EOF
mkdir uploads
mkdir videos
bye