|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import logging |
|
|
import os |
|
|
from typing import List, Dict, Any |
|
|
|
|
|
|
|
|
from .types import GenerationState, PreProductionParams, ProductionParams, Ato, MediaRef, KeyframeData, VideoData |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class AducDirector: |
|
|
""" |
|
|
Representa o Diretor de Cena, responsável por gerenciar o estado da produção. |
|
|
Atua como a fonte única da verdade para todos os dados relacionados a uma |
|
|
única tarefa de geração de vídeo. |
|
|
""" |
|
|
def __init__(self, workspace_dir: str): |
|
|
""" |
|
|
Inicializa o Diretor. |
|
|
|
|
|
Args: |
|
|
workspace_dir (str): O diretório onde os artefatos são salvos. |
|
|
O Diretor usa isso para referenciar caminhos se necessário. |
|
|
""" |
|
|
self.workspace_dir = workspace_dir |
|
|
self.state: GenerationState = self._initialize_state() |
|
|
os.makedirs(self.workspace_dir, exist_ok=True) |
|
|
logger.info(f"AducDirector inicializado. O estado de geração foi criado.") |
|
|
|
|
|
def _initialize_state(self) -> GenerationState: |
|
|
""" |
|
|
Cria uma instância vazia e válida do modelo GenerationState. |
|
|
""" |
|
|
return GenerationState() |
|
|
|
|
|
def get_full_state(self) -> GenerationState: |
|
|
""" |
|
|
Retorna o objeto de estado Pydantic completo. |
|
|
|
|
|
Returns: |
|
|
GenerationState: O estado atual da geração. |
|
|
""" |
|
|
return self.state |
|
|
|
|
|
def get_full_state_as_dict(self) -> Dict[str, Any]: |
|
|
""" |
|
|
Retorna o estado completo serializado como um dicionário Python. |
|
|
Útil para passar para bibliotecas que não suportam Pydantic diretamente. |
|
|
|
|
|
Returns: |
|
|
Dict[str, Any]: O estado atual como um dicionário. |
|
|
""" |
|
|
return self.state.model_dump() |
|
|
|
|
|
def update_parameters(self, stage: str, params: Any): |
|
|
""" |
|
|
Atualiza o nó de parâmetros no estado de geração. |
|
|
|
|
|
Args: |
|
|
stage (str): O estágio da produção ('pre_producao', 'producao', etc.). |
|
|
params (BaseModel): O objeto Pydantic contendo os parâmetros para aquele estágio. |
|
|
""" |
|
|
if hasattr(self.state.parametros_geracao, stage): |
|
|
setattr(self.state.parametros_geracao, stage, params) |
|
|
logger.info(f"Parâmetros do estágio '{stage}' atualizados no estado.") |
|
|
else: |
|
|
logger.warning(f"Tentativa de atualizar parâmetros para um estágio desconhecido: '{stage}'") |
|
|
|
|
|
def update_pre_production_state(self, prompt: str, ref_paths: List[str], storyboard: List[str]): |
|
|
""" |
|
|
Popula as seções iniciais do estado após a geração do storyboard. |
|
|
|
|
|
Args: |
|
|
prompt (str): O prompt geral. |
|
|
ref_paths (List[str]): Lista de caminhos para as mídias de referência. |
|
|
storyboard (List[str]): Lista de resumos dos atos. |
|
|
""" |
|
|
self.state.Promt_geral = prompt |
|
|
self.state.midias_referencia = [MediaRef(id=i, caminho=path) for i, path in enumerate(ref_paths)] |
|
|
self.state.Atos = [Ato(id=i, resumo_ato=ato) for i, ato in enumerate(storyboard)] |
|
|
logger.info("Estado de pré-produção (prompt, referências, atos) atualizado.") |
|
|
|
|
|
def update_keyframes_state(self, keyframes_data: List[Dict[str, Any]]): |
|
|
""" |
|
|
Atualiza a lista de keyframes no estado. |
|
|
|
|
|
Args: |
|
|
keyframes_data (List[Dict[str, Any]]): Uma lista de dicionários, cada um |
|
|
representando os dados de um keyframe. |
|
|
""" |
|
|
|
|
|
self.state.Keyframe_atos = [KeyframeData(**data) for data in keyframes_data] |
|
|
logger.info(f"{len(keyframes_data)} keyframes adicionados ao estado.") |
|
|
|
|
|
def update_video_state(self, video_data_dict: Dict[str, Any]): |
|
|
""" |
|
|
Atualiza a lista de vídeos gerados no estado. |
|
|
|
|
|
Args: |
|
|
video_data_dict (Dict[str, Any]): Um dicionário representando os dados do vídeo gerado. |
|
|
""" |
|
|
|
|
|
video_model = VideoData(**video_data_dict) |
|
|
|
|
|
self.state.videos_atos = [video_model] |
|
|
logger.info("Dados da produção de vídeo atualizados no estado.") |