Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/02/2023, à 23:30

tofuser

[Résolu] Rhythmbox / Importer les notes

Bonjour à tous smile

J'ai changé de PC et souhaiterais importer les notes que j'avais avant dans Rhythmbox pour chacun de mes morceaux de musique.
Savez vous comment procéder : je n'ai pas réussi à trouvé l'information dans la documentation ni sur Internet ?

J'ai l'impression que ces notes n'étaient pas écrite dans le fichiers majoritairement au format mp3.
J'ai aussi essayé de bidouiller avec les fichiers de configuration du home mais sans succès.
J'ai conservé une copie des fichiers de configurations ancienne et nouvelle du home.

Dernière modification par tofuser (Le 15/02/2023, à 21:55)

Hors ligne

#2 Le 11/02/2023, à 00:43

inbox

Re : [Résolu] Rhythmbox / Importer les notes

Salut,

Tu pourrais tenter de restaurer le fichier suivant :

~/.local/share/rhythmbox

Pense à sauvegarder l'actuel, au cas où.

A+


Un problème résolu ? Indiquez le en modifiant le titre du sujet.

Hors ligne

#3 Le 12/02/2023, à 14:38

tofuser

Re : [Résolu] Rhythmbox / Importer les notes

Salut Inbox, je te remercie pour ta réponse smile

MANIP 1 : j'ai remplacé le contenu du répertoire ~/.local/share/rhythmbox (playlists.xml, podcast-timestamp, rhythmdb.xml) par les anciens fichiers, cela ne fonctionne pas.

MANIP 2 : j'ai comparé les différences dans le fichier rhythmdb.xml entre mon ancienne et ma nouvelle installation.
Avant mon répertoire de musique était monté physiquement sur un disque de donnée différent de celui utilisé pour la racine et le home,

AVANT
    <location>file:///home/tof/Musique/Thirteen%20Senses/01%20-%20Into%20The%20Fire%20(Album%20Version).mp3</location>
    <mountpoint>file:///mnt/e35bb751-ae55-486d-8d0a-4669572249b0</mountpoint>
    <mtime>1521064898</mtime>
    <first-seen>1593595744</first-seen>
    <last-seen>1676066113</last-seen>
    <rating>5</rating>
    <play-count>9</play-count>
    <last-played>1661161914</last-played>
    <hidden>1</hidden>

APRES
    <location>file:///home/tof/Musique/Rhythmbox/Thirteen%20Senses/01%20-%20Into%20The%20Fire%20(Album%20Version).mp3</location>
    <mtime>1521064898</mtime>
    <first-seen>1676062452</first-seen>
    <last-seen>1676062507</last-seen>

MANIP 3 : j'ai déplacé la musique de : ~/Musique/Rhythmbox vers ~/Musique, pour voir si cela permettait de faire marcher la MANIP 1, mais sans succès.
Les fichiers de musiques ne sont pas chargés dans la bibliothèque : ils apparaissent dans l'interface à gauche sous "Fichiers manquants"
Je peux peux les écouter à partir de l'onglet "Fichiers manquants", mais je n'arrive pas à les faire "revenir" dans la bibliothèque "Musique"
Si vous avez une idée de manip je suis preneur wink

MANIP 4 : j'ai restauré ma nouvelle installation et j'ai modifié à la main le fichier rhythmdb.xml en y ajoutant sur un morceau de musique particulier ce qui suit.
Ce fichier de musique apparait alors avec sa note et son nombre de lectures.

AJOUT
    <rating>5</rating>
    <play-count>9</play-count>

IDEE : S'il n'y a pas de solution simple, l'idée serait de récupérer le "rating" et le "play-count" de l'ancien fichier rhythmdb.xml pour l'ajouter au nouveau fichier en utilisant comme identifiant commun le nom du fichier de musique.

J'ai vu un script Python qui pourrait être modifié pour faire cette tâche : script Python
Si j'ai bien compris : il récupère les notes contenues dans les fichiers de musique pour l'ajouter au fichier rhythmdb.xml utilisé par Rhythmbox (notamment)
Je sais un peu programmer, mais je n'ai encore jamais fait de Python (cela va peut être être l'occasion d'apprendre)
Mais peut être que ce script existe déjà ?

Dernière modification par tofuser (Le 12/02/2023, à 15:31)

Hors ligne

#4 Le 15/02/2023, à 02:09

tofuser

Re : [Résolu] Rhythmbox / Importer les notes

Bonjour,
Je viens de faire un script Python qui résout le problème.
Pour le partager, je l'insère comme du code ou y a t'il un meilleur moyen ?

Hors ligne

#5 Le 15/02/2023, à 19:09

inbox

Re : [Résolu] Rhythmbox / Importer les notes

Oui, tu peux faire ça. Au moins, si quelqu'un d'autre à la même besoin, il pourra le récupérer.


Un problème résolu ? Indiquez le en modifiant le titre du sujet.

Hors ligne

#6 Le 15/02/2023, à 21:53

tofuser

Re : [Résolu] Rhythmbox / Importer les notes

Merci Inbox smile

Les fonctionnalités du script sont décrites au débit du script en commentaires dans "OBJET DU PROGRAMME".
Avant de lancer le script il faut réaliser les actions préparatoires décrites dans "PREREQUIS"

Pour exécuter le script :

sudo apt install python3-lxml
python3 rhythmdb_update_from_old_one.py

N’hésitez pas à laisser un message si le script à pu vous être utile, je le lirai avec plaisir smile


Le code du script "rhythmdb_update_from_old_one.py" :

#!/usr/bin/env python3

#OBJET DU PROGRAMME
#Récupère les notes, le nombres de vues et la dernière lecture d'une ancienne installation de Rhythmbox pour mettre à jour la nouvelle installation de Rhythmbox avec ces informations
#L'utilisateur n'aura alors plus qu'à remplacer le fichier ~/.local/share/rhythmbox/rhythmdb.xml par le fichier généré par le présent programme
#
#PREREQUIS
#créer le répertoire de travail avec les fichiers d'entrées comme explicité ci-dessous dans 'ENTREES' et 'Paramètres d'entrées'
#
#ENTREES
#Le répertoire de travail désigné par la contante S_PWD
#Le fichier ~/.local/share/rhythmbox/rhythmdb.xml de l'ancienne installation de Rhythmbox renomé suivant S_DB_OLD dans le répertoire de travail S_PWD
#Le fichier ~/.local/share/rhythmbox/rhythmdb.xml de la nouvelle installation de Rhythmbox renomé suivant S_DB_CURRENT dans le répertoire de travail S_PWD
#
#SORTIES
#Le fichier modifié incorporant les notes et nombre de vues renommé suivant S_DB_UPDATED

'''Restoring rating, play-count, last-played in Rhythmbox using an old version of rhythmdb.xml file - Inspired by https://gist.github.com/Teque5/69d5ece2003e7ea1f3c29daf01b411a2#file-popm2rb-py'''

import os
import sys
from urllib.parse import unquote
import lxml.etree as etree

#Paramètres d'entrées
S_PWD = '~/rhythmbox_update/'	#Répertoire de travail
S_DB_OLD = 'db_old.xml'		#Ancienne base de donnée rhythmdb.xml contenant les notes et le nombre de vues
S_DB_CURRENT = 'db_current.xml'	#Nouvelle base de donnée rhythmdb.xml à mettre à jour

#Paramètres de sortie
S_DB_UPDATED = 'db_updated.xml'	#Nouvelle base de donnée rhythmdb.xml mise à jour avec les notes et le nombre de vues

#Autres paramètres
S_DIR='~/.local/share/rhythmbox/'
S_DB='rhythmdb.xml'

#Explicitation des chemins suivant l'utilisateur et l'os
S_PWD = os.path.expanduser(S_PWD)
S_DIR = os.path.expanduser(S_DIR)

#Vérification des prérequis et information de l'utilisateur de problème
if not os.path.exists(S_PWD):
    print ('Veuiller créer le répertoire de travail' + S_PWD)
    sys.exit()
if not os.path.exists(S_PWD + S_DB_OLD):
    print ("Veuiller placer le fichier de l'ancienne installation de Rhythmbox '{}' dans le répertoire de travail '{}' et le renomer en '{}'".format(S_DB, S_PWD, S_DB_OLD))
    print ("Ce fichier est situé dans l'ancienne installation de Rythmbox dans '{}'".format(S_DIR))
    sys.exit()
if not os.path.exists(S_PWD + S_DB_CURRENT):
    print ("Veuiller placer le fichier de l'installation courante de Rhythmbox '{}' dans le répertoire de travail '{}' et le renomer en '{}'".format(S_DB, S_PWD, S_DB_CURRENT))
    print ("Ce fichier est situé dans {}'".format(S_DIR))
    sys.exit()

#Charge l'arborescence de l'ancien fichier rhythmdb.xml contenant les notes et le nombre de vues - ancienne arborescence
db_old = etree.parse(os.path.expanduser(S_PWD + S_DB_OLD))

#Charge l'arborescence le fichier rhythmdb.xml courant à mettre à jour avec les notes et le nombre de vues - arborescence courante
db_current = etree.parse(os.path.expanduser(S_PWD + S_DB_CURRENT))

#Itération sur les entrées de l'ancienne arborescence
for song in db_old.findall('entry'):

    #Passe les entrées qui ne sont pas de type="song"
    if song.get('type') != 'song': continue
    
    #Récupération du nom de fichier
    location = unquote(song.find('location').text)
    filename = location.rpartition('/')[-1]
    
    #Itération sur les entrées de l'arborescence courante afin de trouver le fichier correspondant
    for song2 in db_current.findall('entry'):
        if song2.get('type') != 'song': continue			#Passe les entrées qui ne sont pas de type="song"
        location2 = unquote(song2.find('location').text)
        filename2 = location2.rpartition('/')[-1]			#Récupération du nom de fichier de l'arborescence courante
        if filename != filename2: continue				#Si le nom de fichier ne correspond pas on passe à l'entrée suivante de l'arborescence courante        
            
	#Correspondance trouvée sur le nom de fichier entre l'ancienne arborescence et l'arborescence courante                  
        b_affichage=True						#Permet d'afficher une seule fois le traitement d'un fichier
        for s_property in {'rating', 'play-count', 'last-played'}:	#Itération sur les propriétés de l'ensemble
            if song.find(s_property) != None:				#Traitement uniquement si la propriété existe 
                s_value = unquote(song.find(s_property).text)		#Extraction de la valeur de la propriété dans l'ancienne arborescence
                    
                #CAS ou la propriété n'existe pas dans l'arborescence courante
                if song2.find(s_property) == None:
                    temp = etree.Element(s_property)			#Permet de créer un éléments vide (la propriété)
                    temp.text = s_value					#Permet de définir la valeur de l'élément
                    song2.append(temp)					#Ajoute l'élément renseigné comme enfant à l'entrée courante dans l'arborecence courante
		    
        	#CAS ou la propriété existe dans l'arborecence courante
                else:
                    song2.find(s_property).text = s_value		#Mise à jour de la valeur de la propriété dans l'arborecence courante
		        
        	#Affiche le nom du fichier traité
                if b_affichage:
                	print('Traitement de : ' + filename)
                	b_affichage=False

#Ecriture de l'arborescence mise à jour
db_current.write(S_PWD + S_DB_UPDATED, pretty_print=True)

#Demande à l'utilisateur d'écraser lui même le fichier 'rhythmdb.xml' par le S_DB_UPDATED nouvellement créé
print("\nIl ne vous reste plus qu'à écraser '{}' par '{}' dans '{}'".format(S_DB, S_DB_UPDATED, S_DIR))
print("(Il peut être utile de conserver une copie de '{}' en la renomant par exemple '{}.original'".format(S_DB, S_DB))

Hors ligne