Yadomi!

Do you remember when the world wide web was fun ?


Fond d'écran dynamique avec MPD et Fanart.tv

Par ce que j'aime bien MPD, je lui consacre des articles entier et des scripts dédié. Mon dernier en date, c'est un petit script Python qui se charge de télécharger des fonds d'écran sur l'excellent site fanart.tv qu'utilise XBMC par exmple. Le script télécharge des images du groupe pour en choisir une aleatoirement et la définir aleatoirement quand la musique change... Vidéo à l'appui dans la suite!

Cependant, cela est possible avant tout grâce à MusicBrainz ! En effet, l'API de fanart.tv permet la recherche par l'id de l'artiste MusicBrainz et comme une bonne nouvelle arrive toujours par deux, le logiciel Beet qui permet de trier sa musique utilise également MusicBrainz. Le tout devient donc extremement simple à partir de la, on envoi une recup, on recupère les fond d'écran et on en défini un aleatoirement.

J'ai fait une video pour montrer un peu ce que cela donne:

Il vous faudra cependant une clef API pour utiliser fanart.tv que vous pouvez demander un se rendant sur le site. Voici donc le script complet en python ci dessous, ou téléchargeable ici.

#!/usr/bin/python2
# -*- coding: utf-8 -*-
import requests,mpd, socket, sys, json, pprint, os, random
from urlparse import urlparse
from os.path import splitext, basename

pp = pprint.PrettyPrinter(indent=4)

API_KEY = "YOUR_API_KEY" #La clef API de Fanart.tv
URL = "http://api.fanart.tv/webservice/artist/"+API_KEY+"/musicbrainz_mbid/json/"

"""MPD Configuration"""
HOST = 'localhost'
PORT = '6600'
PASSWORD = 'ballon'
MUSIC_DIR = os.environ.get('HOME')+'/Musique/'

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)
if PASSWORD:
	try:
		client.password(PASSWORD)
	except mpd.CommandError as e:
		print("Couldn't authenticate: %s" % e)
		sys.exit(1)
FILE = client.currentsong().get('file')
ARTIST = client.currentsong().get('artist')

path = MUSIC_DIR+os.path.split(os.path.split(FILE)[0])[0]+'/.mediaartlocal/'

if client.currentsong().get('musicbrainz_artistid'):
	MBID = client.currentsong().get('musicbrainz_artistid')
	URL = URL.replace("musicbrainz_mbid", MBID)

	if not os.path.exists(path):
		os.makedirs(path)
		r = requests.get(URL)
		if r.text != "null":
			json = json.loads(r.text)
			json = json.get(ARTIST).get("artistbackground")
			bgs = []
			for bg in json:
				url = bg.get('url')
				bgs.append(url)
				filename, file_ext = splitext(basename(urlparse(url).path))

				r = requests.get(url)
				if r.status_code == 200:
					with open(path+filename+file_ext, 'wb') as f:
						for chunk in r.iter_content(1024):
							f.write(chunk)
		else:
			os.removedirs(path)
			os.system(os.getenv("HOME")+"/Scripts/random_wallpaper.sh")#Script utilié comme fallback, défini un fond écran aleatoire
if os.path.exists(path):
	if os.listdir(path):
		wallpaper = random.choice(os.listdir(path))
		cmd = "xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path -s \""+path+wallpaper+"\""
		os.system(cmd)