"""Upload COMP2211 course-library PDFs to Supabase Storage. Run from the backend directory: uv run python upload_course_library_pdfs.py Each entry maps a storage path (inside the `papers` bucket) to the local source file under pastpaper-scraper/papers/COMP2211/. """ from __future__ import annotations import sys from pathlib import Path # --------------------------------------------------------------------------- # Manifest: (storage_path, local_filename) # storage_path is relative inside the `papers` bucket. # local_filename is relative to PAPERS_DIR below. # --------------------------------------------------------------------------- MANIFEST: list[tuple[str, str]] = [ ( "course-library/COMP2211/COMP2211-2022-fall-midterm/paper.pdf", "(COMP2211)[2022](f)midterm~=yjz8dxdd^_27002.pdf", ), ( "course-library/COMP2211/COMP2211-2022-fall-midterm/answer.pdf", "(COMP2211)[2022](f)midterm~=yjz8dxdd^_18747.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-midterm/paper.pdf", "(COMP2211)[2022](s)midterm~=b8bidkgs^_14629.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-midterm/answer.pdf", "(COMP2211)[2022](s)midterm~=6ma030^_89587.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-final-part-a/paper.pdf", "(COMP2211)[2022](s)final~=b8bidkgs^_33018.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-final-part-a/answer.pdf", "(COMP2211)[2022](s)final~=ajou6^_82011.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-final-part-b/paper.pdf", "(COMP2211)[2022](s)final~=b8bidkgs^_40627.pdf", ), ( "course-library/COMP2211/COMP2211-2022-spring-final-part-b/answer.pdf", "(COMP2211)[2022](s)final~=ajou6^_51199.pdf", ), ( "course-library/COMP2211/COMP2211-2023-spring-midterm/paper.pdf", "(COMP2211)[2023](s)midterm~=bxbidkmj^_26587.pdf", ), ( "course-library/COMP2211/COMP2211-2023-spring-midterm/answer.pdf", "(COMP2211)[2023](s)midterm~clchanbg^_17297.pdf", ), ( "course-library/COMP2211/COMP2211-2024-spring-midterm/paper.pdf", "(COMP2211)[2024](s)midterm~=rcidkjgf^_82003.pdf", ), ( "course-library/COMP2211/COMP2211-2024-spring-midterm/answer.pdf", "(COMP2211)[2024](s)midterm~=ubrzkjmz^_90406.pdf", ), ( "course-library/COMP2211/COMP2211-2024-spring-final/paper.pdf", "(COMP2211)[2024](s)final~=igk5mmg^_90365.pdf", ), ( "course-library/COMP2211/COMP2211-2024-spring-final/answer.pdf", "(COMP2211)[2024](s)final~=igk5mmg^_58857.pdf", ), ] PAPERS_DIR = ( Path(__file__).parent.parent / "pastpaper-scraper" / "papers" / "COMP2211" ) def main() -> None: from app.services.supabase_client import get_supabase sb = get_supabase() bucket = sb.storage.from_("papers") ok = 0 skipped = 0 failed = 0 for storage_path, local_name in MANIFEST: local_file = PAPERS_DIR / local_name if not local_file.exists(): print(f" MISSING local file: {local_name}") failed += 1 continue data = local_file.read_bytes() try: bucket.upload( storage_path, data, file_options={"content-type": "application/pdf", "upsert": "true"}, ) print(f" OK {storage_path}") ok += 1 except Exception as exc: print(f" ERR {storage_path}: {exc}") failed += 1 print(f"\nDone: {ok} uploaded, {skipped} skipped, {failed} failed.") if __name__ == "__main__": main()