from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from database import get_db, save_post from utils.preprocessing import preprocess_data from utils.image_processing import extract_text_from_image, analyze_image import joblib import requests from PIL import Image from io import BytesIO from textblob import TextBlob import pandas as pd # Load models viral_model = joblib.load("models/viral_potential_model.pkl") engagement_model = joblib.load("models/engagement_rate_model.pkl") promotion_model = joblib.load("models/promotion_strategy_model.pkl") router = APIRouter() # Endpoint to analyze and save a post @router.post("/analyze-post") async def analyze_post(caption: str, hashtags: str, image_url: str, db: Session = Depends(get_db)): try: # Download and analyze the image response = requests.get(image_url) response.raise_for_status() image = Image.open(BytesIO(response.content)) extracted_text = extract_text_from_image(image) image_analysis = analyze_image(image) # Preprocess input for models features = { 'caption_length': len(caption), 'hashtag_count': len(hashtags.split(",")), 'sentiment': TextBlob(caption).sentiment.polarity } features_df = pd.DataFrame([features]) # Make predictions viral_score = viral_model.predict_proba(features_df)[0][1] engagement_rate = engagement_model.predict(features_df)[0] promote = promotion_model.predict(features_df)[0] # Save post to database post_data = { "caption": caption, "hashtags": hashtags, "image_url": image_url, "engagement_rate": engagement_rate, "viral_score": viral_score, "promote": promote } save_post(db, post_data) return { "extracted_text": extracted_text, "image_analysis": image_analysis, "viral_score": viral_score, "engagement_rate": engagement_rate, "promote": bool(promote) } except Exception as e: raise HTTPException(status_code=500, detail=str(e))