Je vais aussi gratter vers la solution proposée par Proxy... dans un second temps 🙂
Conversion par lot, listes de fichiers
C'est assez subtil comme comportement... Le coupable est ffmpeg qui, durant son exécution, lit aussi sur l'entrée standard et court-circuite du coup read. Pour arranger ça, rajoute « </dev/null » au bout de la commande ffmpeg :
find . -name "*.mp3" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac" </dev/null;
oggenc -b 128 "${i%mp3}flac";
rm "${i%mp3}flac";
echo $i;
done
Effectivement c'était subtil ! Je pense pas que j'aurais pu trouver ça tout seul.
Est-ce que ça veut dire que ffmpeg "mange" l'entrée standard, c'est-à-dire ce qui est envoyé par find ?
Qu'est-ce que /dev/null ? ce n'est ni un fichier ni un dossier on dirait... Est-ce un lecteur, comme /dev/sda mais qui ne contiendrait rien ?
rm "${i%mp3}flac" est censé effacer le fichier de transition FLAC, mais ne le fait pas. WTH ? ça fonctionnait dans l'ancienne version du script...
Est-ce que ça veut dire que ffmpeg "mange" l'entrée standard, c'est-à-dire ce qui est envoyé par find ?
Qu'est-ce que /dev/null ? ce n'est ni un fichier ni un dossier on dirait... Est-ce un lecteur, comme /dev/sda mais qui ne contiendrait rien ?
rm "${i%mp3}flac" est censé effacer le fichier de transition FLAC, mais ne le fait pas. WTH ? ça fonctionnait dans l'ancienne version du script...
Pour la définition de /dev/null : http://fr.wikipedia.org/wiki//dev/null
Exactement.Est-ce que ça veut dire que ffmpeg "mange" l'entrée standard, c'est-à-dire ce qui est envoyé par find ?
Pourrais-tu poster les traces d'exécution du script ?rm "${i%mp3}flac" est censé effacer le fichier de transition FLAC, mais ne le fait pas. WTH ? ça fonctionnait dans l'ancienne version du script...
En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
rm "$i.flac";
par
rm "${i%.mp3}.flac";
Tout rentre dans l'ordre...Les comamndes que tu as postées indiquaient pourtant bien « rm "${i%.mp3}.flac" ». Pas bien ça, tu veux faire peur ? ^^patou355 wrote:En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçantparrm "$i.flac";
Tout rentre dans l'ordre...rm "${i%.mp3}.flac";
Et on peut même supprimer les points :
rm "${i%mp3}flac";
ce qui est assez logique finalement...Effectivement, je l'ai peut-être changé par erreur entre temps, puis je suis revenu aux bases... enfin tj est-il que ça marche pour les mp3.
Je vais maintenant l'adapter pour wma (si si), flv (et oui encore plus dingue), flac et mp4.
Ensuite, j'aurais un scrpt de la mort qui convertit tout en .ogg
Je vais maintenant l'adapter pour wma (si si), flv (et oui encore plus dingue), flac et mp4.
Ensuite, j'aurais un scrpt de la mort qui convertit tout en .ogg
Voilà, on s'approche d'un résultat final qui fonctionne bien, en tout cas dans le cadre du test que je viens d'effectuer.
#!/bin/bash
#Conversion depuis mp3
find . -name "*.mp3" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac" </dev/null;
oggenc -b 128 "${i%mp3}flac";
rm "${i%.mp3}.flac";
rm "$i";
done
#Conversion depuis mp4
find . -name "*.mp4" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%mp4}flac":"$i" "${i%mp4}flac" </dev/null;
oggenc -b 128 "${i%mp4}flac";
rm "${i%.mp4}.flac";
rm "$i";
done
#Conversion depuis m4b
find . -name "*.m4b" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%m4b}flac":"$i" "${i%m4b}flac" </dev/null;
oggenc -b 128 "${i%m4b}flac";
rm "${i%.m4b}.flac";
rm "$i";
done
#Conversion depuis flv (fucking l*** video)
find . -name "*.flv" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%flv}flac":"$i" "${i%flv}flac" </dev/null;
oggenc -b 128 "${i%flv}flac";
rm "${i%.flv}.flac";
rm "$i";
done
#Conversion depuis wma
find . -name "*.wma" | while read i;
do ffmpeg -i "$i" -map_meta_data "${i%wma}flac":"$i" "${i%wma}flac" </dev/null;
oggenc -b 128 "${i%wma}flac";
rm "${i%.wma}.flac";
rm "$i";
done
#Conversion depuis flac
find . -name "*.flac" | while read i;
do oggenc -b 128 "$i";
rm "$i";
done
Avec tous mes remerciements à Pikachu 🙂Ce n'est pas fini 🙂. C'est dommage qu'il y ait ici duplication de code, on peut largement condenser :
Es-tu cependant sûr de vouloir supprimer les fichiers FLAC originaux dans ton bloc « #Conversion depuis flac » ?
# Une liste des types de fichiers à convertir, par extension
TYPES_SUPPORTES="mp3 mp4 m4a flac flv wma"
# On va parcourir tous les fichiers de l'arborescence, quels qu'ils soient
find . -type f | while read i; do
# on récupère l'extension du fichier traité
ext=${i##*.}
# Si l'extension n'est pas dans la liste TYPES_SUPPORTES, le fichier est ignoré et on passe au suivant
grep -q "$ext" <<<"$TYPES_SUPPORTES" || continue
# On ne convertit évidemment pas les fichiers FLAC avec ffmpeg, c'est déjà fait...
[ $ext != flac ] && ffmpeg -i "$i" -map_meta_data "${i%$ext}flac":"$i" "${i%$ext}flac" </dev/null
oggenc -b 128 "${i%$ext}flac"
rm "${i%$ext}flac"
done
Ainsi, pour convertir d'autres types de fichiers supportés par ffmpeg avec la même commande, tu n'aurais qu'à rajouter l'extension associé à la variable TYPES_SUPPORTES.Es-tu cependant sûr de vouloir supprimer les fichiers FLAC originaux dans ton bloc « #Conversion depuis flac » ?
- Modifié
Bon, là je peux pas lutter 🙂
Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...
et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'
Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...
et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'
Je vais détailler le fonctionnement du script. Celui-ci va parcourir tous les fichiers, y compris ceux non multimédia. Mais seuls ceux dont l'extension est dans la variable TYPES_SUPPORTES seront effectivement convertis. Un fichier non multimédia sera ignoré (la commande « continue », si elle est exécutée, fait en sorte que les instructions situées après soient ignorée et fait passer la boucle au fichier suivant).patou355 wrote:Bon, là je peux pas lutter 🙂
Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...
et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'
Par ailleurs, la commande ffmpeg dans le script va convertir ici n'importe quel fichier dont l'extension est déclarée dans TYPES_SUPPORTES en FLAC. Or les fichiers FLAC sont aussi dans TYPES_SUPPORTES. Dès lors pourquoi convertir du FLAC en FLAC ? Aussi pour ces fichiers la commande n'est pas exécutée, on passe directement à l'encodage en OGG.
Le but de ma réécriture était d'une part d'éviter la duplication de code (si tu devais modifier par exemple la commande ffmpeg, tu devrais sans ça la modifier autant de fois qu'elle apparaît), d'autre part de permettre la prise en compte de nouveaux fichiers multimédia sans peine ni copie de code (grâce à la variable TYPE_SUPPORTES).
C'est vrai que c'est beaucoup mieux pour celui qui écrit le code, et je vais sûrement adapter mon script à ta sauce 🙂
Par contre, cela veut dire que tous les fichiers sont stockés dans la variable, même si on en fait rien. Est-ce qu'on ne risque pas de faire exploser la taille de cette dernière ? Imaginons qu'il existe moult petits fichiers texte à côté par exemple. Ne risque-je pas d'alourdir mon programme ? Où sont stockées les variables (RAM, DD...) ?
Je reconnais que c'est tiré par les cheveux, parce que pour saturer 1 Gio de RAM avec une liste de fichier faut se lever tôt. Mais question de principe...
Par contre, cela veut dire que tous les fichiers sont stockés dans la variable, même si on en fait rien. Est-ce qu'on ne risque pas de faire exploser la taille de cette dernière ? Imaginons qu'il existe moult petits fichiers texte à côté par exemple. Ne risque-je pas d'alourdir mon programme ? Où sont stockées les variables (RAM, DD...) ?
Je reconnais que c'est tiré par les cheveux, parce que pour saturer 1 Gio de RAM avec une liste de fichier faut se lever tôt. Mais question de principe...
Quelle variable ? TYPES_SUPPORTES ? Son contenu n'est jamais modifié dans la boucle ; la commande suivante :patou355 wrote: Par contre, cela veut dire que tous les fichiers sont stockés dans la variable, même si on en fait rien.
grep -q "$ext" <<<"$TYPES_SUPPORTES"
vérifie simplement si l'extension du fichier courant fait partie de celles définies dans la variable TYPES_SUPPORTES. Si tu préfères, une notation "développée" strictement équivalente serait :
echo "$TYPE_SUPPORTES" | grep -q "$ext"
L'opérateur "<<<" (avec 3 chevrons) permet d'envoyer le contenu d'une chaîne sur sur l'entrée standard de la commande qui le précède.Ha oui non oublie ce que j'ai dit, erreur d'interprétation.
C'est vraiment différent d'un langage comme le C. Là j'aurais pas vu comment élaborer ce type de boucle sans test (if)...
En tout cas merci beaucoup 🙂
C'est vraiment différent d'un langage comme le C. Là j'aurais pas vu comment élaborer ce type de boucle sans test (if)...
En tout cas merci beaucoup 🙂