|
|
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 |