yusiff commited on
Commit
e8a19f0
·
verified ·
1 Parent(s): 255dfce

Upload app4.py

Browse files
Files changed (1) hide show
  1. app4.py +178 -0
app4.py ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pickle
2
+ import streamlit as st
3
+ import requests
4
+ from datetime import datetime
5
+
6
+ # -------------------- General Settings --------------------
7
+ st.set_page_config(page_title="🎬 Movie Recommender", page_icon="🎞️", layout="wide")
8
+
9
+ st.markdown("""
10
+ <style>
11
+ .movie-title {
12
+ text-align: center;
13
+ font-weight: bold;
14
+ font-size: 22px;
15
+ }
16
+ .footer {
17
+ text-align: center;
18
+ font-size: 12px;
19
+ color: grey;
20
+ margin-top: 50px;
21
+ }
22
+ </style>
23
+ """, unsafe_allow_html=True)
24
+
25
+ # -------------------- Load Data --------------------
26
+ try:
27
+ movies = pickle.load(open('saved model/movie_list.pkl', 'rb'))
28
+ similarity = pickle.load(open('saved model/similarity.pkl', 'rb'))
29
+ except FileNotFoundError:
30
+ st.error("❌ Required data files (movie_list.pkl and similarity.pkl) not found.")
31
+ st.stop()
32
+
33
+ # -------------------- Helper Functions --------------------
34
+ def fetch_poster(movie_id):
35
+ try:
36
+ url = f"https://api.themoviedb.org/3/movie/{movie_id}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US"
37
+ response = requests.get(url)
38
+ data = response.json()
39
+ poster_path = data.get('poster_path')
40
+ return f"https://image.tmdb.org/t/p/w500/{poster_path}" if poster_path else "https://via.placeholder.com/500x750?text=No+Image"
41
+ except:
42
+ return "https://via.placeholder.com/500x750?text=Error"
43
+
44
+ def fetch_movie_details(movie_id):
45
+ try:
46
+ url = f"https://api.themoviedb.org/3/movie/{movie_id}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US"
47
+ response = requests.get(url)
48
+ data = response.json()
49
+ overview = data.get('overview', 'No overview available.')
50
+ rating = data.get('vote_average', 'No rating')
51
+ release_date = data.get('release_date', 'No release date')
52
+ genres = ', '.join([genre['name'] for genre in data.get('genres', [])])
53
+ return overview, rating, release_date, genres
54
+ except:
55
+ return "No details available.", "No rating", "No release date", "No genres"
56
+
57
+ def recommend(movie):
58
+ if movie not in movies['title'].values:
59
+ return [], [], []
60
+ index = movies[movies['title'] == movie].index[0]
61
+ distances = sorted(list(enumerate(similarity[index])), reverse=True, key=lambda x: x[1])
62
+ recommended_names = []
63
+ recommended_posters = []
64
+ recommended_ids = []
65
+ for i in distances[1:6]:
66
+ movie_id = movies.iloc[i[0]].movie_id
67
+ recommended_names.append(movies.iloc[i[0]].title)
68
+ recommended_posters.append(fetch_poster(movie_id))
69
+ recommended_ids.append(movie_id) # حفظ الـ movie_id لتفاصيل الفيلم
70
+ return recommended_names, recommended_posters, recommended_ids
71
+
72
+ # -------------------- Page 1: Welcome --------------------
73
+ def page_1():
74
+ st.markdown("<h1 style='text-align: center;'>🎬 Movie Recommender</h1>", unsafe_allow_html=True)
75
+ st.markdown("<hr>", unsafe_allow_html=True)
76
+
77
+ hour = datetime.now().hour
78
+ greeting_time = "Good Morning ☀️" if hour < 12 else "Good Evening 🌙" if hour >= 18 else "Good Afternoon 🌤️"
79
+ st.markdown(f"### {greeting_time}")
80
+
81
+ user_name = st.text_input("👤 Enter your name:")
82
+ if st.button("Continue to Movie Selection"):
83
+ if user_name:
84
+ st.session_state.name = user_name
85
+ st.session_state.page = "select_movie"
86
+ else:
87
+ st.warning("Please enter your name first 😊")
88
+
89
+ # -------------------- Page 2: All-In-One (Select, Rate, Recommend, Details) --------------------
90
+ def page_2():
91
+ st.markdown(f"### Hello, {st.session_state.name} 👋", unsafe_allow_html=True)
92
+
93
+ movie_list = movies['title'].values
94
+ selected_movie = st.selectbox("🎥 Select a Movie", movie_list)
95
+
96
+ rating = st.slider("⭐ Your Rating", 1, 10, 1)
97
+ st.write(f"✅ Your rating: {rating} stars")
98
+
99
+ # تهيئة المتغيرات في الجلسة
100
+ if "show_recommendations" not in st.session_state:
101
+ st.session_state.show_recommendations = False
102
+ if "show_details" not in st.session_state:
103
+ st.session_state.show_details = {}
104
+
105
+ # أزرار التبديل
106
+ if st.button("🎯 Recommendations"):
107
+ st.session_state.show_recommendations = not st.session_state.show_recommendations
108
+
109
+ # عرض التوصيات إذا تم التفعيل
110
+ if st.session_state.show_recommendations:
111
+ with st.spinner("⏳ Fetching recommendations..."):
112
+ names, posters, ids = recommend(selected_movie)
113
+ if names:
114
+ st.markdown(f"### ✅ Recommended Movies Similar to {selected_movie}:")
115
+ cols = st.columns(5)
116
+ for i in range(5):
117
+ with cols[i]:
118
+ details_key = f"details_{i}"
119
+ if details_key not in st.session_state.show_details:
120
+ st.session_state.show_details[details_key] = False
121
+
122
+ if st.button(f"Show {names[i]} Details", key=details_key):
123
+ st.session_state.show_details[details_key] = not st.session_state.show_details[details_key]
124
+
125
+ if st.session_state.show_details.get(details_key, False):
126
+ movie_id = ids[i]
127
+ overview, vote_avg, release_date, genres = fetch_movie_details(movie_id)
128
+ st.markdown(f"### 📖 Movie Details, {names[i]}:")
129
+ st.markdown(f"**Overview**: {overview}")
130
+ st.markdown(f"**Rating**: {vote_avg}/10")
131
+ st.markdown(f"**Release Date**: {release_date}")
132
+ st.markdown(f"**Genres**: {genres}")
133
+
134
+ st.image(posters[i], use_container_width=True)
135
+ st.markdown(f"<div class='movie-title'>{names[i]}</div>", unsafe_allow_html=True)
136
+
137
+ else:
138
+ st.warning("⚠️ No recommendations found.")
139
+
140
+ # تهيئة حالة إظهار التفاصيل إن لم تكن موجودة
141
+ if "show_selected_details" not in st.session_state:
142
+ st.session_state.show_selected_details = False
143
+
144
+ # زر التبديل بين عرض/إخفاء التفاصيل
145
+ if st.button(f"📖 Show Details of {selected_movie}"):
146
+ st.session_state.show_selected_details = not st.session_state.show_selected_details
147
+
148
+ # عرض التفاصيل إذا كانت الحالة مفعّلة
149
+ if st.session_state.show_selected_details:
150
+ movie_id = movies[movies['title'] == selected_movie].movie_id.iloc[0]
151
+ overview, vote_avg, release_date, genres = fetch_movie_details(movie_id)
152
+ st.markdown(f"### 📖 Movie Details, {selected_movie}:")
153
+ st.markdown(f"**Overview**: {overview}")
154
+ st.markdown(f"**Rating**: {vote_avg}/10")
155
+ st.markdown(f"**Release Date**: {release_date}")
156
+ st.markdown(f"**Genres**: {genres}")
157
+
158
+
159
+
160
+ if st.button("🔙 Back"):
161
+ st.session_state.page = "welcome"
162
+
163
+ # -------------------- Page Navigation --------------------
164
+ if 'page' not in st.session_state:
165
+ st.session_state.page = "welcome"
166
+
167
+ if st.session_state.page == "welcome":
168
+ page_1()
169
+ elif st.session_state.page == "select_movie":
170
+ page_2()
171
+
172
+ # -------------------- Footer --------------------
173
+ st.markdown("<hr>", unsafe_allow_html=True)
174
+ st.markdown("<div class='footer'>© 2025 • by Youssef • Powered by TMDB API</div>", unsafe_allow_html=True)
175
+
176
+
177
+
178
+