fix: 场景检测

This commit is contained in:
root 2025-07-11 21:53:47 +08:00
parent ca56349de0
commit 0b7e3fb07a
3 changed files with 113 additions and 10 deletions

View File

@ -0,0 +1,27 @@
#!/usr/bin/env python3
"""
场景检测服务模块
"""
from .types import (
DetectorType, SceneInfo, VideoSceneResult,
BatchDetectionConfig, BatchDetectionResult, DetectionStats
)
from .detector import SceneDetectionService
from .cli import SceneDetectionCommander
__all__ = [
# 数据类型
"DetectorType",
"SceneInfo",
"VideoSceneResult",
"BatchDetectionConfig",
"BatchDetectionResult",
"DetectionStats",
# 服务
"SceneDetectionService",
# 命令行接口
"SceneDetectionCommander"
]

View File

@ -0,0 +1,76 @@
#!/usr/bin/env python3
"""
场景检测相关的数据类型定义
"""
from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
class DetectorType(Enum):
"""检测器类型"""
CONTENT = "content"
THRESHOLD = "threshold"
ADAPTIVE = "adaptive"
@dataclass
class SceneInfo:
"""场景信息"""
index: int
start_time: float
end_time: float
duration: float
confidence: float = 0.0
frame_count: int = 0
thumbnail_path: Optional[str] = None
@dataclass
class VideoSceneResult:
"""单个视频的场景检测结果"""
video_path: str
filename: str
success: bool
total_scenes: int
total_duration: float
scenes: List[SceneInfo]
detection_time: float
detector_type: str
threshold: float
error: Optional[str] = None
@dataclass
class BatchDetectionConfig:
"""批量检测配置"""
detector_type: DetectorType = DetectorType.CONTENT
threshold: float = 30.0
min_scene_length: float = 1.0
adaptive_threshold: bool = False
generate_thumbnails: bool = False
output_format: str = "json" # json, csv, txt
save_scenes: bool = False
@dataclass
class BatchDetectionResult:
"""批量检测结果"""
total_files: int
processed_files: int
failed_files: int
total_scenes: int
total_duration: float
average_scenes_per_video: float
detection_time: float
results: List[VideoSceneResult]
failed_list: List[dict]
config: BatchDetectionConfig
@dataclass
class DetectionStats:
"""检测统计信息"""
total_videos: int
total_scenes: int
total_duration: float
average_duration_per_scene: float
shortest_scene: float
longest_scene: float
most_scenes_video: str
least_scenes_video: str

View File

@ -69,7 +69,7 @@ pub async fn get_segments_by_video_id(app: AppHandle, video_id: String) -> Resul
pub async fn upload_video_file(app: AppHandle, request: UploadVideoRequest) -> Result<String, String> {
let mut args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"upload_video_file".to_string(),
request.source_path,
];
@ -96,7 +96,7 @@ pub async fn upload_video_file(app: AppHandle, request: UploadVideoRequest) -> R
pub async fn batch_upload_video_files(app: AppHandle, request: BatchUploadVideoRequest) -> Result<String, String> {
let mut args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"batch_upload_video_files".to_string(),
request.source_directory,
];
@ -120,7 +120,7 @@ pub async fn add_segment_tags(app: AppHandle, request: TagsRequest) -> Result<St
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"add_segment_tags".to_string(),
request.segment_id,
tags_json,
@ -137,7 +137,7 @@ pub async fn remove_segment_tags(app: AppHandle, request: TagsRequest) -> Result
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"remove_segment_tags".to_string(),
request.segment_id,
tags_json,
@ -151,7 +151,7 @@ pub async fn remove_segment_tags(app: AppHandle, request: TagsRequest) -> Result
pub async fn increment_segment_usage(app: AppHandle, segment_id: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"increment_segment_usage".to_string(),
segment_id,
];
@ -170,7 +170,7 @@ pub async fn get_segments_by_tags(app: AppHandle, request: SearchTagsRequest) ->
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"get_segments_by_tags".to_string(),
tags_json,
match_all_json,
@ -184,7 +184,7 @@ pub async fn get_segments_by_tags(app: AppHandle, request: SearchTagsRequest) ->
pub async fn get_popular_segments(app: AppHandle, limit: Option<i32>) -> Result<String, String> {
let mut args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"get_popular_segments".to_string(),
];
@ -200,7 +200,7 @@ pub async fn get_popular_segments(app: AppHandle, limit: Option<i32>) -> Result<
pub async fn search_segments(app: AppHandle, keyword: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"pypython_core.services.media_manager.cli".to_string(),
"search_segments".to_string(),
keyword,
];
@ -213,7 +213,7 @@ pub async fn search_segments(app: AppHandle, keyword: String) -> Result<String,
pub async fn delete_segment(app: AppHandle, segment_id: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"delete_segment".to_string(),
segment_id,
];
@ -226,7 +226,7 @@ pub async fn delete_segment(app: AppHandle, segment_id: String) -> Result<String
pub async fn delete_original_video(app: AppHandle, video_id: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.media_manager".to_string(),
"python_core.services.media_manager.cli".to_string(),
"delete_original_video".to_string(),
video_id,
];