Функция для анализа тега MP3 ID3v2

Сигнатура функции: def parse_id3v2(file_path)

Описание формата:

Тег ID3v2 содержит метаданные (исполнитель, название альбома, название песни и т. д.) файла MP3.
обычно (иначе не анализировать) файлы MP3 начинаются с тега ID3v2, затем следуют аудиоданные
Тег ID3v2 состоит из заголовка и тела, заголовок (всего 10 байт):

                ID3v2/идентификатор файла "ID3"
                Версия ID3v2 $04 00 (ID3v2 версия 4), $03 00 (ID3v2 версия 3)
                Флаги ID3v2 %abcd0000 (1 байт, если установлен `b` - присутствует расширенный заголовок)
                Размер ID3v2 4 * %0xxxxxxx (4 байта, первый бит каждого байта всегда равен 0, всего 28 эффективных битов)

пример: б'ID3\x03\x00\x00\x00\x00\x03\x19' ID3v2/идентификатор файла b'ID3' (b'ID3' - способ, которым Python обрабатывает двоичные данные в диапазоне ASCII, равный b'x49x44x33') Версия ID3v2 $03 Флаги ID3v2 $00 Размер ID3v2 $00 00 03 19 = 409 байт

тело тега состоит из одного или нескольких фреймов, следующих друг за другом
кадр тега состоит из заголовка и тела (с фактическими данными)
заголовок (всего 10 байт), формат размера различается для ID3v2 версии 3 и версии 4:

                Идентификатор кадра $xx xx xx xx (четыре символа ASCII)
                Размер (v4) 4 * %0xxxxxxx
                размер (v3) $xx xx xx xx (всего 32 эффективных бита)
                Флаги $xx xx

пример: б'ТАЙЕР\х00\х00\х00\х05\х00\х00\х002004' Идентификатор кадра b'TYER' Размер $00 00 00 05 = 5 байт Флаги $00 00 Данные $00 b'2004' -- первый байт - кодировка (см. ниже), за которым следуют данные (год выпуска)

Существует несколько типов рамок. Один из них, текстовые информационные кадры (идентифицируемые по идентификатору кадра, начинающемуся с «T», как в приведенном выше примере), должны быть проанализированы, а двоичные данные преобразованы в строку.

Формат тела текстового фрейма:

первый байт кодирует, значения:
$00 — ISO-8859-1 (LATIN-1, идентичен ASCII для значений меньше 0x80).
$01 — Unicode в кодировке UTF-16 (UCS-2) со спецификацией, в ID3v2.2 и ID3v2.3.
$02 — Юникод в кодировке UTF-16BE без спецификации, в ID3v2.4.
$03 — Unicode в кодировке UTF-8 в ID3v2.4.
затем следуют фактические данные

Чтобы преобразовать в строку, используйте функцию decode, например. в РЕПЛ:

b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, Python 3!'.decode('UTF-8') 'Привет, Питон 3!'

Примечания к реализации:

это учебная задача, не реализуйте все функции, описанные в спецификации, только то, что требуется в задаче
убедитесь, что ваш файл начинается с тега ID3
убедитесь, что версия ID3v2 3 или 4
не анализировать файлы с расширенным заголовком
Теги ID3 реального мира могут быть неправильно сконструированы, будьте осторожны (используйте конструкцию Python 'with' для открытия файла, исключения должны быть обработаны)
если невозможно разобрать файл (по какой-либо причине: файл не существует, нет доступа к файлу для чтения, неправильный формат и т. д.), вернуть пустой список
читать только данные тегов из файла, не читать все, это резко снижает IO (2,5 против 27 секунд в моем каталоге 1,6 ГБ с MP3)
можно использовать «магические числа» при разборе структур, например. версия (старшая) занимает 4-й байт в заголовке ID3, поэтому к ней можно получить доступ следующим образом: tag_header3 (сравните с tag_header_offset = 3; tag_header[tag_header_offset])
вы можете использовать шестнадцатеричный редактор или модуль Python binascii для исследования содержимого файла
см. прикрепленный документ для более подробной информации

Ваша функция должна возвращать список кортежей (в порядке появления) с данными тега, формат кортежа:

Идентификатор кадра
размер
двоичные данные
для текстовых полей данные преобразуются в строку, иначе нет

пожалуйста, убедитесь, что ваш парсер работает на mp3 из материалов курса

https://drive.google.com/file/d/1yXe2iqv9b347p41CoE_px7YIKgcKIXco/view

https://drive.google.com/file/d/1K9t_Ta8Oyop6nECa0F5dEyO-2a9z6sT8/view

https://drive.google.com/file/d/1KEpW42spkV0lqlDQFOpUHyCxRoPVbW6E/view


Ответы (0 шт):