diff --git a/download.py b/download.py index 591bd7e..8932344 100644 --- a/download.py +++ b/download.py @@ -49,6 +49,19 @@ def login(session: requests.Session, email: str, password: str) -> bool: return True +def parse_module_filter(arg: str) -> set[int]: + """Parse module filter like '1-3' or '4,5' or '1-3,5' into a set of 1-based indices.""" + result = set() + for part in arg.split(","): + part = part.strip() + if "-" in part: + a, b = part.split("-", 1) + result.update(range(int(a), int(b) + 1)) + else: + result.add(int(part)) + return result + + def discover_modules(session: requests.Session) -> list[dict]: """Fetch course page and return list of {name, url, module_id}.""" resp = session.get(COURSE_URL) @@ -157,6 +170,14 @@ def main(): log.error("Set COURSE_USERNAME and COURSE_PASSWORD in .env") sys.exit(1) + # Parse --modules filter (e.g. "4-5" or "1,3,5") + module_filter = None + if "--modules" in sys.argv: + idx = sys.argv.index("--modules") + if idx + 1 < len(sys.argv): + module_filter = parse_module_filter(sys.argv[idx + 1]) + log.info(f"Module filter: {sorted(module_filter)}") + AUDIO_DIR.mkdir(exist_ok=True) session = requests.Session() @@ -185,7 +206,10 @@ def main(): skipped = 0 failed = 0 - for mod in modules: + for mod_idx, mod in enumerate(modules, 1): + if module_filter and mod_idx not in module_filter: + log.info(f" Skipping module {mod_idx}: {mod['name']}") + continue lectures = discover_lectures(session, mod) module_entry = { "name": mod["name"], diff --git a/run.bat b/run.bat index 1a65c54..24bbe5a 100644 --- a/run.bat +++ b/run.bat @@ -265,7 +265,12 @@ echo Done. echo. echo [3/4] Downloading audio files... echo ============================================================ -.venv\Scripts\python download.py +if "%~1"=="" ( + .venv\Scripts\python download.py +) else ( + echo Modules filter: %~1 + .venv\Scripts\python download.py --modules %~1 +) if errorlevel 1 ( echo. echo WARNING: Some downloads failed. Check download_errors.log