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