i formulate infinity and store it deep inside of me

Powered by Astir.News engine

Быстро и без модулей читаем ID3v1 теги из mp3

29 апреля 2009, 22:55

Согласно спецификации, на ID3v1 отведено всего 128 байт в конце файла, так что можно легко определить наличие тегов в mp3 файле:

open(TEMP,"$file.mp3"); binmode(TEMP); $bin=''; seek(TEMP,-128,2); read(TEMP, $bin,128); close(TEMP);
if ($bin=~ /^TAG/i) {
($title,$artist,$album,$year,$comments)=$bin=~/^TAG(.{30})(.{30})(.{30})(.{4})(.{28})/;
print "$title,$artist,$album,$year,$comments";
}

Особо внимательные заметили, что мы прочитали 128 байт, а использовали 125.  В конце осталось 3 байта - это один байт hex 00 , один байт с номером трека (тоже hex), и байт-указатель стиля. Но это уже не так важно, кому надо - допишет сам :) А еще неиспользуемая длина добивается нулями hex 00, т.е. если что - можно еще регуляркой пройтись и вырезать.

PS. На всякий случай:

SignLength
(bytes)
Position
(bytes)
Description
A3(0-2)Tag identification. Must contain 'TAG' if tag exists and is correct.
B30(3-32)Title
C30(33-62)Artist
D30(63-92)Album
E4(93-96)Year
F30(97-126)Comment
G1(127)Genre

В структуре ID3v1.1 есть маленький нюанс.  Последний байт поля Comment может быть использован как номер трека в альбоме. Если номер неизвестен, то должен содержать hex 00.

Tags: perl