yusiff commited on
Commit
151f63c
·
verified ·
1 Parent(s): 2fed4d9

Upload app4.py

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