# setup.py import os import subprocess import sys from pathlib import Path import yaml # Adiciona a importação do hf_hub_download from huggingface_hub import hf_hub_download # --- Configuração --- DEPS_DIR = Path("/data") MODELS_ROOT = DEPS_DIR / "ltx_models" # Diretório centralizado para modelos # URLs explícitas para os repositórios REPOS_TO_CLONE = { "LTX-Video": "https://huggingface.co/spaces/Lightricks/ltx-video-distilled", "SeedVR_Space": "https://huggingface.co/spaces/ByteDance-Seed/SeedVR2-3B", "MMAudio": "https://github.com/hkchengrex/MMAudio.git" } def run_command(command, cwd=None, is_pip=False): """Executa um comando no terminal e exibe a saída em tempo real.""" if is_pip: command = [sys.executable, "-m", "pip"] + command print(f"Executando: {' '.join(command)}") try: with subprocess.Popen( command, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding='utf-8', bufsize=1 ) as process: for line in iter(process.stdout.readline, ''): print(line, end='') return_code = process.wait() if return_code != 0: raise subprocess.CalledProcessError(return_code, command) except subprocess.CalledProcessError as e: print(f"ERRO: O comando falhou com o código de saída {e.returncode}") sys.exit(1) except FileNotFoundError: print(f"ERRO: O comando '{command[0]}' não foi encontrado.") sys.exit(1) def clone_repos(): """ETAPA 1: Garante que todos os repositórios de código necessários existam.""" print("--- ETAPA 1: Verificando e clonando repositórios de código ---") for repo_name, repo_url in REPOS_TO_CLONE.items(): repo_path = DEPS_DIR / repo_name if repo_path.exists() and (repo_path / ".git").exists(): print(f"Repositório '{repo_name}' já existe. Pulando.") else: print(f"Clonando '{repo_name}' de {repo_url}...") run_command(["git", "clone", "--depth", "1", "-q", repo_url, str(repo_path)]) print(f"'{repo_name}' clonado com sucesso.") def install_ltx_dependencies(): """ETAPA 2: Instala as dependências Python do LTX-Video.""" print("\n--- ETAPA 2: Instalando dependências Python do LTX-Video ---") ltx_repo_path = DEPS_DIR / "LTX-Video" if ltx_repo_path.exists(): run_command(["install", "-e", ".[inference]"], cwd=str(ltx_repo_path), is_pip=True) print("Dependências do LTX-Video instaladas com sucesso.") else: print("ERRO CRÍTICO: Diretório LTX-Video não encontrado. Não foi possível instalar dependências.") sys.exit(1) def download_ltx_models(): """ ETAPA 3: Verifica e baixa os modelos LTX necessários, lendo os configs do repositório já clonado. """ print("\n--- ETAPA 3: Verificando e baixando modelos LTX ---") LTX_REPO_ID = "Lightricks/LTX-Video" # Repositório dos modelos no Hub ltx_configs_dir = DEPS_DIR / "LTX-Video" / "configs" if not ltx_configs_dir.is_dir(): print(f"ERRO CRÍTICO: Diretório de configs '{ltx_configs_dir}' não encontrado. O clone do LTX-Video pode ter falhado.") sys.exit(1) required_model_files = set() for cfg_path in ltx_configs_dir.glob("*.yaml"): try: with open(cfg_path, 'r') as f: config = yaml.safe_load(f) if config and config.get("checkpoint_path"): required_model_files.add(config["checkpoint_path"]) if config and config.get("spatial_upscaler_model_path"): required_model_files.add(config["spatial_upscaler_model_path"]) except Exception as e: print(f"AVISO: Falha ao ler o arquivo de configuração {cfg_path}: {e}") if not required_model_files: print("AVISO: Nenhum arquivo de modelo foi encontrado nos arquivos de configuração. Verifique os configs.") return print(f"Modelos necessários encontrados: {required_model_files}") MODELS_ROOT.mkdir(exist_ok=True) for model_filename in required_model_files: local_path = MODELS_ROOT / model_filename if local_path.exists(): print(f"Modelo '{model_filename}' já existe localmente. Pulando.") else: print(f"Baixando modelo '{model_filename}'...") try: hf_hub_download( repo_id=LTX_REPO_ID, filename=model_filename, local_dir=str(MODELS_ROOT), local_dir_use_symlinks=False, token=os.getenv("HF_TOKEN") ) print(f"'{model_filename}' baixado com sucesso.") except Exception as e: print(f"ERRO: Falha ao baixar '{model_filename}'. Verifique o nome do arquivo e a conexão. Erro: {e}") def main(): print("--- Iniciando Setup Completo do Ambiente ADUC-SDR ---") DEPS_DIR.mkdir(exist_ok=True) # Executa as etapas na ordem correta clone_repos() install_ltx_dependencies() download_ltx_models() print("\n--- ✅ Setup do Ambiente Concluído com Sucesso! ---") print("Todos os repositórios, dependências e modelos estão prontos.") if __name__ == "__main__": main()