melodix-api / app /utils /hf_storage.py
GitHub Action
deploy from github actions
ee34d15
Raw
History Blame Contribute Delete
3.14 kB
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}"