uploader-bot/app/core/models/converter/conversion_models.py

104 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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