|
import gradio as gr
|
|
from recommend import get_genres_movies_for_user, test_users
|
|
|
|
label_value_mapping = {f"User {user_id}": user_id for user_id in test_users}
|
|
|
|
|
|
def get_genre_color(movie_genres, top_genres):
|
|
|
|
genre_colors = {
|
|
'Action': '#F44336',
|
|
'Adventure': '#FF5722',
|
|
'Thriller': '#9C27B0',
|
|
'Animation': '#FFEB3B',
|
|
'Children': '#4CAF50',
|
|
'Fantasy': '#673AB7',
|
|
'Comedy': '#FFC107',
|
|
'Musical': '#E91E63',
|
|
'Romance': '#FF4081',
|
|
'Crime': '#607D8B',
|
|
'Mystery': '#8BC34A',
|
|
'Film-Noir': '#212121',
|
|
'Documentary': '#009688',
|
|
'Drama': '#3F51B5',
|
|
'Horror': '#B71C1C',
|
|
'Sci-Fi': '#00BCD4',
|
|
'War': '#795548',
|
|
'Western': '#D7A87E',
|
|
}
|
|
|
|
|
|
default_color = '#9E9E9E'
|
|
|
|
if not top_genres:
|
|
return genre_colors.get(movie_genres[0], default_color)
|
|
|
|
|
|
for genre in movie_genres:
|
|
if genre in top_genres and genre in genre_colors:
|
|
return genre_colors[genre]
|
|
|
|
|
|
for genre in movie_genres:
|
|
if genre in genre_colors:
|
|
return genre_colors[genre]
|
|
|
|
|
|
return default_color
|
|
|
|
|
|
def get_movie_recommendations(user_id):
|
|
|
|
user_id = label_value_mapping[user_id]
|
|
top_genres, movies = get_genres_movies_for_user(user_id)
|
|
|
|
genre_cards = "".join([
|
|
f"<div class='card' style='background-color:{get_genre_color([genre], None)};'>{genre}</div>"
|
|
for genre in top_genres
|
|
])
|
|
|
|
movie_cards = "".join([
|
|
f"<div class='card movie-card' style='background-color:{get_genre_color(movie['genres'], top_genres)};'>"
|
|
f"<strong>{movie['title']}</strong><br><span>{', '.join(movie['genres'])}</span>"
|
|
"</div>"
|
|
for movie in movies
|
|
])
|
|
|
|
return genre_cards, movie_cards
|
|
|
|
|
|
with gr.Blocks() as demo:
|
|
gr.HTML("""
|
|
<style>
|
|
.gradio-container {
|
|
background-color: #FAFAFA;
|
|
font-family: 'Arial', sans-serif;
|
|
color: #333;
|
|
}
|
|
#center-title {
|
|
text-align: center;
|
|
font-size: 36px;
|
|
margin-bottom: 20px;
|
|
color: #2C3E50;
|
|
}
|
|
h1 {
|
|
font-size: 36px;
|
|
text-align: center;
|
|
margin-bottom: 20px;
|
|
color: #2C3E50;
|
|
}
|
|
h2 {
|
|
font-size: 16px;
|
|
margin-bottom: 10px;
|
|
color: #2C3E50;
|
|
text-align: center;
|
|
}
|
|
.card {
|
|
border: 1px solid #BBDEFB;
|
|
border-radius: 8px;
|
|
padding: 10px 15px;
|
|
margin: 5px;
|
|
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
|
text-align: center;
|
|
font-size: 16px;
|
|
color: #FFFFFF;
|
|
width: 180px;
|
|
display: inline-block;
|
|
}
|
|
.movie-card {
|
|
|
|
}
|
|
</style>
|
|
""")
|
|
with gr.Row():
|
|
gr.Markdown("### Movie Recommendation System", elem_id="center-title")
|
|
|
|
with gr.Row():
|
|
user_id_input = gr.Dropdown(
|
|
label="Select a User",
|
|
choices=list(label_value_mapping.keys()),
|
|
value=list(label_value_mapping.keys())[0],
|
|
interactive=True
|
|
)
|
|
|
|
with gr.Row():
|
|
with gr.Column(scale=1):
|
|
gr.HTML("<h2>Top Genres</h2>")
|
|
genres_output = gr.HTML(label="Top Genres")
|
|
with gr.Column(scale=1):
|
|
gr.HTML("<h2>Recommended Movies</h2>")
|
|
movies_output = gr.HTML(label="Recommended Movies")
|
|
|
|
user_id_input.change(get_movie_recommendations, inputs=user_id_input, outputs=[genres_output, movies_output])
|
|
|
|
demo.launch()
|
|
|