import os import logging from huggingface_hub import HfApi logger = logging.getLogger(__name__) HF_TOKEN = os.getenv("HF_TOKEN") HF_STORAGE_REPO = os.getenv("HF_STORAGE_REPO", "Isaac105/melodix-stems") def get_hf_api(): if not HF_TOKEN: logger.warning("Falta variable de entorno HF_TOKEN. Operaciones de Hugging Face desactivadas.") return None return HfApi(token=HF_TOKEN) def upload_to_hf(file_path: str, object_name: str) -> str: """ Sube un archivo local al dataset de Hugging Face y retorna su URL pública de descarga. Lanza una excepción si HF_TOKEN no está configurado o si la subida falla. """ api = get_hf_api() if not api: raise RuntimeError( f"HF_TOKEN no está configurado en las variables de entorno. " f"No se puede subir '{object_name}' a Hugging Face Dataset '{HF_STORAGE_REPO}'." ) try: api.upload_file( path_or_fileobj=file_path, path_in_repo=object_name, repo_id=HF_STORAGE_REPO, repo_type="dataset" ) public_url = get_hf_download_url(object_name) logger.info(f"Archivo subido a Hugging Face Dataset: {object_name}. URL: {public_url}") return public_url except Exception as e: logger.error(f"Error subiendo archivo {object_name} a Hugging Face: {e}") raise e def delete_from_hf(object_name: str): """ Elimina un archivo del dataset de Hugging Face. """ api = get_hf_api() if not api: logger.warning(f"[Mock HF] Eliminando {object_name}") return try: api.delete_file( path_in_repo=object_name, repo_id=HF_STORAGE_REPO, repo_type="dataset" ) logger.info(f"Archivo eliminado de Hugging Face Dataset: {object_name}") except Exception as e: if "EntryNotFound" in str(e) or "404" in str(e): logger.info(f"El archivo {object_name} no existía en Hugging Face. Ignorado.") else: logger.error(f"Error eliminando de Hugging Face ({object_name}): {e}") def delete_folder_from_hf(prefix: str): """ Elimina una carpeta completa (ej. stems/task_id/) del dataset de Hugging Face. """ api = get_hf_api() if not api: logger.warning(f"[Mock HF] Eliminando carpeta con prefijo: {prefix}") return try: api.delete_folder( folder_path=prefix, repo_id=HF_STORAGE_REPO, repo_type="dataset" ) logger.info(f"Carpeta eliminada de Hugging Face Dataset: {prefix}") except Exception as e: if "EntryNotFound" in str(e) or "404" in str(e): logger.info(f"La carpeta {prefix} no existía en Hugging Face. Ignorado.") else: logger.error(f"Error eliminando carpeta '{prefix}' de Hugging Face: {e}") def get_hf_download_url(object_name: str) -> str: """ Devuelve la URL de descarga directa pública para un objeto en el dataset de Hugging Face. """ return f"https://huggingface.co/datasets/{HF_STORAGE_REPO}/resolve/main/{object_name}"