104 lines
3.2 KiB
Python
104 lines
3.2 KiB
Python
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 |