Voici un script Python que j'ai rapidement piraté ensemble pour résoudre le problème d'origine: conserver une copie compressée d'une bibliothèque musicale. Le script convertira les fichiers .m4a (supposés être ALAC) au format AAC, sauf si le fichier AAC existe déjà et est plus récent que le fichier ALAC. Les fichiers MP3 de la bibliothèque seront liés, car ils sont déjà compressés.
Méfiez-vous simplement que l'annulation du script (ctrl-c ) laissera un fichier à moitié converti.
À l'origine, je voulais aussi écrire un Makefile pour gérer cela, mais comme il ne peut pas gérer les espaces dans les noms de fichiers (voir la réponse acceptée) et parce que l'écriture d'un script bash est garantie de me mettre dans un monde de douleur, c'est Python. C'est assez simple et court, et devrait donc être facile à adapter à vos besoins.
from __future__ import print_function
import glob
import os
import subprocess
UNCOMPRESSED_DIR = 'Music'
COMPRESSED = 'compressed_'
UNCOMPRESSED_EXTS = ('m4a', ) # files to convert to lossy format
LINK_EXTS = ('mp3', ) # files to link instead of convert
for root, dirs, files in os.walk(UNCOMPRESSED_DIR):
out_root = COMPRESSED + root
if not os.path.exists(out_root):
os.mkdir(out_root)
for file in files:
file_path = os.path.join(root, file)
file_root, ext = os.path.splitext(file_path)
if ext[1:] in LINK_EXTS:
if not os.path.exists(COMPRESSED + file_path):
print('Linking {}'.format(file_path))
link_source = os.path.relpath(file_path, out_root)
os.symlink(link_source, COMPRESSED + file_path)
continue
if ext[1:] not in UNCOMPRESSED_EXTS:
print('Skipping {}'.format(file_path))
continue
out_file_path = COMPRESSED + file_path
if (os.path.exists(out_file_path)
and os.path.getctime(out_file_path) > os.path.getctime(file_path)):
print('Up to date: {}'.format(file_path))
continue
print('Converting {}'.format(file_path))
subprocess.call(['ffmpeg', '-y', '-i', file_path,
'-c:a', 'libfdk_aac', '-vbr', '4',
out_file_path])
Bien entendu, cela peut être amélioré pour effectuer le codage en parallèle. Cela est laissé comme exercice au lecteur ;-)