Абстрагирование преобразования между тегами id3, тегами m4a, тегами flac

Я ищу ресурс в python или bash, который позволит легко взять, например, mp3 файл X и m4a файл Y и сказать "копировать теги X в Y".

Модуль Python "mutagen" отлично подходит для создания макетов в целом, но нет абстрактного понятия "поле художника", которое охватывает разные типы тегов; Я хочу, чтобы библиотека обрабатывала все фидбированные биты и знала эквивалентность имени поля. Для вещей, которые не все теги могут выразить, я в порядке с потерянной информацией или наиболее угаданными.

(Случай использования: Я кодирую файлы без потерь в mp3, а затем использую mp3 для прослушивания. Каждый месяц или около того я хочу иметь возможность обновлять файлы "без потерь" с любыми изменениями тегов, которые я сделал для mp3. Я устал от того, чтобы накладывать носки на различия в реализации между форматами.)

Ответы

Ответ 1

Мне нужна была эта точная вещь, и я тоже быстро понял, что мутаген не является достаточно удаленной абстракцией, чтобы делать подобные вещи. К счастью, авторы мутагена нуждались в этом для своего медиаплеера QuodLibet.

Мне пришлось прорываться через источник QuodLibet, чтобы узнать, как его использовать, но как только я это понял, я написал утилиту под названием sequitur, которая предназначена для командной строки, эквивалентной ExFalso (компонент тегов QuodLibet). Он использует этот механизм абстракции и предоставляет некоторую добавленную абстракцию и функциональность.

Если вы хотите проверить источник, здесь ссылка на последний архив. Пакет фактически представляет собой набор из трех сценариев командной строки и модуль для взаимодействия с QL. Если вы хотите установить все это, вы можете использовать:

easy_install QLCLI

Одна вещь, которая следует учитывать в отношении exfalso/quodlibet (и, следовательно, sequitur), заключается в том, что они фактически реализуют звуковые метаданные должным образом, а это означает, что все теги поддерживают несколько значений (если только тип файла не запрещает его, что мало того, что делать). Итак, что-то вроде:

print qllib.AudioFile('foo.mp3')['artist']

Не выводит ни одной строки, но выводит список строк, например:

[u'The First Artist', u'The Second Artist']

Как вы могли бы использовать его для копирования тегов, было бы что-то вроде:

import os.path
import qllib  # this is the module that comes with QLCLI

def update_tags(mp3_fn, flac_fn):
    mp3 = qllib.AudioFile(mp3_fn)
    flac = qllib.AudioFile(flac_fn)
    # you can iterate over the tag names
    # they will be the same for all file types
    for tag_name in mp3:
        flac[tag_name] = mp3[tag_name]
    flac.write()

mp3_filenames = ['foo.mp3', 'bar.mp3', 'baz.mp3']

for mp3_fn in mp3_filenames:
    flac_fn = os.path.splitext(mp3_fn)[0] + '.flac'
    if os.path.getmtime(mp3_fn) != os.path.getmtime(flac_fn):
        update_tags(mp3_fn, flac_fn)

Ответ 2

Вот пример кода, script, который я написал для копирования тегов между файлы, используя классы формата Quod Libet (не мутагены!). Бежать это просто copytags.py src1 dest1 src2 dest2 src3 dest3, и это скопирует теги в sec1 в dest1 (после удаления любых существующих тегов на dest1!) и т.д. Обратите внимание на черный список, который вы должны настроить на ваши собственные предпочтения. Черный список не только предотвратит определенные теги от копирования, это также предотвратит их забивание в файл назначения.

Чтобы быть ясным, Quod Libet-agnostic tagging не является особенностью мутагена; он реализуется поверх мутагена. Поэтому, если вы хотите использовать тегирование формата-агностика, вам нужно использовать quodlibet.formats.MusicFile, чтобы открыть ваши файлы вместо mutagen.File.

Код теперь можно найти здесь: https://github.com/DarwinAwardWinner/copytags

Если вы также хотите сделать перекодирование в одно и то же время, используйте это: https://github.com/DarwinAwardWinner/transfercoder

Одна критическая деталь для меня заключалась в том, что классы формата Quod Libet ожидайте загрузки конфигурации QL, поэтому строка config.init в моей script. Без этого я получаю всевозможные ошибки при загрузке или сохранении файлы.

Я тестировал этот script для копирования между flac, ogg и mp3, со стандартными тегами, а также с произвольными тегами. До сих пор он отлично работал.

По причине того, что я не использовал QLLib, это не сработало для меня. Я подозреваю, что он получал такие же связанные с конфигурацией ошибки, как и я, но молча игнорировал их и просто не писал теги.

Ответ 3

У меня есть bash script, который делает именно это, atwat-tagger. Он поддерживает файлы flac, mp3, ogg и mp4.

usage: `atwat-tagger.sh inputfile.mp3 outputfile.ogg`

Я знаю, что ваш проект уже завершен, но кто-то, кто находит эту страницу через поисковую систему, может оказаться полезной.

Ответ 4

Вы можете просто написать простое приложение с отображением каждого имени тега в каждом формате на тип абстрактного тега, а затем его легко конвертировать из одного в другое. Вам даже не нужно знать все доступные типы - только те, которые вас интересуют.

Мне кажется, что тип инвестиций в выходные дни, возможно, меньше. Получайте удовольствие, и я не против заглядывать в вашу реализацию и даже использовать ее - если вы не будете возражать, конечно, чтобы освободить ее:-).

Ответ 5

Там также теги, которые, похоже, работают хорошо.