ID3 functies voor MP3tjes
Auteur: CelestialCelebi - 02 september 2004 - 22:28 - Gekeurd door: Dennisvb - Hits: 6715 - Aantal punten: 3.70 (5 stemmen)
Nou, je kent MP3tjes wel, hoop ik?
Daar kunnen, aan het eind van het bestand, 128 bytes extra in, om informatie op te slaan over de artiest, de naam van het liedje, etc. http://www.id3.org/ (staat nu ID3 v2.2 ofzo, de nieuwere)
En ik heb daar, met een beetje afkijken van dit script: http://rasher.dk/source/mp3/id3.php Een stel functies voor gemaakt, zodat je ook in PHP die tags kunt lezen / schrijven en verwijderen.
Best logische aanroep:
set: De bestandsnaam en een array met daarin de tags. De keys voor de naam ervan, de value voor de waarde. De key kan bestaan uit de volgende strings:
sTitle = Titel van het liedje.
sArtist = Degene die het liedje heeft gemaakt.
sAlbum = Het album waar het liedje vandaan komt.
sComment = Een stukje commentaar over de MP3.
iYear = Het jaar waarin het nummer is gemaakt.
iGenreID = Het nummer van het genre (komt misschien nog een functie voor).
iTrackNumber = Het nummer op de CD. Hoeft niet persé meegegeven te worden.
Voorbeeld:
<?php
if(mp3_set_id3_v1('bestand.mp3', array('sTitle' => 'Bakske Vol Met Stro', 'sArtist' => 'Urbanus', 'iYear' => 1995, 'sAlbum' => 'N/A', 'sComment' => 'Keivet liedje.', 'iGenreID' => 2))
{
// het is gelukt, YES
}
else
{
// het is niet gelukt, NO
}
?>
Nu zal het een ID3 V1 tag worden, omdat de track niet wordt meegegeven.
<?php
if(mp3_set_id3_v1('bestand.mp3', array('sTitle' => 'Bakske Vol Met Stro', 'sArtist' => 'Urbanus', 'iYear' => 1995, 'sAlbum' => 'N/A', 'sComment' => 'Keivet liedje.', 'iGenreID' => 2, 'iTrackNumber' => 4))
{
// het is gelukt, YES
}
else
{
// het is niet gelukt, NO
}
?>
Nu wordt het een ID3 V1.1 tag, omdat ook de tracknumber wordt meegegeven.
Check je MP3 nu in WinAmp en je ziet het: De tags zijn geschreven.
get: De bestandsnaam, niks meer. Je krijgt de array met daarin de info terug als het is gelukt, anders false en een error.
<?php
if($aX = mp3_get_id3_v1('mp3.mp3'))
{
echo $aX['sArtist'] . ' - ' . $aX['sTitle'];
}
else
{
echo 'Bestand bevat geen ID3 tag.';
}
?>
unset: De bestandsnaam. Je krijgt true terug als de tag is verwijderd, anders false + een warning.
<?php
if(mp3_unset_id3_v1('x.mp3'))
{
// tag verwijderd, YES
}
else
{
// tag niet verwijderd, NO
}
?>
Natuurlijk kan de manier waarop ik errors maak beter, maar dit is maar een alpha, dus eh..... Dat verandert nog wel.
Nogmaals: Ik heb een paar dingetjes uit die class gehaald, dus ik neem niet de volledige eer voor dit script op me.
|
Code: |
<?php
function mp3_set_id3_v1($sFilename, $aTag)
{
if(!file_exists($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' doesn\'t exist';
$iErrorCode = E_USER_WARNING;
}
elseif(!is_readable($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' is not readable';
$iErrorCode = E_USER_WARNING;
}
elseif(!is_writable($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' is not writable';
$iErrorCode = E_USER_WARNING;
}
else
{
if(isset($aTag['iTrackNumber']))
{
$sID3V1Tag = pack('a3a30a30a30a4a28x1C1C1', 'TAG', @$aTag['sTitle'], @$aTag['sArtist'], @$aTag['sAlbum'], @$aTag['iYear'], @$aTag['sComment'], @$aTag['iTrackNumber'], @$aTag['iGenreID']);
}
else
{
$sID3V1Tag = pack('a3a30a30a30a4a30C1', 'TAG', @$aTag['sTitle'], @$aTag['sArtist'], @$aTag['sAlbum'], @$aTag['iYear'], @$aTag['sComment'], @$aTag['iGenreID']);
}
mp3_unset_id3_v1($sFilename);
$rOpenFile = fopen($sFilename, 'ab');
flock($rOpenFile, LOCK_EX);
fwrite($rOpenFile, $sID3V1Tag);
flock($rOpenFile, LOCK_UN);
fclose($rOpenFile);
return true;
}
trigger_error($sError, $iErrorCode);
return false;
}
function mp3_get_id3_v1($sFilename)
{
if(!file_exists($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' doesn\'t exist';
$iErrorCode = E_USER_WARNING;
}
elseif(!$rOpenFile = fopen($sFilename, 'rb'))
{
$sError = 'Can\'t open file ' . htmlspecialchars($sFilename) . ' for reading';
$iErrorCode = E_USER_WARNING;
}
else
{
fseek($rOpenFile, -128, SEEK_END);
$sID3V1Tag = fread($rOpenFile, 128);
fclose($rOpenFile);
if(substr($sID3V1Tag, 0, 3) == 'TAG')
{
$aID3V1Tag = unpack('a3sTag/a30sTitle/a30sArtist/a30sAlbum/a4iYear/A30sComment/C1iGenreID', $sID3V1Tag);
unset($aID3V1Tag['sTag']);
if(substr($aID3V1Tag['sComment'], -2, 1) == chr(0))
{
$aID3V1Tag = array_merge($aID3V1Tag, unpack('a28sComment/A1sNothing/C1iTrackNumber', $aID3V1Tag['sComment']));
unset($aID3V1Tag['sNothing']);
}
return $aID3V1Tag;
}
else
{
return false;
}
}
trigger_error($sError, $iErrorCode);
return false;
}
function mp3_unset_id3_v1($sFilename)
{
if(!file_exists($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' doesn\'t exist';
$iErrorCode = E_USER_WARNING;
}
elseif(!is_readable($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' is not readable';
$iErrorCode = E_USER_WARNING;
}
elseif(!is_writable($sFilename))
{
$sError = 'File ' . htmlspecialchars($sFilename) . ' is not writable';
$iErrorCode = E_USER_WARNING;
}
else
{
$rOpenFile = fopen($sFilename, 'r+b');
fseek($rOpenFile, -128, SEEK_END);
$sID3V1Tag = fread($rOpenFile, 128);
if(substr($sID3V1Tag, 0, 3) == 'TAG')
{
rewind($rOpenFile);
$rOpenFile2 = fopen($sFilename, 'w+b');
flock($rOpenFile2, LOCK_EX);
fwrite($rOpenFile2, fread($rOpenFile, (filesize($sFilename) - 128)));
flock($rOpenFile2, LOCK_UN);
fclose($rOpenFile);
fclose($rOpenFile2);
}
return true;
}
trigger_error($sError, $iErrorCode);
return false;
}
function mp3_get_id3_v2($sFilename)
{
$rOpenFile = fopen($sFilename, 'r+b');
$sID3V2Header = fread($rOpenFile, 10);
if(substr($sID3V2Header, 0, 3) == 'ID3')
{
$aID3V2Header = unpack('a3sTag/C1iMajorVersion/C1iRevision/C1sFlags/H8iSize', $sID3V2Header);
// ga hier verder, maar nu eerst verder met mp3_set_id3_v2()... :-)
}
else
{
return false;
}
}
?>
<?php function mp3_set_id3_v1($sFilename, $aTag) { { $iErrorCode = E_USER_WARNING; } elseif(!is_readable($sFilename)) { $sError = 'File ' . htmlspecialchars($sFilename) . ' is not readable '; $iErrorCode = E_USER_WARNING; } elseif(!is_writable($sFilename)) { $sError = 'File ' . htmlspecialchars($sFilename) . ' is not writable '; $iErrorCode = E_USER_WARNING; } else { if(isset($aTag['iTrackNumber'])) { $sID3V1Tag = pack('a3a30a30a30a4a28x1C1C1', 'TAG', @$aTag['sTitle'], @$aTag['sArtist'], @$aTag['sAlbum'], @$aTag['iYear'], @$aTag['sComment'], @$aTag['iTrackNumber'], @$aTag['iGenreID']); } else { $sID3V1Tag = pack('a3a30a30a30a4a30C1', 'TAG', @$aTag['sTitle'], @$aTag['sArtist'], @$aTag['sAlbum'], @$aTag['iYear'], @$aTag['sComment'], @$aTag['iGenreID']); } mp3_unset_id3_v1($sFilename); $rOpenFile = fopen($sFilename, 'ab'); flock($rOpenFile, LOCK_EX); fwrite($rOpenFile, $sID3V1Tag); flock($rOpenFile, LOCK_UN); fclose($rOpenFile); return true; } trigger_error($sError, $iErrorCode); return false; } function mp3_get_id3_v1($sFilename) { if(!file_exists($sFilename)) { $sError = 'File ' . htmlspecialchars($sFilename) . ' doesn\ 't exist'; $iErrorCode = E_USER_WARNING; } elseif(!$rOpenFile = fopen($sFilename, 'rb')) { $sError = 'Can\'t open file ' . htmlspecialchars($sFilename) . ' for reading '; $iErrorCode = E_USER_WARNING; } else { fseek($rOpenFile, -128, SEEK_END); $sID3V1Tag = fread($rOpenFile, 128); fclose($rOpenFile); if(substr($sID3V1Tag, 0, 3) == 'TAG') { $aID3V1Tag = unpack('a3sTag/a30sTitle/a30sArtist/a30sAlbum/a4iYear/A30sComment/C1iGenreID', $sID3V1Tag); unset($aID3V1Tag['sTag']); if(substr($aID3V1Tag['sComment'], -2, 1) == chr(0)) { $aID3V1Tag = array_merge($aID3V1Tag, unpack('a28sComment/A1sNothing/C1iTrackNumber', $aID3V1Tag['sComment'])); unset($aID3V1Tag['sNothing']); } return $aID3V1Tag; } else { return false; } } trigger_error($sError, $iErrorCode); return false; } function mp3_unset_id3_v1($sFilename) { if(!file_exists($sFilename)) { $sError = 'File ' . htmlspecialchars($sFilename) . ' doesn\ 't exist'; $iErrorCode = E_USER_WARNING; } { $iErrorCode = E_USER_WARNING; } { $iErrorCode = E_USER_WARNING; } else { $rOpenFile = fopen($sFilename, 'r+b'); fseek($rOpenFile, -128, SEEK_END ); $sID3V1Tag = fread($rOpenFile, 128); if(substr($sID3V1Tag, 0, 3) == 'TAG') { $rOpenFile2 = fopen($sFilename, 'w+b'); flock($rOpenFile2, LOCK_EX ); flock($rOpenFile2, LOCK_UN ); } return true; } return false; } function mp3_get_id3_v2($sFilename) { $rOpenFile = fopen($sFilename, 'r+b'); $sID3V2Header = fread($rOpenFile, 10); if(substr($sID3V2Header, 0, 3) == 'ID3') { $aID3V2Header = unpack('a3sTag/C1iMajorVersion/C1iRevision/C1sFlags/H8iSize', $sID3V2Header); // ga hier verder, maar nu eerst verder met mp3_set_id3_v2()... :-) } else { return false; } } ?>
Download code (.txt)
|
|
Stemmen |
Niet ingelogd. |
|