import streamlit as st import pickle from scipy import spatial import random import os # --- 1. SAYFA YAPISI VE CSS (Titremeyi Engellemek İçin En Önemli Kısım) --- st.set_page_config(page_title="CastMatch AI", layout="wide") # Resim kutusunun zıplamasını engelleyen özel CSS st.markdown(""" """, unsafe_allow_html=True) # --- 2. VERİ VE MODEL (Cache/Önbellek) --- @st.cache_resource def load_model(): try: with open('movie_model.pkl', 'rb') as f: return pickle.load(f) except: return None model_data = load_model() movie_dict = model_data['movie_dict'] if model_data else {} # Veritabanı (Sabit tutuldu) tum_unlu_verileri = { "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]}, "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]}, "Johnny Depp": {"c": "Male / Erkek", "v": [0.1, 0.9, 0.8, 0.4, 0.1, 0.1]}, "Jason Statham": {"c": "Male / Erkek", "v": [0.95, 0.3, 0.1, 0.1, 0.1, 0.7]}, "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]}, "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]}, "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]}, "Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]}, "Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]}, "Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]}, "Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]}, "Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]}, "Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]}, "Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]}, "Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]}, "Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]}, "Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]}, "George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]}, "Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]}, "Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]}, "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]}, "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]}, "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]}, "Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]}, "Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]}, "Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]}, "Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]}, "Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]}, "Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]}, "Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]}, "Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]}, "Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]}, "Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]}, "Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]}, "Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]}, "Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]}, "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]} } # --- 3. DOSYA TARAMA (Cache/Önbellek) --- @st.cache_data def get_images(): return [f for f in os.listdir(os.getcwd()) if f.lower().endswith(('.png', '.jpg', '.jpeg'))] all_images = get_images() # Mevcut olanları filtrele unlu_verileri = {} for n, v in tum_unlu_verileri.items(): if any(n.lower().replace(" ","_") in f.lower() or n.lower() in f.lower() for f in all_images): unlu_verileri[n] = v # --- 4. ARAYÜZ --- st.title("🎬 CastMatch AI") st.markdown("---") col_actor, col_match = st.columns([1, 2]) # Sidebar Kategorisi gender = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"], key="g_radio") names = [n for n, d in unlu_verileri.items() if d['c'] == gender] with col_actor: st.subheader("👤 Cast / Oyuncu") # INDEX kullanarak seçimi sabitlemek titremeyi azaltır actor = st.selectbox("Select / Seç:", names if names else ["-"], key="act_select") # Resim alanı için sabit bir placeholder placeholder = st.empty() if actor != "-": target = actor.lower().replace(" ","_") target_alt = actor.lower() img_file = next((f for f in all_images if f.lower().startswith(target) or f.lower().startswith(target_alt)), None) if img_file: placeholder.image(img_file, use_container_width=True) with col_match: st.subheader("🎯 Matches / Eşleşmeler") if st.button("🚀 Match / Eşleştir", key="m_btn") and actor != "-": if movie_dict: vec = unlu_verileri[actor]['v'] res = [] for i in movie_dict: d = spatial.distance.cosine(vec, movie_dict[i][1][:6]) + random.uniform(0, 0.00001) res.append((movie_dict[i][0], d)) top = sorted(res, key=lambda x: x[1])[:5] for i, (f, s) in enumerate(top, 1): p = round((1-s)*100, 1) st.success(f"**{i}. {f}** (%{p})") st.progress(p/100)