proKBD's picture
Upload 8 files
d9cc29f verified
raw
history blame
2.73 kB
"""FastAPI backend for the News Summarization application."""
from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
from typing import List, Dict, Any
import uvicorn
from utils import NewsExtractor, SentimentAnalyzer, TextToSpeechConverter, ComparativeAnalyzer
import os
from config import API_PORT, AUDIO_OUTPUT_DIR
import time
app = FastAPI(title="News Summarization API")
# Mount static directory for audio files
os.makedirs(AUDIO_OUTPUT_DIR, exist_ok=True)
app.mount("/audio", StaticFiles(directory=AUDIO_OUTPUT_DIR), name="audio")
# Initialize components
news_extractor = NewsExtractor()
sentiment_analyzer = SentimentAnalyzer()
tts_converter = TextToSpeechConverter()
comparative_analyzer = ComparativeAnalyzer()
class CompanyRequest(BaseModel):
name: str
class AnalysisResponse(BaseModel):
company: str
articles: List[Dict[str, Any]]
comparative_sentiment_score: Dict[str, Any]
final_sentiment_analysis: str
audio_url: str = None
@app.post("/api/analyze", response_model=AnalysisResponse)
async def analyze_company(request: CompanyRequest):
"""Analyze news articles for a given company."""
try:
# Extract news articles
articles = news_extractor.search_news(request.name)
if not articles:
raise HTTPException(status_code=404, detail="No articles found for the company")
# Analyze each article
analyzed_articles = []
for article in articles:
analysis = sentiment_analyzer.analyze_article(article)
# Add company name to each article
analysis['company'] = request.name
analyzed_articles.append(analysis)
# Perform comparative analysis
comparison = comparative_analyzer.analyze_coverage(analyzed_articles, company_name=request.name)
final_analysis = comparison["final_sentiment"]
# Generate Hindi audio for final analysis
audio_filename = f"{request.name.lower().replace(' ', '_')}_{int(time.time())}"
audio_path = tts_converter.generate_audio(final_analysis, audio_filename)
audio_url = f"/audio/{os.path.basename(audio_path)}"
return {
"company": request.name,
"articles": analyzed_articles,
"comparative_sentiment_score": comparison,
"final_sentiment_analysis": final_analysis,
"audio_url": audio_url
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=API_PORT)