-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathapp.py
More file actions
144 lines (126 loc) · 4.8 KB
/
app.py
File metadata and controls
144 lines (126 loc) · 4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Importing Libraries
import os
import sys
import time
import gdown
import pickle
import requests
import pandas as pd
import streamlit as st
# Adding utils directory to PYTHONPATH
sys.path.append(os.path.abspath("../utils"))
# Page Configuration
from utils.file_locator import get_path
st.set_page_config(page_title='Pickify', page_icon=get_path('images', 'logo.png'), layout='wide')
# List of Movies
movies = pd.read_csv(get_path('clean_data','cleaned_data.csv'))
movies_list = movies['title'].values
# Downloading similarity matrix from Google Drive
file_id = '1Zo0ayKcdOxyqNmUjU2niKAVbWl5S3Sol'
output = 'similarity.pkl'
url = f'https://drive.google.com/uc?id={file_id}'
if not os.path.exists(output):
gdown.download(url, output, quiet=False)
# Loading similarity matrix
with open(output, 'rb') as f:
similarity = pickle.load(f)
# Navbar Section
st.markdown("""
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Special+Gothic+Expanded+One&display=swap" rel="stylesheet">
<style>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
color: white;
font-family: "Special Gothic Expanded One", sans-serif;
}
.navbar .logo {
font-size: 28px;
font-weight: bold;
color: #FD3A84;
letter-spacing: 0.8px
}
.navbar .nav-right button {
background-color: #020200;
padding: 5px 15px;
color: white;
cursor: pointer;
font-size: 15px;
margin: 4px;
border: 2px solid rgba(190, 190, 190);
border-radius: 100px;
}
.navbar .nav-right .login {
background-color: #FD3A84;
padding: 5px 15px;
color: white;
cursor: pointer;
font-size: 15px;
margin: 4px;
border: 2px solid #FD3A84;
border-radius: 100px;
}
</style>
<div class="navbar">
<div class="logo">Pickify</div>
<div class="nav-right">
<form action="#">
<button>Sign up</button>
<button class='login'>Login</button>
</form>
</div>
</div>
""", unsafe_allow_html=True)
# Adding banner for visual enhancement
st.image(get_path('images','banner.png'), use_container_width=True)
# Function to fetch movie posters
def fetch_poster(movie_id):
api_key = st.secrets["tmdb"]["api_key"]
url = f'https://api.themoviedb.org/3/movie/{movie_id}?api_key={api_key}'
response = requests.get(url)
data = response.json()
poster_path = data['poster_path']
full_img_path = f"https://image.tmdb.org/t/p/w500{poster_path}"
return full_img_path
# Function to get top 5 movie recommendations
def recommend(movie_name):
movie_idx = movies[movies['title'] == movie_name].index[0]
movie_similarity = similarity[movie_idx]
similar_movies = sorted(list(enumerate(movie_similarity)), reverse=True, key=lambda x: x[1])[1:6]
recommended_movies = []
movies_posters = []
for i in similar_movies:
recommended_movies.append(movies.iloc[i[0]]['title'])
movies_posters.append(fetch_poster(movies.iloc[i[0]]['movie_id']))
return recommended_movies, movies_posters
# Displaying recommended movies with posters
with st.expander(label="Watched a great movie, we've got similar picks!", expanded=True, icon=":material/movie:"):
selected_movie = st.selectbox(label="Watched a great movie? We've got similar picks!", options=movies_list, label_visibility='collapsed')
if st.button(label='Recommend', icon=":material/thumb_up:", type='primary'):
progress_text = "Recommending movies, Please wait..."
my_bar = st.progress(0, text=progress_text)
for percent_complete in range(101):
time.sleep(0.02)
my_bar.progress(percent_complete, text=progress_text)
time.sleep(0.5)
my_bar.empty()
names, posters = recommend(selected_movie)
col1, col2, col3, col4, col5 = st.columns(5, border=True, vertical_alignment='center')
with col1:
st.image(posters[0],use_container_width=True)
st.caption(names[0])
with col2:
st.image(posters[1],use_container_width=True)
st.caption(names[1])
with col3:
st.image(posters[2],use_container_width=True)
st.caption(names[2])
with col4:
st.image(posters[3],use_container_width=True)
st.caption(names[3])
with col5:
st.image(posters[4],use_container_width=True)
st.caption(names[4])