Yadomi!

Do you remember when the world wide web was fun ?


Playlist intelligente avec LastFM et MPD

MPD ne sait pas créer des playlist intelligente, c'est un fait. En tout cas pas pour l'instant. À l'instar d'iTunes ou de Google Music, j'ai essayé de trouver un moyen de générer des playlists intelligentes.

C'est à partir d'une musique, qu'un algorithme essaye de trouver des musiques similaires et de les ajouter à une liste de lecture.

LastFM propose dans son API une méthode très intéressante puisqu'elle va nous mâcher le travaille: track.getSimilar

La méthode parle d'elle-même, elle retourne des chansons similaires. De plus, les gars de LastFM sont des gars bien, ils nous donnent pour chaque musique ou artistes les ID de MusicBrainz !

Donc finalement c'est plutôt simple, il suffit de prendre une musique de départ, d'envoyer son titre et son auteur à LastFM, puis de comparer les musiques que nous renvoi l'API par ceux disponible dans la bibliothèque MPD.

J'ai donc assemblé le tout avec du Python, parce que le python, c'est bien.

#!/usr/bin/python
#title :smart_playlist.py
#description	:Generate something like a smart playlist using LastFM API and MPD
#author :Felix Yadomi
#email :[email protected]
#date :2013-05-12
#version :0.2
#usage :python smart_playlist.py '/some/path/to/music/file.mp3'
#=================================================================================

# Import the modules needed to run the script.
import os, sys, requests, simplejson as json
import mpd, socket

print(sys.argv[1])

"""LastFM Configuration"""
API_KEY = '' # YOUR API_KEY GOES HERE
MAX_QUERY_SONG = 100 #Number of similar song lastfm should return
MAX_SONG = 10 #Number of song in the generated playlist

"""MPD Configuration"""
HOST = 'localhost'
PORT = '6600'
PASSWORD = 'ballon'
MUSIC_DIR = os.environ.get('HOME')+'/Musique/' #MDP Music folder, will be replace soon from the mpd.conf

INSTANT_PLAY = True #Play when playlist is ready
ADD_QUEUE = False #If false, will clear the current playlist and replace with the new one

client = mpd.MPDClient()
try:
client.connect(HOST,PORT)
except socket.gaierror as e:
print("Couldn't connect to MPD server: %s" % e)
sys.exit(1)
#print("Connected to MPD!")
if PASSWORD:
try:
     client.password(PASSWORD)
except mpd.CommandError as e:
     print("Couldn't authenticate: %s" % e)
     sys.exit(1)
#print('Authenticate success!')

if len(sys.argv) > 1:
BASE = sys.argv[1].replace(MUSIC_DIR, '')
base_music = client.listallinfo(BASE)[0]
param = {'artist': base_music['artist'], 'track' : base_music['title'], 'api_key': API_KEY, 'format': 'json'}
headers = {'content-type': 'application/json'}
r = requests.get('http://ws.audioscrobbler.com/2.0/?method=track.getsimilar', params=param, headers=headers)
data = json.loads(r.text)
if not ADD_QUEUE:
     client.clear()
client.add(BASE)
for track in data['similartracks']['track']:
     if track['mbid']:
          match = client.search('MUSICBRAINZ_TRACKID', track['mbid'])
          if match:
               #print(match[0]['file'])
               client.add(match[0]['file'])
if INSTANT_PLAY:
     client.play()
client.close()
client.disconnect()
sys.exit(0)
else:
print('Missing argument, path/to/base/music/file.mp3')
sys.exit(0)

Le script python peut être téléchargé ici aussi, parce qu'en générale le copier/coller et le python, c'est pas toujours la joie.

Bon, il y a cependant quelque défaut. Premièrement, on ne contrôle pas l'algorithme puisque c'est LastFM qui s'en occupe. Et deuxièmement, ça marche bien quand on a beaucoup de musique, en effet le script va vous générer des playlists avec deux musiques qui se battent en duel s'il n'y à pas assez de musique

Petite astuce qui fait prendre au script toute sont importance, l'ajout d'une action personnalisé à thunar:

Et Tada! Un simple clique droit sur une musique pour générer une playlist! N'oubliez pas de mettre votre clef d'API dans le script si vous voulez l'utiliser.