85 lines
2.9 KiB
Python
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)
|