web-dev-qa-db-fra.com

Utilisez metaflac pour renommer les fichiers .flac à partir de balises flac de manière récursive

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!

1
BlackR

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!

1
BlackR

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.

1
Progrock

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".

0
Doron Behar

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.

0
Progrock

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.

0
Progrock