from flask import Flask, render_template, request, jsonify, flash, redirect,
url_for, session
from datetime import datetime
import requests
app = Flask(__name__)
app.secret_key = 'my_very_unsafe_secret_key_for_testing'
# Dummy in-memory storage for user data
users = {}
preferences_data = {}
CATEGORIES = ["General", "Technology", "Health", "Sports", "Entertainment",
"Science"]
COUNTRIES = ["India", "United States", "United Kingdom", "Australia", "Canada"]
LANGUAGES = {
"India": ["English", "Hindi"],
"United States": ["English"],
"United Kingdom": ["English"],
"Australia": ["English"],
"Canada": ["English"]
}
SOURCE_MAP = {
'India': {
'English': ["Times of India", "Hindustan Times", "The Hindu", "India
Today"],
'Hindi': ["Dainik Jagran", "Amar Ujala"]
},
'United States': {
'English': ["CNN", "The New York Times", "Washington Post", "USA Today"]
},
'United Kingdom': {
'English': ["BBC News", "The Guardian", "The Independent"]
}
}
API_KEY = '308d9dcd0b0d9b0428350da357a07f53'
GNEWS_API_URL = 'https://gnews.io/api/v4/top-headlines'
GNEWS_SEARCH_URL = 'https://gnews.io/api/v4/search'
@app.route('/')
def index():
selected_category = request.args.get('category', 'General')
selected_country = request.args.get('country', 'India')
selected_language = request.args.get('language', 'English')
selected_source = request.args.get('source', '')
search_query = request.args.get('q', '')
sources = SOURCE_MAP.get(selected_country, {}).get(selected_language, [])
user_email = session.get('user_email')
if user_email:
user = users.get(user_email, {})
user_preferences = user.get('preferences', [selected_category])
user_languages = user.get('languages', [selected_language])
user_sources = user.get('news_sources', [selected_source])
else:
user_preferences = [selected_category]
user_languages = [selected_language]
user_sources = [selected_source]
if search_query:
articles = search_news(search_query, selected_language)
else:
category_to_fetch = user_preferences[0] if user_preferences else
selected_category
language_to_fetch = user_languages[0] if user_languages else
selected_language
source_to_fetch = user_sources[0] if user_sources else None
articles = fetch_news(category_to_fetch, selected_country,
language_to_fetch, source_to_fetch)
return render_template(
'index.html',
articles=articles,
categories=CATEGORIES,
countries=COUNTRIES,
languages=LANGUAGES,
sources=sources,
selected_category=selected_category,
selected_country=selected_country,
selected_language=selected_language,
selected_source=selected_source,
search_query=search_query
)
def fetch_news(category, country, language, source=None):
params = {
'category': category.lower(),
'country': country.lower(),
'lang': language[:2].lower(),
'token': API_KEY
}
if source:
params['source'] = source.lower()
response = requests.get(GNEWS_API_URL, params=params)
return process_response(response)
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('query')
language = request.args.get('language')
if query and language:
# Process the search logic
return render_template('index.html', query=query, language=language)
else:
return redirect(url_for('index'))
def search_news(query, language):
params = {
'q': query,
'lang': language[:2].lower(),
'token': API_KEY
}
response = requests.get(GNEWS_SEARCH_URL, params=params)
return process_response(response)
def process_response(response):
if response.status_code == 200:
articles = response.json().get('articles', [])
for article in articles:
if article.get('publishedAt'):
utc_time = datetime.strptime(article['publishedAt'], '%Y-%m-%dT%H:
%M:%SZ')
article['formatted_date'] = utc_time.strftime('%d/%m/%Y %I:%M %p')
article['summary'] = article.get('description', 'No summary
available.')
return articles
return []
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
email = request.form.get('email')
password = request.form.get('password')
name = request.form.get('name')
preferences = request.form.getlist('preferences')
languages = request.form.getlist('languages')
if email in users:
flash('Email already registered! Please log in.', 'error')
return redirect(url_for('login'))
users[email] = {
'email': email,
'password': password,
'name': name,
'preferences': preferences,
'languages': languages,
'news_sources': []
}
# Set session and flash message after successful signup
session['user_email'] = email
flash('Sign up successful! Please select your preferences.', 'success')
# Redirect to preferences page after successful signup
return redirect(url_for('preferences'))
return render_template('signup.html')
@app.route('/preferences', methods=['GET', 'POST'])
def preferences():
if request.method == 'POST':
selected_preferences = request.form.getlist('preferences')
selected_news_sources = request.form.getlist('news_sources')
selected_languages = request.form.getlist('languages')
user_email = session.get('user_email')
if user_email in users:
user = users[user_email]
user['preferences'] = selected_preferences
user['news_sources'] = selected_news_sources
user['languages'] = selected_languages
flash('Preferences saved successfully!', 'success')
return redirect(url_for('index'))
# Fetch user details from session if available
user_email = session.get('user_email')
user = None
if user_email in users:
user = users[user_email]
return render_template('preferences.html', user=user)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form.get('email')
password = request.form.get('password')
user = users.get(email)
if user:
if user['password'] == password:
session['user_email'] = email # Set the session for logged-in user
flash('Login successful!', 'success')
return redirect(url_for('index'))
else:
flash('Invalid credentials. Please try again.', 'error')
else:
# Redirect new users to the signup page
flash('This email is not registered. Please sign up.', 'error')
return redirect(url_for('signup'))
return render_template('login.html')
@app.route('/profile', methods=['GET', 'POST'])
def profile():
if 'user_email' in session:
user_email = session['user_email']
user = users.get(user_email)
if not user:
flash('User not found!', 'error')
return redirect(url_for('login'))
# Handle preferences and password updates
if request.method == 'POST':
preferences = request.form.getlist('preferences')
news_sources = request.form.getlist('news_sources')
languages = request.form.getlist('languages')
new_password = request.form.get('new_password')
if new_password:
user['password'] = new_password
flash('Password updated successfully!', 'success')
user['preferences'] = preferences
user['news_sources'] = news_sources
user['languages'] = languages
flash('Preferences updated successfully!', 'success')
return render_template('profile.html', user=user)
else:
flash('You need to log in first!', 'warning')
return redirect(url_for('login'))
@app.route('/logout')
def logout():
session.clear()
flash('You have been logged out.', 'success')
return redirect(url_for('index'))
init_db(app)
if __name__ == '__main__':
app.run(debug=True)