Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 19/08/2009, à 16:12

Mattorre

[script] importation de playlists de iTunes vers Rhythmbox

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&#xE9;cemment ajout&#xE9;" 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&#xE9;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 tongue)


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

Dernière modification par Mattorre (Le 19/08/2009, à 16:20)


Cooler Master Cosmos RC-1000, Corsair CMPSU-650TX, Intel Core 2 Duo E8400 (2x3 GHz), LG Flatron W2452T, Corsair Dominato - 2 x 2 Go DDR2 PC 8500,  SAMSUNG Spin Point F1 2 x 500 Go (Raid 0), SAMSUNG Spin Point F1 1To, ATI Radeon HD4850 (CrossFire), Enceinte Inspire T7700, Logitech Illuminated & VX Revolution, Windows Seven 64bit & Ubuntu 9.04 64bit

Hors ligne

#2 Le 09/08/2012, à 00:30

Quasoo

Re : [script] importation de playlists de iTunes vers Rhythmbox

Il fonctionne vraiment bien ton script, il est aussi très rapide, toutes les playlist s'importent sans broncher !

Merci !! big_smile

Hors ligne

#3 Le 09/08/2012, à 01:25

Quasoo

Re : [script] importation de playlists de iTunes vers Rhythmbox

La rapidité par contre ce n'est pas le point fort de Ryhtmbox quand il démarre avec plus de 1000 listes de lectures installées !

Hors ligne

#4 Le 21/05/2013, à 06:20

sly38

Re : [script] importation de playlists de iTunes vers Rhythmbox

Bonjour,

ce post est un peu vieux mais on ne sait jamais. Est-ce que l'on peut copier directement le script que tu proposes? comment fait-on pour créer un fichier .pl?

merci d'avance

Hors ligne

#5 Le 17/11/2013, à 01:13

Quasoo

Re : [script] importation de playlists de iTunes vers Rhythmbox

Oui tu peux le copier dans un fichier texte, tu suis les infos, suffit de changer l'extension en .pl pour pouvoir le lancer ensuite

Hors ligne

#6 Le 05/02/2014, à 22:11

Mattorre

Re : [script] importation de playlists de iTunes vers Rhythmbox

Bonjour,

Je suis super content que ce script serve à d'autres personnes et merci a Quasoo d'avoir repondu !


Cooler Master Cosmos RC-1000, Corsair CMPSU-650TX, Intel Core 2 Duo E8400 (2x3 GHz), LG Flatron W2452T, Corsair Dominato - 2 x 2 Go DDR2 PC 8500,  SAMSUNG Spin Point F1 2 x 500 Go (Raid 0), SAMSUNG Spin Point F1 1To, ATI Radeon HD4850 (CrossFire), Enceinte Inspire T7700, Logitech Illuminated & VX Revolution, Windows Seven 64bit & Ubuntu 9.04 64bit

Hors ligne

#7 Le 02/04/2014, à 16:41

francois.roland

Re : [script] importation de playlists de iTunes vers Rhythmbox

Merci pour ce script !

Il m'a bien importé les playlists dans rythmbox, mais elles sont toutes vides malheureusement.

Un problème dans la configuration des chemins peut-être ?
les morceaux sont sur un second disque dur qui n'est peut être pas automatiquement monté au démarrage.
(je débute sur ubuntu)

Hors ligne

#8 Le 06/06/2014, à 20:36

Antho071

Re : [script] importation de playlists de iTunes vers Rhythmbox

Bonjour,

Je me permets de remonter le sujet pour remercier grandement l'auteur. Je recherchais une solution pour ce problème depuis très longtemps et ce script (avec quelques ajustements pour adapter à ma biblio) fait parfaitement le job ! Merci infiniment !

francois.roland > As-tu bien modifier les lignes 23 et 25 pour adapter le script à ton cas ?

Hors ligne

Haut de page ↑