feat(scanning): add library scanner with rules engine
- Add ScanRule model with configurable conditions - Add FileAnalyzer for ffprobe-based media analysis - Add LibraryScanner with manual, scheduled and watcher modes - Add LanguageDetector for audio language detection - Support rule-based filtering with priority evaluation
This commit is contained in:
41
backend/scanning/detected_languages.py
Normal file
41
backend/scanning/detected_languages.py
Normal file
@@ -0,0 +1,41 @@
|
||||
"""Model for storing detected audio languages."""
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Index
|
||||
from sqlalchemy.sql import func
|
||||
|
||||
from backend.core.database import Base
|
||||
|
||||
|
||||
class DetectedLanguage(Base):
|
||||
"""
|
||||
Stores detected audio languages for files where metadata is undefined.
|
||||
|
||||
This cache prevents re-detecting the same file multiple times.
|
||||
"""
|
||||
|
||||
__tablename__ = "detected_languages"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
file_path = Column(String(1024), nullable=False, unique=True, index=True)
|
||||
detected_language = Column(String(10), nullable=False) # ISO 639-1 code
|
||||
detection_confidence = Column(Integer, nullable=True) # 0-100
|
||||
detected_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
|
||||
# Indexes for performance
|
||||
__table_args__ = (
|
||||
Index('idx_detected_lang_path', 'file_path'),
|
||||
Index('idx_detected_lang_language', 'detected_language'),
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return f"<DetectedLanguage {self.file_path}: {self.detected_language}>"
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
"""Convert to dictionary."""
|
||||
return {
|
||||
"id": self.id,
|
||||
"file_path": self.file_path,
|
||||
"detected_language": self.detected_language,
|
||||
"detection_confidence": self.detection_confidence,
|
||||
"detected_at": self.detected_at.isoformat() if self.detected_at else None,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user