Быстро и без модулей читаем 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. На всякий случай:
Sign | Length (bytes) | Position (bytes) | Description |
A | 3 | (0-2) | Tag identification. Must contain 'TAG' if tag exists and is correct. |
B | 30 | (3-32) | Title |
C | 30 | (33-62) | Artist |
D | 30 | (63-92) | Album |
E | 4 | (93-96) | Year |
F | 30 | (97-126) | Comment |
G | 1 | (127) | Genre |
В структуре ID3v1.1 есть маленький нюанс. Последний байт поля Comment может быть использован как номер трека в альбоме. Если номер неизвестен, то должен содержать hex 00.