ESMATUGBA commited on
Commit
b96bedb
·
verified ·
1 Parent(s): 0e8aeaf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -89
app.py CHANGED
@@ -4,7 +4,7 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # --- TİTREMEYİ ÖNLEYİCİ VE TASARIM CSS ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
  st.markdown("""
10
  <style>
@@ -12,16 +12,6 @@ st.markdown("""
12
  max-height: 400px;
13
  object-fit: contain;
14
  }
15
- div.stButton > button:first-child {
16
- width: 100%;
17
- text-align: left;
18
- border: 1px solid #f0f2f6;
19
- padding: 5px 10px;
20
- }
21
- div.stButton > button:first-child:hover {
22
- border-color: #ff4b4b;
23
- color: #ff4b4b;
24
- }
25
  </style>
26
  """, unsafe_allow_html=True)
27
 
@@ -37,7 +27,7 @@ def load_data():
37
  model_data = load_data()
38
  movie_dict = model_data['movie_dict'] if model_data else {}
39
 
40
- # 2. TÜM OYUNCU DNA VERİTABANI
41
  tum_unlu_verileri = {
42
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
43
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -78,119 +68,82 @@ tum_unlu_verileri = {
78
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
79
  }
80
 
81
- # --- DİNAMİK FİLTRELEME ---
82
  resim_klasoru = os.getcwd()
83
 
84
- @st.cache_data
85
- def klasordeki_unluleri_getir():
86
- mevcut_unlular = {}
87
  dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
88
- for isim, veri in tum_unlu_verileri.items():
89
- search_pattern1 = isim.lower().replace(" ", "_")
90
- search_pattern2 = isim.lower()
91
- if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar if d.endswith(('.jpg', '.png', '.jpeg'))):
92
- mevcut_unlular[isim] = veri
93
- return mevcut_unlular
94
 
95
- unlu_verileri = klasordeki_unluleri_getir()
96
 
97
- # --- SESSION STATE YÖNETİMİ ---
98
- if 'selected_actor' not in st.session_state:
99
- st.session_state.selected_actor = None
100
 
101
- # --- SOL PANEL (SIDEBAR) ---
102
- st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
103
- st.sidebar.markdown("---")
104
 
105
- gender_choice = st.sidebar.radio(
106
- "1. Select Category / Kategori Seçin:",
107
- ["Male / Erkek", "Female / Kadın"],
108
- key="gender_radio"
 
 
 
109
  )
110
 
111
- filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
112
-
113
- st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
114
-
115
- # Sidebar Buton Fonksiyonu
116
- def select_actor(name):
117
- st.session_state.selected_actor = name
118
-
119
- # Sol Paneldeki isim butonları
120
- for n in filtered_names:
121
- st.sidebar.button(f"👤 {n}", key=f"sb_{n}", on_click=select_actor, args=(n,))
122
-
123
  # --- ANA EKRAN ---
124
- st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
125
- st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
126
  st.markdown("---")
127
 
128
  col_actor, col_match = st.columns([1, 2])
129
 
130
  with col_actor:
131
- st.subheader("👤 Pick an Actor / Oyuncu Seç")
132
 
133
- # Kutu Otomatik Güncelleme Mantığı
134
- # Eğer session_state doluysa ve listede varsa onu seç, yoksa None bırak.
135
- if st.session_state.selected_actor in filtered_names:
136
- idx = filtered_names.index(st.session_state.selected_actor)
137
- else:
138
- idx = None
139
-
140
- # SELECTBOX: index parametresi doğrudan idx değişkenine bağlıdır
141
- current_selection = st.selectbox(
142
- "Select from list / Listeden seçin:",
143
  filtered_names,
144
- index=idx,
145
- placeholder="Choose an actor... / Bir oyuncu seçin...",
146
- key="main_selectbox"
147
  )
148
-
149
- # Kutu üzerinden manuel seçim yapılırsa state'i güncelle
150
- if current_selection != st.session_state.selected_actor:
151
- st.session_state.selected_actor = current_selection
152
 
153
- # GÖRSEL ALANI
154
- if st.session_state.selected_actor:
155
- actor = st.session_state.selected_actor
156
  found_path = None
157
- search_target = actor.replace(" ", "_").lower()
158
  for f in os.listdir(resim_klasoru):
159
- if f.lower().startswith(search_target) or actor.lower() in f.lower():
160
  found_path = os.path.join(resim_klasoru, f)
161
  break
162
 
163
  if found_path:
164
- st.image(found_path, caption=f"Profile / Profil: {actor}", use_container_width=True)
165
- else:
166
- st.error("Image not found. / Resim bulunamadı.")
167
  else:
168
- st.info("Please select an actor to start. / Başlamak için lütfen bir oyuncu seçin.")
169
 
170
  with col_match:
171
- st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
172
-
173
- if st.session_state.selected_actor:
174
- actor = st.session_state.selected_actor
175
- st.write(f"Comparing {actor}'s DNA... / {actor} kariyer DNA'sı karşılaştırılıyor...")
176
-
177
- if st.button("🚀 Match and Recommend / Eşleştir ve Öner", key="match_btn"):
178
  if movie_dict:
179
- actor_v = unlu_verileri[actor]['v']
180
  results = []
181
  for i in movie_dict:
182
- noise = random.uniform(0, 0.0001)
183
- dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
184
  results.append((movie_dict[i][0], dist))
185
 
186
- top_matches = sorted(results, key=lambda x: x[1])[:5]
187
- for i, (film, score) in enumerate(top_matches, 1):
188
  pct = round((1 - score) * 100, 1)
189
  st.success(f"**{i}. {film}**")
190
- st.write(f"Match Score / Uyum Skoru: **%{pct}**")
191
  st.progress(pct / 100)
192
  else:
193
- st.write("Waiting for selection... / Seçim bekleniyor...")
194
 
195
  st.markdown("---")
196
- st.info("💡 **How it works? / Nasıl çalışır?**: AI analyzes based on local image assets. / AI yerel resim varlıklarını analiz eder.")
 
4
  import random
5
  import os
6
 
7
+ # --- TİTREMEYİ ÖNLEYİCİ CSS ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
  st.markdown("""
10
  <style>
 
12
  max-height: 400px;
13
  object-fit: contain;
14
  }
 
 
 
 
 
 
 
 
 
 
15
  </style>
16
  """, unsafe_allow_html=True)
17
 
 
27
  model_data = load_data()
28
  movie_dict = model_data['movie_dict'] if model_data else {}
29
 
30
+ # 2. OYUNCU VERİTABANI
31
  tum_unlu_verileri = {
32
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
33
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
68
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
69
  }
70
 
71
+ # --- RESİM KONTROLÜ ---
72
  resim_klasoru = os.getcwd()
73
 
74
+ def get_available_actors():
 
 
75
  dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
76
+ mevcut = [isim for isim, veri in tum_unlu_verileri.items()
77
+ if any(isim.lower().replace(" ", "_") in d or isim.lower() in d for d in dosyalar)]
78
+ return mevcut
 
 
 
79
 
80
+ mevcut_isimler = get_available_actors()
81
 
82
+ # --- SIDEBAR ---
83
+ st.sidebar.title("🔍 Control Panel")
84
+ gender_choice = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"])
85
 
86
+ # Seçilen kategoriye göre isimleri filtrele
87
+ filtered_names = [n for n in mevcut_isimler if tum_unlu_verileri[n]['c'] == gender_choice]
 
88
 
89
+ st.sidebar.markdown("---")
90
+ # SOL TARAFA TIKLANABİLİR LİSTE EKLEDİK (Buton yerine en sağlam yöntem)
91
+ selected_actor = st.sidebar.radio(
92
+ "📋 Click to Select / Seçmek için Tıklayın:",
93
+ filtered_names,
94
+ index=None,
95
+ key="sidebar_actor_selection"
96
  )
97
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  # --- ANA EKRAN ---
99
+ st.title("🎬 CastMatch AI: Talent Matching System")
 
100
  st.markdown("---")
101
 
102
  col_actor, col_match = st.columns([1, 2])
103
 
104
  with col_actor:
105
+ st.subheader("👤 Selected Actor / Seçili Oyuncu")
106
 
107
+ # Sol taraftan seçilen isim buradaki selectbox'ı da günceller
108
+ # Ama daha kolayı: selectbox'ı tamamen kaldırıp sadece sidebar seçimini kullanmak
109
+ # Eğer selectbox istersen:
110
+ final_actor = st.selectbox(
111
+ "List / Liste:",
 
 
 
 
 
112
  filtered_names,
113
+ index=filtered_names.index(selected_actor) if selected_actor in filtered_names else None,
114
+ placeholder="Select an actor... / Bir oyuncu seçin..."
 
115
  )
 
 
 
 
116
 
117
+ if final_actor:
 
 
118
  found_path = None
119
+ target = final_actor.replace(" ", "_").lower()
120
  for f in os.listdir(resim_klasoru):
121
+ if target in f.lower() or final_actor.lower() in f.lower():
122
  found_path = os.path.join(resim_klasoru, f)
123
  break
124
 
125
  if found_path:
126
+ st.image(found_path, caption=final_actor, use_container_width=True)
 
 
127
  else:
128
+ st.info("Waiting for selection... / Seçim bekleniyor...")
129
 
130
  with col_match:
131
+ st.subheader("🎯 Career Matches")
132
+ if final_actor:
133
+ if st.button("🚀 Match and Recommend"):
 
 
 
 
134
  if movie_dict:
135
+ v = tum_unlu_verileri[final_actor]['v']
136
  results = []
137
  for i in movie_dict:
138
+ dist = spatial.distance.cosine(v, movie_dict[i][1][:6]) + random.uniform(0, 0.0001)
 
139
  results.append((movie_dict[i][0], dist))
140
 
141
+ for i, (film, score) in enumerate(sorted(results, key=lambda x: x[1])[:5], 1):
 
142
  pct = round((1 - score) * 100, 1)
143
  st.success(f"**{i}. {film}**")
 
144
  st.progress(pct / 100)
145
  else:
146
+ st.write("Please select an actor from the left panel.")
147
 
148
  st.markdown("---")
149
+ st.info("💡 **Nasıl çalışır?**: Sol panelden bir oyuncu seçin, ardından sağdaki butona basın.")