ModusMusic / app.py
IshmamF's picture
Update app.py
b43e7b9
import streamlit as st
from spotify_api import SpotifyClient
from sentiment_analysis import SentimentAnalyzer
from song_matching import SongMatcher
# Spotify API credentials - ensure these are securely stored or use environment variables
CLIENT_ID = "c34955a27b6447e3a1b92305d04bbbea"
CLIENT_SECRET = "1d197925c0654b5da80bd3cfa1f5afdd"
# Initialize SpotifyClient, SentimentAnalyzer, and SongMatcher
spotify_client = SpotifyClient(CLIENT_ID, CLIENT_SECRET)
sentiment_analyzer = SentimentAnalyzer()
song_matcher = SongMatcher('./music_mental_health.csv')
# Streamlit app layout
st.set_page_config(page_title="MODUS MUSIC", layout="wide") # New: Setting page title and layout
# Custom CSS for background and text color
st.markdown("""
<style>
.stApp {
background: rgb(0,0,0);
background-size: cover;
color: white; /* Sets global text color to white */
}
/* General rule for all labels */
label {
color: white !important;
}
/* Specific color for the main title */
h1 {
color: red !important; /* Making the MODUS MUSIC title red */
}
/* Additional specific styling */
.stTextInput > label, .stButton > button, .css-10trblm, .css-1yjuwjr, .intro {
color: white !important;
}
</style>
""", unsafe_allow_html=True)
image_path = './MODUSMUSIC.png' # Replace with the actual path to your image
st.image(image_path, use_column_width=False, width=250) # Adjust the width as needed
# Custom gradient background using CSS
st.markdown("""
<style>
.stApp {
background: rgb(0,0,0);
background-size: cover;
}
</style>
""", unsafe_allow_html=True)
# Custom HTML for the main title
st.markdown("<h1 style='text-align: center; font-weight: bold;'>MODUS MUSIC</h1>", unsafe_allow_html=True)
st.title('Music Suggestion Based on Your Feeling') # Existing Title
# New: Introduction Section
with st.container():
st.markdown("""
<style>
.intro {
font-size:18px;
}
</style>
<div class='intro'>
Welcome to Modus Music! Share your vibe, and let's find the perfect songs to match your mood.
Just type in your thoughts, and we'll do the rest.
</div>
""", unsafe_allow_html=True)
# User input text area
with st.container():
user_input = st.text_area("What's your vibe? Tell me about it:", key="123", height=150, max_chars=500)
m = st.markdown("""
<style>
div.stButton > button:first-child {
background-color: rgb(204, 49, 49);
}
</style>""", unsafe_allow_html=True)
# Use the custom style for the button
submit_button = st.button("Generate music")
# Processing and Displaying Results
if submit_button and user_input.strip():
# Run sentiment analysis on the user input
sentiment_label, sentiment_score = sentiment_analyzer.analyze_sentiment(user_input)
st.write(f"Sentiment: {sentiment_label}, Score: {sentiment_score:.2f}")
suggested_songs = song_matcher.match_songs_with_sentiment(sentiment_label, sentiment_score, user_input, 0.00625)
with st.container():
st.markdown("<div class='song-list'>", unsafe_allow_html=True)
st.write("Based on your vibe, you might like these songs:")
for index, row in suggested_songs.iterrows():
song = row['song']
artist = row['artist']
track_id = spotify_client.get_track_id(song)
if track_id:
preview_url = spotify_client.get_track_preview_url(track_id)
st.write(f"{song} by {artist}")
with st.expander(f"Show Lyrics for {song} by {artist}", expanded=False):
st.write(f"Lyrics: {row['seq']}")
if preview_url:
st.audio(preview_url)
else:
st.write("No Preview Available")
else:
st.write(f"Unable to find {song} by {artist} on Spotify.")
st.markdown("</div>", unsafe_allow_html=True)
elif submit_button and not user_input.strip():
st.warning("Please provide a longer response with 5 words or more.")
st.rerun()