"""Add torrent use case.""" import logging from infrastructure.api.qbittorrent import ( QBittorrentAPIError, QBittorrentAuthError, QBittorrentClient, ) from .dto import AddTorrentResponse logger = logging.getLogger(__name__) class AddTorrentUseCase: """ Use case for adding a torrent to qBittorrent. This orchestrates the qBittorrent API client to add torrents. """ def __init__(self, qbittorrent_client: QBittorrentClient): """ Initialize use case. Args: qbittorrent_client: qBittorrent API client """ self.qbittorrent_client = qbittorrent_client def execute(self, magnet_link: str) -> AddTorrentResponse: """ Add a torrent to qBittorrent using a magnet link. Args: magnet_link: Magnet link of the torrent to add Returns: AddTorrentResponse with success or error information """ try: # Validate magnet link if not magnet_link or not isinstance(magnet_link, str): raise ValueError("Magnet link must be a non-empty string") if not magnet_link.startswith("magnet:"): raise ValueError("Invalid magnet link format") logger.info("Adding torrent to qBittorrent") # Add torrent to qBittorrent success = self.qbittorrent_client.add_torrent(magnet_link) if success: logger.info("Torrent added successfully to qBittorrent") return AddTorrentResponse( status="ok", message="Torrent added successfully to qBittorrent" ) else: logger.warning("Failed to add torrent to qBittorrent") return AddTorrentResponse( status="error", error="add_failed", message="Failed to add torrent to qBittorrent", ) except QBittorrentAuthError as e: logger.error(f"qBittorrent authentication error: {e}") return AddTorrentResponse( status="error", error="authentication_failed", message="Failed to authenticate with qBittorrent", ) except QBittorrentAPIError as e: logger.error(f"qBittorrent API error: {e}") return AddTorrentResponse(status="error", error="api_error", message=str(e)) except ValueError as e: logger.error(f"Validation error: {e}") return AddTorrentResponse( status="error", error="validation_failed", message=str(e) )