import click from fastanime.core.config import AppConfig from fastanime.libs.media_api.params import MediaSearchParams from fastanime.core.exceptions import FastAnimeError @click.command(help="Queue episodes for the background worker to download.") @click.option("--title", "-t", required=True, multiple=True, help="Anime title to queue.") @click.option("--episode-range", "-r", required=True, help="Range of episodes (e.g., '1-10').") @click.pass_obj def queue(config: AppConfig, title: tuple, episode_range: str): """ Searches for an anime and adds the specified episodes to the download queue. The background worker must be running for the downloads to start. """ from fastanime.cli.service.download.service import DownloadService from fastanime.cli.service.feedback import FeedbackService from fastanime.cli.utils.parser import parse_episode_range from fastanime.libs.media_api.api import create_api_client from fastanime.libs.provider.anime.provider import create_provider from fastanime.cli.service.registry import MediaRegistryService feedback = FeedbackService(config.general.icons) media_api = create_api_client(config.general.media_api, config) provider = create_provider(config.general.provider) registry = MediaRegistryService(config.general.media_api, config.media_registry) download_service = DownloadService(config, registry, media_api, provider) for anime_title in title: try: feedback.info(f"Searching for '{anime_title}'...") search_result = media_api.search_media(MediaSearchParams(query=anime_title, per_page=1)) if not search_result or not search_result.media: feedback.warning(f"Could not find '{anime_title}' on AniList.") continue media_item = search_result.media[0] available_episodes = [str(i + 1) for i in range(media_item.episodes or 0)] episodes_to_queue = list(parse_episode_range(episode_range, available_episodes)) queued_count = 0 for ep in episodes_to_queue: if download_service.add_to_queue(media_item, ep): queued_count += 1 feedback.success(f"Successfully queued {queued_count} episodes for '{media_item.title.english}'.") except FastAnimeError as e: feedback.error(f"Failed to queue '{anime_title}'", str(e)) except Exception as e: feedback.error("An unexpected error occurred", str(e))