File size: 2,726 Bytes
d9cc29f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
"""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)