
<?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;
	}
}
?>
