Song_recommendation / src /streamlit_app.py
subhan971's picture
Update src/streamlit_app.py
9726da2 verified
import os
import mimetypes
import uuid
import streamlit as st
from google import generativeai as genai
import tempfile
from PIL import Image
# Configure Gemini API
def configure_api():
api_key = st.secrets.get("GEMINI_API_KEY", "AIzaSyBDkLcFKzE_T6r1E5XjbuXVaoW40Szn71s") # Use secrets for API key
genai.configure(api_key=api_key)
return genai.GenerativeModel('gemini-2.0-flash')
def process_image(image_path, model):
mime_type, _ = mimetypes.guess_type(image_path)
if not mime_type:
mime_type = "image/jpeg"
with open(image_path, "rb") as img_file:
image_data = img_file.read()
response = model.generate_content(
[
{"mime_type": mime_type, "data": image_data},
"""Analyze the given picture, paying close attention to every detail. Based on your analysis, identify one suitable Pakistani or Hindi song released between 2007 and 2023 that you believe resonates with the person depicted in the image (considering their perceived gender). Provide only the name of the song."""
]
)
return response.text.strip()
def open_youtube_search(song_name):
search_query = f"https://www.youtube.com/results?search_query={song_name.replace(' ', '+')}"
return search_query
# Streamlit UI
st.set_page_config(page_title="Hindi Song Recommender", layout="centered")
st.title("🎶 Hindi Song Recommender from Image")
st.write("Upload your image to get a personalized Hindi/Pakistani song recommendation!")
# Initialize session state
if "image_path" not in st.session_state:
st.session_state.image_path = None
if "suggested_song" not in st.session_state:
st.session_state.suggested_song = None
# Main app workflow
uploaded_file = st.file_uploader("Drag and drop your image here", type=["jpg", "jpeg", "png"])
if uploaded_file:
# Create a temporary directory if it doesn't exist
temp_dir = tempfile.gettempdir()
os.makedirs(temp_dir, exist_ok=True)
# Save the uploaded file to the temporary directory
image_path = os.path.join(temp_dir, f"temp_{uuid.uuid4().hex[:8]}.jpg")
with open(image_path, "wb") as f:
f.write(uploaded_file.getbuffer())
# Display the image
st.session_state.image_path = image_path
st.image(uploaded_file, caption="Uploaded Image", use_container_width=True)
# Camera capture option (Streamlit's built-in camera functionality)
camera_option = st.checkbox("Use Camera Instead")
if camera_option:
camera_input = st.camera_input("Take a picture")
if camera_input:
# Create a temporary directory if it doesn't exist
temp_dir = tempfile.gettempdir()
os.makedirs(temp_dir, exist_ok=True)
# Save the captured image
image_path = os.path.join(temp_dir, f"camera_{uuid.uuid4().hex[:8]}.jpg")
with open(image_path, "wb") as f:
f.write(camera_input.getbuffer())
st.session_state.image_path = image_path
# Process the image and suggest a song
if st.session_state.image_path and st.button("Suggest Hindi Song"):
with st.spinner("Analyzing image and finding a song..."):
try:
model = configure_api()
st.session_state.suggested_song = process_image(st.session_state.image_path, model)
st.success(f"🎵 Suggested Hindi Song: {st.session_state.suggested_song}")
# Generate YouTube search link
youtube_link = open_youtube_search(st.session_state.suggested_song)
st.markdown(f"[Click here to listen on YouTube]({youtube_link})")
except Exception as e:
st.error(f"Error: {e}")
# Display song suggestion if available
if st.session_state.suggested_song:
st.subheader("Your Song Recommendation:")
st.write(f"🎵 {st.session_state.suggested_song}")
# Create a YouTube search button
youtube_link = open_youtube_search(st.session_state.suggested_song)
st.markdown(f"[Listen on YouTube]({youtube_link})")
# Add app information
st.sidebar.title("About")
st.sidebar.info("""
This app uses Google's Gemini AI to analyze your image and suggest a Hindi or Pakistani song
that resonates with the person in the image. Upload a photo or take one with your camera!
""")
# Add footer
st.markdown("---")
st.markdown("Made with ❤️ | Powered by Gemini 2.0")