#!/usr/bin/env python3 """ R2 Upload Script - Command line tool for uploading files to R2/S3 Usage: python3 r2-upload.py [--key path] [--bucket name] [--public] """ import argparse import os import sys from upload import R2UploadError, upload_file def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( description=( "Upload files to R2/S3-compatible storage and return a URL. " "If no key is provided, uses YYYY/MM/DD/." ), formatter_class=argparse.RawDescriptionHelpFormatter, epilog=( "Examples:\n" " python3 scripts/r2-upload.py ./photo.jpg --public\n" " python3 scripts/r2-upload.py ./photo.jpg --key images/2026/02/05/photo.jpg --public\n" " python3 scripts/r2-upload.py ./report.pdf --key reports/2026/02/05/report.pdf\n" " python3 scripts/r2-upload.py ./image.png --key-prefix images/2026/02/05 --public\n" ), ) parser.add_argument("file", help="File to upload") parser.add_argument("--key", help="Custom key/path for the file") parser.add_argument("--key-prefix", help="Prefix to prepend to the file name") parser.add_argument("--bucket", help="Bucket to use") parser.add_argument("--expires", type=int, default=300, help="Presigned URL expiration (seconds)") parser.add_argument("--content-type", help="Override content type") parser.add_argument("--cache-control", help="Set Cache-Control header") parser.add_argument("--content-disposition", help="Set Content-Disposition header") parser.add_argument("--timeout", type=int, default=60, help="Request timeout (seconds)") return parser def main() -> None: parser = build_parser() args = parser.parse_args() if args.key and args.key_prefix: parser.error("--key and --key-prefix are mutually exclusive") if not os.path.isfile(args.file): parser.error(f"File not found: {args.file}") try: url = upload_file( local_path=args.file, key=args.key, key_prefix=args.key_prefix, bucket=args.bucket, expires=args.expires, timeout=args.timeout, content_type=args.content_type, cache_control=args.cache_control, content_disposition=args.content_disposition, ) print(url) except R2UploadError as exc: print(f"Error: {exc}", file=sys.stderr) sys.exit(1) except Exception as exc: print(f"Unexpected error: {exc}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()