Spaces:
Sleeping
Sleeping
"""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 | |
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) | |