Quelque chose m’énerve dans le fonctionnement de rhythmbox : j’ai 8.534 morceaux à écouter et pourtant, même en lecture aléatoire, je retombe toujours sur les mêmes. En tout cas j’en ai l’impression (ce qui est totalement différent). Alors je voudrais faire deux choses :

  1. Modifier la règle de lecture aléatoire pour n’autoriser à la lecture que les fichiers les moins lus ;
  2. Éventuellement, vérifier la façon dont est fait le mélange des morceaux et le corriger pour éviter tout biais le cas échéant.

Comme mes études ont coûté beaucoup d’argent à mes parents en leur temps, et que je ne veux pas me prendre la tête à tout reconstruire de zéro, on va essayer de faire ça bien, à partir du SRPM de rhythmbox, pour en patcher le contenu, et produire un nouveau rpm qui sera dans mon propre dépôt, avec mon patch.

Télécharger un SRPM

yum n’est pas fait pour déployer les paquetages sources. Pour cela, il faut déjà avoir installé yumdownloader :

# yum install yum-utils

Grâce à ce petit utilitaire, on va pouvoir récupérer le paquetage source de rhythmbox à moindre frais :

# yumdownloader --source rhythmbox

Magie des nuits d’Arabie, un magnifique SRPM vient d’apparaître dans le répertoire courant :

# ls
rhythmbox-0.12.8-4.fc13.src.rpm

Installer les dépendances du SRPM d’origine

Comme on va vouloir chercher à reproduire ce logiciel presque à l’identique, autant commencer par en installer les dépendances. rpmbuild les donne bien volontiers :

# rpmbuild --rebuild rhythmbox-0.12.8-4.fc13.src.rpm
erreur: Dépendances de construction manquantes:
 libgpod-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gnome-media-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 brasero-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gstreamer-plugins-base-devel >= 0.10 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 totem-pl-parser-devel >= 2.21.1 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gnome-vfs2-devel >= 2.7.4 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 avahi-glib-devel >= 0.6 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libmusicbrainz3-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 dbus-devel >= 0.90 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 dbus-glib-devel >= 0.70 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libnotify-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gstreamer-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gnome-doc-utils est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 pygtk2-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libsoup-devel >= 2.3.0 est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 lirc-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libmtp-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 gstreamer-python-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libgudev-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libgnome-keyring-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64
 libSM-devel est nécessaire pour rhythmbox-0.12.8-4.fc13.x86_64

Ah ! oui, quand même ! Bon, on ne se décourage pas :

# rpmbuild --rebuild rhythmbox-0.12.8-4.fc13.src.rpm 2>&1 | grep est | cut -d ' ' -f 1 | xargs yum install -y

et tout ce petit monde est installé en deux temps, trois mouvements.

Déployer le contenu du SRPM pour le patcher

Ce n’est pas la partie la plus compliquée. D’abord, installer le rpm source :

# rpm -i rhythmbox-0.12.8-4.fc13.src.rpm

Puis déployer l’archive de code d’origine :

# tar xjf rhythmbox-0.12.8.tar.bz2

qui nous créé un joli répertoire rhythmbox-0.12.8.

Écriture du patch … et changement de plan

On rentre dans le vif du sujet ! En fouillant un peu le projet, on tombe rapidement sur tout un tas de fichiers qui prennent (déjà !) en charge différentes manières d’opérer la lecture aléatoire :

# ls shell/rb-play-order-random*
shell/rb-play-order-random-by-age-and-rating.c
shell/rb-play-order-random-by-age.c
shell/rb-play-order-random-by-rating.c
shell/rb-play-order-random.c
shell/rb-play-order-random-equal-weights.c

Sac-à-papier ! C’est déjà tout fait ! Mais alors, pourquoi diable ce choix n’est-il pas disponible via l’interface graphique de rhythmbox ? Typiquement, ce que je souhaite, c’est appliquer la politique « random-by-age ».

Appliquer une politique donnée dans rhythmbox

On reprend les fondamentaux : je cherche « rhythmbox random age » dans Google, et paf ! Le premier lien m’instruit comment opérer une configuration moins immédiate de rhythmbox et de le régler enfin comme je le souhaite. Pour information, voici la marche à suivre :

# gconf-editor

Menu « /apps/rhythmbox/state », paramètre « play_order ». Il faut passer sa valeur de « shuffle » à « random-by-age » dans mon cas précis. Et le tour est joué.

Conclusion

L’investissement financier de mes parents n’est toujours pas rentabilisé. Même en cherchant à travailler intelligemment, je n’ai pas été suffisamment paresseux. À ma décharge, il n’était pas évident a priori que :

  • rhythmbox propose en natif de modifier la politique qui régit la lecture aléatoire, vu que ce n’est pas dans l’interface du logiciel ;
  • de connaître le nom de la politique qui correspond à mon besoin, et donc de trouver la bonne requête Google qui vient à mon secours.

Désolé donc, ce ne sera pas cette fois qu’on ira au bout de la manipulation, les développeurs de GNOME ont presque trop bien travaillé. Mais il y aura bientôt une autre occasion de reprendre ce thème et de l’adresser complètement !