fix: keyframe images, video clips, evidence images, live stream webcam+URL, remove demo mode
fd50325 verified | """ | |
| S3-compatible Storage Setup and Test Script for DetectifAI (Backblaze B2) | |
| """ | |
| from minio import Minio | |
| from dotenv import load_dotenv | |
| import os | |
| import logging | |
| # Set up logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # Load environment variables | |
| load_dotenv() | |
| def setup_minio(): | |
| """Setup S3-compatible storage (Backblaze B2)""" | |
| try: | |
| endpoint = os.getenv('MINIO_ENDPOINT', 's3.eu-central-003.backblazeb2.com') | |
| access_key = os.getenv('MINIO_ACCESS_KEY', '00367479ffb7e4e0000000001') | |
| secret_key = os.getenv('MINIO_SECRET_KEY', 'K003opTvf92ijRj5dM7H1dgrlwcGTdA') | |
| secure = os.getenv('MINIO_SECURE', 'true').lower() == 'true' | |
| region = os.getenv('MINIO_REGION', 'eu-central-003') | |
| # S3 client setup | |
| client = Minio( | |
| endpoint, | |
| access_key=access_key, | |
| secret_key=secret_key, | |
| secure=secure, | |
| region=region or None | |
| ) | |
| # Define required buckets | |
| buckets = [ | |
| "detectifai-videos", # Original and compressed videos | |
| "detectifai-keyframes", # Extracted keyframes | |
| "detectifai-reports" # Generated reports (HTML/PDF) | |
| ] | |
| # Verify buckets exist (don't create β buckets managed in B2 dashboard) | |
| for bucket in buckets: | |
| found = client.bucket_exists(bucket) | |
| if found: | |
| logger.info(f"β Bucket exists: {bucket}") | |
| else: | |
| logger.warning(f"β οΈ Bucket NOT found: {bucket} β create it in Backblaze B2 dashboard") | |
| # Test upload to each bucket | |
| test_data = b"DetectifAI Test Data" | |
| for bucket in buckets: | |
| try: | |
| test_object = f"test_{bucket}.txt" | |
| client.put_object( | |
| bucket, | |
| test_object, | |
| bytes(test_data), | |
| len(test_data) | |
| ) | |
| logger.info(f"β Test upload successful to {bucket}") | |
| # Clean up test file | |
| client.remove_object(bucket, test_object) | |
| except Exception as bucket_error: | |
| logger.error(f"β Failed to upload test file to {bucket}: {str(bucket_error)}") | |
| # List objects in each bucket | |
| logger.info("\nCurrent bucket contents:") | |
| for bucket in buckets: | |
| logger.info(f"\nBucket: {bucket}") | |
| try: | |
| objects = client.list_objects(bucket, recursive=True) | |
| for obj in objects: | |
| logger.info(f"- {obj.object_name} (size: {obj.size} bytes)") | |
| except Exception as list_error: | |
| logger.error(f"β Failed to list objects in {bucket}: {str(list_error)}") | |
| return True, "MinIO setup completed successfully" | |
| except Exception as e: | |
| error_message = f"MinIO setup failed: {str(e)}" | |
| logger.error(f"β {error_message}") | |
| return False, error_message | |
| if __name__ == "__main__": | |
| success, message = setup_minio() | |
| if success: | |
| logger.info("β MinIO setup completed successfully!") | |
| else: | |
| logger.error(f"β MinIO setup failed: {message}") |