J'essaie de renommer une série de chansons à l'aide de métaflac (Sudo apt-get install flac) à partir de leurs balises respectives, car je traite un nombre inconnu de sous-dossiers.
La sortie devrait être: $ TRACKNUMBER. $ TITLE.flac
Ceci est ma tentative, mais cela ne fonctionne pas de manière récursive:
for a in *.flac; do
TITLE=`metaflac "$a" --show-tag=TITLE | sed s/.*=//g`
TRACKNUMBER=`metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g`
mv "$a" "`printf %02g $TRACKNUMBER`. $TITLE.flac";
done
Je ne sais pas pourquoi, mais parfois je reçois "Le fichier FLAC n'a pas pu être ouvert. Le fichier n'existe probablement pas ou n'est pas lisible. * .Flac: ERREUR: lecture de métadonnées, status =" FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE ".
Y a-t-il une meilleure façon de le faire de manière récursive? Je préfère aussi oneliners. Merci d'avance!
J'ai trouvé un script python écrit par Louis-Philippe Véronneau.
Le code à jour est disponible sur son dépôt git: https://gitlab.com/baldurmen/rename-flac
Vous devez installer python-docopt (sudo apt-get installer python-docopt) et exécuter ce script après avoir modifié chmod + x rename-flac.py:
#!/usr/bin/python
"""
rename-flac takes the information from FLAC metadata to batch rename
the files according to a filenaming scheme.
Usage:
rename-flac.py [--verbose] <scheme> <directory>
rename-flac.py (-h | --help)
rename-flac.py --version
Arguments:
<scheme> The filenaming scheme. Has to be between quotation marks
<directory> The path to the directory containing the album
Options:
-h --help Shows the help screen
--version Outputs version information
--verbose Runs the program as verbose mode
These are the options you can use to define the filenaming scheme:
%a = Artist | %b = Album | %d = Date
%g = Genre | %n = Tracknumber | %t = Title
"""
import sys
try:
from docopt import docopt # Creating command-line interface
except ImportError:
sys.stderr.write("""
%s is not installed: this program won't run correctly.
To install %s, run: aptitude install %s
""" % ("python-docopt", "python-docopt", "python-docopt"))
import subprocess
import re
import os
TAGS = dict(a='artist', b='album', d='date',
g='genre', n='tracknumber', t='title')
# Defining the function that fetches metadata and formats it
def metadata(filepath):
args = ["--show-tag=%s" % tag for tag in TAGS.values()]
tags = ["%s=" % tag for tag in TAGS.values()]
formatter = dict()
pipe = subprocess.Popen(["metaflac"] + args + [filepath],
stdout=subprocess.PIPE)
output, error = pipe.communicate()
if pipe.returncode:
raise IOError("metaflac failed: %s" % error)
output = output.splitlines()
for tag in tags:
for item in output:
x = re.compile(re.escape(tag), re.IGNORECASE)
if bool(re.match(x, item)) == True:
tag = tag.replace("=", "")
if tag == "tracknumber":
formatter[tag] = x.sub("", item).zfill(2)
else:
formatter[tag] = x.sub("", item)
return formatter
# Defining function that renames the files
def rename(scheme, dirname, filename, args):
filepath = os.path.join(dirname, filename)
new_filename = scheme % metadata(filepath) + ".flac"
if new_filename == filename:
if args["--verbose"] == True:
print("%s is already named correctly") % (filename)
else:
new_filepath = os.path.join(dirname, new_filename)
os.rename(filepath, new_filepath)
if args["--verbose"] == True:
print("%s >> %s") % (filename, new_filename)
# Defining main function
def main():
args = docopt(__doc__, version="rename-flac 1.0")
scheme = args["<scheme>"]
if not re.search("%[tn]", scheme): # To have a unique filename
sys.stderr.write("%t or %n has to be present in <scheme>\n")
return
scheme = re.sub('%%([%s])' % ''.join(TAGS.keys()),
lambda m: '%%(%s)s' % TAGS[m.group(1)],
scheme)
for dirname, _, filenames in os.walk(
args["<directory>"],
topdown=False):
for filename in filenames:
if os.path.splitext(filename)[1] == ".flac":
try:
rename(scheme, dirname, filename, args)
except KeyboardInterrupt:
raise
except OSError:
print("Song title contains /. Please rename it")
# Calling main function
if __== "__main__":
main()
Je l'ai testé et tout fonctionne à merveille! Je vous remercie!
Si vous placez votre code dans son propre fichier, rendez-le exécutable et placez-le dans votre chemin binaire (par exemple ~/bin).
par exemple. rename_flac_tracks_from_meta.sh
Vous pouvez ensuite utiliser find et xargs pour parcourir de manière récursive vos répertoires et appliquer votre script à chacun d'entre eux.
$ cd path/to/flac/folders
$ find . -type d -print0 | xargs -0 -t -I{} sh -c 'cd "{}" && rename_flac_tracks_from_meta.sh'
Gardez à l'esprit que cela va ramper dans des répertoires qui ne contiennent peut-être pas de flac, mais cela devrait simplement échouer plutôt que de mourir.
J'ai rencontré un logiciel d'interface graphique appelé easyTAG qui peut renommer les fichiers en fonction de leurs balises de métadonnées.
L'astuce consiste à ouvrir le "scanner" dans easyTAG et à changer le "mode scanner" en "renommer des fichiers".
Une alternative à l'écriture de votre propre recette à l'aide de metaflac consiste à utiliser un outil de marquage.
J'utilise l'interface graphique Ex Falso pour extraire et modifier les balises et renommer les fichiers.
Je fais une grande partie de ma gestion des tags, et tout cela est un peu laborieux.
J'ai découvert Beets malheureusement après avoir beaucoup travaillé au grognement. Il peut automatiser de nombreuses tâches. Les betteraves peuvent être utilisées pour vous aider à organiser vos fichiers multimédia. Il va chercher et écrire des balises, aider avec le changement de nom de fichier et plus.