From 3bccebacbc222653ea1780ebc759e699ace57fed Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 24 Sep 2011 19:06:08 +0200 Subject: [PATCH 1/3] prevent people from triggering the setup manually --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 26e90ddfa5..63ffba135a 100644 --- a/index.php +++ b/index.php @@ -28,7 +28,7 @@ require_once('lib/base.php'); // Setup required : $not_installed = !OC_Config::getValue('installed', false); $install_called = (isset($_POST['install']) AND $_POST['install']=='true'); -if($not_installed OR $install_called) { +if($not_installed) { OC_Util::addScript('setup'); require_once('setup.php'); exit(); From 63907a750811524fd9b579724d5c51aee993a9b4 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 24 Sep 2011 19:07:24 +0200 Subject: [PATCH 2/3] dont submit the setup form to a new tab --- core/js/setup.js | 1 - 1 file changed, 1 deletion(-) diff --git a/core/js/setup.js b/core/js/setup.js index 6e842cca3e..759f2357dc 100644 --- a/core/js/setup.js +++ b/core/js/setup.js @@ -46,7 +46,6 @@ $(document).ready(function() { var form = $('
'); form.attr('action', $(this).attr('action')); form.attr('method', 'POST'); - if(true){ form.attr('target', '_blank'); } for(var i=0; i'); From 260893816bf5b185b6b6d36f1c466f5d3500f90d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 24 Sep 2011 19:09:54 +0200 Subject: [PATCH 3/3] remove getID3 demos due to security issue caused by one of them --- .../getID3/demos/demo.audioinfo.class.php | 319 -- apps/media/getID3/demos/demo.basic.php | 38 - apps/media/getID3/demos/demo.browse.php | 679 ---- apps/media/getID3/demos/demo.cache.dbm.php | 29 - apps/media/getID3/demos/demo.cache.mysql.php | 29 - apps/media/getID3/demos/demo.joinmp3.php | 96 - apps/media/getID3/demos/demo.mimeonly.php | 53 - apps/media/getID3/demos/demo.mp3header.php | 2890 ----------------- apps/media/getID3/demos/demo.mysql.php | 2182 ------------- apps/media/getID3/demos/demo.simple.php | 53 - apps/media/getID3/demos/demo.simple.write.php | 54 - apps/media/getID3/demos/demo.write.php | 271 -- apps/media/getID3/demos/getid3.css | 195 -- apps/media/getID3/demos/index.php | 1 - 14 files changed, 6889 deletions(-) delete mode 100644 apps/media/getID3/demos/demo.audioinfo.class.php delete mode 100644 apps/media/getID3/demos/demo.basic.php delete mode 100644 apps/media/getID3/demos/demo.browse.php delete mode 100644 apps/media/getID3/demos/demo.cache.dbm.php delete mode 100644 apps/media/getID3/demos/demo.cache.mysql.php delete mode 100644 apps/media/getID3/demos/demo.joinmp3.php delete mode 100644 apps/media/getID3/demos/demo.mimeonly.php delete mode 100644 apps/media/getID3/demos/demo.mp3header.php delete mode 100644 apps/media/getID3/demos/demo.mysql.php delete mode 100644 apps/media/getID3/demos/demo.simple.php delete mode 100644 apps/media/getID3/demos/demo.simple.write.php delete mode 100644 apps/media/getID3/demos/demo.write.php delete mode 100644 apps/media/getID3/demos/getid3.css delete mode 100644 apps/media/getID3/demos/index.php diff --git a/apps/media/getID3/demos/demo.audioinfo.class.php b/apps/media/getID3/demos/demo.audioinfo.class.php deleted file mode 100644 index d38ec19807..0000000000 --- a/apps/media/getID3/demos/demo.audioinfo.class.php +++ /dev/null @@ -1,319 +0,0 @@ -Info('file.flac'); | -// +----------------------------------------------------------------------+ -// | Authors: Allan Hansen | -// +----------------------------------------------------------------------+ -// - - - -/** -* 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'] = @$this->info['fileformat'].'/'.@$this->info['audio']['dataformat'].(isset($this->info['video']['dataformat']) ? '/'.@$this->info['video']['dataformat'] : ''); - $this->result['encoder_version'] = @$this->info['audio']['encoder']; - $this->result['encoder_options'] = @$this->info['audio']['encoder_options']; - $this->result['bitrate_mode'] = @$this->info['audio']['bitrate_mode']; - $this->result['channels'] = @$this->info['audio']['channels']; - $this->result['sample_rate'] = @$this->info['audio']['sample_rate']; - $this->result['bits_per_sample'] = @$this->info['audio']['bits_per_sample']; - $this->result['playing_time'] = @$this->info['playtime_seconds']; - $this->result['avg_bit_rate'] = @$this->info['audio']['bitrate']; - $this->result['tags'] = @$this->info['tags']; - $this->result['comments'] = @$this->info['comments']; - $this->result['warning'] = @$this->info['warning']; - $this->result['md5'] = @$this->info['md5_data']; - - // Post getID3() data handling based on file format - $method = @$this->info['fileformat'].'Info'; - if (@$this->info['fileformat'] && 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'; - - } else if (ereg('^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'; - } - -} - - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.basic.php b/apps/media/getID3/demos/demo.basic.php deleted file mode 100644 index ddd56e5152..0000000000 --- a/apps/media/getID3/demos/demo.basic.php +++ /dev/null @@ -1,38 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /demo/demo.basic.php - part of getID3() // -// Sample script showing most basic use of getID3() // -// See readme.txt for more details // -// /// -///////////////////////////////////////////////////////////////// - -// 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 -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 - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.browse.php b/apps/media/getID3/demos/demo.browse.php deleted file mode 100644 index 5d027b63b2..0000000000 --- a/apps/media/getID3/demos/demo.browse.php +++ /dev/null @@ -1,679 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in demos/'.basename(__FILE__)); - - -///////////////////////////////////////////////////////////////// -// set predefined variables as if magic_quotes_gpc was off, -// whether the server's got it or not: -UnifyMagicQuotes(false); -///////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////// -// showfile is used to display embedded images from table_var_dump() -// md5 of requested file is required to prevent abuse where any -// random file on the server could be viewed -if (@$_REQUEST['showfile']) { - if (is_readable($_REQUEST['showfile'])) { - if (md5_file($_REQUEST['showfile']) == @$_REQUEST['md5']) { - readfile($_REQUEST['showfile']); - exit; - } - } - die('Cannot display "'.$_REQUEST['showfile'].'"'); -} -///////////////////////////////////////////////////////////////// - - -if (!function_exists('getmicrotime')) { - function getmicrotime() { - list($usec, $sec) = explode(' ', microtime()); - return ((float) $usec + (float) $sec); - } -} - -/////////////////////////////////////////////////////////////////////////////// - - -$writescriptfilename = 'demo.write.php'; - -require_once('../getid3/getid3.php'); - -// Needed for windows only -define('GETID3_HELPERAPPSDIR', 'C:/helperapps/'); - -// Initialize getID3 engine -$getID3 = new getID3; -$getID3->setOption(array('encoding' => 'UTF-8')); - -$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=UTF-8'); -ob_start(); -echo ''; -echo ''; -echo 'getID3() - /demo/demo.browse.php (sample script)'; -echo ''; -echo ''; - -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 ''.$deletefilemessage.'
'; - } else { - echo ''; - } -} - - -if (isset($_REQUEST['filename'])) { - - if (!file_exists($_REQUEST['filename']) || !is_file($_REQUEST['filename'])) { - die(getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $_REQUEST['filename'].' does not exist')); - } - $starttime = getmicrotime(); - - //$getID3->setOption(array( - // 'option_md5_data' => $AutoGetHashes, - // 'option_sha1_data' => $AutoGetHashes, - //)); - $ThisFileInfo = $getID3->analyze($_REQUEST['filename']); - $AutoGetHashes = (bool) ((@$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) - if ($AutoGetHashes) { - $ThisFileInfo['md5_file'] = getid3_lib::md5_file($_REQUEST['filename']); - $ThisFileInfo['sha1_file'] = getid3_lib::sha1_file($_REQUEST['filename']); - } - - - getid3_lib::CopyTagsToComments($ThisFileInfo); - - $listdirectory = dirname(getid3_lib::SafeStripSlashes($_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('\\', '/', $listdirectory.'/'); - } - - if (strstr($_REQUEST['filename'], 'http://') || strstr($_REQUEST['filename'], 'ftp://')) { - echo 'Cannot browse remote filesystems
'; - } else { - echo 'Browse: '.getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $listdirectory).'
'; - } - - echo table_var_dump($ThisFileInfo); - $endtime = getmicrotime(); - echo 'File parsed in '.number_format($endtime - $starttime, 3).' seconds.
'; - -} else { - - $listdirectory = (isset($_REQUEST['listdirectory']) ? getid3_lib::SafeStripSlashes($_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('\\', '/', $listdirectory.'/'); - } - - if ($handle = @opendir($listdirectory)) { - - 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 = getmicrotime(); - - $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('\\', '/', $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']))); - $fileinformation = $getID3->analyze($currentfilename); - - getid3_lib::CopyTagsToComments($fileinformation); - - $TotalScannedFilesize += @$fileinformation['filesize']; - - if (isset($_REQUEST['ShowMD5'])) { - $fileinformation['md5_file'] = md5($currentfilename); - $fileinformation['md5_file'] = getid3_lib::md5_file($currentfilename); - } - - if (!empty($fileinformation['fileformat'])) { - $DirectoryContents[$currentfulldir]['known'][$file] = $fileinformation; - $TotalScannedPlaytime += @$fileinformation['playtime_seconds']; - $TotalScannedBitrate += @$fileinformation['bitrate']; - $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 = getmicrotime(); - closedir($handle); - echo 'done
'; - echo 'Directory scanned in '.number_format($endtime - $starttime, 2).' seconds.
'; - flush(); - - $columnsintable = 14; - echo ''; - - echo ''; - $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 ''; - if ($filename == '..') { - echo ''; - } else { - echo ''; - } - echo ''; - } - } - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if (isset($_REQUEST['ShowMD5'])) { - echo ''; - echo ''; - echo ''; - } else { - echo ''; - } - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - if (isset($DirectoryContents[$dirname]['known']) && is_array($DirectoryContents[$dirname]['known'])) { - uksort($DirectoryContents[$dirname]['known'], 'MoreNaturalSort'); - foreach ($DirectoryContents[$dirname]['known'] as $filename => $fileinfo) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if (isset($_REQUEST['ShowMD5'])) { - echo ''; - echo ''; - echo ''; - } else { - echo ''; - } - echo ''; - - echo ''; - - echo ''; - echo ''; - echo ''; - } - } - - if (isset($DirectoryContents[$dirname]['other']) && is_array($DirectoryContents[$dirname]['other'])) { - uksort($DirectoryContents[$dirname]['other'], 'MoreNaturalSort'); - foreach ($DirectoryContents[$dirname]['other'] as $filename => $fileinfo) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; // Artist - echo ''; // Title - echo ''; // MD5_data - echo ''; // Tags - - //echo ''; // Warning/Error - echo ''; - - echo ''; // Edit - echo ''; - echo ''; - } - } - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
Files in '.getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $currentfulldir).'
'; - echo ''; - echo 'Parent directory: '; - echo ' '; - echo ''.FixTextFields($filename).'
FilenameFile SizeFormatPlaytimeBitrateArtistTitleMD5 File (File) (disable)MD5 Data (File) (disable)MD5 Data (Source) (disable)MD5 Data (enable)TagsErrors & WarningsEditDelete
'.FixTextFields(getid3_lib::SafeStripSlashes($filename)).' '.number_format($fileinfo['filesize']).' '.NiceDisplayFiletypeFormat($fileinfo).' '.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').' '.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000, 0, ((@$fileinfo['audio']['bitrate_mode'] == 'vbr') ? true : false)) : '-').' '.(isset($fileinfo['comments_html']['artist']) ? implode('
', $fileinfo['comments_html']['artist']) : '').'
 '.(isset($fileinfo['comments_html']['title']) ? implode('
', $fileinfo['comments_html']['title']) : '').'
'.(isset($fileinfo['md5_file']) ? $fileinfo['md5_file'] : ' ').''.(isset($fileinfo['md5_data']) ? $fileinfo['md5_data'] : ' ').''.(isset($fileinfo['md5_data_source']) ? $fileinfo['md5_data_source'] : ' ').'- '.@implode(', ', array_keys($fileinfo['tags'])).' '; - if (!empty($fileinfo['warning'])) { - $FilesWithWarnings++; - echo 'warning
'; - } - if (!empty($fileinfo['error'])) { - $FilesWithErrors++; - echo 'error
'; - } - echo '
 '; - switch (@$fileinfo['fileformat']) { - case 'mp3': - case 'mp2': - case 'mp1': - case 'flac': - case 'mpc': - case 'real': - echo 'edit tags'; - break; - case 'ogg': - switch (@$fileinfo['audio']['dataformat']) { - case 'vorbis': - echo 'edit tags'; - break; - } - break; - default: - break; - } - echo ' delete
'.$filename.' '.(isset($fileinfo['filesize']) ? number_format($fileinfo['filesize']) : '-').' '.NiceDisplayFiletypeFormat($fileinfo).' '.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').' '.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000) : '-').'      '; - if (!empty($fileinfo['warning'])) { - $FilesWithWarnings++; - echo 'warning
'; - } - if (!empty($fileinfo['error'])) { - if ($fileinfo['error'][0] != 'unable to determine file format') { - $FilesWithErrors++; - echo 'error
'; - } - } - echo '
  delete
Average:'.number_format($TotalScannedFilesize / max($TotalScannedKnownFiles, 1)).' '.getid3_lib::PlaytimeString($TotalScannedPlaytime / max($TotalScannedPlaytimeFiles, 1)).''.BitrateText(round(($TotalScannedBitrate / 1000) / max($TotalScannedBitrateFiles, 1))).'
Identified Files:'.number_format($TotalScannedKnownFiles).'   Errors:'.number_format($FilesWithErrors).'
Unknown Files:'.number_format($TotalScannedUnknownFiles).'   Warnings:'.number_format($FilesWithWarnings).'
'; - echo '
Total:'.number_format($TotalScannedFilesize).' '.getid3_lib::PlaytimeString($TotalScannedPlaytime).' 
'; - } else { - echo 'ERROR: Could not open directory: '.$currentfulldir.'
'; - } -} -echo PoweredBygetID3(); -echo 'Running on PHP v'.phpversion(); -echo ''; -ob_end_flush(); - - -///////////////////////////////////////////////////////////////// - - -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 ''.number_format($bitrate, $decimals).' kbps'; -} - -function FixTextFields($text) { - $text = getid3_lib::SafeStripSlashes($text); - $text = htmlentities($text, ENT_QUOTES); - return $text; -} - - -function string_var_dump($variable) { - ob_start(); - var_dump($variable); - $dumpedvariable = ob_get_contents(); - ob_end_clean(); - return $dumpedvariable; -} - - -function table_var_dump($variable, $wrap_in_td=false) { - $returnstring = ''; - switch (gettype($variable)) { - case 'array': - $returnstring .= ($wrap_in_td ? '' : ''); - $returnstring .= ''; - foreach ($variable as $key => $value) { - $returnstring .= ''; - $returnstring .= ''; - } else { - $returnstring .= ''.table_var_dump($value, true).''; - } - } - $returnstring .= '
'.str_replace("\x00", ' ', $key).''.gettype($value); - if (is_array($value)) { - $returnstring .= ' ('.count($value).')'; - } elseif (is_string($value)) { - $returnstring .= ' ('.strlen($value).')'; - } - if (($key == 'data') && isset($variable['image_mime']) && isset($variable['dataoffset'])) { - $imageinfo = array(); - $imagechunkcheck = getid3_lib::GetDataImageSize($value, $imageinfo); - $DumpedImageSRC = (!empty($_REQUEST['filename']) ? $_REQUEST['filename'] : '.getid3').'.'.$variable['dataoffset'].'.'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]); - if ($tempimagefile = @fopen($DumpedImageSRC, 'wb')) { - fwrite($tempimagefile, $value); - fclose($tempimagefile); - } - $returnstring .= '
'; - $returnstring .= ($wrap_in_td ? '' : ''); - break; - - case 'boolean': - $returnstring .= ($wrap_in_td ? '' : '').($variable ? 'TRUE' : 'FALSE').($wrap_in_td ? '' : ''); - break; - - case 'integer': - $returnstring .= ($wrap_in_td ? '' : '').$variable.($wrap_in_td ? '' : ''); - break; - - case 'double': - case 'float': - $returnstring .= ($wrap_in_td ? '' : '').$variable.($wrap_in_td ? '' : ''); - break; - - case 'object': - case 'null': - $returnstring .= ($wrap_in_td ? '' : '').string_var_dump($variable).($wrap_in_td ? '' : ''); - break; - - case 'string': - $variable = str_replace("\x00", ' ', $variable); - $varlen = strlen($variable); - for ($i = 0; $i < $varlen; $i++) { - if (ereg('['."\x0A\x0D".' -;0-9A-Za-z]', $variable{$i})) { - $returnstring .= $variable{$i}; - } else { - $returnstring .= '&#'.str_pad(ord($variable{$i}), 3, '0', STR_PAD_LEFT).';'; - } - } - $returnstring = ($wrap_in_td ? '' : '').nl2br($returnstring).($wrap_in_td ? '' : ''); - break; - - default: - $imageinfo = array(); - $imagechunkcheck = getid3_lib::GetDataImageSize($variable, $imageinfo); - if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { - $returnstring .= ($wrap_in_td ? '' : ''); - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= '
type'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]).'
width'.number_format($imagechunkcheck[0]).' px
height'.number_format($imagechunkcheck[1]).' px
size'.number_format(strlen($variable)).' bytes
'; - $returnstring .= ($wrap_in_td ? '' : ''); - } else { - $returnstring .= ($wrap_in_td ? '' : '').nl2br(htmlspecialchars(str_replace("\x00", ' ', $variable))).($wrap_in_td ? '' : ''); - } - 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='

') { - return str_replace('', GETID3_VERSION, $string); -} - - -///////////////////////////////////////////////////////////////// -// Unify the contents of GPC, -// whether magic_quotes_gpc is on or off - -function AddStripSlashesArray($input, $addslashes=false) { - if (is_array($input)) { - - $output = $input; - foreach ($input as $key => $value) { - $output[$key] = AddStripSlashesArray($input[$key]); - } - return $output; - - } elseif ($addslashes) { - return addslashes($input); - } - return stripslashes($input); -} - -function UnifyMagicQuotes($turnon=false) { - global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS; - - if (get_magic_quotes_gpc() && !$turnon) { - - // magic_quotes_gpc is on and we want it off! - $_GET = AddStripSlashesArray($_GET, true); - $_POST = AddStripSlashesArray($_POST, true); - $_COOKIE = AddStripSlashesArray($_COOKIE, true); - - unset($_REQUEST); - $_REQUEST = array_merge_recursive($_GET, $_POST, $_COOKIE); - - } elseif (!get_magic_quotes_gpc() && $turnon) { - - // magic_quotes_gpc is off and we want it on (why??) - $_GET = AddStripSlashesArray($_GET, true); - $_POST = AddStripSlashesArray($_POST, true); - $_COOKIE = AddStripSlashesArray($_COOKIE, true); - - unset($_REQUEST); - $_REQUEST = array_merge_recursive($_GET, $_POST, $_COOKIE); - - } - $HTTP_GET_VARS = $_GET; - $HTTP_POST_VARS = $_POST; - $HTTP_COOKIE_VARS = $_COOKIE; - - return true; -} -///////////////////////////////////////////////////////////////// - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.cache.dbm.php b/apps/media/getID3/demos/demo.cache.dbm.php deleted file mode 100644 index acaaa0f3f2..0000000000 --- a/apps/media/getID3/demos/demo.cache.dbm.php +++ /dev/null @@ -1,29 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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 // -// /// -///////////////////////////////////////////////////////////////// - -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 '
';
-var_dump($r);
-echo '
'; - -// uncomment to clear cache -// $getID3->clear_cache(); - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.cache.mysql.php b/apps/media/getID3/demos/demo.cache.mysql.php deleted file mode 100644 index 537b2f0ceb..0000000000 --- a/apps/media/getID3/demos/demo.cache.mysql.php +++ /dev/null @@ -1,29 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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 // -// /// -///////////////////////////////////////////////////////////////// - -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 '
';
-var_dump($r);
-echo '
'; - -// uncomment to clear cache -//$getID3->clear_cache(); - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.joinmp3.php b/apps/media/getID3/demos/demo.joinmp3.php deleted file mode 100644 index 976884f92e..0000000000 --- a/apps/media/getID3/demos/demo.joinmp3.php +++ /dev/null @@ -1,96 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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.'"
'; - return false; - } - } - if (!is_writeable($FilenameOut)) { - echo 'Cannot write "'.$FilenameOut.'"
'; - return false; - } - - require_once('../getid3/getid3.php'); - if ($fp_output = @fopen($FilenameOut, 'wb')) { - - // Initialize getID3 engine - $getID3 = new getID3; - foreach ($FilenamesIn as $nextinputfilename) { - - $CurrentFileInfo = $getID3->analyze($nextinputfilename); - if ($CurrentFileInfo['fileformat'] == 'mp3') { - - if ($fp_source = @fopen($nextinputfilename, 'rb')) { - - $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 { - - 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 { - - echo 'failed to open '.$FilenameOut.' for writing'; - return false; - - } - - fclose($fp_output); - return true; -} - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.mimeonly.php b/apps/media/getID3/demos/demo.mimeonly.php deleted file mode 100644 index dd6dec6fe3..0000000000 --- a/apps/media/getID3/demos/demo.mimeonly.php +++ /dev/null @@ -1,53 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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 // -// /// -///////////////////////////////////////////////////////////////// - -echo ''; - -if (!empty($_REQUEST['filename'])) { - - echo 'The file "'.$_REQUEST['filename'].'" has a MIME type of "'.GetMIMEtype($_REQUEST['filename']).'"'; - -} else { - - echo 'Usage: '.$_SERVER['PHP_SELF'].'?filename=filename.ext'; - -} - - -function GetMIMEtype($filename) { - // 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')) { - $ThisFileInfo = array('avdataoffset'=>0, 'avdataend'=>0); - - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); - $tag = new getid3_id3v2($fp, $ThisFileInfo); - - fseek($fp, $ThisFileInfo['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']; - } - return $DeterminedMIMEtype; -} - -?> - - \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.mp3header.php b/apps/media/getID3/demos/demo.mp3header.php deleted file mode 100644 index 2c9c1f2232..0000000000 --- a/apps/media/getID3/demos/demo.mp3header.php +++ /dev/null @@ -1,2890 +0,0 @@ -'; - foreach ($variable as $key => $value) { - $returnstring .= ''.str_replace(chr(0), ' ', $key).''; - $returnstring .= ''.gettype($value); - if (is_array($value)) { - $returnstring .= ' ('.count($value).')'; - } elseif (is_string($value)) { - $returnstring .= ' ('.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 .= ''; - } else { - $returnstring .= ''.table_var_dump($value).''; - } - } - $returnstring .= ''; - 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 (ereg('['.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, FREAD_BUFFER_SIZE), $imageinfo); - - if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= ''; - $returnstring .= '
type'.ImageTypesLookup($imagechunkcheck[2]).'
width'.number_format($imagechunkcheck[0]).' px
height'.number_format($imagechunkcheck[1]).' px
size'.number_format(strlen($variable)).' bytes
'; - } else { - $returnstring .= nl2br(htmlspecialchars(str_replace(chr(0), ' ', $variable))); - } - break; - } - return $returnstring; - } -} - -if (!function_exists('string_var_dump')) { - function string_var_dump($variable) { - 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) { - $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 ''.round($bitrate).' kbps'; - } -} - -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 - // 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 (ereg("^([0-9a-f]{32})[ \t\n\r]", `md5sum "$file"`, $r)) { - return $r[1]; - } - return false; - } -} - -if (!function_exists('md5_data')) { - // Allan Hansen - // 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), eregi_replace('[^[:alnum:]]', '', 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('.', eregi_replace('[^[:alnum:]]', '', 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 - if ($fp = @fopen($file, 'rb')) { - - if ($MD5fp = @fopen($dataMD5filename, 'wb')) { - - 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, FREAD_BUFFER_SIZE))) { - 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); - - } - fclose($fp); - - } - 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) { - $parts = @parse_url($url); - $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 (!eregi("^[[:alnum:]]([-.]?[0-9a-z])*\.[a-z]{2,3}$", $parts['host'], $regs) && !IsValidDottedIP($parts['host'])) { - return false; - } elseif (!eregi("^([[:alnum:]-]|[\_])*$", $parts['user'], $regs)) { - return false; - } elseif (!eregi("^([[:alnum:]-]|[\_])*$", $parts['pass'], $regs)) { - return false; - } elseif (!eregi("^[[:alnum:]/_\.@~-]*$", $parts['path'], $regs)) { - return false; - } elseif (!eregi("^[[:alnum:]?&=+:;_()%#/,\.-]*$", $parts['query'], $regs)) { - return false; - } else { - return true; - } - } - return false; - } -} - -echo '
'; -echo 'Enter 4 hex bytes of MPEG-audio header (ie FF FA 92 44)
'; -echo ''; -echo '
'; -echo '
'; - -echo '
'; -echo 'Generate a MPEG-audio 4-byte header from these values:
'; -echo ''; - -$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 ''; -} - -if (isset($_POST['bitrate'])) { - echo ''; -} -echo '
'.$name.':
Frame Length:'.(int) MPEGaudioFrameLength($_POST['bitrate'], $_POST['version'], $_POST['layer'], (($_POST['padding'] == 'Y') ? '1' : '0'), $_POST['frequency']).'
'; -echo '
'; -echo '
'; - - -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 Bitrate'); - } - - $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 Frequency'); - } - - $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 Mode Extension'); - } - - $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 Emphasis'); - } - - 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)).'
'; - -} - -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 // -// 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(FREAD_BUFFER_SIZE / 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, FREAD_BUFFER_SIZE)) { - - // great - $header_len = strlen($header) - round(FREAD_BUFFER_SIZE / 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'); -} - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.mysql.php b/apps/media/getID3/demos/demo.mysql.php deleted file mode 100644 index c6b7c6b5ef..0000000000 --- a/apps/media/getID3/demos/demo.mysql.php +++ /dev/null @@ -1,2182 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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`; - -if (!@mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) { - die('Could not connect to MySQL host:
'.mysql_error().'
'); -} -if (!@mysql_select_db(GETID3_DB_DB)) { - die('Could not select database:
'.mysql_error().'
'); -} - -if (!@include_once('../getid3/getid3.php')) { - die('Cannot open '.realpath('../getid3/getid3.php')); -} -// 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 FixTextFields($text) { - $text = getid3_lib::SafeStripSlashes($text); - $text = htmlentities($text, ENT_QUOTES); - return $text; -} - -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 ''.number_format($bitrate, $decimals).' kbps'; -} - -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 = 'Source and Destination filenames identical
FAILED to rename'; - } elseif (!file_exists($from)) { - $results = 'Source file does not exist
FAILED to rename'; - } elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) { - $results = 'Destination file already exists
FAILED to rename'; - } elseif (@rename($from, $to)) { - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($from).'")'; - safe_mysql_query($SQLquery); - $results = 'Successfully renamed'; - } else { - $results = '
FAILED to rename'; - $success = false; - } - $results .= ' from:
'.$from.'
to:
'.$to.'

'; - 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 ''; - echo 'getID3() demo - /demo/mysql.php'; - -} - - -function WindowsShareSlashTranslate($filename) { - if (substr($filename, 0, 2) == '//') { - return str_replace('/', '\\', $filename); - } - return $filename; -} - -function safe_mysql_query($SQLquery) { - $result = @mysql_query($SQLquery); - if (mysql_error()) { - die(''.mysql_error().'
'.$SQLquery.''); - } - 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 `'.GETID3_DB_TABLE.'`'; - safe_mysql_query($SQLquery); - } -} -if (!mysql_table_exists(GETID3_DB_TABLE)) { - $SQLquery = 'CREATE TABLE `'.GETID3_DB_TABLE.'` ('; - $SQLquery .= ' `ID` mediumint(8) unsigned NOT NULL auto_increment,'; - $SQLquery .= ' `filename` text NOT NULL,'; - $SQLquery .= ' `LastModified` 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` text NOT NULL,'; - $SQLquery .= ' `comments_id3v2` text NOT NULL,'; - $SQLquery .= ' `comments_ape` text NOT NULL,'; - $SQLquery .= ' `comments_lyrics3` text NOT NULL,'; - $SQLquery .= ' `comments_id3v1` text NOT NULL,'; - $SQLquery .= ' `warning` text NOT NULL,'; - $SQLquery .= ' `error` text 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 .= ') TYPE=MyISAM;'; - - safe_mysql_query($SQLquery); -} - -$ExistingTableFields = array(); -$result = mysql_query('DESCRIBE `'.GETID3_DB_TABLE.'`'); -while ($row = mysql_fetch_array($result)) { - $ExistingTableFields[$row['Field']] = $row; -} -if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2 - echo 'adding field `encoder_options`
'; - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `encoder_options` VARCHAR(255) DEFAULT "" NOT NULL AFTER `error`'); - mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`'); -} -if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2 - echo 'changing field `track` to VARCHAR(7)
'; - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` CHANGE `track` `track` VARCHAR(7) DEFAULT "" NOT NULL'); - mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`'); -} -if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5 - echo '

WARNING! You should erase your database and rescan everything because the comment storing has been changed since the last version


'; - echo 'adding field `track_volume`
'; - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `track_volume` FLOAT NOT NULL AFTER `error`'); - mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`'); -} -if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1 - echo 'adding field `encoder_options`, `alternate_name`, `parody`
'; - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `remix` VARCHAR(255) DEFAULT "" NOT NULL AFTER `title`'); - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `alternate_name` VARCHAR(255) DEFAULT "" NOT NULL AFTER `track`'); - mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `parody` VARCHAR(255) DEFAULT "" NOT NULL AFTER `alternate_name`'); - mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`'); -} - - -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 = @$ThisFileInfo['comments']; - } elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) { - $SourceArray = @$ThisFileInfo['tags'][$synchronizefrom]; - } else { - die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist'); - } - - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($filename).'")'; - safe_mysql_query($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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` = "")'; - safe_mysql_query($SQLquery); - - $FilesInDir = array(); - - if (!empty($_REQUEST['rescanerrors'])) { - - echo 'abort
'; - - echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan
'; - - $SQLquery = 'SELECT `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`error` <> "")'; - $SQLquery .= ' OR (`warning` <> "")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - while ($row = mysql_fetch_array($result)) { - - if (!file_exists($row['filename'])) { - echo 'File missing: '.$row['filename'].'
'; - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")'; - safe_mysql_query($SQLquery); - } else { - $FilesInDir[] = $row['filename']; - } - - } - - } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) { - - echo 'abort
'; - - echo 'Scanning all media files in '.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).' (and subdirectories)
'; - - $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' GROUP BY `filename`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($SQLquery); - $DupesDeleted = 0; - while ($row = mysql_fetch_array($result)) { - set_time_limit(30); - if ($row['num'] <= 1) { - break; - } - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"'; - safe_mysql_query($SQLquery); - $DupesDeleted++; - } - if ($DupesDeleted > 0) { - echo 'Deleted '.number_format($DupesDeleted).' duplicate filenames
'; - } - - if (!empty($_REQUEST['newscan'])) { - $AlreadyInDatabase = array(); - set_time_limit(60); - $SQLquery = 'SELECT `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - while ($row = mysql_fetch_array($result)) { - //$AlreadyInDatabase[] = strtolower($row['filename']); - $AlreadyInDatabase[] = $row['filename']; - } - } - - $DirectoriesToScan = array(@$_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 ''.str_replace('\\', '/', $startingdir).'
'; - 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; - } - } else if (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 'Failed to open directory "'.$startingdir.'"

'; - } - $DirectoriesScanned[] = $startingdir; - unset($DirectoriesToScan[$DirectoryKey]); - } - } - echo 'List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)
'; - flush(); - } - - $FilesInDir = array_unique($FilesInDir); - sort($FilesInDir); - - $starttime = time(); - $rowcounter = 0; - $totaltoprocess = count($FilesInDir); - - foreach ($FilesInDir as $filename) { - set_time_limit(300); - - echo '
'.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 ' (unknown file type)'; - - } else { - - if (!empty($ThisFileInfo['error'])) { - echo ' (errors)'; - } elseif (!empty($ThisFileInfo['warning'])) { - echo ' (warnings)'; - } else { - echo ' (OK)'; - } - - $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 (ereg('^([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 `'.GETID3_DB_TABLE.'` SET '; - $SQLquery .= '`LastModified` = "'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", '; - $SQLquery .= '`md5_file` = "'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", '; - $SQLquery .= '`md5_data` = "'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", '; - $SQLquery .= '`md5_data_source` = "'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", '; - $SQLquery .= '`filesize` = "'.mysql_escape_string(@$ThisFileInfo['filesize']).'", '; - $SQLquery .= '`fileformat` = "'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", '; - $SQLquery .= '`audio_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", '; - $SQLquery .= '`video_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", '; - $SQLquery .= '`audio_bitrate` = "'.mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])).'", '; - $SQLquery .= '`video_bitrate` = "'.mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])).'", '; - $SQLquery .= '`playtime_seconds` = "'.mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])).'", '; - $SQLquery .= '`tags` = "'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", '; - $SQLquery .= '`artist` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", '; - - $SQLquery .= '`title` = "'.mysql_escape_string($this_track_title).'", '; - $SQLquery .= '`remix` = "'.mysql_escape_string($this_track_remix).'", '; - - $SQLquery .= '`album` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", '; - $SQLquery .= '`genre` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", '; - $SQLquery .= '`comment` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", '; - - $SQLquery .= '`track` = "'.mysql_escape_string($this_track_track).'", '; - - $SQLquery .= '`comments_all` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", '; - $SQLquery .= '`comments_id3v2` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", '; - $SQLquery .= '`comments_ape` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", '; - $SQLquery .= '`comments_lyrics3` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", '; - $SQLquery .= '`comments_id3v1` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", '; - $SQLquery .= '`warning` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", '; - $SQLquery .= '`error` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", '; - $SQLquery .= '`encoder_options` = "'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", '; - $SQLquery .= '`vbr_method` = "'.mysql_escape_string(@$ThisFileInfo['mpeg']['audio']['VBR_method']).'", '; - $SQLquery .= '`track_volume` = "'.mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])).'" '; - $SQLquery .= 'WHERE (`filename` = "'.mysql_escape_string(@$ThisFileInfo['filenamepath']).'")'; - - } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) { - - $SQLquery = 'INSERT INTO `'.GETID3_DB_TABLE.'` (`filename`, `LastModified`, `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_escape_string(@$ThisFileInfo['filenamepath']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['filesize']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", '; - $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", '; - $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])).'", '; - $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])).'", '; - $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", '; - - $SQLquery .= '"'.mysql_escape_string($this_track_title).'", '; - $SQLquery .= '"'.mysql_escape_string($this_track_remix).'", '; - - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", '; - - $SQLquery .= '"'.mysql_escape_string($this_track_track).'", '; - - $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", '; - $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", '; - $SQLquery .= '"'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", '; - $SQLquery .= '"'.mysql_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : @$ThisFileInfo['mpeg']['audio']['VBR_method']).'", '; - $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])).'")'; - - } - flush(); - safe_mysql_query($SQLquery); - } - - } - - $SQLquery = 'OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`'; - safe_mysql_query($SQLquery); - - echo '
Done scanning!
'; - -} elseif (!empty($_REQUEST['missingtrackvolume'])) { - - $MissingTrackVolumeFilesScanned = 0; - $MissingTrackVolumeFilesAdjusted = 0; - $MissingTrackVolumeFilesDeleted = 0; - $SQLquery = 'SELECT `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`track_volume` = "0")'; - $SQLquery .= ' AND (`audio_bitrate` > "0")'; - $result = safe_mysql_query($SQLquery); - echo 'Scanning 0 / '.number_format(mysql_num_rows($result)).' files for track volume information:
'; - while ($row = mysql_fetch_array($result)) { - set_time_limit(30); - echo '. '; - flush(); - if (file_exists($row['filename'])) { - - $ThisFileInfo = $getID3->analyze($row['filename']); - if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) { - $MissingTrackVolumeFilesAdjusted++; - $SQLquery = 'UPDATE `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")'; - safe_mysql_query($SQLquery); - } - - } else { - - $MissingTrackVolumeFilesDeleted++; - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")'; - safe_mysql_query($SQLquery); - - } - } - echo '
Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.
'; - 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)
'; - -} elseif (!empty($_REQUEST['deadfilescheck'])) { - - $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' GROUP BY `filename`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($SQLquery); - $DupesDeleted = 0; - while ($row = mysql_fetch_array($result)) { - set_time_limit(30); - if ($row['num'] <= 1) { - break; - } - echo '
'.FixTextFields($row['filename']).' (duplicate)'; - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"'; - safe_mysql_query($SQLquery); - $DupesDeleted++; - } - if ($DupesDeleted > 0) { - echo '
Deleted '.number_format($DupesDeleted).' duplicate filenames
'; - } - - $SQLquery = 'SELECT `filename`, `filesize`, `LastModified`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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['LastModified']) { - if (abs(filemtime($row['filename']) - $row['LastModified']) != 3600) { - // off by exactly one hour == daylight savings time - $reason = 'last-modified time changed'; - } - } - - $thisdir = dirname($row['filename']); - if ($reason) { - - $totalremoved++; - echo '
'.FixTextFields($row['filename']).' ('.$reason.')'; - flush(); - $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")'; - safe_mysql_query($SQLquery); - - } elseif ($thisdir != $previousdir) { - - echo '. '; - flush(); - - } - $previousdir = $thisdir; - } - - echo '
'.number_format($totalremoved).' of '.number_format($totalchecked).' files in database no longer exist, or have been altered since last scan. Removed from database.
'; - -} elseif (!empty($_REQUEST['encodedbydistribution'])) { - - if (!empty($_REQUEST['m3u'])) { - - header('Content-type: audio/x-mpegurl'); - echo '#EXTM3U'."\n"; - - $SQLquery = 'SELECT `filename`, `comments_id3v2`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`encoder_options` = "'.mysql_escape_string($_REQUEST['encodedbydistribution']).'")'; - $result = mysql_query($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 'show all
'; - echo ''; - - $SQLquery = 'SELECT `filename`, `comments_id3v2`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $result = mysql_query($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 ''; - echo ''; - } - } - echo '
m3u'.FixTextFields($row['filename']).'
'; - - } else { - - $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC'; - $result = mysql_query($SQLquery); - $EncodedBy = array(); - while ($row = mysql_fetch_array($result)) { - set_time_limit(30); - $CommentArray = unserialize($row['comments_id3v2']); - 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 '.m3u version
'; - echo ''; - foreach ($EncodedBy as $key => $value) { - echo ''; - echo ''; - echo ''; - } - echo '
m3uEncoder OptionsEncoded By (ID3v2)
m3u'.$key.''; - arsort($value); - foreach ($value as $string => $count) { - echo ''; - echo ''; - } - echo '
'.number_format($count).' '.$string.'
'; - - } - -} 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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`audio_bitrate` > 0)'; - $SQLquery .= ' GROUP BY `RoundBitrate`'; - $result = safe_mysql_query($SQLquery); - while ($row = mysql_fetch_array($result)) { - @$BitrateDistribution[getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000)] += $row['num']; // safe_inc - } - - echo ''; - echo ''; - foreach ($BitrateDistribution as $Bitrate => $Count) { - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
BitrateCount
'.round($Bitrate / 1000).' kbps'.number_format($Count).'
'; - - -} elseif (!empty($_REQUEST['emptygenres'])) { - - $SQLquery = 'SELECT `fileformat`, `filename`, `genre`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`genre` = "")'; - $SQLquery .= ' OR (`genre` = "Unknown")'; - $SQLquery .= ' OR (`genre` = "Other")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 '.m3u version
'; - $EmptyGenreCounter = 0; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) { - $EmptyGenreCounter++; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
m3ufilename
m3u'.FixTextFields($row['filename']).'
'; - echo ''.number_format($EmptyGenreCounter).' files with empty genres'; - - } - -} elseif (!empty($_REQUEST['nonemptycomments'])) { - - $SQLquery = 'SELECT `filename`, `comment`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`comment` <> "")'; - $SQLquery .= ' ORDER BY `comment` ASC'; - $result = safe_mysql_query($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 '.m3u version
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - $NonEmptyCommentsCounter++; - echo ''; - echo ''; - echo ''; - if (strlen(trim($row['comment'])) > 0) { - echo ''; - } else { - echo ''; - } - echo ''; - } - echo '
m3ufilenamecomments
m3u'.FixTextFields($row['filename']).''.FixTextFields($row['comment']).'space
'; - echo ''.number_format($NonEmptyCommentsCounter).' files with non-empty comments'; - - } - -} elseif (!empty($_REQUEST['trackzero'])) { - - $SQLquery = 'SELECT `filename`, `track`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`track` <> "")'; - $SQLquery .= ' AND ((`track` < "1")'; - $SQLquery .= ' OR (`track` > "99"))'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 '.m3u version
'; - $TrackZeroCounter = 0; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) { - $TrackZeroCounter++; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
m3ufilenametrack
m3u'.FixTextFields($row['filename']).''.FixTextFields($row['track']).'
'; - echo ''.number_format($TrackZeroCounter).' files with track "zero"'; - - } - - -} elseif (!empty($_REQUEST['titlefeat'])) { - - $SQLquery = 'SELECT `filename`, `title`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`title` LIKE "%feat.%")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 "feat." in the title (instead of the artist)

'; - echo '.m3u version
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
m3ufilenametitle
m3u'.FixTextFields($row['filename']).''.eregi_replace('(feat\. .*)', '\\1', FixTextFields($row['title'])).'
'; - - } - - -} elseif (!empty($_REQUEST['tracknoalbum'])) { - - $SQLquery = 'SELECT `filename`, `track`, `album`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`track` <> "")'; - $SQLquery .= ' AND (`album` = "")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 a track number, but no album

'; - echo '.m3u version
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
m3ufilenametrackalbum
m3u'.FixTextFields($row['filename']).''.FixTextFields($row['track']).''.FixTextFields($row['album']).'
'; - - } - - -} elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) { - - echo 'Applying new tags from '.$_REQUEST['synchronizetagsfrom'].' in '.FixTextFields($_REQUEST['filename']).'
    '; - $errors = array(); - if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) { - echo '
  • Sucessfully wrote tags
  • '; - } else { - echo '
  • Tag writing had errors:
    • '.implode('
    • ', $errors).'
  • '; - } - echo '
'; - - -} 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 'Auto-fix empty tags

'; - echo '
'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if ($TagsToCompare['id3v2']) { - echo ''; - } - if ($TagsToCompare['ape']) { - echo ''; - } - if ($TagsToCompare['lyrics3']) { - echo ''; - } - if ($TagsToCompare['id3v1']) { - echo ''; - } - echo ''; - - $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` = "mp3")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - $lastdir = ''; - while ($row = mysql_fetch_array($result)) { - set_time_limit(30); - if ($lastdir != dirname($row['filename'])) { - echo ''; - 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); - - $Comments['all'] = @unserialize($row['comments_all']); - $Comments['id3v2'] = @unserialize($row['comments_id3v2']); - $Comments['ape'] = @unserialize($row['comments_ape']); - $Comments['lyrics3'] = @unserialize($row['comments_lyrics3']); - $Comments['id3v1'] = @unserialize($row['comments_id3v1']); - - 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 = ''; - $ThisLine .= ''; - $ThisLine .= ''; - $tagvalues = ''; - foreach ($FieldsToCompare as $fieldname) { - $tagvalues .= $fieldname.' = '.@implode(" \n", @$Comments['all'][$fieldname])." \n"; - } - $ThisLine .= ''; - 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') && !getid3_id3v1::LookupGenreID(@$Comments['all'][$fieldname][0])) { - - // non-standard genres can never match, so just ignore - $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n"; - - } elseif ($fieldname == 'comment') { - - if (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 28))) { -//echo __LINE__.'
'; -//echo '
';
-//var_dump($tagtype);
-//var_dump($fieldname);
-//echo '
';
-//exit;
-								$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.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-							}
-
-						} elseif ($fieldname == 'track') {
-
-							// intval('01/20') == intval('1')
-							if (intval(@$Comments[$tagtype][$fieldname][0]) != intval(@$Comments['all'][$fieldname][0])) {
-//echo __LINE__.'
'; -//echo '
';
-//var_dump($tagtype);
-//var_dump($fieldname);
-//echo '
';
-//exit;
-								$tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
-								$Mismatched[$tagtype]  = true;
-								$FileOK = false;
-							} else {
-								$tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-							}
-
-						} elseif (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 30))) {
-
-//echo __LINE__.'
'; -//echo '
';
-//var_dump($tagtype);
-//var_dump($fieldname);
-//echo '
';
-//exit;
-							$tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
-							if (strtolower(RemoveAccents(trim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)))) == strtolower(RemoveAccents(trim(substr(@$Comments['all'][$fieldname][0], 0, 30))))) {
-								$SemiMatched[$tagtype] = true;
-							} else {
-								$Mismatched[$tagtype]  = true;
-							}
-							$FileOK = false;
-							if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						} else {
-
-							$tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-							if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						}
-
-					} elseif (($tagtype == 'ape') && ($fieldname == 'year')) {
-
-						if ((@$Comments['ape']['date'][0] != @$Comments['all']['year'][0]) && (@$Comments['ape']['year'][0] != @$Comments['all']['year'][0])) {
-
-							$tagvalues .= $fieldname.' = [['.@$Comments['ape']['date'][0].']]'."\n";
-							$Mismatched[$tagtype]  = true;
-							$FileOK = false;
-							if (strlen(trim(@$Comments['ape']['date'][0])) > 0) {
-								$EmptyTags[$tagtype] = false;
-							}
-
-						} else {
-
-							$tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-							if (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.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-						if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
-							$EmptyTags[$tagtype] = false;
-						}
-
-					} elseif (@$Comments[$tagtype][$fieldname][0] != @$Comments['all'][$fieldname][0]) {
-
-//echo __LINE__.'
'; -//echo '
';
-//var_dump($tagtype);
-//var_dump($fieldname);
-//var_dump($Comments[$tagtype][$fieldname][0]);
-//var_dump($Comments['all'][$fieldname][0]);
-//echo '
';
-//exit;
-						$skiptracknumberfield = false;
-						switch ($fieldname) {
-							case 'track':
-							case 'tracknumber':
-							case 'track_number':
-								if (intval(@$Comments[$tagtype][$fieldname][0]) == intval(@$Comments['all'][$fieldname][0])) {
-									$skiptracknumberfield = true;
-								}
-								break;
-						}
-						if (!$skiptracknumberfield) {
-							$tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
-							if (trim(strtolower(RemoveAccents(@$Comments[$tagtype][$fieldname][0]))) == trim(strtolower(RemoveAccents(@$Comments['all'][$fieldname][0])))) {
-								$SemiMatched[$tagtype] = true;
-							} else {
-								$Mismatched[$tagtype]  = true;
-							}
-							$FileOK = false;
-							if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
-								$EmptyTags[$tagtype] = false;
-							}
-						}
-
-					} else {
-
-						$tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
-						if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
-							$EmptyTags[$tagtype] = false;
-						}
-
-					}
-				}
-
-				if ($EmptyTags[$tagtype]) {
-					$FileOK = false;
-					$ThisLine .= '
'; - } - } - $ThisLine .= ''; - - if (!$FileOK) { - $NotOKfiles++; - - echo ''; - 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 = (@$_REQUEST['autofixforcesource'] ? $_REQUEST['autofixforcesource'] : 'all'); - $TagsToSynch = (@$_REQUEST['autofixforcedest'] ? $_REQUEST['autofixforcedest'] : $TagsToSynch); - - $errors = array(); - if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors)) { - $Autofixedfiles++; - echo ''; - } else { - echo ''; - } - echo ''; - echo ''; - } - - } else { - - echo $ThisLine; - - } - } - } - - echo '
ViewFilenameCombinedID3v2APELyrics3ID3v1
view'.FixTextFields($row['filename']).'all'; - } elseif ($SemiMatched[$tagtype]) { - $ThisLine .= ''; - } elseif ($Mismatched[$tagtype]) { - $ThisLine .= ''; - } else { - $ThisLine .= ''; - } - $ThisLine .= ''.$tagtype.''; - $ThisLine .= '
 '; - echo ''.FixTextFields($row['filename']).''; - echo ''; - echo '
'.$TagsToSynch.'

'; - echo ''; - echo 'Found '.number_format($NotOKfiles).' 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(eregi_replace('[^A-Z]', '', $_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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - echo 'Files that do not match naming pattern: (auto-fix)
'; - echo ''; - echo ''; - $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 = eregi_replace('([ a-z]+)/([ a-z]+)', '\\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 (ereg('^(.*)'.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 = ereg_replace(preg_quote($pair), '', $PatternFilename); - - // "[01] - Title With No Artist.mp3" ==> "[01] Title With No Artist.mp3" - $PatternFilename = ereg_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, ''.$ActualFilenameNoExt.'', $PatternFilenameNoExt); - } else { - $ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt)); - for ($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset++) { - if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset}) { - break; - } - } - $DifferenceBoldedName = ''.substr($PatternFilenameNoExt, 0, $DifferenceOffset).''.substr($PatternFilenameNoExt, $DifferenceOffset); - } - $DifferenceBoldedName .= (($actualExt == $patternExt) ? ''.$patternExt.'' : $patternExt); - - - echo ''; - echo ''; - echo ''; - echo ''; - - if (@$_REQUEST['autofix']) { - - $results = ''; - if (RenameFileFromTo($row['filename'], dirname($row['filename']).'/'.$PatternFilename, $results)) { - echo ''; - - - } else { - - echo ''; - - } - echo ''; - - $nonmatchingfilenames++; - } - } - echo '
viewWhyActual filename
(click to play/edit file)
Correct filename (based on tags)'.(!@$_REQUEST['autofix'] ? '
(click to rename file to this)' : '').'
view '.$NotMatchedReasons.''.FixTextFields($ActualFilename).''; - } else { - echo ''; - } - echo ''.$DifferenceBoldedName.''; - echo ''.$DifferenceBoldedName.'

'; - echo 'Found '.number_format($nonmatchingfilenames).' files that do not match naming pattern
'; - - -} elseif (!empty($_REQUEST['encoderoptionsdistribution'])) { - - if (isset($_REQUEST['showtagfiles'])) { - $SQLquery = 'SELECT `filename`, `encoder_options` FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`encoder_options` LIKE "'.mysql_escape_string($_REQUEST['showtagfiles']).'")'; - $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 'Show all Encoder Options
'; - echo 'Files with Encoder Options '.$_REQUEST['showtagfiles'].':
'; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
'.FixTextFields($row['filename']).''.$row['encoder_options'].'
'; - - } - - } elseif (!isset($_REQUEST['m3u'])) { - - $SQLquery = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `'.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 = safe_mysql_query($SQLquery); - echo 'Files with Encoder Options:
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
Encoder OptionsCountM3U
'.$row['encoder_options'].''.number_format($row['num']).'m3u

'; - - } - -} elseif (!empty($_REQUEST['tagtypes'])) { - - if (!isset($_REQUEST['m3u'])) { - $SQLquery = 'SELECT `tags`, COUNT(*) AS `num` FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; - $SQLquery .= ' GROUP BY `tags`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($SQLquery); - echo 'Files with tags:
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
TagsCountM3U
'.$row['tags'].''.number_format($row['num']).'m3u

'; - } - - if (isset($_REQUEST['showtagfiles'])) { - $SQLquery = 'SELECT `filename`, `tags` FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`tags` LIKE "'.mysql_escape_string($_REQUEST['showtagfiles']).'")'; - $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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 ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
'.FixTextFields($row['filename']).''.$row['tags'].'
'; - - } - } - - -} elseif (!empty($_REQUEST['md5datadupes'])) { - - $OtherFormats = ''; - $AVFormats = ''; - - $SQLquery = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`md5_data` <> "")'; - $SQLquery .= ' GROUP BY `md5_data`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`md5_data` = "'.mysql_escape_string($row['md5_data']).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result2 = safe_mysql_query($SQLquery); - while ($row2 = mysql_fetch_array($result2)) { - $thisfileformat = $row2['fileformat']; - $filenames[] = $row2['filename']; - $tags[] = $row2['tags']; - $md5_data[] = $row['md5_data']; - } - - $thisline = ''; - $thisline .= ''.implode('
', $md5_data).''; - $thisline .= ''.implode('
', $tags).''; - $thisline .= ''.implode('
', $filenames).''; - $thisline .= ''; - - if (in_array($thisfileformat, $IgnoreNoTagFormats)) { - $OtherFormats .= $thisline; - } else { - $AVFormats .= $thisline; - } - } - echo 'Duplicated MD5_DATA (Audio/Video files):'; - echo $AVFormats.'

'; - echo 'Duplicated MD5_DATA (Other files):'; - echo $OtherFormats.'

'; - - -} 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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($_REQUEST['m3uartist']).'")'; - $SQLquery .= ' AND (`title` = "'.mysql_escape_string($_REQUEST['m3utitle']).'")'; - $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; - $result = safe_mysql_query($SQLquery); - while ($row = mysql_fetch_array($result)) { - echo WindowsShareSlashTranslate($row['filename'])."\n"; - } - exit; - - } - - $SQLquery = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`artist` <> "")'; - $SQLquery .= ' AND (`title` <> "")'; - $SQLquery .= ' GROUP BY `artist`, `title`'.(@$_REQUEST['samemix'] ? ', `remix`' : ''); - $SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC'; - $result = safe_mysql_query($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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($row['artist']).'")'; - $SQLquery .= ' AND (`title` = "'.mysql_escape_string($row['title']).'")'; - if (@$_REQUEST['samemix']) { - $SQLquery .= ' AND (`remix` = "'.mysql_escape_string($row['remix']).'")'; - } - $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; - $result2 = safe_mysql_query($SQLquery); - while ($row2 = mysql_fetch_array($result2)) { - echo WindowsShareSlashTranslate($row2['filename'])."\n"; - } - } - exit; - - } else { - - echo 'Duplicated aritst + title: (Identical Mix/Version only)
'; - echo '(.m3u version)
'; - echo ''; - echo ''; - - 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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($row['artist']).'")'; - $SQLquery .= ' AND (`title` = "'.mysql_escape_string($row['title']).'")'; - $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; - $result2 = safe_mysql_query($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[] = ''.BitrateText($row2['audio_bitrate'] / 1000).''; - } else { - $bitrates[] = BitrateText($row2['audio_bitrate'] / 1000); - } - $playtimes[] = getid3_lib::PlaytimeString($row2['playtime_seconds']); - } - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - echo ''; - - echo ''; - } - - } - echo '
 ArtistTitleVersion  Filename
'; - foreach ($filenames as $file) { - echo 'delete
'; - } - echo '
'; - foreach ($filenames as $file) { - echo 'play
'; - } - echo '
play all'.implode('
', $artists).'
'.implode('
', $titles).'
'.implode('
', $remixes).'
'.implode('
', $bitrates).'
'.implode('
', $playtimes).'
'; - foreach ($filenames as $file) { - echo ''; - } - echo '
'.dirname($file).'/'.basename($file).'
'; - echo number_format($uniquefiles).' files with '.number_format($uniquetitles).' unique aritst + title
'; - echo '
'; - -} elseif (!empty($_REQUEST['filetypelist'])) { - - list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']); - $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` = "'.mysql_escape_string($fileformat).'")'; - $SQLquery .= ' AND (`audio_dataformat` = "'.mysql_escape_string($audioformat).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - echo 'Files of format '.$fileformat.'.'.$audioformat.':'; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
fileaudiofilename
'.$row['fileformat'].''.$row['audio_dataformat'].''.FixTextFields($row['filename']).'

'; - -} elseif (!empty($_REQUEST['trackinalbum'])) { - - $SQLquery = 'SELECT `filename`, `album`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`album` LIKE "% [%")'; - $SQLquery .= ' ORDER BY `album` ASC, `filename` ASC'; - $result = safe_mysql_query($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 '
'.FixTextFields($row['filename']).'
'; - echo ''.$Album.' (track #'.$Track.')
'; - echo 'ID3v2: '.(RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!').', '; - echo 'ID3v1: '.(WriteID3v1($row['filename'], @$ThisFileInfo['comments']['title'][0], @$ThisFileInfo['comments']['artist'][0], $Album, @$ThisFileInfo['comments']['year'][0], @$ThisFileInfo['comments']['comment'][0], @$ThisFileInfo['comments']['genreid'][0], $Track, false) ? 'updated' : 'UPDATE FAILED').'
'; - } else { - echo ' . '; - } - - } else { - - echo '
FAILED
'.FixTextFields($row['filename']).'
'; - - } - flush(); - } - - } else { - - echo ''.number_format(mysql_num_rows($result)).' files with [??]-format track numbers in album field:
'; - if (mysql_num_rows($result) > 0) { - echo '(.m3u version)
'; - echo 'Try to auto-fix
'; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
'.$row['album'].''.FixTextFields($row['filename']).'
'; - } - echo '
'; - - } - -} elseif (!empty($_REQUEST['fileextensions'])) { - - $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - $invalidextensionfiles = 0; - $invalidextensionline = ''; - $invalidextensionline .= ''; - 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 .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - $invalidextensionline .= ''; - } - } - $invalidextensionline .= '
fileaudiovideotagsactualcorrectfilename
'.$row['fileformat'].''.$row['audio_dataformat'].''.$row['video_dataformat'].''.$row['tags'].''.$actualextension.''.implode('; ', $acceptableextensions).''.FixTextFields($row['filename']).'

'; - echo number_format($invalidextensionfiles).' files with incorrect filename extension:
'; - echo $invalidextensionline; - -} elseif (isset($_REQUEST['genredistribution'])) { - - if (!empty($_REQUEST['m3u'])) { - - header('Content-type: audio/x-mpegurl'); - echo '#EXTM3U'."\n"; - $SQLquery = 'SELECT `filename`'; - $SQLquery .= ' FROM `'.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 = safe_mysql_query($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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; - $SQLquery .= ' GROUP BY `genre`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($SQLquery); - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - $GenreID = getid3_id3v1::LookupGenreID($row['genre']); - if (is_numeric($GenreID)) { - echo ''; - } else { - echo ''; - } - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
CountGenrem3u
'.number_format($row['num']).''.str_replace("\t", '
', $row['genre']).'
.m3u

'; - - } else { - - $SQLquery = 'SELECT `filename`, `genre`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`genre` LIKE "'.mysql_escape_string($_REQUEST['genredistribution']).'")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($SQLquery); - echo 'All Genres
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
Genrem3uFilename
'.str_replace("\t", '
', $row['genre']).'
m3u'.FixTextFields($row['filename']).'

'; - - } - - - } - -} elseif (!empty($_REQUEST['formatdistribution'])) { - - $SQLquery = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`'; - $SQLquery .= ' ORDER BY `num` DESC'; - $result = safe_mysql_query($SQLquery); - echo 'File format distribution:'; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - } - echo '
NumberFormat
'.number_format($row['num']).''.($row['fileformat'] ? $row['fileformat'] : 'unknown').(($row['audio_dataformat'] && ($row['audio_dataformat'] != $row['fileformat'])) ? '.'.$row['audio_dataformat'] : '').'

'; - -} elseif (!empty($_REQUEST['errorswarnings'])) { - - $SQLquery = 'SELECT `filename`, `error`, `warning`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`error` <> "")'; - $SQLquery .= ' OR (`warning` <> "")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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:
'; - echo '(.m3u version)
'; - echo ''; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
FilenameErrorWarning
'.FixTextFields($row['filename']).''.(!empty($row['error']) ? '
  • '.str_replace("\t", '
  • ', FixTextFields($row['error'])).'
  • ' : ' ').'
    '.(!empty($row['warning']) ? '
  • '.str_replace("\t", '
  • ', FixTextFields($row['warning'])).'
  • ' : ' ').'

    '; - -} 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 `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` = "mp3")'; - $SQLquery .= ' AND (`warning` <> "")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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() ? 'fixed - ' : 'error - '); - } else { - echo 'No error? - '; - } - echo '['.++$rowcounter.' / '.$totaltofix.'] '; - echo FixTextFields($row['filename']).'
    '; - flush(); - } - -} elseif (!empty($_REQUEST['vbrmethod'])) { - - if ($_REQUEST['vbrmethod'] == '1') { - - $SQLquery = 'SELECT COUNT(*) AS `num`, `vbr_method`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' GROUP BY `vbr_method`'; - $SQLquery .= ' ORDER BY `vbr_method`'; - $result = safe_mysql_query($SQLquery); - echo 'VBR methods:'; - echo ''; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - if ($row['vbr_method']) { - echo ''; - } else { - echo ''; - } - echo ''; - } - echo '
    CountVBR Method
    '.FixTextFields(number_format($row['num'])).''.FixTextFields($row['vbr_method']).'CBR
    '; - - } else { - - $SQLquery = 'SELECT `filename`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`vbr_method` = "'.mysql_escape_string($_REQUEST['vbrmethod']).'")'; - $result = safe_mysql_query($SQLquery); - echo number_format(mysql_num_rows($result)).' files with VBR_method of "'.$_REQUEST['vbrmethod'].'":'; - while ($row = mysql_fetch_array($result)) { - echo ''; - echo ''; - } - echo '
    m3u'.FixTextFields($row['filename']).'
    '; - - } - echo '
    '; - -} elseif (!empty($_REQUEST['correctcase'])) { - - $SQLquery = 'SELECT `filename`, `fileformat`'; - $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`'; - $SQLquery .= ' WHERE (`fileformat` <> "")'; - $SQLquery .= ' ORDER BY `filename` ASC'; - $result = safe_mysql_query($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)
    '; - echo '
    ';
    -	$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 '
    '; - echo '
    '; - -} - -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 (ereg('^[\'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 '
    '; -echo 'Warning: Scanning a new directory will erase all previous entries in the database!
    '; -echo 'Directory: '; -echo ''; -echo '
    '; -echo '
    '; -echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).
    '; -echo 'Directory: '; -echo ''; -echo '

    '; -echo ''; - -$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 `'.GETID3_DB_TABLE.'`'; -$result = mysql_query($SQLquery); -if ($row = mysql_fetch_array($result)) { - echo '
    Currently in the database:'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
    Total Files'.number_format($row['TotalFiles']).'
    Total Filesize'.number_format($row['TotalFilesize'] / 1048576).' MB
    Total Playtime'.number_format($row['TotalPlaytime'] / 3600, 1).' hours
    Average Filesize'.number_format($row['AvgFilesize'] / 1048576, 1).' MB
    Average Playtime'.getid3_lib::PlaytimeString($row['AvgPlaytime']).'
    Average Bitrate'.BitrateText($row['AvgBitrate'] / 1000, 1).'
    '; -} - -?> - - \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.simple.php b/apps/media/getID3/demos/demo.simple.php deleted file mode 100644 index db937f1e2d..0000000000 --- a/apps/media/getID3/demos/demo.simple.php +++ /dev/null @@ -1,53 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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 // -// /// -///////////////////////////////////////////////////////////////// - -echo ''; -echo 'getID3() - /demo/demo.simple.php (sample script)'; -echo ''; -echo ''; - - -// 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 ''; -echo ''; -while (($file = readdir($dir)) !== false) { - $FullFileName = realpath($DirectoryToScan.'/'.$file); - if (is_file($FullFileName)) { - set_time_limit(30); - - $ThisFileInfo = $getID3->analyze($FullFileName); - - getid3_lib::CopyTagsToComments($ThisFileInfo); - - // output desired information in whatever format you want - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } -} - -?> - - \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.simple.write.php b/apps/media/getID3/demos/demo.simple.write.php deleted file mode 100644 index 468984e39e..0000000000 --- a/apps/media/getID3/demos/demo.simple.write.php +++ /dev/null @@ -1,54 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /demo/demo.simple.write.php - part of getID3() // -// Sample script showing basic syntax for writing tags // -// See readme.txt for more details // -// /// -///////////////////////////////////////////////////////////////// - -$TaggingFormat = 'UTF-8'; - -require_once('../getid3/getid3.php'); -// Initialize getID3 engine -$getID3 = new getID3; -$getID3->setOption(array('encoding'=>$TaggingFormat)); - -require_once('../getid3/write.php'); -// Initialize getID3 tag-writing module -$tagwriter = new getid3_writetags; -//$tagwriter->filename = '/path/to/file.mp3'; -$tagwriter->filename = 'd:/file.mp3'; -$tagwriter->tagformats = array('id3v1', 'id3v2.3'); - -// set various options (optional) -$tagwriter->overwrite_tags = true; -$tagwriter->tag_encoding = $TaggingFormat; -$tagwriter->remove_other_tags = true; - -// populate data array -$TagData['title'][] = 'My Song'; -$TagData['artist'][] = 'The Artist'; -$TagData['album'][] = 'Greatest Hits'; -$TagData['year'][] = '2004'; -$TagData['genre'][] = 'Rock'; -$TagData['comment'][] = 'excellent!'; -$TagData['track'][] = '04/16'; - -$tagwriter->tag_data = $TagData; - -// write tags -if ($tagwriter->WriteTags()) { - echo 'Successfully wrote tags
    '; - if (!empty($tagwriter->warnings)) { - echo 'There were some warnings:
    '.implode('

    ', $tagwriter->warnings); - } -} else { - echo 'Failed to write tags!
    '.implode('

    ', $tagwriter->errors); -} - -?> \ No newline at end of file diff --git a/apps/media/getID3/demos/demo.write.php b/apps/media/getID3/demos/demo.write.php deleted file mode 100644 index 6f03b47838..0000000000 --- a/apps/media/getID3/demos/demo.write.php +++ /dev/null @@ -1,271 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -///////////////////////////////////////////////////////////////// -// // -// /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 16 in demos/demo.write.php'); - - -$TaggingFormat = 'UTF-8'; - -header('Content-Type: text/html; charset='.$TaggingFormat); -echo 'getID3() - Sample tag writer'; - -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'; - -function FixTextFields($text) { - return htmlentities(getid3_lib::SafeStripSlashes($text), ENT_QUOTES); -} - -$Filename = (isset($_REQUEST['Filename']) ? getid3_lib::SafeStripSlashes($_REQUEST['Filename']) : ''); - - - -if (isset($_POST['WriteTags'])) { - - $TagFormatsToWrite = (isset($_POST['TagFormatsToWrite']) ? $_POST['TagFormatsToWrite'] : array()); - if (!empty($TagFormatsToWrite)) { - echo 'starting to write tag(s)
    '; - - $tagwriter = new getid3_writetags; - $tagwriter->filename = $Filename; - $tagwriter->tagformats = $TagFormatsToWrite; - $tagwriter->overwrite_tags = true; - $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)][] = getid3_lib::SafeStripSlashes($_POST[$key]); - } - } - if (!empty($_POST['Genre'])) { - $TagData['genre'][] = getid3_lib::SafeStripSlashes($_POST['Genre']); - } - if (!empty($_POST['GenreOther'])) { - $TagData['genre'][] = getid3_lib::SafeStripSlashes($_POST['GenreOther']); - } - if (!empty($_POST['Track'])) { - $TagData['track'][] = getid3_lib::SafeStripSlashes($_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'])) { - if ($fd = @fopen($_FILES['userfile']['tmp_name'], 'rb')) { - $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 'invalid image format (only GIF, JPEG, PNG)
    '; - } - } else { - echo 'cannot open '.$_FILES['userfile']['tmp_name'].'
    '; - } - } else { - echo '!is_uploaded_file('.$_FILES['userfile']['tmp_name'].')
    '; - } - } else { - echo 'WARNING: Can only embed images for ID3v2
    '; - } - } - - $tagwriter->tag_data = $TagData; - if ($tagwriter->WriteTags()) { - echo 'Successfully wrote tags
    '; - if (!empty($tagwriter->warnings)) { - echo 'There were some warnings:
    '.implode('

    ', $tagwriter->warnings).'
    '; - } - } else { - echo 'Failed to write tags!
    '.implode('

    ', $tagwriter->errors).'
    '; - } - - } else { - - echo 'WARNING: no tag formats selected for writing - nothing written'; - - } - echo '
    '; - -} - - -echo '

    Sample tag editor/writer

    '; -echo 'Browse current directory
    '; -if (!empty($Filename)) { - echo 'Start Over

    '; - echo '
    FilenameArtistTitleBitratePlaytime
    '.$ThisFileInfo['filenamepath'].''.(!empty($ThisFileInfo['comments_html']['artist']) ? implode('
    ', $ThisFileInfo['comments_html']['artist']) : ' ').'
    '.(!empty($ThisFileInfo['comments_html']['title']) ? implode('
    ', $ThisFileInfo['comments_html']['title']) : ' ').'
    '.(!empty($ThisFileInfo['audio']['bitrate']) ? round($ThisFileInfo['audio']['bitrate'] / 1000).' kbps' : ' ').''.(!empty($ThisFileInfo['playtime_string']) ? $ThisFileInfo['playtime_string'] : ' ').'
    '; - echo ''; - 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 (@$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 ''; - echo ''; - echo ''; - echo ''; - - $TracksTotal = ''; - $TrackNumber = ''; - if (!empty($OldThisFileInfo['comments']['tracknumber']) && is_array($OldThisFileInfo['comments']['tracknumber'])) { - $RawTrackNumberArray = $OldThisFileInfo['comments']['tracknumber']; - } 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 ''; - - $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 ''; - - echo ''; - - echo ''; - - echo ''; - echo ''; - - } else { - - echo ''; - - } - echo '
    Filename: '.$Filename.'
    Title
    Artist
    Album
    Year
    Track of
    Genre
    Write Tags'; - foreach ($ValidTagTypes as $ValidTagType) { - echo ''.$ValidTagType.'
    '; - } - if (count($ValidTagTypes) > 1) { - echo '
    Remove non-selected tag formats when writing new tag
    '; - } - echo '
    Comment
    Picture
    (ID3v2 only)

    '; - echo '
    '; - echo '
    Error'.FixTextFields($Filename).' does not exist
    '; - -} - -?> - - \ No newline at end of file diff --git a/apps/media/getID3/demos/getid3.css b/apps/media/getID3/demos/getid3.css deleted file mode 100644 index 0694eff2ad..0000000000 --- a/apps/media/getID3/demos/getid3.css +++ /dev/null @@ -1,195 +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: #0000cc; -} - - -td.dump_integer { - color: #cc0000; - font-weight: bold; -} - - -td.dump_double { - color: orange; - font-weight: bold; -} - - -td.dump_boolean { - color: #333333; - 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/apps/media/getID3/demos/index.php b/apps/media/getID3/demos/index.php deleted file mode 100644 index 13783f0daf..0000000000 --- a/apps/media/getID3/demos/index.php +++ /dev/null @@ -1 +0,0 @@ -In this directory are a number of examples of how to use getID3() - if you don't know what to run, take a look at demo.browse.php \ No newline at end of file