videoSummary/app/models/analysis.py
2025-12-02 18:54:14 +08:00

144 lines
4.4 KiB
Python

"""
Analysis result and summary models
"""
from datetime import datetime
from bson import ObjectId
from typing import Optional, Dict, Any
from app.models.database import get_database
class AnalysisResult:
"""Video analysis result model"""
COLLECTION_NAME = 'analysis_results'
def __init__(self,
video_id: ObjectId,
content: str,
fps: int,
analysis_type: str = 'content',
created_at: Optional[datetime] = None,
_id: Optional[ObjectId] = None):
"""
Initialize AnalysisResult model
Args:
video_id: Video document ID
content: Analysis content
fps: Frames per second used
analysis_type: Type of analysis (content, summary)
created_at: Creation timestamp
_id: Document ID
"""
self._id = _id or ObjectId()
self.video_id = video_id
self.content = content
self.fps = fps
self.analysis_type = analysis_type
self.created_at = created_at or datetime.utcnow()
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary"""
return {
'_id': self._id,
'video_id': self.video_id,
'content': self.content,
'fps': self.fps,
'analysis_type': self.analysis_type,
'created_at': self.created_at
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'AnalysisResult':
"""Create AnalysisResult from dictionary"""
return cls(
_id=data.get('_id'),
video_id=data['video_id'],
content=data['content'],
fps=data['fps'],
analysis_type=data.get('analysis_type', 'content'),
created_at=data.get('created_at')
)
def save(self) -> ObjectId:
"""Save analysis result to database"""
db = get_database()
result = db[self.COLLECTION_NAME].insert_one(self.to_dict())
self._id = result.inserted_id
return self._id
@classmethod
def find_by_video_id(cls, video_id: str, analysis_type: Optional[str] = None) -> Optional['AnalysisResult']:
"""Find analysis result by video ID"""
db = get_database()
query = {'video_id': ObjectId(video_id)}
if analysis_type:
query['analysis_type'] = analysis_type
doc = db[cls.COLLECTION_NAME].find_one(query, sort=[('created_at', -1)])
if doc:
return cls.from_dict(doc)
return None
class Summary:
"""Video summary model"""
COLLECTION_NAME = 'summaries'
def __init__(self,
video_id: ObjectId,
summary_text: str,
created_at: Optional[datetime] = None,
_id: Optional[ObjectId] = None):
"""
Initialize Summary model
Args:
video_id: Video document ID
summary_text: Summary text
created_at: Creation timestamp
_id: Document ID
"""
self._id = _id or ObjectId()
self.video_id = video_id
self.summary_text = summary_text
self.created_at = created_at or datetime.utcnow()
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary"""
return {
'_id': self._id,
'video_id': self.video_id,
'summary_text': self.summary_text,
'created_at': self.created_at
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'Summary':
"""Create Summary from dictionary"""
return cls(
_id=data.get('_id'),
video_id=data['video_id'],
summary_text=data['summary_text'],
created_at=data.get('created_at')
)
def save(self) -> ObjectId:
"""Save summary to database"""
db = get_database()
result = db[self.COLLECTION_NAME].insert_one(self.to_dict())
self._id = result.inserted_id
return self._id
@classmethod
def find_by_video_id(cls, video_id: str) -> Optional['Summary']:
"""Find summary by video ID"""
db = get_database()
doc = db[cls.COLLECTION_NAME].find_one(
{'video_id': ObjectId(video_id)},
sort=[('created_at', -1)]
)
if doc:
return cls.from_dict(doc)
return None