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 01/09/2012, à 13:10

Flo_

[Résolu] Synchronisation de bibliothèque audio flac/ogg

Salut à tous,

J'ai un serveur que je monte dans /media/Music sur lequel j'ai stocké mes CDs en flac, mais mon portable n'est pas toujours connecté à mon serveur (quand je suis en déplacement par exemple). J'aimerais donc pouvoir synchroniser ma bibliothèque en flac sur mon laptop pour pouvoir toujours en profiter, mais stockée au format ogg q8 sur mon laptop (sinon ça prendrait trop de place).

En gros il me faudrait un script comme rsync, mais qui gère la conversion (et qui copie bien les autres fichiers présents dans la bibliothèque, comme les covers).

J'y ai réfléchis mais je n'ai pas trouvé de solution simple (peut-être qu'il existe déjà un logiciel qui fait ça ?).

Merci de votre aide.

Flo

Dernière modification par Flo_ (Le 03/09/2012, à 22:34)

Hors ligne

#2 Le 02/09/2012, à 11:42

toulipe

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

A votre place, je procèderais comme suit (méthode artisanale) :
1°) Etablir une liste de tous les fichiers présents dans  /media/Music.

find /media/Music | sort -o liste

2°) A chaque synchronisation, créer une liste temporaire (qu'on appellera liste_temp) selon le même procédé que dans 1°). Puis comparer la liste nouvellement créée avec l'ancienne pour vérifier si de nouveaux fichiers sont apparus entre-temps :

comm -13 liste liste_temp

Lire le stdout de la commande précédente ligne par ligne, et, selon le type du fichier rencontré, soit le créer (s'il s'agit d'un répertoire), soit le copier (s'il s'agit d'une pochette d'album), soit  l'encoder (s'il s'agit d'un fichier audio) sur l'ordinateur portable. Vous pouvez utiliser les types mime si vous n'êtes pas sûr des extensions. Il faut alors piper le stdout de la première commande sur un

file

3°) Vérifier si des fichiers ont été supprimés du serveur depuis la dernière synchronisation :

comme -23 liste  liste_temp

et si c'est le cas, les supprimer aussi de l'ordinateur portable.
3°) Une fois cela fait, remplacer liste_temp par liste, et mettre ce dernier fichier de côté. Procéder de même pour chaque synchronisation.

Hors ligne

#3 Le 03/09/2012, à 10:24

Flo_

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

Merci de votre (j'aimerais mieux qu'on se tutoie) aide, ça m'a bien guidé.
J'ai commencer à écrire le script, mais voilà, je ne fais pas de bash donc j'ai un peu de mal.
Voilà où j'en suis :

#!/bin/bash

# Script qui synchronise un dossier d'origine contenant de la musique en flac avec un dossier de destination dans lequel elle sera convertie en ogg q8.

orig=/home/$USER/temp1/
dest=/home/$USER/temp2/

copie () {
	while read var; do # Lire le stdout de la commande précédente ligne par ligne
		nouv=$(echo $dest)$(echo $var | sed "s/$orig//") # selon le type du fichier rencontré
		if [ $var = "`echo $var|grep .`" ] ; then # soit le créer (s'il s'agit d'un répertoire)
			echo Création du dossier $nouv
			mkdir "$nouv"
		elif [ echo $var | sed 's/.*\.//g' = ".flac" ] ; then # soit  l'encoder (s'il s'agit d'un fichier audio)
			echo encodage de $nouv
			oggenc -q8 "$var" -o "$nouv"
		else
			echo Copie de $nouv
			cp "$var" "$nouv"	# soit le copier (sinon)  sur l'ordinateur portable.
		fi
	done < fichier
}

if [ -f liste ] ; then # Si le fichier "liste" existe, créer "liste_temp" et les comparer.
	echo Création du fichier liste_temp
	find $orig | sort -o liste_temp
	comm -13 liste liste_temp > fichier
	copie
	echo Suppression des fichiers obsolètes
	while read var2; do # Vérifier si des fichiers ont été supprimés du serveur depuis la dernière synchronisation :
		echo Suppression de $var2
		rm -R "$var2" # si c'est le cas, les supprimer de l'ordinateur aussi :
	done < $(comm -23 liste liste_temp)
	echo Remplacement du fichier liste
	rm liste && mv liste_temp liste # remplacer "liste" par "liste_temps"
else  # S'il n'existe pas de fichier "liste", copier toute la bibliothèque et créer le fichier "liste".
	echo Création du fichier liste
	find $orig | sort -o liste
	echo "liste" > fichier
	copie
fi
rm fichier
echo Synchronisation terminée

Le résultat donne :

Création du fichier liste
sed: -e expression n°1, caractère 9: option inconnue pour `s'
Création du dossier /home/florian/temp2/
mkdir: impossible de créer le répertoire « /home/florian/temp2/ »: Le fichier existe
Synchronisation terminée

donc je vois bien que j'ai fait une erreur dans mon sed, mais je ne vois pas où.

Il faut peut-être aussi supprimer la première ligne de la liste avant de créer les dossiers.

Flo

Hors ligne

#4 Le 03/09/2012, à 17:34

toulipe

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

J'ai lu ton code. Voici quelques idées :

1°) Pour ce qui concerne sed, il n'est pas content parce que le séparateur utilisé ( '/' ) intervient aussi dans les expressions testées, qui comprennent précisément pleins de '/', d'où la confusion. Pour éviter ça, il suffit d'écrire, par exemple :

sed "s|$orig||"

à la place de

sed "s/$orig//"

Aussi, cette commande particulière gagnerait à être déplacée en-dehors de la fonction copie, et à être appliquée directement à la liste de fichiers temporaire. En tenant compte de ta remarque quand au fait que la première ligne de "liste_temp" doit être supprimée, on arrive à :

sed -i -e "s|$orig||" -e '1d' liste_temp

De la sorte, il suffit de lancer une seule fois sed. On simplifie aussi la gestion des copies. Après, il faut aussi bien penser à préciser les chemins complets des fichiers pour la copie :

chemin complet du fichier d'origine : $orig/$var
chemin complet du fichier d'arrivée : $dest/$var

2°) Pour ce qui est de différencier les types de fichiers, je ne crois pas que l'expression

[ $var = "`echo $var|grep .`" ]

utilisée pour tester si l'on a affaire à un répertoire, produise le résultat escompté. Il serait plus sûr de faire quelque chose comme :

if [ -d "$orig/$var" ] ; then
   mkdir "$dest/$var"

(où "$var" est l'addresse tronquée du fichier d'origine).
Pour tester si on a affaire à un fichier flac, il est aussi possible de faire :

if grep -q '.flac$' <<< "$orig/$var" ; then...

ou :

if [[ $(file "$orig/$var") =~ FLAC ]] ; then...

3°) Pour éviter d'éventuels messages d'erreurs lors de la suppression des fichiers périmés, qui apparaîtraient inévitablement s'il est question de supprimer des répertoires non vides, testes bien qu'un fichier existe avant de lancer le "rm -R" :

[ -e "$dest/$var2" ] && rm -R "$dest/$var2"

Aussi, penses à remplacer les extensions des noms de fichier audio, qui ne seront pas les mêmes dans $orig et dans $dest, avant d'essayer de supprimer les dits fichiers dans $dest :

comm -23 liste liste_temp | sed 's/\.flac$/\.q8/' | \
while read var2 ; do
   ...
done
# (si q8 est bien la bonne extension ?)

4°) Enfin, quand je disais de lire le stdout de "comm", je voulais dire faire quelque chose comme :

comm -13 liste liste_temp | copie

c'est-à-dire, en développé, :

comm -13 liste liste_temp | while read var ; do ... ; done

Cela évite de passer par un fichier temporaire, mais c'est aussi moins pratique pour vérifier si le script fonctionne bien. Gardes donc ta méthode pour le moment.
Enfin, fais attention de corriger la petite bourde de la ligne 40 (echo "liste" > fichier) en mettant bien un "cat"

Avec tout ça, ça devrait fonctionner. Bon courage smile

Dernière modification par toulipe (Le 03/09/2012, à 18:50)

Hors ligne

#5 Le 03/09/2012, à 22:00

Flo_

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

Eh bien, un très grand merci toulipe ! Je pense qu'il est bon là, j'ai fait plusieurs tests et ça a l'air de bien fonctionner (mais ça doit pas être très propre).
Voici le code :

#!/bin/bash

# Script qui synchronise un dossier d'origine contenant de la musique en flac avec un dossier de destination dans lequel elle sera convertie en ogg q8.

orig=/home/$USER/temp1/
dest=/home/$USER/temp2/

copie () {
	while read var; do # Lire le stdout de la commande précédente ligne par ligne
		nouv=$(echo $dest$var | sed "s|$orig||") # selon le type du fichier rencontré
		if [ -d "$var" ] ; then # soit le créer (s'il s'agit d'un répertoire)
			echo Création du dossier $nouv
			mkdir "$nouv"
		elif grep -q '.flac$' <<< "$var" ; then # soit  l'encoder (s'il s'agit d'un fichier audio)
			nouv_ogg=$(echo ${nouv%????}ogg)
			oggenc -q8 "$var" -o "$nouv_ogg"
		else
			echo Copie de $nouv
			cp "$var" "$nouv"	# soit le copier (sinon)  sur l'ordinateur portable.
		fi
	done < fichier
}

if [ -f liste ] ; then # Si le fichier "liste" existe, créer "liste_temp" et les comparer.
	echo Création du fichier liste_temp
	find $orig | sed '1d' | sort -o liste_temp
	comm -13 liste liste_temp > fichier
	copie
	echo Suppression des fichiers obsolètes
	comm -23 liste liste_temp > fichier2
	while read var2; do # Vérifier si des fichiers ont été supprimés du serveur depuis la dernière synchronisation :
		suppr=$(echo $dest$var2 | sed "s|$orig||")
		if grep -q '.flac$' <<< "$var2" ; then
			suppr=$(echo ${suppr%????}ogg)
		fi
		echo Suppression de $suppr
		rm -R "$suppr" # si c'est le cas, les supprimer de l'ordinateur aussi :
	done < fichier2
	rm fichier2
	echo Remplacement du fichier liste
	rm liste && mv liste_temp liste # remplacer "liste" par "liste_temps"
else  # S'il n'existe pas de fichier "liste", copier toute la bibliothèque et créer le fichier "liste".
	echo Création du fichier liste
	find $orig | sed '1d' | sort -o liste
	cp liste fichier
	copie
fi
rm fichier
echo Synchronisation terminée

Encore merci smile

Flo

Hors ligne

#6 Le 04/09/2012, à 20:23

toulipe

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

En effet, tout n'est pas très propre, mais si ça marche, c'est déjà un bon point wink. Le seul truc qui est vraiment gênant, à mon sens, c'est le 'sed' qui est lançé pour chaque fichier, plutôt qu'une seule fois pour l'ensemble des fichiers. On perd énormément en rapidité, mais cela, bien sûr, n'empêche pas le script de fonctionner. A la limite, tu pourras modifier le script plus tard si tu en ressens le besoin.

En tout cas, bravo pour l'effort, c'est pas tout le monde qui se donne la peine de développer soi-même un outil lorsqu'aucun n'est disponible pour faire la tâche que l'on souhaite.

A+ et bon courage !

Hors ligne

#7 Le 25/11/2012, à 18:12

Flo_

Re : [Résolu] Synchronisation de bibliothèque audio flac/ogg

Alors j'ai fait un petit nettoyage, plus besoin de garder des fichiers listes maintenant par exemple, je poste le nouveau script :

#!/bin/bash

# Script qui synchronise un dossier d'origine contenant de la musique en flac
# avec un dossier de destination dans lequel elle sera convertie en ogg q8.

# Définition du dossier d'origine :
orig=/media/Music/

# Définition du dossier de destination :
dest=/home/$USER/Musique/

cd /tmp


#######################
# Création des listes #
#######################

# Création de la liste des fichiers du dossier de destination :
echo Création de la liste des fichiers du dossier de destination.
find $dest | sed '1d' | sort -o liste_dest

# Création de la liste des fichiers du dossier d'origine :
echo Création de la liste des fichiers du dossier d\'origine.
find $orig | sed '1d' | sort -o liste_orig

# Suppression du chemin d'origine et du chemin de destination :
sed "s|$orig||" liste_orig > liste_orig_2
sed "s|$dest||" liste_dest > liste_dest_2

# Remplacement des occurenes en fin de ligne de flac par ogg :
sed -e "s/\.flac$/.ogg/g" liste_orig_2 > liste_orig_3
sed -e "s/\.FLAC$/.ogg/g" liste_orig_3 > liste_orig_ogg

# Création de la liste des fichiers à copier :
echo Création de la liste des fichiers à copier
comm -13 liste_dest_2 liste_orig_ogg > liste_copie

# Création de la liste des fichiers à supprimer:
echo Création de la liste des fichiers à supprimer.
comm -23 liste_dest_2 liste_orig_ogg > liste_suppr


###############################
# Copie des nouveaux fichiers #
###############################

# Lecture de la nouvelle liste ligne par ligne.
while read nouv; do
	# Différentes possibilités selon le type du fichier :
	# S'il s'agit d'un répertoire, le créer :
	if [ -d "$orig$nouv" ] ; then
		echo -e "Création du dossier $dest$nouv\n"
		mkdir "$dest$nouv"
	# S'il s'agit d'un fichier flac, l'encoder en ogg :
	elif grep -q '.ogg$' <<< "$nouv" ; then
		if [ -f "$orig${nouv%???}flac" ] ; then
			fic_source=$(echo "${nouv%???}flac")
		elif [ -f "$orig${nouv%???}FLAC" ] ; then
			fic_source=$(echo "${nouv%???}FLAC")
		fi
		oggenc -q8 "$orig$fic_source" -o "$dest$nouv"
	# Sinon, le copier simplement :
	else
		echo -e "Copie de $orig$nouv vers $dest$nouv\n"
		cp "$orig$nouv" "$dest$nouv"
	fi
done < liste_copie


#######################################
# Suppression des fichiers obsolètes. #
#######################################

# Lecture de la nouvelle liste ligne par ligne :
while read suppr; do
	echo Suppression de $dest$suppr
	rm -R "$dest$suppr"
done < liste_suppr


# Suppression des listes :
rm liste_dest liste_dest_2 liste_orig liste_orig_2 liste_orig_ogg
rm liste_copie liste_suppr liste_orig_3
echo Synchronisation terminée.

Hors ligne