Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mood Based Music Recommender #98

Merged
merged 2 commits into from
Nov 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions Mood Based Music Recommender/Emosic-Spoti.py
Original file line number Diff line number Diff line change
@@ -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']}")
72 changes: 72 additions & 0 deletions Mood Based Music Recommender/README.md
Original file line number Diff line number Diff line change
@@ -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.
Binary file added Mood Based Music Recommender/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions Mood Based Music Recommender/requirement.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
requests==2.32.3
spotipy==2.24.0
Loading