THOR / plugins /direct.py
ElJoker63's picture
Actualizar worker y configuración
b90715b verified
Raw History Blame Contribute Delete
1.94 kB
import logging
import os
import re
from typing import Optional
from plugins.common import DownloadCancelled
from plugins.direct_link import DirectLinkError, is_supported_direct_host, resolve_direct_link
from plugins.stream import download_stream_url
logger = logging.getLogger("hf_worker.plugins.direct")
def download_direct(
url: str,
output_dir: str,
custom_name: Optional[str] = None,
progress_fn=None,
cancel_event=None
) -> str:
"""Descarga cualquier enlace directo HTTP/HTTPS por streaming para el worker, resolviendo hosts soportados."""
if cancel_event and cancel_event.is_set():
raise DownloadCancelled()
download_url = url
headers = {}
if is_supported_direct_host(url):
logger.info(f"Resolviendo enlace multi-host: {url}")
try:
download_url, headers = resolve_direct_link(url)
logger.info(f"Enlace resuelto con éxito: {download_url[:80]}...")
except DirectLinkError as e:
logger.warning(f"Error resolviendo host ({e}), intentando con URL original...")
download_url = url
clean_name = None
if custom_name:
clean_name = str(custom_name).strip()
if clean_name.startswith(("http://", "https://", "ftp://")) or "://" in clean_name:
clean_name = None
else:
clean_name = os.path.basename(clean_name).strip()
clean_name = re.sub(r'[\/\\:\*\?"<>\|\x00-\x1f]', '_', clean_name).strip(' ._')
if not clean_name or clean_name in ("downloaded_file", "archivo"):
clean_name = None
if clean_name:
out_target = os.path.join(output_dir, clean_name)
else:
out_target = output_dir
dl_file, _ = download_stream_url(
download_url,
out_target,
progress_fn=progress_fn,
cancel_event=cancel_event,
headers=headers if headers else None,
)
return dl_file