Читаем 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 до я а то русские буквы вырезаются!
Просмотров: 11820
Страхование КАСКО
карта банка
ндфл
усн
Оформление доверенности
страхование ипотеки
esim
осаго
ВЗР страхование
кредитная карта
Cialis barato Viagra Contrareembolso Cialis 5 mg precio mejores farmacias para comprar Viagra reacciones adversas de Cialis Reduslim cómo tomar soluciones para la impotencia Sildenafil Comprare Cialis 5 mg Giornaliero online in Italia Effetti indesiderati del Cialis 5 mg Acquista Cialis 20mg Cialis originale in vendita In Svizzera si compra il Viagra senza ricetta Cialis 10mg online Acquista Viagra in farmacia Offerta Cialis 5mg Spedra Avanafil in vendita online Acquista Viagra in Svizzera senza prescrizione авиатор спрайб Consegna a domicilio di Cialis 5 mg Effetti collaterali di Cialis 5 mg Consegna a domicilio di Cialis 20mg Acquista Cialis originale generico in Svizzera Consegna a domicilio di Viagra senza ricetta in Svizzera Compra Cialis 10mg Consegna a domicilio di Viagra in farmacia online Sconto Cialis 5mg Comprar Reduslim por internet Comprare Spedra Avanafil senza ricetta online Dove comprare il Viagra in Svizzera Compra Cialis Comprar online Viagra Contrareembolso Dónde encontrar Cialis 5 mg al mejor precio Viagra sin receta Cialis 5 mg efectos secundarios graves Reduslim comprar en línea Disfuncion Erectil tadalafilo avanafil prezzo cialis 20 mg prezzo cialis effetti benefici cialis 10 mg Reduslim Kaufen pulse x coin price