diff --git a/#30-Mood-Based-Music-Recommender/Emosic-Spoti.py b/#30-Mood-Based-Music-Recommender/Emosic-Spoti.py new file mode 100644 index 0000000..da83311 --- /dev/null +++ b/#30-Mood-Based-Music-Recommender/Emosic-Spoti.py @@ -0,0 +1,87 @@ +import spotipy +from spotipy.oauth2 import SpotifyClientCredentials +import random + +# Authentication - Replace with your credentials +CLIENT_ID = 'your_spotify_client_id' +CLIENT_SECRET = 'your_spotify_client_secret' + +# Connect to Spotify API +auth_manager = SpotifyClientCredentials(client_id=CLIENT_ID, client_secret=CLIENT_SECRET) +sp = spotipy.Spotify(auth_manager=auth_manager) + +# Dictionary to map emotions to musical characteristics +emotion_to_genre = { + 'happy': ['pop', 'dance', 'indie'], + 'sad': ['acoustic', 'blues', 'piano'], + 'angry': ['metal', 'rock', 'punk'], + 'relaxed': ['ambient', 'chill', 'classical'], + 'energetic': ['electronic', 'hip-hop', 'funk'], + 'anxious': ['ambient', 'classical', 'jazz'], + 'cheerful': ['pop', 'indie', 'reggae'], + 'stressed': ['jazz', 'chill', 'lo-fi'], + 'dreamy': ['dream-pop', 'ambient', 'shoegaze'], + 'excited': ['dance', 'electronic', 'pop'], + 'bored': ['alternative', 'indie', 'chill'], + 'nostalgic': ['classic rock', 'folk', 'retro'], + 'hopeful': ['pop', 'inspirational', 'uplifting'], + 'content': ['soft rock', 'acoustic', 'country'], + 'romantic': ['pop', 'r&b', 'soul'], +} + +# Function to recommend tracks based on emotion +def recommend_tracks(emotion): + genres = emotion_to_genre.get(emotion.lower(), ['pop']) # Default to 'pop' if emotion is not found + selected_genre = random.choice(genres) + + # Fetch recommendations from Spotify + results = sp.recommendations(seed_genres=[selected_genre], limit=10) # Increase limit for more results + tracks = results['tracks'] + + playlist = [] + for track in tracks: + track_info = { + 'name': track['name'], + 'artist': track['artists'][0]['name'], + 'url': track['external_urls']['spotify'] + } + playlist.append(track_info) + + return playlist, genres + +# Function to get maximum length of strings in a list of dictionaries +def get_max_lengths(playlist): + max_name_length = max(len(song['name']) for song in playlist) if playlist else 0 + max_artist_length = max(len(song['artist']) for song in playlist) if playlist else 0 + max_url_length = max(len(song['url']) for song in playlist) if playlist else 0 + return max_name_length, max_artist_length, max_url_length + +# Main loop for user input +while True: + emotion = input("\nEnter your emotion (happy, sad, angry, relaxed, energetic, anxious, cheerful, stressed, dreamy, excited, bored, nostalgic, hopeful, content, romantic) or type 'exit' to quit: ").strip().lower() + + if emotion == 'exit': + print("Goodbye my Love!!!") + break + + # Get playlist based on the emotion + playlist, genres = recommend_tracks(emotion) + + # Get maximum lengths for formatting + max_name_length, max_artist_length, max_url_length = get_max_lengths(playlist) + + # Set a minimum width for columns to ensure proper alignment + min_name_length = max(20, max_name_length) + min_artist_length = max(15, max_artist_length) + min_url_length = 35 # Fixed width for URL + + # Display the recommended playlist + if emotion not in emotion_to_genre: + print("The emotion you entered is NOT in the list, so we will show you pop music instead.") + + print(f"Here are some songs for your '{emotion}' mood:" if emotion in emotion_to_genre else "Here are some pop songs for you:") + print(f"STT | Song Name{' ' * (min_name_length - 9)} | Artist{' ' * (min_artist_length - 6)} | URL") + print("-" * (11 + max_name_length + max_artist_length + max_url_length)) + + for idx, song in enumerate(playlist, 1): + print(f"{idx:<3} | {song['name']:<{min_name_length}} | {song['artist']:<{min_artist_length}} | {song['url']}") diff --git a/#30-Mood-Based-Music-Recommender/README.md b/#30-Mood-Based-Music-Recommender/README.md new file mode 100644 index 0000000..1b5917b --- /dev/null +++ b/#30-Mood-Based-Music-Recommender/README.md @@ -0,0 +1,72 @@ +# Music Recommendation Based on Emotion + +A Python script that recommends music playlists based on user-inputted emotions using the Spotify API. The script fetches songs that match the user's mood and provides a playlist with links to each song. + +## Features + +- Recommend songs based on various emotions. +- Integrates with Spotify's Web API to fetch song recommendations. + +## Setup + +### 1. Set Up Spotify API + +To use this script, you will need to create a Spotify Developer account and register an app to obtain your Client ID and Client Secret. Follow the instructions [here](https://developer.spotify.com/documentation/general/guides/authorization/app-settings/) to get your credentials. + +Here is an example: + +![alt text](image.png) + +### 2. Install Required Libraries + +Make sure you have the following Python libraries installed: + + ```bash + pip install spotipy + pip install requests + ``` + + +### 3. Run the Script + +**Notes:** +- Replace **your_spotify_client_id** and **your_spotify_client_secret** in the script with your actual Spotify API credentials. +- You can extend the emotion_to_genre dictionary with more emotions and genres. +- You can modify the limit=10 in the Spotify recommendations query to change the number of recommended songs. + +To run the script, use the following command: + + ```bash + python Emosic-Spoti.py + ``` + +**Usage** + +After running the script, enter an emotion from the list below to get a music playlist: + +- happy +- sad +- angry +- relaxed +- energetic +- anxious +- cheerful +- stressed +- dreamy +- excited +- bored +- nostalgic +- hopeful +- content +- romantic + + Type 'exit' to quit the program. + +If the Emotion you enter is NOT in the list, so we will show **pop** music instead. + +**How It Works** + +- **Authentication**: The script uses the SpotifyClientCredentials class to handle authentication with the Spotify API. +- **Emotion-to-Genre Mapping**: The script maps emotions to corresponding music genres using a predefined dictionary. +- **Track Recommendations**: The script queries the Spotify API to fetch song recommendations based on the selected genre. +- **User Input**: The user inputs their emotion, and the script fetches and displays a playlist of matching songs. \ No newline at end of file diff --git a/#30-Mood-Based-Music-Recommender/image.png b/#30-Mood-Based-Music-Recommender/image.png new file mode 100644 index 0000000..046b91e Binary files /dev/null and b/#30-Mood-Based-Music-Recommender/image.png differ diff --git a/#30-Mood-Based-Music-Recommender/requirement.txt b/#30-Mood-Based-Music-Recommender/requirement.txt new file mode 100644 index 0000000..7926153 --- /dev/null +++ b/#30-Mood-Based-Music-Recommender/requirement.txt @@ -0,0 +1,2 @@ +requests==2.32.3 +spotipy==2.24.0