mxivideo/docs/media-manager-progress-inte...

303 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 媒体管理器进度条集成
## 🎯 集成目标
为媒体管理器的批量操作添加进度条支持,提升用户体验,让用户能够实时了解处理进度。
## 📊 **集成结果**
```
🎉 所有进度条测试通过!
✅ 进度功能验证:
1. 继承关系正确 - ✅
2. 进度命令识别 - ✅
3. 参数解析正常 - ✅
4. 进度回调工作 - ✅
5. 命令执行正常 - ✅
```
## 🔧 核心改进
### **1. CLI基类升级**
```python
# 改进前普通Commander
class MediaManagerCommander(JSONRPCCommander):
"""媒体管理器命令行接口"""
# 改进后进度Commander
class MediaManagerCommander(ProgressJSONRPCCommander):
"""媒体管理器命令行接口 - 支持进度条"""
```
### **2. 进度命令识别**
```python
def _is_progressive_command(self, command: str) -> bool:
"""判断是否需要进度报告的命令"""
# 上传操作需要进度报告
return command in ["upload", "batch_upload"]
```
**进度命令**:
-`upload` - 单个文件上传7个步骤进度
-`batch_upload` - 批量文件上传(文件级进度)
**非进度命令**:
-`get_all_segments` - 查询操作
-`search_segments` - 搜索操作
-`delete_segment` - 删除操作
### **3. 单个上传进度**
```python
def _upload_with_progress(self, media_manager, source_path: str, filename: str, tags: list) -> dict:
"""带进度的单个上传"""
with self.create_task("上传视频文件", 5) as task:
def progress_callback(message: str):
# 根据消息更新进度
if "计算文件哈希" in message:
task.update(0, message)
elif "检查重复文件" in message:
task.update(1, message)
elif "复制文件" in message:
task.update(2, message)
elif "提取视频信息" in message:
task.update(3, message)
elif "检测场景变化" in message:
task.update(4, message)
elif "分割视频" in message:
task.update(5, message)
elif "保存数据" in message:
task.update(6, message)
result = media_manager.upload_video_file(
source_path, filename, tags, progress_callback
)
task.finish("上传完成")
return asdict(result)
```
**单个上传的7个步骤**:
1. 📊 计算文件哈希...
2. 📊 检查重复文件...
3. 📊 复制文件到存储目录...
4. 📊 提取视频信息...
5. 📊 检测场景变化...
6. 📊 分割视频成片段...
7. 📊 保存数据...
### **4. 批量上传进度**
```python
def _batch_upload_with_progress(self, media_manager, source_directory: str, tags: list) -> dict:
"""带进度的批量上传"""
# 先扫描所有视频文件
video_files = []
for root, _, files in os.walk(source_directory):
for file in files:
file_ext = os.path.splitext(file)[1].lower()
if file_ext in video_extensions:
video_files.append(os.path.join(root, file))
# 使用进度任务
with self.create_task("批量上传视频", len(video_files)) as task:
for i, file_path in enumerate(video_files):
filename = os.path.basename(file_path)
task.update(i, f"处理文件: {filename}")
# 处理每个文件...
task.finish(f"批量上传完成: {result['uploaded_files']} 成功")
```
**批量上传特点**:
- 📊 文件级进度显示
- 📈 实时统计:成功/跳过/失败
- 🔄 错误处理:单个文件失败不影响整体
- 📝 详细报告:每个文件的处理结果
### **5. MediaManager进度回调**
```python
def upload_video_file(self, source_path: str, filename: str = None, tags: List[str] = None,
progress_callback=None) -> UploadResult:
"""上传单个视频文件并分割成片段"""
# 进度回调
def report_progress(message: str):
if progress_callback:
progress_callback(message)
report_progress("计算文件哈希...")
# 计算MD5
md5_hash = self.video_processor.calculate_hash(source_path)
report_progress("检查重复文件...")
# 检查是否已存在相同MD5的视频
existing = self.storage.get_video_by_md5(self.original_videos, md5_hash)
# ... 其他步骤
```
## 🚀 用户体验提升
### **1. 实时进度反馈**
```
📊 进度: 计算文件哈希...
📊 进度: 检查重复文件...
📊 进度: 复制文件到存储目录...
📊 进度: 提取视频信息...
📊 进度: 检测场景变化...
📊 进度: 分割视频成片段...
📊 进度: 保存数据...
✅ 上传完成: 新文件
```
### **2. JSON-RPC进度协议**
```json
{
"jsonrpc": "2.0",
"method": "progress",
"params": {
"step": "media_manager",
"progress": 0.6,
"message": "检测场景变化...",
"details": {
"current": 3,
"total": 5,
"elapsed_time": 2.5,
"estimated_remaining": 1.2
}
}
}
```
### **3. 批量操作统计**
```json
{
"total_files": 10,
"uploaded_files": 8,
"skipped_files": 1,
"failed_files": 1,
"total_segments": 24,
"uploaded_list": [...],
"skipped_list": [{"filename": "duplicate.mp4", "reason": "Already exists"}],
"failed_list": [{"filename": "corrupt.mp4", "error": "Invalid format"}]
}
```
## 📈 性能和体验对比
### **改进前的问题**
-**无进度反馈** - 用户不知道处理进度
-**批量操作黑盒** - 大量文件处理时无响应
-**错误不明确** - 失败时缺少详细信息
-**用户体验差** - 长时间等待无反馈
### **改进后的优势**
-**实时进度** - 每个步骤都有进度反馈
-**批量可视化** - 文件级进度显示
-**错误透明** - 详细的错误信息和统计
-**用户友好** - 清晰的状态和预期时间
## 🎯 使用示例
### **1. 单个文件上传**
```bash
# 命令行使用
python -m python_core.services.media_manager upload video.mp4 --tags 测试
# 进度输出
📊 进度: 计算文件哈希...
📊 进度: 检查重复文件...
📊 进度: 复制文件到存储目录...
📊 进度: 提取视频信息...
📊 进度: 检测场景变化...
📊 进度: 分割视频成片段...
📊 进度: 保存数据...
✅ 上传完成
```
### **2. 批量文件上传**
```bash
# 命令行使用
python -m python_core.services.media_manager batch_upload /path/to/videos --tags 批量
# 进度输出
📊 进度: 处理文件: video1.mp4 (1/10)
📊 进度: 处理文件: video2.mp4 (2/10)
📊 进度: 处理文件: video3.mp4 (3/10)
...
✅ 批量上传完成: 8 成功, 1 跳过, 1 失败
```
### **3. 编程接口使用**
```python
from python_core.services.media_manager import MediaManagerCommander
# 创建Commander
commander = MediaManagerCommander()
# 执行带进度的命令
result = commander.execute_command("upload", {
"source_path": "video.mp4",
"tags": "测试,进度条"
})
```
## 🔧 技术实现细节
### **1. 进度任务管理**
```python
with self.create_task("任务名称", 总步数) as task:
for i in range(总步数):
# 执行工作
task.update(i, f"步骤 {i}")
task.finish("任务完成")
```
### **2. 进度回调机制**
```python
def progress_callback(message: str):
# 根据消息内容更新进度
if "关键词" in message:
task.update(步骤号, message)
# 传递回调给业务逻辑
manager.upload_video_file(path, callback=progress_callback)
```
### **3. 错误处理和统计**
```python
try:
result = process_file(file_path)
success_count += 1
except Exception as e:
failed_list.append({"filename": filename, "error": str(e)})
failed_count += 1
```
## 🎉 总结
### **集成成果**
-**进度可视化** - 所有长时间操作都有进度显示
-**用户体验** - 实时反馈,减少等待焦虑
-**错误透明** - 详细的错误信息和处理统计
-**标准协议** - 使用JSON-RPC 2.0进度协议
-**向后兼容** - 保持原有API不变
### **技术特点**
- 🎯 **智能识别** - 自动区分需要进度的命令
- 🔄 **回调机制** - 灵活的进度回调系统
- 📊 **多级进度** - 支持任务级和步骤级进度
- 🛡️ **错误恢复** - 单个失败不影响整体处理
### **实际价值**
- 💡 **提升体验** - 用户知道系统在工作
- 🚀 **提高效率** - 可以预估完成时间
- 🔍 **便于调试** - 详细的处理日志
- 📈 **数据洞察** - 处理统计和性能分析
通过集成进度条功能,媒体管理器从一个"黑盒"工具变成了一个透明、友好的用户界面,大大提升了用户体验!
---
*进度条集成 - 让长时间操作变得可视化、可预期、用户友好!*