Используйте metaflac для рекурсивного переименования файлов.flac из тегов flac
Я пытаюсь рекурсивно переименовать группу песен, используя metaflac (sudo apt-get install flac) из их соответствующих тегов, потому что я имею дело с неизвестным количеством подпапок.
Вывод должен быть: $TRACKNUMBER. $TITLE.flac
Это моя попытка, однако она не работает рекурсивно:
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
Я не знаю почему, но иногда я получаю "Файл FLAC не может быть открыт. Скорее всего, файл не существует или не читается. *.Flac: ОШИБКА: чтение метаданных, status = "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE"".
Есть ли лучший способ сделать это рекурсивным способом? Я также предпочитаю oneliners. Заранее спасибо!
5 ответов
Я нашел сценарий на питоне, написанный Луи-Филиппом Веронно.
Обновленный код можно найти в его репозитории git: https://gitlab.com/baldurmen/rename-flac
Вам нужно установить python-docopt (sudo apt-get install python-docopt) и запустить этот скрипт после того, как вы выполните 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 __name__ == "__main__":
main()
Я проверил это, и все работает как шарм! Спасибо!
Если вы поместите свой код в его собственный файл, сделайте его исполняемым и поместите его в двоичный путь (например, ~/bin).
например, rename_flac_tracks_from_meta.sh
Затем вы можете использовать find и xargs для рекурсивного просмотра ваших каталогов и применения вашего скрипта к каждому из них.
$ cd path/to/flac/folders
$ find . -type d -print0 | xargs -0 -t -I{} sh -c 'cd "{}" && rename_flac_tracks_from_meta.sh'
Имейте в виду, что они будут попадать в каталоги, в которых могут отсутствовать помехи, но они должны просто икать, а не умирать.
Я много делаю по части управления тегами, и все это немного трудоемко.
Я с грустью обнаружил Свекла после того, как проделал большую тяжелую работу. Это может автоматизировать многие задачи. Свекла может быть использована для организации ваших медиа-файлов. Он будет извлекать и записывать теги, помогать с переименованием файлов и многое другое.
Альтернативой написанию собственного рецепта с использованием metaflac является использование инструмента тегирования.
Я использую Ex Falso GUI для извлечения и редактирования тегов и переименования файлов.
Я встречал программное обеспечение с графическим интерфейсом easyTAG, которое может переименовывать файлы в соответствии с их метаданными.
Хитрость заключается в том, чтобы открыть "сканер" в easyTAG и изменить "режим сканера" на "переименование файлов".