Абстрагирование преобразования между тегами 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
Там также теги, которые, похоже, работают хорошо.