Improved spotify play skill

This commit is contained in:
Mathieu B 2021-07-30 19:58:58 +02:00
parent d1ddb1664c
commit 3e7e5288d4
3 changed files with 51 additions and 57 deletions

View File

@ -11,14 +11,8 @@ class SpotifySkill(Skill, metaclass=SkillRegistering):
def handle_play_a_song(self, data):
print(data)
song_lists_matching = None
if 'song' in data:
song_lists_matching = spotify.query_song(data['song'])
if 'singer' in data:
song_lists_matching = spotify.query_song(None, data['singer'])
if 'song' in data and 'singer' in data:
song_lists_matching = spotify.query_song(data['song'], data['singer'])
song_lists_matching = spotify.query_song(data['song'] if 'song' in data else None,
data['artist'] if 'artist' in data else None)
if song_lists_matching is not None and len(song_lists_matching) >= 1:
print(
@ -29,6 +23,8 @@ class SpotifySkill(Skill, metaclass=SkillRegistering):
spotify.get_spotify().add_to_queue(uri=song_lists_matching[0]['uri'])
spotify.get_spotify().next_track()
# spotify.get_spotify().start_playback(context_uri=song_lists_matching[0]['uri'])
else:
print("Nothing found for :" + str(data))
@intent_file_handler("pause_music.intent", "PauseSpotifyIntent")
def pause_music(self, data):

View File

@ -1,4 +1,7 @@
import random
import re
import string
from difflib import SequenceMatcher
import spotipy
from lingua_franca.parse import fuzzy_match
@ -22,18 +25,23 @@ def get_spotify():
def query_song(song=None, artist=None):
print(str(song) + " / " + str(artist))
if song is not None and artist is not None:
song_search = '*{}* artist:{}'.format(song, artist)
query = '*{}* artist:{}'.format(song, artist)
elif song is None and artist is not None:
return query_artist(artist)
query = "artist:" + artist
elif song is not None and artist is None:
query = song
else:
song_search = song
song = "Back In Black AC/DC" # proof that jarvis has a heart :)
query = song
data = get_spotify().search(q=song_search, type='track')['tracks']['items']
data = get_spotify().search(q=query, limit=6, type='track')['tracks']['items']
if data and len(data) > 0:
tracks = [(best_confidence(d['name'], song), d)
for d in data]
if song is not None:
tracks = [(best_confidence(d['name'], song), d) for d in data]
else:
tracks = [(best_confidence(d['name'], 'None'), d) for d in data]
tracks.sort(key=lambda x: x[0])
tracks.reverse() # Place best matches first
@ -50,15 +58,6 @@ def query_song(song=None, artist=None):
return data
def query_artist(artist):
tracks = get_spotify().search(q=("artist:" + artist), limit=10, type='track')['tracks']['items']
if len(tracks) > 0:
tracks.reverse() # Place best matches first
return tracks
return None
def best_confidence(title, query):
"""Find best match for a title against a query.
Some titles include ( Remastered 2016 ) and similar info. This method
@ -70,6 +69,13 @@ def best_confidence(title, query):
Returns:
(float) best condidence
"""
if query == 'None':
return SequenceMatcher(None, random_string_generator(5), random_string_generator(5)).ratio()
best = title.lower()
best_stripped = re.sub(r'(\(.+\)|-.+)$', '', best).strip()
return max(fuzzy_match(best, query), fuzzy_match(best_stripped, query))
def random_string_generator(str_size):
return ''.join(random.choice(string.ascii_letters + string.punctuation) for x in range(str_size))

View File

@ -1,33 +1,25 @@
Joue {song} sur spotify
Joue {song}
Joue la chanson {song}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Mets le titre {song}
Mets le titre {song} sur spotify
Mets le morceau {song}
Mets le morceau {song} sur spotify
Joue le morceau {song}
Joue le morceau {song} sur spotify
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Mets voir {song}
Mets voir {song} sur spotify
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Fait moi écouter {song}
Fait moi écouter {song} sur spotify
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Joue quelque chose de {singer}
Mets de la musique du chanteur {singer}
Joue quelque chose du chanteur {singer}
Joue quelque chose de la chanteuse {singer}
Mets quelque chose de {singer}
Mets quelque chose de la chanteuse {singer}
Mets quelque chose du chanteur {singer}
Joue {song} (sur spotify|)
Joue (le|la|) chanson {song}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist}
Mets (le|la|) chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
(Mets|Joue) (le|la|) (chanson|morceau|titre|) {song} (sur spotify|)
Mets (le|la|) titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Joue (le|la|) (chanson|morceau|titre|) {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets (moi|) voir {song} (sur spotify|)
Mets (moi|) voir un peu de {artist} (sur spotify|)
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Fait moi écouter {song} (sur spotify|)
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets de la musique (de la chanteuse|du chanteur|de) {artist}
(Joue|Mets) quelque chose (de la chanteuse|du chanteur|de) {artist}
Joue (un|une) (chanson|morceau|titre|) (de la chanteuse|du chanteur|de) {artist}
Joue du {artist} (sur spotify|)
Joue voir (la chanson|le morceau|le titre|) {song}
Joue voir (la chanson|le morceau|le titre|) {song} (de la chanteuse|du chanteur|de) {artist}
Joue voir {song} de {artist}
Tu peux jouer le morceau {song}
Tu peux jouer le morceau {song} (de la chanteuse|du chanteur|de) {artist}
Joue moi voir {song} (sur spotify|)
Joue moi voir {song} de {artist} (sur spotify|)
(Joue|Mets) moi un peu de {artist} (sur spotify|)