абстрактное преобразование между тегами id3, тегами m4a, тегами flac - PullRequest
14 голосов
/ 30 марта 2009

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

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

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

Ответы [ 5 ]

9 голосов
/ 31 марта 2009

Мне нужна была именно эта вещь, и я также быстро понял, что мутаген - не достаточно отдаленная абстракция, чтобы делать подобные вещи. К счастью, авторам мутагена это понадобилось для их медиаплеера 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 голосов
/ 17 августа 2011

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

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

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

2 голосов
/ 03 ноября 2009

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

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

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

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

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

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

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

0 голосов
/ 12 апреля 2009

Есть также tagpy, который, кажется, хорошо работает.

0 голосов
/ 30 марта 2009

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

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

...