diff --git a/demos/demo.audioinfo.class.php b/demos/demo.audioinfo.class.php
deleted file mode 100644
index dc12a1e..0000000
--- a/demos/demo.audioinfo.class.php
+++ /dev/null
@@ -1,316 +0,0 @@
-<?php
-
-// +----------------------------------------------------------------------+
-// | PHP version 4.1.0                                                    |
-// +----------------------------------------------------------------------+
-// | Placed in public domain by Allan Hansen, 2002. Share and enjoy!      |
-// +----------------------------------------------------------------------+
-// | /demo/demo.audioinfo.class.php                                       |
-// |                                                                      |
-// | Example wrapper class to extract information from audio files        |
-// | through getID3().                                                    |
-// |                                                                      |
-// | getID3() returns a lot of information. Much of this information is   |
-// | not needed for the end-application. It is also possible that some    |
-// | users want to extract specific info. Modifying getID3() files is a   |
-// | bad idea, as modifications needs to be done to future versions of    |
-// | getID3().                                                            |
-// |                                                                      |
-// | Modify this wrapper class instead. This example extracts certain     |
-// | fields only and adds a new root value - encoder_options if possible. |
-// | It also checks for mp3 files with wave headers.                      |
-// +----------------------------------------------------------------------+
-// | Example code:                                                        |
-// |   $au = new AudioInfo();                                             |
-// |   print_r($au->Info('file.flac');                                    |
-// +----------------------------------------------------------------------+
-// | Authors: Allan Hansen <ahØartemis*dk>                                |
-// +----------------------------------------------------------------------+
-//
-
-
-
-/**
-* getID3() settings
-*/
-
-require_once('../getid3/getid3.php');
-
-
-
-
-/**
-* Class for extracting information from audio files with getID3().
-*/
-
-class AudioInfo {
-
-	/**
-	* Private variables
-	*/
-	var $result = NULL;
-	var $info   = NULL;
-
-
-
-
-	/**
-	* Constructor
-	*/
-
-	function AudioInfo() {
-
-		// Initialize getID3 engine
-		$this->getID3 = new getID3;
-		$this->getID3->option_md5_data        = true;
-		$this->getID3->option_md5_data_source = true;
-		$this->getID3->encoding               = 'UTF-8';
-	}
-
-
-
-
-	/**
-	* Extract information - only public function
-	*
-	* @access   public
-	* @param    string  file    Audio file to extract info from.
-	*/
-
-	function Info($file) {
-
-		// Analyze file
-		$this->info = $this->getID3->analyze($file);
-
-		// Exit here on error
-		if (isset($this->info['error'])) {
-			return array ('error' => $this->info['error']);
-		}
-
-		// Init wrapper object
-		$this->result = array();
-		$this->result['format_name']     = (isset($this->info['fileformat']) ? $this->info['fileformat'] : '').'/'.(isset($this->info['audio']['dataformat']) ? $this->info['audio']['dataformat'] : '').(isset($this->info['video']['dataformat']) ? '/'.$this->info['video']['dataformat'] : '');
-		$this->result['encoder_version'] = (isset($this->info['audio']['encoder'])         ? $this->info['audio']['encoder']         : '');
-		$this->result['encoder_options'] = (isset($this->info['audio']['encoder_options']) ? $this->info['audio']['encoder_options'] : '');
-		$this->result['bitrate_mode']    = (isset($this->info['audio']['bitrate_mode'])    ? $this->info['audio']['bitrate_mode']    : '');
-		$this->result['channels']        = (isset($this->info['audio']['channels'])        ? $this->info['audio']['channels']        : '');
-		$this->result['sample_rate']     = (isset($this->info['audio']['sample_rate'])     ? $this->info['audio']['sample_rate']     : '');
-		$this->result['bits_per_sample'] = (isset($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : '');
-		$this->result['playing_time']    = (isset($this->info['playtime_seconds'])         ? $this->info['playtime_seconds']         : '');
-		$this->result['avg_bit_rate']    = (isset($this->info['audio']['bitrate'])         ? $this->info['audio']['bitrate']         : '');
-		$this->result['tags']            = (isset($this->info['tags'])                     ? $this->info['tags']                     : '');
-		$this->result['comments']        = (isset($this->info['comments'])                 ? $this->info['comments']                 : '');
-		$this->result['warning']         = (isset($this->info['warning'])                  ? $this->info['warning']                  : '');
-		$this->result['md5']             = (isset($this->info['md5_data'])                 ? $this->info['md5_data']                 : '');
-
-		// Post getID3() data handling based on file format
-		$method = (isset($this->info['fileformat']) ? $this->info['fileformat'] : '').'Info';
-		if ($method && method_exists($this, $method)) {
-			$this->$method();
-		}
-
-		return $this->result;
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for AAC files.
-	*
-	* @access   private
-	*/
-
-	function aacInfo() {
-		$this->result['format_name']     = 'AAC';
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for Wave files.
-	*
-	* @access   private
-	*/
-
-	function riffInfo() {
-		if ($this->info['audio']['dataformat'] == 'wav') {
-
-			$this->result['format_name'] = 'Wave';
-
-		} elseif (preg_match('#^mp[1-3]$#', $this->info['audio']['dataformat'])) {
-
-			$this->result['format_name'] = strtoupper($this->info['audio']['dataformat']);
-
-		} else {
-
-			$this->result['format_name'] = 'riff/'.$this->info['audio']['dataformat'];
-
-		}
-	}
-
-
-
-
-	/**
-	* * post-getID3() data handling for FLAC files.
-	*
-	* @access   private
-	*/
-
-	function flacInfo() {
-		$this->result['format_name']     = 'FLAC';
-	}
-
-
-
-
-
-	/**
-	* post-getID3() data handling for Monkey's Audio files.
-	*
-	* @access   private
-	*/
-
-	function macInfo() {
-		$this->result['format_name']     = 'Monkey\'s Audio';
-	}
-
-
-
-
-
-	/**
-	* post-getID3() data handling for Lossless Audio files.
-	*
-	* @access   private
-	*/
-
-	function laInfo() {
-		$this->result['format_name']     = 'La';
-	}
-
-
-
-
-
-	/**
-	* post-getID3() data handling for Ogg Vorbis files.
-	*
-	* @access   private
-	*/
-
-	function oggInfo() {
-		if ($this->info['audio']['dataformat'] == 'vorbis') {
-
-			$this->result['format_name']     = 'Ogg Vorbis';
-
-		} else if ($this->info['audio']['dataformat'] == 'flac') {
-
-			$this->result['format_name'] = 'Ogg FLAC';
-
-		} else if ($this->info['audio']['dataformat'] == 'speex') {
-
-			$this->result['format_name'] = 'Ogg Speex';
-
-		} else {
-
-			$this->result['format_name'] = 'Ogg '.$this->info['audio']['dataformat'];
-
-		}
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for Musepack files.
-	*
-	* @access   private
-	*/
-
-	function mpcInfo() {
-		$this->result['format_name']     = 'Musepack';
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for MPEG files.
-	*
-	* @access   private
-	*/
-
-	function mp3Info() {
-		$this->result['format_name']     = 'MP3';
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for MPEG files.
-	*
-	* @access   private
-	*/
-
-	function mp2Info() {
-		$this->result['format_name']     = 'MP2';
-	}
-
-
-
-
-
-	/**
-	* post-getID3() data handling for MPEG files.
-	*
-	* @access   private
-	*/
-
-	function mp1Info() {
-		$this->result['format_name']     = 'MP1';
-	}
-
-
-
-
-	/**
-	* post-getID3() data handling for WMA files.
-	*
-	* @access   private
-	*/
-
-	function asfInfo() {
-		$this->result['format_name']     = strtoupper($this->info['audio']['dataformat']);
-	}
-
-
-
-	/**
-	* post-getID3() data handling for Real files.
-	*
-	* @access   private
-	*/
-
-	function realInfo() {
-		$this->result['format_name']     = 'Real';
-	}
-
-
-
-
-
-	/**
-	* post-getID3() data handling for VQF files.
-	*
-	* @access   private
-	*/
-
-	function vqfInfo() {
-		$this->result['format_name']     = 'VQF';
-	}
-
-}
diff --git a/demos/demo.basic.php b/demos/demo.basic.php
deleted file mode 100644
index 3ba44ce..0000000
--- a/demos/demo.basic.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.basic.php - part of getID3()                     //
-// Sample script showing most basic use of getID3()            //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-
-// include getID3() library (can be in a different directory if full path is specified)
-require_once('../getid3/getid3.php');
-
-// Initialize getID3 engine
-$getID3 = new getID3;
-
-// Analyze file and store returned data in $ThisFileInfo
-$ThisFileInfo = $getID3->analyze($filename);
-
-/*
- Optional: copies data from all subarrays of [tags] into [comments] so
- metadata is all available in one location for all tag formats
- metainformation is always available under [tags] even if this is not called
-*/
-getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-/*
- Output desired information in whatever format you want
- Note: all entries in [comments] or [tags] are arrays of strings
- See structure.txt for information on what information is available where
- or check out the output of /demos/demo.browse.php for a particular file
- to see the full detail of what information is returned where in the array
- Note: all array keys may not always exist, you may want to check with isset()
- or empty() before deciding what to output
-*/
-
-//echo $ThisFileInfo['comments_html']['artist'][0]; // artist from any/all available tag formats
-//echo $ThisFileInfo['tags']['id3v2']['title'][0];  // title from ID3v2
-//echo $ThisFileInfo['audio']['bitrate'];           // audio bitrate
-//echo $ThisFileInfo['playtime_string'];            // playtime in minutes:seconds, formatted string
-
-/*
- if you want to see ALL the output, uncomment this line:
-*/
-//echo '<pre>'.htmlentities(print_r($ThisFileInfo, true)).'</pre>';
diff --git a/demos/demo.browse.php b/demos/demo.browse.php
deleted file mode 100644
index 65be568..0000000
--- a/demos/demo.browse.php
+++ /dev/null
@@ -1,611 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.browse.php - part of getID3()                     //
-// Sample script for browsing/scanning files and displaying    //
-// information returned by getID3()                            //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('For security reasons, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in demos/'.basename(__FILE__));
-define('GETID3_DEMO_BROWSE_ALLOW_EDIT_LINK',   false);
-define('GETID3_DEMO_BROWSE_ALLOW_DELETE_LINK', false);
-define('GETID3_DEMO_BROWSE_ALLOW_MD5_LINK',    false);
-
-/////////////////////////////////////////////////////////////////
-// die if magic_quotes_runtime or magic_quotes_gpc are set
-if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) {
-	die('magic_quotes_runtime is enabled, getID3 will not run.');
-}
-if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
-	die('magic_quotes_gpc is enabled, getID3 will not run.');
-}
-if (!defined('ENT_SUBSTITUTE')) { // defined in PHP v5.4.0
-	define('ENT_SUBSTITUTE', ENT_QUOTES);
-}
-/////////////////////////////////////////////////////////////////
-
-$PageEncoding = 'UTF-8';
-
-$writescriptfilename = 'demo.write.php';
-
-require_once('../getid3/getid3.php');
-
-// Needed for windows only. Leave commented-out to auto-detect, only define here if auto-detection does not work properly
-//define('GETID3_HELPERAPPSDIR', 'C:\\helperapps\\');
-
-// Initialize getID3 engine
-$getID3 = new getID3;
-$getID3->setOption(array('encoding' => $PageEncoding));
-
-$getID3checkColor_Head           = 'CCCCDD';
-$getID3checkColor_DirectoryLight = 'FFCCCC';
-$getID3checkColor_DirectoryDark  = 'EEBBBB';
-$getID3checkColor_FileLight      = 'EEEEEE';
-$getID3checkColor_FileDark       = 'DDDDDD';
-$getID3checkColor_UnknownLight   = 'CCCCFF';
-$getID3checkColor_UnknownDark    = 'BBBBDD';
-
-
-///////////////////////////////////////////////////////////////////////////////
-
-
-header('Content-Type: text/html; charset='.$PageEncoding);
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
-echo '<html><head>';
-echo '<title>getID3() - /demo/demo.browse.php (sample script)</title>';
-echo '<link rel="stylesheet" href="getid3.css" type="text/css">';
-echo '<meta http-equiv="Content-Type" content="text/html;charset='.$PageEncoding.'" />';
-echo '</head><body>';
-
-if (isset($_REQUEST['deletefile'])) {
-	if (file_exists($_REQUEST['deletefile'])) {
-		if (unlink($_REQUEST['deletefile'])) {
-			$deletefilemessage = 'Successfully deleted '.addslashes($_REQUEST['deletefile']);
-		} else {
-			$deletefilemessage = 'FAILED to delete '.addslashes($_REQUEST['deletefile']).' - error deleting file';
-		}
-	} else {
-		$deletefilemessage = 'FAILED to delete '.addslashes($_REQUEST['deletefile']).' - file does not exist';
-	}
-	if (isset($_REQUEST['noalert'])) {
-		echo '<b><font color="'.(($deletefilemessage{0} == 'F') ? '#FF0000' : '#008000').'">'.$deletefilemessage.'</font></b><hr>';
-	} else {
-		echo '<script type="text/javascript">alert("'.$deletefilemessage.'");</script>';
-	}
-}
-
-
-if (isset($_REQUEST['filename'])) {
-
-	if (!file_exists($_REQUEST['filename']) || !is_file($_REQUEST['filename'])) {
-		die(getid3_lib::iconv_fallback('ISO-8859-1', $PageEncoding, $_REQUEST['filename'].' does not exist'));
-	}
-	$starttime = microtime(true);
-
-	//$getID3->setOption(array(
-	//	'option_md5_data'  => $AutoGetHashes,
-	//	'option_sha1_data' => $AutoGetHashes,
-	//));
-	$ThisFileInfo = $getID3->analyze($_REQUEST['filename']);
-	$AutoGetHashes = (bool) (isset($ThisFileInfo['filesize']) && ($ThisFileInfo['filesize'] > 0) && ($ThisFileInfo['filesize'] < (50 * 1048576))); // auto-get md5_data, md5_file, sha1_data, sha1_file if filesize < 50MB, and NOT zero (which may indicate a file>2GB)
-	$AutoGetHashes = ($AutoGetHashes && GETID3_DEMO_BROWSE_ALLOW_MD5_LINK);
-	if ($AutoGetHashes) {
-		$ThisFileInfo['md5_file']  = md5_file($_REQUEST['filename']);
-		$ThisFileInfo['sha1_file'] = sha1_file($_REQUEST['filename']);
-	}
-
-
-	getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-	$listdirectory = dirname($_REQUEST['filename']);
-	$listdirectory = realpath($listdirectory); // get rid of /../../ references
-
-	if (GETID3_OS_ISWINDOWS) {
-		// this mostly just gives a consistant look to Windows and *nix filesystems
-		// (windows uses \ as directory seperator, *nix uses /)
-		$listdirectory = str_replace(DIRECTORY_SEPARATOR, '/', $listdirectory.'/');
-	}
-
-	if (strstr($_REQUEST['filename'], 'http://') || strstr($_REQUEST['filename'], 'ftp://')) {
-		echo '<i>Cannot browse remote filesystems</i><br>';
-	} else {
-		echo 'Browse: <a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">'.getid3_lib::iconv_fallback('ISO-8859-1', $PageEncoding, $listdirectory).'</a><br>';
-	}
-
-	getid3_lib::ksort_recursive($ThisFileInfo);
-	echo table_var_dump($ThisFileInfo, false, $PageEncoding);
-	$endtime = microtime(true);
-	echo 'File parsed in '.number_format($endtime - $starttime, 3).' seconds.<br>';
-
-} else {
-
-	$listdirectory = (isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.');
-	$listdirectory = realpath($listdirectory); // get rid of /../../ references
-	$currentfulldir = $listdirectory.'/';
-
-	if (GETID3_OS_ISWINDOWS) {
-		// this mostly just gives a consistant look to Windows and *nix filesystems
-		// (windows uses \ as directory seperator, *nix uses /)
-		$currentfulldir = str_replace(DIRECTORY_SEPARATOR, '/', $listdirectory.'/');
-	}
-
-	ob_start();
-	if ($handle = opendir($listdirectory)) {
-
-		ob_end_clean();
-		echo str_repeat(' ', 300); // IE buffers the first 300 or so chars, making this progressive display useless - fill the buffer with spaces
-		echo 'Processing';
-
-		$starttime = microtime(true);
-
-		$TotalScannedUnknownFiles  = 0;
-		$TotalScannedKnownFiles    = 0;
-		$TotalScannedPlaytimeFiles = 0;
-		$TotalScannedBitrateFiles  = 0;
-		$TotalScannedFilesize      = 0;
-		$TotalScannedPlaytime      = 0;
-		$TotalScannedBitrate       = 0;
-		$FilesWithWarnings         = 0;
-		$FilesWithErrors           = 0;
-
-		while ($file = readdir($handle)) {
-			$currentfilename = $listdirectory.'/'.$file;
-			set_time_limit(30); // allocate another 30 seconds to process this file - should go much quicker than this unless intense processing (like bitrate histogram analysis) is enabled
-			echo ' .'; // progress indicator dot
-			flush();  // make sure the dot is shown, otherwise it's useless
-
-			switch ($file) {
-				case '..':
-					$ParentDir = realpath($file.'/..').'/';
-					if (GETID3_OS_ISWINDOWS) {
-						$ParentDir = str_replace(DIRECTORY_SEPARATOR, '/', $ParentDir);
-					}
-					$DirectoryContents[$currentfulldir]['dir'][$file]['filename'] = $ParentDir;
-					continue 2;
-					break;
-
-				case '.':
-					// ignore
-					continue 2;
-					break;
-			}
-			// symbolic-link-resolution enhancements by davidbullock״ech-center*com
-			$TargetObject     = realpath($currentfilename);  // Find actual file path, resolve if it's a symbolic link
-			$TargetObjectType = filetype($TargetObject);     // Check file type without examining extension
-
-			if ($TargetObjectType == 'dir') {
-
-				$DirectoryContents[$currentfulldir]['dir'][$file]['filename'] = $file;
-
-			} elseif ($TargetObjectType == 'file') {
-
-				$getID3->setOption(array('option_md5_data' => (isset($_REQUEST['ShowMD5']) && GETID3_DEMO_BROWSE_ALLOW_MD5_LINK)));
-				$fileinformation = $getID3->analyze($currentfilename);
-
-				getid3_lib::CopyTagsToComments($fileinformation);
-
-				$TotalScannedFilesize += (isset($fileinformation['filesize']) ? $fileinformation['filesize'] : 0);
-
-				if (isset($_REQUEST['ShowMD5']) && GETID3_DEMO_BROWSE_ALLOW_MD5_LINK) {
-					$fileinformation['md5_file'] = md5_file($currentfilename);
-				}
-
-				if (!empty($fileinformation['fileformat'])) {
-					$DirectoryContents[$currentfulldir]['known'][$file] = $fileinformation;
-					$TotalScannedPlaytime += (isset($fileinformation['playtime_seconds']) ? $fileinformation['playtime_seconds'] : 0);
-					$TotalScannedBitrate  += (isset($fileinformation['bitrate'])          ? $fileinformation['bitrate']          : 0);
-					$TotalScannedKnownFiles++;
-				} else {
-					$DirectoryContents[$currentfulldir]['other'][$file] = $fileinformation;
-					$DirectoryContents[$currentfulldir]['other'][$file]['playtime_string'] = '-';
-					$TotalScannedUnknownFiles++;
-				}
-				if (isset($fileinformation['playtime_seconds']) && ($fileinformation['playtime_seconds'] > 0)) {
-					$TotalScannedPlaytimeFiles++;
-				}
-				if (isset($fileinformation['bitrate']) && ($fileinformation['bitrate'] > 0)) {
-					$TotalScannedBitrateFiles++;
-				}
-			}
-		}
-		$endtime = microtime(true);
-		closedir($handle);
-		echo 'done<br>';
-		echo 'Directory scanned in '.number_format($endtime - $starttime, 2).' seconds.<br>';
-		flush();
-
-		$columnsintable = 14;
-		echo '<table class="table" cellspacing="0" cellpadding="3">';
-
-		echo '<tr bgcolor="#'.$getID3checkColor_Head.'"><th colspan="'.$columnsintable.'">Files in '.getid3_lib::iconv_fallback('ISO-8859-1', $PageEncoding, $currentfulldir).'</th></tr>';
-		$rowcounter = 0;
-		foreach ($DirectoryContents as $dirname => $val) {
-			if (isset($DirectoryContents[$dirname]['dir']) && is_array($DirectoryContents[$dirname]['dir'])) {
-				uksort($DirectoryContents[$dirname]['dir'], 'MoreNaturalSort');
-				foreach ($DirectoryContents[$dirname]['dir'] as $filename => $fileinfo) {
-					echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_DirectoryLight : $getID3checkColor_DirectoryDark).'">';
-					if ($filename == '..') {
-						echo '<td colspan="'.$columnsintable.'">';
-						echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" method="get">';
-						echo 'Parent directory: ';
-						echo '<input type="text" name="listdirectory" size="50" style="background-color: '.$getID3checkColor_DirectoryDark.';" value="';
-						if (GETID3_OS_ISWINDOWS) {
-							echo htmlentities(str_replace(DIRECTORY_SEPARATOR, '/', realpath($dirname.$filename)), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding);
-						} else {
-							echo htmlentities(realpath($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding);
-						}
-						echo '"> <input type="submit" value="Go">';
-						echo '</form></td>';
-					} else {
-						$escaped_filename = htmlentities($filename, ENT_SUBSTITUTE, $PageEncoding); // do filesystems always return filenames in ISO-8859-1?
-						$escaped_filename = ($escaped_filename ? $escaped_filename : rawurlencode($filename));
-						echo '<td colspan="'.$columnsintable.'"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'"><b>'.$escaped_filename.'</b></a></td>';
-					}
-					echo '</tr>';
-				}
-			}
-
-			echo '<tr bgcolor="#'.$getID3checkColor_Head.'">';
-			echo '<th>Filename</th>';
-			echo '<th>File Size</th>';
-			echo '<th>Format</th>';
-			echo '<th>Playtime</th>';
-			echo '<th>Bitrate</th>';
-			echo '<th>Artist</th>';
-			echo '<th>Title</th>';
-			if (isset($_REQUEST['ShowMD5']) && GETID3_DEMO_BROWSE_ALLOW_MD5_LINK) {
-				echo '<th>MD5&nbsp;File (File) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">disable</a>)</th>';
-				echo '<th>MD5&nbsp;Data (File) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">disable</a>)</th>';
-				echo '<th>MD5&nbsp;Data (Source) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">disable</a>)</th>';
-			} else {
-				echo '<th colspan="3">MD5&nbsp;Data'.(GETID3_DEMO_BROWSE_ALLOW_MD5_LINK ?' (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.').'&ShowMD5=1', ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">enable</a>)' : '').'</th>';
-			}
-			echo '<th>Tags</th>';
-			echo '<th>Errors &amp; Warnings</th>';
-			echo (GETID3_DEMO_BROWSE_ALLOW_EDIT_LINK   ? '<th>Edit</th>'   : '');
-			echo (GETID3_DEMO_BROWSE_ALLOW_DELETE_LINK ? '<th>Delete</th>' : '');
-			echo '</tr>';
-
-			if (isset($DirectoryContents[$dirname]['known']) && is_array($DirectoryContents[$dirname]['known'])) {
-				uksort($DirectoryContents[$dirname]['known'], 'MoreNaturalSort');
-				foreach ($DirectoryContents[$dirname]['known'] as $filename => $fileinfo) {
-					echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_FileDark : $getID3checkColor_FileLight).'">';
-					$escaped_filename = htmlentities($filename, ENT_SUBSTITUTE, $PageEncoding);
-					$escaped_filename = ($escaped_filename ? $escaped_filename : rawurlencode($filename));
-					echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filename='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" title="View detailed analysis">'.$escaped_filename.'</a></td>';
-					echo '<td align="right">&nbsp;'.number_format($fileinfo['filesize']).'</td>';
-					echo '<td align="right">&nbsp;'.NiceDisplayFiletypeFormat($fileinfo).'</td>';
-					echo '<td align="right">&nbsp;'.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').'</td>';
-					echo '<td align="right">&nbsp;'.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000, 0, ((isset($fileinfo['audio']['bitrate_mode']) && ($fileinfo['audio']['bitrate_mode'] == 'vbr')) ? true : false)) : '-').'</td>';
-					echo '<td align="left">&nbsp;'.(isset($fileinfo['comments_html']['artist']) ? implode('<br>', $fileinfo['comments_html']['artist']) : ((isset($fileinfo['video']['resolution_x']) && isset($fileinfo['video']['resolution_y'])) ? $fileinfo['video']['resolution_x'].'x'.$fileinfo['video']['resolution_y'] : '')).'</td>';
-					echo '<td align="left">&nbsp;'.(isset($fileinfo['comments_html']['title'])  ? implode('<br>', $fileinfo['comments_html']['title'])  :  (isset($fileinfo['video']['frame_rate'])                                                 ? number_format($fileinfo['video']['frame_rate'], 3).'fps'                  : '')).'</td>';
-					if (isset($_REQUEST['ShowMD5']) && GETID3_DEMO_BROWSE_ALLOW_MD5_LINK) {
-						echo '<td align="left"><tt>'.(isset($fileinfo['md5_file'])        ? $fileinfo['md5_file']        : '&nbsp;').'</tt></td>';
-						echo '<td align="left"><tt>'.(isset($fileinfo['md5_data'])        ? $fileinfo['md5_data']        : '&nbsp;').'</tt></td>';
-						echo '<td align="left"><tt>'.(isset($fileinfo['md5_data_source']) ? $fileinfo['md5_data_source'] : '&nbsp;').'</tt></td>';
-					} else {
-						echo '<td align="center" colspan="3">-</td>';
-					}
-					echo '<td align="left">&nbsp;'.(!empty($fileinfo['tags']) ? implode(', ', array_keys($fileinfo['tags'])) : '').'</td>';
-
-					echo '<td align="left">&nbsp;';
-					if (!empty($fileinfo['warning'])) {
-						$FilesWithWarnings++;
-						echo '<a href="#" onClick="alert(\''.htmlentities(str_replace("'", "\\'", preg_replace('#[\r\n\t]+#', ' ', implode('\\n', $fileinfo['warning']))), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'\'); return false;" title="'.htmlentities(implode("; \n", $fileinfo['warning']), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">warning</a><br>';
-					}
-					if (!empty($fileinfo['error'])) {
-						$FilesWithErrors++;
-						echo '<a href="#" onClick="alert(\''.htmlentities(str_replace("'", "\\'", preg_replace('#[\r\n\t]+#', ' ', implode('\\n', $fileinfo['error']))),   ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'\'); return false;" title="'.htmlentities(implode("; \n", $fileinfo['error']),   ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">error</a><br>';
-					}
-					echo '</td>';
-
-					if (GETID3_DEMO_BROWSE_ALLOW_EDIT_LINK) {
-						echo '<td align="left">&nbsp;';
-						$fileinfo['fileformat'] = (isset($fileinfo['fileformat']) ? $fileinfo['fileformat'] : '');
-						switch ($fileinfo['fileformat']) {
-							case 'mp3':
-							case 'mp2':
-							case 'mp1':
-							case 'flac':
-							case 'mpc':
-							case 'real':
-								echo '<a href="'.htmlentities($writescriptfilename.'?Filename='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" title="Edit tags">edit&nbsp;tags</a>';
-								break;
-							case 'ogg':
-								if (isset($fileinfo['audio']['dataformat']) && ($fileinfo['audio']['dataformat'] == 'vorbis')) {
-									echo '<a href="'.htmlentities($writescriptfilename.'?Filename='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" title="Edit tags">edit&nbsp;tags</a>';
-								}
-								break;
-							default:
-								break;
-						}
-						echo '</td>';
-					}
-					if (GETID3_DEMO_BROWSE_ALLOW_DELETE_LINK) {
-						echo '<td align="left">&nbsp;<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory).'&deletefile='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" onClick="return confirm(\'Are you sure you want to delete '.addslashes(htmlentities($dirname.$filename)).'? \n(this action cannot be un-done)\');" title="'.htmlentities('Permanently delete '."\n".$filename."\n".' from'."\n".' '.$dirname, ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">delete</a></td>';
-					}
-					echo '</tr>';
-				}
-			}
-
-			if (isset($DirectoryContents[$dirname]['other']) && is_array($DirectoryContents[$dirname]['other'])) {
-				uksort($DirectoryContents[$dirname]['other'], 'MoreNaturalSort');
-				foreach ($DirectoryContents[$dirname]['other'] as $filename => $fileinfo) {
-					echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_UnknownDark : $getID3checkColor_UnknownLight).'">';
-					$escaped_filename = htmlentities($filename, ENT_SUBSTITUTE, $PageEncoding);
-					$escaped_filename = ($escaped_filename ? $escaped_filename : rawurlencode($filename));
-					echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filename='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'"><i>'.$escaped_filename.'</i></a></td>';
-					echo '<td align="right">&nbsp;'.(isset($fileinfo['filesize']) ? number_format($fileinfo['filesize']) : '-').'</td>';
-					echo '<td align="right">&nbsp;'.NiceDisplayFiletypeFormat($fileinfo).'</td>';
-					echo '<td align="right">&nbsp;'.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').'</td>';
-					echo '<td align="right">&nbsp;'.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000) : '-').'</td>';
-					echo '<td align="left">&nbsp;</td>'; // Artist
-					echo '<td align="left">&nbsp;</td>'; // Title
-					echo '<td align="left" colspan="3">&nbsp;</td>'; // MD5_data
-					echo '<td align="left">&nbsp;</td>'; // Tags
-
-					//echo '<td align="left">&nbsp;</td>'; // Warning/Error
-					echo '<td align="left">&nbsp;';
-					if (!empty($fileinfo['warning'])) {
-						$FilesWithWarnings++;
-						echo '<a href="#" onClick="alert(\''.htmlentities(implode('\\n', $fileinfo['warning']), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'\'); return false;" title="'.htmlentities(implode("\n", $fileinfo['warning']), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">warning</a><br>';
-					}
-					if (!empty($fileinfo['error'])) {
-						if ($fileinfo['error'][0] != 'unable to determine file format') {
-							$FilesWithErrors++;
-							echo '<a href="#" onClick="alert(\''.htmlentities(implode('\\n', $fileinfo['error']), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'\'); return false;" title="'.htmlentities(implode("\n", $fileinfo['error']), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'">error</a><br>';
-						}
-					}
-					echo '</td>';
-
-					if (GETID3_DEMO_BROWSE_ALLOW_EDIT_LINK) {
-						echo '<td align="left">&nbsp;</td>'; // Edit
-					}
-					if (GETID3_DEMO_BROWSE_ALLOW_DELETE_LINK) {
-						echo '<td align="left">&nbsp;<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory).'&deletefile='.urlencode($dirname.$filename), ENT_QUOTES | ENT_SUBSTITUTE, $PageEncoding).'" onClick="return confirm(\'Are you sure you want to delete '.addslashes($dirname.$filename).'? \n(this action cannot be un-done)\');" title="Permanently delete '.addslashes($dirname.$filename).'">delete</a></td>';
-					}
-					echo '</tr>';
-				}
-			}
-
-			echo '<tr bgcolor="#'.$getID3checkColor_Head.'">';
-			echo '<td><b>Average:</b></td>';
-			echo '<td align="right">'.number_format($TotalScannedFilesize / max($TotalScannedKnownFiles, 1)).'</td>';
-			echo '<td>&nbsp;</td>';
-			echo '<td align="right">'.getid3_lib::PlaytimeString($TotalScannedPlaytime / max($TotalScannedPlaytimeFiles, 1)).'</td>';
-			echo '<td align="right">'.BitrateText(round(($TotalScannedBitrate / 1000) / max($TotalScannedBitrateFiles, 1))).'</td>';
-			echo '<td rowspan="2" colspan="'.($columnsintable - 5).'"><table class="table" border="0" cellspacing="0" cellpadding="2"><tr><th align="right">Identified Files:</th><td align="right">'.number_format($TotalScannedKnownFiles).'</td><td>&nbsp;&nbsp;&nbsp;</td><th align="right">Errors:</th><td align="right">'.number_format($FilesWithErrors).'</td></tr><tr><th align="right">Unknown Files:</th><td align="right">'.number_format($TotalScannedUnknownFiles).'</td><td>&nbsp;&nbsp;&nbsp;</td><th align="right">Warnings:</th><td align="right">'.number_format($FilesWithWarnings).'</td></tr></table>';
-			echo '</tr>';
-			echo '<tr bgcolor="#'.$getID3checkColor_Head.'">';
-			echo '<td><b>Total:</b></td>';
-			echo '<td align="right">'.number_format($TotalScannedFilesize).'</td>';
-			echo '<td>&nbsp;</td>';
-			echo '<td align="right">'.getid3_lib::PlaytimeString($TotalScannedPlaytime).'</td>';
-			echo '<td>&nbsp;</td>';
-			echo '</tr>';
-		}
-		echo '</table>';
-	} else {
-		$errormessage = ob_get_contents();
-		ob_end_clean();
-		echo '<b>ERROR: Could not open directory: <u>'.$currentfulldir.'</u></b><br>';
-	}
-}
-echo PoweredBygetID3().'<br clear="all">';
-echo '</body></html>';
-
-
-/////////////////////////////////////////////////////////////////
-
-
-function RemoveAccents($string) {
-	// Revised version by markstewardרotmail*com
-	// Again revised by James Heinrich (19-June-2006)
-	return strtr(
-		strtr(
-			$string,
-			"\x8A\x8E\x9A\x9E\x9F\xC0\xC1\xC2\xC3\xC4\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFF",
-			'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'
-		),
-		array(
-			"\xDE" => 'TH',
-			"\xFE" => 'th',
-			"\xD0" => 'DH',
-			"\xF0" => 'dh',
-			"\xDF" => 'ss',
-			"\x8C" => 'OE',
-			"\x9C" => 'oe',
-			"\xC6" => 'AE',
-			"\xE6" => 'ae',
-			"\xB5" => 'u'
-		)
-	);
-}
-
-
-function BitrateColor($bitrate, $BitrateMaxScale=768) {
-	// $BitrateMaxScale is bitrate of maximum-quality color (bright green)
-	// below this is gradient, above is solid green
-
-	$bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
-	$bitrate = round(min(max($bitrate, 1), 256));
-	$bitrate--;    // scale from 1-256kbps to 0-255kbps
-
-	$Rcomponent = max(255 - ($bitrate * 2), 0);
-	$Gcomponent = max(($bitrate * 2) - 255, 0);
-	if ($bitrate > 127) {
-		$Bcomponent = max((255 - $bitrate) * 2, 0);
-	} else {
-		$Bcomponent = max($bitrate * 2, 0);
-	}
-	return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT);
-}
-
-function BitrateText($bitrate, $decimals=0, $vbr=false) {
-	return '<span style="color: #'.BitrateColor($bitrate).($vbr ? '; font-weight: bold;' : '').'">'.number_format($bitrate, $decimals).' kbps</span>';
-}
-
-function string_var_dump($variable) {
-	if (version_compare(PHP_VERSION, '4.3.0', '>=')) {
-		return print_r($variable, true);
-	}
-	ob_start();
-	var_dump($variable);
-	$dumpedvariable = ob_get_contents();
-	ob_end_clean();
-	return $dumpedvariable;
-}
-
-function table_var_dump($variable, $wrap_in_td=false, $encoding='ISO-8859-1') {
-	$returnstring = '';
-	switch (gettype($variable)) {
-		case 'array':
-			$returnstring .= ($wrap_in_td ? '<td>' : '');
-			$returnstring .= '<table class="dump" cellspacing="0" cellpadding="2">';
-			foreach ($variable as $key => $value) {
-				$returnstring .= '<tr><td valign="top"><b>'.str_replace("\x00", ' ', $key).'</b></td>'."\n";
-				$returnstring .= '<td valign="top">'.gettype($value);
-				if (is_array($value)) {
-					$returnstring .= '&nbsp;('.count($value).')';
-				} elseif (is_string($value)) {
-					$returnstring .= '&nbsp;('.strlen($value).')';
-				}
-				//if (($key == 'data') && isset($variable['image_mime']) && isset($variable['dataoffset'])) {
-				if (($key == 'data') && isset($variable['image_mime'])) {
-					$imageinfo = array();
-					$imagechunkcheck = getid3_lib::GetDataImageSize($value, $imageinfo);
-					$returnstring .= '</td>'."\n".'<td><img src="data:'.$variable['image_mime'].';base64,'.base64_encode($value).'" width="'.$imagechunkcheck[0].'" height="'.$imagechunkcheck[1].'"></td></tr>'."\n";
-				} else {
-					$returnstring .= '</td>'."\n".table_var_dump($value, true, $encoding).'</tr>'."\n";
-				}
-			}
-			$returnstring .= '</table>'."\n";
-			$returnstring .= ($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		case 'boolean':
-			$returnstring .= ($wrap_in_td ? '<td class="dump_boolean">' : '').($variable ? 'TRUE' : 'FALSE').($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		case 'integer':
-			$returnstring .= ($wrap_in_td ? '<td class="dump_integer">' : '').$variable.($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		case 'double':
-		case 'float':
-			$returnstring .= ($wrap_in_td ? '<td class="dump_double">' : '').$variable.($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		case 'object':
-		case 'null':
-			$returnstring .= ($wrap_in_td ? '<td>' : '').string_var_dump($variable).($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		case 'string':
-			$returnstring = htmlentities($variable, ENT_QUOTES | ENT_SUBSTITUTE, $encoding);
-			$returnstring = ($wrap_in_td ? '<td class="dump_string">' : '').nl2br($returnstring).($wrap_in_td ? '</td>'."\n" : '');
-			break;
-
-		default:
-			$imageinfo = array();
-			$imagechunkcheck = getid3_lib::GetDataImageSize($variable, $imageinfo);
-			if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
-				$returnstring .= ($wrap_in_td ? '<td>' : '');
-				$returnstring .= '<table class="dump" cellspacing="0" cellpadding="2">';
-				$returnstring .= '<tr><td><b>type</b></td><td>'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]).'</td></tr>'."\n";
-				$returnstring .= '<tr><td><b>width</b></td><td>'.number_format($imagechunkcheck[0]).' px</td></tr>'."\n";
-				$returnstring .= '<tr><td><b>height</b></td><td>'.number_format($imagechunkcheck[1]).' px</td></tr>'."\n";
-				$returnstring .= '<tr><td><b>size</b></td><td>'.number_format(strlen($variable)).' bytes</td></tr></table>'."\n";
-				$returnstring .= ($wrap_in_td ? '</td>'."\n" : '');
-			} else {
-				$returnstring .= ($wrap_in_td ? '<td>' : '').nl2br(htmlspecialchars(str_replace("\x00", ' ', $variable))).($wrap_in_td ? '</td>'."\n" : '');
-			}
-			break;
-	}
-	return $returnstring;
-}
-
-
-function NiceDisplayFiletypeFormat(&$fileinfo) {
-
-	if (empty($fileinfo['fileformat'])) {
-		return '-';
-	}
-
-	$output  = $fileinfo['fileformat'];
-	if (empty($fileinfo['video']['dataformat']) && empty($fileinfo['audio']['dataformat'])) {
-		return $output;  // 'gif'
-	}
-	if (empty($fileinfo['video']['dataformat']) && !empty($fileinfo['audio']['dataformat'])) {
-		if ($fileinfo['fileformat'] == $fileinfo['audio']['dataformat']) {
-			return $output; // 'mp3'
-		}
-		$output .= '.'.$fileinfo['audio']['dataformat']; // 'ogg.flac'
-		return $output;
-	}
-	if (!empty($fileinfo['video']['dataformat']) && empty($fileinfo['audio']['dataformat'])) {
-		if ($fileinfo['fileformat'] == $fileinfo['video']['dataformat']) {
-			return $output; // 'mpeg'
-		}
-		$output .= '.'.$fileinfo['video']['dataformat']; // 'riff.avi'
-		return $output;
-	}
-	if ($fileinfo['video']['dataformat'] == $fileinfo['audio']['dataformat']) {
-		if ($fileinfo['fileformat'] == $fileinfo['video']['dataformat']) {
-			return $output; // 'real'
-		}
-		$output .= '.'.$fileinfo['video']['dataformat']; // any examples?
-		return $output;
-	}
-	$output .= '.'.$fileinfo['video']['dataformat'];
-	$output .= '.'.$fileinfo['audio']['dataformat']; // asf.wmv.wma
-	return $output;
-
-}
-
-function MoreNaturalSort($ar1, $ar2) {
-	if ($ar1 === $ar2) {
-		return 0;
-	}
-	$len1     = strlen($ar1);
-	$len2     = strlen($ar2);
-	$shortest = min($len1, $len2);
-	if (substr($ar1, 0, $shortest) === substr($ar2, 0, $shortest)) {
-		// the shorter argument is the beginning of the longer one, like "str" and "string"
-		if ($len1 < $len2) {
-			return -1;
-		} elseif ($len1 > $len2) {
-			return 1;
-		}
-		return 0;
-	}
-	$ar1 = RemoveAccents(strtolower(trim($ar1)));
-	$ar2 = RemoveAccents(strtolower(trim($ar2)));
-	$translatearray = array('\''=>'', '"'=>'', '_'=>' ', '('=>'', ')'=>'', '-'=>' ', '  '=>' ', '.'=>'', ','=>'');
-	foreach ($translatearray as $key => $val) {
-		$ar1 = str_replace($key, $val, $ar1);
-		$ar2 = str_replace($key, $val, $ar2);
-	}
-
-	if ($ar1 < $ar2) {
-		return -1;
-	} elseif ($ar1 > $ar2) {
-		return 1;
-	}
-	return 0;
-}
-
-function PoweredBygetID3($string='') {
-	global $getID3;
-	if (!$string) {
-		$string = '<div style="border: 1px #CCCCCC solid; padding: 5px; margin: 5px 0px; float: left; background-color: #EEEEEE; font-size: 8pt; font-face: sans-serif;">Powered by <a href="http://getid3.sourceforge.net"><b>getID3() v<!--GETID3VER--></b><br>http://getid3.sourceforge.net</a><br>Running on PHP v'.phpversion().' ('.(ceil(log(PHP_INT_MAX, 2)) + 1).'-bit)</div>';
-	}
-	return str_replace('<!--GETID3VER-->', $getID3->version(), $string);
-}
diff --git a/demos/demo.cache.dbm.php b/demos/demo.cache.dbm.php
deleted file mode 100644
index 68523c9..0000000
--- a/demos/demo.cache.dbm.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.cache.dbm.php - part of getID3()                 //
-// Sample script demonstrating the use of the DBM caching      //
-// extension for getID3()                                      //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-
-require_once('../getid3/getid3.php');
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'extension.cache.dbm.php', __FILE__, true);
-
-$getID3 = new getID3_cached_dbm('db3', '/zimweb/test/test.dbm', '/zimweb/test/test.lock');
-
-$r = $getID3->analyze('/path/to/files/filename.mp3');
-
-echo '<pre>';
-var_dump($r);
-echo '</pre>';
-
-// uncomment to clear cache
-// $getID3->clear_cache();
diff --git a/demos/demo.cache.mysql.php b/demos/demo.cache.mysql.php
deleted file mode 100644
index 037a7e2..0000000
--- a/demos/demo.cache.mysql.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.cache.mysql.php - part of getID3()               //
-// Sample script demonstrating the use of the DBM caching      //
-// extension for getID3()                                      //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-
-require_once('../getid3/getid3.php');
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'extension.cache.mysql.php', __FILE__, true);
-
-$getID3 = new getID3_cached_mysql('localhost', 'database', 'username', 'password');
-
-$r = $getID3->analyze('/path/to/files/filename.mp3');
-
-echo '<pre>';
-var_dump($r);
-echo '</pre>';
-
-// uncomment to clear cache
-//$getID3->clear_cache();
diff --git a/demos/demo.joinmp3.php b/demos/demo.joinmp3.php
deleted file mode 100644
index 215af94..0000000
--- a/demos/demo.joinmp3.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.joinmp3.php - part of getID3()                   //
-// Sample script for splicing two or more MP3s together into   //
-// one file. Does not attempt to fix VBR header frames.        //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-
-// sample usage:
-// $FilenameOut   = 'combined.mp3';
-// $FilenamesIn[] = 'file1.mp3';
-// $FilenamesIn[] = 'file2.mp3';
-// $FilenamesIn[] = 'file3.mp3';
-//
-// if (CombineMultipleMP3sTo($FilenameOut, $FilenamesIn)) {
-//     echo 'Successfully copied '.implode(' + ', $FilenamesIn).' to '.$FilenameOut;
-// } else {
-//     echo 'Failed to copy '.implode(' + ', $FilenamesIn).' to '.$FilenameOut;
-// }
-
-function CombineMultipleMP3sTo($FilenameOut, $FilenamesIn) {
-
-	foreach ($FilenamesIn as $nextinputfilename) {
-		if (!is_readable($nextinputfilename)) {
-			echo 'Cannot read "'.$nextinputfilename.'"<BR>';
-			return false;
-		}
-	}
-	if (!is_writeable($FilenameOut)) {
-		echo 'Cannot write "'.$FilenameOut.'"<BR>';
-		return false;
-	}
-
-	require_once('../getid3/getid3.php');
-	ob_start();
-	if ($fp_output = fopen($FilenameOut, 'wb')) {
-
-		ob_end_clean();
-		// Initialize getID3 engine
-		$getID3 = new getID3;
-		foreach ($FilenamesIn as $nextinputfilename) {
-
-			$CurrentFileInfo = $getID3->analyze($nextinputfilename);
-			if ($CurrentFileInfo['fileformat'] == 'mp3') {
-
-				ob_start();
-				if ($fp_source = fopen($nextinputfilename, 'rb')) {
-
-					ob_end_clean();
-					$CurrentOutputPosition = ftell($fp_output);
-
-					// copy audio data from first file
-					fseek($fp_source, $CurrentFileInfo['avdataoffset'], SEEK_SET);
-					while (!feof($fp_source) && (ftell($fp_source) < $CurrentFileInfo['avdataend'])) {
-						fwrite($fp_output, fread($fp_source, 32768));
-					}
-					fclose($fp_source);
-
-					// trim post-audio data (if any) copied from first file that we don't need or want
-					$EndOfFileOffset = $CurrentOutputPosition + ($CurrentFileInfo['avdataend'] - $CurrentFileInfo['avdataoffset']);
-					fseek($fp_output, $EndOfFileOffset, SEEK_SET);
-					ftruncate($fp_output, $EndOfFileOffset);
-
-				} else {
-
-					$errormessage = ob_get_contents();
-					ob_end_clean();
-					echo 'failed to open '.$nextinputfilename.' for reading';
-					fclose($fp_output);
-					return false;
-
-				}
-
-			} else {
-
-				echo $nextinputfilename.' is not MP3 format';
-				fclose($fp_output);
-				return false;
-
-			}
-
-		}
-
-	} else {
-
-		$errormessage = ob_get_contents();
-		ob_end_clean();
-		echo 'failed to open '.$FilenameOut.' for writing';
-		return false;
-
-	}
-
-	fclose($fp_output);
-	return true;
-}
diff --git a/demos/demo.mimeonly.php b/demos/demo.mimeonly.php
deleted file mode 100644
index 9a38178..0000000
--- a/demos/demo.mimeonly.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.mimeonly.php - part of getID3()                  //
-// Sample script for scanning a single file and returning only //
-// the MIME information                                        //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
-echo '<html><head><title>getID3 demos - MIME type only</title><style type="text/css">BODY, TD, TH { font-family: sans-serif; font-size: 10pt; }</style></head><body>';
-
-if (!empty($_REQUEST['filename'])) {
-
-	echo 'The file "'.htmlentities($_REQUEST['filename']).'" has a MIME type of "'.htmlentities(GetMIMEtype($_REQUEST['filename'])).'"';
-
-} else {
-
-	echo 'Usage: <span style="font-family: monospace;">'.htmlentities($_SERVER['PHP_SELF']).'?filename=<i>filename.ext</i></span>';
-
-}
-
-
-function GetMIMEtype($filename) {
-	$filename = realpath($filename);
-	if (!file_exists($filename)) {
-		echo 'File does not exist: "'.htmlentities($filename).'"<br>';
-		return '';
-	} elseif (!is_readable($filename)) {
-		echo 'File is not readable: "'.htmlentities($filename).'"<br>';
-		return '';
-	}
-
-	// include getID3() library (can be in a different directory if full path is specified)
-	require_once('../getid3/getid3.php');
-	// Initialize getID3 engine
-	$getID3 = new getID3;
-
-	$DeterminedMIMEtype = '';
-	if ($fp = fopen($filename, 'rb')) {
-		$getID3->openfile($filename);
-		if (empty($getID3->info['error'])) {
-
-			// ID3v2 is the only tag format that might be prepended in front of files, and it's non-trivial to skip, easier just to parse it and know where to skip to
-			getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
-			$getid3_id3v2 = new getid3_id3v2($getID3);
-			$getid3_id3v2->Analyze();
-
-			fseek($fp, $getID3->info['avdataoffset'], SEEK_SET);
-			$formattest = fread($fp, 16);  // 16 bytes is sufficient for any format except ISO CD-image
-			fclose($fp);
-
-			$DeterminedFormatInfo = $getID3->GetFileFormat($formattest);
-			$DeterminedMIMEtype = $DeterminedFormatInfo['mime_type'];
-
-		} else {
-			echo 'Failed to getID3->openfile "'.htmlentities($filename).'"<br>';
-		}
-	} else {
-		echo 'Failed to fopen "'.htmlentities($filename).'"<br>';
-	}
-	return $DeterminedMIMEtype;
-}
-
-echo '</body></html>';
\ No newline at end of file
diff --git a/demos/demo.mp3header.php b/demos/demo.mp3header.php
deleted file mode 100644
index 846db67..0000000
--- a/demos/demo.mp3header.php
+++ /dev/null
@@ -1,2888 +0,0 @@
-<?php
-
-if (!function_exists('PrintHexBytes')) {
-	function PrintHexBytes($string) {
-		$returnstring = '';
-		for ($i = 0; $i < strlen($string); $i++) {
-			$returnstring .= str_pad(dechex(ord(substr($string, $i, 1))), 2, '0', STR_PAD_LEFT).' ';
-		}
-		return $returnstring;
-	}
-}
-
-if (!function_exists('PrintTextBytes')) {
-	function PrintTextBytes($string) {
-		$returnstring = '';
-		for ($i = 0; $i < strlen($string); $i++) {
-			if (ord(substr($string, $i, 1)) <= 31) {
-				$returnstring .= '   ';
-			} else {
-				$returnstring .= ' '.substr($string, $i, 1).' ';
-			}
-		}
-		return $returnstring;
-	}
-}
-
-if (!function_exists('table_var_dump')) {
-	function table_var_dump($variable) {
-		$returnstring = '';
-		switch (gettype($variable)) {
-			case 'array':
-				$returnstring .= '<TABLE BORDER="1" CELLSPACING="0" CELLPADDING="2">';
-				foreach ($variable as $key => $value) {
-					$returnstring .= '<TR><TD VALIGN="TOP"><B>'.str_replace(chr(0), ' ', $key).'</B></TD>';
-					$returnstring .= '<TD VALIGN="TOP">'.gettype($value);
-					if (is_array($value)) {
-						$returnstring .= '&nbsp;('.count($value).')';
-					} elseif (is_string($value)) {
-						$returnstring .= '&nbsp;('.strlen($value).')';
-					}
-					if (($key == 'data') && isset($variable['image_mime']) && isset($variable['dataoffset'])) {
-						require_once(GETID3_INCLUDEPATH.'getid3.getimagesize.php');
-						$imageinfo = array();
-						$imagechunkcheck = GetDataImageSize($value, $imageinfo);
-						$DumpedImageSRC = (!empty($_REQUEST['filename']) ? $_REQUEST['filename'] : '.getid3').'.'.$variable['dataoffset'].'.'.ImageTypesLookup($imagechunkcheck[2]);
-						if ($tempimagefile = fopen($DumpedImageSRC, 'wb')) {
-							fwrite($tempimagefile, $value);
-							fclose($tempimagefile);
-						}
-						$returnstring .= '</TD><TD><IMG SRC="'.$DumpedImageSRC.'" WIDTH="'.$imagechunkcheck[0].'" HEIGHT="'.$imagechunkcheck[1].'"></TD></TR>';
-					} else {
-						$returnstring .= '</TD><TD>'.table_var_dump($value).'</TD></TR>';
-					}
-				}
-				$returnstring .= '</TABLE>';
-				break;
-
-			case 'boolean':
-				$returnstring .= ($variable ? 'TRUE' : 'FALSE');
-				break;
-
-			case 'integer':
-			case 'double':
-			case 'float':
-				$returnstring .= $variable;
-				break;
-
-			case 'object':
-			case 'null':
-				$returnstring .= string_var_dump($variable);
-				break;
-
-			case 'string':
-				$variable = str_replace(chr(0), ' ', $variable);
-				$varlen = strlen($variable);
-				for ($i = 0; $i < $varlen; $i++) {
-					if (preg_match('#['.chr(0x0A).chr(0x0D).' -;0-9A-Za-z]#', $variable{$i})) {
-						$returnstring .= $variable{$i};
-					} else {
-						$returnstring .= '&#'.str_pad(ord($variable{$i}), 3, '0', STR_PAD_LEFT).';';
-					}
-				}
-				$returnstring = nl2br($returnstring);
-				break;
-
-			default:
-				require_once(GETID3_INCLUDEPATH.'getid3.getimagesize.php');
-				$imageinfo = array();
-				$imagechunkcheck = GetDataImageSize(substr($variable, 0, 32768), $imageinfo);
-
-				if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
-					$returnstring .= '<table border="1" cellspacing="0" cellpadding="2">';
-					$returnstring .= '<tr><td><b>type</b></td><td>'.ImageTypesLookup($imagechunkcheck[2]).'</td></tr>';
-					$returnstring .= '<tr><td><b>width</b></td><td>'.number_format($imagechunkcheck[0]).' px</td></tr>';
-					$returnstring .= '<tr><td><b>height</b></td><td>'.number_format($imagechunkcheck[1]).' px</td></tr>';
-					$returnstring .= '<tr><td><b>size</b></td><td>'.number_format(strlen($variable)).' bytes</td></tr></table>';
-				} else {
-					$returnstring .= nl2br(htmlspecialchars(str_replace(chr(0), ' ', $variable)));
-				}
-				break;
-		}
-		return $returnstring;
-	}
-}
-
-if (!function_exists('string_var_dump')) {
-	function string_var_dump($variable) {
-		if (version_compare(PHP_VERSION, '4.3.0', '>=')) {
-			return print_r($variable, true);
-		}
-		ob_start();
-		var_dump($variable);
-		$dumpedvariable = ob_get_contents();
-		ob_end_clean();
-		return $dumpedvariable;
-	}
-}
-
-if (!function_exists('fileextension')) {
-	function fileextension($filename, $numextensions=1) {
-		if (strstr($filename, '.')) {
-			$reversedfilename = strrev($filename);
-			$offset = 0;
-			for ($i = 0; $i < $numextensions; $i++) {
-				$offset = strpos($reversedfilename, '.', $offset + 1);
-				if ($offset === false) {
-					return '';
-				}
-			}
-			return strrev(substr($reversedfilename, 0, $offset));
-		}
-		return '';
-	}
-}
-
-if (!function_exists('RemoveAccents')) {
-	function RemoveAccents($string) {
-		// return strtr($string, '¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ', 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
-		// Revised version by marksteward@hotmail.com
-		return strtr(strtr($string, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', '' => 'OE', '' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
-	}
-}
-
-if (!function_exists('MoreNaturalSort')) {
-	function MoreNaturalSort($ar1, $ar2) {
-		if ($ar1 === $ar2) {
-			return 0;
-		}
-		$len1     = strlen($ar1);
-		$len2     = strlen($ar2);
-		$shortest = min($len1, $len2);
-		if (substr($ar1, 0, $shortest) === substr($ar2, 0, $shortest)) {
-			// the shorter argument is the beginning of the longer one, like "str" and "string"
-			if ($len1 < $len2) {
-				return -1;
-			} elseif ($len1 > $len2) {
-				return 1;
-			}
-			return 0;
-		}
-		$ar1 = RemoveAccents(strtolower(trim($ar1)));
-		$ar2 = RemoveAccents(strtolower(trim($ar2)));
-		$translatearray = array('\''=>'', '"'=>'', '_'=>' ', '('=>'', ')'=>'', '-'=>' ', '  '=>' ', '.'=>'', ','=>'');
-		foreach ($translatearray as $key => $val) {
-			$ar1 = str_replace($key, $val, $ar1);
-			$ar2 = str_replace($key, $val, $ar2);
-		}
-
-		if ($ar1 < $ar2) {
-			return -1;
-		} elseif ($ar1 > $ar2) {
-			return 1;
-		}
-		return 0;
-	}
-}
-
-if (!function_exists('trunc')) {
-	function trunc($floatnumber) {
-		// truncates a floating-point number at the decimal point
-		// returns int (if possible, otherwise float)
-		if ($floatnumber >= 1) {
-			$truncatednumber = floor($floatnumber);
-		} elseif ($floatnumber <= -1) {
-			$truncatednumber = ceil($floatnumber);
-		} else {
-			$truncatednumber = 0;
-		}
-		if ($truncatednumber <= pow(2, 30)) {
-			$truncatednumber = (int) $truncatednumber;
-		}
-		return $truncatednumber;
-	}
-}
-
-if (!function_exists('CastAsInt')) {
-	function CastAsInt($floatnum) {
-		// convert to float if not already
-		$floatnum = (float) $floatnum;
-
-		// convert a float to type int, only if possible
-		if (trunc($floatnum) == $floatnum) {
-			// it's not floating point
-			if ($floatnum <= pow(2, 30)) {
-				// it's within int range
-				$floatnum = (int) $floatnum;
-			}
-		}
-		return $floatnum;
-	}
-}
-
-if (!function_exists('getmicrotime')) {
-	function getmicrotime() {
-		list($usec, $sec) = explode(' ', microtime());
-		return ((float) $usec + (float) $sec);
-	}
-}
-
-if (!function_exists('DecimalBinary2Float')) {
-	function DecimalBinary2Float($binarynumerator) {
-		$numerator   = Bin2Dec($binarynumerator);
-		$denominator = Bin2Dec(str_repeat('1', strlen($binarynumerator)));
-		return ($numerator / $denominator);
-	}
-}
-
-if (!function_exists('NormalizeBinaryPoint')) {
-	function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) {
-		// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
-		if (strpos($binarypointnumber, '.') === false) {
-			$binarypointnumber = '0.'.$binarypointnumber;
-		} elseif ($binarypointnumber{0} == '.') {
-			$binarypointnumber = '0'.$binarypointnumber;
-		}
-		$exponent = 0;
-		while (($binarypointnumber{0} != '1') || (substr($binarypointnumber, 1, 1) != '.')) {
-			if (substr($binarypointnumber, 1, 1) == '.') {
-				$exponent--;
-				$binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3);
-			} else {
-				$pointpos = strpos($binarypointnumber, '.');
-				$exponent += ($pointpos - 1);
-				$binarypointnumber = str_replace('.', '', $binarypointnumber);
-				$binarypointnumber = $binarypointnumber{0}.'.'.substr($binarypointnumber, 1);
-			}
-		}
-		$binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT);
-		return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent);
-	}
-}
-
-if (!function_exists('Float2BinaryDecimal')) {
-	function Float2BinaryDecimal($floatvalue) {
-		// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
-		$maxbits = 128; // to how many bits of precision should the calculations be taken?
-		$intpart   = trunc($floatvalue);
-		$floatpart = abs($floatvalue - $intpart);
-		$pointbitstring = '';
-		while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) {
-			$floatpart *= 2;
-			$pointbitstring .= (string) trunc($floatpart);
-			$floatpart -= trunc($floatpart);
-		}
-		$binarypointnumber = decbin($intpart).'.'.$pointbitstring;
-		return $binarypointnumber;
-	}
-}
-
-if (!function_exists('Float2String')) {
-	function Float2String($floatvalue, $bits) {
-		// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html
-		switch ($bits) {
-			case 32:
-				$exponentbits = 8;
-				$fractionbits = 23;
-				break;
-
-			case 64:
-				$exponentbits = 11;
-				$fractionbits = 52;
-				break;
-
-			default:
-				return false;
-				break;
-		}
-		if ($floatvalue >= 0) {
-			$signbit = '0';
-		} else {
-			$signbit = '1';
-		}
-		$normalizedbinary  = NormalizeBinaryPoint(Float2BinaryDecimal($floatvalue), $fractionbits);
-		$biasedexponent    = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent
-		$exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT);
-		$fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT);
-
-		return BigEndian2String(Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false);
-	}
-}
-
-if (!function_exists('LittleEndian2Float')) {
-	function LittleEndian2Float($byteword) {
-		return BigEndian2Float(strrev($byteword));
-	}
-}
-
-if (!function_exists('BigEndian2Float')) {
-	function BigEndian2Float($byteword) {
-		// ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic
-		// http://www.psc.edu/general/software/packages/ieee/ieee.html
-		// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html
-
-		$bitword = BigEndian2Bin($byteword);
-		$signbit = $bitword{0};
-
-		switch (strlen($byteword) * 8) {
-			case 32:
-				$exponentbits = 8;
-				$fractionbits = 23;
-				break;
-
-			case 64:
-				$exponentbits = 11;
-				$fractionbits = 52;
-				break;
-
-			case 80:
-				$exponentbits = 16;
-				$fractionbits = 64;
-				break;
-
-			default:
-				return false;
-				break;
-		}
-		$exponentstring = substr($bitword, 1, $exponentbits - 1);
-		$fractionstring = substr($bitword, $exponentbits, $fractionbits);
-		$exponent = Bin2Dec($exponentstring);
-		$fraction = Bin2Dec($fractionstring);
-
-		if (($exponentbits == 16) && ($fractionbits == 64)) {
-			// 80-bit
-			// As used in Apple AIFF for sample_rate
-			// A bit of a hack, but it works ;)
-			return pow(2, ($exponent  - 16382)) * DecimalBinary2Float($fractionstring);
-		}
-
-
-		if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) {
-			// Not a Number
-			$floatvalue = false;
-		} elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) {
-			if ($signbit == '1') {
-				$floatvalue = '-infinity';
-			} else {
-				$floatvalue = '+infinity';
-			}
-		} elseif (($exponent == 0) && ($fraction == 0)) {
-			if ($signbit == '1') {
-				$floatvalue = -0;
-			} else {
-				$floatvalue = 0;
-			}
-			$floatvalue = ($signbit ? 0 : -0);
-		} elseif (($exponent == 0) && ($fraction != 0)) {
-			// These are 'unnormalized' values
-			$floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * DecimalBinary2Float($fractionstring);
-			if ($signbit == '1') {
-				$floatvalue *= -1;
-			}
-		} elseif ($exponent != 0) {
-			$floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + DecimalBinary2Float($fractionstring));
-			if ($signbit == '1') {
-				$floatvalue *= -1;
-			}
-		}
-		return (float) $floatvalue;
-	}
-}
-
-if (!function_exists('BigEndian2Int')) {
-	function BigEndian2Int($byteword, $synchsafe=false, $signed=false) {
-		$intvalue = 0;
-		$bytewordlen = strlen($byteword);
-		for ($i = 0; $i < $bytewordlen; $i++) {
-			if ($synchsafe) { // disregard MSB, effectively 7-bit bytes
-				$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7);
-			} else {
-				$intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen - 1 - $i));
-			}
-		}
-		if ($signed && !$synchsafe) {
-			// synchsafe ints are not allowed to be signed
-			switch ($bytewordlen) {
-				case 1:
-				case 2:
-				case 3:
-				case 4:
-					$signmaskbit = 0x80 << (8 * ($bytewordlen - 1));
-					if ($intvalue & $signmaskbit) {
-						$intvalue = 0 - ($intvalue & ($signmaskbit - 1));
-					}
-					break;
-
-				default:
-					die('ERROR: Cannot have signed integers larger than 32-bits in BigEndian2Int()');
-					break;
-			}
-		}
-		return CastAsInt($intvalue);
-	}
-}
-
-if (!function_exists('LittleEndian2Int')) {
-	function LittleEndian2Int($byteword, $signed=false) {
-		return BigEndian2Int(strrev($byteword), false, $signed);
-	}
-}
-
-if (!function_exists('BigEndian2Bin')) {
-	function BigEndian2Bin($byteword) {
-		$binvalue = '';
-		$bytewordlen = strlen($byteword);
-		for ($i = 0; $i < $bytewordlen; $i++) {
-			$binvalue .= str_pad(decbin(ord($byteword{$i})), 8, '0', STR_PAD_LEFT);
-		}
-		return $binvalue;
-	}
-}
-
-if (!function_exists('BigEndian2String')) {
-	function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) {
-		if ($number < 0) {
-			return false;
-		}
-		$maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF);
-		$intstring = '';
-		if ($signed) {
-			if ($minbytes > 4) {
-				die('ERROR: Cannot have signed integers larger than 32-bits in BigEndian2String()');
-			}
-			$number = $number & (0x80 << (8 * ($minbytes - 1)));
-		}
-		while ($number != 0) {
-			$quotient = ($number / ($maskbyte + 1));
-			$intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring;
-			$number = floor($quotient);
-		}
-		return str_pad($intstring, $minbytes, chr(0), STR_PAD_LEFT);
-	}
-}
-
-if (!function_exists('Dec2Bin')) {
-	function Dec2Bin($number) {
-		while ($number >= 256) {
-			$bytes[] = (($number / 256) - (floor($number / 256))) * 256;
-			$number = floor($number / 256);
-		}
-		$bytes[] = $number;
-		$binstring = '';
-		for ($i = 0; $i < count($bytes); $i++) {
-			$binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring;
-		}
-		return $binstring;
-	}
-}
-
-if (!function_exists('Bin2Dec')) {
-	function Bin2Dec($binstring) {
-		$decvalue = 0;
-		for ($i = 0; $i < strlen($binstring); $i++) {
-			$decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i);
-		}
-		return CastAsInt($decvalue);
-	}
-}
-
-if (!function_exists('Bin2String')) {
-	function Bin2String($binstring) {
-		// return 'hi' for input of '0110100001101001'
-		$string = '';
-		$binstringreversed = strrev($binstring);
-		for ($i = 0; $i < strlen($binstringreversed); $i += 8) {
-			$string = chr(Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string;
-		}
-		return $string;
-	}
-}
-
-if (!function_exists('LittleEndian2String')) {
-	function LittleEndian2String($number, $minbytes=1, $synchsafe=false) {
-		$intstring = '';
-		while ($number > 0) {
-			if ($synchsafe) {
-				$intstring = $intstring.chr($number & 127);
-				$number >>= 7;
-			} else {
-				$intstring = $intstring.chr($number & 255);
-				$number >>= 8;
-			}
-		}
-		return str_pad($intstring, $minbytes, chr(0), STR_PAD_RIGHT);
-	}
-}
-
-if (!function_exists('Bool2IntString')) {
-	function Bool2IntString($intvalue) {
-		return ($intvalue ? '1' : '0');
-	}
-}
-
-if (!function_exists('IntString2Bool')) {
-	function IntString2Bool($char) {
-		if ($char == '1') {
-			return true;
-		} elseif ($char == '0') {
-			return false;
-		}
-		return null;
-	}
-}
-
-if (!function_exists('InverseBoolean')) {
-	function InverseBoolean($value) {
-		return ($value ? false : true);
-	}
-}
-
-if (!function_exists('DeUnSynchronise')) {
-	function DeUnSynchronise($data) {
-		return str_replace(chr(0xFF).chr(0x00), chr(0xFF), $data);
-	}
-}
-
-if (!function_exists('Unsynchronise')) {
-	function Unsynchronise($data) {
-		// Whenever a false synchronisation is found within the tag, one zeroed
-		// byte is inserted after the first false synchronisation byte. The
-		// format of a correct sync that should be altered by ID3 encoders is as
-		// follows:
-		//      %11111111 111xxxxx
-		// And should be replaced with:
-		//      %11111111 00000000 111xxxxx
-		// This has the side effect that all $FF 00 combinations have to be
-		// altered, so they won't be affected by the decoding process. Therefore
-		// all the $FF 00 combinations have to be replaced with the $FF 00 00
-		// combination during the unsynchronisation.
-
-		$data = str_replace(chr(0xFF).chr(0x00), chr(0xFF).chr(0x00).chr(0x00), $data);
-		$unsyncheddata = '';
-		for ($i = 0; $i < strlen($data); $i++) {
-			$thischar = $data{$i};
-			$unsyncheddata .= $thischar;
-			if ($thischar == chr(255)) {
-				$nextchar = ord(substr($data, $i + 1, 1));
-				if (($nextchar | 0xE0) == 0xE0) {
-					// previous byte = 11111111, this byte = 111?????
-					$unsyncheddata .= chr(0);
-				}
-			}
-		}
-		return $unsyncheddata;
-	}
-}
-
-if (!function_exists('is_hash')) {
-	function is_hash($var) {
-		// written by dev-null@christophe.vg
-		// taken from http://www.php.net/manual/en/function.array-merge-recursive.php
-		if (is_array($var)) {
-			$keys = array_keys($var);
-			$all_num = true;
-			for ($i = 0; $i < count($keys); $i++) {
-				if (is_string($keys[$i])) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
-
-if (!function_exists('array_join_merge')) {
-	function array_join_merge($arr1, $arr2) {
-		// written by dev-null@christophe.vg
-		// taken from http://www.php.net/manual/en/function.array-merge-recursive.php
-		if (is_array($arr1) && is_array($arr2)) {
-			// the same -> merge
-			$new_array = array();
-
-			if (is_hash($arr1) && is_hash($arr2)) {
-				// hashes -> merge based on keys
-				$keys = array_merge(array_keys($arr1), array_keys($arr2));
-				foreach ($keys as $key) {
-					$arr1[$key] = (isset($arr1[$key]) ? $arr1[$key] : '');
-					$arr2[$key] = (isset($arr2[$key]) ? $arr2[$key] : '');
-					$new_array[$key] = array_join_merge($arr1[$key], $arr2[$key]);
-				}
-			} else {
-				// two real arrays -> merge
-				$new_array = array_reverse(array_unique(array_reverse(array_merge($arr1,$arr2))));
-			}
-			return $new_array;
-		} else {
-			// not the same ... take new one if defined, else the old one stays
-			return $arr2 ? $arr2 : $arr1;
-		}
-	}
-}
-
-if (!function_exists('array_merge_clobber')) {
-	function array_merge_clobber($array1, $array2) {
-		// written by kc@hireability.com
-		// taken from http://www.php.net/manual/en/function.array-merge-recursive.php
-		if (!is_array($array1) || !is_array($array2)) {
-			return false;
-		}
-		$newarray = $array1;
-		foreach ($array2 as $key => $val) {
-			if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {
-				$newarray[$key] = array_merge_clobber($newarray[$key], $val);
-			} else {
-				$newarray[$key] = $val;
-			}
-		}
-		return $newarray;
-	}
-}
-
-if (!function_exists('array_merge_noclobber')) {
-	function array_merge_noclobber($array1, $array2) {
-		if (!is_array($array1) || !is_array($array2)) {
-			return false;
-		}
-		$newarray = $array1;
-		foreach ($array2 as $key => $val) {
-			if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {
-				$newarray[$key] = array_merge_noclobber($newarray[$key], $val);
-			} elseif (!isset($newarray[$key])) {
-				$newarray[$key] = $val;
-			}
-		}
-		return $newarray;
-	}
-}
-
-if (!function_exists('RoughTranslateUnicodeToASCII')) {
-	function RoughTranslateUnicodeToASCII($rawdata, $frame_textencoding) {
-		// rough translation of data for application that can't handle Unicode data
-
-		$tempstring = '';
-		switch ($frame_textencoding) {
-			case 0: // ISO-8859-1. Terminated with $00.
-				$asciidata = $rawdata;
-				break;
-
-			case 1: // UTF-16 encoded Unicode with BOM. Terminated with $00 00.
-				$asciidata = $rawdata;
-				if (substr($asciidata, 0, 2) == chr(0xFF).chr(0xFE)) {
-					// remove BOM, only if present (it should be, but...)
-					$asciidata = substr($asciidata, 2);
-				}
-				if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) {
-					$asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...)
-				}
-				for ($i = 0; $i < strlen($asciidata); $i += 2) {
-					if ((ord($asciidata{$i}) <= 0x7F) || (ord($asciidata{$i}) >= 0xA0)) {
-						$tempstring .= $asciidata{$i};
-					} else {
-						$tempstring .= '?';
-					}
-				}
-				$asciidata = $tempstring;
-				break;
-
-			case 2: // UTF-16BE encoded Unicode without BOM. Terminated with $00 00.
-				$asciidata = $rawdata;
-				if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) {
-					$asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...)
-				}
-				for ($i = 0; $i < strlen($asciidata); $i += 2) {
-					if ((ord($asciidata{$i}) <= 0x7F) || (ord($asciidata{$i}) >= 0xA0)) {
-						$tempstring .= $asciidata{$i};
-					} else {
-						$tempstring .= '?';
-					}
-				}
-				$asciidata = $tempstring;
-				break;
-
-			case 3: // UTF-8 encoded Unicode. Terminated with $00.
-				$asciidata = utf8_decode($rawdata);
-				break;
-
-			case 255: // Unicode, Big-Endian. Terminated with $00 00.
-				$asciidata = $rawdata;
-				if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) {
-					$asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...)
-				}
-				for ($i = 0; ($i + 1) < strlen($asciidata); $i += 2) {
-					if ((ord($asciidata{($i + 1)}) <= 0x7F) || (ord($asciidata{($i + 1)}) >= 0xA0)) {
-						$tempstring .= $asciidata{($i + 1)};
-					} else {
-						$tempstring .= '?';
-					}
-				}
-				$asciidata = $tempstring;
-				break;
-
-
-			default:
-				// shouldn't happen, but in case $frame_textencoding is not 1 <= $frame_textencoding <= 4
-				// just pass the data through unchanged.
-				$asciidata = $rawdata;
-				break;
-		}
-		if (substr($asciidata, strlen($asciidata) - 1, 1) == chr(0)) {
-			// remove null terminator, if present
-			$asciidata = NoNullString($asciidata);
-		}
-		return $asciidata;
-		// return str_replace(chr(0), '', $asciidata); // just in case any nulls slipped through
-	}
-}
-
-if (!function_exists('PlaytimeString')) {
-	function PlaytimeString($playtimeseconds) {
-		$contentseconds = round((($playtimeseconds / 60) - floor($playtimeseconds / 60)) * 60);
-		$contentminutes = floor($playtimeseconds / 60);
-		if ($contentseconds >= 60) {
-			$contentseconds -= 60;
-			$contentminutes++;
-		}
-		return number_format($contentminutes).':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT);
-	}
-}
-
-if (!function_exists('CloseMatch')) {
-	function CloseMatch($value1, $value2, $tolerance) {
-		return (abs($value1 - $value2) <= $tolerance);
-	}
-}
-
-if (!function_exists('ID3v1matchesID3v2')) {
-	function ID3v1matchesID3v2($id3v1, $id3v2) {
-
-		$requiredindices = array('title', 'artist', 'album', 'year', 'genre', 'comment');
-		foreach ($requiredindices as $requiredindex) {
-			if (!isset($id3v1["$requiredindex"])) {
-				$id3v1["$requiredindex"] = '';
-			}
-			if (!isset($id3v2["$requiredindex"])) {
-				$id3v2["$requiredindex"] = '';
-			}
-		}
-
-		if (trim($id3v1['title']) != trim(substr($id3v2['title'], 0, 30))) {
-			return false;
-		}
-		if (trim($id3v1['artist']) != trim(substr($id3v2['artist'], 0, 30))) {
-			return false;
-		}
-		if (trim($id3v1['album']) != trim(substr($id3v2['album'], 0, 30))) {
-			return false;
-		}
-		if (trim($id3v1['year']) != trim(substr($id3v2['year'], 0, 4))) {
-			return false;
-		}
-		if (trim($id3v1['genre']) != trim($id3v2['genre'])) {
-			return false;
-		}
-		if (isset($id3v1['track'])) {
-			if (!isset($id3v1['track']) || (trim($id3v1['track']) != trim($id3v2['track']))) {
-				return false;
-			}
-			if (trim($id3v1['comment']) != trim(substr($id3v2['comment'], 0, 28))) {
-				return false;
-			}
-		} else {
-			if (trim($id3v1['comment']) != trim(substr($id3v2['comment'], 0, 30))) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
-
-if (!function_exists('FILETIMEtoUNIXtime')) {
-	function FILETIMEtoUNIXtime($FILETIME, $round=true) {
-		// FILETIME is a 64-bit unsigned integer representing
-		// the number of 100-nanosecond intervals since January 1, 1601
-		// UNIX timestamp is number of seconds since January 1, 1970
-		// 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days
-		if ($round) {
-			return round(($FILETIME - 116444736000000000) / 10000000);
-		}
-		return ($FILETIME - 116444736000000000) / 10000000;
-	}
-}
-
-if (!function_exists('GUIDtoBytestring')) {
-	function GUIDtoBytestring($GUIDstring) {
-		// Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way:
-		// first 4 bytes are in little-endian order
-		// next 2 bytes are appended in little-endian order
-		// next 2 bytes are appended in little-endian order
-		// next 2 bytes are appended in big-endian order
-		// next 6 bytes are appended in big-endian order
-
-		// AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string:
-		// $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp
-
-		$hexbytecharstring  = chr(hexdec(substr($GUIDstring,  6, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  4, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  2, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  0, 2)));
-
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  9, 2)));
-
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2)));
-
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2)));
-
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2)));
-		$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2)));
-
-		return $hexbytecharstring;
-	}
-}
-
-if (!function_exists('BytestringToGUID')) {
-	function BytestringToGUID($Bytestring) {
-		$GUIDstring  = str_pad(dechex(ord($Bytestring{3})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{2})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{1})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{0})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= '-';
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{5})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{4})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= '-';
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{7})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{6})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= '-';
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{8})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{9})),  2, '0', STR_PAD_LEFT);
-		$GUIDstring .= '-';
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT);
-		$GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT);
-
-		return strtoupper($GUIDstring);
-	}
-}
-
-if (!function_exists('BitrateColor')) {
-	function BitrateColor($bitrate) {
-		$bitrate /= 3; // scale from 1-768kbps to 1-256kbps
-		$bitrate--;    // scale from 1-256kbps to 0-255kbps
-		$bitrate = max($bitrate, 0);
-		$bitrate = min($bitrate, 255);
-		//$bitrate = max($bitrate, 32);
-		//$bitrate = min($bitrate, 143);
-		//$bitrate = ($bitrate * 2) - 32;
-
-		$Rcomponent = max(255 - ($bitrate * 2), 0);
-		$Gcomponent = max(($bitrate * 2) - 255, 0);
-		if ($bitrate > 127) {
-			$Bcomponent = max((255 - $bitrate) * 2, 0);
-		} else {
-			$Bcomponent = max($bitrate * 2, 0);
-		}
-		return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT);
-	}
-}
-
-if (!function_exists('BitrateText')) {
-	function BitrateText($bitrate) {
-		return '<SPAN STYLE="color: #'.BitrateColor($bitrate).'">'.round($bitrate).' kbps</SPAN>';
-	}
-}
-
-if (!function_exists('image_type_to_mime_type')) {
-	function image_type_to_mime_type($imagetypeid) {
-		// only available in PHP v4.3.0+
-		static $image_type_to_mime_type = array();
-		if (empty($image_type_to_mime_type)) {
-			$image_type_to_mime_type[1]  = 'image/gif';                     // GIF
-			$image_type_to_mime_type[2]  = 'image/jpeg';                    // JPEG
-			$image_type_to_mime_type[3]  = 'image/png';                     // PNG
-			$image_type_to_mime_type[4]  = 'application/x-shockwave-flash'; // Flash
-			$image_type_to_mime_type[5]  = 'image/psd';                     // PSD
-			$image_type_to_mime_type[6]  = 'image/bmp';                     // BMP
-			$image_type_to_mime_type[7]  = 'image/tiff';                    // TIFF: little-endian (Intel)
-			$image_type_to_mime_type[8]  = 'image/tiff';                    // TIFF: big-endian (Motorola)
-			//$image_type_to_mime_type[9]  = 'image/jpc';                   // JPC
-			//$image_type_to_mime_type[10] = 'image/jp2';                   // JPC
-			//$image_type_to_mime_type[11] = 'image/jpx';                   // JPC
-			//$image_type_to_mime_type[12] = 'image/jb2';                   // JPC
-			$image_type_to_mime_type[13] = 'application/x-shockwave-flash'; // Shockwave
-			$image_type_to_mime_type[14] = 'image/iff';                     // IFF
-		}
-		return (isset($image_type_to_mime_type[$imagetypeid]) ? $image_type_to_mime_type[$imagetypeid] : 'application/octet-stream');
-	}
-}
-
-if (!function_exists('utf8_decode')) {
-	// PHP has this function built-in if it's configured with the --with-xml option
-	// This version of the function is only provided in case XML isn't installed
-	function utf8_decode($utf8text) {
-		// http://www.php.net/manual/en/function.utf8-encode.php
-		// bytes  bits  representation
-		//   1     7    0bbbbbbb
-		//   2     11   110bbbbb 10bbbbbb
-		//   3     16   1110bbbb 10bbbbbb 10bbbbbb
-		//   4     21   11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
-
-		$utf8length = strlen($utf8text);
-		$decodedtext = '';
-		for ($i = 0; $i < $utf8length; $i++) {
-			if ((ord($utf8text{$i}) & 0x80) == 0) {
-				$decodedtext .= $utf8text{$i};
-			} elseif ((ord($utf8text{$i}) & 0xF0) == 0xF0) {
-				$decodedtext .= '?';
-				$i += 3;
-			} elseif ((ord($utf8text{$i}) & 0xE0) == 0xE0) {
-				$decodedtext .= '?';
-				$i += 2;
-			} elseif ((ord($utf8text{$i}) & 0xC0) == 0xC0) {
-				//   2     11   110bbbbb 10bbbbbb
-				$decodedchar = Bin2Dec(substr(Dec2Bin(ord($utf8text{$i})), 3, 5).substr(Dec2Bin(ord($utf8text{($i + 1)})), 2, 6));
-				if ($decodedchar <= 255) {
-					$decodedtext .= chr($decodedchar);
-				} else {
-					$decodedtext .= '?';
-				}
-				$i += 1;
-			}
-		}
-		return $decodedtext;
-	}
-}
-
-if (!function_exists('DateMac2Unix')) {
-	function DateMac2Unix($macdate) {
-		// Macintosh timestamp: seconds since 00:00h January 1, 1904
-		// UNIX timestamp:      seconds since 00:00h January 1, 1970
-		return CastAsInt($macdate - 2082844800);
-	}
-}
-
-
-if (!function_exists('FixedPoint8_8')) {
-	function FixedPoint8_8($rawdata) {
-		return BigEndian2Int(substr($rawdata, 0, 1)) + (float) (BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8));
-	}
-}
-
-
-if (!function_exists('FixedPoint16_16')) {
-	function FixedPoint16_16($rawdata) {
-		return BigEndian2Int(substr($rawdata, 0, 2)) + (float) (BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16));
-	}
-}
-
-
-if (!function_exists('FixedPoint2_30')) {
-	function FixedPoint2_30($rawdata) {
-		$binarystring = BigEndian2Bin($rawdata);
-		return Bin2Dec(substr($binarystring, 0, 2)) + (float) (Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30));
-	}
-}
-
-
-if (!function_exists('Pascal2String')) {
-	function Pascal2String($pascalstring) {
-		// Pascal strings have 1 byte at the beginning saying how many chars are in the string
-		return substr($pascalstring, 1);
-	}
-}
-
-if (!function_exists('NoNullString')) {
-	function NoNullString($nullterminatedstring) {
-		// remove the single null terminator on null terminated strings
-		if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === chr(0)) {
-			return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1);
-		}
-		return $nullterminatedstring;
-	}
-}
-
-if (!function_exists('FileSizeNiceDisplay')) {
-	function FileSizeNiceDisplay($filesize, $precision=2) {
-		if ($filesize < 1000) {
-			$sizeunit  = 'bytes';
-			$precision = 0;
-		} else {
-			$filesize /= 1024;
-			$sizeunit = 'kB';
-		}
-		if ($filesize >= 1000) {
-			$filesize /= 1024;
-			$sizeunit = 'MB';
-		}
-		if ($filesize >= 1000) {
-			$filesize /= 1024;
-			$sizeunit = 'GB';
-		}
-		return number_format($filesize, $precision).' '.$sizeunit;
-	}
-}
-
-if (!function_exists('DOStime2UNIXtime')) {
-	function DOStime2UNIXtime($DOSdate, $DOStime) {
-		// wFatDate
-		// Specifies the MS-DOS date. The date is a packed 16-bit value with the following format:
-		// Bits      Contents
-		// 0-4    Day of the month (1-31)
-		// 5-8    Month (1 = January, 2 = February, and so on)
-		// 9-15   Year offset from 1980 (add 1980 to get actual year)
-
-		$UNIXday    =  ($DOSdate & 0x001F);
-		$UNIXmonth  = (($DOSdate & 0x01E0) >> 5);
-		$UNIXyear   = (($DOSdate & 0xFE00) >> 9) + 1980;
-
-		// wFatTime
-		// Specifies the MS-DOS time. The time is a packed 16-bit value with the following format:
-		// Bits   Contents
-		// 0-4    Second divided by 2
-		// 5-10   Minute (0-59)
-		// 11-15  Hour (0-23 on a 24-hour clock)
-
-		$UNIXsecond =  ($DOStime & 0x001F) * 2;
-		$UNIXminute = (($DOStime & 0x07E0) >> 5);
-		$UNIXhour   = (($DOStime & 0xF800) >> 11);
-
-		return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
-	}
-}
-
-if (!function_exists('CreateDeepArray')) {
-	function CreateDeepArray($ArrayPath, $Separator, $Value) {
-		// assigns $Value to a nested array path:
-		//   $foo = CreateDeepArray('/path/to/my', '/', 'file.txt')
-		// is the same as:
-		//   $foo = array('path'=>array('to'=>'array('my'=>array('file.txt'))));
-		// or
-		//   $foo['path']['to']['my'] = 'file.txt';
-		while ($ArrayPath{0} == $Separator) {
-			$ArrayPath = substr($ArrayPath, 1);
-		}
-		if (($pos = strpos($ArrayPath, $Separator)) !== false) {
-			$ReturnedArray[substr($ArrayPath, 0, $pos)] = CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value);
-		} else {
-			$ReturnedArray["$ArrayPath"] = $Value;
-		}
-		return $ReturnedArray;
-	}
-}
-
-if (!function_exists('md5_file')) {
-	// Allan Hansen <ah@artemis.dk>
-	// md5_file() exists in PHP 4.2.0.
-	// The following works under UNIX only, but dies on windows
-	function md5_file($file) {
-		if (substr(php_uname(), 0, 7) == 'Windows') {
-			die('PHP 4.2.0 or newer required for md5_file()');
-		}
-
-		$file = str_replace('`', '\\`', $file);
-		if (preg_match("#^([0-9a-f]{32})[ \t\n\r]#i", `md5sum "$file"`, $r)) {
-			return $r[1];
-		}
-		return false;
-	}
-}
-
-if (!function_exists('md5_data')) {
-	// Allan Hansen <ah@artemis.dk>
-	// md5_data() - returns md5sum for a file from startuing position to absolute end position
-
-	function md5_data($file, $offset, $end, $invertsign=false) {
-		// first try and create a temporary file in the same directory as the file being scanned
-		if (($dataMD5filename = tempnam(dirname($file), preg_replace('#[^[:alnum:]]#i', '', basename($file)))) === false) {
-			// if that fails, create a temporary file in the system temp directory
-			if (($dataMD5filename = tempnam('/tmp', 'getID3')) === false) {
-				// if that fails, create a temporary file in the current directory
-				if (($dataMD5filename = tempnam('.', preg_replace('#[^[:alnum:]]#i', '', basename($file)))) === false) {
-					// can't find anywhere to create a temp file, just die
-					return false;
-				}
-			}
-		}
-		$md5 = false;
-		set_time_limit(max(filesize($file) / 1000000, 30));
-
-		// copy parts of file
-		ob_start();
-		if ($fp = fopen($file, 'rb')) {
-			ob_end_clean();
-
-			ob_start();
-			if ($MD5fp = fopen($dataMD5filename, 'wb')) {
-
-				ob_end_clean();
-				if ($invertsign) {
-					// Load conversion lookup strings for 8-bit unsigned->signed conversion below
-					$from = '';
-					$to   = '';
-					for ($i = 0; $i < 128; $i++) {
-						$from .= chr($i);
-						$to   .= chr($i + 128);
-					}
-					for ($i = 128; $i < 256; $i++) {
-						$from .= chr($i);
-						$to   .= chr($i - 128);
-					}
-				}
-
-				fseek($fp, $offset, SEEK_SET);
-				$byteslefttowrite = $end - $offset;
-				while (($byteslefttowrite > 0) && ($buffer = fread($fp, 32768))) {
-					if ($invertsign) {
-						// Possibly FLAC-specific (?)
-						// FLAC calculates the MD5sum of the source data of 8-bit files
-						// not on the actual byte values in the source file, but of those
-						// values converted from unsigned to signed, or more specifcally,
-						// with the MSB inverted. ex: 01 -> 81; F5 -> 75; etc
-
-						// Therefore, 8-bit WAV data has to be converted before getting the
-						// md5_data value so as to match the FLAC value
-
-						// Flip the MSB for each byte in the buffer before copying
-						$buffer = strtr($buffer, $from, $to);
-					}
-					$byteswritten = fwrite($MD5fp, $buffer, $byteslefttowrite);
-					$byteslefttowrite -= $byteswritten;
-				}
-				fclose($MD5fp);
-				$md5 = md5_file($dataMD5filename);
-
-			} else {
-				$errormessage = ob_get_contents();
-				ob_end_clean();
-			}
-			fclose($fp);
-
-		} else {
-			$errormessage = ob_get_contents();
-			ob_end_clean();
-		}
-		unlink($dataMD5filename);
-		return $md5;
-	}
-}
-
-if (!function_exists('TwosCompliment2Decimal')) {
-	function TwosCompliment2Decimal($BinaryValue) {
-		// http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html
-		// First check if the number is negative or positive by looking at the sign bit.
-		// If it is positive, simply convert it to decimal.
-		// If it is negative, make it positive by inverting the bits and adding one.
-		// Then, convert the result to decimal.
-		// The negative of this number is the value of the original binary.
-
-		if ($BinaryValue & 0x80) {
-
-			// negative number
-			return (0 - ((~$BinaryValue & 0xFF) + 1));
-
-		} else {
-
-			// positive number
-			return $BinaryValue;
-
-		}
-
-	}
-}
-
-if (!function_exists('LastArrayElement')) {
-	function LastArrayElement($MyArray) {
-		if (!is_array($MyArray)) {
-			return false;
-		}
-		if (empty($MyArray)) {
-			return null;
-		}
-		foreach ($MyArray as $key => $value) {
-		}
-		return $value;
-	}
-}
-
-if (!function_exists('safe_inc')) {
-	function safe_inc(&$variable, $increment=1) {
-		if (isset($variable)) {
-			$variable += $increment;
-		} else {
-			$variable = $increment;
-		}
-		return true;
-	}
-}
-
-if (!function_exists('CalculateCompressionRatioVideo')) {
-	function CalculateCompressionRatioVideo(&$ThisFileInfo) {
-		if (empty($ThisFileInfo['video'])) {
-			return false;
-		}
-		if (empty($ThisFileInfo['video']['resolution_x']) || empty($ThisFileInfo['video']['resolution_y'])) {
-			return false;
-		}
-		if (empty($ThisFileInfo['video']['bits_per_sample'])) {
-			return false;
-		}
-
-		switch ($ThisFileInfo['video']['dataformat']) {
-			case 'bmp':
-			case 'gif':
-			case 'jpeg':
-			case 'jpg':
-			case 'png':
-			case 'tiff':
-				$FrameRate = 1;
-				$PlaytimeSeconds = 1;
-				$BitrateCompressed = $ThisFileInfo['filesize'] * 8;
-				break;
-
-			default:
-				if (!empty($ThisFileInfo['video']['frame_rate'])) {
-					$FrameRate = $ThisFileInfo['video']['frame_rate'];
-				} else {
-					return false;
-				}
-				if (!empty($ThisFileInfo['playtime_seconds'])) {
-					$PlaytimeSeconds = $ThisFileInfo['playtime_seconds'];
-				} else {
-					return false;
-				}
-				if (!empty($ThisFileInfo['video']['bitrate'])) {
-					$BitrateCompressed = $ThisFileInfo['video']['bitrate'];
-				} else {
-					return false;
-				}
-				break;
-		}
-		$BitrateUncompressed = $ThisFileInfo['video']['resolution_x'] * $ThisFileInfo['video']['resolution_y'] * $ThisFileInfo['video']['bits_per_sample'] * $FrameRate;
-
-		$ThisFileInfo['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed;
-		return true;
-	}
-}
-
-if (!function_exists('CalculateCompressionRatioAudio')) {
-	function CalculateCompressionRatioAudio(&$ThisFileInfo) {
-		if (empty($ThisFileInfo['audio']['bitrate']) || empty($ThisFileInfo['audio']['channels']) || empty($ThisFileInfo['audio']['sample_rate']) || empty($ThisFileInfo['audio']['bits_per_sample'])) {
-			return false;
-		}
-		$ThisFileInfo['audio']['compression_ratio'] = $ThisFileInfo['audio']['bitrate'] / ($ThisFileInfo['audio']['channels'] * $ThisFileInfo['audio']['sample_rate'] * $ThisFileInfo['audio']['bits_per_sample']);
-		return true;
-	}
-}
-
-if (!function_exists('IsValidMIMEstring')) {
-	function IsValidMIMEstring($mimestring) {
-		if ((strlen($mimestring) >= 3) && (strpos($mimestring, '/') > 0) && (strpos($mimestring, '/') < (strlen($mimestring) - 1))) {
-			return true;
-		}
-		return false;
-	}
-}
-
-if (!function_exists('IsWithinBitRange')) {
-	function IsWithinBitRange($number, $maxbits, $signed=false) {
-		if ($signed) {
-			if (($number > (0 - pow(2, $maxbits - 1))) && ($number <= pow(2, $maxbits - 1))) {
-				return true;
-			}
-		} else {
-			if (($number >= 0) && ($number <= pow(2, $maxbits))) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
-
-if (!function_exists('safe_parse_url')) {
-	function safe_parse_url($url) {
-		ob_start();
-		$parts = parse_url($url);
-		$errormessage = ob_get_contents();
-		ob_end_clean();
-		$parts['scheme'] = (isset($parts['scheme']) ? $parts['scheme'] : '');
-		$parts['host']   = (isset($parts['host'])   ? $parts['host']   : '');
-		$parts['user']   = (isset($parts['user'])   ? $parts['user']   : '');
-		$parts['pass']   = (isset($parts['pass'])   ? $parts['pass']   : '');
-		$parts['path']   = (isset($parts['path'])   ? $parts['path']   : '');
-		$parts['query']  = (isset($parts['query'])  ? $parts['query']  : '');
-		return $parts;
-	}
-}
-
-if (!function_exists('IsValidURL')) {
-	function IsValidURL($url, $allowUserPass=false) {
-		if ($url == '') {
-			return false;
-		}
-		if ($allowUserPass !== true) {
-			if (strstr($url, '@')) {
-				// in the format http://user:pass@example.com  or http://user@example.com
-				// but could easily be somebody incorrectly entering an email address in place of a URL
-				return false;
-			}
-		}
-		if ($parts = safe_parse_url($url)) {
-			if (($parts['scheme'] != 'http') && ($parts['scheme'] != 'https') && ($parts['scheme'] != 'ftp') && ($parts['scheme'] != 'gopher')) {
-				return false;
-			} elseif (!preg_match("#^[[:alnum:]]([-.]?[0-9a-z])*\.[a-z]{2,3}#i$", $parts['host'], $regs) && !preg_match('#^[0-9]{1,3}(\.[0-9]{1,3}){3}$#', $parts['host'])) {
-				return false;
-			} elseif (!preg_match("#^([[:alnum:]-]|[\_])*$#i", $parts['user'], $regs)) {
-				return false;
-			} elseif (!preg_match("#^([[:alnum:]-]|[\_])*$#i", $parts['pass'], $regs)) {
-				return false;
-			} elseif (!preg_match("#^[[:alnum:]/_\.@~-]*$#i", $parts['path'], $regs)) {
-				return false;
-			} elseif (!preg_match("#^[[:alnum:]?&=+:;_()%#/,\.-]*$#i", $parts['query'], $regs)) {
-				return false;
-			} else {
-				return true;
-			}
-		}
-		return false;
-	}
-}
-
-echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">';
-echo 'Enter 4 hex bytes of MPEG-audio header (ie <I>FF FA 92 44</I>)<BR>';
-echo '<input type="text" name="HeaderHexBytes" value="'.htmlentities(isset($_POST['HeaderHexBytes']) ? strtoupper($_POST['HeaderHexBytes']) : '', ENT_QUOTES).'" size="11" maxlength="11">';
-echo '<input type="submit" name="Analyze" value="Analyze"></form>';
-echo '<hr>';
-
-echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" METHOD="get">';
-echo 'Generate a MPEG-audio 4-byte header from these values:<BR>';
-echo '<table border="0">';
-
-$MPEGgenerateValues = array(
-								'version'=>array('1', '2', '2.5'),
-								'layer'=>array('I', 'II', 'III'),
-								'protection'=>array('Y', 'N'),
-								'bitrate'=>array('free', '8', '16', '24', '32', '40', '48', '56', '64', '80', '96', '112', '128', '144', '160', '176', '192', '224', '256', '288', '320', '352', '384', '416', '448'),
-								'frequency'=>array('8000', '11025', '12000', '16000', '22050', '24000', '32000', '44100', '48000'),
-								'padding'=>array('Y', 'N'),
-								'private'=>array('Y', 'N'),
-								'channelmode'=>array('stereo', 'joint stereo', 'dual channel', 'mono'),
-								'modeextension'=>array('none', 'IS', 'MS', 'IS+MS', '4-31', '8-31', '12-31', '16-31'),
-								'copyright'=>array('Y', 'N'),
-								'original'=>array('Y', 'N'),
-								'emphasis'=>array('none', '50/15ms', 'CCIT J.17')
-							);
-
-foreach ($MPEGgenerateValues as $name => $dataarray) {
-	echo '<tr><th>'.$name.':</th><td><select name="'.$name.'">';
-	foreach ($dataarray as $key => $value) {
-		echo '<option'.((isset($_POST["$name"]) && ($_POST["$name"] == $value)) ? ' SELECTED' : '').'>'.$value.'</option>';
-	}
-	echo '</select></td></tr>';
-}
-
-if (isset($_POST['bitrate'])) {
-	echo '<tr><th>Frame Length:</th><td>'.(int) MPEGaudioFrameLength($_POST['bitrate'], $_POST['version'], $_POST['layer'], (($_POST['padding'] == 'Y') ? '1' : '0'), $_POST['frequency']).'</td></tr>';
-}
-echo '</table>';
-echo '<input type="submit" name="Generate" value="Generate"></form>';
-echo '<hr>';
-
-
-if (isset($_POST['Analyze']) && $_POST['HeaderHexBytes']) {
-
-	$headerbytearray = explode(' ', $_POST['HeaderHexBytes']);
-	if (count($headerbytearray) != 4) {
-		die('Invalid byte pattern');
-	}
-	$headerstring = '';
-	foreach ($headerbytearray as $textbyte) {
-		$headerstring .= chr(hexdec($textbyte));
-	}
-
-	$MP3fileInfo['error'] = '';
-
-	$MPEGheaderRawArray = MPEGaudioHeaderDecode(substr($headerstring, 0, 4));
-
-	if (MPEGaudioHeaderValid($MPEGheaderRawArray, true)) {
-
-		$MP3fileInfo['raw'] = $MPEGheaderRawArray;
-
-		$MP3fileInfo['version']              = MPEGaudioVersionLookup($MP3fileInfo['raw']['version']);
-		$MP3fileInfo['layer']                = MPEGaudioLayerLookup($MP3fileInfo['raw']['layer']);
-		$MP3fileInfo['protection']           = MPEGaudioCRCLookup($MP3fileInfo['raw']['protection']);
-		$MP3fileInfo['bitrate']              = MPEGaudioBitrateLookup($MP3fileInfo['version'], $MP3fileInfo['layer'], $MP3fileInfo['raw']['bitrate']);
-		$MP3fileInfo['frequency']            = MPEGaudioFrequencyLookup($MP3fileInfo['version'], $MP3fileInfo['raw']['sample_rate']);
-		$MP3fileInfo['padding']              = (bool) $MP3fileInfo['raw']['padding'];
-		$MP3fileInfo['private']              = (bool) $MP3fileInfo['raw']['private'];
-		$MP3fileInfo['channelmode']          = MPEGaudioChannelModeLookup($MP3fileInfo['raw']['channelmode']);
-		$MP3fileInfo['channels']             = (($MP3fileInfo['channelmode'] == 'mono') ? 1 : 2);
-		$MP3fileInfo['modeextension']        = MPEGaudioModeExtensionLookup($MP3fileInfo['layer'], $MP3fileInfo['raw']['modeextension']);
-		$MP3fileInfo['copyright']            = (bool) $MP3fileInfo['raw']['copyright'];
-		$MP3fileInfo['original']             = (bool) $MP3fileInfo['raw']['original'];
-		$MP3fileInfo['emphasis']             = MPEGaudioEmphasisLookup($MP3fileInfo['raw']['emphasis']);
-
-		if ($MP3fileInfo['protection']) {
-			$MP3fileInfo['crc'] = BigEndian2Int(substr($headerstring, 4, 2));
-		}
-
-		if ($MP3fileInfo['frequency'] > 0) {
-			$MP3fileInfo['framelength'] = MPEGaudioFrameLength($MP3fileInfo['bitrate'], $MP3fileInfo['version'], $MP3fileInfo['layer'], (int) $MP3fileInfo['padding'], $MP3fileInfo['frequency']);
-		}
-		if ($MP3fileInfo['bitrate'] != 'free') {
-			$MP3fileInfo['bitrate'] *= 1000;
-		}
-
-	} else {
-
-		$MP3fileInfo['error'] .= "\n".'Invalid MPEG audio header';
-
-	}
-
-	if (!$MP3fileInfo['error']) {
-		unset($MP3fileInfo['error']);
-	}
-
-	echo table_var_dump($MP3fileInfo);
-
-} elseif (isset($_POST['Generate'])) {
-
-	// AAAA AAAA  AAAB BCCD  EEEE FFGH  IIJJ KLMM
-
-	$headerbitstream  = '11111111111';                               // A - Frame sync (all bits set)
-
-	$MPEGversionLookup = array('2.5'=>'00', '2'=>'10', '1'=>'11');
-	$headerbitstream .= $MPEGversionLookup[$_POST['version']];       // B - MPEG Audio version ID
-
-	$MPEGlayerLookup = array('III'=>'01', 'II'=>'10', 'I'=>'11');
-	$headerbitstream .= $MPEGlayerLookup[$_POST['layer']];           // C - Layer description
-
-	$headerbitstream .= (($_POST['protection'] == 'Y') ? '0' : '1'); // D - Protection bit
-
-	$MPEGaudioBitrateLookup['1']['I']     = array('free'=>'0000', '32'=>'0001', '64'=>'0010', '96'=>'0011', '128'=>'0100', '160'=>'0101', '192'=>'0110', '224'=>'0111', '256'=>'1000', '288'=>'1001', '320'=>'1010', '352'=>'1011', '384'=>'1100', '416'=>'1101', '448'=>'1110');
-	$MPEGaudioBitrateLookup['1']['II']    = array('free'=>'0000', '32'=>'0001', '48'=>'0010', '56'=>'0011',  '64'=>'0100',  '80'=>'0101',  '96'=>'0110', '112'=>'0111', '128'=>'1000', '160'=>'1001', '192'=>'1010', '224'=>'1011', '256'=>'1100', '320'=>'1101', '384'=>'1110');
-	$MPEGaudioBitrateLookup['1']['III']   = array('free'=>'0000', '32'=>'0001', '40'=>'0010', '48'=>'0011',  '56'=>'0100',  '64'=>'0101',  '80'=>'0110',  '96'=>'0111', '112'=>'1000', '128'=>'1001', '160'=>'1010', '192'=>'1011', '224'=>'1100', '256'=>'1101', '320'=>'1110');
-	$MPEGaudioBitrateLookup['2']['I']     = array('free'=>'0000', '32'=>'0001', '48'=>'0010', '56'=>'0011',  '64'=>'0100',  '80'=>'0101',  '96'=>'0110', '112'=>'0111', '128'=>'1000', '144'=>'1001', '160'=>'1010', '176'=>'1011', '192'=>'1100', '224'=>'1101', '256'=>'1110');
-	$MPEGaudioBitrateLookup['2']['II']    = array('free'=>'0000',  '8'=>'0001', '16'=>'0010', '24'=>'0011',  '32'=>'0100',  '40'=>'0101',  '48'=>'0110',  '56'=>'0111',  '64'=>'1000',  '80'=>'1001',  '96'=>'1010', '112'=>'1011', '128'=>'1100', '144'=>'1101', '160'=>'1110');
-	$MPEGaudioBitrateLookup['2']['III']   = $MPEGaudioBitrateLookup['2']['II'];
-	$MPEGaudioBitrateLookup['2.5']['I']   = $MPEGaudioBitrateLookup['2']['I'];
-	$MPEGaudioBitrateLookup['2.5']['II']  = $MPEGaudioBitrateLookup['2']['II'];
-	$MPEGaudioBitrateLookup['2.5']['III'] = $MPEGaudioBitrateLookup['2']['II'];
-	if (isset($MPEGaudioBitrateLookup[$_POST['version']][$_POST['layer']][$_POST['bitrate']])) {
-		$headerbitstream .= $MPEGaudioBitrateLookup[$_POST['version']][$_POST['layer']][$_POST['bitrate']]; // E - Bitrate index
-	} else {
-		die('Invalid <B>Bitrate</B>');
-	}
-
-	$MPEGaudioFrequencyLookup['1']   = array('44100'=>'00', '48000'=>'01', '32000'=>'10');
-	$MPEGaudioFrequencyLookup['2']   = array('22050'=>'00', '24000'=>'01', '16000'=>'10');
-	$MPEGaudioFrequencyLookup['2.5'] = array('11025'=>'00', '12000'=>'01', '8000'=>'10');
-	if (isset($MPEGaudioFrequencyLookup[$_POST['version']][$_POST['frequency']])) {
-		$headerbitstream .= $MPEGaudioFrequencyLookup[$_POST['version']][$_POST['frequency']];  // F - Sampling rate frequency index
-	} else {
-		die('Invalid <B>Frequency</B>');
-	}
-
-	$headerbitstream .= (($_POST['padding'] == 'Y') ? '1' : '0');            // G - Padding bit
-
-	$headerbitstream .= (($_POST['private'] == 'Y') ? '1' : '0');            // H - Private bit
-
-	$MPEGaudioChannelModeLookup = array('stereo'=>'00', 'joint stereo'=>'01', 'dual channel'=>'10', 'mono'=>'11');
-	$headerbitstream .= $MPEGaudioChannelModeLookup[$_POST['channelmode']];  // I - Channel Mode
-
-	$MPEGaudioModeExtensionLookup['I']   = array('4-31'=>'00', '8-31'=>'01', '12-31'=>'10', '16-31'=>'11');
-	$MPEGaudioModeExtensionLookup['II']  = $MPEGaudioModeExtensionLookup['I'];
-	$MPEGaudioModeExtensionLookup['III'] = array('none'=>'00',   'IS'=>'01',    'MS'=>'10', 'IS+MS'=>'11');
-	if ($_POST['channelmode'] != 'joint stereo') {
-		$headerbitstream .= '00';
-	} elseif (isset($MPEGaudioModeExtensionLookup[$_POST['layer']][$_POST['modeextension']])) {
-		$headerbitstream .= $MPEGaudioModeExtensionLookup[$_POST['layer']][$_POST['modeextension']];  // J - Mode extension (Only if Joint stereo)
-	} else {
-		die('Invalid <B>Mode Extension</B>');
-	}
-
-	$headerbitstream .= (($_POST['copyright'] == 'Y') ? '1' : '0');          // K - Copyright
-
-	$headerbitstream .= (($_POST['original']  == 'Y') ? '1' : '0');          // L - Original
-
-	$MPEGaudioEmphasisLookup = array('none'=>'00', '50/15ms'=>'01', 'CCIT J.17'=>'11');
-	if (isset($MPEGaudioEmphasisLookup[$_POST['emphasis']])) {
-		$headerbitstream .= $MPEGaudioEmphasisLookup[$_POST['emphasis']];    // M - Emphasis
-	} else {
-		die('Invalid <B>Emphasis</B>');
-	}
-
-	echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream,  0, 8))), 2, '0', STR_PAD_LEFT)).' ';
-	echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream,  8, 8))), 2, '0', STR_PAD_LEFT)).' ';
-	echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 16, 8))), 2, '0', STR_PAD_LEFT)).' ';
-	echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 24, 8))), 2, '0', STR_PAD_LEFT)).'<BR>';
-
-}
-
-function MPEGaudioVersionLookup($rawversion) {
-	$MPEGaudioVersionLookup = array('2.5', FALSE, '2', '1');
-	return (isset($MPEGaudioVersionLookup["$rawversion"]) ? $MPEGaudioVersionLookup["$rawversion"] : FALSE);
-}
-
-function MPEGaudioLayerLookup($rawlayer) {
-	$MPEGaudioLayerLookup = array(FALSE, 'III', 'II', 'I');
-	return (isset($MPEGaudioLayerLookup["$rawlayer"]) ? $MPEGaudioLayerLookup["$rawlayer"] : FALSE);
-}
-
-function MPEGaudioBitrateLookup($version, $layer, $rawbitrate) {
-	static $MPEGaudioBitrateLookup;
-	if (empty($MPEGaudioBitrateLookup)) {
-		$MPEGaudioBitrateLookup = MPEGaudioBitrateArray();
-	}
-	return (isset($MPEGaudioBitrateLookup["$version"]["$layer"]["$rawbitrate"]) ? $MPEGaudioBitrateLookup["$version"]["$layer"]["$rawbitrate"] : FALSE);
-}
-
-function MPEGaudioFrequencyLookup($version, $rawfrequency) {
-	static $MPEGaudioFrequencyLookup;
-	if (empty($MPEGaudioFrequencyLookup)) {
-		$MPEGaudioFrequencyLookup = MPEGaudioFrequencyArray();
-	}
-	return (isset($MPEGaudioFrequencyLookup["$version"]["$rawfrequency"]) ? $MPEGaudioFrequencyLookup["$version"]["$rawfrequency"] : FALSE);
-}
-
-function MPEGaudioChannelModeLookup($rawchannelmode) {
-	$MPEGaudioChannelModeLookup = array('stereo', 'joint stereo', 'dual channel', 'mono');
-	return (isset($MPEGaudioChannelModeLookup["$rawchannelmode"]) ? $MPEGaudioChannelModeLookup["$rawchannelmode"] : FALSE);
-}
-
-function MPEGaudioModeExtensionLookup($layer, $rawmodeextension) {
-	$MPEGaudioModeExtensionLookup['I']   = array('4-31', '8-31', '12-31', '16-31');
-	$MPEGaudioModeExtensionLookup['II']  = array('4-31', '8-31', '12-31', '16-31');
-	$MPEGaudioModeExtensionLookup['III'] = array('', 'IS', 'MS', 'IS+MS');
-	return (isset($MPEGaudioModeExtensionLookup["$layer"]["$rawmodeextension"]) ? $MPEGaudioModeExtensionLookup["$layer"]["$rawmodeextension"] : FALSE);
-}
-
-function MPEGaudioEmphasisLookup($rawemphasis) {
-	$MPEGaudioEmphasisLookup = array('none', '50/15ms', FALSE, 'CCIT J.17');
-	return (isset($MPEGaudioEmphasisLookup["$rawemphasis"]) ? $MPEGaudioEmphasisLookup["$rawemphasis"] : FALSE);
-}
-
-function MPEGaudioCRCLookup($CRCbit) {
-	// inverse boolean cast :)
-	if ($CRCbit == '0') {
-		return TRUE;
-	} else {
-		return FALSE;
-	}
-}
-
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                ///
-//            or http://www.getid3.org                        ///
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// getid3.mp3.php - part of getID3()                           //
-// See getid3.readme.txt for more details                      //
-//                                                             //
-/////////////////////////////////////////////////////////////////
-
-// number of frames to scan to determine if MPEG-audio sequence is valid
-// Lower this number to 5-20 for faster scanning
-// Increase this number to 50+ for most accurate detection of valid VBR/CBR
-// mpeg-audio streams
-define('MPEG_VALID_CHECK_FRAMES', 35);
-
-function getMP3headerFilepointer(&$fd, &$ThisFileInfo) {
-
-	getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $ThisFileInfo['avdataoffset']);
-
-	if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode'])) {
-		$ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']);
-	}
-
-	if (((isset($ThisFileInfo['id3v2']) && ($ThisFileInfo['avdataoffset'] > $ThisFileInfo['id3v2']['headerlength'])) || (!isset($ThisFileInfo['id3v2']) && ($ThisFileInfo['avdataoffset'] > 0)))) {
-
-		$ThisFileInfo['warning'] .= "\n".'Unknown data before synch ';
-		if (isset($ThisFileInfo['id3v2']['headerlength'])) {
-			$ThisFileInfo['warning'] .= '(ID3v2 header ends at '.$ThisFileInfo['id3v2']['headerlength'].', then '.($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']).' bytes garbage, ';
-		} else {
-			$ThisFileInfo['warning'] .= '(should be at beginning of file, ';
-		}
-		$ThisFileInfo['warning'] .= 'synch detected at '.$ThisFileInfo['avdataoffset'].')';
-		if ($ThisFileInfo['audio']['bitrate_mode'] == 'cbr') {
-			if (!empty($ThisFileInfo['id3v2']['headerlength']) && (($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']) == $ThisFileInfo['mpeg']['audio']['framelength'])) {
-				$ThisFileInfo['warning'] .= '. This is a known problem with some versions of LAME (3.91, 3.92) DLL in CBR mode.';
-				$ThisFileInfo['audio']['codec'] = 'LAME';
-			} elseif (empty($ThisFileInfo['id3v2']['headerlength']) && ($ThisFileInfo['avdataoffset'] == $ThisFileInfo['mpeg']['audio']['framelength'])) {
-				$ThisFileInfo['warning'] .= '. This is a known problem with some versions of LAME (3.91, 3.92) DLL in CBR mode.';
-				$ThisFileInfo['audio']['codec'] = 'LAME';
-			}
-		}
-
-	}
-
-	if (isset($ThisFileInfo['mpeg']['audio']['layer']) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'II')) {
-		$ThisFileInfo['audio']['dataformat'] = 'mp2';
-	} elseif (isset($ThisFileInfo['mpeg']['audio']['layer']) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'I')) {
-		$ThisFileInfo['audio']['dataformat'] = 'mp1';
-	}
-	if ($ThisFileInfo['fileformat'] == 'mp3') {
-		switch ($ThisFileInfo['audio']['dataformat']) {
-			case 'mp1':
-			case 'mp2':
-			case 'mp3':
-				$ThisFileInfo['fileformat'] = $ThisFileInfo['audio']['dataformat'];
-				break;
-
-			default:
-				$ThisFileInfo['warning'] .= "\n".'Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$ThisFileInfo['audio']['dataformat'].'"';
-				break;
-		}
-	}
-
-	if (empty($ThisFileInfo['fileformat'])) {
-		$ThisFileInfo['error'] .= "\n".'Synch not found';
-		unset($ThisFileInfo['fileformat']);
-		unset($ThisFileInfo['audio']['bitrate_mode']);
-		unset($ThisFileInfo['avdataoffset']);
-		unset($ThisFileInfo['avdataend']);
-		return false;
-	}
-
-	$ThisFileInfo['mime_type']         = 'audio/mpeg';
-	$ThisFileInfo['audio']['lossless'] = false;
-
-	// Calculate playtime
-	if (!isset($ThisFileInfo['playtime_seconds']) && isset($ThisFileInfo['audio']['bitrate']) && ($ThisFileInfo['audio']['bitrate'] > 0)) {
-		$ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8 / $ThisFileInfo['audio']['bitrate'];
-	}
-
-	if (isset($ThisFileInfo['mpeg']['audio']['LAME'])) {
-		$ThisFileInfo['audio']['codec'] = 'LAME';
-		if (!empty($ThisFileInfo['mpeg']['audio']['LAME']['long_version'])) {
-			$ThisFileInfo['audio']['encoder'] = trim($ThisFileInfo['mpeg']['audio']['LAME']['long_version']);
-		}
-	}
-
-	return true;
-}
-
-
-function decodeMPEGaudioHeader($fd, $offset, &$ThisFileInfo, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) {
-
-	static $MPEGaudioVersionLookup;
-	static $MPEGaudioLayerLookup;
-	static $MPEGaudioBitrateLookup;
-	static $MPEGaudioFrequencyLookup;
-	static $MPEGaudioChannelModeLookup;
-	static $MPEGaudioModeExtensionLookup;
-	static $MPEGaudioEmphasisLookup;
-	if (empty($MPEGaudioVersionLookup)) {
-		$MPEGaudioVersionLookup       = MPEGaudioVersionArray();
-		$MPEGaudioLayerLookup         = MPEGaudioLayerArray();
-		$MPEGaudioBitrateLookup       = MPEGaudioBitrateArray();
-		$MPEGaudioFrequencyLookup     = MPEGaudioFrequencyArray();
-		$MPEGaudioChannelModeLookup   = MPEGaudioChannelModeArray();
-		$MPEGaudioModeExtensionLookup = MPEGaudioModeExtensionArray();
-		$MPEGaudioEmphasisLookup      = MPEGaudioEmphasisArray();
-	}
-
-	if ($offset >= $ThisFileInfo['avdataend']) {
-		$ThisFileInfo['error'] .= "\n".'end of file encounter looking for MPEG synch';
-		return false;
-	}
-	fseek($fd, $offset, SEEK_SET);
-	$headerstring = fread($fd, 1441); // worse-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame
-
-	// MP3 audio frame structure:
-	// $aa $aa $aa $aa [$bb $bb] $cc...
-	// where $aa..$aa is the four-byte mpeg-audio header (below)
-	// $bb $bb is the optional 2-byte CRC
-	// and $cc... is the audio data
-
-	$head4 = substr($headerstring, 0, 4);
-
-	static $MPEGaudioHeaderDecodeCache = array();
-	if (isset($MPEGaudioHeaderDecodeCache[$head4])) {
-		$MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4];
-	} else {
-		$MPEGheaderRawArray = MPEGaudioHeaderDecode($head4);
-		$MPEGaudioHeaderDecodeCache[$head4] = $MPEGheaderRawArray;
-	}
-
-	static $MPEGaudioHeaderValidCache = array();
-
-	// Not in cache
-	if (!isset($MPEGaudioHeaderValidCache[$head4])) {
-		$MPEGaudioHeaderValidCache[$head4] = MPEGaudioHeaderValid($MPEGheaderRawArray);
-	}
-
-	if ($MPEGaudioHeaderValidCache[$head4]) {
-		$ThisFileInfo['mpeg']['audio']['raw'] = $MPEGheaderRawArray;
-	} else {
-		$ThisFileInfo['error'] .= "\n".'Invalid MPEG audio header at offset '.$offset;
-		return false;
-	}
-
-	if (!$FastMPEGheaderScan) {
-
-		$ThisFileInfo['mpeg']['audio']['version']       = $MPEGaudioVersionLookup[$ThisFileInfo['mpeg']['audio']['raw']['version']];
-		$ThisFileInfo['mpeg']['audio']['layer']         = $MPEGaudioLayerLookup[$ThisFileInfo['mpeg']['audio']['raw']['layer']];
-
-		$ThisFileInfo['mpeg']['audio']['channelmode']   = $MPEGaudioChannelModeLookup[$ThisFileInfo['mpeg']['audio']['raw']['channelmode']];
-		$ThisFileInfo['mpeg']['audio']['channels']      = (($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') ? 1 : 2);
-		$ThisFileInfo['mpeg']['audio']['sample_rate']   = $MPEGaudioFrequencyLookup[$ThisFileInfo['mpeg']['audio']['version']][$ThisFileInfo['mpeg']['audio']['raw']['sample_rate']];
-		$ThisFileInfo['mpeg']['audio']['protection']    = !$ThisFileInfo['mpeg']['audio']['raw']['protection'];
-		$ThisFileInfo['mpeg']['audio']['private']       = (bool) $ThisFileInfo['mpeg']['audio']['raw']['private'];
-		$ThisFileInfo['mpeg']['audio']['modeextension'] = $MPEGaudioModeExtensionLookup[$ThisFileInfo['mpeg']['audio']['layer']][$ThisFileInfo['mpeg']['audio']['raw']['modeextension']];
-		$ThisFileInfo['mpeg']['audio']['copyright']     = (bool) $ThisFileInfo['mpeg']['audio']['raw']['copyright'];
-		$ThisFileInfo['mpeg']['audio']['original']      = (bool) $ThisFileInfo['mpeg']['audio']['raw']['original'];
-		$ThisFileInfo['mpeg']['audio']['emphasis']      = $MPEGaudioEmphasisLookup[$ThisFileInfo['mpeg']['audio']['raw']['emphasis']];
-
-		$ThisFileInfo['audio']['channels']    = $ThisFileInfo['mpeg']['audio']['channels'];
-		$ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate'];
-
-		if ($ThisFileInfo['mpeg']['audio']['protection']) {
-			$ThisFileInfo['mpeg']['audio']['crc'] = BigEndian2Int(substr($headerstring, 4, 2));
-		}
-
-	}
-
-	if ($ThisFileInfo['mpeg']['audio']['raw']['bitrate'] == 15) {
-		// http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0
-		$ThisFileInfo['warning'] .= "\n".'Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1';
-		$ThisFileInfo['mpeg']['audio']['raw']['bitrate'] = 0;
-	}
-	$ThisFileInfo['mpeg']['audio']['padding'] = (bool) $ThisFileInfo['mpeg']['audio']['raw']['padding'];
-	$ThisFileInfo['mpeg']['audio']['bitrate'] = $MPEGaudioBitrateLookup[$ThisFileInfo['mpeg']['audio']['version']][$ThisFileInfo['mpeg']['audio']['layer']][$ThisFileInfo['mpeg']['audio']['raw']['bitrate']];
-
-	if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && ($offset == $ThisFileInfo['avdataoffset'])) {
-		// only skip multiple frame check if free-format bitstream found at beginning of file
-		// otherwise is quite possibly simply corrupted data
-		$recursivesearch = false;
-	}
-
-	// For Layer II there are some combinations of bitrate and mode which are not allowed.
-	if (!$FastMPEGheaderScan && ($ThisFileInfo['mpeg']['audio']['layer'] == 'II')) {
-
-		$ThisFileInfo['audio']['dataformat'] = 'mp2';
-		switch ($ThisFileInfo['mpeg']['audio']['channelmode']) {
-
-			case 'mono':
-				if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') || ($ThisFileInfo['mpeg']['audio']['bitrate'] <= 192)) {
-					// these are ok
-				} else {
-					$ThisFileInfo['error'] .= "\n".$ThisFileInfo['mpeg']['audio']['bitrate'].'kbps not allowed in Layer II, '.$ThisFileInfo['mpeg']['audio']['channelmode'].'.';
-					return false;
-				}
-				break;
-
-			case 'stereo':
-			case 'joint stereo':
-			case 'dual channel':
-				if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') || ($ThisFileInfo['mpeg']['audio']['bitrate'] == 64) || ($ThisFileInfo['mpeg']['audio']['bitrate'] >= 96)) {
-					// these are ok
-				} else {
-					$ThisFileInfo['error'] .= "\n".$ThisFileInfo['mpeg']['audio']['bitrate'].'kbps not allowed in Layer II, '.$ThisFileInfo['mpeg']['audio']['channelmode'].'.';
-					return false;
-				}
-				break;
-
-		}
-
-	}
-
-
-	if ($ThisFileInfo['audio']['sample_rate'] > 0) {
-		$ThisFileInfo['mpeg']['audio']['framelength'] = MPEGaudioFrameLength($ThisFileInfo['mpeg']['audio']['bitrate'], $ThisFileInfo['mpeg']['audio']['version'], $ThisFileInfo['mpeg']['audio']['layer'], (int) $ThisFileInfo['mpeg']['audio']['padding'], $ThisFileInfo['audio']['sample_rate']);
-	}
-
-	if ($ThisFileInfo['mpeg']['audio']['bitrate'] != 'free') {
-
-		$ThisFileInfo['audio']['bitrate'] = 1000 * $ThisFileInfo['mpeg']['audio']['bitrate'];
-
-		if (isset($ThisFileInfo['mpeg']['audio']['framelength'])) {
-			$nextframetestoffset = $offset + $ThisFileInfo['mpeg']['audio']['framelength'];
-		} else {
-			$ThisFileInfo['error'] .= "\n".'Frame at offset('.$offset.') is has an invalid frame length.';
-			return false;
-		}
-
-	}
-
-	$ExpectedNumberOfAudioBytes = 0;
-
-	////////////////////////////////////////////////////////////////////////////////////
-	// Variable-bitrate headers
-
-	if (substr($headerstring, 4 + 32, 4) == 'VBRI') {
-		// Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36)
-		// specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html
-
-		$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr';
-		$ThisFileInfo['mpeg']['audio']['VBR_method']   = 'Fraunhofer';
-		$ThisFileInfo['audio']['codec']                = 'Fraunhofer';
-
-		$SideInfoData = substr($headerstring, 4 + 2, 32);
-
-		$FraunhoferVBROffset = 36;
-
-		$ThisFileInfo['mpeg']['audio']['VBR_encoder_version']     = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  4, 2));
-		$ThisFileInfo['mpeg']['audio']['VBR_encoder_delay']       = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  6, 2));
-		$ThisFileInfo['mpeg']['audio']['VBR_quality']             = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  8, 2));
-		$ThisFileInfo['mpeg']['audio']['VBR_bytes']               = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4));
-		$ThisFileInfo['mpeg']['audio']['VBR_frames']              = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4));
-		$ThisFileInfo['mpeg']['audio']['VBR_seek_offsets']        = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2));
-		//$ThisFileInfo['mpeg']['audio']['reserved']              = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 4)); // hardcoded $00 $01 $00 $02  - purpose unknown
-		$ThisFileInfo['mpeg']['audio']['VBR_seek_offsets_stride'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2));
-
-		$ExpectedNumberOfAudioBytes = $ThisFileInfo['mpeg']['audio']['VBR_bytes'];
-
-		$previousbyteoffset = $offset;
-		for ($i = 0; $i < $ThisFileInfo['mpeg']['audio']['VBR_seek_offsets']; $i++) {
-			$Fraunhofer_OffsetN = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, 2));
-			$FraunhoferVBROffset += 2;
-			$ThisFileInfo['mpeg']['audio']['VBR_offsets_relative'][$i] = $Fraunhofer_OffsetN;
-			$ThisFileInfo['mpeg']['audio']['VBR_offsets_absolute'][$i] = $Fraunhofer_OffsetN + $previousbyteoffset;
-			$previousbyteoffset += $Fraunhofer_OffsetN;
-		}
-
-
-	} else {
-
-		// Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36)
-		// depending on MPEG layer and number of channels
-
-		if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-			if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') {
-				// MPEG-1 (mono)
-				$VBRidOffset  = 4 + 17; // 0x15
-				$SideInfoData = substr($headerstring, 4 + 2, 17);
-			} else {
-				// MPEG-1 (stereo, joint-stereo, dual-channel)
-				$VBRidOffset = 4 + 32; // 0x24
-				$SideInfoData = substr($headerstring, 4 + 2, 32);
-			}
-		} else { // 2 or 2.5
-			if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') {
-				// MPEG-2, MPEG-2.5 (mono)
-				$VBRidOffset = 4 + 9;  // 0x0D
-				$SideInfoData = substr($headerstring, 4 + 2, 9);
-			} else {
-				// MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel)
-				$VBRidOffset = 4 + 17; // 0x15
-				$SideInfoData = substr($headerstring, 4 + 2, 17);
-			}
-		}
-
-		if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) {
-			// 'Xing' is traditional Xing VBR frame
-			// 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.)
-
-			$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr';
-			$ThisFileInfo['mpeg']['audio']['VBR_method']   = 'Xing';
-
-			$ThisFileInfo['mpeg']['audio']['xing_flags_raw'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4));
-
-			$ThisFileInfo['mpeg']['audio']['xing_flags']['frames']    = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000001);
-			$ThisFileInfo['mpeg']['audio']['xing_flags']['bytes']     = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000002);
-			$ThisFileInfo['mpeg']['audio']['xing_flags']['toc']       = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000004);
-			$ThisFileInfo['mpeg']['audio']['xing_flags']['vbr_scale'] = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000008);
-
-			if ($ThisFileInfo['mpeg']['audio']['xing_flags']['frames']) {
-				$ThisFileInfo['mpeg']['audio']['VBR_frames'] = BigEndian2Int(substr($headerstring, $VBRidOffset +  8, 4));
-			}
-			if ($ThisFileInfo['mpeg']['audio']['xing_flags']['bytes']) {
-				$ThisFileInfo['mpeg']['audio']['VBR_bytes']  = BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4));
-			}
-
-			if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && !empty($ThisFileInfo['mpeg']['audio']['VBR_frames']) && !empty($ThisFileInfo['mpeg']['audio']['VBR_bytes'])) {
-				$framelengthfloat = $ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames'];
-				if ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') {
-					// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12
-					$ThisFileInfo['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 12;
-				} else {
-					// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144
-					$ThisFileInfo['audio']['bitrate'] = (($framelengthfloat - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 144;
-				}
-				$ThisFileInfo['mpeg']['audio']['framelength'] = floor($framelengthfloat);
-			}
-
-			if ($ThisFileInfo['mpeg']['audio']['xing_flags']['toc']) {
-				$LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100);
-				for ($i = 0; $i < 100; $i++) {
-					$ThisFileInfo['mpeg']['audio']['toc'][$i] = ord($LAMEtocData{$i});
-				}
-			}
-			if ($ThisFileInfo['mpeg']['audio']['xing_flags']['vbr_scale']) {
-				$ThisFileInfo['mpeg']['audio']['VBR_scale'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4));
-			}
-
-			// http://gabriel.mp3-tech.org/mp3infotag.html
-			if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') {
-				$ThisFileInfo['mpeg']['audio']['LAME']['long_version']  = substr($headerstring, $VBRidOffset + 120, 20);
-				$ThisFileInfo['mpeg']['audio']['LAME']['short_version'] = substr($ThisFileInfo['mpeg']['audio']['LAME']['long_version'], 0, 9);
-				$ThisFileInfo['mpeg']['audio']['LAME']['long_version']  = rtrim($ThisFileInfo['mpeg']['audio']['LAME']['long_version'], "\x55\xAA");
-
-				if ($ThisFileInfo['mpeg']['audio']['LAME']['short_version'] >= 'LAME3.90.') {
-
-					// It the LAME tag was only introduced in LAME v3.90
-					// http://www.hydrogenaudio.org/?act=ST&f=15&t=9933
-
-					// Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html
-					// are assuming a 'Xing' identifier offset of 0x24, which is the case for
-					// MPEG-1 non-mono, but not for other combinations
-					$LAMEtagOffsetContant = $VBRidOffset - 0x24;
-
-					// byte $9B  VBR Quality
-					// This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications.
-					// Actually overwrites original Xing bytes
-					unset($ThisFileInfo['mpeg']['audio']['VBR_scale']);
-					$ThisFileInfo['mpeg']['audio']['LAME']['vbr_quality'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1));
-
-					// bytes $9C-$A4  Encoder short VersionString
-					$ThisFileInfo['mpeg']['audio']['LAME']['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9);
-					$ThisFileInfo['mpeg']['audio']['LAME']['long_version']  = $ThisFileInfo['mpeg']['audio']['LAME']['short_version'];
-
-					// byte $A5  Info Tag revision + VBR method
-					$LAMEtagRevisionVBRmethod = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));
-
-					$ThisFileInfo['mpeg']['audio']['LAME']['tag_revision']      = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;
-					$ThisFileInfo['mpeg']['audio']['LAME']['vbr_method']        = LAMEvbrMethodLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method']);
-
-					// byte $A6  Lowpass filter value
-					$ThisFileInfo['mpeg']['audio']['LAME']['lowpass_frequency'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100;
-
-					// bytes $A7-$AE  Replay Gain
-					// http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html
-					// bytes $A7-$AA : 32 bit floating point "Peak signal amplitude"
-					$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] = BigEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4));
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio']      =   BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2));
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] =   BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2));
-
-					if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] == 0) {
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] = false;
-					}
-
-					if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] != 0) {
-						require_once(GETID3_INCLUDEPATH.'getid3.rgad.php');
-
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['name']        = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0xE000) >> 13;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['originator']  = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x1C00) >> 10;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['sign_bit']    = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x0200) >> 9;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['gain_adjust'] =  $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x01FF;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['name']       = RGADnameLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['name']);
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['originator'] = RGADoriginatorLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['originator']);
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['gain_db']    = RGADadjustmentLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['gain_adjust'], $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['sign_bit']);
-
-						if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] !== false) {
-							$ThisFileInfo['replay_gain']['radio']['peak']   = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'];
-						}
-						$ThisFileInfo['replay_gain']['radio']['originator'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['originator'];
-						$ThisFileInfo['replay_gain']['radio']['adjustment'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['gain_db'];
-					}
-					if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] != 0) {
-						require_once(GETID3_INCLUDEPATH.'getid3.rgad.php');
-
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['name']        = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0xE000) >> 13;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['originator']  = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x1C00) >> 10;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['sign_bit']    = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x0200) >> 9;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['gain_adjust'] = $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x01FF;
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['name']       = RGADnameLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['name']);
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['originator'] = RGADoriginatorLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['originator']);
-						$ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['gain_db']    = RGADadjustmentLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['gain_adjust'], $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['sign_bit']);
-
-						if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] !== false) {
-							$ThisFileInfo['replay_gain']['audiophile']['peak']   = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'];
-						}
-						$ThisFileInfo['replay_gain']['audiophile']['originator'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['originator'];
-						$ThisFileInfo['replay_gain']['audiophile']['adjustment'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['gain_db'];
-					}
-
-
-					// byte $AF  Encoding flags + ATH Type
-					$EncodingFlagsATHtype = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1));
-					$ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nspsytune']   = (bool) ($EncodingFlagsATHtype & 0x10);
-					$ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20);
-					$ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nogap_next']  = (bool) ($EncodingFlagsATHtype & 0x40);
-					$ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nogap_prev']  = (bool) ($EncodingFlagsATHtype & 0x80);
-					$ThisFileInfo['mpeg']['audio']['LAME']['ath_type']                      =         $EncodingFlagsATHtype & 0x0F;
-
-					// byte $B0  if ABR {specified bitrate} else {minimal bitrate}
-					$ABRbitrateMinBitrate = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1));
-					if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] == 2) { // Average BitRate (ABR)
-						$ThisFileInfo['mpeg']['audio']['LAME']['bitrate_abr'] = $ABRbitrateMinBitrate;
-					} elseif ($ABRbitrateMinBitrate > 0) { // Variable BitRate (VBR) - minimum bitrate
-						$ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min'] = $ABRbitrateMinBitrate;
-					}
-
-					// bytes $B1-$B3  Encoder delays
-					$EncoderDelays = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3));
-					$ThisFileInfo['mpeg']['audio']['LAME']['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12;
-					$ThisFileInfo['mpeg']['audio']['LAME']['end_padding']   =  $EncoderDelays & 0x000FFF;
-
-					// byte $B4  Misc
-					$MiscByte = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1));
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['noise_shaping']       = ($MiscByte & 0x03);
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['stereo_mode']         = ($MiscByte & 0x1C) >> 2;
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['not_optimal_quality'] = ($MiscByte & 0x20) >> 5;
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['source_sample_freq']  = ($MiscByte & 0xC0) >> 6;
-					$ThisFileInfo['mpeg']['audio']['LAME']['noise_shaping']       = $ThisFileInfo['mpeg']['audio']['LAME']['raw']['noise_shaping'];
-					$ThisFileInfo['mpeg']['audio']['LAME']['stereo_mode']         = LAMEmiscStereoModeLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['stereo_mode']);
-					$ThisFileInfo['mpeg']['audio']['LAME']['not_optimal_quality'] = (bool) $ThisFileInfo['mpeg']['audio']['LAME']['raw']['not_optimal_quality'];
-					$ThisFileInfo['mpeg']['audio']['LAME']['source_sample_freq']  = LAMEmiscSourceSampleFrequencyLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['source_sample_freq']);
-
-					// byte $B5  MP3 Gain
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['mp3_gain'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true);
-					$ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_db']     = 1.5 * $ThisFileInfo['mpeg']['audio']['LAME']['raw']['mp3_gain'];
-					$ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_factor'] = pow(2, ($ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_db'] / 6));
-
-					// bytes $B6-$B7  Preset and surround info
-					$PresetSurroundBytes = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2));
-					// Reserved                                                    = ($PresetSurroundBytes & 0xC000);
-					$ThisFileInfo['mpeg']['audio']['LAME']['raw']['surround_info'] = ($PresetSurroundBytes & 0x3800);
-					$ThisFileInfo['mpeg']['audio']['LAME']['surround_info']        = LAMEsurroundInfoLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['surround_info']);
-					$ThisFileInfo['mpeg']['audio']['LAME']['preset_used_id']       = ($PresetSurroundBytes & 0x07FF);
-
-					// bytes $B8-$BB  MusicLength
-					$ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4));
-					$ExpectedNumberOfAudioBytes = (($ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] > 0) ? $ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] : $ThisFileInfo['mpeg']['audio']['VBR_bytes']);
-
-					// bytes $BC-$BD  MusicCRC
-					$ThisFileInfo['mpeg']['audio']['LAME']['music_crc']    = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2));
-
-					// bytes $BE-$BF  CRC-16 of Info Tag
-					$ThisFileInfo['mpeg']['audio']['LAME']['lame_tag_crc'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2));
-
-
-					// LAME CBR
-					if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] == 1) {
-
-						$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr';
-						if (empty($ThisFileInfo['mpeg']['audio']['bitrate']) || ($ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min'] != 255)) {
-							$ThisFileInfo['mpeg']['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min'];
-						}
-
-					}
-
-				}
-			}
-
-		} else {
-
-			// not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header)
-			$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr';
-			if ($recursivesearch) {
-				$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr';
-				if (RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, true)) {
-					$recursivesearch = false;
-					$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr';
-				}
-				if ($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') {
-					$ThisFileInfo['warning'] .= "\n".'VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.';
-				}
-			}
-
-		}
-
-	}
-
-	if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']))) {
-		if (($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) == 1) {
-			$ThisFileInfo['warning'] .= "\n".'Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)';
-		} elseif ($ExpectedNumberOfAudioBytes > ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) {
-			$ThisFileInfo['warning'] .= "\n".'Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])).' bytes)';
-		} else {
-			$ThisFileInfo['warning'] .= "\n".'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' ('.(($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)';
-		}
-	}
-
-	if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && empty($ThisFileInfo['audio']['bitrate'])) {
-		if (($offset == $ThisFileInfo['avdataoffset']) && empty($ThisFileInfo['mpeg']['audio']['VBR_frames'])) {
-			$framebytelength = FreeFormatFrameLength($fd, $offset, $ThisFileInfo, true);
-			if ($framebytelength > 0) {
-				$ThisFileInfo['mpeg']['audio']['framelength'] = $framebytelength;
-				if ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') {
-					// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12
-					$ThisFileInfo['audio']['bitrate'] = ((($framebytelength / 4) - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 12;
-				} else {
-					// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144
-					$ThisFileInfo['audio']['bitrate'] = (($framebytelength - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 144;
-				}
-			} else {
-				$ThisFileInfo['error'] .= "\n".'Error calculating frame length of free-format MP3 without Xing/LAME header';
-			}
-		}
-	}
-
-	if (($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') && isset($ThisFileInfo['mpeg']['audio']['VBR_frames']) && ($ThisFileInfo['mpeg']['audio']['VBR_frames'] > 1)) {
-		$ThisFileInfo['mpeg']['audio']['VBR_frames']--; // don't count the Xing / VBRI frame
-		if (($ThisFileInfo['mpeg']['audio']['version'] == '1') && ($ThisFileInfo['mpeg']['audio']['layer'] == 'I')) {
-			$ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 384)) / 1000;
-		} elseif ((($ThisFileInfo['mpeg']['audio']['version'] == '2') || ($ThisFileInfo['mpeg']['audio']['version'] == '2.5')) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'III')) {
-			$ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 576)) / 1000;
-		} else {
-			$ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 1152)) / 1000;
-		}
-		if ($ThisFileInfo['mpeg']['audio']['VBR_bitrate'] > 0) {
-			$ThisFileInfo['audio']['bitrate']         = 1000 * $ThisFileInfo['mpeg']['audio']['VBR_bitrate'];
-			$ThisFileInfo['mpeg']['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['VBR_bitrate']; // to avoid confusion
-		}
-	}
-
-	// End variable-bitrate headers
-	////////////////////////////////////////////////////////////////////////////////////
-
-	if ($recursivesearch) {
-
-		if (!RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, $ScanAsCBR)) {
-			return false;
-		}
-
-	}
-
-
-	//if (false) {
-	//	// experimental side info parsing section - not returning anything useful yet
-	//
-	//	$SideInfoBitstream = BigEndian2Bin($SideInfoData);
-	//	$SideInfoOffset = 0;
-	//
-	//	if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-	//		if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') {
-	//			// MPEG-1 (mono)
-	//			$ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
-	//			$SideInfoOffset += 9;
-	//			$SideInfoOffset += 5;
-	//		} else {
-	//			// MPEG-1 (stereo, joint-stereo, dual-channel)
-	//			$ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);
-	//			$SideInfoOffset += 9;
-	//			$SideInfoOffset += 3;
-	//		}
-	//	} else { // 2 or 2.5
-	//		if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') {
-	//			// MPEG-2, MPEG-2.5 (mono)
-	//			$ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
-	//			$SideInfoOffset += 8;
-	//			$SideInfoOffset += 1;
-	//		} else {
-	//			// MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel)
-	//			$ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);
-	//			$SideInfoOffset += 8;
-	//			$SideInfoOffset += 2;
-	//		}
-	//	}
-	//
-	//	if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-	//		for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) {
-	//			for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) {
-	//				$ThisFileInfo['mpeg']['audio']['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//				$SideInfoOffset += 2;
-	//			}
-	//		}
-	//	}
-	//	for ($granule = 0; $granule < (($ThisFileInfo['mpeg']['audio']['version'] == '1') ? 2 : 1); $granule++) {
-	//		for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) {
-	//			$ThisFileInfo['mpeg']['audio']['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12);
-	//			$SideInfoOffset += 12;
-	//			$ThisFileInfo['mpeg']['audio']['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
-	//			$SideInfoOffset += 9;
-	//			$ThisFileInfo['mpeg']['audio']['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8);
-	//			$SideInfoOffset += 8;
-	//			if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-	//				$ThisFileInfo['mpeg']['audio']['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
-	//				$SideInfoOffset += 4;
-	//			} else {
-	//				$ThisFileInfo['mpeg']['audio']['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);
-	//				$SideInfoOffset += 9;
-	//			}
-	//			$ThisFileInfo['mpeg']['audio']['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//			$SideInfoOffset += 1;
-	//
-	//			if ($ThisFileInfo['mpeg']['audio']['window_switching_flag'][$granule][$channel] == '1') {
-	//
-	//				$ThisFileInfo['mpeg']['audio']['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2);
-	//				$SideInfoOffset += 2;
-	//				$ThisFileInfo['mpeg']['audio']['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//				$SideInfoOffset += 1;
-	//
-	//				for ($region = 0; $region < 2; $region++) {
-	//					$ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
-	//					$SideInfoOffset += 5;
-	//				}
-	//				$ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][2] = 0;
-	//
-	//				for ($window = 0; $window < 3; $window++) {
-	//					$ThisFileInfo['mpeg']['audio']['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3);
-	//					$SideInfoOffset += 3;
-	//				}
-	//
-	//			} else {
-	//
-	//				for ($region = 0; $region < 3; $region++) {
-	//					$ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);
-	//					$SideInfoOffset += 5;
-	//				}
-	//
-	//				$ThisFileInfo['mpeg']['audio']['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);
-	//				$SideInfoOffset += 4;
-	//				$ThisFileInfo['mpeg']['audio']['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3);
-	//				$SideInfoOffset += 3;
-	//				$ThisFileInfo['mpeg']['audio']['block_type'][$granule][$channel] = 0;
-	//			}
-	//
-	//			if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-	//				$ThisFileInfo['mpeg']['audio']['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//				$SideInfoOffset += 1;
-	//			}
-	//			$ThisFileInfo['mpeg']['audio']['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//			$SideInfoOffset += 1;
-	//			$ThisFileInfo['mpeg']['audio']['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);
-	//			$SideInfoOffset += 1;
-	//		}
-	//	}
-	//}
-
-	return true;
-}
-
-function RecursiveFrameScanning(&$fd, &$ThisFileInfo, &$offset, &$nextframetestoffset, $ScanAsCBR) {
-	for ($i = 0; $i < MPEG_VALID_CHECK_FRAMES; $i++) {
-		// check next MPEG_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch
-		if (($nextframetestoffset + 4) >= $ThisFileInfo['avdataend']) {
-			// end of file
-			return true;
-		}
-
-		$nextframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']);
-		if (decodeMPEGaudioHeader($fd, $nextframetestoffset, $nextframetestarray, false)) {
-			if ($ScanAsCBR) {
-				// force CBR mode, used for trying to pick out invalid audio streams with
-				// valid(?) VBR headers, or VBR streams with no VBR header
-				if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($ThisFileInfo['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $ThisFileInfo['mpeg']['audio']['bitrate'])) {
-					return false;
-				}
-			}
-
-
-			// next frame is OK, get ready to check the one after that
-			if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) {
-				$nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength'];
-			} else {
-				$ThisFileInfo['error'] .= "\n".'Frame at offset ('.$offset.') is has an invalid frame length.';
-				return false;
-			}
-
-		} else {
-
-			// next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence
-			$ThisFileInfo['error'] .= "\n".'Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.';
-
-			return false;
-		}
-	}
-	return true;
-}
-
-function FreeFormatFrameLength($fd, $offset, &$ThisFileInfo, $deepscan=false) {
-	fseek($fd, $offset, SEEK_SET);
-	$MPEGaudioData = fread($fd, 32768);
-
-	$SyncPattern1 = substr($MPEGaudioData, 0, 4);
-	// may be different pattern due to padding
-	$SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3};
-	if ($SyncPattern2 === $SyncPattern1) {
-		$SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3};
-	}
-
-	$framelength = false;
-	$framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4);
-	$framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4);
-	if ($framelength1 > 4) {
-		$framelength = $framelength1;
-	}
-	if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
-		$framelength = $framelength2;
-	}
-	if (!$framelength) {
-
-		// LAME 3.88 has a different value for modeextension on the first frame vs the rest
-		$framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4);
-		$framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4);
-
-		if ($framelength1 > 4) {
-			$framelength = $framelength1;
-		}
-		if (($framelength2 > 4) && ($framelength2 < $framelength1)) {
-			$framelength = $framelength2;
-		}
-		if (!$framelength) {
-			$ThisFileInfo['error'] .= "\n".'Cannot find next free-format synch pattern ('.PrintHexBytes($SyncPattern1).' or '.PrintHexBytes($SyncPattern2).') after offset '.$offset;
-			return false;
-		} else {
-			$ThisFileInfo['warning'] .= "\n".'ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)';
-			$ThisFileInfo['audio']['codec']   = 'LAME';
-			$ThisFileInfo['audio']['encoder'] = 'LAME3.88';
-			$SyncPattern1 = substr($SyncPattern1, 0, 3);
-			$SyncPattern2 = substr($SyncPattern2, 0, 3);
-		}
-	}
-
-	if ($deepscan) {
-
-		$ActualFrameLengthValues = array();
-		$nextoffset = $offset + $framelength;
-		while ($nextoffset < ($ThisFileInfo['avdataend'] - 6)) {
-			fseek($fd, $nextoffset - 1, SEEK_SET);
-			$NextSyncPattern = fread($fd, 6);
-			if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) {
-				// good - found where expected
-				$ActualFrameLengthValues[] = $framelength;
-			} elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) {
-				// ok - found one byte earlier than expected (last frame wasn't padded, first frame was)
-				$ActualFrameLengthValues[] = ($framelength - 1);
-				$nextoffset--;
-			} elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) {
-				// ok - found one byte later than expected (last frame was padded, first frame wasn't)
-				$ActualFrameLengthValues[] = ($framelength + 1);
-				$nextoffset++;
-			} else {
-				$ThisFileInfo['error'] .= "\n".'Did not find expected free-format sync pattern at offset '.$nextoffset;
-				return false;
-			}
-			$nextoffset += $framelength;
-		}
-		if (count($ActualFrameLengthValues) > 0) {
-			$framelength = round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues));
-		}
-	}
-	return $framelength;
-}
-
-
-function getOnlyMPEGaudioInfo($fd, &$ThisFileInfo, $avdataoffset, $BitrateHistogram=false) {
-	// looks for synch, decodes MPEG audio header
-
-	fseek($fd, $avdataoffset, SEEK_SET);
-	$header = '';
-	$SynchSeekOffset = 0;
-
-	if (!defined('CONST_FF')) {
-		define('CONST_FF', chr(0xFF));
-		define('CONST_E0', chr(0xE0));
-	}
-
-	static $MPEGaudioVersionLookup;
-	static $MPEGaudioLayerLookup;
-	static $MPEGaudioBitrateLookup;
-	if (empty($MPEGaudioVersionLookup)) {
-		$MPEGaudioVersionLookup = MPEGaudioVersionArray();
-		$MPEGaudioLayerLookup   = MPEGaudioLayerArray();
-		$MPEGaudioBitrateLookup = MPEGaudioBitrateArray();
-
-	}
-
-	$header_len = strlen($header) - round(32768 / 2);
-	while (true) {
-
-		if (($SynchSeekOffset > $header_len) && (($avdataoffset + $SynchSeekOffset)  < $ThisFileInfo['avdataend']) && !feof($fd)) {
-
-			if ($SynchSeekOffset > 131072) {
-				// if a synch's not found within the first 128k bytes, then give up
-				$ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch within the first 131072 bytes';
-				if (isset($ThisFileInfo['audio']['bitrate'])) {
-					unset($ThisFileInfo['audio']['bitrate']);
-				}
-				if (isset($ThisFileInfo['mpeg']['audio'])) {
-					unset($ThisFileInfo['mpeg']['audio']);
-				}
-				if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) {
-					unset($ThisFileInfo['mpeg']);
-				}
-				return false;
-
-			} elseif ($header .= fread($fd, 32768)) {
-
-				// great
-				$header_len = strlen($header) - round(32768 / 2);
-
-			} else {
-
-				$ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file';
-				if (isset($ThisFileInfo['audio']['bitrate'])) {
-					unset($ThisFileInfo['audio']['bitrate']);
-				}
-				if (isset($ThisFileInfo['mpeg']['audio'])) {
-					unset($ThisFileInfo['mpeg']['audio']);
-				}
-				if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) {
-					unset($ThisFileInfo['mpeg']);
-				}
-				return false;
-
-			}
-		}
-
-		if (($SynchSeekOffset + 1) >= strlen($header)) {
-			$ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file';
-			return false;
-		}
-
-		if (($header{$SynchSeekOffset} == CONST_FF) && ($header{($SynchSeekOffset + 1)} > CONST_E0)) { // synch detected
-
-			if (!isset($FirstFrameThisfileInfo) && !isset($ThisFileInfo['mpeg']['audio'])) {
-				$FirstFrameThisfileInfo = $ThisFileInfo;
-				$FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset;
-				if (!decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $FirstFrameThisfileInfo, false)) {
-					// if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's
-					// garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below
-					unset($FirstFrameThisfileInfo);
-				}
-			}
-			$dummy = $ThisFileInfo; // only overwrite real data if valid header found
-
-			if (decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $dummy, true)) {
-
-				$ThisFileInfo = $dummy;
-				$ThisFileInfo['avdataoffset'] = $avdataoffset + $SynchSeekOffset;
-				switch ($ThisFileInfo['fileformat']) {
-					case '':
-					case 'id3':
-					case 'ape':
-					case 'mp3':
-						$ThisFileInfo['fileformat']               = 'mp3';
-						$ThisFileInfo['audio']['dataformat']      = 'mp3';
-				}
-				if (isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) {
-					if (!CloseMatch($ThisFileInfo['audio']['bitrate'], $FirstFrameThisfileInfo['audio']['bitrate'], 1)) {
-						// If there is garbage data between a valid VBR header frame and a sequence
-						// of valid MPEG-audio frames the VBR data is no longer discarded.
-						$ThisFileInfo = $FirstFrameThisfileInfo;
-						$ThisFileInfo['avdataoffset']        = $FirstFrameAVDataOffset;
-						$ThisFileInfo['fileformat']          = 'mp3';
-						$ThisFileInfo['audio']['dataformat'] = 'mp3';
-						$dummy                               = $ThisFileInfo;
-						unset($dummy['mpeg']['audio']);
-						$GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength'];
-						$GarbageOffsetEnd   = $avdataoffset + $SynchSeekOffset;
-						if (decodeMPEGaudioHeader($fd, $GarbageOffsetEnd, $dummy, true, true)) {
-
-							$ThisFileInfo = $dummy;
-							$ThisFileInfo['avdataoffset'] = $GarbageOffsetEnd;
-							$ThisFileInfo['warning'] .= "\n".'apparently-valid VBR header not used because could not find '.MPEG_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd;
-
-						} else {
-
-							$ThisFileInfo['warning'] .= "\n".'using data from VBR header even though could not find '.MPEG_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')';
-
-						}
-					}
-				}
-
-				if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode']) && ($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($ThisFileInfo['mpeg']['audio']['VBR_method'])) {
-					// VBR file with no VBR header
-					$BitrateHistogram = true;
-				}
-
-				if ($BitrateHistogram) {
-
-					$ThisFileInfo['mpeg']['audio']['stereo_distribution']  = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0);
-					$ThisFileInfo['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0);
-
-					if ($ThisFileInfo['mpeg']['audio']['version'] == '1') {
-						if ($ThisFileInfo['mpeg']['audio']['layer'] == 'III') {
-							$ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 40=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 320=>0);
-						} elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'II') {
-							$ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 320=>0, 384=>0);
-						} elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') {
-							$ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 64=>0, 96=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 288=>0, 320=>0, 352=>0, 384=>0, 416=>0, 448=>0);
-						}
-					} elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') {
-						$ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 144=>0, 160=>0, 176=>0, 192=>0, 224=>0, 256=>0);
-					} else {
-						$ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8=>0, 16=>0, 24=>0, 32=>0, 40=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 144=>0, 160=>0);
-					}
-
-					$dummy = array('error'=>$ThisFileInfo['error'], 'warning'=>$ThisFileInfo['warning'], 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']);
-					$synchstartoffset = $ThisFileInfo['avdataoffset'];
-
-					$FastMode = false;
-					while (decodeMPEGaudioHeader($fd, $synchstartoffset, $dummy, false, false, $FastMode)) {
-						$FastMode = true;
-						$thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']];
-
-						$ThisFileInfo['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]++;
-						$ThisFileInfo['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]++;
-						$ThisFileInfo['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]++;
-						if (empty($dummy['mpeg']['audio']['framelength'])) {
-							$ThisFileInfo['warning'] .= "\n".'Invalid/missing framelength in histogram analysis - aborting';
-$synchstartoffset += 4;
-//							return false;
-						}
-						$synchstartoffset += $dummy['mpeg']['audio']['framelength'];
-					}
-
-					$bittotal     = 0;
-					$framecounter = 0;
-					foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) {
-						$framecounter += $bitratecount;
-						if ($bitratevalue != 'free') {
-							$bittotal += ($bitratevalue * $bitratecount);
-						}
-					}
-					if ($framecounter == 0) {
-						$ThisFileInfo['error'] .= "\n".'Corrupt MP3 file: framecounter == zero';
-						return false;
-					}
-					$ThisFileInfo['mpeg']['audio']['frame_count'] = $framecounter;
-					$ThisFileInfo['mpeg']['audio']['bitrate']     = 1000 * ($bittotal / $framecounter);
-
-					$ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate'];
-
-
-					// Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently
-					$distinct_bitrates = 0;
-					foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) {
-						if ($bitrate_count > 0) {
-							$distinct_bitrates++;
-						}
-					}
-					if ($distinct_bitrates > 1) {
-						$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr';
-					} else {
-						$ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr';
-					}
-					$ThisFileInfo['audio']['bitrate_mode'] = $ThisFileInfo['mpeg']['audio']['bitrate_mode'];
-
-				}
-
-				break; // exit while()
-			}
-		}
-
-		$SynchSeekOffset++;
-		if (($avdataoffset + $SynchSeekOffset) >= $ThisFileInfo['avdataend']) {
-			// end of file/data
-
-			if (empty($ThisFileInfo['mpeg']['audio'])) {
-
-				$ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file';
-				if (isset($ThisFileInfo['audio']['bitrate'])) {
-					unset($ThisFileInfo['audio']['bitrate']);
-				}
-				if (isset($ThisFileInfo['mpeg']['audio'])) {
-					unset($ThisFileInfo['mpeg']['audio']);
-				}
-				if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || empty($ThisFileInfo['mpeg']))) {
-					unset($ThisFileInfo['mpeg']);
-				}
-				return false;
-
-			}
-			break;
-		}
-
-	}
-	$ThisFileInfo['audio']['bits_per_sample'] = 16;
-	$ThisFileInfo['audio']['channels']        = $ThisFileInfo['mpeg']['audio']['channels'];
-	$ThisFileInfo['audio']['channelmode']     = $ThisFileInfo['mpeg']['audio']['channelmode'];
-	$ThisFileInfo['audio']['sample_rate']     = $ThisFileInfo['mpeg']['audio']['sample_rate'];
-	return true;
-}
-
-
-function MPEGaudioVersionArray() {
-	static $MPEGaudioVersion = array('2.5', false, '2', '1');
-	return $MPEGaudioVersion;
-}
-
-function MPEGaudioLayerArray() {
-	static $MPEGaudioLayer = array(false, 'III', 'II', 'I');
-	return $MPEGaudioLayer;
-}
-
-function MPEGaudioBitrateArray() {
-	static $MPEGaudioBitrate;
-	if (empty($MPEGaudioBitrate)) {
-		$MPEGaudioBitrate['1']['I']     = array('free', 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448);
-		$MPEGaudioBitrate['1']['II']    = array('free', 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384);
-		$MPEGaudioBitrate['1']['III']   = array('free', 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320);
-		$MPEGaudioBitrate['2']['I']     = array('free', 32, 48, 56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256);
-		$MPEGaudioBitrate['2']['II']    = array('free',  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160);
-		$MPEGaudioBitrate['2']['III']   = $MPEGaudioBitrate['2']['II'];
-		$MPEGaudioBitrate['2.5']['I']   = $MPEGaudioBitrate['2']['I'];
-		$MPEGaudioBitrate['2.5']['II']  = $MPEGaudioBitrate['2']['II'];
-		$MPEGaudioBitrate['2.5']['III'] = $MPEGaudioBitrate['2']['III'];
-	}
-	return $MPEGaudioBitrate;
-}
-
-function MPEGaudioFrequencyArray() {
-	static $MPEGaudioFrequency;
-	if (empty($MPEGaudioFrequency)) {
-		$MPEGaudioFrequency['1']   = array(44100, 48000, 32000);
-		$MPEGaudioFrequency['2']   = array(22050, 24000, 16000);
-		$MPEGaudioFrequency['2.5'] = array(11025, 12000,  8000);
-	}
-	return $MPEGaudioFrequency;
-}
-
-function MPEGaudioChannelModeArray() {
-	static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono');
-	return $MPEGaudioChannelMode;
-}
-
-function MPEGaudioModeExtensionArray() {
-	static $MPEGaudioModeExtension;
-	if (empty($MPEGaudioModeExtension)) {
-		$MPEGaudioModeExtension['I']   = array('4-31', '8-31', '12-31', '16-31');
-		$MPEGaudioModeExtension['II']  = array('4-31', '8-31', '12-31', '16-31');
-		$MPEGaudioModeExtension['III'] = array('', 'IS', 'MS', 'IS+MS');
-	}
-	return $MPEGaudioModeExtension;
-}
-
-function MPEGaudioEmphasisArray() {
-	static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17');
-	return $MPEGaudioEmphasis;
-}
-
-
-function MPEGaudioHeaderBytesValid($head4) {
-	return MPEGaudioHeaderValid(MPEGaudioHeaderDecode($head4));
-}
-
-function MPEGaudioHeaderValid($rawarray, $echoerrors=false) {
-
-	if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) {
-		return false;
-	}
-
-	static $MPEGaudioVersionLookup;
-	static $MPEGaudioLayerLookup;
-	static $MPEGaudioBitrateLookup;
-	static $MPEGaudioFrequencyLookup;
-	static $MPEGaudioChannelModeLookup;
-	static $MPEGaudioModeExtensionLookup;
-	static $MPEGaudioEmphasisLookup;
-	if (empty($MPEGaudioVersionLookup)) {
-		$MPEGaudioVersionLookup       = MPEGaudioVersionArray();
-		$MPEGaudioLayerLookup         = MPEGaudioLayerArray();
-		$MPEGaudioBitrateLookup       = MPEGaudioBitrateArray();
-		$MPEGaudioFrequencyLookup     = MPEGaudioFrequencyArray();
-		$MPEGaudioChannelModeLookup   = MPEGaudioChannelModeArray();
-		$MPEGaudioModeExtensionLookup = MPEGaudioModeExtensionArray();
-		$MPEGaudioEmphasisLookup      = MPEGaudioEmphasisArray();
-	}
-
-	if (isset($MPEGaudioVersionLookup[$rawarray['version']])) {
-		$decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']];
-	} else {
-		if ($echoerrors) {
-			echo "\n".'invalid Version ('.$rawarray['version'].')';
-		}
-		return false;
-	}
-	if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) {
-		$decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']];
-	} else {
-		if ($echoerrors) {
-			echo "\n".'invalid Layer ('.$rawarray['layer'].')';
-		}
-		return false;
-	}
-	if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) {
-		if ($echoerrors) {
-			echo "\n".'invalid Bitrate ('.$rawarray['bitrate'].')';
-		}
-		if ($rawarray['bitrate'] == 15) {
-			// known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0
-			// let it go through here otherwise file will not be identified
-		} else {
-			return false;
-		}
-	}
-	if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) {
-		if ($echoerrors) {
-			echo "\n".'invalid Frequency ('.$rawarray['sample_rate'].')';
-		}
-		return false;
-	}
-	if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) {
-		if ($echoerrors) {
-			echo "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')';
-		}
-		return false;
-	}
-	if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) {
-		if ($echoerrors) {
-			echo "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')';
-		}
-		return false;
-	}
-	if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) {
-		if ($echoerrors) {
-			echo "\n".'invalid Emphasis ('.$rawarray['emphasis'].')';
-		}
-		return false;
-	}
-	// These are just either set or not set, you can't mess that up :)
-	// $rawarray['protection'];
-	// $rawarray['padding'];
-	// $rawarray['private'];
-	// $rawarray['copyright'];
-	// $rawarray['original'];
-
-	return true;
-}
-
-function MPEGaudioHeaderDecode($Header4Bytes) {
-	// AAAA AAAA  AAAB BCCD  EEEE FFGH  IIJJ KLMM
-	// A - Frame sync (all bits set)
-	// B - MPEG Audio version ID
-	// C - Layer description
-	// D - Protection bit
-	// E - Bitrate index
-	// F - Sampling rate frequency index
-	// G - Padding bit
-	// H - Private bit
-	// I - Channel Mode
-	// J - Mode extension (Only if Joint stereo)
-	// K - Copyright
-	// L - Original
-	// M - Emphasis
-
-	if (strlen($Header4Bytes) != 4) {
-		return false;
-	}
-
-	$MPEGrawHeader['synch']         = (BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4;
-	$MPEGrawHeader['version']       = (ord($Header4Bytes{1}) & 0x18) >> 3; //    BB
-	$MPEGrawHeader['layer']         = (ord($Header4Bytes{1}) & 0x06) >> 1; //      CC
-	$MPEGrawHeader['protection']    = (ord($Header4Bytes{1}) & 0x01);      //        D
-	$MPEGrawHeader['bitrate']       = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE
-	$MPEGrawHeader['sample_rate']   = (ord($Header4Bytes{2}) & 0x0C) >> 2; //     FF
-	$MPEGrawHeader['padding']       = (ord($Header4Bytes{2}) & 0x02) >> 1; //       G
-	$MPEGrawHeader['private']       = (ord($Header4Bytes{2}) & 0x01);      //        H
-	$MPEGrawHeader['channelmode']   = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II
-	$MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; //   JJ
-	$MPEGrawHeader['copyright']     = (ord($Header4Bytes{3}) & 0x08) >> 3; //     K
-	$MPEGrawHeader['original']      = (ord($Header4Bytes{3}) & 0x04) >> 2; //      L
-	$MPEGrawHeader['emphasis']      = (ord($Header4Bytes{3}) & 0x03);      //       MM
-
-	return $MPEGrawHeader;
-}
-
-function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) {
-	static $AudioFrameLengthCache = array();
-
-	if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) {
-		$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false;
-		if ($bitrate != 'free') {
-
-			if ($version == '1') {
-
-				if ($layer == 'I') {
-
-					// For Layer I slot is 32 bits long
-					$FrameLengthCoefficient = 48;
-					$SlotLength = 4;
-
-				} else { // Layer II / III
-
-					// for Layer II and Layer III slot is 8 bits long.
-					$FrameLengthCoefficient = 144;
-					$SlotLength = 1;
-
-				}
-
-			} else { // MPEG-2 / MPEG-2.5
-
-				if ($layer == 'I') {
-
-					// For Layer I slot is 32 bits long
-					$FrameLengthCoefficient = 24;
-					$SlotLength = 4;
-
-				} elseif ($layer == 'II') {
-
-					// for Layer II and Layer III slot is 8 bits long.
-					$FrameLengthCoefficient = 144;
-					$SlotLength = 1;
-
-				} else { // III
-
-					// for Layer II and Layer III slot is 8 bits long.
-					$FrameLengthCoefficient = 72;
-					$SlotLength = 1;
-
-				}
-
-			}
-
-			// FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding
-			// http://66.96.216.160/cgi-bin/YaBB.pl?board=c&action=display&num=1018474068
-			// -> [Finding the next frame synch] on www.r3mix.net forums if the above link goes dead
-			if ($samplerate > 0) {
-				$NewFramelength  = ($FrameLengthCoefficient * $bitrate * 1000) / $samplerate;
-				$NewFramelength  = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer II/III, 4 bytes for Layer I)
-				if ($padding) {
-					$NewFramelength += $SlotLength;
-				}
-				$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength;
-			}
-		}
-	}
-	return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate];
-}
-
-function LAMEvbrMethodLookup($VBRmethodID) {
-	static $LAMEvbrMethodLookup = array();
-	if (empty($LAMEvbrMethodLookup)) {
-		$LAMEvbrMethodLookup[0x00] = 'unknown';
-		$LAMEvbrMethodLookup[0x01] = 'cbr';
-		$LAMEvbrMethodLookup[0x02] = 'abr';
-		$LAMEvbrMethodLookup[0x03] = 'vbr-old / vbr-rh';
-		$LAMEvbrMethodLookup[0x04] = 'vbr-mtrh';
-		$LAMEvbrMethodLookup[0x05] = 'vbr-new / vbr-mt';
-	}
-	return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : '');
-}
-
-function LAMEmiscStereoModeLookup($StereoModeID) {
-	static $LAMEmiscStereoModeLookup = array();
-	if (empty($LAMEmiscStereoModeLookup)) {
-		$LAMEmiscStereoModeLookup[0] = 'mono';
-		$LAMEmiscStereoModeLookup[1] = 'stereo';
-		$LAMEmiscStereoModeLookup[2] = 'dual';
-		$LAMEmiscStereoModeLookup[3] = 'joint';
-		$LAMEmiscStereoModeLookup[4] = 'forced';
-		$LAMEmiscStereoModeLookup[5] = 'auto';
-		$LAMEmiscStereoModeLookup[6] = 'intensity';
-		$LAMEmiscStereoModeLookup[7] = 'other';
-	}
-	return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : '');
-}
-
-function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) {
-	static $LAMEmiscSourceSampleFrequencyLookup = array();
-	if (empty($LAMEmiscSourceSampleFrequencyLookup)) {
-		$LAMEmiscSourceSampleFrequencyLookup[0] = '<= 32 kHz';
-		$LAMEmiscSourceSampleFrequencyLookup[1] = '44.1 kHz';
-		$LAMEmiscSourceSampleFrequencyLookup[2] = '48 kHz';
-		$LAMEmiscSourceSampleFrequencyLookup[3] = '> 48kHz';
-	}
-	return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : '');
-}
-
-function LAMEsurroundInfoLookup($SurroundInfoID) {
-	static $LAMEsurroundInfoLookup = array();
-	if (empty($LAMEsurroundInfoLookup)) {
-		$LAMEsurroundInfoLookup[0] = 'no surround info';
-		$LAMEsurroundInfoLookup[1] = 'DPL encoding';
-		$LAMEsurroundInfoLookup[2] = 'DPL2 encoding';
-		$LAMEsurroundInfoLookup[3] = 'Ambisonic encoding';
-	}
-	return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved');
-}
-
-for ($i = 0x00; $i <= 0xFF; $i++) {
-	$head4 = "\xFF\xFE".chr($i)."\x00";
-	$isvalid = MPEGaudioHeaderBytesValid($head4);
-	echo '<div style="color: '.($isvalid ? 'green' : 'red').';">'.str_pad(strtoupper(dechex($i)), 2, '0', STR_PAD_LEFT).' = '.htmlentities(chr($i)).' = '.($isvalid ? 'valid' : 'INVALID').'</div>';
-}
diff --git a/demos/demo.mysql.php b/demos/demo.mysql.php
deleted file mode 100644
index 2444399..0000000
--- a/demos/demo.mysql.php
+++ /dev/null
@@ -1,2196 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.mysql.php - part of getID3()                     //
-// Sample script for recursively scanning directories and      //
-// storing the results in a database                           //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line 16 in demos/demo.mysql.php');
-
-
-// OPTIONS:
-$getid3_demo_mysql_encoding = 'ISO-8859-1';
-$getid3_demo_mysql_md5_data = false;        // All data hashes are by far the slowest part of scanning
-$getid3_demo_mysql_md5_file = false;
-
-define('GETID3_DB_HOST',  'localhost');
-define('GETID3_DB_USER',  'root');
-define('GETID3_DB_PASS',  'password');
-define('GETID3_DB_DB',    'getid3');
-define('GETID3_DB_TABLE', 'files');
-
-// CREATE DATABASE `getid3`;
-
-ob_start();
-if (!mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) {
-	$errormessage = ob_get_contents();
-	ob_end_clean();
-	die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
-}
-if (!mysql_select_db(GETID3_DB_DB)) {
-	$errormessage = ob_get_contents();
-	ob_end_clean();
-	die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
-}
-ob_end_clean();
-
-$getid3PHP_filename = realpath('../getid3/getid3.php');
-if (!file_exists($getid3PHP_filename) || !include_once($getid3PHP_filename)) {
-	die('Cannot open '.$getid3PHP_filename);
-}
-// Initialize getID3 engine
-$getID3 = new getID3;
-$getID3->setOption(array(
-	'option_md5_data' => $getid3_demo_mysql_md5_data,
-	'encoding'        => $getid3_demo_mysql_encoding,
-));
-
-
-function RemoveAccents($string) {
-	// Revised version by markstewardØhotmail*com
-	return strtr(strtr($string, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', '' => 'OE', '' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
-}
-
-function BitrateColor($bitrate, $BitrateMaxScale=768) {
-	// $BitrateMaxScale is bitrate of maximum-quality color (bright green)
-	// below this is gradient, above is solid green
-
-	$bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
-	$bitrate = round(min(max($bitrate, 1), 256));
-	$bitrate--;    // scale from 1-256kbps to 0-255kbps
-
-	$Rcomponent = max(255 - ($bitrate * 2), 0);
-	$Gcomponent = max(($bitrate * 2) - 255, 0);
-	if ($bitrate > 127) {
-		$Bcomponent = max((255 - $bitrate) * 2, 0);
-	} else {
-		$Bcomponent = max($bitrate * 2, 0);
-	}
-	return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT);
-}
-
-function BitrateText($bitrate, $decimals=0) {
-	return '<span style="color: #'.BitrateColor($bitrate).'">'.number_format($bitrate, $decimals).' kbps</span>';
-}
-
-function fileextension($filename, $numextensions=1) {
-	if (strstr($filename, '.')) {
-		$reversedfilename = strrev($filename);
-		$offset = 0;
-		for ($i = 0; $i < $numextensions; $i++) {
-			$offset = strpos($reversedfilename, '.', $offset + 1);
-			if ($offset === false) {
-				return '';
-			}
-		}
-		return strrev(substr($reversedfilename, 0, $offset));
-	}
-	return '';
-}
-
-function RenameFileFromTo($from, $to, &$results) {
-	$success = true;
-	if ($from === $to) {
-		$results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename';
-	} elseif (!file_exists($from)) {
-		$results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename';
-	} elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) {
-		$results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename';
-	} else {
-		ob_start();
-		if (rename($from, $to)) {
-			ob_end_clean();
-			$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($from).'")';
-			mysql_query_safe($SQLquery);
-			$results = '<span style="color: #008000;">Successfully renamed';
-		} else {
-			$errormessage = ob_get_contents();
-			ob_end_clean();
-			$results = '<br><span style="color: #FF0000;">FAILED to rename';
-			$success = false;
-		}
-	}
-	$results .= ' from:<br><i>'.$from.'</i><br>to:<br><i>'.$to.'</i></span><hr>';
-	return $success;
-}
-
-if (!empty($_REQUEST['renamefilefrom']) && !empty($_REQUEST['renamefileto'])) {
-
-	$results = '';
-	RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results);
-	echo $results;
-	exit;
-
-} elseif (!empty($_REQUEST['m3ufilename'])) {
-
-	header('Content-type: audio/x-mpegurl');
-	echo '#EXTM3U'."\n";
-	echo WindowsShareSlashTranslate($_REQUEST['m3ufilename'])."\n";
-	exit;
-
-} elseif (!isset($_REQUEST['m3u']) && !isset($_REQUEST['m3uartist']) && !isset($_REQUEST['m3utitle'])) {
-
-	echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">';
-	echo '<html><head><title>getID3() demo - /demo/mysql.php</title><style>BODY, TD, TH { font-family: sans-serif; font-size: 10pt; } A { text-decoration: none; } A:hover { text-decoration: underline; } A:visited { font-style: italic; }</style></head><body>';
-
-}
-
-
-function WindowsShareSlashTranslate($filename) {
-	if (substr($filename, 0, 2) == '//') {
-		return str_replace('/', '\\', $filename);
-	}
-	return $filename;
-}
-
-function mysql_query_safe($SQLquery) {
-	static $TimeSpentQuerying = 0;
-	if ($SQLquery === null) {
-		return $TimeSpentQuerying;
-	}
-	$starttime = microtime(true);
-	$result = mysql_query($SQLquery);
-	$TimeSpentQuerying += (microtime(true) - $starttime);
-	if (mysql_error()) {
-		die('<div style="color: red; padding: 10px; margin: 10px; border: 3px red ridge;"><div style="font-weight: bold;">SQL error:</div><div style="color: blue; padding: 10px;">'.htmlentities(mysql_error()).'</div><hr size="1"><pre>'.htmlentities($SQLquery).'</pre></div>');
-	}
-	return $result;
-}
-
-function mysql_table_exists($tablename) {
-	return (bool) mysql_query('DESCRIBE '.$tablename);
-}
-
-function AcceptableExtensions($fileformat, $audio_dataformat='', $video_dataformat='') {
-	static $AcceptableExtensionsAudio = array();
-	if (empty($AcceptableExtensionsAudio)) {
-		$AcceptableExtensionsAudio['mp3']['mp3']  = array('mp3');
-		$AcceptableExtensionsAudio['mp2']['mp2']  = array('mp2');
-		$AcceptableExtensionsAudio['mp1']['mp1']  = array('mp1');
-		$AcceptableExtensionsAudio['asf']['asf']  = array('asf');
-		$AcceptableExtensionsAudio['asf']['wma']  = array('wma');
-		$AcceptableExtensionsAudio['riff']['mp3'] = array('wav');
-		$AcceptableExtensionsAudio['riff']['wav'] = array('wav');
-	}
-	static $AcceptableExtensionsVideo = array();
-	if (empty($AcceptableExtensionsVideo)) {
-		$AcceptableExtensionsVideo['mp3']['mp3']  = array('mp3');
-		$AcceptableExtensionsVideo['mp2']['mp2']  = array('mp2');
-		$AcceptableExtensionsVideo['mp1']['mp1']  = array('mp1');
-		$AcceptableExtensionsVideo['asf']['asf']  = array('asf');
-		$AcceptableExtensionsVideo['asf']['wmv']  = array('wmv');
-		$AcceptableExtensionsVideo['gif']['gif']  = array('gif');
-		$AcceptableExtensionsVideo['jpg']['jpg']  = array('jpg');
-		$AcceptableExtensionsVideo['png']['png']  = array('png');
-		$AcceptableExtensionsVideo['bmp']['bmp']  = array('bmp');
-	}
-	if (!empty($video_dataformat)) {
-		return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array());
-	} else {
-		return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array());
-	}
-}
-
-
-if (!empty($_REQUEST['scan'])) {
-	if (mysql_table_exists(GETID3_DB_TABLE)) {
-		$SQLquery  = 'DROP TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		mysql_query_safe($SQLquery);
-	}
-}
-if (!mysql_table_exists(GETID3_DB_TABLE)) {
-	$SQLquery  = "CREATE TABLE `".mysql_real_escape_string(GETID3_DB_TABLE)."` (";
-	$SQLquery .= " `ID` int(11) unsigned NOT NULL auto_increment,";
-	$SQLquery .= " `filename` text NOT NULL,";
-	$SQLquery .= " `last_modified` int(11) NOT NULL default '0',";
-	$SQLquery .= " `md5_file` varchar(32) NOT NULL default '',";
-	$SQLquery .= " `md5_data` varchar(32) NOT NULL default '',";
-	$SQLquery .= " `md5_data_source` varchar(32) NOT NULL default '',";
-	$SQLquery .= " `filesize` int(10) unsigned NOT NULL default '0',";
-	$SQLquery .= " `fileformat` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `audio_dataformat` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `video_dataformat` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `audio_bitrate` float NOT NULL default '0',";
-	$SQLquery .= " `video_bitrate` float NOT NULL default '0',";
-	$SQLquery .= " `playtime_seconds` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `tags` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `artist` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `title` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `remix` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `album` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `genre` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `comment` text NOT NULL,";
-	$SQLquery .= " `track` varchar(7) NOT NULL default '',";
-	$SQLquery .= " `comments_all` longtext NOT NULL,";
-	$SQLquery .= " `comments_id3v2` longtext NOT NULL,";
-	$SQLquery .= " `comments_ape` longtext NOT NULL,";
-	$SQLquery .= " `comments_lyrics3` longtext NOT NULL,";
-	$SQLquery .= " `comments_id3v1` text NOT NULL,";
-	$SQLquery .= " `warning` longtext NOT NULL,";
-	$SQLquery .= " `error` longtext NOT NULL,";
-	$SQLquery .= " `track_volume` float NOT NULL default '0',";
-	$SQLquery .= " `encoder_options` varchar(255) NOT NULL default '',";
-	$SQLquery .= " `vbr_method` varchar(255) NOT NULL default '',";
-	$SQLquery .= " PRIMARY KEY (`ID`)";
-	$SQLquery .= ")";
-	mysql_query_safe($SQLquery);
-}
-
-$ExistingTableFields = array();
-$result = mysql_query_safe('DESCRIBE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
-while ($row = mysql_fetch_array($result)) {
-	$ExistingTableFields[$row['Field']] = $row;
-}
-if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2
-	echo '<b>adding field `encoder_options`</b><br>';
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `encoder_options` VARCHAR(255) default "" NOT NULL AFTER `error`');
-	mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
-}
-if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2
-	echo '<b>changing field `track` to VARCHAR(7)</b><br>';
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `track` `track` VARCHAR(7) default "" NOT NULL');
-	mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
-}
-if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5
-	echo '<H1><FONT COLOR="red">WARNING! You should erase your database and rescan everything because the comment storing has been changed since the last version</FONT></H1><hr>';
-	echo '<b>adding field `track_volume`</b><br>';
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `track_volume` FLOAT NOT NULL AFTER `error`');
-	mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
-}
-if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1
-	echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>';
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `remix` VARCHAR(255) default "" NOT NULL AFTER `title`');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `alternate_name` VARCHAR(255) default "" NOT NULL AFTER `track`');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `parody` VARCHAR(255) default "" NOT NULL AFTER `alternate_name`');
-	mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
-}
-if (isset($ExistingTableFields['comments_all']) && ($ExistingTableFields['comments_all']['Type'] != 'longtext')) { // Changed in 1.9.0
-	echo '<b>changing comments fields from text to longtext</b><br>';
-	// no need to change id3v1
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_all`     `comments_all`     LONGTEXT NOT NULL');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_id3v2`   `comments_id3v2`   LONGTEXT NOT NULL');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_ape`     `comments_ape`     LONGTEXT NOT NULL');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_lyrics3` `comments_lyrics3` LONGTEXT NOT NULL');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `warning`          `warning`          LONGTEXT NOT NULL');
-	mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `error`            `error`            LONGTEXT NOT NULL');
-}
-
-
-function SynchronizeAllTags($filename, $synchronizefrom='all', $synchronizeto='A12', &$errors) {
-	global $getID3;
-
-	set_time_limit(30);
-
-	$ThisFileInfo = $getID3->analyze($filename);
-	getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-	if ($synchronizefrom == 'all') {
-		$SourceArray = (!empty($ThisFileInfo['comments']) ? $ThisFileInfo['comments'] : array());
-	} elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) {
-		$SourceArray = (!empty($ThisFileInfo['tags'][$synchronizefrom]) ? $ThisFileInfo['tags'][$synchronizefrom] : array());
-	} else {
-		die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist');
-	}
-
-	$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($filename).'")';
-	mysql_query_safe($SQLquery);
-
-
-	$TagFormatsToWrite = array();
-	if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2')) {
-		$TagFormatsToWrite[] = 'id3v2.3';
-	}
-	if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape')) {
-		$TagFormatsToWrite[] = 'ape';
-	}
-	if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3')) {
-		$TagFormatsToWrite[] = 'lyrics3';
-	}
-	if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1')) {
-		$TagFormatsToWrite[] = 'id3v1';
-	}
-
-	getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
-	$tagwriter = new getid3_writetags;
-	$tagwriter->filename       = $filename;
-	$tagwriter->tagformats     = $TagFormatsToWrite;
-	$tagwriter->overwrite_tags = true;
-	$tagwriter->tag_encoding   = $getID3->encoding;
-	$tagwriter->tag_data       = $SourceArray;
-
-	if ($tagwriter->WriteTags()) {
-		$errors = $tagwriter->errors;
-		return true;
-	}
-	$errors = $tagwriter->errors;
-	return false;
-}
-
-$IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'pdf', 'zip', 'rar', 'mid', 'mod', 'xm', 'it', 's3m');
-
-if (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan']) || !empty($_REQUEST['rescanerrors'])) {
-
-	$SQLquery  = 'DELETE from `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` = "")';
-	mysql_query_safe($SQLquery);
-
-	$FilesInDir = array();
-
-	if (!empty($_REQUEST['rescanerrors'])) {
-
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
-
-		echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>';
-
-		$SQLquery  = 'SELECT `filename`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`error` <> "")';
-		$SQLquery .= ' OR (`warning` <> "")';
-		$SQLquery .= ' ORDER BY `filename` ASC';
-		$result = mysql_query_safe($SQLquery);
-		while ($row = mysql_fetch_array($result)) {
-
-			if (!file_exists($row['filename'])) {
-				echo '<b>File missing: '.$row['filename'].'</b><br>';
-				$SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-				$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
-				mysql_query_safe($SQLquery);
-			} else {
-				$FilesInDir[] = $row['filename'];
-			}
-
-		}
-
-	} elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
-
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
-
-		echo 'Scanning all media files in <b>'.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).'</b> (and subdirectories)<hr>';
-
-		$SQLquery  = 'SELECT COUNT(*) AS `num`, `filename`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' GROUP BY `filename`';
-		$SQLquery .= ' HAVING (`num` > 1)';
-		$SQLquery .= ' ORDER BY `num` DESC';
-		$result = mysql_query_safe($SQLquery);
-		$DupesDeleted = 0;
-		while ($row = mysql_fetch_array($result)) {
-			set_time_limit(30);
-			$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"';
-			mysql_query_safe($SQLquery);
-			$DupesDeleted++;
-		}
-		if ($DupesDeleted > 0) {
-			echo 'Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
-		}
-
-		if (!empty($_REQUEST['newscan'])) {
-			$AlreadyInDatabase = array();
-			set_time_limit(60);
-			$SQLquery  = 'SELECT `filename`';
-			$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' ORDER BY `filename` ASC';
-			$result = mysql_query_safe($SQLquery);
-			while ($row = mysql_fetch_array($result)) {
-				//$AlreadyInDatabase[] = strtolower($row['filename']);
-				$AlreadyInDatabase[] = $row['filename'];
-			}
-		}
-
-		$DirectoriesToScan  = array(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan']);
-		$DirectoriesScanned = array();
-		while (count($DirectoriesToScan) > 0) {
-			foreach ($DirectoriesToScan as $DirectoryKey => $startingdir) {
-				if ($dir = opendir($startingdir)) {
-					set_time_limit(30);
-					echo '<b>'.str_replace('\\', '/', $startingdir).'</b><br>';
-					flush();
-					while (($file = readdir($dir)) !== false) {
-						if (($file != '.') && ($file != '..')) {
-							$RealPathName = realpath($startingdir.'/'.$file);
-							if (is_dir($RealPathName)) {
-								if (!in_array($RealPathName, $DirectoriesScanned) && !in_array($RealPathName, $DirectoriesToScan)) {
-									$DirectoriesToScan[] = $RealPathName;
-								}
-							} elseif (is_file($RealPathName)) {
-								if (!empty($_REQUEST['newscan'])) {
-									if (!in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase)) {
-										$FilesInDir[] = $RealPathName;
-									}
-								} elseif (!empty($_REQUEST['scan'])) {
-									$FilesInDir[] = $RealPathName;
-								}
-							}
-						}
-					}
-					closedir($dir);
-				} else {
-					echo '<div style="color: red;">Failed to open directory "<b>'.htmlentities($startingdir).'</b>"</div><br>';
-				}
-				$DirectoriesScanned[] = $startingdir;
-				unset($DirectoriesToScan[$DirectoryKey]);
-			}
-		}
-		echo '<i>List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)</i><hr>';
-		flush();
-	}
-
-	$FilesInDir = array_unique($FilesInDir);
-	sort($FilesInDir);
-
-	$starttime = time();
-	$rowcounter = 0;
-	$totaltoprocess = count($FilesInDir);
-
-	foreach ($FilesInDir as $filename) {
-		set_time_limit(300);
-
-		echo '<br>'.date('H:i:s').' ['.number_format(++$rowcounter).' / '.number_format($totaltoprocess).'] '.str_replace('\\', '/', $filename);
-
-		$ThisFileInfo = $getID3->analyze($filename);
-		getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-		if (file_exists($filename)) {
-			$ThisFileInfo['file_modified_time'] = filemtime($filename);
-			$ThisFileInfo['md5_file']           = ($getid3_demo_mysql_md5_file ? md5_file($filename) : '');
-		}
-
-		if (empty($ThisFileInfo['fileformat'])) {
-
-			echo ' (<span style="color: #990099;">unknown file type</span>)';
-
-		} else {
-
-			if (!empty($ThisFileInfo['error'])) {
-				echo ' (<span style="color: #FF0000;">errors</span>)';
-			} elseif (!empty($ThisFileInfo['warning'])) {
-				echo ' (<span style="color: #FF9999;">warnings</span>)';
-			} else {
-				echo ' (<span style="color: #009900;">OK</span>)';
-			}
-
-			$this_track_track = '';
-			if (!empty($ThisFileInfo['comments']['track'])) {
-				foreach ($ThisFileInfo['comments']['track'] as $key => $value) {
-					if (strlen($value) > strlen($this_track_track)) {
-						$this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT);
-					}
-				}
-				if (preg_match('#^([0-9]+)/([0-9]+)$#', $this_track_track, $matches)) {
-					// change "1/5"->"01/05", "3/12"->"03/12", etc
-					$this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT).'/'.str_pad($matches[2], 2, '0', STR_PAD_LEFT);
-				}
-			}
-
-			$this_track_remix = '';
-			$this_track_title = '';
-			if (!empty($ThisFileInfo['comments']['title'])) {
-				foreach ($ThisFileInfo['comments']['title'] as $possible_title) {
-					if (strlen($possible_title) > strlen($this_track_title)) {
-						$this_track_title = $possible_title;
-					}
-				}
-			}
-
-			$ParenthesesPairs = array('()', '[]', '{}');
-			foreach ($ParenthesesPairs as $pair) {
-				if (preg_match_all('/(.*) '.preg_quote($pair{0}).'(([^'.preg_quote($pair).']*[\- '.preg_quote($pair{0}).'])?(cut|dub|edit|version|live|reprise|[a-z]*mix))'.preg_quote($pair{1}).'/iU', $this_track_title, $matches)) {
-					$this_track_title = $matches[1][0];
-					$this_track_remix = implode("\t", $matches[2]);
-				}
-			}
-
-
-
-			if (!empty($_REQUEST['rescanerrors'])) {
-
-				$SQLquery  = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` SET ';
-				$SQLquery .= '  `last_modified` = "'.   mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time']            ) ?                          $ThisFileInfo['file_modified_time']              : '').'"';
-				$SQLquery .= ', `md5_file` = "'.        mysql_real_escape_string(!empty($ThisFileInfo['md5_file']                      ) ?                          $ThisFileInfo['md5_file']                        : '').'"';
-				$SQLquery .= ', `md5_data` = "'.        mysql_real_escape_string(!empty($ThisFileInfo['md5_data']                      ) ?                          $ThisFileInfo['md5_data']                        : '').'"';
-				$SQLquery .= ', `md5_data_source` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source']               ) ?                          $ThisFileInfo['md5_data_source']                 : '').'"';
-				$SQLquery .= ', `filesize` = "'.        mysql_real_escape_string(!empty($ThisFileInfo['filesize']                      ) ?                          $ThisFileInfo['filesize']                        :  0).'"';
-				$SQLquery .= ', `fileformat` = "'.      mysql_real_escape_string(!empty($ThisFileInfo['fileformat']                    ) ?                          $ThisFileInfo['fileformat']                      : '').'"';
-				$SQLquery .= ', `audio_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat']           ) ?                          $ThisFileInfo['audio']['dataformat']             : '').'"';
-				$SQLquery .= ', `video_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat']           ) ?                          $ThisFileInfo['video']['dataformat']             : '').'"';
-				$SQLquery .= ', `vbr_method` = "'.      mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['VBR_method']   ) ?                          $ThisFileInfo['mpeg']['audio']['VBR_method']     : '').'"';
-				$SQLquery .= ', `audio_bitrate` = "'.   mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate']              ) ?                 floatval($ThisFileInfo['audio']['bitrate'])               :  0).'"';
-				$SQLquery .= ', `video_bitrate` = "'.   mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate']              ) ?                 floatval($ThisFileInfo['video']['bitrate'])               :  0).'"';
-				$SQLquery .= ', `playtime_seconds` = "'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds']              ) ?                 floatval($ThisFileInfo['playtime_seconds'])               :  0).'"';
-				$SQLquery .= ', `track_volume` = "'.    mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ?                 floatval($ThisFileInfo['replay_gain']['track']['volume']) :  0).'"';
-				$SQLquery .= ', `comments_all` = "'.    mysql_real_escape_string(!empty($ThisFileInfo['comments']                      ) ?                serialize($ThisFileInfo['comments'])                       : '').'"';
-				$SQLquery .= ', `comments_id3v2` = "'.  mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2']                 ) ?                serialize($ThisFileInfo['tags']['id3v2'])                  : '').'"';
-				$SQLquery .= ', `comments_ape` = "'.    mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape']                   ) ?                serialize($ThisFileInfo['tags']['ape'])                    : '').'"';
-				$SQLquery .= ', `comments_lyrics3` = "'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3']               ) ?                serialize($ThisFileInfo['tags']['lyrics3'])                : '').'"';
-				$SQLquery .= ', `comments_id3v1` = "'.  mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1']                 ) ?                serialize($ThisFileInfo['tags']['id3v1'])                  : '').'"';
-				$SQLquery .= ', `warning` = "'.         mysql_real_escape_string(!empty($ThisFileInfo['warning']                       ) ?            implode("\t", $ThisFileInfo['warning'])                        : '').'"';
-				$SQLquery .= ', `error` = "'.           mysql_real_escape_string(!empty($ThisFileInfo['error']                         ) ?            implode("\t", $ThisFileInfo['error'])                          : '').'"';
-				$SQLquery .= ', `album` = "'.           mysql_real_escape_string(!empty($ThisFileInfo['comments']['album']             ) ?            implode("\t", $ThisFileInfo['comments']['album'])              : '').'"';
-				$SQLquery .= ', `genre` = "'.           mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre']             ) ?            implode("\t", $ThisFileInfo['comments']['genre'])              : '').'"';
-				$SQLquery .= ', `comment` = "'.         mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment']           ) ?            implode("\t", $ThisFileInfo['comments']['comment'])            : '').'"';
-				$SQLquery .= ', `artist` = "'.          mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist']            ) ?            implode("\t", $ThisFileInfo['comments']['artist'])             : '').'"';
-				$SQLquery .= ', `tags` = "'.            mysql_real_escape_string(!empty($ThisFileInfo['tags']                          ) ? implode("\t", array_keys($ThisFileInfo['tags']))                          : '').'"';
-				$SQLquery .= ', `encoder_options` = "'. mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'"';
-				$SQLquery .= ', `title` = "'.           mysql_real_escape_string($this_track_title).'"';
-				$SQLquery .= ', `remix` = "'.           mysql_real_escape_string($this_track_remix).'"';
-				$SQLquery .= ', `track` = "'.           mysql_real_escape_string($this_track_track).'"';
-				$SQLquery .= 'WHERE (`filename` = "'. mysql_real_escape_string(isset($ThisFileInfo['filenamepath']) ? $ThisFileInfo['filenamepath'] : '').'")';
-
-			} elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
-
-				//$SQLquery  = 'INSERT INTO `'.mysql_real_escape_string(GETID3_DB_TABLE).'` (`filename`, `last_modified`, `md5_file`, `md5_data`, `md5_data_source`, `filesize`, `fileformat`, `audio_dataformat`, `video_dataformat`, `audio_bitrate`, `video_bitrate`, `playtime_seconds`, `artist`, `title`, `remix`, `album`, `genre`, `comment`, `track`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`, `warning`, `error`, `encoder_options`, `vbr_method`, `track_volume`) VALUES (';
-				$SQLquery  = 'INSERT INTO `'.mysql_real_escape_string(GETID3_DB_TABLE).'` (`filename`, `last_modified`, `md5_file`, `md5_data`, `md5_data_source`, `filesize`, `fileformat`, `audio_dataformat`, `video_dataformat`, `audio_bitrate`, `video_bitrate`, `playtime_seconds`, `tags`, `artist`, `title`, `remix`, `album`, `genre`, `comment`, `track`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`, `warning`, `error`, `encoder_options`, `vbr_method`, `track_volume`) VALUES (';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filenamepath']                  ) ?                          $ThisFileInfo['filenamepath']                    : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time']            ) ?                          $ThisFileInfo['file_modified_time']              : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_file']                      ) ?                          $ThisFileInfo['md5_file']                        : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data']                      ) ?                          $ThisFileInfo['md5_data']                        : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source']               ) ?                          $ThisFileInfo['md5_data_source']                 : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filesize']                      ) ?                          $ThisFileInfo['filesize']                        :  0).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['fileformat']                    ) ?                          $ThisFileInfo['fileformat']                      : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat']           ) ?                          $ThisFileInfo['audio']['dataformat']             : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat']           ) ?                          $ThisFileInfo['video']['dataformat']             : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate']              ) ?                 floatval($ThisFileInfo['audio']['bitrate'])               :  0).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate']              ) ?                 floatval($ThisFileInfo['video']['bitrate'])               :  0).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds']              ) ?                 floatval($ThisFileInfo['playtime_seconds'])               :  0).'", ';
-				//$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']                          ) ?            implode("\t", $ThisFileInfo['tags'])                           : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']                          ) ? implode("\t", array_keys($ThisFileInfo['tags']))                          : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist']            ) ?            implode("\t", $ThisFileInfo['comments']['artist'])             : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string($this_track_title).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string($this_track_remix).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['album']             ) ?            implode("\t", $ThisFileInfo['comments']['album'])              : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre']             ) ?            implode("\t", $ThisFileInfo['comments']['genre'])              : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment']           ) ?            implode("\t", $ThisFileInfo['comments']['comment'])            : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string($this_track_track).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']                      ) ?                serialize($ThisFileInfo['comments'])                       : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2']                 ) ?                serialize($ThisFileInfo['tags']['id3v2'])                  : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape']                   ) ?                serialize($ThisFileInfo['tags']['ape'])                    : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3']               ) ?                serialize($ThisFileInfo['tags']['lyrics3'])                : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1']                 ) ?                serialize($ThisFileInfo['tags']['id3v1'])                  : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['warning']                       ) ?            implode("\t", $ThisFileInfo['warning'])                        : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['error']                         ) ?            implode("\t", $ThisFileInfo['error'])                          : '').'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : (!empty($ThisFileInfo['mpeg']['audio']['VBR_method']) ? $ThisFileInfo['mpeg']['audio']['VBR_method'] : '')).'", ';
-				$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ?                 floatval($ThisFileInfo['replay_gain']['track']['volume']) :  0).'")';
-
-			}
-			flush();
-			mysql_query_safe($SQLquery);
-		}
-
-	}
-
-	$SQLquery = 'OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	mysql_query_safe($SQLquery);
-
-	echo '<hr>Done scanning!<hr>';
-
-} elseif (!empty($_REQUEST['missingtrackvolume'])) {
-
-	$MissingTrackVolumeFilesScanned  = 0;
-	$MissingTrackVolumeFilesAdjusted = 0;
-	$MissingTrackVolumeFilesDeleted  = 0;
-	$SQLquery  = 'SELECT `filename`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`track_volume` = 0)';
-	$SQLquery .= ' AND (`audio_bitrate` > 0)';
-	$result = mysql_query_safe($SQLquery);
-	echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / '.number_format(mysql_num_rows($result)).' files for track volume information:<hr>';
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-		echo '<script type="text/javascript">if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "'.number_format($MissingTrackVolumeFilesScanned++).'";</script>. ';
-		flush();
-		if (file_exists($row['filename'])) {
-
-			$ThisFileInfo = $getID3->analyze($row['filename']);
-			if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) {
-				$MissingTrackVolumeFilesAdjusted++;
-				$SQLquery  = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-				$SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"';
-				$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
-				mysql_query_safe($SQLquery);
-			}
-
-		} else {
-
-			$MissingTrackVolumeFilesDeleted++;
-			$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
-			mysql_query_safe($SQLquery);
-
-		}
-	}
-	echo '<hr>Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.<br>';
-	echo 'Found track volume information for '.number_format($MissingTrackVolumeFilesAdjusted).' of them (could not find info for '.number_format($MissingTrackVolumeFilesScanned - $MissingTrackVolumeFilesAdjusted).' files; deleted '.number_format($MissingTrackVolumeFilesDeleted).' records of missing files)<hr>';
-
-} elseif (!empty($_REQUEST['deadfilescheck'])) {
-
-	$SQLquery  = 'SELECT COUNT(*) AS `num`, `filename`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' GROUP BY `filename`';
-	$SQLquery .= ' ORDER BY `num` DESC';
-	$result = mysql_query_safe($SQLquery);
-	$DupesDeleted = 0;
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-		if ($row['num'] <= 1) {
-			break;
-		}
-		echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">duplicate</font>)';
-		$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"';
-		mysql_query_safe($SQLquery);
-		$DupesDeleted++;
-	}
-	if ($DupesDeleted > 0) {
-		echo '<hr>Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
-	}
-
-	$SQLquery  = 'SELECT `filename`, `filesize`, `last_modified`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	$totalchecked = 0;
-	$totalremoved = 0;
-	$previousdir = '';
-	while ($row = mysql_fetch_array($result)) {
-		$totalchecked++;
-		set_time_limit(30);
-		$reason = '';
-		if (!file_exists($row['filename'])) {
-			$reason = 'deleted';
-		} elseif (filesize($row['filename']) != $row['filesize']) {
-			$reason = 'filesize changed';
-		} elseif (filemtime($row['filename']) != $row['last_modified']) {
-			if (abs(filemtime($row['filename']) - $row['last_modified']) != 3600) {
-				// off by exactly one hour == daylight savings time
-				$reason = 'last-modified time changed';
-			}
-		}
-
-		$thisdir = dirname($row['filename']);
-		if ($reason) {
-
-			$totalremoved++;
-			echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">'.$reason.'</font>)';
-			flush();
-			$SQLquery  = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
-			mysql_query_safe($SQLquery);
-
-		} elseif ($thisdir != $previousdir) {
-
-			echo '. ';
-			flush();
-
-		}
-		$previousdir = $thisdir;
-	}
-
-	echo '<hr><b>'.number_format($totalremoved).' of '.number_format($totalchecked).' files in database no longer exist, or have been altered since last scan. Removed from database.</b><hr>';
-
-} elseif (!empty($_REQUEST['encodedbydistribution'])) {
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-
-		$SQLquery  = 'SELECT `filename`, `comments_id3v2`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`encoder_options` = "'.mysql_real_escape_string($_REQUEST['encodedbydistribution']).'")';
-		$result = mysql_query_safe($SQLquery);
-		$NonBlankEncodedBy = '';
-		$BlankEncodedBy = '';
-		while ($row = mysql_fetch_array($result)) {
-			set_time_limit(30);
-			$CommentArray = unserialize($row['comments_id3v2']);
-			if (isset($CommentArray['encoded_by'][0])) {
-				$NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
-			} else {
-				$BlankEncodedBy    .= WindowsShareSlashTranslate($row['filename'])."\n";
-			}
-		}
-		echo $NonBlankEncodedBy;
-		echo $BlankEncodedBy;
-		exit;
-
-	} elseif (!empty($_REQUEST['showfiles'])) {
-
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">show all</a><br>';
-		echo '<table border="1">';
-
-		$SQLquery  = 'SELECT `filename`, `comments_id3v2`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$result = mysql_query_safe($SQLquery);
-		while ($row = mysql_fetch_array($result)) {
-			set_time_limit(30);
-			$CommentArray = unserialize($row['comments_id3v2']);
-			if (($_REQUEST['encodedbydistribution'] == '%') || (!empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0]))) {
-				echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>';
-			}
-		}
-		echo '</table>';
-
-	} else {
-
-		$SQLquery  = 'SELECT `encoder_options`, `comments_id3v2`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC';
-		$result = mysql_query_safe($SQLquery);
-		$EncodedBy = array();
-		while ($row = mysql_fetch_array($result)) {
-			set_time_limit(30);
-			$CommentArray = unserialize($row['comments_id3v2']);
-			if (isset($CommentArray['encoded_by'][0])) {
-				if (isset($EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]])) {
-					$EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]]++;
-				} else {
-					$EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]] = 1;
-				}
-			}
-		}
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'&m3u=1').'">.m3u version</a><br>';
-		echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>';
-		foreach ($EncodedBy as $key => $value) {
-			echo '<tr><TD VALIGN="TOP"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($key).'&showfiles=1&m3u=1').'">m3u</a></td>';
-			echo '<TD VALIGN="TOP"><b>'.$key.'</b></td>';
-			echo '<td><table border="0" WIDTH="100%">';
-			arsort($value);
-			foreach ($value as $string => $count) {
-				echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>'.number_format($count).'</i></td><td>&nbsp;</td>';
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($string).'&showfiles=1').'">'.$string.'</a></td></tr>';
-			}
-			echo '</table></td></tr>';
-		}
-		echo '</table>';
-
-	}
-
-} elseif (!empty($_REQUEST['audiobitrates'])) {
-
-	getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
-	$BitrateDistribution = array();
-	$SQLquery  = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`audio_bitrate` > 0)';
-	$SQLquery .= ' GROUP BY `RoundBitrate`';
-	$result = mysql_query_safe($SQLquery);
-	while ($row = mysql_fetch_array($result)) {
-		$this_bitrate = getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000);
-		if (isset($BitrateDistribution[$this_bitrate])) {
-			$BitrateDistribution[$this_bitrate] += $row['num'];
-		} else {
-			$BitrateDistribution[$this_bitrate]  = $row['num'];
-		}
-	}
-
-	echo '<table border="1" cellspacing="0" cellpadding="3">';
-	echo '<tr><th>Bitrate</th><th>Count</th></tr>';
-	foreach ($BitrateDistribution as $Bitrate => $Count) {
-		echo '<tr>';
-		echo '<td align="right">'.round($Bitrate / 1000).' kbps</td>';
-		echo '<td align="right">'.number_format($Count).'</td>';
-		echo '</tr>';
-	}
-	echo '</table>';
-
-
-} elseif (!empty($_REQUEST['emptygenres'])) {
-
-	$SQLquery  = 'SELECT `fileformat`, `filename`, `genre`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`genre` = "")';
-	$SQLquery .= ' OR (`genre` = "Unknown")';
-	$SQLquery .= ' OR (`genre` = "Other")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
-				echo WindowsShareSlashTranslate($row['filename'])."\n";
-			}
-		}
-		exit;
-
-	} else {
-
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres='.urlencode($_REQUEST['emptygenres']).'&m3u=1').'">.m3u version</a><br>';
-		$EmptyGenreCounter = 0;
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>m3u</th><th>filename</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
-				$EmptyGenreCounter++;
-				echo '<tr>';
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '</tr>';
-			}
-		}
-		echo '</table>';
-		echo '<b>'.number_format($EmptyGenreCounter).'</b> files with empty genres';
-
-	}
-
-} elseif (!empty($_REQUEST['nonemptycomments'])) {
-
-	$SQLquery  = 'SELECT `filename`, `comment`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`comment` <> "")';
-	$SQLquery .= ' ORDER BY `comment` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} else {
-
-		$NonEmptyCommentsCounter = 0;
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments='.urlencode($_REQUEST['nonemptycomments']).'&m3u=1').'">.m3u version</a><br>';
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			$NonEmptyCommentsCounter++;
-			echo '<tr>';
-			echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-			if (strlen(trim($row['comment'])) > 0) {
-				echo '<td>'.htmlentities($row['comment']).'</td>';
-			} else {
-				echo '<td><i>space</i></td>';
-			}
-			echo '</tr>';
-		}
-		echo '</table>';
-		echo '<b>'.number_format($NonEmptyCommentsCounter).'</b> files with non-empty comments';
-
-	}
-
-} elseif (!empty($_REQUEST['trackzero'])) {
-
-	$SQLquery  = 'SELECT `filename`, `track`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`track` <> "")';
-	$SQLquery .= ' AND ((`track` < "1")';
-	$SQLquery .= ' OR (`track` > "99"))';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
-				echo WindowsShareSlashTranslate($row['filename'])."\n";
-			}
-		}
-		exit;
-
-	} else {
-
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero='.urlencode($_REQUEST['trackzero']).'&m3u=1').'">.m3u version</a><br>';
-		$TrackZeroCounter = 0;
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
-				$TrackZeroCounter++;
-				echo '<tr>';
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '<td>'.htmlentities($row['track']).'</td>';
-				echo '</tr>';
-			}
-		}
-		echo '</table>';
-		echo '<b>'.number_format($TrackZeroCounter).'</b> files with track "zero"';
-
-	}
-
-
-} elseif (!empty($_REQUEST['titlefeat'])) {
-
-	$SQLquery  = 'SELECT `filename`, `title`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`title` LIKE "%feat.%")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} else {
-
-		echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with "feat." in the title (instead of the artist)<br><br>';
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat='.urlencode($_REQUEST['titlefeat']).'&m3u=1').'">.m3u version</a><br>';
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-			echo '<td>'.preg_replace('#(feat\. .*)#i', '<b>\\1</b>', htmlentities($row['title'])).'</td>';
-			echo '</tr>';
-		}
-		echo '</table>';
-
-	}
-
-
-} elseif (!empty($_REQUEST['tracknoalbum'])) {
-
-	$SQLquery  = 'SELECT `filename`, `track`, `album`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`track` <> "")';
-	$SQLquery .= ' AND (`album` = "")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} else {
-
-		echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with a track number, but no album<br><br>';
-		echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum='.urlencode($_REQUEST['tracknoalbum']).'&m3u=1').'">.m3u version</a><br>';
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-			echo '<td>'.htmlentities($row['track']).'</td>';
-			echo '<td>'.htmlentities($row['album']).'</td>';
-			echo '</tr>';
-		}
-		echo '</table>';
-
-	}
-
-
-} elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) {
-
-	echo 'Applying new tags from <b>'.$_REQUEST['synchronizetagsfrom'].'</b> in <b>'.htmlentities($_REQUEST['filename']).'</b><ul>';
-	$errors = array();
-	if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) {
-		echo '<li>Sucessfully wrote tags</li>';
-	} else {
-		echo '<li>Tag writing had errors: <ul><li>'.implode('</li><li>', $errors).'</li></ul></li>';
-	}
-	echo '</ul>';
-
-
-} elseif (!empty($_REQUEST['unsynchronizedtags'])) {
-
-	$NotOKfiles        = 0;
-	$Autofixedfiles    = 0;
-	$FieldsToCompare   = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track');
-	$TagsToCompare     = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
-	$ID3v1FieldLengths = array('title'=>30, 'artist'=>30, 'album'=>30, 'year'=>4, 'genre'=>99, 'comment'=>28);
-	if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false) {
-		$TagsToCompare['id3v2'] = true;
-	}
-	if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false) {
-		$TagsToCompare['ape'] = true;
-	}
-	if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false) {
-		$TagsToCompare['lyrics3'] = true;
-	}
-	if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false) {
-		$TagsToCompare['id3v1'] = true;
-	}
-
-	echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1').'">Auto-fix empty tags</a><br><br>';
-	echo '<div id="Autofixing"></div>';
-	echo '<table border="1" cellspacing="0" cellpadding="3">';
-	echo '<tr>';
-	echo '<th>View</th>';
-	echo '<th>Filename</th>';
-	echo '<th>Combined</th>';
-	if ($TagsToCompare['id3v2']) {
-		echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=id3v2&autofixforcedest=A1').'" title="Auto-fix all tags to match ID3v2 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v2?\');">ID3v2</a></th>';
-	}
-	if ($TagsToCompare['ape']) {
-		echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=21').'" title="Auto-fix all tags to match APE contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match APE?\');">APE</a></th>';
-	}
-	if ($TagsToCompare['lyrics3']) {
-		echo '<th>Lyrics3</th>';
-	}
-	if ($TagsToCompare['id3v1']) {
-		echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=2A').'" title="Auto-fix all tags to match ID3v1 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v1?\');">ID3v1</a></th>';
-	}
-	echo '</tr>';
-
-	$SQLquery  = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` = "mp3")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	$lastdir = '';
-	$serializedCommentsFields = array('all', 'id3v2', 'ape', 'lyrics3', 'id3v1');
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-		if ($lastdir != dirname($row['filename'])) {
-			echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($lastdir, ENT_QUOTES).'";</script>';
-			flush();
-		}
-
-		$FileOK      = true;
-		$Mismatched  = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
-		$SemiMatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
-		$EmptyTags   = array('id3v2'=>true,  'ape'=>true,  'lyrics3'=>true,  'id3v1'=>true);
-
-		foreach ($serializedCommentsFields as $field) {
-			$Comments[$field] = array();
-			ob_start();
-			if ($unserialized = unserialize($row['comments_'.$field])) {
-				$Comments[$field] = $unserialized;
-			}
-			$errormessage = ob_get_contents();
-			ob_end_clean();
-		}
-
-		if (isset($Comments['ape']['tracknumber'])) {
-			$Comments['ape']['track'] = $Comments['ape']['tracknumber'];
-			unset($Comments['ape']['tracknumber']);
-		}
-		if (isset($Comments['ape']['track_number'])) {
-			$Comments['ape']['track'] = $Comments['ape']['track_number'];
-			unset($Comments['ape']['track_number']);
-		}
-		if (isset($Comments['id3v2']['track_number'])) {
-			$Comments['id3v2']['track'] = $Comments['id3v2']['track_number'];
-			unset($Comments['id3v2']['track_number']);
-		}
-		if (!empty($Comments['all']['track'])) {
-			$besttrack = '';
-			foreach ($Comments['all']['track'] as $key => $value) {
-				if (strlen($value) > strlen($besttrack)) {
-					$besttrack = $value;
-				}
-			}
-			$Comments['all']['track'] = array(0=>$besttrack);
-		}
-
-		$ThisLine  = '<tr>';
-		$ThisLine .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">view</a></td>';
-		$ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-		$tagvalues = '';
-		foreach ($FieldsToCompare as $fieldname) {
-			$tagvalues .= $fieldname.' = '.(!empty($Comments['all'][$fieldname]) ? implode(" \n", $Comments['all'][$fieldname]) : '')." \n";
-		}
-		$ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom=all&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" target="retagwindow">all</a></td>';
-		foreach ($TagsToCompare as $tagtype => $CompareThisTagType) {
-			if ($CompareThisTagType) {
-				$tagvalues = '';
-				foreach ($FieldsToCompare as $fieldname) {
-
-					if ($tagtype == 'id3v1') {
-
-						getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
-						if (($fieldname == 'genre') && !empty($Comments['all'][$fieldname][0]) && !getid3_id3v1::LookupGenreID($Comments['all'][$fieldname][0])) {
-
-							// non-standard genres can never match, so just ignore
-							$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-
-						} elseif ($fieldname == 'comment') {
-
-							if (isset($Comments[$tagtype][$fieldname][0]) && isset($Comments['all'][$fieldname][0]) && (rtrim(substr($Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr($Comments['all'][$fieldname][0], 0, 28)))) {
-								$tagvalues .= $fieldname.' = [['.$Comments[$tagtype][$fieldname][0].']]'."\n";
-								if (trim(strtolower(RemoveAccents(substr($Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr($Comments['all'][$fieldname][0], 0, 28))))) {
-									$SemiMatched[$tagtype] = true;
-								} else {
-									$Mismatched[$tagtype]  = true;
-								}
-								$FileOK = false;
-							} else {
-								$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-							}
-
-						} elseif ($fieldname == 'track') {
-
-							// intval('01/20') == intval('1')
-							$trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
-							$trackB = (isset($Comments['all'][$fieldname][0])    ? $Comments['all'][$fieldname][0]    : '');
-							if (intval($trackA) != intval($trackB)) {
-								$tagvalues .= $fieldname.' = [['.$trackA.']]'."\n";
-								$Mismatched[$tagtype]  = true;
-								$FileOK = false;
-							} else {
-								$tagvalues .= $fieldname.' = '.$trackA."\n";
-							}
-
-						} elseif ((isset($Comments[$tagtype][$fieldname][0]) ? rtrim(substr($Comments[$tagtype][$fieldname][0], 0, 30)) : '') != (isset($Comments['all'][$fieldname][0]) ? rtrim(substr($Comments['all'][$fieldname][0], 0, 30)) : '')) {
-
-							$tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n";
-							if (strtolower(RemoveAccents(trim(substr((isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : ''), 0, 30)))) == strtolower(RemoveAccents(trim(substr((isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : ''), 0, 30))))) {
-								$SemiMatched[$tagtype] = true;
-							} else {
-								$Mismatched[$tagtype]  = true;
-							}
-							$FileOK = false;
-							if (!empty($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						} else {
-
-							$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-							if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						}
-
-					} elseif (($tagtype == 'ape') && ($fieldname == 'year')) {
-
-						if (((isset($Comments['ape']['date'][0]) ? $Comments['ape']['date'][0] : '') != (isset($Comments['all']['year'][0]) ? $Comments['all']['year'][0] : '')) && ((isset($Comments['ape']['year'][0]) ? $Comments['ape']['year'][0] : '') != (isset($Comments['all']['year'][0]) ? $Comments['all']['year'][0] : ''))) {
-
-							$tagvalues .= $fieldname.' = [['.(isset($Comments['ape']['date'][0]) ? $Comments['ape']['date'][0] : '').']]'."\n";
-							$Mismatched[$tagtype]  = true;
-							$FileOK = false;
-							if (isset($Comments['ape']['date'][0]) && (strlen(trim($Comments['ape']['date'][0])) > 0)) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						} else {
-
-							$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-							if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						}
-
-					} elseif (($fieldname == 'genre') && !empty($Comments['all'][$fieldname]) && !empty($Comments[$tagtype][$fieldname]) && in_array($Comments[$tagtype][$fieldname][0], $Comments['all'][$fieldname])) {
-
-						$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-						if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-							$EmptyTags[$tagtype] = false;
-						}
-
-					} elseif ((isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '') != (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '')) {
-
-						$skiptracknumberfield = false;
-						switch ($fieldname) {
-							case 'track':
-							case 'tracknumber':
-							case 'track_number':
-								$trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
-								$trackB = (isset($Comments['all'][$fieldname][0])    ? $Comments['all'][$fieldname][0]    : '');
-								if (intval($trackA) == intval($trackB)) {
-									$skiptracknumberfield = true;
-								}
-								break;
-						}
-						if (!$skiptracknumberfield) {
-							$tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n";
-							$tagA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
-							$tagB = (isset($Comments['all'][$fieldname][0])    ? $Comments['all'][$fieldname][0]    : '');
-							if (trim(strtolower(RemoveAccents($tagA))) == trim(strtolower(RemoveAccents($tagB)))) {
-								$SemiMatched[$tagtype] = true;
-							} else {
-								$Mismatched[$tagtype]  = true;
-							}
-							$FileOK = false;
-							if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-								$EmptyTags[$tagtype] = false;
-							}
-						}
-
-					} else {
-
-						$tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
-						if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
-							$EmptyTags[$tagtype] = false;
-						}
-
-					}
-				}
-
-				if ($EmptyTags[$tagtype]) {
-					$FileOK = false;
-					$ThisLine .= '<td bgcolor="#0099cc">';
-				} elseif ($SemiMatched[$tagtype]) {
-					$ThisLine .= '<td bgcolor="#ff9999">';
-				} elseif ($Mismatched[$tagtype]) {
-					$ThisLine .= '<td bgcolor="#ff0000">';
-				} else {
-					$ThisLine .= '<td bgcolor="#00cc00">';
-				}
-				$ThisLine .= '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom='.$tagtype.'&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" TARGET="retagwindow">'.$tagtype.'</a>';
-				$ThisLine .= '</td>';
-			}
-		}
-		$ThisLine .= '</tr>';
-
-		if (!$FileOK) {
-			$NotOKfiles++;
-
-			echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($row['filename'], ENT_QUOTES).'";</script>';
-			flush();
-
-			if (!empty($_REQUEST['autofix'])) {
-
-				$AnyMismatched = false;
-				foreach ($Mismatched as $key => $value) {
-					if ($value && ($EmptyTags["$key"] === false)) {
-						$AnyMismatched = true;
-					}
-				}
-				if ($AnyMismatched && empty($_REQUEST['autofixforcesource'])) {
-
-					echo $ThisLine;
-
-				} else {
-
-					$TagsToSynch = '';
-					foreach ($EmptyTags as $key => $value) {
-						if ($value) {
-							switch ($key) {
-								case 'id3v1':
-									$TagsToSynch .= '1';
-									break;
-								case 'id3v2':
-									$TagsToSynch .= '2';
-									break;
-								case 'ape':
-									$TagsToSynch .= 'A';
-									break;
-							}
-						}
-					}
-
-					$autofixforcesource = (!empty($_REQUEST['autofixforcesource']) ? $_REQUEST['autofixforcesource'] : 'all');
-					$TagsToSynch        = (!empty($_REQUEST['autofixforcedest'])   ? $_REQUEST['autofixforcedest']   : $TagsToSynch);
-
-					$errors = array();
-					if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors)) {
-						$Autofixedfiles++;
-						echo '<tr bgcolor="#00CC00">';
-					} else {
-						echo '<tr bgcolor="#FF0000">';
-					}
-					echo '<td>&nbsp;</th>';
-					echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'" title="'.htmlentities(implode("\n", $errors), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-					echo '<td><table border="0">';
-					echo '<tr><td><b>'.$TagsToSynch.'</b></td></tr>';
-					echo '</table></td></tr>';
-				}
-
-			} else {
-
-				echo $ThisLine;
-
-			}
-		}
-	}
-
-	echo '</table><br>';
-	echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "";</script>';
-	echo 'Found <b>'.number_format($NotOKfiles).'</b> files with unsynchronized tags, and auto-fixed '.number_format($Autofixedfiles).' of them.';
-
-} elseif (!empty($_REQUEST['filenamepattern'])) {
-
-	$patterns['A'] = 'artist';
-	$patterns['T'] = 'title';
-	$patterns['M'] = 'album';
-	$patterns['N'] = 'track';
-	$patterns['G'] = 'genre';
-	$patterns['R'] = 'remix';
-
-	$FieldsToUse = explode(' ', wordwrap(preg_replace('#[^A-Z]#i', '', $_REQUEST['filenamepattern']), 1, ' ', 1));
-	//$FieldsToUse = explode(' ', wordwrap($_REQUEST['filenamepattern'], 1, ' ', 1));
-	foreach ($FieldsToUse as $FieldID) {
-		$FieldNames[] = $patterns["$FieldID"];
-	}
-
-	$SQLquery  = 'SELECT `filename`, `fileformat`, '.implode(', ', $FieldNames);
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	echo 'Files that do not match naming pattern: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&autofix=1').'">auto-fix</a>)<br>';
-	echo '<table border="1" cellspacing="0" cellpadding="3">';
-	echo '<tr><th>view</th><th>Why</th><td><b>Actual filename</b><br>(click to play/edit file)</td><td><b>Correct filename (based on tags)</b>'.(empty($_REQUEST['autofix']) ? '<br>(click to rename file to this)' : '').'</td></tr>';
-	$nonmatchingfilenames = 0;
-	$Pattern = $_REQUEST['filenamepattern'];
-	$PatternLength = strlen($Pattern);
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(10);
-		$PatternFilename = '';
-		for ($i = 0; $i < $PatternLength; $i++) {
-			if (isset($patterns[$Pattern{$i}])) {
-				$PatternFilename .= trim(strtr($row[$patterns[$Pattern{$i}]], ':\\*<>|', ';-¤«»¦'), ' ');
-			} else {
-				$PatternFilename .= $Pattern{$i};
-			}
-		}
-
-		// Replace "~" with "-" if characters immediately before and after are both numbers,
-		// "/" has been replaced with "~" above which is good for multi-song medley dividers,
-		// but for things like 24/7, 7/8ths, etc it looks better if it's 24-7, 7-8ths, etc.
-		$PatternFilename = preg_replace('#([ a-z]+)/([ a-z]+)#i', '\\1~\\2', $PatternFilename);
-		$PatternFilename = str_replace('/',  '×',  $PatternFilename);
-
-		$PatternFilename = str_replace('?',  '¿',  $PatternFilename);
-		$PatternFilename = str_replace(' "', ' ', $PatternFilename);
-		$PatternFilename = str_replace('("', '(', $PatternFilename);
-		$PatternFilename = str_replace('-"', '-', $PatternFilename);
-		$PatternFilename = str_replace('" ', ' ', $PatternFilename.' ');
-		$PatternFilename = str_replace('"',  '',  $PatternFilename);
-		$PatternFilename = str_replace('  ', ' ',  $PatternFilename);
-
-
-		$ParenthesesPairs = array('()', '[]', '{}');
-		foreach ($ParenthesesPairs as $pair) {
-
-			// multiple remixes are stored tab-seperated in the database.
-			// change "{2000 Version\tSomebody Remix}" into "{2000 Version} {Somebody Remix}"
-			while (preg_match('#^(.*)'.preg_quote($pair{0}).'([^'.preg_quote($pair{1}).']*)('."\t".')([^'.preg_quote($pair{0}).']*)'.preg_quote($pair{1}).'#', $PatternFilename, $matches)) {
-				$PatternFilename = $matches[1].$pair{0}.$matches[2].$pair{1}.' '.$pair{0}.$matches[4].$pair{1};
-			}
-
-			// remove empty parenthesized pairs (probably where no track numbers, remix version, etc)
-			$PatternFilename = preg_replace('#'.preg_quote($pair).'#', '', $PatternFilename);
-
-			// "[01]  - Title With No Artist.mp3"  ==>  "[01] Title With No Artist.mp3"
-			$PatternFilename = preg_replace('#'.preg_quote($pair{1}).' +\- #', $pair{1}.' ', $PatternFilename);
-
-		}
-
-		// get rid of leading & trailing spaces if end items (artist or title for example) are missing
-		$PatternFilename  = trim($PatternFilename, ' -');
-
-		if (!$PatternFilename) {
-			// no tags to create a filename from -- skip this file
-			continue;
-		}
-		$PatternFilename .= '.'.$row['fileformat'];
-
-		$ActualFilename = basename($row['filename']);
-		if ($ActualFilename != $PatternFilename) {
-
-			$NotMatchedReasons = '';
-			if (strtolower($ActualFilename) === strtolower($PatternFilename)) {
-				$NotMatchedReasons .= 'Aa ';
-			} elseif (RemoveAccents($ActualFilename) === RemoveAccents($PatternFilename)) {
-				$NotMatchedReasons .= 'ée ';
-			}
-
-
-			$actualExt  = '.'.fileextension($ActualFilename);
-			$patternExt = '.'.fileextension($PatternFilename);
-			$ActualFilenameNoExt  = (($actualExt  != '.') ? substr($ActualFilename,   0, 0 - strlen($actualExt))  : $ActualFilename);
-			$PatternFilenameNoExt = (($patternExt != '.') ? substr($PatternFilename,  0, 0 - strlen($patternExt)) : $PatternFilename);
-
-			if (strpos($PatternFilenameNoExt, $ActualFilenameNoExt) !== false) {
-				$DifferenceBoldedName  = str_replace($ActualFilenameNoExt, '</b>'.$ActualFilenameNoExt.'<b>', $PatternFilenameNoExt);
-			} else {
-				$ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt));
-				for ($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset++) {
-					if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset}) {
-						break;
-					}
-				}
-				$DifferenceBoldedName  = '</b>'.substr($PatternFilenameNoExt, 0, $DifferenceOffset).'<b>'.substr($PatternFilenameNoExt, $DifferenceOffset);
-			}
-			$DifferenceBoldedName .= (($actualExt == $patternExt) ? '</b>'.$patternExt.'<b>' : $patternExt);
-
-
-			echo '<tr>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">view</a></td>';
-			echo '<td>&nbsp;'.$NotMatchedReasons.'</td>';
-			echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($ActualFilename).'</a></td>';
-
-			if (!empty($_REQUEST['autofix'])) {
-
-				$results = '';
-				if (RenameFileFromTo($row['filename'], dirname($row['filename']).'/'.$PatternFilename, $results)) {
-					echo '<TD BGCOLOR="#009900">';
-				} else {
-					echo '<TD BGCOLOR="#FF0000">';
-				}
-				echo '<b>'.$DifferenceBoldedName.'</b></td>';
-
-
-			} else {
-
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&renamefilefrom='.urlencode($row['filename']).'&renamefileto='.urlencode(dirname($row['filename']).'/'.$PatternFilename)).'" title="'.htmlentities(basename($row['filename'])."\n".basename($PatternFilename), ENT_QUOTES).'" target="renamewindow">';
-				echo '<b>'.$DifferenceBoldedName.'</b></a></td>';
-
-			}
-			echo '</tr>';
-
-			$nonmatchingfilenames++;
-		}
-	}
-	echo '</table><br>';
-	echo 'Found '.number_format($nonmatchingfilenames).' files that do not match naming pattern<br>';
-
-
-} elseif (!empty($_REQUEST['encoderoptionsdistribution'])) {
-
-	if (isset($_REQUEST['showtagfiles'])) {
-		$SQLquery  = 'SELECT `filename`, `encoder_options` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`encoder_options` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")';
-		$SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-		$SQLquery .= ' ORDER BY `filename` ASC';
-		$result = mysql_query_safe($SQLquery);
-
-		if (!empty($_REQUEST['m3u'])) {
-
-			header('Content-type: audio/x-mpegurl');
-			echo '#EXTM3U'."\n";
-			while ($row = mysql_fetch_array($result)) {
-				echo WindowsShareSlashTranslate($row['filename'])."\n";
-			}
-			exit;
-
-		} else {
-
-			echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Show all Encoder Options</a><hr>';
-			echo 'Files with Encoder Options <b>'.$_REQUEST['showtagfiles'].'</b>:<br>';
-			echo '<table border="1" cellspacing="0" cellpadding="3">';
-			while ($row = mysql_fetch_array($result)) {
-				echo '<tr>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '<td>'.$row['encoder_options'].'</td>';
-				echo '</tr>';
-			}
-			echo '</table>';
-
-		}
-
-	} elseif (!isset($_REQUEST['m3u'])) {
-
-		$SQLquery  = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-		$SQLquery .= ' GROUP BY `encoder_options`';
-		$SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC, `num` DESC, `encoder_options` ASC';
-		$result = mysql_query_safe($SQLquery);
-		echo 'Files with Encoder Options:<br>';
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>Encoder Options</th><th>Count</th><th>M3U</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<td>'.$row['encoder_options'].'</td>';
-			echo '<TD ALIGN="RIGHT"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '')).'">'.number_format($row['num']).'</a></td>';
-			echo '<TD ALIGN="RIGHT"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '').'&m3u=.m3u').'">m3u</a></td>';
-			echo '</tr>';
-		}
-		echo '</table><hr>';
-
-	}
-
-} elseif (!empty($_REQUEST['tagtypes'])) {
-
-	if (!isset($_REQUEST['m3u'])) {
-		$SQLquery  = 'SELECT `tags`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-		$SQLquery .= ' GROUP BY `tags`';
-		$SQLquery .= ' ORDER BY `num` DESC';
-		$result = mysql_query_safe($SQLquery);
-		echo 'Files with tags:<br>';
-		echo '<table border="1" cellspacing="0" cellpadding="3">';
-		echo '<tr><th>Tags</th><th>Count</th><th>M3U</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<td>'.$row['tags'].'</td>';
-			echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '')).'">'.number_format($row['num']).'</a></td>';
-			echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '').'&m3u=.m3u').'">m3u</a></td>';
-			echo '</tr>';
-		}
-		echo '</table><hr>';
-	}
-
-	if (isset($_REQUEST['showtagfiles'])) {
-		$SQLquery  = 'SELECT `filename`, `tags` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`tags` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")';
-		$SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-		$SQLquery .= ' ORDER BY `filename` ASC';
-		$result = mysql_query_safe($SQLquery);
-
-		if (!empty($_REQUEST['m3u'])) {
-
-			header('Content-type: audio/x-mpegurl');
-			echo '#EXTM3U'."\n";
-			while ($row = mysql_fetch_array($result)) {
-				echo WindowsShareSlashTranslate($row['filename'])."\n";
-			}
-			exit;
-
-		} else {
-
-			echo '<table border="1" cellspacing="0" cellpadding="3">';
-			while ($row = mysql_fetch_array($result)) {
-				echo '<tr>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '<td>'.$row['tags'].'</td>';
-				echo '</tr>';
-			}
-			echo '</table>';
-
-		}
-	}
-
-
-} elseif (!empty($_REQUEST['md5datadupes'])) {
-
-	$OtherFormats = '';
-	$AVFormats    = '';
-
-	$SQLquery  = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`md5_data` <> "")';
-	$SQLquery .= ' GROUP BY `md5_data`';
-	$SQLquery .= ' ORDER BY `num` DESC';
-	$result = mysql_query_safe($SQLquery);
-	while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
-		set_time_limit(30);
-
-		$filenames = array();
-		$tags      = array();
-		$md5_data  = array();
-		$SQLquery  = 'SELECT `fileformat`, `filename`, `tags`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`md5_data` = "'.mysql_real_escape_string($row['md5_data']).'")';
-		$SQLquery .= ' ORDER BY `filename` ASC';
-		$result2 = mysql_query_safe($SQLquery);
-		while ($row2 = mysql_fetch_array($result2)) {
-			$thisfileformat = $row2['fileformat'];
-			$filenames[] = $row2['filename'];
-			$tags[]      = $row2['tags'];
-			$md5_data[]  = $row['md5_data'];
-		}
-
-		$thisline  = '<tr>';
-		$thisline .= '<TD VALIGN="TOP" style="font-family: monospace;">'.implode('<br>', $md5_data).'</td>';
-		$thisline .= '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $tags).'</td>';
-		$thisline .= '<TD VALIGN="TOP">'.implode('<br>', $filenames).'</td>';
-		$thisline .= '</tr>';
-
-		if (in_array($thisfileformat, $IgnoreNoTagFormats)) {
-			$OtherFormats .= $thisline;
-		} else {
-			$AVFormats .= $thisline;
-		}
-	}
-	echo 'Duplicated MD5_DATA (Audio/Video files):<table border="1" cellspacing="0" cellpadding="2">';
-	echo $AVFormats.'</table><hr>';
-	echo 'Duplicated MD5_DATA (Other files):<table border="1" cellspacing="0" cellpadding="2">';
-	echo $OtherFormats.'</table><hr>';
-
-
-} elseif (!empty($_REQUEST['artisttitledupes'])) {
-
-	if (isset($_REQUEST['m3uartist']) && isset($_REQUEST['m3utitle'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		$SQLquery  = 'SELECT `filename`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($_REQUEST['m3uartist']).'")';
-		$SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($_REQUEST['m3utitle']).'")';
-		$SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
-		$result = mysql_query_safe($SQLquery);
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	}
-
-	$SQLquery  = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`artist` <> "")';
-	$SQLquery .= ' AND (`title` <> "")';
-	$SQLquery .= ' GROUP BY `artist`, `title`'.(!empty($_REQUEST['samemix']) ? ', `remix`' : '');
-	$SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC';
-	$result = mysql_query_safe($SQLquery);
-	$uniquetitles = 0;
-	$uniquefiles  = 0;
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
-			$SQLquery  = 'SELECT `filename`';
-			$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")';
-			$SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")';
-			if (!empty($_REQUEST['samemix'])) {
-				$SQLquery .= ' AND (`remix` = "'.mysql_real_escape_string($row['remix']).'")';
-			}
-			$SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
-			$result2 = mysql_query_safe($SQLquery);
-			while ($row2 = mysql_fetch_array($result2)) {
-				echo WindowsShareSlashTranslate($row2['filename'])."\n";
-			}
-		}
-		exit;
-
-	} else {
-
-		echo 'Duplicated aritst + title: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1').'">Identical Mix/Version only</a>)<br>';
-		echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&m3u=.m3u').'">.m3u version</a>)<br>';
-		echo '<table border="1" cellspacing="0" cellpadding="2">';
-		echo '<tr><th colspan="3">&nbsp;</th><th>Artist</th><th>Title</th><th>Version</th><th>&nbsp;</th><th>&nbsp;</th><th>Filename</th></tr>';
-
-		while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
-			$uniquetitles++;
-			set_time_limit(30);
-
-			$filenames = array();
-			$artists   = array();
-			$titles    = array();
-			$remixes   = array();
-			$bitrates  = array();
-			$playtimes = array();
-			$SQLquery  = 'SELECT `filename`, `artist`, `title`, `remix`, `audio_bitrate`, `vbr_method`, `playtime_seconds`, `encoder_options`';
-			$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")';
-			$SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")';
-			$SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
-			$result2 = mysql_query_safe($SQLquery);
-			while ($row2 = mysql_fetch_array($result2)) {
-				$uniquefiles++;
-				$filenames[] = $row2['filename'];
-				$artists[]   = $row2['artist'];
-				$titles[]    = $row2['title'];
-				$remixes[]   = $row2['remix'];
-				if ($row2['vbr_method']) {
-					$bitrates[]  = '<B'.($row2['encoder_options'] ? ' style="text-decoration: underline; cursor: help;" title="'.$row2['encoder_options'] : '').'">'.BitrateText($row2['audio_bitrate'] / 1000).'</b>';
-				} else {
-					$bitrates[]  = BitrateText($row2['audio_bitrate'] / 1000);
-				}
-				$playtimes[] = getid3_lib::PlaytimeString($row2['playtime_seconds']);
-			}
-
-			echo '<tr>';
-			echo '<TD NOWRAP VALIGN="TOP">';
-			foreach ($filenames as $file) {
-				echo '<a href="'.htmlentities('demo.browse.php?deletefile='.urlencode($file).'&noalert=1').'" onClick="return confirm(\'Are you sure you want to delete '.addslashes($file).'? \n(this action cannot be un-done)\');" title="'.htmlentities('Permanently delete '."\n".$file, ENT_QUOTES).'" target="deletedupewindow">delete</a><br>';
-			}
-			echo '</td>';
-			echo '<TD NOWRAP VALIGN="TOP">';
-			foreach ($filenames as $file) {
-				echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($file)).'">play</a><br>';
-			}
-			echo '</td>';
-			echo '<TD VALIGN="MIDDLE" ALIGN="CENTER" ><a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&m3uartist='.urlencode($artists[0]).'&m3utitle='.urlencode($titles[0])).'">play all</a></td>';
-			echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $artists).'</td>';
-			echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $titles).'</td>';
-			echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $remixes).'</td>';
-			echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $bitrates).'</td>';
-			echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $playtimes).'</td>';
-
-			echo '<TD VALIGN="TOP" NOWRAP ALIGN="LEFT"><table border="0" cellspacing="0" cellpadding="0">';
-			foreach ($filenames as $file) {
-				echo '<tr><TD NOWRAP ALIGN="RIGHT"><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($file)).'"><span style="color: #339966;">'.dirname($file).'/</span>'.basename($file).'</a></td></tr>';
-			}
-			echo '</table></td>';
-
-			echo '</tr>';
-		}
-
-	}
-	echo '</table>';
-	echo number_format($uniquefiles).' files with '.number_format($uniquetitles).' unique <i>aritst + title</i><br>';
-	echo '<hr>';
-
-} elseif (!empty($_REQUEST['filetypelist'])) {
-
-	list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']);
-	$SQLquery  = 'SELECT `filename`, `fileformat`, `audio_dataformat`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` = "'.mysql_real_escape_string($fileformat).'")';
-	$SQLquery .= ' AND (`audio_dataformat` = "'.mysql_real_escape_string($audioformat).'")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	echo 'Files of format <b>'.$fileformat.'.'.$audioformat.'</b>:<table border="1" cellspacing="0" cellpadding="4">';
-	echo '<tr><th>file</th><th>audio</th><th>filename</th></tr>';
-	while ($row = mysql_fetch_array($result)) {
-		echo '<tr>';
-		echo '<td>'.$row['fileformat'].'</td>';
-		echo '<td>'.$row['audio_dataformat'].'</td>';
-		echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-		echo '</tr>';
-	}
-	echo '</table><hr>';
-
-} elseif (!empty($_REQUEST['trackinalbum'])) {
-
-	$SQLquery  = 'SELECT `filename`, `album`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`album` LIKE "% [%")';
-	$SQLquery .= ' ORDER BY `album` ASC, `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} elseif (!empty($_REQUEST['autofix'])) {
-
-		getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
-		getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
-
-		while ($row = mysql_fetch_array($result)) {
-			set_time_limit(30);
-			$ThisFileInfo = $getID3->analyze($filename);
-			getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-			if (!empty($ThisFileInfo['tags'])) {
-
-				$Album = trim(str_replace(strstr($ThisFileInfo['comments']['album'][0], ' ['), '', $ThisFileInfo['comments']['album'][0]));
-				$Track = (string) intval(str_replace(' [', '', str_replace(']', '', strstr($ThisFileInfo['comments']['album'][0], ' ['))));
-				if ($Track == '0') {
-					$Track = '';
-				}
-				if ($Album && $Track) {
-					echo '<hr>'.htmlentities($row['filename']).'<br>';
-					echo '<i>'.htmlentities($Album).'</i> (track #'.$Track.')<br>';
-					echo '<b>ID3v2:</b> '.(RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!').', ';
-					$WriteID3v1_title   = (isset($ThisFileInfo['comments']['title'][0])   ? $ThisFileInfo['comments']['title'][0]   : '');
-					$WriteID3v1_artist  = (isset($ThisFileInfo['comments']['artist'][0])  ? $ThisFileInfo['comments']['artist'][0]  : '');
-					$WriteID3v1_year    = (isset($ThisFileInfo['comments']['year'][0])    ? $ThisFileInfo['comments']['year'][0]    : '');
-					$WriteID3v1_comment = (isset($ThisFileInfo['comments']['comment'][0]) ? $ThisFileInfo['comments']['comment'][0] : '');
-					$WriteID3v1_genreid = (isset($ThisFileInfo['comments']['genreid'][0]) ? $ThisFileInfo['comments']['genreid'][0] : '');
-					echo '<b>ID3v1:</b> '.(WriteID3v1($row['filename'], $WriteID3v1_title, $WriteID3v1_artist, $Album, $WriteID3v1_year, $WriteID3v1_comment, $WriteID3v1_genreid, $Track, false) ? 'updated' : 'UPDATE FAILED').'<br>';
-				} else {
-					echo ' . ';
-				}
-
-			} else {
-
-				echo '<hr>FAILED<br>'.htmlentities($row['filename']).'<hr>';
-
-			}
-			flush();
-		}
-
-	} else {
-
-		echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with <b>[??]</b>-format track numbers in album field:<br>';
-		if (mysql_num_rows($result) > 0) {
-			echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&m3u=.m3u').'">.m3u version</a>)<br>';
-			echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&autofix=1').'">Try to auto-fix</a><br>';
-			echo '<table border="1" cellspacing="0" cellpadding="4">';
-			while ($row = mysql_fetch_array($result)) {
-				echo '<tr>';
-				echo '<td>'.$row['album'].'</td>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '</tr>';
-			}
-			echo '</table>';
-		}
-		echo '<hr>';
-
-	}
-
-} elseif (!empty($_REQUEST['fileextensions'])) {
-
-	$SQLquery  = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	$invalidextensionfiles = 0;
-	$invalidextensionline  = '<table border="1" cellspacing="0" cellpadding="4">';
-	$invalidextensionline .= '<tr><th>file</th><th>audio</th><th>video</th><th>tags</th><th>actual</th><th>correct</th><th>filename</th></tr>';
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-
-		$acceptableextensions = AcceptableExtensions($row['fileformat'], $row['audio_dataformat'], $row['video_dataformat']);
-		$actualextension      = strtolower(fileextension($row['filename']));
-		if ($acceptableextensions && !in_array($actualextension, $acceptableextensions)) {
-			$invalidextensionfiles++;
-
-			$invalidextensionline .= '<tr>';
-			$invalidextensionline .= '<td>'.$row['fileformat'].'</td>';
-			$invalidextensionline .= '<td>'.$row['audio_dataformat'].'</td>';
-			$invalidextensionline .= '<td>'.$row['video_dataformat'].'</td>';
-			$invalidextensionline .= '<td>'.$row['tags'].'</td>';
-			$invalidextensionline .= '<td>'.$actualextension.'</td>';
-			$invalidextensionline .= '<td>'.implode('; ', $acceptableextensions).'</td>';
-			$invalidextensionline .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-			$invalidextensionline .= '</tr>';
-		}
-	}
-	$invalidextensionline .= '</table><hr>';
-	echo number_format($invalidextensionfiles).' files with incorrect filename extension:<br>';
-	echo $invalidextensionline;
-
-} elseif (isset($_REQUEST['genredistribution'])) {
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		$SQLquery  = 'SELECT `filename`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (BINARY `genre` = "'.$_REQUEST['genredistribution'].'")';
-		$SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-		$SQLquery .= ' ORDER BY `filename` ASC';
-		$result = mysql_query_safe($SQLquery);
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} else {
-
-		if ($_REQUEST['genredistribution'] == '%') {
-
-			$SQLquery  = 'SELECT COUNT(*) AS `num`, `genre`';
-			$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
-			$SQLquery .= ' GROUP BY `genre`';
-			$SQLquery .= ' ORDER BY `num` DESC';
-			$result = mysql_query_safe($SQLquery);
-			getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
-			echo '<table border="1" cellspacing="0" cellpadding="4">';
-			echo '<tr><th>Count</th><th>Genre</th><th>m3u</th></tr>';
-			while ($row = mysql_fetch_array($result)) {
-				$GenreID = getid3_id3v1::LookupGenreID($row['genre']);
-				if (is_numeric($GenreID)) {
-					echo '<tr bgcolor="#00FF00;">';
-				} else {
-					echo '<tr bgcolor="#FF9999;">';
-				}
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode($row['genre'])).'">'.number_format($row['num']).'</a></td>';
-				echo '<td nowrap>'.str_replace("\t", '<br>', $row['genre']).'</td>';
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3u=.m3u&genredistribution='.urlencode($row['genre'])).'">.m3u</a></td>';
-				echo '</tr>';
-			}
-			echo '</table><hr>';
-
-		} else {
-
-			$SQLquery  = 'SELECT `filename`, `genre`';
-			$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-			$SQLquery .= ' WHERE (`genre` LIKE "'.mysql_real_escape_string($_REQUEST['genredistribution']).'")';
-			$SQLquery .= ' ORDER BY `filename` ASC';
-			$result = mysql_query_safe($SQLquery);
-			echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">All Genres</a><br>';
-			echo '<table border="1" cellspacing="0" cellpadding="4">';
-			echo '<tr><th>Genre</th><th>m3u</th><th>Filename</th></tr>';
-			while ($row = mysql_fetch_array($result)) {
-				echo '<tr>';
-				echo '<TD NOWRAP>'.str_replace("\t", '<br>', $row['genre']).'</td>';
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
-				echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-				echo '</tr>';
-			}
-			echo '</table><hr>';
-
-		}
-
-
-	}
-
-} elseif (!empty($_REQUEST['formatdistribution'])) {
-
-	$SQLquery  = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`';
-	$SQLquery .= ' ORDER BY `num` DESC';
-	$result = mysql_query_safe($SQLquery);
-	echo 'File format distribution:<table border="1" cellspacing="0" cellpadding="4">';
-	echo '<tr><th>Number</th><th>Format</th></tr>';
-	while ($row = mysql_fetch_array($result)) {
-		echo '<tr>';
-		echo '<TD ALIGN="RIGHT">'.number_format($row['num']).'</td>';
-		echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filetypelist='.$row['fileformat'].'|'.$row['audio_dataformat']).'">'.($row['fileformat'] ? $row['fileformat'] : '<i>unknown</i>').(($row['audio_dataformat'] && ($row['audio_dataformat'] != $row['fileformat'])) ? '.'.$row['audio_dataformat'] : '').'</a></td>';
-		echo '</tr>';
-	}
-	echo '</table><hr>';
-
-} elseif (!empty($_REQUEST['errorswarnings'])) {
-
-	$SQLquery  = 'SELECT `filename`, `error`, `warning`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`error` <> "")';
-	$SQLquery .= ' OR (`warning` <> "")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-
-	if (!empty($_REQUEST['m3u'])) {
-
-		header('Content-type: audio/x-mpegurl');
-		echo '#EXTM3U'."\n";
-		while ($row = mysql_fetch_array($result)) {
-			echo WindowsShareSlashTranslate($row['filename'])."\n";
-		}
-		exit;
-
-	} else {
-
-		echo number_format(mysql_num_rows($result)).' files with errors or warnings:<br>';
-		echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1&m3u=.m3u').'">.m3u version</a>)<br>';
-		echo '<table border="1" cellspacing="0" cellpadding="4">';
-		echo '<tr><th>Filename</th><th>Error</th><th>Warning</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
-			echo '<td>'.(!empty($row['error'])   ? '<li>'.str_replace("\t", '<li>', htmlentities($row['error'])).'</li>' : '&nbsp;').'</td>';
-			echo '<td>'.(!empty($row['warning']) ? '<li>'.str_replace("\t", '<li>', htmlentities($row['warning'])).'</li>' : '&nbsp;').'</td>';
-			echo '</tr>';
-		}
-	}
-	echo '</table><hr>';
-
-} elseif (!empty($_REQUEST['fixid3v1padding'])) {
-
-	getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.id3v1.php', __FILE__, true);
-	$id3v1_writer = new getid3_write_id3v1;
-
-	$SQLquery  = 'SELECT `filename`, `error`, `warning`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` = "mp3")';
-	$SQLquery .= ' AND (`warning` <> "")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	$totaltofix = mysql_num_rows($result);
-	$rowcounter = 0;
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-		if (strpos($row['warning'], 'Some ID3v1 fields do not use NULL characters for padding') !== false) {
-			set_time_limit(30);
-			$id3v1_writer->filename = $row['filename'];
-			echo ($id3v1_writer->FixID3v1Padding() ? '<span style="color: #009900;">fixed - ' : '<span style="color: #FF0000;">error - ');
-		} else {
-			echo '<span style="color: #0000FF;">No error? - ';
-		}
-		echo '['.++$rowcounter.' / '.$totaltofix.'] ';
-		echo htmlentities($row['filename']).'</span><br>';
-		flush();
-	}
-
-} elseif (!empty($_REQUEST['vbrmethod'])) {
-
-	if ($_REQUEST['vbrmethod'] == '1') {
-
-		$SQLquery  = 'SELECT COUNT(*) AS `num`, `vbr_method`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' GROUP BY `vbr_method`';
-		$SQLquery .= ' ORDER BY `vbr_method`';
-		$result = mysql_query_safe($SQLquery);
-		echo 'VBR methods:<table border="1" cellspacing="0" cellpadding="4">';
-		echo '<tr><th>Count</th><th>VBR Method</th></tr>';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr>';
-			echo '<TD ALIGN="RIGHT">'.htmlentities(number_format($row['num'])).'</td>';
-			if ($row['vbr_method']) {
-				echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod='.$row['vbr_method'], ENT_QUOTES).'">'.htmlentities($row['vbr_method']).'</a></td>';
-			} else {
-				echo '<td><i>CBR</i></td>';
-			}
-			echo '</tr>';
-		}
-		echo '</table>';
-
-	} else {
-
-		$SQLquery  = 'SELECT `filename`';
-		$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-		$SQLquery .= ' WHERE (`vbr_method` = "'.mysql_real_escape_string($_REQUEST['vbrmethod']).'")';
-		$result = mysql_query_safe($SQLquery);
-		echo number_format(mysql_num_rows($result)).' files with VBR_method of "'.$_REQUEST['vbrmethod'].'":<table border="1" cellspacing="0" cellpadding="3">';
-		while ($row = mysql_fetch_array($result)) {
-			echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
-			echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>';
-		}
-		echo '</table>';
-
-	}
-	echo '<hr>';
-
-} elseif (!empty($_REQUEST['correctcase'])) {
-
-	$SQLquery  = 'SELECT `filename`, `fileformat`';
-	$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-	$SQLquery .= ' WHERE (`fileformat` <> "")';
-	$SQLquery .= ' ORDER BY `filename` ASC';
-	$result = mysql_query_safe($SQLquery);
-	echo 'Copy and paste the following into a DOS batch file. You may have to run this script more than once to catch all the changes (remember to scan for deleted/changed files and rescan directory between scans)<hr>';
-	echo '<PRE>';
-	$lastdir = '';
-	while ($row = mysql_fetch_array($result)) {
-		set_time_limit(30);
-		$CleanedFilename = CleanUpFileName($row['filename']);
-		if ($row['filename'] != $CleanedFilename) {
-			if (strtolower($lastdir) != strtolower(str_replace('/', '\\', dirname($row['filename'])))) {
-				$lastdir = str_replace('/', '\\', dirname($row['filename']));
-				echo 'cd "'.$lastdir.'"'."\n";
-			}
-			echo 'ren "'.basename($row['filename']).'" "'.basename(CleanUpFileName($row['filename'])).'"'."\n";
-		}
-	}
-	echo '</PRE>';
-	echo '<hr>';
-
-}
-
-function CleanUpFileName($filename) {
-	$DirectoryName = dirname($filename);
-	$FileExtension = fileextension(basename($filename));
-	$BaseFilename  = basename($filename, '.'.$FileExtension);
-
-	$BaseFilename = strtolower($BaseFilename);
-	$BaseFilename = str_replace('_', ' ', $BaseFilename);
-	//$BaseFilename = str_replace('-', ' - ', $BaseFilename);
-	$BaseFilename = str_replace('(', ' (', $BaseFilename);
-	$BaseFilename = str_replace('( ', '(', $BaseFilename);
-	$BaseFilename = str_replace(')', ') ', $BaseFilename);
-	$BaseFilename = str_replace(' )', ')', $BaseFilename);
-	$BaseFilename = str_replace(' \'\'', ' ', $BaseFilename);
-	$BaseFilename = str_replace('\'\' ', ' ', $BaseFilename);
-	$BaseFilename = str_replace(' vs ', ' vs. ', $BaseFilename);
-	while (strstr($BaseFilename, '  ') !== false) {
-		$BaseFilename = str_replace('  ', ' ', $BaseFilename);
-	}
-	$BaseFilename = trim($BaseFilename);
-
-	return $DirectoryName.'/'.BetterUCwords($BaseFilename).'.'.strtolower($FileExtension);
-}
-
-function BetterUCwords($string) {
-	$stringlength = strlen($string);
-
-	$string{0} = strtoupper($string{0});
-	for ($i = 1; $i < $stringlength; $i++) {
-		if (($string{$i - 1} == '\'') && ($i > 1) && (($string{$i - 2} == 'O') || ($string{$i - 2} == ' '))) {
-			// O'Clock, 'Em
-			$string{$i} = strtoupper($string{$i});
-		} elseif (preg_match('#^[\'A-Za-z0-9À-ÿ]$#', $string{$i - 1})) {
-			$string{$i} = strtolower($string{$i});
-		} else {
-			$string{$i} = strtoupper($string{$i});
-		}
-	}
-
-	static $LowerCaseWords = array('vs.', 'feat.');
-	static $UpperCaseWords = array('DJ', 'USA', 'II', 'MC', 'CD', 'TV', '\'N\'');
-
-	$OutputListOfWords = array();
-	$ListOfWords = explode(' ', $string);
-	foreach ($ListOfWords as $ThisWord) {
-		if (in_array(strtolower(str_replace('(', '', $ThisWord)), $LowerCaseWords)) {
-			$ThisWord = strtolower($ThisWord);
-		} elseif (in_array(strtoupper(str_replace('(', '', $ThisWord)), $UpperCaseWords)) {
-			$ThisWord = strtoupper($ThisWord);
-		} elseif ((substr($ThisWord, 0, 2) == 'Mc') && (strlen($ThisWord) > 2)) {
-			$ThisWord{2} = strtoupper($ThisWord{2});
-		} elseif ((substr($ThisWord, 0, 3) == 'Mac') && (strlen($ThisWord) > 3)) {
-			$ThisWord{3} = strtoupper($ThisWord{3});
-		}
-		$OutputListOfWords[] = $ThisWord;
-	}
-	$UCstring = implode(' ', $OutputListOfWords);
-	$UCstring = str_replace(' From ', ' from ', $UCstring);
-	$UCstring = str_replace(' \'n\' ', ' \'N\' ', $UCstring);
-
-	return $UCstring;
-}
-
-
-
-echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">';
-echo '<b>Warning:</b> Scanning a new directory will erase all previous entries in the database!<br>';
-echo 'Directory: <input type="text" name="scan" size="50" value="'.htmlentities(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : '', ENT_QUOTES).'"> ';
-echo '<input type="submit" value="Go" onClick="return confirm(\'Are you sure you want to erase all entries in the database and start scanning again?\');">';
-echo '</form>';
-echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">';
-echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).<br>';
-echo 'Directory: <input type="text" name="newscan" size="50" value="'.htmlentities(!empty($_REQUEST['newscan']) ? $_REQUEST['newscan'] : '', ENT_QUOTES).'"> ';
-echo '<input type="submit" value="Go">';
-echo '</form><hr>';
-echo '<ul>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?deadfilescheck=1').'">Remove deleted or changed files from database</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?md5datadupes=1').'">List files with identical MD5_DATA values</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1').'">List files with identical artist + title</a> (<a href="'.$_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1">same mix only</a>)</li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fileextensions=1').'">File with incorrect file extension</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?formatdistribution=1').'">File Format Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?audiobitrates=1').'">Audio Bitrate Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod=1').'">VBR_Method Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1').'">Tag Type Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">Genre Distribution</a></li>';
-//echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?missingtrackvolume=1').'">Scan for missing track volume information (update database from pre-v1.7.0b5)</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Encoder Options Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">Encoded By (ID3v2) Distribution</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1').'">Track number in Album field</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum=1').'">Track number, but no Album</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat=1').'">"feat." in Title field</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres=1').'">Blank genres</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero=1').'">Track "zero"</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments=1').'">non-empty comments</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1').'">Tags that are not synchronized</a> (<a href="'.$_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1&autofix=1">autofix</a>)</li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('[N] A - T {R}')).'">Filenames that don\'t match pattern</a> (<a href="?filenamepattern='.urlencode('[N] A - T {R}').'&autofix=1">auto-fix</a>)</li>';
-//echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('A - T')).'">Filenames that don\'t match pattern</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?correctcase=1').'">Correct filename case (Win/DOS)</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fixid3v1padding=1').'">Fix ID3v1 invalid padding</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1').'">Files with Errors and/or Warnings</a></li>';
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?rescanerrors=1').'">Re-scan only files with Errors and/or Warnings</a></li>';
-echo '</ul>';
-
-$SQLquery  = 'SELECT COUNT(*) AS `TotalFiles`, SUM(`playtime_seconds`) AS `TotalPlaytime`, SUM(`filesize`) AS `TotalFilesize`, AVG(`playtime_seconds`) AS `AvgPlaytime`, AVG(`filesize`) AS `AvgFilesize`, AVG(`audio_bitrate` + `video_bitrate`) AS `AvgBitrate`';
-$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
-$result = mysql_query_safe($SQLquery);
-if ($row = mysql_fetch_array($result)) {
-	echo '<hr size="1">';
-	echo '<div style="float: right;">';
-	echo 'Spent '.number_format(mysql_query_safe(null), 3).' seconds querying the database<br>';
-	echo '</div>';
-	echo '<b>Currently in the database:</b><TABLE>';
-	echo '<tr><th align="left">Total Files</th><td>'.number_format($row['TotalFiles']).'</td></tr>';
-	echo '<tr><th align="left">Total Filesize</th><td>'.number_format($row['TotalFilesize'] / 1048576).' MB</td></tr>';
-	echo '<tr><th align="left">Total Playtime</th><td>'.number_format($row['TotalPlaytime'] / 3600, 1).' hours</td></tr>';
-	echo '<tr><th align="left">Average Filesize</th><td>'.number_format($row['AvgFilesize'] / 1048576, 1).' MB</td></tr>';
-	echo '<tr><th align="left">Average Playtime</th><td>'.getid3_lib::PlaytimeString($row['AvgPlaytime']).'</td></tr>';
-	echo '<tr><th align="left">Average Bitrate</th><td>'.BitrateText($row['AvgBitrate'] / 1000, 1).'</td></tr>';
-	echo '</table>';
-	echo '<br clear="all">';
-}
-
-echo '</body></html>';
\ No newline at end of file
diff --git a/demos/demo.simple.php b/demos/demo.simple.php
deleted file mode 100644
index 9b3dad2..0000000
--- a/demos/demo.simple.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.simple.php - part of getID3()                    //
-// Sample script for scanning a single directory and           //
-// displaying a few pieces of information for each file        //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-echo '<html><head>';
-echo '<title>getID3() - /demo/demo.simple.php (sample script)</title>';
-echo '<style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt; }</style>';
-echo '</head><body>';
-
-
-// include getID3() library (can be in a different directory if full path is specified)
-require_once('../getid3/getid3.php');
-
-// Initialize getID3 engine
-$getID3 = new getID3;
-
-$DirectoryToScan = '/change/to/directory/you/want/to/scan'; // change to whatever directory you want to scan
-$dir = opendir($DirectoryToScan);
-echo '<table border="1" cellspacing="0" cellpadding="3">';
-echo '<tr><th>Filename</th><th>Artist</th><th>Title</th><th>Bitrate</th><th>Playtime</th></tr>';
-while (($file = readdir($dir)) !== false) {
-	$FullFileName = realpath($DirectoryToScan.'/'.$file);
-	if ((substr($FullFileName, 0, 1) != '.') && is_file($FullFileName)) {
-		set_time_limit(30);
-
-		$ThisFileInfo = $getID3->analyze($FullFileName);
-
-		getid3_lib::CopyTagsToComments($ThisFileInfo);
-
-		// output desired information in whatever format you want
-		echo '<tr>';
-		echo '<td>'.htmlentities($ThisFileInfo['filenamepath']).'</td>';
-		echo '<td>'              .htmlentities(!empty($ThisFileInfo['comments_html']['artist']) ? implode('<br>', $ThisFileInfo['comments_html']['artist'])         : chr(160)).'</td>';
-		echo '<td>'              .htmlentities(!empty($ThisFileInfo['comments_html']['title'])  ? implode('<br>', $ThisFileInfo['comments_html']['title'])          : chr(160)).'</td>';
-		echo '<td align="right">'.htmlentities(!empty($ThisFileInfo['audio']['bitrate'])        ?           round($ThisFileInfo['audio']['bitrate'] / 1000).' kbps' : chr(160)).'</td>';
-		echo '<td align="right">'.htmlentities(!empty($ThisFileInfo['playtime_string'])         ?                 $ThisFileInfo['playtime_string']                  : chr(160)).'</td>';
-		echo '</tr>';
-	}
-}
-echo '</table>';
-
-echo '</body></html>';
\ No newline at end of file
diff --git a/demos/demo.simple.write.php b/demos/demo.simple.write.php
deleted file mode 100644
index ffd9002..0000000
--- a/demos/demo.simple.write.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.simple.write.php - part of getID3()              //
-// Sample script showing basic syntax for writing tags         //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-//die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-$TextEncoding = 'UTF-8';
-
-require_once('../getid3/getid3.php');
-// Initialize getID3 engine
-$getID3 = new getID3;
-$getID3->setOption(array('encoding'=>$TextEncoding));
-
-require_once('../getid3/write.php');
-// Initialize getID3 tag-writing module
-$tagwriter = new getid3_writetags;
-//$tagwriter->filename = '/path/to/file.mp3';
-$tagwriter->filename = 'c:/file.mp3';
-
-//$tagwriter->tagformats = array('id3v1', 'id3v2.3');
-$tagwriter->tagformats = array('id3v2.3');
-
-// set various options (optional)
-$tagwriter->overwrite_tags = true;
-$tagwriter->overwrite_tags = false;
-$tagwriter->tag_encoding = $TextEncoding;
-$tagwriter->remove_other_tags = true;
-
-// populate data array
-$TagData = array(
-	'title'         => array('My Song'),
-	'artist'        => array('The Artist'),
-	'album'         => array('Greatest Hits'),
-	'year'          => array('2004'),
-	'genre'         => array('Rock'),
-	'comment'       => array('excellent!'),
-	'track'         => array('04/16'),
-	'popularimeter' => array('email'=>'user@example.net', 'rating'=>128, 'data'=>0),
-);
-$tagwriter->tag_data = $TagData;
-
-// write tags
-if ($tagwriter->WriteTags()) {
-	echo 'Successfully wrote tags<br>';
-	if (!empty($tagwriter->warnings)) {
-		echo 'There were some warnings:<br>'.implode('<br><br>', $tagwriter->warnings);
-	}
-} else {
-	echo 'Failed to write tags!<br>'.implode('<br><br>', $tagwriter->errors);
-}
diff --git a/demos/demo.write.php b/demos/demo.write.php
deleted file mode 100644
index c15394b..0000000
--- a/demos/demo.write.php
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.write.php - part of getID3()                     //
-// sample script for demonstrating writing ID3v1 and ID3v2     //
-// tags for MP3, or Ogg comment tags for Ogg Vorbis            //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']);
-
-$TaggingFormat = 'UTF-8';
-
-header('Content-Type: text/html; charset='.$TaggingFormat);
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
-echo '<html><head><title>getID3() - Sample tag writer</title></head><style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt;" }</style><body>';
-
-require_once('../getid3/getid3.php');
-// Initialize getID3 engine
-$getID3 = new getID3;
-$getID3->setOption(array('encoding'=>$TaggingFormat));
-
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
-
-$browsescriptfilename = 'demo.browse.php';
-
-$Filename = (isset($_REQUEST['Filename']) ? $_REQUEST['Filename'] : '');
-
-
-
-if (isset($_POST['WriteTags'])) {
-
-	$TagFormatsToWrite = (isset($_POST['TagFormatsToWrite']) ? $_POST['TagFormatsToWrite'] : array());
-	if (!empty($TagFormatsToWrite)) {
-		echo 'starting to write tag(s)<BR>';
-
-		$tagwriter = new getid3_writetags;
-		$tagwriter->filename       = $Filename;
-		$tagwriter->tagformats     = $TagFormatsToWrite;
-		$tagwriter->overwrite_tags = false;
-		$tagwriter->tag_encoding   = $TaggingFormat;
-		if (!empty($_POST['remove_other_tags'])) {
-			$tagwriter->remove_other_tags = true;
-		}
-
-		$commonkeysarray = array('Title', 'Artist', 'Album', 'Year', 'Comment');
-		foreach ($commonkeysarray as $key) {
-			if (!empty($_POST[$key])) {
-				$TagData[strtolower($key)][] = $_POST[$key];
-			}
-		}
-		if (!empty($_POST['Genre'])) {
-			$TagData['genre'][] = $_POST['Genre'];
-		}
-		if (!empty($_POST['GenreOther'])) {
-			$TagData['genre'][] = $_POST['GenreOther'];
-		}
-		if (!empty($_POST['Track'])) {
-			$TagData['track'][] = $_POST['Track'].(!empty($_POST['TracksTotal']) ? '/'.$_POST['TracksTotal'] : '');
-		}
-
-		if (!empty($_FILES['userfile']['tmp_name'])) {
-			if (in_array('id3v2.4', $tagwriter->tagformats) || in_array('id3v2.3', $tagwriter->tagformats) || in_array('id3v2.2', $tagwriter->tagformats)) {
-				if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
-					ob_start();
-					if ($fd = fopen($_FILES['userfile']['tmp_name'], 'rb')) {
-						ob_end_clean();
-						$APICdata = fread($fd, filesize($_FILES['userfile']['tmp_name']));
-						fclose ($fd);
-
-						list($APIC_width, $APIC_height, $APIC_imageTypeID) = GetImageSize($_FILES['userfile']['tmp_name']);
-						$imagetypes = array(1=>'gif', 2=>'jpeg', 3=>'png');
-						if (isset($imagetypes[$APIC_imageTypeID])) {
-
-							$TagData['attached_picture'][0]['data']          = $APICdata;
-							$TagData['attached_picture'][0]['picturetypeid'] = $_POST['APICpictureType'];
-							$TagData['attached_picture'][0]['description']   = $_FILES['userfile']['name'];
-							$TagData['attached_picture'][0]['mime']          = 'image/'.$imagetypes[$APIC_imageTypeID];
-
-						} else {
-							echo '<b>invalid image format (only GIF, JPEG, PNG)</b><br>';
-						}
-					} else {
-						$errormessage = ob_get_contents();
-						ob_end_clean();
-						echo '<b>cannot open '.$_FILES['userfile']['tmp_name'].'</b><br>';
-					}
-				} else {
-					echo '<b>!is_uploaded_file('.$_FILES['userfile']['tmp_name'].')</b><br>';
-				}
-			} else {
-				echo '<b>WARNING:</b> Can only embed images for ID3v2<br>';
-			}
-		}
-
-		$tagwriter->tag_data = $TagData;
-		if ($tagwriter->WriteTags()) {
-			echo 'Successfully wrote tags<BR>';
-			if (!empty($tagwriter->warnings)) {
-				echo 'There were some warnings:<BLOCKQUOTE STYLE="background-color:#FFCC33; padding: 10px;">'.implode('<br><br>', $tagwriter->warnings).'</BLOCKQUOTE>';
-			}
-		} else {
-			echo 'Failed to write tags!<BLOCKQUOTE STYLE="background-color:#FF9999; padding: 10px;">'.implode('<br><br>', $tagwriter->errors).'</BLOCKQUOTE>';
-		}
-
-	} else {
-
-		echo 'WARNING: no tag formats selected for writing - nothing written';
-
-	}
-	echo '<HR>';
-
-}
-
-
-echo '<div style="font-size: 1.2em; font-weight: bold;">Sample tag editor/writer</div>';
-echo '<a href="'.htmlentities($browsescriptfilename.'?listdirectory='.rawurlencode(realpath(dirname($Filename))), ENT_QUOTES).'">Browse current directory</a><br>';
-if (!empty($Filename)) {
-	echo '<a href="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'">Start Over</a><br><br>';
-	echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="post" enctype="multipart/form-data">';
-	echo '<table border="3" cellspacing="0" cellpadding="4">';
-	echo '<tr><th align="right">Filename:</th><td><input type="hidden" name="Filename" value="'.htmlentities($Filename, ENT_QUOTES).'"><a href="'.htmlentities($browsescriptfilename.'?filename='.rawurlencode($Filename), ENT_QUOTES).'" target="_blank">'.$Filename.'</a></td></tr>';
-	if (file_exists($Filename)) {
-
-		// Initialize getID3 engine
-		$getID3 = new getID3;
-		$OldThisFileInfo = $getID3->analyze($Filename);
-		getid3_lib::CopyTagsToComments($OldThisFileInfo);
-
-		switch ($OldThisFileInfo['fileformat']) {
-			case 'mp3':
-			case 'mp2':
-			case 'mp1':
-				$ValidTagTypes = array('id3v1', 'id3v2.3', 'ape');
-				break;
-
-			case 'mpc':
-				$ValidTagTypes = array('ape');
-				break;
-
-			case 'ogg':
-				if (!empty($OldThisFileInfo['audio']['dataformat']) && ($OldThisFileInfo['audio']['dataformat'] == 'flac')) {
-					//$ValidTagTypes = array('metaflac');
-					// metaflac doesn't (yet) work with OggFLAC files
-					$ValidTagTypes = array();
-				} else {
-					$ValidTagTypes = array('vorbiscomment');
-				}
-				break;
-
-			case 'flac':
-				$ValidTagTypes = array('metaflac');
-				break;
-
-			case 'real':
-				$ValidTagTypes = array('real');
-				break;
-
-			default:
-				$ValidTagTypes = array();
-				break;
-		}
-		echo '<tr><td align="right"><b>Title</b></td> <td><input type="text" size="40" name="Title"  value="'.htmlentities((!empty($OldThisFileInfo['comments']['title'])  ? implode(', ', $OldThisFileInfo['comments']['title'] ) : ''), ENT_QUOTES).'"></td></tr>';
-		echo '<tr><td align="right"><b>Artist</b></td><td><input type="text" size="40" name="Artist" value="'.htmlentities((!empty($OldThisFileInfo['comments']['artist']) ? implode(', ', $OldThisFileInfo['comments']['artist']) : ''), ENT_QUOTES).'"></td></tr>';
-		echo '<tr><td align="right"><b>Album</b></td> <td><input type="text" size="40" name="Album"  value="'.htmlentities((!empty($OldThisFileInfo['comments']['album'])  ? implode(', ', $OldThisFileInfo['comments']['album'] ) : ''), ENT_QUOTES).'"></td></tr>';
-		echo '<tr><td align="right"><b>Year</b></td>  <td><input type="text" size="4"  name="Year"   value="'.htmlentities((!empty($OldThisFileInfo['comments']['year'])   ? implode(', ', $OldThisFileInfo['comments']['year']  ) : ''), ENT_QUOTES).'"></td></tr>';
-
-		$TracksTotal = '';
-		$TrackNumber = '';
-		if (!empty($OldThisFileInfo['comments']['track_number']) && is_array($OldThisFileInfo['comments']['track_number'])) {
-			$RawTrackNumberArray = $OldThisFileInfo['comments']['track_number'];
-		} elseif (!empty($OldThisFileInfo['comments']['track']) && is_array($OldThisFileInfo['comments']['track'])) {
-			$RawTrackNumberArray = $OldThisFileInfo['comments']['track'];
-		} else {
-			$RawTrackNumberArray = array();
-		}
-		foreach ($RawTrackNumberArray as $key => $value) {
-			if (strlen($value) > strlen($TrackNumber)) {
-				// ID3v1 may store track as "3" but ID3v2/APE would store as "03/16"
-				$TrackNumber = $value;
-			}
-		}
-		if (strstr($TrackNumber, '/')) {
-			list($TrackNumber, $TracksTotal) = explode('/', $TrackNumber);
-		}
-		echo '<tr><td align="right"><b>Track</b></td><td><input type="text" size="2" name="Track" value="'.htmlentities($TrackNumber, ENT_QUOTES).'"> of <input type="text" size="2" name="TracksTotal" value="'.htmlentities($TracksTotal, ENT_QUOTES).'"></TD></TR>';
-
-		$ArrayOfGenresTemp = getid3_id3v1::ArrayOfGenres();   // get the array of genres
-		foreach ($ArrayOfGenresTemp as $key => $value) {      // change keys to match displayed value
-			$ArrayOfGenres[$value] = $value;
-		}
-		unset($ArrayOfGenresTemp);                            // remove temporary array
-		unset($ArrayOfGenres['Cover']);                       // take off these special cases
-		unset($ArrayOfGenres['Remix']);
-		unset($ArrayOfGenres['Unknown']);
-		$ArrayOfGenres['']      = '- Unknown -';              // Add special cases back in with renamed key/value
-		$ArrayOfGenres['Cover'] = '-Cover-';
-		$ArrayOfGenres['Remix'] = '-Remix-';
-		asort($ArrayOfGenres);                                // sort into alphabetical order
-		echo '<tr><th align="right">Genre</th><td><select name="Genre">';
-		$AllGenresArray = (!empty($OldThisFileInfo['comments']['genre']) ? $OldThisFileInfo['comments']['genre'] : array());
-		foreach ($ArrayOfGenres as $key => $value) {
-			echo '<option value="'.htmlentities($key, ENT_QUOTES).'"';
-			if (in_array($key, $AllGenresArray)) {
-				echo ' selected="selected"';
-				unset($AllGenresArray[array_search($key, $AllGenresArray)]);
-				sort($AllGenresArray);
-			}
-			echo '>'.htmlentities($value).'</option>';
-		}
-		echo '</select><input type="text" name="GenreOther" size="10" value="'.htmlentities((!empty($AllGenresArray[0]) ? $AllGenresArray[0] : ''), ENT_QUOTES).'"></td></tr>';
-
-		echo '<tr><td align="right"><b>Write Tags</b></td><td>';
-		foreach ($ValidTagTypes as $ValidTagType) {
-			echo '<input type="checkbox" name="TagFormatsToWrite[]" value="'.$ValidTagType.'"';
-			if (count($ValidTagTypes) == 1) {
-				echo ' checked="checked"';
-			} else {
-				switch ($ValidTagType) {
-					case 'id3v2.2':
-					case 'id3v2.3':
-					case 'id3v2.4':
-						if (isset($OldThisFileInfo['tags']['id3v2'])) {
-							echo ' checked="checked"';
-						}
-						break;
-
-					default:
-						if (isset($OldThisFileInfo['tags'][$ValidTagType])) {
-							echo ' checked="checked"';
-						}
-						break;
-				}
-			}
-			echo '>'.$ValidTagType.'<br>';
-		}
-		if (count($ValidTagTypes) > 1) {
-			echo '<hr><input type="checkbox" name="remove_other_tags" value="1"> Remove non-selected tag formats when writing new tag<br>';
-		}
-		echo '</td></tr>';
-
-		echo '<tr><td align="right"><b>Comment</b></td><td><textarea cols="30" rows="3" name="Comment" wrap="virtual">'.((isset($OldThisFileInfo['comments']['comment']) && is_array($OldThisFileInfo['comments']['comment'])) ? implode("\n", $OldThisFileInfo['comments']['comment']) : '').'</textarea></td></tr>';
-
-		echo '<tr><td align="right"><b>Picture</b><br>(ID3v2 only)</td><td><input type="file" name="userfile" accept="image/jpeg, image/gif, image/png"><br>';
-		echo '<select name="APICpictureType">';
-		$APICtypes = getid3_id3v2::APICPictureTypeLookup('', true);
-		foreach ($APICtypes as $key => $value) {
-			echo '<option value="'.htmlentities($key, ENT_QUOTES).'">'.htmlentities($value).'</option>';
-		}
-		echo '</select></td></tr>';
-		echo '<tr><td align="center" colspan="2"><input type="submit" name="WriteTags" value="Save Changes"> ';
-		echo '<input type="reset" value="Reset"></td></tr>';
-
-	} else {
-
-		echo '<tr><td align="right"><b>Error</b></td><td>'.htmlentities($Filename).' does not exist</td></tr>';
-
-	}
-	echo '</table>';
-	echo '</form>';
-
-}
-
-echo '</body></html>';
\ No newline at end of file
diff --git a/demos/demo.zip.php b/demos/demo.zip.php
deleted file mode 100644
index 1aaeef7..0000000
--- a/demos/demo.zip.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>               //
-//  available at http://getid3.sourceforge.net                 //
-//            or http://www.getid3.org                         //
-//          also https://github.com/JamesHeinrich/getID3       //
-/////////////////////////////////////////////////////////////////
-//                                                             //
-// /demo/demo.zip.php - part of getID3()                       //
-// Sample script how to use getID3() to decompress zip files   //
-// See readme.txt for more details                             //
-//                                                            ///
-/////////////////////////////////////////////////////////////////
-
-
-function UnzipFileContents($filename, &$errors) {
-	$errors = array();
-	$DecompressedFileContents = array();
-	if (!class_exists('getID3')) {
-		$errors[] = 'class getID3 not defined, please include getid3.php';
-	} elseif (include_once('module.archive.zip.php')) {
-		$getid3 = new getID3();
-		$getid3->info['filesize'] = filesize($filename);
-		ob_start();
-		if ($getid3->fp = fopen($filename, 'rb')) {
-			ob_end_clean();
-			$getid3_zip = new getid3_zip($getid3);
-			$getid3_zip->analyze($filename);
-			if (($getid3->info['fileformat'] == 'zip') && !empty($getid3->info['zip']['files'])) {
-				if (!empty($getid3->info['zip']['central_directory'])) {
-					$ZipDirectoryToWalk = $getid3->info['zip']['central_directory'];
-				} elseif (!empty($getid3->info['zip']['entries'])) {
-					$ZipDirectoryToWalk = $getid3->info['zip']['entries'];
-				} else {
-					$errors[] = 'failed to parse ZIP attachment "'.$piece_filename.'" (no central directory)<br>';
-					fclose($getid3->fp);
-					return false;
-				}
-				foreach ($ZipDirectoryToWalk as $key => $valuearray) {
-					fseek($getid3->fp, $valuearray['entry_offset'], SEEK_SET);
-					$LocalFileHeader = $getid3_zip->ZIPparseLocalFileHeader($getid3->fp);
-					if ($LocalFileHeader['flags']['encrypted']) {
-						// password-protected
-						$DecompressedFileContents[$valuearray['filename']] = '';
-					} else {
-						fseek($getid3->fp, $LocalFileHeader['data_offset'], SEEK_SET);
-						$compressedFileData = '';
-						while ((strlen($compressedFileData) < $LocalFileHeader['compressed_size']) && !feof($getid3->fp)) {
-							$compressedFileData .= fread($getid3->fp, 32768);
-						}
-						switch ($LocalFileHeader['raw']['compression_method']) {
-							case 0: // store - great, just copy data unchanged
-								$uncompressedFileData = $compressedFileData;
-								break;
-
-							case 8: // deflate
-								ob_start();
-								$uncompressedFileData = gzinflate($compressedFileData);
-								$gzinflate_errors = trim(strip_tags(ob_get_contents()));
-								ob_end_clean();
-								if ($gzinflate_errors) {
-									$errors[] = 'gzinflate() failed for file ['.$LocalFileHeader['filename'].']: "'.$gzinflate_errors.'"';
-									continue 2;
-								}
-								break;
-
-							case 1:  // shrink
-							case 2:  // reduce-1
-							case 3:  // reduce-2
-							case 4:  // reduce-3
-							case 5:  // reduce-4
-							case 6:  // implode
-							case 7:  // tokenize
-							case 9:  // deflate64
-							case 10: // PKWARE Date Compression Library Imploding
-								$DecompressedFileContents[$valuearray['filename']] = '';
-								$errors[] = 'unsupported ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].' = '.$getid3_zip->ZIPcompressionMethodLookup($LocalFileHeader['raw']['compression_method']).')';
-								continue 2;
-
-							default:
-								$DecompressedFileContents[$valuearray['filename']] = '';
-								$errors[] = 'unknown ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].')';
-								continue 2;
-						}
-						$DecompressedFileContents[$valuearray['filename']] = $uncompressedFileData;
-						unset($compressedFileData);
-					}
-				}
-			} else {
-				$errors[] = $filename.' does not appear to be a zip file';
-			}
-		} else {
-			$error_message = ob_get_contents();
-			ob_end_clean();
-			$errors[] = 'failed to fopen('.$filename.', rb): '.$error_message;
-		}
-	} else {
-		$errors[] = 'failed to include_once(module.archive.zip.php)';
-	}
-	return $DecompressedFileContents;
-}
diff --git a/demos/getid3.css b/demos/getid3.css
deleted file mode 100644
index 0f5b730..0000000
--- a/demos/getid3.css
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
-* Common elements
-*/
-
-body {
-	font: 12px Verdana, sans-serif;
-	background-color: white;
-	color:            black;
-	margin-top:    6px;
-	margin-bottom: 30px;
-	margin-left:   12px;
-	margin-right:  12px;
-}
-
-h1 {
-	font: bold 18px Verdana, sans-serif;
-	line-height:   26px;
-	margin-top:    12px;
-	margin-bottom: 15px;
-	margin-left:    0px;
-	margin-right:   7px;
-	background-color: #e6eaf6;
-	padding-left:   10px;
-	padding-top:    2px;
-	padding-bottom: 4px;
-}
-
-h3 {
-	font: bold 13px Verdana, sans-serif;
-	line-height:   26px;
-	margin-top:    12px;
-	margin-bottom:  0px;
-	margin-left:    0px;
-	margin-right:   7px;
-	padding-left:   4px;
-}
-
-ul {
-	margin-top: 0px;
-}
-
-p, li {
-	font: 9pt/135% sans-serif;
-	margin-top:    1x;
-	margin-bottom: 0x;
-}
-
-a, a:link, a:visited {
-	color: #0000cc;
-}
-
-hr {
-	height: 0;
-	border: solid gray 0;
-	border-top-width: thin;
-	width: 700px;
-}
-
-table.table td {
-	font: 9pt sans-serif;
-	padding-top:    1px;
-	padding-bottom: 1px;
-	padding-left:   5px;
-	padding-right:  5px;
-}
-
-table.table td.header {
-	background-color: #cccccc;
-	padding-top:    2px;
-	padding-bottom: 2px;
-	font-weight: bold;
-}
-
-table.table tr.even_files {
-	background-color: #fefefe;
-}
-
-table.table tr.odd_files {
-	background-color: #e9e9e9;
-}
-
-table.dump {
-	border-top:  solid 1px #cccccc;
-	border-left: solid 1px #cccccc;
-	margin: 2px;
-}
-
-table.dump td {
-	font: 9pt sans-serif;
-	padding-top:    1px;
-	padding-bottom: 1px;
-	padding-left:   5px;
-	padding-right:  5px;
-	border-right:  solid 1px #cccccc;
-	border-bottom: solid 1px #cccccc;
-}
-
-td.dump_string {
-	font-weight: bold;
-	color: #006600;
-	font-family: Zawgyi-One,sans-serif;
-}
-
-td.dump_integer {
-	color: #CC0000;
-	font-weight: bold;
-}
-
-td.dump_double {
-	color: #FF9900;
-	font-weight: bold;
-}
-
-td.dump_boolean {
-	color: #0000FF;
-	font-weight: bold;
-}
-
-.error {
-	color: red
-}
-
-
-/**
-* Tool Tips
-*/
-
-.tooltip {
-    font: 9pt sans-serif;
-    background: #ffffe1;
-    color: 	black;
-    border: 	black 1px solid;
-    margin: 	2px;
-    padding: 	7px;
-    position: 	absolute;
-    top: 	10px;
-    left: 	10px;
-    z-index: 	10000;
-    visibility: hidden;
-}
-
-.tooltip p {
-     margin-top:   -2px;
-     margin-bottom: 4px;
-}
-
-
-/**
-* Forms
-*/
-
-table.form td {
- 	font: 9pt/135% sans-serif;
- 	padding: 2px;
-}
-
-select, input {
-	font: 9pt/135% sans-serif;
-}
-
-.select, .field {
-	width: 260px;
-}
-
-#sel_field {
-	width: 85px;
-}
-
-.button {
-	margin-top: 10px;
-}
diff --git a/demos/getid3.demo.dirscan.php b/demos/getid3.demo.dirscan.php
deleted file mode 100644
index bfb7c9d..0000000
--- a/demos/getid3.demo.dirscan.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////////////////////////////
-/// getID3() by James Heinrich <info@getid3.org>                               //
-//  available at http://getid3.sourceforge.net                                 //
-//            or http://www.getid3.org                                         //
-//          also https://github.com/JamesHeinrich/getID3                       //
-/////////////////////////////////////////////////////////////////////////////////
-///                                                                            //
-// getid3.dirscan.php - tool for batch media file processing with getID3()     //
-//                                                                            ///
-/////////////////////////////////////////////////////////////////////////////////
-///                                                                            //
-//  Directory Scanning and Caching CLI tool by Karl G. Holz <newaeonØmac*com>  //
-//                                                                            ///
-/////////////////////////////////////////////////////////////////////////////////
-/**
-* This is a directory scanning and caching cli tool for getID3().
-*
-* use like so for the default sqlite3 database, which is hidden:
-*
-* cd <path you want to start scanning from>
-* php <path to getid3 files>/getid3.dirscan.php
-*
-* or
-*
-* php <path to getid3 files>/getid3.dirscan.php <dir to scan> <file ext in csv list>
-*
-* Supported Cache Types    (this extension)
-*
-*   SQL Databases:
-*
-*   cache_type
-*   -------------------------------------------------------------------
-*    mysql
-
-$cache='mysql';
-$database['host']='';
-$database['database']='';
-$database['username']='';
-$database['password']='';
-$database['table']='';
-
-*    sqlite3
-
-$cache='sqlite3';
-$database['table']='getid3_cache';
-$database['hide']=true;
-
-*/
-$dir      = $_SERVER['PWD'];
-$media    = array('mp4', 'm4v', 'mov', 'mp3', 'm4a', 'jpg', 'png', 'gif');
-$database = array();
-/**
-* configure the database bellow
-*/
-// sqlite3
-$cache             = 'sqlite3';
-$database['table'] = 'getid3_cache';
-$database['hide']  = true;
-/**
- * mysql
-$cache                = 'mysql';
-$database['host']     = '';
-$database['database'] = '';
-$database['username'] = '';
-$database['password'] = '';
-$database['table']    = '';
-*/
-
-/**
-* id3 tags class file
-*/
-require_once(dirname(__FILE__).'/getid3.php');
-/**
-* dirscan scans all directories for files that match your selected filetypes into the cache database
-* this is useful for a lot of media files
-*
-*
-* @package dirscan
-* @author Karl Holz
-*
-*/
-
-class dirscan {
-	/**
-	* type_brace()  * Might not work on Solaris and other non GNU systems *
-	*
-	* Configures a filetype list for use with glob searches,
-	* will match uppercase or lowercase extensions only, no mixing
-	* @param string $dir directory to use
-	* @param mixed cvs list of extentions or an array
-	* @return string or null if checks fail
-	*/
-	private function type_brace($dir, $search=array()) {
-		$dir = str_replace(array('///', '//'), array('/', '/'), $dir);
-		if (!is_dir($dir)) {
-			return null;
-		}
-		if (!is_array($search)) {
-			$e = explode(',', $search);
-		} elseif (count($search) < 1) {
-			return null;
-		} else {
-			$e = $search;
-		}
-		$ext = array();
-		foreach ($e as $new) {
-			$ext[] = strtolower(trim($new));
-			$ext[] = strtoupper(trim($new));
-		}
-		$b = $dir.'/*.{'.implode(',', $ext).'}';
-		return $b;
-	}
-
-	/**
-	* this function will search 4 levels deep for directories
-	* will return null on failure
-	* @param string $root
-	* @return array return an array of dirs under root
-	* @todo figure out how to block tabo directories with ease
-	*/
-	private function getDirs($root) {
-		switch ($root) { // return null on tabo directories, add as needed -> case {dir to block }:   this is not perfect yet
-			case '/':
-			case '/var':
-			case '/etc':
-			case '/home':
-			case '/usr':
-			case '/root':
-			case '/private/etc':
-			case '/private/var':
-			case '/etc/apache2':
-			case '/home':
-			case '/tmp':
-			case '/var/log':
-				return null;
-				break;
-			default: // scan 4 directories deep
-				if (!is_dir($root)) {
-    				return null;
-				}
-				$dirs = array_merge(glob($root.'/*', GLOB_ONLYDIR), glob($root.'/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*/*/*', GLOB_ONLYDIR));
-				break;
-		}
-		if (count($dirs) < 1) {
-			$dirs = array($root);
-		}
-		return $dirs;
-	}
-
-	/**
-	*  file_check() check the number of file that are found that match the brace search
-	*
-	* @param string $search
-	* @return mixed
-	*/
-	private function file_check($search) {
-		$t = array();
-		$s = glob($search, GLOB_BRACE);
-		foreach ($s as $file) {
-			$t[] = str_replace(array('///', '//'), array('/', '/'), $file);
-		}
-		if (count($t) > 0) {
-			return $t;
-		}
-		return null;
-	}
-
-	function getTime() {
-		return microtime(true);
-		// old method for PHP < 5
-		//$a = explode(' ', microtime());
-		//return (double) $a[0] + $a[1];
-	}
-
-
-	/**
-	*
-	* @param type $dir
-	* @param type $match  search type name extentions, can be an array or csv list
-	* @param type $cache caching extention, select one of sqlite3, mysql, dbm
-	* @param array $opt database options,
-	*/
-	function scan_files($dir, $match, $cache='sqlite3', $opt=array('table'=>'getid3_cache', 'hide'=>true)) {
-		$Start = self::getTime();
-		switch ($cache) { // load the caching module
-			case 'sqlite3':
-				if (!class_exists('getID3_cached_sqlite3')) {
-					require_once(dirname(__FILE__)).'/extension.cache.sqlite3.php';
-				}
-				$id3 = new getID3_cached_sqlite3($opt['table'], $opt['hide']);
-				break;
-			case 'mysql':
-				if (!class_exists('getID3_cached_mysql')) {
-					require_once(dirname(__FILE__)).'/extension.cache.mysql.php';
-				}
-				$id3 = new getID3_cached_mysql($opt['host'], $opt['database'], $opt['username'], $opt['password'], $opt['table']);
-				break;
-		// I'll leave this for some one else
-			//case 'dbm':
-			//	if (!class_exists('getID3_cached_dbm')) {
-			//		require_once(dirname(__FILE__)).'/extension.cache.dbm.php';
-			//	}
-			//	die(' This has not be implemented, sorry for the inconvenience');
-			//	break;
-			default:
-				die(' You have selected an Invalid cache type, only "sqlite3" and "mysql" are valid'."\n");
-				break;
-		}
-		$count = array('dir'=>0, 'file'=>0);
-		$dirs = self::getDirs($dir);
-		if ($dirs !== null) {
-			foreach ($dirs as $d) {
-				echo ' Scanning: '.$d."\n";
-				$search = self::type_brace($d, $match);
-				if ($search !== null) {
-    				$files = self::file_check($search);
-					if ($files !== null) {
-						foreach ($files as $f) {
-							echo ' * Analyzing '.$f.' '."\n";
-							$id3->analyze($f);
-							$count['file']++;
-						}
-						$count['dir']++;
-					} else {
-						echo 'Failed to get files '."\n";
-					}
-				} else {
-					echo 'Failed to create match string '."\n";
-				}
-			}
-			echo '**************************************'."\n";
-			echo '* Finished Scanning your directories '."\n*\n";
-			echo '* Directories '.$count['dir']."\n";
-			echo '* Files '.$count['file']."\n";
-			$End = self::getTime();
-			$t = number_format(($End - $Start) / 60, 2);
-			echo '* Time taken to scan '.$dir.' '.$t.' min '."\n";
-			echo '**************************************'."\n";
-		} else {
-			echo ' failed to get directories '."\n";
-		}
-	}
-}
-
-if (PHP_SAPI === 'cli') {
-	if (count($argv) == 2) {
-		if (is_dir($argv[1])) {
-			$dir = $argv[1];
-		}
-		if (count(explode(',', $argv[2])) > 0) {
-			$media = $arg[2];
-		}
-	}
-	echo ' * Starting to scan directory: '.$dir."\n";
-	echo ' * Using default media types: '.implode(',', $media)."\n";
-	dirscan::scan_files($dir, $media, $cache, $database);
-}
diff --git a/demos/index.php b/demos/index.php
deleted file mode 100644
index 8912075..0000000
--- a/demos/index.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html><head><title>getID3 demos</title><style type="text/css">BODY, TD, TH { font-family: sans-serif; font-size: 10pt; }</style></head><body>
-
-In this directory are a number of examples of how to use <a href="http://www.getid3.org/">getID3()</a>.<br>
-If you don't know what to run, take a look at <a href="demo.browse.php"><b>demo.browse.php</b></a>
-<hr>
-Other demos:<ul>
-<?php
-if ($dh = opendir('.')) {
-	while ($file = readdir($dh)) {
-		if (preg_match('#^demo\\..+\\.php$#', $file)) {
-			echo '<li><a href="'.htmlentities($file, ENT_QUOTES).'">'.htmlentities($file).'</a></li>';
-		}
-	}
-}
-?>
-</ul>
-</body>
-</html>
\ No newline at end of file
