resolvendo dependencias dos projetos

This commit is contained in:
JotaChina committed 2025-12-08 18:13:30 -03:00
1 parent 5caf4aa164
commit b5e8e685b9
5 files changed
+136 -16

No files matched your search

+83 -4
View File
@@ -3,15 +3,15 @@ import subprocess
import xml.etree.ElementTree as ET
import gzip
import zipfile
import zlib # <--- IMPORTANTE: Adicionado para suporte a mmpz raw
import zlib
import json
import shutil
import time
from flask import Flask, request, jsonify
import io
from flask import Flask, request, jsonify, send_file
from flask_cors import CORS
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 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
@@ -217,6 +217,85 @@ def update_xml_paths_exact(mmp_filename, replacements):
# --- ROTAS ---
@app.route("/api/download/<project_name>", methods=["GET"])
def download_project_package(project_name):
"""
Gera um ZIP contendo o arquivo .mmp e apenas os samples importados necessários.
Estrutura do ZIP:
- projeto.mmp
- src_mmpSearch/
- samples/
- imported/
- sample1.wav
- sample2.wav
"""
# Garante que estamos pegando o .mmp (mesmo que peçam sem extensão)
if not project_name.endswith('.mmp'):
project_name += '.mmp'
clean_name = secure_filename(project_name)
mmp_path = os.path.join(MMP_FOLDER, clean_name)
if not os.path.exists(mmp_path):
return jsonify({"error": "Projeto não encontrado"}), 404
# Prepara o buffer do ZIP na memória (não salva no disco para economizar I/O)
memory_file = io.BytesIO()
try:
with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf:
# 1. Adiciona o arquivo .mmp na RAIZ do ZIP
# arcname é o nome que o arquivo terá dentro do zip
zf.write(mmp_path, arcname=clean_name)
# 2. Lê o XML para descobrir quais samples incluir
tree = ET.parse(mmp_path)
root = tree.getroot()
# Conjunto para evitar adicionar o mesmo sample 2x
samples_to_pack = set()
for audio_node in root.findall(".//audiofileprocessor"):
src = audio_node.get('src', '')
# Verifica se é um sample importado (nosso padrão)
# O src no XML já deve estar como: src_mmpSearch/samples/imported/nome.wav
if src.startswith(XML_IMPORTED_PATH_PREFIX):
# Extrai apenas o nome do arquivo (ex: kick.wav)
sample_filename = os.path.basename(src)
samples_to_pack.add(sample_filename)
# 3. Adiciona os samples encontrados ao ZIP mantendo a estrutura de pasta
for sample_name in samples_to_pack:
# Caminho físico no servidor (onde o arquivo realmente está)
physical_path = os.path.join(PHYSICAL_IMPORTED_FOLDER, sample_name)
# Caminho DENTRO do ZIP (para o LMMS ler relativo ao mmp)
# Deve ser: src_mmpSearch/samples/imported/sample.wav
zip_internal_path = f"{XML_IMPORTED_PATH_PREFIX}/{sample_name}"
if os.path.exists(physical_path):
zf.write(physical_path, arcname=zip_internal_path)
print(f"[ZIP] Adicionado: {sample_name}")
else:
print(f"[ZIP] AVISO: Sample listado no XML mas não encontrado no disco: {sample_name}")
# Finaliza o ponteiro do arquivo
memory_file.seek(0)
return send_file(
memory_file,
mimetype='application/zip',
as_attachment=True,
download_name=f"{os.path.splitext(clean_name)[0]}_pack.zip"
)
except Exception as e:
import traceback
traceback.print_exc()
return jsonify({"error": f"Erro ao gerar pacote: {str(e)}"}), 500
@app.route("/api/upload", methods=["POST"])
def upload_file():
if "project_file" not in request.files: