resolvendo dependencias dos projetos
This commit is contained in:
1 parent
71fcba3387
commit
5caf4aa164
7 files changed
+2578
-98
No files matched your search
@@ -13,19 +13,11 @@ from werkzeug.utils import secure_filename
|
||||
|
||||
# Importa suas funções e configurações existentes
|
||||
from main import process_single_file, rebuild_indexes, generate_manifests, slugify
|
||||
from utils import MMP_FOLDER, MMPZ_FOLDER, CERT_PATH, KEY_PATH, BASE_DATA, SRC_MMPSEARCH, SAMPLE_SRC, METADATA_FOLDER
|
||||
from utils import ALLOWED_EXTENSIONS, ALLOWED_SAMPLE_EXTENSIONS, MMP_FOLDER, MMPZ_FOLDER, CERT_PATH, KEY_PATH, BASE_DATA, SRC_MMPSEARCH, SAMPLE_SRC, METADATA_FOLDER, XML_IMPORTED_PATH_PREFIX, SAMPLE_MANIFEST
|
||||
|
||||
app = Flask(__name__)
|
||||
CORS(app)
|
||||
|
||||
ALLOWED_EXTENSIONS = {"mmp", "mmpz"}
|
||||
ALLOWED_SAMPLE_EXTENSIONS = {'wav', 'mp3', 'ogg', 'flac', 'ds'}
|
||||
|
||||
# --- CONFIGURAÇÕES ---
|
||||
MANIFEST_PATH = os.path.join(METADATA_FOLDER, "samples-manifest.json")
|
||||
XML_IMPORTED_PATH_PREFIX = "src_mmpSearch/samples/imported"
|
||||
PHYSICAL_IMPORTED_FOLDER = os.path.join(SAMPLE_SRC, "imported")
|
||||
|
||||
def allowed_file(filename):
|
||||
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
|
||||
|
||||
@@ -43,10 +35,10 @@ def run_jekyll_build():
|
||||
|
||||
def load_manifest_keys():
|
||||
"""Carrega as pastas de fábrica (keys do manifesto)."""
|
||||
if not os.path.exists(MANIFEST_PATH):
|
||||
if not os.path.exists(SAMPLE_MANIFEST):
|
||||
return ["drums", "instruments", "effects", "presets", "samples"]
|
||||
try:
|
||||
with open(MANIFEST_PATH, 'r', encoding='utf-8') as f:
|
||||
with open(SAMPLE_MANIFEST, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
return list(data.keys())
|
||||
except Exception:
|
||||
@@ -173,46 +165,56 @@ def analyze_mmp_dependencies(mmp_filename):
|
||||
|
||||
return len(missing_samples) == 0, list(missing_samples)
|
||||
|
||||
def update_xml_paths(mmp_filename, file_map):
|
||||
def update_xml_paths_exact(mmp_filename, replacements):
|
||||
"""
|
||||
Atualiza os caminhos no XML para apontar para a pasta imported.
|
||||
Substitui caminhos no XML baseando-se no mapeamento exato:
|
||||
replacements = { 'nome_original_no_xml.wav': 'novo_nome_seguro.wav' }
|
||||
"""
|
||||
filepath = os.path.join(MMP_FOLDER, mmp_filename)
|
||||
|
||||
try:
|
||||
tree = ET.parse(filepath)
|
||||
root = tree.getroot()
|
||||
factory_folders = load_manifest_keys()
|
||||
changes_made = False
|
||||
|
||||
# Normaliza as chaves para minúsculo para garantir o match
|
||||
# Ex: {'Kick.wav': 'kick.wav'} -> {'kick.wav': 'kick.wav'}
|
||||
replacements_lower = {k.lower(): v for k, v in replacements.items()}
|
||||
|
||||
for audio_node in root.findall(".//audiofileprocessor"):
|
||||
src = audio_node.get('src', '')
|
||||
if not src: continue
|
||||
|
||||
is_factory = any(src.startswith(folder + "/") for folder in factory_folders)
|
||||
is_already_imported = src.startswith(XML_IMPORTED_PATH_PREFIX)
|
||||
# Pega o nome do arquivo que está atualmente no XML
|
||||
current_basename = os.path.basename(src)
|
||||
current_basename_lower = current_basename.lower()
|
||||
|
||||
if not is_factory and not is_already_imported:
|
||||
base_name = os.path.basename(src)
|
||||
# Verifica se esse nome está na lista de substituições
|
||||
if current_basename_lower in replacements_lower:
|
||||
new_filename = replacements_lower[current_basename_lower]
|
||||
|
||||
# Verifica se temos esse arquivo mapeado (upload do usuário)
|
||||
if base_name in file_map:
|
||||
safe_name = file_map[base_name]
|
||||
new_src = f"{XML_IMPORTED_PATH_PREFIX}/{safe_name}"
|
||||
audio_node.set('src', new_src)
|
||||
audio_node.set('vol', audio_node.get('vol', '1'))
|
||||
changes_made = True
|
||||
print(f"Path corrigido: {base_name} -> {new_src}")
|
||||
# Constrói o novo caminho completo
|
||||
new_src = f"{XML_IMPORTED_PATH_PREFIX}/{new_filename}"
|
||||
|
||||
# Aplica a alteração
|
||||
audio_node.set('src', new_src)
|
||||
audio_node.set('vol', audio_node.get('vol', '1')) # Garante volume
|
||||
|
||||
print(f"[XML FIX] Substituído: {current_basename} -> {new_src}")
|
||||
changes_made = True
|
||||
|
||||
if changes_made:
|
||||
tree.write(filepath, encoding='UTF-8', xml_declaration=True)
|
||||
print(f"Projeto {mmp_filename} atualizado com novos caminhos.")
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Erro ao atualizar XML: {e}")
|
||||
return False
|
||||
print(f"Projeto {mmp_filename} salvo com novos caminhos.")
|
||||
return True
|
||||
else:
|
||||
print("Aviso: Nenhum caminho foi alterado no XML (match não encontrado).")
|
||||
return True # Retorna True para não travar o processo, mas avisa no log
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erro crítico ao editar XML: {e}")
|
||||
return False
|
||||
|
||||
# --- ROTAS ---
|
||||
|
||||
@app.route("/api/upload", methods=["POST"])
|
||||
@@ -289,43 +291,59 @@ def upload_file():
|
||||
|
||||
return jsonify({"error": "Tipo de arquivo não permitido"}), 400
|
||||
|
||||
|
||||
@app.route("/api/upload/resolve", methods=["POST"])
|
||||
def resolve_samples():
|
||||
"""
|
||||
Recebe o nome do arquivo .mmp (já existente no servidor) e os samples.
|
||||
Recebe inputs onde:
|
||||
name="nome_original.wav" (chave) -> value=Arquivo (conteúdo)
|
||||
"""
|
||||
project_filename = request.form.get('project_file') # Espera o nome .mmp
|
||||
uploaded_files = request.files.getlist("sample_files")
|
||||
project_filename = request.form.get('project_file') # Nome do .mmp
|
||||
|
||||
if not project_filename:
|
||||
return jsonify({"error": "Nome do projeto não informado"}), 400
|
||||
|
||||
if not project_filename or not uploaded_files:
|
||||
return jsonify({"error": "Dados incompletos"}), 400
|
||||
# Cria pasta imported
|
||||
os.makedirs(XML_IMPORTED_PATH_PREFIX, exist_ok=True)
|
||||
try:
|
||||
os.chmod(XML_IMPORTED_PATH_PREFIX, 0o775)
|
||||
except: pass
|
||||
|
||||
# Garante pasta
|
||||
os.makedirs(PHYSICAL_IMPORTED_FOLDER, exist_ok=True)
|
||||
os.chmod(PHYSICAL_IMPORTED_FOLDER, 0o775)
|
||||
# Dicionário de substituição: { 'Original.wav': 'Novo_Seguro.wav' }
|
||||
replacements = {}
|
||||
|
||||
file_map = {}
|
||||
|
||||
# 1. Salva os samples
|
||||
for file in uploaded_files:
|
||||
if file and allowed_sample(file.filename):
|
||||
clean_sample_name = secure_filename(file.filename)
|
||||
save_path = os.path.join(PHYSICAL_IMPORTED_FOLDER, clean_sample_name)
|
||||
# request.files é um dicionário imutável, iteramos sobre ele
|
||||
for original_name, file_storage in request.files.items():
|
||||
if file_storage and allowed_sample(file_storage.filename):
|
||||
|
||||
file.save(save_path)
|
||||
os.chmod(save_path, 0o664)
|
||||
# 1. Salva o arquivo fisicamente
|
||||
# Usamos secure_filename no arquivo NOVO para evitar problemas no disco
|
||||
safe_new_name = secure_filename(file_storage.filename)
|
||||
|
||||
# Mapeia nome original -> nome salvo
|
||||
file_map[file.filename] = clean_sample_name
|
||||
file_map[clean_sample_name] = clean_sample_name # Fallback
|
||||
# Se secure_filename deixou vazio (ex: "???"), gera um nome
|
||||
if not safe_new_name:
|
||||
safe_new_name = f"sample_{int(time.time())}.wav"
|
||||
|
||||
# 2. Atualiza o XML (.mmp)
|
||||
if update_xml_paths(project_filename, file_map):
|
||||
# 3. Processa e Builda
|
||||
save_path = os.path.join(XML_IMPORTED_PATH_PREFIX, safe_new_name)
|
||||
file_storage.save(save_path)
|
||||
|
||||
try:
|
||||
os.chmod(save_path, 0o664)
|
||||
except: pass
|
||||
|
||||
# 2. Mapeia para substituição no XML
|
||||
# A chave 'original_name' vem do `name` do input HTML, que definimos como o nome original
|
||||
replacements[original_name] = safe_new_name
|
||||
|
||||
if not replacements:
|
||||
return jsonify({"error": "Nenhum arquivo válido enviado."}), 400
|
||||
|
||||
# 3. Atualiza o XML
|
||||
if update_xml_paths_exact(project_filename, replacements):
|
||||
# 4. Processa (Gera WAV na pasta correta e JSON)
|
||||
return process_and_build(project_filename)
|
||||
else:
|
||||
return jsonify({"error": "Falha ao atualizar referências no projeto."}), 500
|
||||
return jsonify({"error": "Falha ao atualizar o arquivo de projeto."}), 500
|
||||
|
||||
|
||||
def process_and_build(filename):
|
||||
"""Encapsula a chamada do main.py"""
|
||||
|
||||
@@ -15,6 +15,7 @@ SAMPLE_MANIFEST = os.path.join(BASE_PATH, "src_mmpSearch", "metadata", "samples-
|
||||
SAMPLE_SRC = os.path.join(SRC_MMPSEARCH, "samples")
|
||||
MMP_MANIFEST = os.path.join(BASE_PATH, "src_mmpSearch", "metadata", "mmp-manifest.json")
|
||||
DATA_FOLDER = os.path.join(BASE_DATA, "_data")
|
||||
XML_IMPORTED_PATH_PREFIX = os.path.join(SAMPLE_SRC, "imported")
|
||||
SAMPLE_MANIFEST_DATA = os.path.join(DATA_FOLDER, "samples-manifest.json")
|
||||
LOG_FOLDER = os.path.join(SRC_MMPSEARCH, "logs", "handler_logs")
|
||||
CERT_PATH = "/etc/letsencrypt/live/alice.ufsj.edu.br/fullchain.pem"
|
||||
@@ -96,6 +97,9 @@ SUPPORTED_PLUGINS = [
|
||||
"zynaddsubfx",
|
||||
]
|
||||
|
||||
ALLOWED_EXTENSIONS = {"mmp", "mmpz"}
|
||||
ALLOWED_SAMPLE_EXTENSIONS = {'wav', 'mp3', 'ogg', 'flac', 'ds'}
|
||||
|
||||
tags = {}
|
||||
tags["TAG"] = []
|
||||
tags["plugin"] = []
|
||||
|
||||
Reference in new issue
Block a user