diff --git a/chzzk/management/commands/import_chzzk_campaign_range.py b/chzzk/management/commands/import_chzzk_campaign_range.py new file mode 100644 index 0000000..178e141 --- /dev/null +++ b/chzzk/management/commands/import_chzzk_campaign_range.py @@ -0,0 +1,59 @@ +from typing import TYPE_CHECKING + +from django.core.management import BaseCommand +from django.core.management import CommandError +from django.core.management import call_command + +if TYPE_CHECKING: + import argparse + + +class Command(BaseCommand): + """Django management command to import a range of Chzzk campaigns by calling import_chzzk_campaign repeatedly.""" + + help = ( + "Import a range of Chzzk campaigns by calling import_chzzk_campaign repeatedly." + ) + + def add_arguments(self, parser: argparse.ArgumentParser) -> None: + """Add command-line arguments for the management command.""" + parser.add_argument("start", type=int, help="Starting campaign number") + parser.add_argument("end", type=int, help="Ending campaign number (inclusive)") + parser.add_argument( + "--step", + type=int, + default=None, + help="Step to move between numbers (default -1 for descending, 1 for ascending)", + ) + + def handle(self, **options) -> None: + """Main handler for the management command. Calls import_chzzk_campaign for each campaign number in the specified range. + + Raises: + ValueError: If step is 0. + """ + start: int = options["start"] + end: int = options["end"] + step: int | None = options["step"] + + if step is None: + step = -1 if start > end else 1 + + if step == 0: + msg = "Step cannot be 0" + raise ValueError(msg) + + range_end: int = end + 1 if step > 0 else end - 1 + + msg: str = f"Importing campaigns from {start} to {end} with step {step}" + self.stdout.write(self.style.SUCCESS(msg)) + + for campaign_no in range(start, range_end, step): + self.stdout.write(f"Importing campaign {campaign_no}...") + try: + call_command("import_chzzk_campaign", str(campaign_no)) + except CommandError as exc: + msg = f"Failed campaign {campaign_no}: {exc}" + self.stdout.write(self.style.ERROR(msg)) + + self.stdout.write(self.style.SUCCESS("Batch import complete."))