From 3e7e5288d4136f8b2c0ac51b60ebab55e28edc3a Mon Sep 17 00:00:00 2001 From: Mathieu B Date: Fri, 30 Jul 2021 19:58:58 +0200 Subject: [PATCH] Improved spotify play skill --- .../skills/entertainement/spotify/__init__.py | 12 ++-- .../skills/entertainement/spotify/spotify.py | 38 +++++++----- .../spotify/vocab/fr-fr/play_a_song.intent | 58 ++++++++----------- 3 files changed, 51 insertions(+), 57 deletions(-) diff --git a/jarvis/skills/entertainement/spotify/__init__.py b/jarvis/skills/entertainement/spotify/__init__.py index bbcbea6..a948980 100644 --- a/jarvis/skills/entertainement/spotify/__init__.py +++ b/jarvis/skills/entertainement/spotify/__init__.py @@ -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): diff --git a/jarvis/skills/entertainement/spotify/spotify.py b/jarvis/skills/entertainement/spotify/spotify.py index 4949756..20e6ba2 100644 --- a/jarvis/skills/entertainement/spotify/spotify.py +++ b/jarvis/skills/entertainement/spotify/spotify.py @@ -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)) diff --git a/jarvis/skills/entertainement/spotify/vocab/fr-fr/play_a_song.intent b/jarvis/skills/entertainement/spotify/vocab/fr-fr/play_a_song.intent index adbaa0b..b3e42f4 100644 --- a/jarvis/skills/entertainement/spotify/vocab/fr-fr/play_a_song.intent +++ b/jarvis/skills/entertainement/spotify/vocab/fr-fr/play_a_song.intent @@ -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} \ No newline at end of file +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|) \ No newline at end of file