Retrouvez cet article dans : Linux Magazine 82
- C’est le langage utilisé par Freevo ;
- Il est simple à comprendre.
Structure du script
Nous allons tout d’abord créer une structure de base pour ce script, dans le fichier#! /usr/bin/env python
FILESROOT = ‘/home/freevo/Media/Musique’
LINKSROOT = ‘/home/freevo/Media/MusiqueLiens’
import os, sys
def main():
for d in os.walk(FILESROOT):
for f in d[2]:
do_file(os.path.join(d[0], f))
def do_file(f):
print f
if __name__ == ‘__main__’:
main()
Quand on exécute directement un script Python, la variable Traitement des fichiers
Nous allons nous baser sur les méta-informations contenues dans les fichiers MP3 et OGG Vorbis afin de créer notre base de données musicale. Après différenciation des fichiers .ogg et .mp3, leurs informations sont récupérées à l’aide de programmes externes : ogginfo et mp3info ; ils sont disponibles dans la plupart des distributions. La fonctiondef do_file(f):
infos = {‘artist’:’’, ‘title’:’’, ‘album’:’’,
‘tracknumber’:’’, ‘genre’:’’}
fname = f.replace(‘"’, ‘\\"’)
if f[-4:].lower() == ‘.ogg’:
answ = os.popen(‘ogginfo "%s"’ % fname)
for i in answ.readlines():
for type in infos.keys():
if ‘%s=’ % type in i.lower():
data = i.split(‘=’, 1)[1].strip()
infos[type] = data
answ.close()
elif f[-4:].lower() == ‘.mp3’:
answ = os.popen(‘mp3info -p "%%a\n%%t\n%%l\n%%n\n%%g\n" "%s"’ % fname)
i = [ j.strip() for j in answ.readlines() ]
answ.close()
infos = {‘artist’:i[0], ‘title’:i[1], ‘album’:i[2],
‘tracknumber’:i[3], ‘genre’:i[5]}
print f, ‘:’, infos
L’expression Création des liens
Maintenant que nous avons les méta-informations concernant tous les fichiers, il nous suffit de créer des liens symboliques dans une arborescence spéciale. Nous allons remplacer la ligne # The file extension
ext = f[-3:]
link = ‘%s.%s’ % (infos[‘title’], ext)
# Tracks from an artist
if infos[‘artist’]:
dir = os.path.join(LINKSROOT, ‘artist’, infos[‘artist’])
lnk(f, dir, link)
# Artists, by genre
if infos[‘genre’] and infos[‘artist’]:
dir = os.path.join(LINKSROOT, ‘genre+artist’,
infos[‘genre’], infos[‘artist’])
lnk(f, dir, link)
link = ‘%s - %s.%s’ % (infos[‘tracknumber’], infos[‘title’], ext)
# Albums
if infos[‘album’]:
dir = os.path.join(LINKSROOT, ‘album’, infos[‘album’])
lnk(f, dir, link)
# Albums, by artist
if infos[‘album’] and infos[‘artist’]:
dir = os.path.join(LINKSROOT, ‘artist+album’,
infos[‘artist’], infos[‘album’])
lnk(f, dir, link)
# Albums, by genre
if infos[‘genre’] and infos[‘album’]:
dir = os.path.join(LINKSROOT, ‘genre+album’,
infos[‘genre’], infos[‘album’])
lnk(f, dir, link)
# Albums, by genre and artist
if infos[‘genre’] and infos[‘album’] and infos[‘artist’]:
dir = os.path.join(LINKSROOT, ‘genre+artist+album’, infos[‘genre’],
infos[‘artist’], infos[‘album’])
lnk(f, dir, link)
def lnk(f, dir, link):
try:
os.makedirs(dir)
except:
pass
link = link.replace(‘/’, ‘_’)
fullpath = os.path.join(dir, link)
try:
os.symlink(f, fullpath)
except OSError:
if os.readlink(fullpath) != f:
linklist = link.split(‘.’)
linklist[-1] = ‘%s_’ % linklist[-1]
link = ‘.’.join(linklist)
lnk(f, dir, link)
Pour chacune des informations de classement, nous testons si cette information existe (Résultat
Après l’exécution de ce script, le répertoireAUDIO_ITEMS = [
(‘Album’,
‘/home/freevo/Media/MusiqueLiens/album’),
(‘Artiste’,
‘/home/freevo/Media/MusiqueLiens/artist’),
(‘Artiste / Album’,
‘/home/freevo/Media/MusiqueLiens/artist+album’),
(‘Genre / Album’,
‘/home/freevo/Media/MusiqueLiens/genre+album’),
(‘Genre / Artiste’,
‘/home/freevo/Media/MusiqueLiens/genre+artist’),
(‘Genre / Artiste / Album’,
‘/home/freevo/Media/MusiqueLiens/genre+artist+album’),
(‘Accès direct’, ‘/home/freevo/Media/Musique’),
]
Après relancement de Freevo, le menu Ecouter de la musique contient ces différentes catégories.
Cette méthode a bien sûr plusieurs inconvénients, le principal étant que ces informations ne sont pas mises à jour en temps réel. Cependant, une collection musicale n’étant généralement pas très dynamique, il suffira de faire des mises à jour de temps en temps : soit manuellement après avoir modifié ou ajouté des fichiers, soit automatiquement, toutes les nuits par exemple. Par ailleurs, ce script n’efface pas les liens pointant vers des fichiers inexistants.
Mise à jour automatique
Le meilleur moyen de mettre à jour ces informations de manière automatique est d’ajouter une ligne dans0 5 * * * /home/freevo/bin/freevo_make_music_links.py 30 5 * * * /usr/bin/freevo cache >/dev/null 2>&1Ces lignes font exécuter le script à 5h00 tous les jours et mettre à jour le cache de Freevo à 5h30.
Améliorations
Il est bien sûr possible d’améliorer cette procédure. Il est par exemple envisageable de garder les informations de mises à jour dans une base de données à part, afin de ne pas analyser les fichiers déjà traités ; ou encore de gérer les dates de sortie des albums pour les classer par ordre chronologique. Il peut également être intéressant de créer un script qui nettoie les liens devenus inutiles... Mais maintenant, c’est à vous de jouer ! Retrouvez cet article dans : Linux Magazine 82





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.