Skip to content

Commit 999b152

Browse files
author
Your Name
committed
added db functionality and improved algorithm
1 parent 272d458 commit 999b152

File tree

5 files changed

+223
-75
lines changed

5 files changed

+223
-75
lines changed

app.py

+36-13
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from flask import Flask,request,session, g, redirect
22
from flask.templating import render_template
3-
from models import db, connect_db,User
3+
from requests.sessions import Session
4+
from models import db, connect_db,User,Playlist,Song,Playlist_Songs
45
import requests
56
import json
67
from forms import AddUser, LoginUser
78
import os
89
import requests
910
from twitter_helper import get_tweets,get_id
1011
from google_helper import google_sentiment_analysis,get_focus_sentiment
11-
from spotify_helper import get_playlist
12+
from spotify_helper import get_urmusic, get_danceability
1213

1314

1415
app = Flask(__name__)
@@ -100,21 +101,43 @@ def urMusic(username):
100101
sentiments.append(sentiment.score)
101102

102103
focus_sentiment=round(get_focus_sentiment(sentiments),2)
104+
target_danceability=get_danceability(focus_sentiment)
105+
music= get_urmusic(focus_sentiment)
106+
new_playlist=Playlist(
107+
sentiment=focus_sentiment,
108+
danceability=target_danceability,
109+
user_id=session[USER_KEY]
110+
)
111+
db.session.add(new_playlist)
112+
db.session.commit()
113+
recommended_music=[]
114+
for track in music:
115+
artist=track['artists'][0]['name']
116+
track=track['name']
117+
new_track=Song(
118+
artist=artist,
119+
title=track
120+
)
121+
db.session.add(new_track)
122+
db.session.commit()
123+
playlist_song_relationship=Playlist_Songs(
124+
playlist_id=new_playlist.id,
125+
song_id=new_track.id
126+
)
127+
db.session.add(playlist_song_relationship)
128+
db.session.commit()
129+
103130

131+
recommended_music.append([track,artist])
104132

105-
music= get_playlist(focus_sentiment)
106-
107-
# recommended_music=[]
108-
# for song in music:
109-
# recommended_music.append([song['artists'][0]['name'],song["name"]])
110-
# return music
133+
111134

112135
# return f"tweets:{tweets}"
113-
if music is None:
114-
results="music not found, currently working on improving algorithm for best results"
115-
return render_template('results.html',music=results)
116-
results=[music['artists'][0]['name'],music['name']]
117-
return render_template('results.html',music=results)
136+
# if music is None:
137+
# results="music not found, currently working on improving algorithm for best results"
138+
# return render_template('results.html',music=results)
139+
# results=[music['artists'][0]['name'],music['name']]
140+
return render_template('results.html',music=recommended_music)
118141
# f"tweets:{tweets}, sentiments:{sentiments}, focus:{focus_sentiment}, music:{music['artists'][0]['name'],music['name']}"
119142

120143

models.py

+39-7
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,48 @@ def signup(cls, username,email,password,twitter_handle):
3030
db.session.add(user)
3131
return user
3232

33+
@classmethod
34+
def authenticate(cls, username, password):
35+
user = cls.query.filter_by(username=username).first()
36+
37+
if user:
38+
is_auth = bcrypt.check_password_hash(user.password, password)
39+
if is_auth:
40+
return user
41+
42+
return False
3343

3444
class Playlist(db.Model):
35-
"""playlist"""
45+
"""playlists"""
3646
__tablename__="playlists"
3747

38-
PlaylistID=db.Column(db.Integer,primary_key=True,autoincrement=True)
39-
Mood=db.Column(db.String,nullable=False)
40-
UserID=db.Column(db.String)
48+
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
49+
sentiment=db.Column(db.String,nullable=False)
50+
danceability=db.Column(db.String,nullable=False)
51+
user_id = db.Column(
52+
db.Integer,
53+
db.ForeignKey('users.id', ondelete='CASCADE'),
54+
nullable=False,
55+
)
56+
user = db.relationship('User')
57+
class Song(db.Model):
58+
"""songs"""
59+
__tablename__="songs"
60+
61+
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
62+
artist=db.Column(db.String,nullable=False)
63+
title=db.Column(db.String,nullable=False)
64+
65+
class Playlist_Songs(db.Model):
66+
__tablename__="playlistsongs"
67+
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
68+
playlist_id=db.Column(
69+
db.Integer,
70+
db.ForeignKey('playlists.id', ondelete='CASCADE')
71+
)
72+
song_id=db.Column(
73+
db.Integer,
74+
db.ForeignKey('songs.id', ondelete='CASCADE')
75+
)
4176

42-
# class Songs(db.Model):
43-
# """songs"""
44-
# __tablename__="songs"
4577

seed.py

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,32 @@
11
from app import app
2-
from models import db
2+
from models import db, connect_db,User,Playlist,Song,Playlist_Songs
3+
34

45
db.drop_all()
56
db.create_all()
7+
db.session.rollback()
8+
user1=User.signup(
9+
username="grizzbear",
10+
11+
password="password123",
12+
twitter_handle="CarlosS21109669"
13+
)
14+
db.session.commit()
615

16+
playlist1=Playlist(
17+
sentiment=".5",
18+
danceability=".7",
19+
user_id=1
20+
)
21+
song1=Song(
22+
artist="tee grizzly",
23+
title="8 mile road"
24+
)
25+
db.session.add_all([playlist1,song1])
26+
db.session.commit()
27+
playlist_song1=Playlist_Songs(
28+
playlist_id=1,
29+
song_id=1
30+
)
31+
db.session.add(playlist_song1)
32+
db.session.commit()

spotify_helper.py

+120-53
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
import base64
3+
from models import Playlist
34
import requests
45
import random
56

@@ -29,75 +30,146 @@ def get_token_for_spotify():
2930
result=requests.post(url,data=data, headers=headers)
3031
token=result.json()
3132
return token['access_token']
33+
def get_danceability(focus_sentiment):
34+
return (focus_sentiment+1)/2
3235

33-
def get_random_song(playlist_id):
36+
37+
def get_playlist_from_sentiment(focus_sentiment):
38+
39+
if focus_sentiment==-1:
40+
# Hardcore Punk Rock
41+
return "7mCzIltN0jFQ54GH02HMsY"
42+
elif focus_sentiment >-1 and focus_sentiment<=-0.9:
43+
#Metal/ Hard Rock
44+
return "1GXRoQWlxTNQiMNkOe7RqA"
45+
elif focus_sentiment >-0.9 and focus_sentiment<=-0.8:
46+
# Dream Pop
47+
return "37i9dQZF1DX6uhsAfngvaD"
48+
elif focus_sentiment >-0.8 and focus_sentiment<=-0.7:
49+
# Indie Rock
50+
return "7lnCgcTxLTTcOqvgoS80sC"
51+
elif focus_sentiment >-0.7 and focus_sentiment<=-0.6:
52+
# EDM
53+
return "2e3dcRuo9uDH6qD3NOGKAL"
54+
elif focus_sentiment >-0.6 and focus_sentiment<=-0.5:
55+
# Alternative Rock
56+
return "37i9dQZF1DX9GRpeH4CL0S"
57+
elif focus_sentiment >-0.5 and focus_sentiment<=-0.4:
58+
# R&B
59+
return "37i9dQZF1DX4SBhb3fqCJd"
60+
elif focus_sentiment >-0.4 and focus_sentiment<=-0.3:
61+
# Blues
62+
return "37i9dQZF1DXd9rSDyQguIk"
63+
elif focus_sentiment >-0.3 and focus_sentiment<=-0.2:
64+
# Indie Folk
65+
return "5tOffZXVBFTMS7mkKQ3tpX"
66+
elif focus_sentiment >-0.2 and focus_sentiment<=-0.1:
67+
# country
68+
return "37i9dQZF1DX13ZzXoot6Jc"
69+
elif focus_sentiment >-0.1 and focus_sentiment<0.1:
70+
# ambient
71+
return "1kqBP6eE24L0agNpnTIKtc"
72+
elif focus_sentiment >=0.1 and focus_sentiment<0.2:
73+
# Classical
74+
return "37i9dQZF1DWWEJlAGA9gs0"
75+
elif focus_sentiment >=0.2 and focus_sentiment<0.3:
76+
# Jazz
77+
return "37i9dQZF1DXbITWG1ZJKYt"
78+
elif focus_sentiment >=0.3 and focus_sentiment<0.4:
79+
# Reggae
80+
return "37i9dQZF1DXbSbnqxMTGx9"
81+
elif focus_sentiment >=0.4 and focus_sentiment<0.5:
82+
# Rap
83+
return "37i9dQZF1DX0XUsuxWHRQd"
84+
elif focus_sentiment >=0.5 and focus_sentiment<0.6:
85+
# Love
86+
return "5KbTzqKBqxQRD8OBtJTZrS"
87+
elif focus_sentiment >=0.6 and focus_sentiment<0.7:
88+
# Latino
89+
return "37i9dQZF1DX10zKzsJ2jva"
90+
elif focus_sentiment >=0.7 and focus_sentiment<0.8:
91+
# Pop
92+
return "37i9dQZF1DX2L0iB23Enbq"
93+
elif focus_sentiment >=0.8 and focus_sentiment<0.9:
94+
# Disco
95+
return "37i9dQZF1DX2GKumqRIZ7g"
96+
elif focus_sentiment >=0.9 and focus_sentiment<1:
97+
# Funk
98+
return "37i9dQZF1DWWvhKV4FBciw"
99+
elif focus_sentiment ==1:
100+
# Salsa
101+
return "37i9dQZF1DX7SeoIaFyTmA"
102+
103+
def determine_starting_playlists(focus_sentiment):
104+
playlists=[]
105+
# get playlists based on sentiment
106+
focus_sentiments=[focus_sentiment-0.1,focus_sentiment,focus_sentiment+0.1]
107+
for sentiment in focus_sentiments:
108+
playlists.append(get_playlist_from_sentiment(sentiment))
109+
return playlists
110+
def get_tracks(playlist_id):
34111
token= get_token_for_spotify()
35112
params={"market":"US","limit":10}
36113
headers={
37114
"Authorization":"Bearer {}".format(token)
38115
}
39116
url=f"https://api.spotify.com/v1/playlists/{playlist_id}/tracks"
40117
response= requests.request("GET",url,headers=headers,params=params)
41-
song=response.json()
42-
rand=get_rand()
43-
return song["items"][rand]["track"]["id"]
44-
45-
def get_random_artist(playlist_id):
118+
tracks=response.json()
119+
return tracks
120+
def get_track_seed(tracks):
121+
rand=random.randint(0,len(tracks["items"])-1)
122+
track_seed=tracks["items"][rand]["track"]["id"]
123+
return track_seed
124+
def get_artist_seed(tracks):
125+
rand=random.randint(0,len(tracks["items"])-1)
126+
artist_seed=tracks["items"][rand]["track"]["artists"][0]["id"]
127+
return artist_seed
128+
129+
130+
def get_featured_playlists():
46131
token= get_token_for_spotify()
47-
48132
params={"market":"US","limit":1}
49133
headers={
50134
"Authorization":"Bearer {}".format(token)
51135
}
52-
url=f"https://api.spotify.com/v1/playlists/{playlist_id}/tracks"
136+
url=f"https://api.spotify.com/v1/browse/featured-playlists"
53137
response= requests.request("GET",url,headers=headers,params=params)
54-
artist=response.json()
55-
return artist["items"][0]["track"]["artists"][0]["id"]
138+
ids=response.json()["playlists"]["items"]
139+
featured_playlists=[]
140+
for playlist in ids:
141+
featured_playlists.append(playlist["id"])
142+
return featured_playlists
56143

144+
def get_urmusic(focus_sentiment):
145+
track_seeds=[]
146+
artist_seeds=[]
57147

58-
def get_random_genre(artist_seed):
59-
token= get_token_for_spotify()
60-
artist_id=artist_seed
61-
params={"ids":artist_id}
62-
headers={
63-
"Authorization":"Bearer {}".format(token)
64-
}
65-
url=f"https://api.spotify.com/v1/artists"
66-
response= requests.request("GET",url,headers=headers,params=params)
67-
genre=response.json()
68-
return genre["artists"][0]["genres"]
69148

70-
def get_starting_point_playlist(focus_sentiment):
71-
if focus_sentiment >= -1 and focus_sentiment<-0.7:
72-
return "7mCzIltN0jFQ54GH02HMsY"
73-
elif focus_sentiment>=-0.7 and focus_sentiment<-0.4:
74-
return "37i9dQZF1DX0XUsuxWHRQd"
75-
elif focus_sentiment>=-0.4 and focus_sentiment<0:
76-
return "4y3WX0SZQ2cTLBovftfyiP"
77-
elif focus_sentiment>=0 and focus_sentiment<.4:
78-
return "37i9dQZF1DWV7EzJMK2FUI"
79-
elif focus_sentiment>=.4 and focus_sentiment<0.7:
80-
return "7vI0tN3yUn07dkK9T6p2pg"
81-
elif focus_sentiment>=0.7 and focus_sentiment<=1:
82-
return "37i9dQZF1DXaqCgtv7ZR3L"
83-
84-
def get_recommended_music(focus,playlist_id):
85-
token= get_token_for_spotify()
86-
track_seed=get_random_song(playlist_id)
87-
track_seed2=get_random_song(playlist_id)
149+
#get seeds from featured music in spotify (2)
150+
featured_playlists=get_featured_playlists()
151+
for playlist in featured_playlists:
152+
list_of_tracks=get_tracks(playlist)
153+
artist_seeds.append(get_artist_seed(list_of_tracks))
154+
track_seeds.append(get_track_seed(list_of_tracks))
88155

89-
artist_seed=get_random_artist(playlist_id)
90-
genre_seed=get_random_genre(artist_seed)
156+
# get seeds from playlists determined by sentiment-genre conrrelation (3)
157+
playlists=determine_starting_playlists(focus_sentiment)
158+
for playlist in playlists:
159+
list_of_tracks=get_tracks(playlist)
160+
artist_seeds.append(get_artist_seed(list_of_tracks))
161+
track_seeds.append(get_track_seed(list_of_tracks))
91162

163+
# return artist_seeds
92164

93-
limit=10
94-
target_danceability=(focus+1)/2
95-
165+
token= get_token_for_spotify()
166+
target_danceability=get_danceability(focus_sentiment)
167+
168+
limit=20
96169
params={
97170
"limit":limit,
98-
"seed_artists":[artist_seed],
99-
"seed_genres":[genre_seed],
100-
"seed_tracks":[track_seed,track_seed2],
171+
"seed_artists":artist_seeds,
172+
"seed_tracks":track_seeds,
101173
"market":"US",
102174
"target_danceability":target_danceability
103175
}
@@ -108,14 +180,9 @@ def get_recommended_music(focus,playlist_id):
108180
response= requests.request("GET",url,headers=headers,params=params)
109181
recommended=response.json()
110182
try:
111-
results=recommended['tracks'][0]
183+
results=recommended["tracks"]
112184
return results
113185
except:
114186
return None
115187

116188

117-
118-
def get_playlist(focus_sentiment):
119-
playlist_id=get_starting_point_playlist(focus_sentiment)
120-
return get_recommended_music(focus_sentiment,playlist_id)
121-

templates/base.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</head>
1010
<body>
1111
<nav class="navbar navbar-expand-lg navbar-light bg-light">
12-
<a class="navbar-brand" href="#">Navbar</a>
12+
<a class="navbar-brand" href="#">UrMusics</a>
1313
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
1414
<span class="navbar-toggler-icon"></span>
1515
</button>

0 commit comments

Comments
 (0)