Войти Регистрация

Читаем ID3 теги mp3 с помощью PHP


Читаем id3 на PHPСегодня мы будем работать с PHP. А конкретнее, мы сможем реализовать чтение ID3 мета тегов из музыкальных файлов (mp3). Вы сможете протестировать скрипт чтения id3 тегов, на собственных mp3 файлах. Мы будем извлекать следующую информацию из ID3 тегов: Title, Album, Author, Discription, Genre, Publisher, OriginalArtist, URL и так далее.

Шаг 1 – HTML

Как всегда, мы начнем с создания HTML образа приложения, а позже перейдем к самому PHP извлечению id3 тегов. Создайте файл main_page.html и поместите туда следующий код:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

    <title>ID3 Tags Reader with PHP | Script-tutorials</title>

    <link rel="stylesheet" href="main.css" type="text/css" media="all" />

</head>

<body>

    <div class="example" id="main">

        <table style="width:100%">

            <thead>

                <td><b>Title</b></td>

                <td><b>Album</b></td>

                <td><b>Author</b></td>

                <td><b>AlbumAuthor</b></td>

                <td><b>Track</b></td>

                <td><b>Year</b></td>

                <td><b>Lenght</b></td>

                <td><b>Lyric</b></td>

                <td><b>Desc</b></td>

                <td><b>Genre</b></td>

            </thead>

            __list__

        </table>

 

        <hr /><h3>Extra info</h3>

        <table style="width:100%">

            <thead>

                <td><b>Title</b></td>

                <td><b>Encoded</b></td>

                <td><b>Copyright</b></td>

                <td><b>Publisher</b></td>

                <td><b>OriginalArtist</b></td>

                <td><b>URL</b></td>

                <td><b>Comments</b></td>

                <td><b>Composer</b></td>

            </thead>

            __list2__

        </table>

 

    </div>

</body>

</html>

Я подготовил 2 таблицы id3 тегов, так как в одну все не влазят.

Шаг 2 – CSS

Немножко приукрасим наше приложение CSS стилями. Создайте файл main.css:

body{background-color:#ddd;margin:0;padding:0}

.example{position:relative;background-color:#fff;width:980px;height:700px;border:1px #000 solid;margin:20px auto;padding:20px;-moz-border-radius:3px;-webkit-border-radius:3px}

Шаг 3 – PHP

Наконец, дошли к самой важной части скрипта – PHP. Создайте файл index.php, со следующим кодом:

<?php

// set error reporting level
if (version_compare(phpversion(), '5.3.0', '>=') == 1)
  error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
else
  error_reporting(E_ALL & ~E_NOTICE);

// gathering all mp3 files in 'mp3' folder into array
$sDir = 'mp3/';
$aFiles = array();
$rDir = opendir($sDir);
if ($rDir) {
    while ($sFile = readdir($rDir)) {
        if ($sFile == '.' or $sFile == '..' or !is_file($sDir . $sFile))
            continue;

        $aPathInfo = pathinfo($sFile);
        $sExt = strtolower($aPathInfo['extension']);
        if ($sExt == 'mp3') {
            $aFiles[] = $sDir . $sFile;
        }
    }
    closedir( $rDir );
}

// new object of our ID3TagsReader class
$oReader = new ID3TagsReader();

// passing through located files ..
$sList = $sList2 = '';
foreach ($aFiles as $sSingleFile) {
    $aTags = $oReader->getTagsInfo($sSingleFile); // obtaining ID3 tags info
    $sList .= '<tr><td>'.$aTags['Title'].'</td><td>'.$aTags['Album'].'</td><td>'.$aTags['Author'].'</td>
                    <td>'.$aTags['AlbumAuthor'].'</td><td>'.$aTags['Track'].'</td><td>'.$aTags['Year'].'</td>
                    <td>'.$aTags['Lenght'].'</td><td>'.$aTags['Lyric'].'</td><td>'.$aTags['Desc'].'</td>
                    <td>'.$aTags['Genre'].'</td></tr>';

    $sList2 .= '<tr><td>'.$aTags['Title'].'</td><td>'.$aTags['Encoded'].'</td><td>'.$aTags['Copyright'].'</td>
                    <td>'.$aTags['Publisher'].'</td><td>'.$aTags['OriginalArtist'].'</td><td>'.$aTags['URL'].'</td>
                    <td>'.$aTags['Comments'].'</td><td>'.$aTags['Composer'].'</td></tr>';
}

// main output
echo strtr(file_get_contents('main_page.html'), array('__list__' => $sList, '__list2__' => $sList2));

// class ID3TagsReader
class ID3TagsReader {

    // variables
    var $aTV23 = array( // array of possible sys tags (for last version of ID3)
        'TIT2',
        'TALB',
        'TPE1',
        'TPE2',
        'TRCK',
        'TYER',
        'TLEN',
        'USLT',
        'TPOS',
        'TCON',
        'TENC',
        'TCOP',
        'TPUB',
        'TOPE',
        'WXXX',
        'COMM',
        'TCOM'
    );
    var $aTV23t = array( // array of titles for sys tags
        'Title',
        'Album',
        'Author',
        'AlbumAuthor',
        'Track',
        'Year',
        'Lenght',
        'Lyric',
        'Desc',
        'Genre',
        'Encoded',
        'Copyright',
        'Publisher',
        'OriginalArtist',
        'URL',
        'Comments',
        'Composer'
    );
    var $aTV22 = array( // array of possible sys tags (for old version of ID3)
        'TT2',
        'TAL',
        'TP1',
        'TRK',
        'TYE',
        'TLE',
        'ULT'
    );
    var $aTV22t = array( // array of titles for sys tags
        'Title',
        'Album',
        'Author',
        'Track',
        'Year',
        'Lenght',
        'Lyric'
    );

    // constructor
    function ID3TagsReader() {}

    // functions
    function getTagsInfo($sFilepath) {
        // read source file
        $iFSize = filesize($sFilepath);
        $vFD = fopen($sFilepath,'r');
        $sSrc = fread($vFD,$iFSize);
        fclose($vFD);

        // obtain base info
        if (substr($sSrc,0,3) == 'ID3') {
            $aInfo['FileName'] = $sFilepath;
            $aInfo['Version'] = hexdec(bin2hex(substr($sSrc,3,1))).'.'.hexdec(bin2hex(substr($sSrc,4,1)));
        }

        // passing through possible tags of idv2 (v3 and v4)
        if ($aInfo['Version'] == '4.0' || $aInfo['Version'] == '3.0') {
            for ($i = 0; $i < count($this->aTV23); $i++) {
                if (strpos($sSrc, $this->aTV23[$i].chr(0)) != FALSE) {

                    $s = '';
                    $iPos = strpos($sSrc, $this->aTV23[$i].chr(0));
                    $iLen = hexdec(bin2hex(substr($sSrc,($iPos + 5),3)));

                    $data = substr($sSrc, $iPos, 9 + $iLen);
                    for ($a = 0; $a < strlen($data); $a++) {
                        $char = substr($data, $a, 1);
                        if ($char >= ' ' && $char <= '~')
                            $s .= $char;
                    }
                    if (substr($s, 0, 4) == $this->aTV23[$i]) {
                        $iSL = 4;
                        if ($this->aTV23[$i] == 'USLT') {
                            $iSL = 7;
                        } elseif ($this->aTV23[$i] == 'TALB') {
                            $iSL = 5;
                        } elseif ($this->aTV23[$i] == 'TENC') {
                            $iSL = 6;
                        }
                        $aInfo[$this->aTV23t[$i]] = substr($s, $iSL);
                    }
                }
            }
        }

        // passing through possible tags of idv2 (v2)
        if($aInfo['Version'] == '2.0') {
            for ($i = 0; $i < count($this->aTV22); $i++) {
                if (strpos($sSrc, $this->aTV22[$i].chr(0)) != FALSE) {

                    $s = '';
                    $iPos = strpos($sSrc, $this->aTV22[$i].chr(0));
                    $iLen = hexdec(bin2hex(substr($sSrc,($iPos + 3),3)));

                    $data = substr($sSrc, $iPos, 6 + $iLen);
                    for ($a = 0; $a < strlen($data); $a++) {
                        $char = substr($data, $a, 1);
                        if ($char >= ' ' && $char <= '~')
                            $s .= $char;
                    }

                    if (substr($s, 0, 3) == $this->aTV22[$i]) {
                        $iSL = 3;
                        if ($this->aTV22[$i] == 'ULT') {
                            $iSL = 6;
                        }
                        $aInfo[$this->aTV22t[$i]] = substr($s, $iSL);
                    }
                }
            }
        }
        return $aInfo;
    }
}

?>

После создания этих файлов, загрузите в папку скрипта mp3 файлы. Это все! Да, кода многовато, но он отлично работает. Смотрите скриншот работы id3 читалки тегов на PHP.

Пример чтения id3 тега на PHP

В первой части PHP скрипта, мы проводим листинг папок и ищем все mp3 файлы, пишем их в массив. Далее, мы вызываем класс ID3TagsReader, который будет читать hex код каждого из mp3 файлов, и получать информацию из id3 мета тегов. Я попытался включить в скрипт все id3 теги, которые были доступны у winamp. Но я не могу быть уверенным, что выбрал все необходимые теги.

И еще, если вы знаете, как можно реализовать чтение id3 тегов mp3, с помощью php, другим способом, напишите в комментариях. 



Дальше: Phar в PHP: преимущества и работа с PHAR


Дискуссия по теме     3 Комментария 
Добавить комментарий
Андрей 23.12.2013 в 19:33
Большое Спасибо!
Андрей 14.08.2013 в 16:01
Цитирую автора: Я попытался включить в скрипт все id3 теги, которые были доступны у winamp. Но я не могу быть уверенным, что выбрал все необходимые теги. // APIC - изображение альбома (cover)
ПАЦАН 09.10.2011 в 19:07
автору зачёт однозначно, мало где найдёшь такое! только работает на 50% правильно. $data = substr($sSrc, $iPos, 9 $iLen); надо не 9 а 10, а то один нужный символ с конца стабильно обрезается. насчёт $aInfo[$this->aTV23t[$i]] = substr($s, $iSL); тоже не правильно: после обрезки иногда остаются лишние стмволы вначале. я изменил код так, что для версии 3.0 и 4.0 $iSL всегда = 11, а для версии 2.0 $iSL всегда = 7 , лишних символов стало меньше, но всё равно кое где остались. цикл с вырезкой символов тоже лишний помоему, я его убрал. даже если оставить, нужно добавить символы от A до я а то русские буквы вырезаются!
Просмотров: 10016