| | import os |
| | import logging |
| | from pathlib import Path |
| | from typing import Dict, List |
| | import google.generativeai as genai |
| |
|
| | logging.basicConfig(level=logging.INFO) |
| | logger = logging.getLogger(__name__) |
| |
|
| | class MarketAnalyzer: |
| | def __init__(self): |
| | |
| | api_key = os.getenv("GOOGLE_API_KEY") |
| | if not api_key: |
| | raise ValueError("GOOGLE_API_KEY not found") |
| |
|
| | genai.configure(api_key=api_key) |
| | self.model = genai.GenerativeModel('gemini-pro') |
| |
|
| | def analyze_commercial_viability(self, coverage: str, creative_analysis: str) -> str: |
| | """Analyze commercial potential based on coverage and creative analysis""" |
| | prompt = f"""As an experienced film industry analyst, evaluate the commercial viability |
| | of this screenplay based on the following coverage and analysis. Consider: |
| | - Box office potential |
| | - Genre marketability |
| | - International appeal |
| | - Franchise potential |
| | - Current market trends |
| | - Production challenges and risks |
| | |
| | Coverage: |
| | {coverage} |
| | |
| | Creative Analysis: |
| | {creative_analysis} |
| | |
| | Provide a detailed commercial viability analysis with specific examples and market comparisons.""" |
| |
|
| | try: |
| | response = self.model.generate_content(prompt) |
| | return response.text |
| | except Exception as e: |
| | logger.error(f"Error analyzing commercial viability: {str(e)}") |
| | return None |
| |
|
| | def identify_target_audiences(self, coverage: str, viability_analysis: str) -> str: |
| | """Identify and analyze potential target audiences""" |
| | prompt = f"""Based on the screenplay coverage and commercial viability analysis, |
| | identify and analyze key target audiences. For each audience segment, consider: |
| | - Demographics and psychographics |
| | - Viewing habits and preferences |
| | - Marketing channels to reach them |
| | - Similar films they've supported |
| | - Potential audience size and engagement level |
| | |
| | Coverage: |
| | {coverage} |
| | |
| | Viability Analysis: |
| | {viability_analysis} |
| | |
| | Provide a detailed audience analysis with specific segments and supporting data.""" |
| |
|
| | try: |
| | response = self.model.generate_content(prompt) |
| | return response.text |
| | except Exception as e: |
| | logger.error(f"Error identifying target audiences: {str(e)}") |
| | return None |
| |
|
| | def analyze_comparables(self, coverage: str, target_audience: str) -> str: |
| | """Analyze comparable films and their performance""" |
| | prompt = f"""Using the screenplay coverage and target audience analysis, |
| | identify and analyze comparable films. For each comparable: |
| | - Box office performance |
| | - Budget range |
| | - Marketing approach |
| | - Release strategy |
| | - Audience reception |
| | - Critical response |
| | - What worked/didn't work |
| | |
| | Coverage: |
| | {coverage} |
| | |
| | Target Audience Analysis: |
| | {target_audience} |
| | |
| | Provide detailed analysis of 3-5 most relevant comparable films.""" |
| |
|
| | try: |
| | response = self.model.generate_content(prompt) |
| | return response.text |
| | except Exception as e: |
| | logger.error(f"Error analyzing comparables: {str(e)}") |
| | return None |
| |
|
| | def assess_budget_range(self, coverage: str, comparables: str) -> str: |
| | """Assess potential budget range based on content and comparables""" |
| | prompt = f"""Based on the screenplay coverage and comparable films analysis, |
| | evaluate appropriate budget ranges. Consider: |
| | - Production requirements (VFX, locations, stunts) |
| | - Cast level needed |
| | - Technical requirements |
| | - Marketing spend implications |
| | - ROI potential at different budget levels |
| | |
| | Coverage: |
| | {coverage} |
| | |
| | Comparables Analysis: |
| | {comparables} |
| | |
| | Provide detailed budget analysis with ranges and justification.""" |
| |
|
| | try: |
| | response = self.model.generate_content(prompt) |
| | return response.text |
| | except Exception as e: |
| | logger.error(f"Error assessing budget: {str(e)}") |
| | return None |
| |
|
| | def evaluate_marketing_angles(self, all_analyses: Dict[str, str]) -> str: |
| | """Evaluate potential marketing angles based on all previous analyses""" |
| | analyses_text = "\n\n".join([f"{k}:\n{v}" for k, v in all_analyses.items()]) |
| |
|
| | prompt = f"""Based on all previous analyses, identify and evaluate key marketing angles. Consider: |
| | - Unique selling propositions |
| | - Genre hooks |
| | - Cast/talent opportunities |
| | - Visual marketing potential |
| | - Social media angles |
| | - PR opportunities |
| | - Promotional partnerships |
| | - Release timing strategies |
| | |
| | Previous Analyses: |
| | {analyses_text} |
| | |
| | Provide comprehensive marketing strategy recommendations with specific angles and approaches.""" |
| |
|
| | try: |
| | response = self.model.generate_content(prompt) |
| | return response.text |
| | except Exception as e: |
| | logger.error(f"Error evaluating marketing angles: {str(e)}") |
| | return None |
| |
|
| | def generate_market_analysis(self, coverage_path: Path, creative_analysis_path: Path) -> bool: |
| | """Main method to generate complete market analysis""" |
| | try: |
| | |
| | with open(coverage_path, 'r', encoding='utf-8') as f: |
| | coverage = f.read() |
| | with open(creative_analysis_path, 'r', encoding='utf-8') as f: |
| | creative_analysis = f.read() |
| |
|
| | |
| | analyses = {} |
| |
|
| | logger.info("Analyzing commercial viability...") |
| | analyses['commercial_viability'] = self.analyze_commercial_viability( |
| | coverage, creative_analysis) |
| |
|
| | logger.info("Identifying target audiences...") |
| | analyses['target_audiences'] = self.identify_target_audiences( |
| | coverage, analyses['commercial_viability']) |
| |
|
| | logger.info("Analyzing comparable films...") |
| | analyses['comparables'] = self.analyze_comparables( |
| | coverage, analyses['target_audiences']) |
| |
|
| | logger.info("Assessing budget ranges...") |
| | analyses['budget_assessment'] = self.assess_budget_range( |
| | coverage, analyses['comparables']) |
| |
|
| | logger.info("Evaluating marketing angles...") |
| | analyses['marketing_strategy'] = self.evaluate_marketing_angles(analyses) |
| |
|
| | |
| | output_path = coverage_path.parent / "market_analysis.txt" |
| | with open(output_path, 'w', encoding='utf-8') as f: |
| | f.write("SCREENPLAY MARKET ANALYSIS\n\n") |
| |
|
| | for title, content in analyses.items(): |
| | formatted_title = title.replace('_', ' ').upper() |
| | f.write(f"### {formatted_title} ###\n\n") |
| | f.write(content) |
| | f.write("\n\n") |
| |
|
| | logger.info(f"Market analysis saved to: {output_path}") |
| | return True |
| |
|
| | except Exception as e: |
| | logger.error(f"Error in market analysis: {str(e)}") |
| | return False |