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

StackOverflow https://stackoverflow.com/questions/697776

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Мне пришлось покопаться в исходниках QuodLibet, чтобы узнать, как его использовать, но как только я это понял, я написал утилиту под названием продолжение который предназначен для командной строки, эквивалентной ЭксFalso (компонент тегов 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)

Другие советы

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

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

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

Вот какой -то пример кода, сценарий, который я написал для копирования тегов между файлами с использованием классов музыкального формата 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, у меня это не сработало.Я подозреваю, что он получал те же ошибки, связанные с конфигурацией, что и я, но молча их игнорировал и просто не мог писать теги.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top