import logging import time from typing import Any from app.service.task.base_task import BaseTask from app.service.task.task_param import TaskParam from app.service.task.task_result import TaskResult from app.util.download_util import download_files logger = logging.getLogger(__name__) class FileDownloadTask(BaseTask): def get_type(self) -> str: return "file_download" def execute(self, param: TaskParam) -> TaskResult: try: files_obj = param.inputs.get("files") files: list[str] = files_obj if isinstance(files_obj, list) else [] if not files: return TaskResult.failure("No files provided for download") if not param.workspace: return TaskResult.failure("Workspace path is not provided") logger.info("[file_download] Starting: %d files to download, workspace=%s", len(files), param.workspace) t0 = time.time() downloaded = download_files(files, param.workspace, param.step_id) elapsed = time.time() - t0 if not downloaded: logger.warning("[file_download] No files were successfully downloaded in %.2fs", elapsed) return TaskResult.failure("No files were successfully downloaded") logger.info("[file_download] Completed: %d/%d files downloaded in %.2fs", len(downloaded), len(files), elapsed) return TaskResult.success({"files": downloaded}) except Exception as e: logger.error("[file_download] Error: %s", e, exc_info=True) return TaskResult.failure(f"File download failed: {e}")