ESMATUGBA commited on
Commit
262e9d9
·
verified ·
1 Parent(s): 74cb2e5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -66
app.py CHANGED
@@ -4,14 +4,6 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # --- SAYFA AYARLARI ---
8
- st.set_page_config(page_title="CastMatch AI", layout="wide")
9
- st.markdown("""
10
- <style>
11
- [data-testid="stImage"] img { max-height: 400px; object-fit: contain; }
12
- </style>
13
- """, unsafe_allow_html=True)
14
-
15
  # 1. MODELİ YÜKLE
16
  @st.cache_resource
17
  def load_data():
@@ -24,7 +16,7 @@ def load_data():
24
  model_data = load_data()
25
  movie_dict = model_data['movie_dict'] if model_data else {}
26
 
27
- # 2. TÜM OYUNCU VERİTABANI (Eksiksiz Liste)
28
  tum_unlu_verileri = {
29
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
30
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -65,82 +57,113 @@ tum_unlu_verileri = {
65
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
66
  }
67
 
68
- # --- RESİM KONTROLÜ ---
69
- resim_klasoru = os.getcwd()
70
- mevcut_isimler = [isim for isim in tum_unlu_verileri.keys()
71
- if any(isim.lower().replace(" ", "_") in f.lower() or isim.lower() in f.lower()
72
- for f in os.listdir(resim_klasoru))]
73
 
74
- # --- SESSION STATE ---
75
- if 'selected_actor' not in st.session_state:
76
- st.session_state.selected_actor = mevcut_isimler[0] if mevcut_isimler else None
 
 
 
 
 
 
 
 
77
 
78
- # --- SIDEBAR (SOL PANEL) ---
79
- st.sidebar.title("🔍 Control Panel")
80
- gender_choice = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"])
81
- filtered_names = [n for n in mevcut_isimler if tum_unlu_verileri[n]['c'] == gender_choice]
82
 
 
 
 
 
 
 
83
  st.sidebar.markdown("---")
84
- # Sol tarafta bir isme basıldığında çalışacak fonksiyon
85
- def on_sidebar_click():
86
- st.session_state.selected_actor = st.session_state.sidebar_sync
87
-
88
- # Sol taraftaki tıklanabilir liste
89
- st.sidebar.radio(
90
- "📋 Available Cast / Mevcut Oyuncular:",
91
- filtered_names,
92
- index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
93
- key="sidebar_sync",
94
- on_change=on_sidebar_click
95
  )
96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  # --- ANA EKRAN ---
98
- st.title("🎬 CastMatch AI")
 
 
99
 
100
  col_actor, col_match = st.columns([1, 2])
101
 
102
  with col_actor:
103
- st.subheader("👤 Pick an Actor")
104
 
105
- # Orta kısımdaki seçim kutusu fonksiyonu
106
- def on_main_click():
107
- st.session_state.selected_actor = st.session_state.main_sync
108
-
109
- # SELECTBOX: Sol panel ile tamamen aynı session_state'e bağlı
110
- final_actor = st.selectbox(
111
- "Select from list / Listeden seçin:",
112
- filtered_names,
113
- index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
114
- key="main_sync",
115
- on_change=on_main_click
 
116
  )
 
 
 
117
 
118
- # RESİM GÖSTERME
119
- if final_actor:
120
  found_path = None
121
- target = final_actor.replace(" ", "_").lower()
122
  for f in os.listdir(resim_klasoru):
123
- if target in f.lower() or final_actor.lower() in f.lower():
124
  found_path = os.path.join(resim_klasoru, f)
125
  break
126
 
127
  if found_path:
128
- st.image(found_path, caption=final_actor, use_container_width=True)
 
 
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
-
146
- st.info("💡 Sol panel veya orta liste senkronize çalışır.")
 
 
 
 
 
 
 
 
4
  import random
5
  import os
6
 
 
 
 
 
 
 
 
 
7
  # 1. MODELİ YÜKLE
8
  @st.cache_resource
9
  def load_data():
 
16
  model_data = load_data()
17
  movie_dict = model_data['movie_dict'] if model_data else {}
18
 
19
+ # 2. TÜM OYUNCU DNA VERİTABANI
20
  tum_unlu_verileri = {
21
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
22
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
57
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
58
  }
59
 
60
+ # --- DİNAMİK FİLTRELEME (KLASÖRE GÖRE) ---
61
+ resim_klasoru = os.path.join(os.getcwd(), "40 resim")
 
 
 
62
 
63
+ @st.cache_data
64
+ def klasordeki_unluleri_getir():
65
+ mevcut_unlular = {}
66
+ if os.path.exists(resim_klasoru):
67
+ dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
68
+ for isim, veri in tum_unlu_verileri.items():
69
+ search_pattern1 = isim.lower().replace(" ", "_")
70
+ search_pattern2 = isim.lower()
71
+ if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar):
72
+ mevcut_unlular[isim] = veri
73
+ return mevcut_unlular
74
 
75
+ unlu_verileri = klasordeki_unluleri_getir()
76
+
77
+ # --- ARAYÜZ AYARLARI ---
78
+ st.set_page_config(page_title="CastMatch AI", layout="wide")
79
 
80
+ # --- SESSION STATE (SENKRONİZASYON İÇİN) ---
81
+ if 'shared_selected_actor' not in st.session_state:
82
+ st.session_state.shared_selected_actor = None
83
+
84
+ # --- SOL PANEL (SIDEBAR) ---
85
+ st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
86
  st.sidebar.markdown("---")
87
+
88
+ gender_choice = st.sidebar.radio(
89
+ "1. Select Category / Kategori Seçin:",
90
+ ["Male / Erkek", "Female / Kadın"]
 
 
 
 
 
 
 
91
  )
92
 
93
+ filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
94
+
95
+ # Kategori değişince ilk ismi seçili yap (Hata önleme)
96
+ if st.session_state.shared_selected_actor not in filtered_names and filtered_names:
97
+ st.session_state.shared_selected_actor = filtered_names[0]
98
+
99
+ st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
100
+
101
+ # Sidebar'da butonlar oluşturuyoruz (Basınca ana seçimi günceller)
102
+ for n in filtered_names:
103
+ if st.sidebar.button(f"👤 {n}", key=f"btn_{n}"):
104
+ st.session_state.shared_selected_actor = n
105
+
106
  # --- ANA EKRAN ---
107
+ st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
108
+ st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
109
+ st.markdown("---")
110
 
111
  col_actor, col_match = st.columns([1, 2])
112
 
113
  with col_actor:
114
+ st.subheader("👤 Pick an Actor / Oyuncu Seç")
115
 
116
+ # Seçili olanın listedeki sırasını bul (Senkronizasyonun kalbi burası)
117
+ try:
118
+ current_index = filtered_names.index(st.session_state.shared_selected_actor)
119
+ except:
120
+ current_index = 0
121
+
122
+ # SELECTBOX: st.session_state ile index'i zorluyoruz
123
+ selected_actor = st.selectbox(
124
+ "Select from list / Listeden seçin:",
125
+ filtered_names if filtered_names else ["Yok"],
126
+ index=current_index,
127
+ key="main_selectbox"
128
  )
129
+
130
+ # Selectbox'dan manuel seçim yapılırsa state'i güncelle
131
+ st.session_state.shared_selected_actor = selected_actor
132
 
133
+ if selected_actor != "Yok":
 
134
  found_path = None
135
+ search_target = selected_actor.replace(" ", "_").lower()
136
  for f in os.listdir(resim_klasoru):
137
+ if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
138
  found_path = os.path.join(resim_klasoru, f)
139
  break
140
 
141
  if found_path:
142
+ st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
143
+ else:
144
+ st.error("Resim yüklenemedi. / Image could not be loaded.")
145
 
146
  with col_match:
147
+ st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
148
+ st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
149
+
150
+ if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Yok":
151
+ if movie_dict:
152
+ actor_v = unlu_verileri[selected_actor]['v']
153
+ results = []
154
+ for i in movie_dict:
155
+ noise = random.uniform(0, 0.0001)
156
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
157
+ results.append((movie_dict[i][0], dist))
158
+
159
+ top_matches = sorted(results, key=lambda x: x[1])[:5]
160
+ for i, (film, score) in enumerate(top_matches, 1):
161
+ pct = round((1 - score) * 100, 1)
162
+ st.success(f"**{i}. {film}**")
163
+ st.write(f"Match Score / Uyum Skoru: **%{pct}**")
164
+ st.progress(pct / 100)
165
+ else:
166
+ st.error("Model dosyası eksik! / Model file missing!")
167
+
168
+ st.markdown("---")
169
+ st.info("💡 **How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka, mevcut yerel varlıklara (resimlere) dayanarak kariyer vektörlerini analiz eder.")