#!/usr/bin/env python3 import click import os import sys from typing import Optional from .content_evaluator import ContentEvaluator from .report_generator import ReportGenerator @click.command() @click.option('--images-dir', '-d', required=True, help='Directory containing images to evaluate') @click.option('--guidelines', '-g', default='config/suno_guidelines.txt', help='Path to guidelines text file (default: config/suno_guidelines.txt)') @click.option('--output', '-o', default=None, help='Output file path for JSON report (default: auto-generated)') @click.option('--detailed', is_flag=True, default=False, help='Generate detailed report with full analysis data') @click.option('--single-image', '-s', default=None, help='Evaluate a single image instead of a directory') def main(images_dir: Optional[str], guidelines: str, output: Optional[str], detailed: bool, single_image: Optional[str]): """ Suno Content Evaluation Tool Analyzes images against brand guidelines using computer vision and NLP. Extracts text from images and evaluates compliance with brand voice and messaging. """ print("šŸŽµ Suno Content Evaluation Tool") print("=" * 40) # Validate guidelines file print(f"šŸ” Checking guidelines file: {guidelines}") if not os.path.exists(guidelines): print(f"āŒ Guidelines file not found: {guidelines}") sys.exit(1) print(" āœ… Guidelines file found") # Initialize evaluator try: print("\nšŸš€ Initializing evaluation system...") evaluator = ContentEvaluator(guidelines) report_generator = ReportGenerator() print(f"\nāœ… System ready! Guidelines loaded from: {guidelines}") except Exception as e: print(f"āŒ Failed to initialize evaluator: {e}") sys.exit(1) # Evaluate content try: if single_image: # Single image evaluation print(f"\nšŸŽÆ Single Image Mode") if not os.path.exists(single_image): print(f"āŒ Image file not found: {single_image}") sys.exit(1) print(f"šŸ“ø Evaluating: {single_image}") result = evaluator.evaluate_image(single_image) results = [result] else: # Directory evaluation print(f"\nšŸŽÆ Directory Mode") if not os.path.exists(images_dir): print(f"āŒ Images directory not found: {images_dir}") sys.exit(1) print(f"šŸ“ Scanning directory: {images_dir}") results = evaluator.evaluate_directory(images_dir) if not results or (len(results) == 1 and "error" in results[0]): error_msg = results[0].get("error", "Unknown error") if results else "No results" print(f"āŒ Evaluation failed: {error_msg}") sys.exit(1) except Exception as e: print(f"āŒ Evaluation failed: {e}") sys.exit(1) # Generate summary print("\nšŸ“Š Generating summary...") summary = evaluator.generate_summary(results) # Display quick summary print("\n" + "="*50) print("šŸ“Š EVALUATION SUMMARY") print("="*50) print(f"šŸ“ˆ Total images: {summary['total_images']}") print(f"āœ… Approved: {summary['approved']}") print(f"āŒ Rejected: {summary['rejected']}") print(f"šŸ“Š Approval rate: {summary['approval_rate']:.1%}") if summary.get('rejection_categories'): print(f"\nšŸ” Top rejection reasons:") for reason, count in list(summary['rejection_categories'].items())[:3]: print(f" • {reason}: {count}") # Generate and save report try: print(f"\nšŸ’¾ Generating {'detailed' if detailed else 'standard'} report...") if detailed: report_json = report_generator.generate_detailed_report(results, summary) else: report_json = report_generator.generate_json_report(results, summary) output_path = report_generator.save_report(report_json, output) print(f"šŸ“„ Report saved to: {output_path}") except Exception as e: print(f"āŒ Failed to save report: {e}") sys.exit(1) # Show final status approved_count = sum(1 for r in results if r.get('approved', False)) print("\n" + "="*50) if approved_count == len(results): print("šŸŽ‰ ALL CONTENT APPROVED!") elif approved_count == 0: print("āš ļø NO CONTENT APPROVED - Review guidelines compliance") else: print(f"⚔ MIXED RESULTS: {approved_count}/{len(results)} content pieces approved") print("="*50) print(f"\nāœ… Evaluation complete! Check {output_path} for full results.") if __name__ == "__main__": main()