File size: 7,215 Bytes
ac23084
4fe2b05
 
 
 
 
 
 
ac23084
 
 
 
 
edb8974
 
ac23084
4fe2b05
34480b6
ac23084
4fe2b05
 
 
 
 
 
 
ac23084
 
b049923
ac23084
 
 
4fe2b05
 
ac23084
 
4fe2b05
 
 
 
 
 
ac23084
4fe2b05
ac23084
 
4fe2b05
edb8974
 
4fe2b05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a07fd79
4fe2b05
 
 
 
 
 
 
edb8974
 
4fe2b05
 
 
 
 
 
 
 
 
 
 
edb8974
4fe2b05
 
 
 
 
edb8974
4fe2b05
 
edb8974
 
4fe2b05
 
 
 
edb8974
4fe2b05
 
 
 
 
 
 
 
 
 
 
 
 
edb8974
 
4fe2b05
 
 
a07fd79
 
edb8974
4fe2b05
edb8974
4fe2b05
 
 
 
 
 
 
edb8974
 
4fe2b05
edb8974
 
4fe2b05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
edb8974
4fe2b05
 
 
ac23084
 
edb8974
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# setup.py
#
# Copyright (C) August 4, 2025  Carlos Rodrigues dos Santos
#
# Versão 2.3.0 (Setup Robusto e Idempotente)
# - Verifica a existência de repositórios e arquivos de modelo antes de baixar.
# - Pula downloads se os artefatos já existirem, sem gerar erros.
# - Unifica o download de todas as dependências (Git, LTX Models, SeedVR Models).

import os
import subprocess
import sys
from pathlib import Path
import yaml
from huggingface_hub import hf_hub_download

# --- Configuração Geral ---
DEPS_DIR = Path("/data")

# --- Configuração Específica LTX-Video ---
LTX_VIDEO_REPO_DIR = DEPS_DIR / "LTX-Video"

# --- Configuração Específica SeedVR ---
SEEDVR_MODELS_DIR = DEPS_DIR / "SeedVR"

# --- Repositórios para Clonar ---
REPOS_TO_CLONE = {
    "LTX-Video": "https://huggingface.co/spaces/Lightricks/ltx-video-distilled",
    "SeedVR": "https://github.com/numz/ComfyUI-SeedVR2_VideoUpscaler",
    "MMAudio": "https://github.com/hkchengrex/MMAudio.git"
}

def run_command(command, cwd=None):
    """Executa um comando no terminal e lida com erros."""
    print(f"Executando: {' '.join(command)}")
    try:
        subprocess.run(
            command,
            check=True,
            cwd=cwd,
            stdin=subprocess.DEVNULL,
        )
    except subprocess.CalledProcessError as e:
        print(f"ERRO: O comando falhou com o código de saída {e.returncode}\nStderr: {e.stderr}")
        sys.exit(1)
    except FileNotFoundError:
        print(f"ERRO: O comando '{command[0]}' não foi encontrado. Certifique-se de que o git está instalado e no seu PATH.")
        sys.exit(1)

# --- Funções de Download (LTX-Video) ---

def _load_ltx_config():
    """Carrega o arquivo de configuração YAML do LTX-Video."""
    print("--- Carregando Configuração do LTX-Video ---")
    base = LTX_VIDEO_REPO_DIR / "configs"
    candidates = [
        base / "ltxv-13b-0.9.8-dev-fp8.yaml",
        base / "ltxv-13b-0.9.8-distilled-fp8.yaml",
        base / "ltxv-13b-0.9.8-distilled.yaml",
    ]
    for cfg_path in candidates:
        if cfg_path.exists():
            print(f"Configuração encontrada: {cfg_path}")
            with open(cfg_path, "r") as file:
                return yaml.safe_load(file)
    
    fallback_path = base / "ltxv-13b-0.9.8-distilled-fp8.yaml"
    print(f"AVISO: Nenhuma configuração preferencial encontrada. Usando fallback: {fallback_path}")
    if not fallback_path.exists():
        print(f"ERRO: Arquivo de configuração fallback '{fallback_path}' não encontrado.")
        return None
        
    with open(fallback_path, "r") as file:
        return yaml.safe_load(file)

def _download_ltx_models(config):
    """Baixa os modelos principais do LTX-Video, pulando os que já existem."""
    print("\n--- Verificando Modelos do LTX-Video ---")
    LTX_REPO = "Lightricks/LTX-Video"
    
    if "checkpoint_path" not in config or "spatial_upscaler_model_path" not in config:
        print("ERRO: Chaves de modelo não encontradas no arquivo de configuração do LTX.")
        sys.exit(1)

    models_to_download = {
        config["checkpoint_path"]: "checkpoint principal",
        config["spatial_upscaler_model_path"]: "upscaler espacial"
    }
    
    # O hf_hub_download já verifica o cache, mas vamos verificar o diretório final para clareza
    # e para garantir que a lógica seja explícita.
    for filename, description in models_to_download.items():
        # A biblioteca huggingface_hub gerencia o local exato, então confiamos nela.
        # A verificação aqui é para garantir que o download seja tentado.
        print(f"Garantindo a existência do {description}: {filename}...")
        try:
            hf_hub_download(
                repo_id=LTX_REPO, filename=filename,
                local_dir=os.getenv("HF_HOME"), cache_dir=os.getenv("HF_HOME_CACHE"), token=os.getenv("HF_TOKEN")
            )
            print(f"{description.capitalize()} está disponível.")
        except Exception as e:
            print(f"ERRO ao baixar o {description}: {e}")
            sys.exit(1)


def _download_seedvr_models():
    """Baixa os modelos do SeedVR, pulando os que já existem."""
    print(f"\n--- Verificando Checkpoints do SeedVR em {SEEDVR_MODELS_DIR} ---")
    SEEDVR_MODELS_DIR.mkdir(exist_ok=True)
    
    model_files = {
        "seedvr2_ema_7b_fp16.safetensors": "MonsterMMORPG/SeedVR2_SECourses",
        "seedvr2_ema_7b_sharp_fp16.safetensors": "MonsterMMORPG/SeedVR2_SECourses",
        "seedvr2_ema_3b_fp16.safetensors": "MonsterMMORPG/SeedVR2_SECourses",
        "ema_vae_fp16.safetensors": "MonsterMMORPG/SeedVR2_SECourses",
        "pos_emb.pt": "ByteDance-Seed/SeedVR2-3B",
        "neg_emb.pt": "ByteDance-Seed/SeedVR2-3B"
    }
    
    for filename, repo_id in model_files.items():
        local_path = SEEDVR_MODELS_DIR / filename
        if not local_path.is_file(): # Verifica se é um arquivo
            print(f"Baixando {filename} de {repo_id}...")
            try:
                hf_hub_download(
                    repo_id=repo_id,
                    filename=filename,
                    local_dir=str(SEEDVR_MODELS_DIR),
                    cache_dir=os.getenv("HF_HOME_CACHE"),
                    token=os.getenv("HF_TOKEN"),
                )
                print(f"'{filename}' baixado com sucesso.")
            except Exception as e:
                print(f"ERRO ao baixar o modelo SeedVR '{filename}': {e}")
                sys.exit(1)
        else:
            print(f"Arquivo '{filename}' já existe. Pulando.")
    print("Checkpoints do SeedVR estão no local correto.")

# --- Função Principal ---

def main():
    print("--- Iniciando Setup do Ambiente ADUC-SDR (Versão Robusta) ---")
    DEPS_DIR.mkdir(exist_ok=True)
    
    # --- ETAPA 1: Clonar Repositórios ---
    print("\n--- ETAPA 1: Clonando Repositórios Git ---")
    for repo_name, repo_url in REPOS_TO_CLONE.items():
        repo_path = DEPS_DIR / repo_name
        if repo_path.is_dir(): # Verifica se é um diretório
            print(f"Repositório '{repo_name}' já existe. Pulando.")
        else:
            print(f"Clonando '{repo_name}' de {repo_url}...")
            run_command(["git", "clone", "--depth", "1", repo_url, str(repo_path)])
            print(f"'{repo_name}' clonado com sucesso.")

    # --- ETAPA 2: Baixar Modelos do LTX-Video ---
    print("\n--- ETAPA 2: Preparando Modelos LTX-Video ---")
    if not LTX_VIDEO_REPO_DIR.is_dir():
        print(f"ERRO: Diretório '{LTX_VIDEO_REPO_DIR}' não encontrado. Execute a clonagem primeiro.")
        sys.exit(1)
    
    ltx_config = _load_ltx_config()
    if ltx_config:
        _download_ltx_models(ltx_config)
    else:
        print("ERRO: Não foi possível carregar a configuração do LTX-Video. Abortando.")
        sys.exit(1)

    # --- ETAPA 3: Baixar Modelos do SeedVR ---
    print("\n--- ETAPA 3: Preparando Modelos SeedVR ---")
    _download_seedvr_models()

    print("\n\n--- Setup do Ambiente Concluído com Sucesso! ---")
    print("Todos os repositórios e modelos necessários foram verificados e estão prontos.")
    print("Você agora pode iniciar a aplicação principal.")

if __name__ == "__main__":
    main()