Frage Verwenden Sie metaflac, um .flac-Dateien von flac-Tags rekursiv umzubenennen


Ich versuche, eine Reihe von Songs mit metaflac (sudo apt-get install flac) von ihren jeweiligen Tags rekursiv umzubenennen, da es sich um eine unbekannte Anzahl von Unterordnern handelt.

Die Ausgabe sollte lauten: $ TRACKNUMBER. $ TITLE.flak

Dies ist mein Versuch, aber es funktioniert nicht rekursiv:

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

Ich weiß nicht warum, aber manchmal bekomme ich "Die FLAC-Datei konnte nicht geöffnet werden. Wahrscheinlich ist die Datei nicht vorhanden oder nicht lesbar. * .Flac: ERROR: Lesen von Metadaten, status =" FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE "".

Gibt es einen besseren Weg, es rekursiv zu machen? Ich bevorzuge auch Oneliner. Danke im Voraus!


1
2018-02-24 14:08


Ursprung


Ich habe diesen Fehler nur in Dateinamen, die Leerzeichen enthalten - auval


Antworten:


Wenn Sie Ihren Code in eine eigene Datei schreiben, machen Sie sie ausführbar und platzieren Sie sie in Ihrem Binärpfad (z. B. ~ / bin).

z.B. rename_flac_tracks_from_meta.sh

Sie könnten dann find und xargs verwenden, um rekursiv durch Ihre Verzeichnisse zu gehen und Ihr Skript auf jedes anzuwenden.

$ cd path/to/flac/folders
$ find . -type d -print0 | xargs -0 -t -I{} sh -c 'cd "{}"  && rename_flac_tracks_from_meta.sh'

Denken Sie daran, dass es in Verzeichnisse krabbeln wird, die möglicherweise keine Flacs enthalten, aber es sollte eher einen Schluckauf als einen Fehler machen.


1
2017-11-24 17:55





Ich habe ein Python-Skript von Louis-Philippe Véronneau gefunden.

Der aktuelle Code kann auf seinem Git-Repository gefunden werden: https://gitlab.com/baldurmen/rename-flac

Sie müssen python-docopt installieren (sudo apt-get installieren python-docopt) und dieses Skript ausführen, nachdem Sie chmod + x rename-flac.py es:

#!/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 __name__ == "__main__":
    main()

Ich habe es getestet und alles funktioniert wie ein Zauber! Vielen Dank!


1
2018-03-10 14:17





Ich habe eine GUI-Software namens aufgerufen easyTAG Das kann Dateien entsprechend ihren Metadaten-Tags umbenennen.

Der Trick besteht darin, den 'Scanner' in easyTAG zu öffnen und den 'Scanner-Modus' in 'Dateien umbenennen' umzuwandeln.


0
2017-10-02 12:59





Eine Alternative zum Schreiben eines eigenen Rezepts mit Metaflac ist die Verwendung eines Tagging-Tools.

Ich verwende das Ex Falso GUI zum Abrufen und Bearbeiten von Tags und zum Umbenennen von Dateien.


0
2017-11-24 18:03





Ich mache viel von meinem Tag-Management Stückwerk und es ist alles ein wenig mühsam.

Ich entdeckte Rüben leider nachdem ich eine Menge Grunzarbeit geleistet hatte. Es kann viele Aufgaben automatisieren. Beets können verwendet werden, um Ihnen bei der Organisation Ihrer Mediendateien zu helfen. Es ruft Tags ab und schreibt sie, hilft beim Umbenennen von Dateien und mehr.


0
2017-11-24 18:22