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): def handle_play_a_song(self, data):
print(data) print(data)
song_lists_matching = None song_lists_matching = spotify.query_song(data['song'] if 'song' in data else None,
data['artist'] if 'artist' in data else 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'])
if song_lists_matching is not None and len(song_lists_matching) >= 1: if song_lists_matching is not None and len(song_lists_matching) >= 1:
print( 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().add_to_queue(uri=song_lists_matching[0]['uri'])
spotify.get_spotify().next_track() spotify.get_spotify().next_track()
# spotify.get_spotify().start_playback(context_uri=song_lists_matching[0]['uri']) # 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") @intent_file_handler("pause_music.intent", "PauseSpotifyIntent")
def pause_music(self, data): def pause_music(self, data):

View File

@ -1,4 +1,7 @@
import random
import re import re
import string
from difflib import SequenceMatcher
import spotipy import spotipy
from lingua_franca.parse import fuzzy_match from lingua_franca.parse import fuzzy_match
@ -22,18 +25,23 @@ def get_spotify():
def query_song(song=None, artist=None): def query_song(song=None, artist=None):
print(str(song) + " / " + str(artist))
if song is not None and artist is not None: 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: 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: 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: if data and len(data) > 0:
tracks = [(best_confidence(d['name'], song), d) if song is not None:
for d in data] 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.sort(key=lambda x: x[0])
tracks.reverse() # Place best matches first tracks.reverse() # Place best matches first
@ -50,15 +58,6 @@ def query_song(song=None, artist=None):
return data 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): def best_confidence(title, query):
"""Find best match for a title against a query. """Find best match for a title against a query.
Some titles include ( Remastered 2016 ) and similar info. This method Some titles include ( Remastered 2016 ) and similar info. This method
@ -70,6 +69,13 @@ def best_confidence(title, query):
Returns: Returns:
(float) best condidence (float) best condidence
""" """
if query == 'None':
return SequenceMatcher(None, random_string_generator(5), random_string_generator(5)).ratio()
best = title.lower() best = title.lower()
best_stripped = re.sub(r'(\(.+\)|-.+)$', '', best).strip() best_stripped = re.sub(r'(\(.+\)|-.+)$', '', best).strip()
return max(fuzzy_match(best, query), fuzzy_match(best_stripped, query)) 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} (sur spotify|)
Joue {song} Joue (le|la|) chanson {song}
Joue la chanson {song} Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} Mets (le|la|) chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} (Mets|Joue) (le|la|) (chanson|morceau|titre|) {song} (sur spotify|)
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify Mets (le|la|) titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets le titre {song} Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets le titre {song} sur spotify Joue (le|la|) (chanson|morceau|titre|) {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets le morceau {song} Mets (moi|) voir {song} (sur spotify|)
Mets le morceau {song} sur spotify Mets (moi|) voir un peu de {artist} (sur spotify|)
Joue le morceau {song} Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Joue le morceau {song} sur spotify Fait moi écouter {song} (sur spotify|)
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {artist} (sur spotify|)
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify Mets de la musique (de la chanteuse|du chanteur|de) {artist}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify (Joue|Mets) quelque chose (de la chanteuse|du chanteur|de) {artist}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} Joue (un|une) (chanson|morceau|titre|) (de la chanteuse|du chanteur|de) {artist}
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} Joue du {artist} (sur spotify|)
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify Joue voir (la chanson|le morceau|le titre|) {song}
Mets voir {song} Joue voir (la chanson|le morceau|le titre|) {song} (de la chanteuse|du chanteur|de) {artist}
Mets voir {song} sur spotify Joue voir {song} de {artist}
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} Tu peux jouer le morceau {song}
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify Tu peux jouer le morceau {song} (de la chanteuse|du chanteur|de) {artist}
Fait moi écouter {song} Joue moi voir {song} (sur spotify|)
Fait moi écouter {song} sur spotify Joue moi voir {song} de {artist} (sur spotify|)
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} (Joue|Mets) moi un peu de {artist} (sur spotify|)
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}