Bonjour, utilisant iTunes sous windows pour gérer ma bibliothèque de musique et utilisant Rhythmbox pour la lire sous ubuntu, j'etais frustré de ne pas pouvoir importer ma bibliothèque iTunes sur Rhythmbox. J'ai ainsi créé un script perl permettant d'importer les playlists (Pas la bibliothèque) de iTunes vers Rhythmbox.
ItunesRhyth.pl :
#!/usr/bin/perl
# # Script fait par
# # Mattorre
# # Permet d'importer la playlist d'iTunes dans rhythmbox
# Vérification du nombre de paramètres
$syntaxe="[Usage : ./ItunesRhyth.pl iTunes\ Music\ Library.xml fichierTemp.xml playlists.xml]";
$nbarg = scalar( @ARGV );
if ($nbarg != 3) {die "$syntaxe\n";}
# Renommage des paramètres
($entree,$sortieTemp, $sortie)=@ARGV;
# Vérification de l'existence ou non des fichiers
if (! -e $entree )
{die "[Le fichier d'entrée $entree n'existe pas]\n";}
if (-e $sortieTemp )
{die "[Le fichier d'entrée $sortieTemp existe déjà]\n";}
if (! -e $entree )
{die "[Le fichier d'entrée $sortie n'existe pas]\n";}
# Variable permettant de stocker le chemin dans l'environnement Windows
$cheminWindows = "D:/Musique/iTunes/iTunes%20Music/";
# Variable permettant de stocker le chemin dans l'environnement Linux
$cheminLinux = "/home/mattorre/Musique/iTunes/iTunes%20Music/";
## Premier remplissage de "SORTIETEMP" : Copie de ENTREE dans SORTIETEMP en ne conservant sur une ligne que les lignes ID et Localisation jusqu'a BIBLIOTHÈQUE
# Ouverture des fichiers
open(ENTREE, "<$entree")|| die "[Ouverture fichier $entree impossible]";
open(SORTIETEMP, ">$sortieTemp")|| die "[Ouverture fichier $sortieTemp impossible]";
# Initialisation de la variable permettant de stopper la copie des la detection de "<key>Name</key><string>BIBLIOTHÈQUE</string>"
$test = 0;
# Tant qu'il y a des lignes dans "ENTREE" et tant qu'il n'y a pas detection de "<key>Name</key><string>BIBLIOTHÈQUE</string>"
while($ligne = <ENTREE> and $test == 0)
{
SWITCH:
{
# Si detection de l'ID
if ($ligne =~ /(<key>Track ID<)\/key><integer>([^<]*)<\/integer>/){
# Ecrire dans le fichier SORTIETEMP "<key>Track ID<'ID'"
print SORTIETEMP $1;
print SORTIETEMP $2;
last SWITCH;
}
# Si detection de "BIBLIOTHÈQUE"
if ($ligne =~ /^\t\t\t<key>Name<\/key><string>BIBLIOTHÈQUE<\/string>/){
# Passage de la variable test a 1 permettant de sortir de la boucle tant que
$test = 1;
last SWITCH;
}
# Si detection de la Localisation
if ($ligne =~ /(<key>Location<)\/key><string>file:\/\/localhost\/([^<]*<)\/string>/){
# Ecrire dans le fichier SORTIETEMP "<key>Location<'Location'<"
print SORTIETEMP $1;
print SORTIETEMP $2;
# Insertion de 2 lignes vide
print SORTIETEMP "\n\n\n";
last SWITCH;
}
}
}
# Fermeture des fichiers
close(ENTREE)|| die "[Fermeture fichier $entree impossible]";
close(SORTIETEMP)|| die "[Fermeture fichier $sortieTemp impossible]";
## Fin premier remplissage de "SORTIETEMP"
## Remplissage du tableau associatif avec comme clef l'ID et comme valeur la Localisation
# Ouverture des fichiers
open(SORTIETEMP, "<$sortieTemp")|| die "[Ouverture fichier $sortieTemp impossible]";
# Initialisation du tableau associatif
%channel1;
# variables temporaires
$temp1;
$temp2;
# Tant qu'il y a des lignes dans "SORTIETEMP"
while($ligne = <SORTIETEMP>)
{
# Si detection de l'ID et de la Localisation
if ($ligne =~ /^<key>Track ID<([^<]*)<key>Location<([^<]*)</){
# Sauvegarde de l'ID dans temp1
$temp1 = $1;
# Sauvegarde de la Localisation dans temp1
$temp2 = $2;
# Modification du chemin entre Windows et Linux
#$temp2 =~ s/D:(.*)/<location>file:\/\/\/home\/mattorre$1<\/location>/; #/
$temp2 =~ s/$cheminWindows(.*)/<location>file:\/\/$cheminLinux$1<\/location>/; #/
# Remplissage du tableau: Clef = ID ,Valeur = Localisation
$channel1{$temp1}=$temp2;
}
}
# Fermeture des fichiers
close(SORTIETEMP)|| die "[Fermeture fichier $sortieTemp impossible]";
## Fin Remplissage tableau associatif
## Deuxieme remplissage de "SORTIETEMP" grace au tableau associatif et au fichier "ENTREE". Mise en forme du fichier compatible avec la playlist Rhythmbox
# Ouverture des fichiers
open(ENTREE, "<$entree")|| die "[Ouverture fichier $entree impossible]";
open(SORTIETEMP, ">$sortieTemp")|| die "[Ouverture fichier $sortieTemp impossible]"; #Vide le fichier SORTIETEMP
# Copie dans "SORTIETEMP" du debut d'un fichier playlist Rhythmbox
sub Entete {
return <<FIN_ENTETE
<?xml version="1.0"?>
<rhythmdb-playlists>
<playlist name="Liste d'attente" type="queue"/>
<playlist name="Mon top" type="automatic" sort-key="Rating" sort-direction="1">
<conjunction>
<equals prop="type">song</equals>
<subquery>
<conjunction>
<greater prop="rating">4.000000</greater>
</conjunction>
</subquery>
</conjunction>
</playlist>
<playlist name="Récemment ajouté" type="automatic" sort-key="FirstSeen" sort-direction="1">
<conjunction>
<equals prop="type">song</equals>
<subquery>
<conjunction>
<current-time-within prop="first-seen">604800</current-time-within>
</conjunction>
</subquery>
</conjunction>
</playlist>
<playlist name="Récemment lu" type="automatic" sort-key="LastPlayed" sort-direction="1">
<conjunction>
<equals prop="type">song</equals>
<subquery>
<conjunction>
<current-time-within prop="last-played">604800</current-time-within>
</conjunction>
</subquery>
</conjunction>
</playlist>
FIN_ENTETE
}
print SORTIETEMP Entete;
# Initialisation de la variable test a 0 permettant de commencer la copie a partir de "<key>Playlists</key>"
$test = 0;
# Tant qu'il y a des lignes dans "ENTREE" et que tant qu'il n'y a pas detection de "<key>Playlists</key>"
while($ligne = <ENTREE> and $test == 0)
{
# Si detection de "Playlists"
if ($ligne =~ /<key>Playlists<\/key>/ ){
# Passage de la variable a 1 permettant de sortir du tant que
$test = 1;
}
}
# Initialisation de la variable test a 0 permettant de placer une balise "</playlist>" avant "<playlist name="..." type="static">;" sauf la premiere fois
$test = 0;
# Tant qu'il y a des lignes dans "ENTREE"
while($ligne = <ENTREE>)
{
SWITCH:
{
# Si detection de "Name"
if ($ligne =~ /<key>Name<\/key><string>([^<]*)<\/string>/){
# Sauvegarde du Nom dans la variable temp1
$temp1 = $1;
# Si test == 1 (CAD toujours sauf pour la premiere detection de "Name")
if ($test == 1){
# Ecriture de la balise "</playlist>"
print SORTIETEMP " <\/playlist>\n";
}
# Ecriture de " <playlist name="'Nom'" type="static">"
print SORTIETEMP " <playlist name=\"";
print SORTIETEMP $temp1;
print SORTIETEMP "\" type=\"static\">";
print SORTIETEMP "\n";
# Passage de la variable test a 1
$test = 1 ;
last SWITCH;
}
# Si detection de "Track ID"
if ($ligne =~ /<key>Track ID<\/key><integer>([^<]*)<\/integer>/){
# Sauvegarde de l'ID dans temp1
$temp1 = $1;
# Ecriture de " <location>"Valeur correspondant a la clef ID"</location>"
print SORTIETEMP " ";
print SORTIETEMP $channel1{$temp1};
print SORTIETEMP "\n";
last SWITCH;
}
}
}
# Copie dans SORTIETEMP de la fin d'un fichier playlist Rhythmbox
sub Enqueue {
return <<FIN_queue
</playlist>
</rhythmdb-playlists>
FIN_queue
}
print SORTIETEMP Enqueue;
# Fermeture des fichiers
close(ENTREE)|| die "[Fermeture fichier $entree impossible]";
close(SORTIETEMP)|| die "[Fermeture fichier $sortieTemp impossible]";
## Fin deuxieme remplissage de "SORTIETEMP"
## Remplissage de SORTIE avec SORTIETEMP (en cours) en enlevant certaines playlists (Bibliotheque, musique, films, series TV, Podcast, Livre audio, Achats, itunes DJ, Genius)
# Ouverture des fichiers
open(SORTIETEMP, "<$sortieTemp")|| die "[Ouverture fichier $sortieTemp impossible]";
open(SORTIE, ">$sortie")|| die "[Ouverture fichier $sortie impossible]";
# Initialisation de la variable a 0 permettant de savoir si on doit copier ou pas les "<location>..."
$test = 0;
# Tant qu'il y a des lignes dans "SORTIETEMP"
while($ligne = <SORTIETEMP>)
{
# Si on est dans le cas de la copie
if ($test == 0){
SWITCH:
{
# Si name="BIBLIOTHÈQUE" passage de la variable test a 1
#(cad pour supprimer la playlist correspondante au name)
# Commenter les 4 lignes si vous voulez conserver la playliste correspondant au name
if ($ligne =~ /<playlist name="BIBLIOTHÈQUE" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Musique" passage de la variable test a 1
if ($ligne =~ /<playlist name="Musique" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Films" passage de la variable test a 1)
if ($ligne =~ /<playlist name="Films" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Séries TV" passage de la variable test a 1
if ($ligne =~ /<playlist name="Séries TV" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Podcasts" passage de la variable test a 1
if ($ligne =~ /<playlist name="Podcasts" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Livres audio" passage de la variable test a 1
if ($ligne =~ /<playlist name="Livres audio" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Achats" passage de la variable test a 1
if ($ligne =~ /<playlist name="Achats" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="iTunes DJ" passage de la variable test a 1
if ($ligne =~ /<playlist name="iTunes DJ" type="static">/){
$test = 1;
last SWITCH;
}
# Si name="Genius" passage de la variable test a 1
if ($ligne =~ /<playlist name="Genius" type="static">/){
$test = 1;
last SWITCH;
}
# Sinon copie de la ligne dans SORTIE
print SORTIE $ligne;
}
}
# Si test != 0 (CAD il faut enleve la playliste)
else
{
# Si detection de "localisation", on ne copie pas la ligne
if ($ligne =~ /<location>/){
}
# Si detection de "\playlist", on ne copie pas la ligne
if ($ligne =~ /<\/playlist>/){
# On passe la variable test a 0 (On a finit de supprimer la playlist)
$test = 0;
}
}
}
# Fermeture des fichiers
close(SORTIETEMP)|| die "[Fermeture fichier $sortieTemp impossible]";
close(SORTIE)|| die "[Fermeture fichier $sortie impossible]";
## Fin remplissage de SORTIE
## Suppression du fichier "fichierTemp.xml"
unlink './fichierTemp.xml';
## fin script
Petite explication pour l'utiliser:
- Importez votre bibliothèque de morceau iTunes dans Rhythmbox
->Edition -> Préférence -> Musique -> Les fichiers musicaux sont placés dans [mettre le chemin] (pour moi file:///home/mattorre/Musique/iTunes/iTunes Music)
- Laissez Rhythmbox travailler
- Fermez Rhythmbox
- Allez dans le dossier de la bibliothèque iTunes et copiez le fichier "iTunes Music Library.xml"
- Collez le dans "$HOME/.local/share/rhythmbox/"
- Copiez le code de mon script dans un nouveau fichier dans le même dossier (CAD "$HOME/.local/share/rhythmbox/") et nommez le "ItunesRhyth.pl"
- Éditez le fichier et changez les 2 variables ligne 23 et 25 par vos 2 chemins
- Dans le terminal tapez:
cd $HOME/.local/share/rhythmbox/
chmod +x ItunesRhyth.pl
./ItunesRhyth.pl iTunes\ Music\ Library.xml fichierTemp.xml playlists.xml
rm iTunes\ Music\ Library.xml
- Ensuite ouvrez Rhythmbox, attentez quelques secondes et voila sa marche (enfin normalement 😛)
J'ai fait un petit script Bash à lancer au demarrage qui fait automatiquement la mise à jour de la playlist
#!/bin/bash
cd $HOME/.local/share/rhythmbox/
cp $HOME/Musique/iTunes/iTunes\ Music\ Library.xml iTunes\ Music\ Library.xml
./ItunesRhyth.pl iTunes\ Music\ Library.xml fichierTemp.xml playlists.xml
rm iTunes\ Music\ Library.xml
exit 0
done
Vous pouvez aussi personnaliser l'importation en commentant certaines lignes de la ligne 240 à 283