TV-Show-recommender/app.py

85 lines
2.9 KiB
Python

from flask import Flask, render_template, request
from readdata import LoadData
from recommendations import RecommendationLoader
from training import TrainModel
app = Flask(__name__)
data_loader = LoadData()
title_data = data_loader.load_data()
model = TrainModel(title_data)
model.train()
recommender = RecommendationLoader(model, title_data)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/recommend', methods=['POST'])
def recommend():
# Get user input
title = request.form.get('title').strip()
n_recommendations = int(request.form.get('n_recommendations', 10))
# Validate user input
if not title:
return render_template('index.html', message="Please enter a valid TV show title.")
try:
n_recommendations = int(n_recommendations)
if n_recommendations < 1 or n_recommendations > 50:
raise ValueError("Number of recommendations must be between 1 and 50.")
except ValueError as e:
return render_template('index.html', message=str(e))
# Get recommendations from the model
target_row = title_data[title_data['name'].str.lower() == title.lower()]
# Check if a match was found
if target_row.empty:
return render_template('index.html', message=f"No match found for '{title}'. Try again.")
# Get recommendations
target_row = target_row.iloc[0]
user_data = {'title': title, 'n_rec': n_recommendations}
recommendations = recommender.get_recommendations("flask", target_row, user_data)
# Check if recommendations were found
if recommendations is None or recommendations.empty:
return render_template('index.html', message=f"Sorry, no recommendations available for {title}.")
# Prepare data for display on the webpage
recommendations_data = []
for _, row in recommendations.iterrows():
# Extract the first and last air dates
first_air_date = recommender.extract_years(row['first_air_date'])
last_air_date = recommender.extract_years(row['last_air_date'])
if last_air_date != "Ongoing" and last_air_date:
years = f"{first_air_date} - {last_air_date}"
else:
years = f"{first_air_date}"
recommendations_data.append({
'title': row['name'],
'genres': ', '.join(row['genres']) if isinstance(row['genres'], list) else row['genres'],
'overview': row['overview'],
'rating': row['vote_average'],
'seasons': row['number_of_seasons'],
'episodes': row['number_of_episodes'],
'networks': ', '.join(row['networks']) if isinstance(row['networks'], list) and row['networks'] else 'N/A',
'years': years,
})
return render_template('index.html', recommendations=recommendations_data, original_title=title)
if __name__ == '__main__':
app.run(debug=True)