import os import json # --- Configuração de Caminhos Dinâmicos --- # Descobre o caminho absoluto do script que está sendo executado. # __file__ é uma variável especial do Python que contém o caminho para o arquivo atual. SCRIPT_PATH = os.path.abspath(__file__) # Descobre o diretório onde o script está (ex: /.../mmpSearch/scripts/creation) SCRIPT_DIR = os.path.dirname(SCRIPT_PATH) # Define a raiz do projeto subindo dois níveis de diretório (de 'creation' para 'scripts', e de 'scripts' para 'mmpSearch') PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..')) print(f"Raiz do projeto detectada em: {PROJECT_ROOT}") # --- Configuração dos Manifestos --- # Os caminhos aqui são relativos à RAIZ DO PROJETO. CONFIGS = [ { "source_dir": "src/samples", "output_file": "metadata/samples-manifest.json", "scan_type": "tree" }, { "source_dir": "mmp", "output_file": "metadata/mmp-manifest.json", "scan_type": "list", "extensions": ['.mmp', '.mmpz'] } ] def scan_directory_tree(path): """ Função recursiva que escaneia um diretório e constrói uma estrutura de dicionário (árvore) representando as pastas e arquivos. """ tree = {} if not os.path.isdir(path): return tree for item in os.listdir(path): full_path = os.path.join(path, item) if os.path.isdir(full_path): tree[item] = scan_directory_tree(full_path) else: # (CORREÇÃO) Volte a usar o objeto que o JavaScript espera. tree[item] = {"_isFile": True} return tree def scan_directory_list(path, allowed_extensions): """ Função que escaneia um diretório e retorna uma lista simples de nomes de arquivos, filtrando por extensões permitidas. """ file_list = [] if not os.path.isdir(path): # Adiciona verificação return file_list for item in os.listdir(path): full_path = os.path.join(path, item) if os.path.isfile(full_path) and any(item.lower().endswith(ext) for ext in allowed_extensions): file_list.append(item) return sorted(file_list) # --- Execução Principal do Script --- if __name__ == "__main__": print("\nIniciando geração de arquivos de manifesto...") for config in CONFIGS: # Monta os caminhos ABSOLUTOS usando a raiz do projeto source_dir_abs = os.path.join(PROJECT_ROOT, config["source_dir"]) output_file_abs = os.path.join(PROJECT_ROOT, config["output_file"]) scan_type = config["scan_type"] print(f"\nProcessando '{config['source_dir']}' -> '{config['output_file']}'...") if not os.path.isdir(source_dir_abs): print(f"AVISO: A pasta de origem '{source_dir_abs}' não foi encontrada. Arquivo não será gerado.") continue result_data = None try: if scan_type == "tree": result_data = scan_directory_tree(source_dir_abs) elif scan_type == "list": extensions = config.get("extensions", []) result_data = scan_directory_list(source_dir_abs, extensions) if result_data is not None: # Garante que o diretório de saída exista antes de salvar output_dir = os.path.dirname(output_file_abs) os.makedirs(output_dir, exist_ok=True) with open(output_file_abs, 'w', encoding='utf-8') as f: json.dump(result_data, f, indent=2, ensure_ascii=False) print(f"SUCESSO: Arquivo '{output_file_abs}' gerado!") except Exception as e: print(f"ERRO inesperado ao processar a pasta '{source_dir_abs}': {e}") print("\nGeração de manifestos concluída.")