Spaces:
Runtime error
Runtime error
from flask import Flask, render_template, request, Response, url_for | |
from main import analyze_news, extract_trending_words | |
import io | |
import time | |
import matplotlib.pyplot as plt | |
from wordcloud import WordCloud | |
app = Flask(__name__) | |
cache = {} | |
plt.switch_backend("Agg") | |
def get_cached_data(cache_key): | |
cached = cache.get(cache_key) | |
if cached and time.time() - cached["timestamp"] < 600: | |
print(f"Cache hit for {cache_key}") | |
return cached["results"], cached["trending_words"] | |
return None, None | |
def index(): | |
results, trending_words = [], [] | |
sentiment_chart = None | |
query = "" | |
if request.method == "POST": | |
query = request.form["query"] | |
num_articles = int(request.form["num_articles"]) | |
api_key = "f80d8a6206cd472baeb21f04786b2626" | |
cache_key = f"{query}_{num_articles}" | |
results, trending_words = get_cached_data(cache_key) | |
if results is None: | |
print(f"No cache for {cache_key}, fetching new data...") | |
results = analyze_news(query, api_key, num_articles) | |
texts = [article["title"] + " " + article.get("summary", "") for article in results] | |
trending_words = extract_trending_words(texts) | |
cache[cache_key] = { | |
"results": results, | |
"trending_words": trending_words, | |
"timestamp": time.time() | |
} | |
if results: | |
sentiment_chart = url_for('sentiment_chart_route') | |
return render_template("index.html", results=results, sentiment_chart=sentiment_chart, query=query, trending_words=trending_words) | |
def sentiment_chart_route(): | |
if not cache: | |
return "No sentiment data", 404 | |
last_query = list(cache.keys())[-1] | |
cached = cache.get(last_query) | |
if not cached: | |
return "No sentiment data", 404 | |
results = cached["results"] | |
sentiments = [article["sentiment"] for article in results] | |
sentiment_counts = dict((x, sentiments.count(x)) for x in set(sentiments)) | |
labels = list(sentiment_counts.keys()) | |
values = list(sentiment_counts.values()) | |
color_map = { | |
"POSITIVE": "#28a745", | |
"NEGATIVE": "#c82333" | |
} | |
colors = [color_map[label] for label in labels] | |
total = sum(values) | |
plt.figure(figsize=(3, 3)) | |
plt.pie(values, autopct=lambda pct: f'{int(pct * total / 100)} ({pct:.1f}%)', startangle=140, colors=colors) | |
plt.axis('equal') | |
img = io.BytesIO() | |
plt.savefig(img, format="png", bbox_inches="tight", transparent = True) | |
plt.close() | |
img.seek(0) | |
return Response(img.getvalue(), mimetype="image/png") | |
def wordcloud_chart(): | |
if not cache: | |
return "No word data", 404 | |
last_query = list(cache.keys())[-1] | |
cached = cache.get(last_query) | |
if not cached: | |
return "No word data", 404 | |
results = cached["results"] | |
texts = [article["title"] + " " + article.get("summary", "") for article in results] | |
text = " ".join(texts) | |
plt.figure(figsize=(16, 8), dpi=150) | |
wordcloud = WordCloud(width=1600, height=800, colormap="Blues", background_color='#222').generate(text) | |
plt.imshow(wordcloud, interpolation="bilinear") | |
plt.axis("off") | |
img = io.BytesIO() | |
plt.savefig(img, format="png", bbox_inches="tight", pad_inches=0, dpi=150) | |
plt.close() | |
img.seek(0) | |
return Response(img.getvalue(), mimetype="image/png") | |
def about(): | |
return render_template("about.html") | |
if __name__ == "__main__": | |
app.run(host="0.0.0.0", port=7860, debug=True) | |