from __future__ import annotations import enum import time from dataclasses import dataclass, field, asdict from typing import Dict, Any, List, Optional, Literal, Union class ConversionPriority(enum.IntEnum): LOW = 10 NORMAL = 50 HIGH = 90 CRITICAL = 100 class ConversionStatus(str, enum.Enum): QUEUED = "queued" RUNNING = "running" SUCCESS = "success" FAILED = "failed" CANCELED = "canceled" @dataclass class ContentMetadata: """ Метаданные контента для NFT и каталогизации. """ title: str description: Optional[str] = None author: Optional[str] = None collection: Optional[str] = None tags: List[str] = field(default_factory=list) cover_image_b64: Optional[str] = None # Доп. поля для Web2/Web3 совместимости language: Optional[str] = None explicit: Optional[bool] = None attributes: Dict[str, Any] = field(default_factory=dict) def to_dict(self) -> Dict[str, Any]: return asdict(self) @dataclass class ConversionTask: """ Описывает задачу на конвертацию для converter-module. """ task_id: str input_path: str input_ext: str quality: Literal["high", "low"] # Доп опции конвертера trim: Optional[str] = None # формат "start-end" в секундах, пример "0.5-35" custom: List[str] = field(default_factory=list) # Интеграция с децентрализованной платформой priority: ConversionPriority = ConversionPriority.NORMAL attempts: int = 0 max_retries: int = 3 # NFT/контент метаданные metadata: ContentMetadata = field(default_factory=lambda: ContentMetadata(title="Untitled")) # Трассировка/время created_at: int = field(default_factory=lambda: int(time.time())) updated_at: int = field(default_factory=lambda: int(time.time())) def to_dict(self) -> Dict[str, Any]: d = asdict(self) d["priority"] = int(self.priority) return d @dataclass class ConversionResult: """ Результат конвертации. """ task_id: str status: ConversionStatus # Путь к выходному файлу конвертера внутри converter-module контейнера/процесса converter_output_path: Optional[str] = None # Снимок stdout/stderr или лог-файла конвертера (если доступно) logs_path: Optional[str] = None # Интеграция после конвертации # content_id после шифрования, ключ для расшифровки хранится отдельно безопасно content_id: Optional[str] = None # Итоговые чанки (их хеши и base64-данные) chunks: Optional[List[Dict[str, Any]]] = None # Метаданные для NFT nft_metadata: Optional[Dict[str, Any]] = None # Ошибка (если FAILED) error: Optional[str] = None finished_at: Optional[int] = None def to_dict(self) -> Dict[str, Any]: d = asdict(self) d["status"] = str(self.status.value) return d