Created
October 20, 2012 18:09
-
-
Save bangpound/3924236 to your computer and use it in GitHub Desktop.
Remove demos from getid3 1.9.3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit cc58949b94bab61058da4b7ef9c448d6552d1c33 | |
Author: Benjamin Doherty <[email protected]> | |
Date: Sat Oct 20 13:08:30 2012 -0500 | |
remove demos. | |
diff --git a/demos/demo.audioinfo.class.php b/demos/demo.audioinfo.class.php | |
deleted file mode 100644 | |
index be74fd1..0000000 | |
--- a/demos/demo.audioinfo.class.php | |
+++ /dev/null | |
@@ -1,319 +0,0 @@ | |
-<?php | |
- | |
-// +----------------------------------------------------------------------+ | |
-// | PHP version 4.1.0 | | |
-// +----------------------------------------------------------------------+ | |
-// | Placed in public domain by Allan Hansen, 2002. Share and enjoy! | | |
-// +----------------------------------------------------------------------+ | |
-// | /demo/demo.audioinfo.class.php | | |
-// | | | |
-// | Example wrapper class to extract information from audio files | | |
-// | through getID3(). | | |
-// | | | |
-// | getID3() returns a lot of information. Much of this information is | | |
-// | not needed for the end-application. It is also possible that some | | |
-// | users want to extract specific info. Modifying getID3() files is a | | |
-// | bad idea, as modifications needs to be done to future versions of | | |
-// | getID3(). | | |
-// | | | |
-// | Modify this wrapper class instead. This example extracts certain | | |
-// | fields only and adds a new root value - encoder_options if possible. | | |
-// | It also checks for mp3 files with wave headers. | | |
-// +----------------------------------------------------------------------+ | |
-// | Example code: | | |
-// | $au = new AudioInfo(); | | |
-// | print_r($au->Info('file.flac'); | | |
-// +----------------------------------------------------------------------+ | |
-// | Authors: Allan Hansen <ahÿartemis*dk> | | |
-// +----------------------------------------------------------------------+ | |
-// | |
- | |
- | |
- | |
-/** | |
-* getID3() settings | |
-*/ | |
- | |
-require_once('../getid3/getid3.php'); | |
- | |
- | |
- | |
- | |
-/** | |
-* Class for extracting information from audio files with getID3(). | |
-*/ | |
- | |
-class AudioInfo { | |
- | |
- /** | |
- * Private variables | |
- */ | |
- var $result = NULL; | |
- var $info = NULL; | |
- | |
- | |
- | |
- | |
- /** | |
- * Constructor | |
- */ | |
- | |
- function AudioInfo() { | |
- | |
- // Initialize getID3 engine | |
- $this->getID3 = new getID3; | |
- $this->getID3->option_md5_data = true; | |
- $this->getID3->option_md5_data_source = true; | |
- $this->getID3->encoding = 'UTF-8'; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * Extract information - only public function | |
- * | |
- * @access public | |
- * @param string file Audio file to extract info from. | |
- */ | |
- | |
- function Info($file) { | |
- | |
- // Analyze file | |
- $this->info = $this->getID3->analyze($file); | |
- | |
- // Exit here on error | |
- if (isset($this->info['error'])) { | |
- return array ('error' => $this->info['error']); | |
- } | |
- | |
- // Init wrapper object | |
- $this->result = array(); | |
- $this->result['format_name'] = (isset($this->info['fileformat']) ? $this->info['fileformat'] : '').'/'.(isset($this->info['audio']['dataformat']) ? $this->info['audio']['dataformat'] : '').(isset($this->info['video']['dataformat']) ? '/'.$this->info['video']['dataformat'] : ''); | |
- $this->result['encoder_version'] = (isset($this->info['audio']['encoder']) ? $this->info['audio']['encoder'] : ''); | |
- $this->result['encoder_options'] = (isset($this->info['audio']['encoder_options']) ? $this->info['audio']['encoder_options'] : ''); | |
- $this->result['bitrate_mode'] = (isset($this->info['audio']['bitrate_mode']) ? $this->info['audio']['bitrate_mode'] : ''); | |
- $this->result['channels'] = (isset($this->info['audio']['channels']) ? $this->info['audio']['channels'] : ''); | |
- $this->result['sample_rate'] = (isset($this->info['audio']['sample_rate']) ? $this->info['audio']['sample_rate'] : ''); | |
- $this->result['bits_per_sample'] = (isset($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : ''); | |
- $this->result['playing_time'] = (isset($this->info['playtime_seconds']) ? $this->info['playtime_seconds'] : ''); | |
- $this->result['avg_bit_rate'] = (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : ''); | |
- $this->result['tags'] = (isset($this->info['tags']) ? $this->info['tags'] : ''); | |
- $this->result['comments'] = (isset($this->info['comments']) ? $this->info['comments'] : ''); | |
- $this->result['warning'] = (isset($this->info['warning']) ? $this->info['warning'] : ''); | |
- $this->result['md5'] = (isset($this->info['md5_data']) ? $this->info['md5_data'] : ''); | |
- | |
- // Post getID3() data handling based on file format | |
- $method = (isset($this->info['fileformat']) ? $this->info['fileformat'] : '').'Info'; | |
- if ($method && method_exists($this, $method)) { | |
- $this->$method(); | |
- } | |
- | |
- return $this->result; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for AAC files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function aacInfo() { | |
- $this->result['format_name'] = 'AAC'; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Wave files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function riffInfo() { | |
- if ($this->info['audio']['dataformat'] == 'wav') { | |
- | |
- $this->result['format_name'] = 'Wave'; | |
- | |
- } elseif (preg_match('#^mp[1-3]$#', $this->info['audio']['dataformat'])) { | |
- | |
- $this->result['format_name'] = strtoupper($this->info['audio']['dataformat']); | |
- | |
- } else { | |
- | |
- $this->result['format_name'] = 'riff/'.$this->info['audio']['dataformat']; | |
- | |
- } | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * * post-getID3() data handling for FLAC files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function flacInfo() { | |
- $this->result['format_name'] = 'FLAC'; | |
- } | |
- | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Monkey's Audio files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function macInfo() { | |
- $this->result['format_name'] = 'Monkey\'s Audio'; | |
- } | |
- | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Lossless Audio files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function laInfo() { | |
- $this->result['format_name'] = 'La'; | |
- } | |
- | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Ogg Vorbis files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function oggInfo() { | |
- if ($this->info['audio']['dataformat'] == 'vorbis') { | |
- | |
- $this->result['format_name'] = 'Ogg Vorbis'; | |
- | |
- } else if ($this->info['audio']['dataformat'] == 'flac') { | |
- | |
- $this->result['format_name'] = 'Ogg FLAC'; | |
- | |
- } else if ($this->info['audio']['dataformat'] == 'speex') { | |
- | |
- $this->result['format_name'] = 'Ogg Speex'; | |
- | |
- } else { | |
- | |
- $this->result['format_name'] = 'Ogg '.$this->info['audio']['dataformat']; | |
- | |
- } | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Musepack files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function mpcInfo() { | |
- $this->result['format_name'] = 'Musepack'; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for MPEG files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function mp3Info() { | |
- $this->result['format_name'] = 'MP3'; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for MPEG files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function mp2Info() { | |
- $this->result['format_name'] = 'MP2'; | |
- } | |
- | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for MPEG files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function mp1Info() { | |
- $this->result['format_name'] = 'MP1'; | |
- } | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for WMA files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function asfInfo() { | |
- $this->result['format_name'] = strtoupper($this->info['audio']['dataformat']); | |
- } | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for Real files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function realInfo() { | |
- $this->result['format_name'] = 'Real'; | |
- } | |
- | |
- | |
- | |
- | |
- | |
- /** | |
- * post-getID3() data handling for VQF files. | |
- * | |
- * @access private | |
- */ | |
- | |
- function vqfInfo() { | |
- $this->result['format_name'] = 'VQF'; | |
- } | |
- | |
-} | |
- | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.basic.php b/demos/demo.basic.php | |
deleted file mode 100644 | |
index 45f2690..0000000 | |
--- a/demos/demo.basic.php | |
+++ /dev/null | |
@@ -1,53 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
- | |
-// include getID3() library (can be in a different directory if full path is specified) | |
-require_once('../getid3/getid3.php'); | |
- | |
-// Initialize getID3 engine | |
-$getID3 = new getID3; | |
- | |
-// Analyze file and store returned data in $ThisFileInfo | |
-$ThisFileInfo = $getID3->analyze($filename); | |
- | |
-/* | |
- Optional: copies data from all subarrays of [tags] into [comments] so | |
- metadata is all available in one location for all tag formats | |
- metainformation is always available under [tags] even if this is not called | |
-*/ | |
-getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
-/* | |
- Output desired information in whatever format you want | |
- Note: all entries in [comments] or [tags] are arrays of strings | |
- See structure.txt for information on what information is available where | |
- or check out the output of /demos/demo.browse.php for a particular file | |
- to see the full detail of what information is returned where in the array | |
- Note: all array keys may not always exist, you may want to check with isset() | |
- or empty() before deciding what to output | |
-*/ | |
- | |
-//echo $ThisFileInfo['comments_html']['artist'][0]; // artist from any/all available tag formats | |
-//echo $ThisFileInfo['tags']['id3v2']['title'][0]; // title from ID3v2 | |
-//echo $ThisFileInfo['audio']['bitrate']; // audio bitrate | |
-//echo $ThisFileInfo['playtime_string']; // playtime in minutes:seconds, formatted string | |
- | |
-/* | |
- if you want to see ALL the output, uncomment this line: | |
-*/ | |
-//echo '<pre>'.htmlentities(print_r($ThisFileInfo, true)).'</pre>'; | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.browse.php b/demos/demo.browse.php | |
deleted file mode 100644 | |
index 9c80f77..0000000 | |
--- a/demos/demo.browse.php | |
+++ /dev/null | |
@@ -1,597 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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__)); | |
- | |
- | |
-///////////////////////////////////////////////////////////////// | |
-// die if magic_quotes_runtime or magic_quotes_gpc are set | |
-if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) { | |
- die('magic_quotes_runtime is enabled, getID3 will not run.'); | |
-} | |
-if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { | |
- die('magic_quotes_gpc is enabled, getID3 will not run.'); | |
-} | |
-///////////////////////////////////////////////////////////////// | |
- | |
-$PageEncoding = 'UTF-8'; | |
- | |
-$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' => $PageEncoding)); | |
- | |
-$getID3checkColor_Head = 'CCCCDD'; | |
-$getID3checkColor_DirectoryLight = 'FFCCCC'; | |
-$getID3checkColor_DirectoryDark = 'EEBBBB'; | |
-$getID3checkColor_FileLight = 'EEEEEE'; | |
-$getID3checkColor_FileDark = 'DDDDDD'; | |
-$getID3checkColor_UnknownLight = 'CCCCFF'; | |
-$getID3checkColor_UnknownDark = 'BBBBDD'; | |
- | |
- | |
-/////////////////////////////////////////////////////////////////////////////// | |
- | |
- | |
-header('Content-Type: text/html; charset='.$PageEncoding); | |
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; | |
-echo '<html><head>'; | |
-echo '<title>getID3() - /demo/demo.browse.php (sample script)</title>'; | |
-echo '<link rel="stylesheet" href="getid3.css" type="text/css">'; | |
-echo '<meta http-equiv="Content-Type" content="text/html;charset='.$PageEncoding.'" />'; | |
-echo '</head><body>'; | |
- | |
-if (isset($_REQUEST['deletefile'])) { | |
- if (file_exists($_REQUEST['deletefile'])) { | |
- if (unlink($_REQUEST['deletefile'])) { | |
- $deletefilemessage = 'Successfully deleted '.addslashes($_REQUEST['deletefile']); | |
- } else { | |
- $deletefilemessage = 'FAILED to delete '.addslashes($_REQUEST['deletefile']).' - error deleting file'; | |
- } | |
- } else { | |
- $deletefilemessage = 'FAILED to delete '.addslashes($_REQUEST['deletefile']).' - file does not exist'; | |
- } | |
- if (isset($_REQUEST['noalert'])) { | |
- echo '<b><font color="'.(($deletefilemessage{0} == 'F') ? '#FF0000' : '#008000').'">'.$deletefilemessage.'</font></b><hr>'; | |
- } else { | |
- echo '<script type="text/javascript">alert("'.$deletefilemessage.'");</script>'; | |
- } | |
-} | |
- | |
- | |
-if (isset($_REQUEST['filename'])) { | |
- | |
- if (!file_exists($_REQUEST['filename']) || !is_file($_REQUEST['filename'])) { | |
- die(getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $_REQUEST['filename'].' does not exist')); | |
- } | |
- $starttime = microtime(true); | |
- | |
- //$getID3->setOption(array( | |
- // 'option_md5_data' => $AutoGetHashes, | |
- // 'option_sha1_data' => $AutoGetHashes, | |
- //)); | |
- $ThisFileInfo = $getID3->analyze($_REQUEST['filename']); | |
- $AutoGetHashes = (bool) (isset($ThisFileInfo['filesize']) && ($ThisFileInfo['filesize'] > 0) && ($ThisFileInfo['filesize'] < (50 * 1048576))); // auto-get md5_data, md5_file, sha1_data, sha1_file if filesize < 50MB, and NOT zero (which may indicate a file>2GB) | |
- if ($AutoGetHashes) { | |
- $ThisFileInfo['md5_file'] = md5_file($_REQUEST['filename']); | |
- $ThisFileInfo['sha1_file'] = sha1_file($_REQUEST['filename']); | |
- } | |
- | |
- | |
- getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
- $listdirectory = dirname($_REQUEST['filename']); | |
- $listdirectory = realpath($listdirectory); // get rid of /../../ references | |
- | |
- if (GETID3_OS_ISWINDOWS) { | |
- // this mostly just gives a consistant look to Windows and *nix filesystems | |
- // (windows uses \ as directory seperator, *nix uses /) | |
- $listdirectory = str_replace('\\', '/', $listdirectory.'/'); | |
- } | |
- | |
- if (strstr($_REQUEST['filename'], 'http://') || strstr($_REQUEST['filename'], 'ftp://')) { | |
- echo '<i>Cannot browse remote filesystems</i><br>'; | |
- } else { | |
- echo 'Browse: <a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory), ENT_QUOTES).'">'.getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $listdirectory).'</a><br>'; | |
- } | |
- | |
- getid3_lib::ksort_recursive($ThisFileInfo); | |
- echo table_var_dump($ThisFileInfo, false, $PageEncoding); | |
- $endtime = microtime(true); | |
- echo 'File parsed in '.number_format($endtime - $starttime, 3).' seconds.<br>'; | |
- | |
-} else { | |
- | |
- $listdirectory = (isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'); | |
- $listdirectory = realpath($listdirectory); // get rid of /../../ references | |
- $currentfulldir = $listdirectory.'/'; | |
- | |
- if (GETID3_OS_ISWINDOWS) { | |
- // this mostly just gives a consistant look to Windows and *nix filesystems | |
- // (windows uses \ as directory seperator, *nix uses /) | |
- $currentfulldir = str_replace('\\', '/', $listdirectory.'/'); | |
- } | |
- | |
- ob_start(); | |
- if ($handle = opendir($listdirectory)) { | |
- | |
- ob_end_clean(); | |
- echo str_repeat(' ', 300); // IE buffers the first 300 or so chars, making this progressive display useless - fill the buffer with spaces | |
- echo 'Processing'; | |
- | |
- $starttime = microtime(true); | |
- | |
- $TotalScannedUnknownFiles = 0; | |
- $TotalScannedKnownFiles = 0; | |
- $TotalScannedPlaytimeFiles = 0; | |
- $TotalScannedBitrateFiles = 0; | |
- $TotalScannedFilesize = 0; | |
- $TotalScannedPlaytime = 0; | |
- $TotalScannedBitrate = 0; | |
- $FilesWithWarnings = 0; | |
- $FilesWithErrors = 0; | |
- | |
- while ($file = readdir($handle)) { | |
- $currentfilename = $listdirectory.'/'.$file; | |
- set_time_limit(30); // allocate another 30 seconds to process this file - should go much quicker than this unless intense processing (like bitrate histogram analysis) is enabled | |
- echo ' .'; // progress indicator dot | |
- flush(); // make sure the dot is shown, otherwise it's useless | |
- | |
- switch ($file) { | |
- case '..': | |
- $ParentDir = realpath($file.'/..').'/'; | |
- if (GETID3_OS_ISWINDOWS) { | |
- $ParentDir = str_replace('\\', '/', $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 += (isset($fileinformation['filesize']) ? $fileinformation['filesize'] : 0); | |
- | |
- if (isset($_REQUEST['ShowMD5'])) { | |
- $fileinformation['md5_file'] = md5_file($currentfilename); | |
- } | |
- | |
- if (!empty($fileinformation['fileformat'])) { | |
- $DirectoryContents[$currentfulldir]['known'][$file] = $fileinformation; | |
- $TotalScannedPlaytime += (isset($fileinformation['playtime_seconds']) ? $fileinformation['playtime_seconds'] : 0); | |
- $TotalScannedBitrate += (isset($fileinformation['bitrate']) ? $fileinformation['bitrate'] : 0); | |
- $TotalScannedKnownFiles++; | |
- } else { | |
- $DirectoryContents[$currentfulldir]['other'][$file] = $fileinformation; | |
- $DirectoryContents[$currentfulldir]['other'][$file]['playtime_string'] = '-'; | |
- $TotalScannedUnknownFiles++; | |
- } | |
- if (isset($fileinformation['playtime_seconds']) && ($fileinformation['playtime_seconds'] > 0)) { | |
- $TotalScannedPlaytimeFiles++; | |
- } | |
- if (isset($fileinformation['bitrate']) && ($fileinformation['bitrate'] > 0)) { | |
- $TotalScannedBitrateFiles++; | |
- } | |
- } | |
- } | |
- $endtime = microtime(true); | |
- closedir($handle); | |
- echo 'done<br>'; | |
- echo 'Directory scanned in '.number_format($endtime - $starttime, 2).' seconds.<br>'; | |
- flush(); | |
- | |
- $columnsintable = 14; | |
- echo '<table class="table" cellspacing="0" cellpadding="3">'; | |
- | |
- echo '<tr bgcolor="#'.$getID3checkColor_Head.'"><th colspan="'.$columnsintable.'">Files in '.getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $currentfulldir).'</th></tr>'; | |
- $rowcounter = 0; | |
- foreach ($DirectoryContents as $dirname => $val) { | |
- if (isset($DirectoryContents[$dirname]['dir']) && is_array($DirectoryContents[$dirname]['dir'])) { | |
- uksort($DirectoryContents[$dirname]['dir'], 'MoreNaturalSort'); | |
- foreach ($DirectoryContents[$dirname]['dir'] as $filename => $fileinfo) { | |
- echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_DirectoryLight : $getID3checkColor_DirectoryDark).'">'; | |
- if ($filename == '..') { | |
- echo '<td colspan="'.$columnsintable.'">'; | |
- echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">'; | |
- echo 'Parent directory: '; | |
- echo '<input type="text" name="listdirectory" size="50" style="background-color: '.$getID3checkColor_DirectoryDark.';" value="'; | |
- if (GETID3_OS_ISWINDOWS) { | |
- echo htmlentities(str_replace('\\', '/', realpath($dirname.$filename)), ENT_QUOTES); | |
- } else { | |
- echo htmlentities(realpath($dirname.$filename), ENT_QUOTES); | |
- } | |
- echo '"> <input type="submit" value="Go">'; | |
- echo '</form></td>'; | |
- } else { | |
- echo '<td colspan="'.$columnsintable.'"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($dirname.$filename), ENT_QUOTES).'"><b>'.htmlentities($filename).'</b></a></td>'; | |
- } | |
- echo '</tr>'; | |
- } | |
- } | |
- | |
- echo '<tr bgcolor="#'.$getID3checkColor_Head.'">'; | |
- echo '<th>Filename</th>'; | |
- echo '<th>File Size</th>'; | |
- echo '<th>Format</th>'; | |
- echo '<th>Playtime</th>'; | |
- echo '<th>Bitrate</th>'; | |
- echo '<th>Artist</th>'; | |
- echo '<th>Title</th>'; | |
- if (isset($_REQUEST['ShowMD5'])) { | |
- echo '<th>MD5 File (File) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES).'">disable</a>)</th>'; | |
- echo '<th>MD5 Data (File) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES).'">disable</a>)</th>'; | |
- echo '<th>MD5 Data (Source) (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.'), ENT_QUOTES).'">disable</a>)</th>'; | |
- } else { | |
- echo '<th colspan="3">MD5 Data (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.rawurlencode(isset($_REQUEST['listdirectory']) ? $_REQUEST['listdirectory'] : '.').'&ShowMD5=1', ENT_QUOTES).'">enable</a>)</th>'; | |
- } | |
- echo '<th>Tags</th>'; | |
- echo '<th>Errors & Warnings</th>'; | |
- echo '<th>Edit</th>'; | |
- echo '<th>Delete</th>'; | |
- echo '</tr>'; | |
- | |
- if (isset($DirectoryContents[$dirname]['known']) && is_array($DirectoryContents[$dirname]['known'])) { | |
- uksort($DirectoryContents[$dirname]['known'], 'MoreNaturalSort'); | |
- foreach ($DirectoryContents[$dirname]['known'] as $filename => $fileinfo) { | |
- echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_FileDark : $getID3checkColor_FileLight).'">'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filename='.urlencode($dirname.$filename), ENT_QUOTES).'" title="View detailed analysis">'.htmlentities($filename).'</a></td>'; | |
- echo '<td align="right"> '.number_format($fileinfo['filesize']).'</td>'; | |
- echo '<td align="right"> '.NiceDisplayFiletypeFormat($fileinfo).'</td>'; | |
- echo '<td align="right"> '.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').'</td>'; | |
- echo '<td align="right"> '.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000, 0, ((isset($fileinfo['audio']['bitrate_mode']) && ($fileinfo['audio']['bitrate_mode'] == 'vbr')) ? true : false)) : '-').'</td>'; | |
- echo '<td align="left"> '.(isset($fileinfo['comments_html']['artist']) ? implode('<br>', $fileinfo['comments_html']['artist']) : ((isset($fileinfo['video']['resolution_x']) && isset($fileinfo['video']['resolution_y'])) ? $fileinfo['video']['resolution_x'].'x'.$fileinfo['video']['resolution_y'] : '')).'</td>'; | |
- echo '<td align="left"> '.(isset($fileinfo['comments_html']['title']) ? implode('<br>', $fileinfo['comments_html']['title']) : (isset($fileinfo['video']['frame_rate']) ? number_format($fileinfo['video']['frame_rate'], 3).'fps' : '')).'</td>'; | |
- if (isset($_REQUEST['ShowMD5'])) { | |
- echo '<td align="left"><tt>'.(isset($fileinfo['md5_file']) ? $fileinfo['md5_file'] : ' ').'</tt></td>'; | |
- echo '<td align="left"><tt>'.(isset($fileinfo['md5_data']) ? $fileinfo['md5_data'] : ' ').'</tt></td>'; | |
- echo '<td align="left"><tt>'.(isset($fileinfo['md5_data_source']) ? $fileinfo['md5_data_source'] : ' ').'</tt></td>'; | |
- } else { | |
- echo '<td align="center" colspan="3">-</td>'; | |
- } | |
- echo '<td align="left"> '.(!empty($fileinfo['tags']) ? implode(', ', array_keys($fileinfo['tags'])) : '').'</td>'; | |
- | |
- echo '<td align="left"> '; | |
- if (!empty($fileinfo['warning'])) { | |
- $FilesWithWarnings++; | |
- echo '<a href="#" onClick="alert(\''.htmlentities(str_replace("'", "\\'", preg_replace('#[\r\n\t]+#', ' ', implode('\\n', $fileinfo['warning']))), ENT_QUOTES).'\'); return false;" title="'.htmlentities(implode("; \n", $fileinfo['warning']), ENT_QUOTES).'">warning</a><br>'; | |
- } | |
- if (!empty($fileinfo['error'])) { | |
- $FilesWithErrors++; | |
- echo '<a href="#" onClick="alert(\''.htmlentities(str_replace("'", "\\'", preg_replace('#[\r\n\t]+#', ' ', implode('\\n', $fileinfo['error']))), ENT_QUOTES).'\'); return false;" title="'.htmlentities(implode("; \n", $fileinfo['error']), ENT_QUOTES).'">error</a><br>'; | |
- } | |
- echo '</td>'; | |
- | |
- echo '<td align="left"> '; | |
- $fileinfo['fileformat'] = (isset($fileinfo['fileformat']) ? $fileinfo['fileformat'] : ''); | |
- switch ($fileinfo['fileformat']) { | |
- case 'mp3': | |
- case 'mp2': | |
- case 'mp1': | |
- case 'flac': | |
- case 'mpc': | |
- case 'real': | |
- echo '<a href="'.htmlentities($writescriptfilename.'?Filename='.urlencode($dirname.$filename), ENT_QUOTES).'" title="Edit tags">edit tags</a>'; | |
- break; | |
- case 'ogg': | |
- if (isset($fileinfo['audio']['dataformat']) && ($fileinfo['audio']['dataformat'] == 'vorbis')) { | |
- echo '<a href="'.htmlentities($writescriptfilename.'?Filename='.urlencode($dirname.$filename), ENT_QUOTES).'" title="Edit tags">edit tags</a>'; | |
- } | |
- break; | |
- default: | |
- break; | |
- } | |
- echo '</td>'; | |
- echo '<td align="left"> <a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory).'&deletefile='.urlencode($dirname.$filename), ENT_QUOTES).'" onClick="return confirm(\'Are you sure you want to delete '.addslashes(htmlentities($dirname.$filename)).'? \n(this action cannot be un-done)\');" title="'.htmlentities('Permanently delete '."\n".$filename."\n".' from'."\n".' '.$dirname, ENT_QUOTES).'">delete</a></td>'; | |
- echo '</tr>'; | |
- } | |
- } | |
- | |
- if (isset($DirectoryContents[$dirname]['other']) && is_array($DirectoryContents[$dirname]['other'])) { | |
- uksort($DirectoryContents[$dirname]['other'], 'MoreNaturalSort'); | |
- foreach ($DirectoryContents[$dirname]['other'] as $filename => $fileinfo) { | |
- echo '<tr bgcolor="#'.(($rowcounter++ % 2) ? $getID3checkColor_UnknownDark : $getID3checkColor_UnknownLight).'">'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filename='.urlencode($dirname.$filename), ENT_QUOTES).'"><i>'.htmlentities($filename).'</i></a></td>'; | |
- echo '<td align="right"> '.(isset($fileinfo['filesize']) ? number_format($fileinfo['filesize']) : '-').'</td>'; | |
- echo '<td align="right"> '.NiceDisplayFiletypeFormat($fileinfo).'</td>'; | |
- echo '<td align="right"> '.(isset($fileinfo['playtime_string']) ? $fileinfo['playtime_string'] : '-').'</td>'; | |
- echo '<td align="right"> '.(isset($fileinfo['bitrate']) ? BitrateText($fileinfo['bitrate'] / 1000) : '-').'</td>'; | |
- echo '<td align="left"> </td>'; // Artist | |
- echo '<td align="left"> </td>'; // Title | |
- echo '<td align="left" colspan="3"> </td>'; // MD5_data | |
- echo '<td align="left"> </td>'; // Tags | |
- | |
- //echo '<td align="left"> </td>'; // Warning/Error | |
- echo '<td align="left"> '; | |
- if (!empty($fileinfo['warning'])) { | |
- $FilesWithWarnings++; | |
- echo '<a href="#" onClick="alert(\''.htmlentities(implode('\\n', $fileinfo['warning']), ENT_QUOTES).'\'); return false;" title="'.htmlentities(implode("\n", $fileinfo['warning']), ENT_QUOTES).'">warning</a><br>'; | |
- } | |
- if (!empty($fileinfo['error'])) { | |
- if ($fileinfo['error'][0] != 'unable to determine file format') { | |
- $FilesWithErrors++; | |
- echo '<a href="#" onClick="alert(\''.htmlentities(implode('\\n', $fileinfo['error']), ENT_QUOTES).'\'); return false;" title="'.htmlentities(implode("\n", $fileinfo['error']), ENT_QUOTES).'">error</a><br>'; | |
- } | |
- } | |
- echo '</td>'; | |
- | |
- echo '<td align="left"> </td>'; // Edit | |
- echo '<td align="left"> <a href="'.htmlentities($_SERVER['PHP_SELF'].'?listdirectory='.urlencode($listdirectory).'&deletefile='.urlencode($dirname.$filename), ENT_QUOTES).'" onClick="return confirm(\'Are you sure you want to delete '.addslashes($dirname.$filename).'? \n(this action cannot be un-done)\');" title="Permanently delete '.addslashes($dirname.$filename).'">delete</a></td>'; | |
- echo '</tr>'; | |
- } | |
- } | |
- | |
- echo '<tr bgcolor="#'.$getID3checkColor_Head.'">'; | |
- echo '<td><b>Average:</b></td>'; | |
- echo '<td align="right">'.number_format($TotalScannedFilesize / max($TotalScannedKnownFiles, 1)).'</td>'; | |
- echo '<td> </td>'; | |
- echo '<td align="right">'.getid3_lib::PlaytimeString($TotalScannedPlaytime / max($TotalScannedPlaytimeFiles, 1)).'</td>'; | |
- echo '<td align="right">'.BitrateText(round(($TotalScannedBitrate / 1000) / max($TotalScannedBitrateFiles, 1))).'</td>'; | |
- echo '<td rowspan="2" colspan="'.($columnsintable - 5).'"><table class="table" border="0" cellspacing="0" cellpadding="2"><tr><th align="right">Identified Files:</th><td align="right">'.number_format($TotalScannedKnownFiles).'</td><td> </td><th align="right">Errors:</th><td align="right">'.number_format($FilesWithErrors).'</td></tr><tr><th align="right">Unknown Files:</th><td align="right">'.number_format($TotalScannedUnknownFiles).'</td><td> </td><th align="right">Warnings:</th><td align="right">'.number_format($FilesWithWarnings).'</td></tr></table>'; | |
- echo '</tr>'; | |
- echo '<tr bgcolor="#'.$getID3checkColor_Head.'">'; | |
- echo '<td><b>Total:</b></td>'; | |
- echo '<td align="right">'.number_format($TotalScannedFilesize).'</td>'; | |
- echo '<td> </td>'; | |
- echo '<td align="right">'.getid3_lib::PlaytimeString($TotalScannedPlaytime).'</td>'; | |
- echo '<td> </td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- } else { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- echo '<b>ERROR: Could not open directory: <u>'.$currentfulldir.'</u></b><br>'; | |
- } | |
-} | |
-echo PoweredBygetID3().'<br clear="all">'; | |
-echo '</body></html>'; | |
- | |
- | |
-///////////////////////////////////////////////////////////////// | |
- | |
- | |
-function RemoveAccents($string) { | |
- // Revised version by markstewardרotmail*com | |
- // Again revised by James Heinrich (19-June-2006) | |
- return strtr( | |
- strtr( | |
- $string, | |
- "\x8A\x8E\x9A\x9E\x9F\xC0\xC1\xC2\xC3\xC4\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFF", | |
- 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy' | |
- ), | |
- array( | |
- "\xDE" => 'TH', | |
- "\xFE" => 'th', | |
- "\xD0" => 'DH', | |
- "\xF0" => 'dh', | |
- "\xDF" => 'ss', | |
- "\x8C" => 'OE', | |
- "\x9C" => 'oe', | |
- "\xC6" => 'AE', | |
- "\xE6" => 'ae', | |
- "\xB5" => 'u' | |
- ) | |
- ); | |
-} | |
- | |
- | |
-function BitrateColor($bitrate, $BitrateMaxScale=768) { | |
- // $BitrateMaxScale is bitrate of maximum-quality color (bright green) | |
- // below this is gradient, above is solid green | |
- | |
- $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256 | |
- $bitrate = round(min(max($bitrate, 1), 256)); | |
- $bitrate--; // scale from 1-256kbps to 0-255kbps | |
- | |
- $Rcomponent = max(255 - ($bitrate * 2), 0); | |
- $Gcomponent = max(($bitrate * 2) - 255, 0); | |
- if ($bitrate > 127) { | |
- $Bcomponent = max((255 - $bitrate) * 2, 0); | |
- } else { | |
- $Bcomponent = max($bitrate * 2, 0); | |
- } | |
- return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT); | |
-} | |
- | |
-function BitrateText($bitrate, $decimals=0, $vbr=false) { | |
- return '<span style="color: #'.BitrateColor($bitrate).($vbr ? '; font-weight: bold;' : '').'">'.number_format($bitrate, $decimals).' kbps</span>'; | |
-} | |
- | |
-function string_var_dump($variable) { | |
- if (version_compare(PHP_VERSION, '4.3.0', '>=')) { | |
- return print_r($variable, true); | |
- } | |
- ob_start(); | |
- var_dump($variable); | |
- $dumpedvariable = ob_get_contents(); | |
- ob_end_clean(); | |
- return $dumpedvariable; | |
-} | |
- | |
-function table_var_dump($variable, $wrap_in_td=false, $encoding='ISO-8859-1') { | |
- $returnstring = ''; | |
- switch (gettype($variable)) { | |
- case 'array': | |
- $returnstring .= ($wrap_in_td ? '<td>' : ''); | |
- $returnstring .= '<table class="dump" cellspacing="0" cellpadding="2">'; | |
- foreach ($variable as $key => $value) { | |
- $returnstring .= '<tr><td valign="top"><b>'.str_replace("\x00", ' ', $key).'</b></td>'."\n"; | |
- $returnstring .= '<td valign="top">'.gettype($value); | |
- if (is_array($value)) { | |
- $returnstring .= ' ('.count($value).')'; | |
- } elseif (is_string($value)) { | |
- $returnstring .= ' ('.strlen($value).')'; | |
- } | |
- //if (($key == 'data') && isset($variable['image_mime']) && isset($variable['dataoffset'])) { | |
- if (($key == 'data') && isset($variable['image_mime'])) { | |
- $imageinfo = array(); | |
- $imagechunkcheck = getid3_lib::GetDataImageSize($value, $imageinfo); | |
- $returnstring .= '</td>'."\n".'<td><img src="data:'.$variable['image_mime'].';base64,'.base64_encode($value).'" width="'.$imagechunkcheck[0].'" height="'.$imagechunkcheck[1].'"></td></tr>'."\n"; | |
- } else { | |
- $returnstring .= '</td>'."\n".table_var_dump($value, true, $encoding).'</tr>'."\n"; | |
- } | |
- } | |
- $returnstring .= '</table>'."\n"; | |
- $returnstring .= ($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- case 'boolean': | |
- $returnstring .= ($wrap_in_td ? '<td class="dump_boolean">' : '').($variable ? 'TRUE' : 'FALSE').($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- case 'integer': | |
- $returnstring .= ($wrap_in_td ? '<td class="dump_integer">' : '').$variable.($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- case 'double': | |
- case 'float': | |
- $returnstring .= ($wrap_in_td ? '<td class="dump_double">' : '').$variable.($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- case 'object': | |
- case 'null': | |
- $returnstring .= ($wrap_in_td ? '<td>' : '').string_var_dump($variable).($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- case 'string': | |
- //$variable = str_replace("\x00", ' ', $variable); | |
- //$varlen = strlen($variable); | |
- //for ($i = 0; $i < $varlen; $i++) { | |
- // $returnstring .= htmlentities($variable{$i}, ENT_QUOTES, $encoding); | |
- //} | |
- $returnstring = htmlentities($variable, ENT_QUOTES, $encoding); | |
- $returnstring = ($wrap_in_td ? '<td class="dump_string">' : '').nl2br($returnstring).($wrap_in_td ? '</td>'."\n" : ''); | |
- break; | |
- | |
- default: | |
- $imageinfo = array(); | |
- $imagechunkcheck = getid3_lib::GetDataImageSize($variable, $imageinfo); | |
- if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { | |
- $returnstring .= ($wrap_in_td ? '<td>' : ''); | |
- $returnstring .= '<table class="dump" cellspacing="0" cellpadding="2">'; | |
- $returnstring .= '<tr><td><b>type</b></td><td>'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]).'</td></tr>'."\n"; | |
- $returnstring .= '<tr><td><b>width</b></td><td>'.number_format($imagechunkcheck[0]).' px</td></tr>'."\n"; | |
- $returnstring .= '<tr><td><b>height</b></td><td>'.number_format($imagechunkcheck[1]).' px</td></tr>'."\n"; | |
- $returnstring .= '<tr><td><b>size</b></td><td>'.number_format(strlen($variable)).' bytes</td></tr></table>'."\n"; | |
- $returnstring .= ($wrap_in_td ? '</td>'."\n" : ''); | |
- } else { | |
- $returnstring .= ($wrap_in_td ? '<td>' : '').nl2br(htmlspecialchars(str_replace("\x00", ' ', $variable))).($wrap_in_td ? '</td>'."\n" : ''); | |
- } | |
- break; | |
- } | |
- return $returnstring; | |
-} | |
- | |
- | |
-function NiceDisplayFiletypeFormat(&$fileinfo) { | |
- | |
- if (empty($fileinfo['fileformat'])) { | |
- return '-'; | |
- } | |
- | |
- $output = $fileinfo['fileformat']; | |
- if (empty($fileinfo['video']['dataformat']) && empty($fileinfo['audio']['dataformat'])) { | |
- return $output; // 'gif' | |
- } | |
- if (empty($fileinfo['video']['dataformat']) && !empty($fileinfo['audio']['dataformat'])) { | |
- if ($fileinfo['fileformat'] == $fileinfo['audio']['dataformat']) { | |
- return $output; // 'mp3' | |
- } | |
- $output .= '.'.$fileinfo['audio']['dataformat']; // 'ogg.flac' | |
- return $output; | |
- } | |
- if (!empty($fileinfo['video']['dataformat']) && empty($fileinfo['audio']['dataformat'])) { | |
- if ($fileinfo['fileformat'] == $fileinfo['video']['dataformat']) { | |
- return $output; // 'mpeg' | |
- } | |
- $output .= '.'.$fileinfo['video']['dataformat']; // 'riff.avi' | |
- return $output; | |
- } | |
- if ($fileinfo['video']['dataformat'] == $fileinfo['audio']['dataformat']) { | |
- if ($fileinfo['fileformat'] == $fileinfo['video']['dataformat']) { | |
- return $output; // 'real' | |
- } | |
- $output .= '.'.$fileinfo['video']['dataformat']; // any examples? | |
- return $output; | |
- } | |
- $output .= '.'.$fileinfo['video']['dataformat']; | |
- $output .= '.'.$fileinfo['audio']['dataformat']; // asf.wmv.wma | |
- return $output; | |
- | |
-} | |
- | |
-function MoreNaturalSort($ar1, $ar2) { | |
- if ($ar1 === $ar2) { | |
- return 0; | |
- } | |
- $len1 = strlen($ar1); | |
- $len2 = strlen($ar2); | |
- $shortest = min($len1, $len2); | |
- if (substr($ar1, 0, $shortest) === substr($ar2, 0, $shortest)) { | |
- // the shorter argument is the beginning of the longer one, like "str" and "string" | |
- if ($len1 < $len2) { | |
- return -1; | |
- } elseif ($len1 > $len2) { | |
- return 1; | |
- } | |
- return 0; | |
- } | |
- $ar1 = RemoveAccents(strtolower(trim($ar1))); | |
- $ar2 = RemoveAccents(strtolower(trim($ar2))); | |
- $translatearray = array('\''=>'', '"'=>'', '_'=>' ', '('=>'', ')'=>'', '-'=>' ', ' '=>' ', '.'=>'', ','=>''); | |
- foreach ($translatearray as $key => $val) { | |
- $ar1 = str_replace($key, $val, $ar1); | |
- $ar2 = str_replace($key, $val, $ar2); | |
- } | |
- | |
- if ($ar1 < $ar2) { | |
- return -1; | |
- } elseif ($ar1 > $ar2) { | |
- return 1; | |
- } | |
- return 0; | |
-} | |
- | |
-function PoweredBygetID3($string='') { | |
- global $getID3; | |
- if (!$string) { | |
- $string = '<div style="border: 1px #CCCCCC solid; padding: 5px; margin: 5px 0px; float: left; background-color: #EEEEEE; font-size: 8pt; font-face: sans-serif;">Powered by <a href="http://getid3.sourceforge.net"><b>getID3() v<!--GETID3VER--></b><br>http://getid3.sourceforge.net</a><br>Running on PHP v'.phpversion().' ('.(ceil(log(PHP_INT_MAX, 2)) + 1).'-bit)</div>'; | |
- } | |
- return str_replace('<!--GETID3VER-->', $getID3->version(), $string); | |
-} | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.cache.dbm.php b/demos/demo.cache.dbm.php | |
deleted file mode 100644 | |
index bc4c8f8..0000000 | |
--- a/demos/demo.cache.dbm.php | |
+++ /dev/null | |
@@ -1,32 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
- | |
-require_once('../getid3/getid3.php'); | |
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'extension.cache.dbm.php', __FILE__, true); | |
- | |
-$getID3 = new getID3_cached_dbm('db3', '/zimweb/test/test.dbm', '/zimweb/test/test.lock'); | |
- | |
-$r = $getID3->analyze('/path/to/files/filename.mp3'); | |
- | |
-echo '<pre>'; | |
-var_dump($r); | |
-echo '</pre>'; | |
- | |
-// uncomment to clear cache | |
-// $getID3->clear_cache(); | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.cache.mysql.php b/demos/demo.cache.mysql.php | |
deleted file mode 100644 | |
index 500513a..0000000 | |
--- a/demos/demo.cache.mysql.php | |
+++ /dev/null | |
@@ -1,32 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
- | |
-require_once('../getid3/getid3.php'); | |
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'extension.cache.mysql.php', __FILE__, true); | |
- | |
-$getID3 = new getID3_cached_mysql('localhost', 'database', 'username', 'password'); | |
- | |
-$r = $getID3->analyze('/path/to/files/filename.mp3'); | |
- | |
-echo '<pre>'; | |
-var_dump($r); | |
-echo '</pre>'; | |
- | |
-// uncomment to clear cache | |
-//$getID3->clear_cache(); | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.joinmp3.php b/demos/demo.joinmp3.php | |
deleted file mode 100644 | |
index fc6a195..0000000 | |
--- a/demos/demo.joinmp3.php | |
+++ /dev/null | |
@@ -1,104 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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.'"<BR>'; | |
- return false; | |
- } | |
- } | |
- if (!is_writeable($FilenameOut)) { | |
- echo 'Cannot write "'.$FilenameOut.'"<BR>'; | |
- return false; | |
- } | |
- | |
- require_once('../getid3/getid3.php'); | |
- ob_start(); | |
- if ($fp_output = fopen($FilenameOut, 'wb')) { | |
- | |
- ob_end_clean(); | |
- // Initialize getID3 engine | |
- $getID3 = new getID3; | |
- foreach ($FilenamesIn as $nextinputfilename) { | |
- | |
- $CurrentFileInfo = $getID3->analyze($nextinputfilename); | |
- if ($CurrentFileInfo['fileformat'] == 'mp3') { | |
- | |
- ob_start(); | |
- if ($fp_source = fopen($nextinputfilename, 'rb')) { | |
- | |
- ob_end_clean(); | |
- $CurrentOutputPosition = ftell($fp_output); | |
- | |
- // copy audio data from first file | |
- fseek($fp_source, $CurrentFileInfo['avdataoffset'], SEEK_SET); | |
- while (!feof($fp_source) && (ftell($fp_source) < $CurrentFileInfo['avdataend'])) { | |
- fwrite($fp_output, fread($fp_source, 32768)); | |
- } | |
- fclose($fp_source); | |
- | |
- // trim post-audio data (if any) copied from first file that we don't need or want | |
- $EndOfFileOffset = $CurrentOutputPosition + ($CurrentFileInfo['avdataend'] - $CurrentFileInfo['avdataoffset']); | |
- fseek($fp_output, $EndOfFileOffset, SEEK_SET); | |
- ftruncate($fp_output, $EndOfFileOffset); | |
- | |
- } else { | |
- | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- echo 'failed to open '.$nextinputfilename.' for reading'; | |
- fclose($fp_output); | |
- return false; | |
- | |
- } | |
- | |
- } else { | |
- | |
- echo $nextinputfilename.' is not MP3 format'; | |
- fclose($fp_output); | |
- return false; | |
- | |
- } | |
- | |
- } | |
- | |
- } else { | |
- | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- echo 'failed to open '.$FilenameOut.' for writing'; | |
- return false; | |
- | |
- } | |
- | |
- fclose($fp_output); | |
- return true; | |
-} | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.mimeonly.php b/demos/demo.mimeonly.php | |
deleted file mode 100644 | |
index 5a656d5..0000000 | |
--- a/demos/demo.mimeonly.php | |
+++ /dev/null | |
@@ -1,75 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
- | |
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; | |
-echo '<html><head><title>getID3 demos - MIME type only</title><style type="text/css">BODY, TD, TH { font-family: sans-serif; font-size: 10pt; }</style></head><body>'; | |
- | |
-if (!empty($_REQUEST['filename'])) { | |
- | |
- echo 'The file "'.htmlentities($_REQUEST['filename']).'" has a MIME type of "'.htmlentities(GetMIMEtype($_REQUEST['filename'])).'"'; | |
- | |
-} else { | |
- | |
- echo 'Usage: <span style="font-family: monospace;">'.htmlentities($_SERVER['PHP_SELF']).'?filename=<i>filename.ext</i></span>'; | |
- | |
-} | |
- | |
- | |
-function GetMIMEtype($filename) { | |
- $filename = realpath($filename); | |
- if (!file_exists($filename)) { | |
- echo 'File does not exist: "'.htmlentities($filename).'"<br>'; | |
- return ''; | |
- } elseif (!is_readable($filename)) { | |
- echo 'File is not readable: "'.htmlentities($filename).'"<br>'; | |
- return ''; | |
- } | |
- | |
- // include getID3() library (can be in a different directory if full path is specified) | |
- require_once('../getid3/getid3.php'); | |
- // Initialize getID3 engine | |
- $getID3 = new getID3; | |
- | |
- $DeterminedMIMEtype = ''; | |
- if ($fp = fopen($filename, 'rb')) { | |
- $getID3->openfile($filename); | |
- if (empty($getID3->info['error'])) { | |
- | |
- // ID3v2 is the only tag format that might be prepended in front of files, and it's non-trivial to skip, easier just to parse it and know where to skip to | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); | |
- $getid3_id3v2 = new getid3_id3v2($getID3); | |
- $getid3_id3v2->Analyze(); | |
- | |
- fseek($fp, $getID3->info['avdataoffset'], SEEK_SET); | |
- $formattest = fread($fp, 16); // 16 bytes is sufficient for any format except ISO CD-image | |
- fclose($fp); | |
- | |
- $DeterminedFormatInfo = $getID3->GetFileFormat($formattest); | |
- $DeterminedMIMEtype = $DeterminedFormatInfo['mime_type']; | |
- | |
- } else { | |
- echo 'Failed to getID3->openfile "'.htmlentities($filename).'"<br>'; | |
- } | |
- } else { | |
- echo 'Failed to fopen "'.htmlentities($filename).'"<br>'; | |
- } | |
- return $DeterminedMIMEtype; | |
-} | |
- | |
-?> | |
-</body> | |
-</html> | |
\ No newline at end of file | |
diff --git a/demos/demo.mp3header.php b/demos/demo.mp3header.php | |
deleted file mode 100644 | |
index 293063e..0000000 | |
--- a/demos/demo.mp3header.php | |
+++ /dev/null | |
@@ -1,2890 +0,0 @@ | |
-<?php | |
- | |
-if (!function_exists('PrintHexBytes')) { | |
- function PrintHexBytes($string) { | |
- $returnstring = ''; | |
- for ($i = 0; $i < strlen($string); $i++) { | |
- $returnstring .= str_pad(dechex(ord(substr($string, $i, 1))), 2, '0', STR_PAD_LEFT).' '; | |
- } | |
- return $returnstring; | |
- } | |
-} | |
- | |
-if (!function_exists('PrintTextBytes')) { | |
- function PrintTextBytes($string) { | |
- $returnstring = ''; | |
- for ($i = 0; $i < strlen($string); $i++) { | |
- if (ord(substr($string, $i, 1)) <= 31) { | |
- $returnstring .= ' '; | |
- } else { | |
- $returnstring .= ' '.substr($string, $i, 1).' '; | |
- } | |
- } | |
- return $returnstring; | |
- } | |
-} | |
- | |
-if (!function_exists('table_var_dump')) { | |
- function table_var_dump($variable) { | |
- $returnstring = ''; | |
- switch (gettype($variable)) { | |
- case 'array': | |
- $returnstring .= '<TABLE BORDER="1" CELLSPACING="0" CELLPADDING="2">'; | |
- foreach ($variable as $key => $value) { | |
- $returnstring .= '<TR><TD VALIGN="TOP"><B>'.str_replace(chr(0), ' ', $key).'</B></TD>'; | |
- $returnstring .= '<TD VALIGN="TOP">'.gettype($value); | |
- if (is_array($value)) { | |
- $returnstring .= ' ('.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 .= '</TD><TD><IMG SRC="'.$DumpedImageSRC.'" WIDTH="'.$imagechunkcheck[0].'" HEIGHT="'.$imagechunkcheck[1].'"></TD></TR>'; | |
- } else { | |
- $returnstring .= '</TD><TD>'.table_var_dump($value).'</TD></TR>'; | |
- } | |
- } | |
- $returnstring .= '</TABLE>'; | |
- break; | |
- | |
- case 'boolean': | |
- $returnstring .= ($variable ? 'TRUE' : 'FALSE'); | |
- break; | |
- | |
- case 'integer': | |
- case 'double': | |
- case 'float': | |
- $returnstring .= $variable; | |
- break; | |
- | |
- case 'object': | |
- case 'null': | |
- $returnstring .= string_var_dump($variable); | |
- break; | |
- | |
- case 'string': | |
- $variable = str_replace(chr(0), ' ', $variable); | |
- $varlen = strlen($variable); | |
- for ($i = 0; $i < $varlen; $i++) { | |
- if (preg_match('#['.chr(0x0A).chr(0x0D).' -;0-9A-Za-z]#', $variable{$i})) { | |
- $returnstring .= $variable{$i}; | |
- } else { | |
- $returnstring .= '&#'.str_pad(ord($variable{$i}), 3, '0', STR_PAD_LEFT).';'; | |
- } | |
- } | |
- $returnstring = nl2br($returnstring); | |
- break; | |
- | |
- default: | |
- require_once(GETID3_INCLUDEPATH.'getid3.getimagesize.php'); | |
- $imageinfo = array(); | |
- $imagechunkcheck = GetDataImageSize(substr($variable, 0, 32768), $imageinfo); | |
- | |
- if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { | |
- $returnstring .= '<table border="1" cellspacing="0" cellpadding="2">'; | |
- $returnstring .= '<tr><td><b>type</b></td><td>'.ImageTypesLookup($imagechunkcheck[2]).'</td></tr>'; | |
- $returnstring .= '<tr><td><b>width</b></td><td>'.number_format($imagechunkcheck[0]).' px</td></tr>'; | |
- $returnstring .= '<tr><td><b>height</b></td><td>'.number_format($imagechunkcheck[1]).' px</td></tr>'; | |
- $returnstring .= '<tr><td><b>size</b></td><td>'.number_format(strlen($variable)).' bytes</td></tr></table>'; | |
- } else { | |
- $returnstring .= nl2br(htmlspecialchars(str_replace(chr(0), ' ', $variable))); | |
- } | |
- break; | |
- } | |
- return $returnstring; | |
- } | |
-} | |
- | |
-if (!function_exists('string_var_dump')) { | |
- function string_var_dump($variable) { | |
- if (version_compare(PHP_VERSION, '4.3.0', '>=')) { | |
- return print_r($variable, true); | |
- } | |
- ob_start(); | |
- var_dump($variable); | |
- $dumpedvariable = ob_get_contents(); | |
- ob_end_clean(); | |
- return $dumpedvariable; | |
- } | |
-} | |
- | |
-if (!function_exists('fileextension')) { | |
- function fileextension($filename, $numextensions=1) { | |
- if (strstr($filename, '.')) { | |
- $reversedfilename = strrev($filename); | |
- $offset = 0; | |
- for ($i = 0; $i < $numextensions; $i++) { | |
- $offset = strpos($reversedfilename, '.', $offset + 1); | |
- if ($offset === false) { | |
- return ''; | |
- } | |
- } | |
- return strrev(substr($reversedfilename, 0, $offset)); | |
- } | |
- return ''; | |
- } | |
-} | |
- | |
-if (!function_exists('RemoveAccents')) { | |
- function RemoveAccents($string) { | |
- // return strtr($string, 'äåéöúûü•µ¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷ÿŸ⁄€‹›fl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ¯˘˙˚¸˝ˇ', 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'); | |
- // Revised version by [email protected] | |
- return strtr(strtr($string, 'äéöûü¿¡¬√ƒ≈«»… ÀÃÕŒœ—“”‘’÷ÿŸ⁄€‹›‡·‚„‰ÂÁËÈÍÎÏÌÓÔÒÚÛÙıˆ¯˘˙˚¸˝ˇ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('fi' => 'TH', '˛' => 'th', '–' => 'DH', '' => 'dh', 'fl' => '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 [email protected] | |
- // 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 [email protected] | |
- // taken from http://www.php.net/manual/en/function.array-merge-recursive.php | |
- if (is_array($arr1) && is_array($arr2)) { | |
- // the same -> merge | |
- $new_array = array(); | |
- | |
- if (is_hash($arr1) && is_hash($arr2)) { | |
- // hashes -> merge based on keys | |
- $keys = array_merge(array_keys($arr1), array_keys($arr2)); | |
- foreach ($keys as $key) { | |
- $arr1[$key] = (isset($arr1[$key]) ? $arr1[$key] : ''); | |
- $arr2[$key] = (isset($arr2[$key]) ? $arr2[$key] : ''); | |
- $new_array[$key] = array_join_merge($arr1[$key], $arr2[$key]); | |
- } | |
- } else { | |
- // two real arrays -> merge | |
- $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1,$arr2)))); | |
- } | |
- return $new_array; | |
- } else { | |
- // not the same ... take new one if defined, else the old one stays | |
- return $arr2 ? $arr2 : $arr1; | |
- } | |
- } | |
-} | |
- | |
-if (!function_exists('array_merge_clobber')) { | |
- function array_merge_clobber($array1, $array2) { | |
- // written by [email protected] | |
- // taken from http://www.php.net/manual/en/function.array-merge-recursive.php | |
- if (!is_array($array1) || !is_array($array2)) { | |
- return false; | |
- } | |
- $newarray = $array1; | |
- foreach ($array2 as $key => $val) { | |
- if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { | |
- $newarray[$key] = array_merge_clobber($newarray[$key], $val); | |
- } else { | |
- $newarray[$key] = $val; | |
- } | |
- } | |
- return $newarray; | |
- } | |
-} | |
- | |
-if (!function_exists('array_merge_noclobber')) { | |
- function array_merge_noclobber($array1, $array2) { | |
- if (!is_array($array1) || !is_array($array2)) { | |
- return false; | |
- } | |
- $newarray = $array1; | |
- foreach ($array2 as $key => $val) { | |
- if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { | |
- $newarray[$key] = array_merge_noclobber($newarray[$key], $val); | |
- } elseif (!isset($newarray[$key])) { | |
- $newarray[$key] = $val; | |
- } | |
- } | |
- return $newarray; | |
- } | |
-} | |
- | |
-if (!function_exists('RoughTranslateUnicodeToASCII')) { | |
- function RoughTranslateUnicodeToASCII($rawdata, $frame_textencoding) { | |
- // rough translation of data for application that can't handle Unicode data | |
- | |
- $tempstring = ''; | |
- switch ($frame_textencoding) { | |
- case 0: // ISO-8859-1. Terminated with $00. | |
- $asciidata = $rawdata; | |
- break; | |
- | |
- case 1: // UTF-16 encoded Unicode with BOM. Terminated with $00 00. | |
- $asciidata = $rawdata; | |
- if (substr($asciidata, 0, 2) == chr(0xFF).chr(0xFE)) { | |
- // remove BOM, only if present (it should be, but...) | |
- $asciidata = substr($asciidata, 2); | |
- } | |
- if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) { | |
- $asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...) | |
- } | |
- for ($i = 0; $i < strlen($asciidata); $i += 2) { | |
- if ((ord($asciidata{$i}) <= 0x7F) || (ord($asciidata{$i}) >= 0xA0)) { | |
- $tempstring .= $asciidata{$i}; | |
- } else { | |
- $tempstring .= '?'; | |
- } | |
- } | |
- $asciidata = $tempstring; | |
- break; | |
- | |
- case 2: // UTF-16BE encoded Unicode without BOM. Terminated with $00 00. | |
- $asciidata = $rawdata; | |
- if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) { | |
- $asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...) | |
- } | |
- for ($i = 0; $i < strlen($asciidata); $i += 2) { | |
- if ((ord($asciidata{$i}) <= 0x7F) || (ord($asciidata{$i}) >= 0xA0)) { | |
- $tempstring .= $asciidata{$i}; | |
- } else { | |
- $tempstring .= '?'; | |
- } | |
- } | |
- $asciidata = $tempstring; | |
- break; | |
- | |
- case 3: // UTF-8 encoded Unicode. Terminated with $00. | |
- $asciidata = utf8_decode($rawdata); | |
- break; | |
- | |
- case 255: // Unicode, Big-Endian. Terminated with $00 00. | |
- $asciidata = $rawdata; | |
- if (substr($asciidata, strlen($asciidata) - 2, 2) == chr(0).chr(0)) { | |
- $asciidata = substr($asciidata, 0, strlen($asciidata) - 2); // remove terminator, only if present (it should be, but...) | |
- } | |
- for ($i = 0; ($i + 1) < strlen($asciidata); $i += 2) { | |
- if ((ord($asciidata{($i + 1)}) <= 0x7F) || (ord($asciidata{($i + 1)}) >= 0xA0)) { | |
- $tempstring .= $asciidata{($i + 1)}; | |
- } else { | |
- $tempstring .= '?'; | |
- } | |
- } | |
- $asciidata = $tempstring; | |
- break; | |
- | |
- | |
- default: | |
- // shouldn't happen, but in case $frame_textencoding is not 1 <= $frame_textencoding <= 4 | |
- // just pass the data through unchanged. | |
- $asciidata = $rawdata; | |
- break; | |
- } | |
- if (substr($asciidata, strlen($asciidata) - 1, 1) == chr(0)) { | |
- // remove null terminator, if present | |
- $asciidata = NoNullString($asciidata); | |
- } | |
- return $asciidata; | |
- // return str_replace(chr(0), '', $asciidata); // just in case any nulls slipped through | |
- } | |
-} | |
- | |
-if (!function_exists('PlaytimeString')) { | |
- function PlaytimeString($playtimeseconds) { | |
- $contentseconds = round((($playtimeseconds / 60) - floor($playtimeseconds / 60)) * 60); | |
- $contentminutes = floor($playtimeseconds / 60); | |
- if ($contentseconds >= 60) { | |
- $contentseconds -= 60; | |
- $contentminutes++; | |
- } | |
- return number_format($contentminutes).':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT); | |
- } | |
-} | |
- | |
-if (!function_exists('CloseMatch')) { | |
- function CloseMatch($value1, $value2, $tolerance) { | |
- return (abs($value1 - $value2) <= $tolerance); | |
- } | |
-} | |
- | |
-if (!function_exists('ID3v1matchesID3v2')) { | |
- function ID3v1matchesID3v2($id3v1, $id3v2) { | |
- | |
- $requiredindices = array('title', 'artist', 'album', 'year', 'genre', 'comment'); | |
- foreach ($requiredindices as $requiredindex) { | |
- if (!isset($id3v1["$requiredindex"])) { | |
- $id3v1["$requiredindex"] = ''; | |
- } | |
- if (!isset($id3v2["$requiredindex"])) { | |
- $id3v2["$requiredindex"] = ''; | |
- } | |
- } | |
- | |
- if (trim($id3v1['title']) != trim(substr($id3v2['title'], 0, 30))) { | |
- return false; | |
- } | |
- if (trim($id3v1['artist']) != trim(substr($id3v2['artist'], 0, 30))) { | |
- return false; | |
- } | |
- if (trim($id3v1['album']) != trim(substr($id3v2['album'], 0, 30))) { | |
- return false; | |
- } | |
- if (trim($id3v1['year']) != trim(substr($id3v2['year'], 0, 4))) { | |
- return false; | |
- } | |
- if (trim($id3v1['genre']) != trim($id3v2['genre'])) { | |
- return false; | |
- } | |
- if (isset($id3v1['track'])) { | |
- if (!isset($id3v1['track']) || (trim($id3v1['track']) != trim($id3v2['track']))) { | |
- return false; | |
- } | |
- if (trim($id3v1['comment']) != trim(substr($id3v2['comment'], 0, 28))) { | |
- return false; | |
- } | |
- } else { | |
- if (trim($id3v1['comment']) != trim(substr($id3v2['comment'], 0, 30))) { | |
- return false; | |
- } | |
- } | |
- return true; | |
- } | |
-} | |
- | |
-if (!function_exists('FILETIMEtoUNIXtime')) { | |
- function FILETIMEtoUNIXtime($FILETIME, $round=true) { | |
- // FILETIME is a 64-bit unsigned integer representing | |
- // the number of 100-nanosecond intervals since January 1, 1601 | |
- // UNIX timestamp is number of seconds since January 1, 1970 | |
- // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days | |
- if ($round) { | |
- return round(($FILETIME - 116444736000000000) / 10000000); | |
- } | |
- return ($FILETIME - 116444736000000000) / 10000000; | |
- } | |
-} | |
- | |
-if (!function_exists('GUIDtoBytestring')) { | |
- function GUIDtoBytestring($GUIDstring) { | |
- // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: | |
- // first 4 bytes are in little-endian order | |
- // next 2 bytes are appended in little-endian order | |
- // next 2 bytes are appended in little-endian order | |
- // next 2 bytes are appended in big-endian order | |
- // next 6 bytes are appended in big-endian order | |
- | |
- // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: | |
- // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp | |
- | |
- $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); | |
- | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); | |
- | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); | |
- | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); | |
- | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); | |
- $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); | |
- | |
- return $hexbytecharstring; | |
- } | |
-} | |
- | |
-if (!function_exists('BytestringToGUID')) { | |
- function BytestringToGUID($Bytestring) { | |
- $GUIDstring = str_pad(dechex(ord($Bytestring{3})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{2})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{1})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{0})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= '-'; | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{5})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{4})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= '-'; | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{7})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{6})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= '-'; | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{8})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{9})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= '-'; | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT); | |
- $GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT); | |
- | |
- return strtoupper($GUIDstring); | |
- } | |
-} | |
- | |
-if (!function_exists('BitrateColor')) { | |
- function BitrateColor($bitrate) { | |
- $bitrate /= 3; // scale from 1-768kbps to 1-256kbps | |
- $bitrate--; // scale from 1-256kbps to 0-255kbps | |
- $bitrate = max($bitrate, 0); | |
- $bitrate = min($bitrate, 255); | |
- //$bitrate = max($bitrate, 32); | |
- //$bitrate = min($bitrate, 143); | |
- //$bitrate = ($bitrate * 2) - 32; | |
- | |
- $Rcomponent = max(255 - ($bitrate * 2), 0); | |
- $Gcomponent = max(($bitrate * 2) - 255, 0); | |
- if ($bitrate > 127) { | |
- $Bcomponent = max((255 - $bitrate) * 2, 0); | |
- } else { | |
- $Bcomponent = max($bitrate * 2, 0); | |
- } | |
- return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT); | |
- } | |
-} | |
- | |
-if (!function_exists('BitrateText')) { | |
- function BitrateText($bitrate) { | |
- return '<SPAN STYLE="color: #'.BitrateColor($bitrate).'">'.round($bitrate).' kbps</SPAN>'; | |
- } | |
-} | |
- | |
-if (!function_exists('image_type_to_mime_type')) { | |
- function image_type_to_mime_type($imagetypeid) { | |
- // only available in PHP v4.3.0+ | |
- static $image_type_to_mime_type = array(); | |
- if (empty($image_type_to_mime_type)) { | |
- $image_type_to_mime_type[1] = 'image/gif'; // GIF | |
- $image_type_to_mime_type[2] = 'image/jpeg'; // JPEG | |
- $image_type_to_mime_type[3] = 'image/png'; // PNG | |
- $image_type_to_mime_type[4] = 'application/x-shockwave-flash'; // Flash | |
- $image_type_to_mime_type[5] = 'image/psd'; // PSD | |
- $image_type_to_mime_type[6] = 'image/bmp'; // BMP | |
- $image_type_to_mime_type[7] = 'image/tiff'; // TIFF: little-endian (Intel) | |
- $image_type_to_mime_type[8] = 'image/tiff'; // TIFF: big-endian (Motorola) | |
- //$image_type_to_mime_type[9] = 'image/jpc'; // JPC | |
- //$image_type_to_mime_type[10] = 'image/jp2'; // JPC | |
- //$image_type_to_mime_type[11] = 'image/jpx'; // JPC | |
- //$image_type_to_mime_type[12] = 'image/jb2'; // JPC | |
- $image_type_to_mime_type[13] = 'application/x-shockwave-flash'; // Shockwave | |
- $image_type_to_mime_type[14] = 'image/iff'; // IFF | |
- } | |
- return (isset($image_type_to_mime_type[$imagetypeid]) ? $image_type_to_mime_type[$imagetypeid] : 'application/octet-stream'); | |
- } | |
-} | |
- | |
-if (!function_exists('utf8_decode')) { | |
- // PHP has this function built-in if it's configured with the --with-xml option | |
- // This version of the function is only provided in case XML isn't installed | |
- function utf8_decode($utf8text) { | |
- // http://www.php.net/manual/en/function.utf8-encode.php | |
- // bytes bits representation | |
- // 1 7 0bbbbbbb | |
- // 2 11 110bbbbb 10bbbbbb | |
- // 3 16 1110bbbb 10bbbbbb 10bbbbbb | |
- // 4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb | |
- | |
- $utf8length = strlen($utf8text); | |
- $decodedtext = ''; | |
- for ($i = 0; $i < $utf8length; $i++) { | |
- if ((ord($utf8text{$i}) & 0x80) == 0) { | |
- $decodedtext .= $utf8text{$i}; | |
- } elseif ((ord($utf8text{$i}) & 0xF0) == 0xF0) { | |
- $decodedtext .= '?'; | |
- $i += 3; | |
- } elseif ((ord($utf8text{$i}) & 0xE0) == 0xE0) { | |
- $decodedtext .= '?'; | |
- $i += 2; | |
- } elseif ((ord($utf8text{$i}) & 0xC0) == 0xC0) { | |
- // 2 11 110bbbbb 10bbbbbb | |
- $decodedchar = Bin2Dec(substr(Dec2Bin(ord($utf8text{$i})), 3, 5).substr(Dec2Bin(ord($utf8text{($i + 1)})), 2, 6)); | |
- if ($decodedchar <= 255) { | |
- $decodedtext .= chr($decodedchar); | |
- } else { | |
- $decodedtext .= '?'; | |
- } | |
- $i += 1; | |
- } | |
- } | |
- return $decodedtext; | |
- } | |
-} | |
- | |
-if (!function_exists('DateMac2Unix')) { | |
- function DateMac2Unix($macdate) { | |
- // Macintosh timestamp: seconds since 00:00h January 1, 1904 | |
- // UNIX timestamp: seconds since 00:00h January 1, 1970 | |
- return CastAsInt($macdate - 2082844800); | |
- } | |
-} | |
- | |
- | |
-if (!function_exists('FixedPoint8_8')) { | |
- function FixedPoint8_8($rawdata) { | |
- return BigEndian2Int(substr($rawdata, 0, 1)) + (float) (BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8)); | |
- } | |
-} | |
- | |
- | |
-if (!function_exists('FixedPoint16_16')) { | |
- function FixedPoint16_16($rawdata) { | |
- return BigEndian2Int(substr($rawdata, 0, 2)) + (float) (BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16)); | |
- } | |
-} | |
- | |
- | |
-if (!function_exists('FixedPoint2_30')) { | |
- function FixedPoint2_30($rawdata) { | |
- $binarystring = BigEndian2Bin($rawdata); | |
- return Bin2Dec(substr($binarystring, 0, 2)) + (float) (Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30)); | |
- } | |
-} | |
- | |
- | |
-if (!function_exists('Pascal2String')) { | |
- function Pascal2String($pascalstring) { | |
- // Pascal strings have 1 byte at the beginning saying how many chars are in the string | |
- return substr($pascalstring, 1); | |
- } | |
-} | |
- | |
-if (!function_exists('NoNullString')) { | |
- function NoNullString($nullterminatedstring) { | |
- // remove the single null terminator on null terminated strings | |
- if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === chr(0)) { | |
- return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1); | |
- } | |
- return $nullterminatedstring; | |
- } | |
-} | |
- | |
-if (!function_exists('FileSizeNiceDisplay')) { | |
- function FileSizeNiceDisplay($filesize, $precision=2) { | |
- if ($filesize < 1000) { | |
- $sizeunit = 'bytes'; | |
- $precision = 0; | |
- } else { | |
- $filesize /= 1024; | |
- $sizeunit = 'kB'; | |
- } | |
- if ($filesize >= 1000) { | |
- $filesize /= 1024; | |
- $sizeunit = 'MB'; | |
- } | |
- if ($filesize >= 1000) { | |
- $filesize /= 1024; | |
- $sizeunit = 'GB'; | |
- } | |
- return number_format($filesize, $precision).' '.$sizeunit; | |
- } | |
-} | |
- | |
-if (!function_exists('DOStime2UNIXtime')) { | |
- function DOStime2UNIXtime($DOSdate, $DOStime) { | |
- // wFatDate | |
- // Specifies the MS-DOS date. The date is a packed 16-bit value with the following format: | |
- // Bits Contents | |
- // 0-4 Day of the month (1-31) | |
- // 5-8 Month (1 = January, 2 = February, and so on) | |
- // 9-15 Year offset from 1980 (add 1980 to get actual year) | |
- | |
- $UNIXday = ($DOSdate & 0x001F); | |
- $UNIXmonth = (($DOSdate & 0x01E0) >> 5); | |
- $UNIXyear = (($DOSdate & 0xFE00) >> 9) + 1980; | |
- | |
- // wFatTime | |
- // Specifies the MS-DOS time. The time is a packed 16-bit value with the following format: | |
- // Bits Contents | |
- // 0-4 Second divided by 2 | |
- // 5-10 Minute (0-59) | |
- // 11-15 Hour (0-23 on a 24-hour clock) | |
- | |
- $UNIXsecond = ($DOStime & 0x001F) * 2; | |
- $UNIXminute = (($DOStime & 0x07E0) >> 5); | |
- $UNIXhour = (($DOStime & 0xF800) >> 11); | |
- | |
- return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear); | |
- } | |
-} | |
- | |
-if (!function_exists('CreateDeepArray')) { | |
- function CreateDeepArray($ArrayPath, $Separator, $Value) { | |
- // assigns $Value to a nested array path: | |
- // $foo = CreateDeepArray('/path/to/my', '/', 'file.txt') | |
- // is the same as: | |
- // $foo = array('path'=>array('to'=>'array('my'=>array('file.txt')))); | |
- // or | |
- // $foo['path']['to']['my'] = 'file.txt'; | |
- while ($ArrayPath{0} == $Separator) { | |
- $ArrayPath = substr($ArrayPath, 1); | |
- } | |
- if (($pos = strpos($ArrayPath, $Separator)) !== false) { | |
- $ReturnedArray[substr($ArrayPath, 0, $pos)] = CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value); | |
- } else { | |
- $ReturnedArray["$ArrayPath"] = $Value; | |
- } | |
- return $ReturnedArray; | |
- } | |
-} | |
- | |
-if (!function_exists('md5_file')) { | |
- // Allan Hansen <[email protected]> | |
- // md5_file() exists in PHP 4.2.0. | |
- // The following works under UNIX only, but dies on windows | |
- function md5_file($file) { | |
- if (substr(php_uname(), 0, 7) == 'Windows') { | |
- die('PHP 4.2.0 or newer required for md5_file()'); | |
- } | |
- | |
- $file = str_replace('`', '\\`', $file); | |
- if (preg_match("#^([0-9a-f]{32})[ \t\n\r]#i", `md5sum "$file"`, $r)) { | |
- return $r[1]; | |
- } | |
- return false; | |
- } | |
-} | |
- | |
-if (!function_exists('md5_data')) { | |
- // Allan Hansen <[email protected]> | |
- // md5_data() - returns md5sum for a file from startuing position to absolute end position | |
- | |
- function md5_data($file, $offset, $end, $invertsign=false) { | |
- // first try and create a temporary file in the same directory as the file being scanned | |
- if (($dataMD5filename = tempnam(dirname($file), preg_replace('#[^[:alnum:]]#i', '', basename($file)))) === false) { | |
- // if that fails, create a temporary file in the system temp directory | |
- if (($dataMD5filename = tempnam('/tmp', 'getID3')) === false) { | |
- // if that fails, create a temporary file in the current directory | |
- if (($dataMD5filename = tempnam('.', preg_replace('#[^[:alnum:]]#i', '', basename($file)))) === false) { | |
- // can't find anywhere to create a temp file, just die | |
- return false; | |
- } | |
- } | |
- } | |
- $md5 = false; | |
- set_time_limit(max(filesize($file) / 1000000, 30)); | |
- | |
- // copy parts of file | |
- ob_start(); | |
- if ($fp = fopen($file, 'rb')) { | |
- ob_end_clean(); | |
- | |
- ob_start(); | |
- if ($MD5fp = fopen($dataMD5filename, 'wb')) { | |
- | |
- ob_end_clean(); | |
- if ($invertsign) { | |
- // Load conversion lookup strings for 8-bit unsigned->signed conversion below | |
- $from = ''; | |
- $to = ''; | |
- for ($i = 0; $i < 128; $i++) { | |
- $from .= chr($i); | |
- $to .= chr($i + 128); | |
- } | |
- for ($i = 128; $i < 256; $i++) { | |
- $from .= chr($i); | |
- $to .= chr($i - 128); | |
- } | |
- } | |
- | |
- fseek($fp, $offset, SEEK_SET); | |
- $byteslefttowrite = $end - $offset; | |
- while (($byteslefttowrite > 0) && ($buffer = fread($fp, 32768))) { | |
- if ($invertsign) { | |
- // Possibly FLAC-specific (?) | |
- // FLAC calculates the MD5sum of the source data of 8-bit files | |
- // not on the actual byte values in the source file, but of those | |
- // values converted from unsigned to signed, or more specifcally, | |
- // with the MSB inverted. ex: 01 -> 81; F5 -> 75; etc | |
- | |
- // Therefore, 8-bit WAV data has to be converted before getting the | |
- // md5_data value so as to match the FLAC value | |
- | |
- // Flip the MSB for each byte in the buffer before copying | |
- $buffer = strtr($buffer, $from, $to); | |
- } | |
- $byteswritten = fwrite($MD5fp, $buffer, $byteslefttowrite); | |
- $byteslefttowrite -= $byteswritten; | |
- } | |
- fclose($MD5fp); | |
- $md5 = md5_file($dataMD5filename); | |
- | |
- } else { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- } | |
- fclose($fp); | |
- | |
- } else { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- } | |
- unlink($dataMD5filename); | |
- return $md5; | |
- } | |
-} | |
- | |
-if (!function_exists('TwosCompliment2Decimal')) { | |
- function TwosCompliment2Decimal($BinaryValue) { | |
- // http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html | |
- // First check if the number is negative or positive by looking at the sign bit. | |
- // If it is positive, simply convert it to decimal. | |
- // If it is negative, make it positive by inverting the bits and adding one. | |
- // Then, convert the result to decimal. | |
- // The negative of this number is the value of the original binary. | |
- | |
- if ($BinaryValue & 0x80) { | |
- | |
- // negative number | |
- return (0 - ((~$BinaryValue & 0xFF) + 1)); | |
- | |
- } else { | |
- | |
- // positive number | |
- return $BinaryValue; | |
- | |
- } | |
- | |
- } | |
-} | |
- | |
-if (!function_exists('LastArrayElement')) { | |
- function LastArrayElement($MyArray) { | |
- if (!is_array($MyArray)) { | |
- return false; | |
- } | |
- if (empty($MyArray)) { | |
- return null; | |
- } | |
- foreach ($MyArray as $key => $value) { | |
- } | |
- return $value; | |
- } | |
-} | |
- | |
-if (!function_exists('safe_inc')) { | |
- function safe_inc(&$variable, $increment=1) { | |
- if (isset($variable)) { | |
- $variable += $increment; | |
- } else { | |
- $variable = $increment; | |
- } | |
- return true; | |
- } | |
-} | |
- | |
-if (!function_exists('CalculateCompressionRatioVideo')) { | |
- function CalculateCompressionRatioVideo(&$ThisFileInfo) { | |
- if (empty($ThisFileInfo['video'])) { | |
- return false; | |
- } | |
- if (empty($ThisFileInfo['video']['resolution_x']) || empty($ThisFileInfo['video']['resolution_y'])) { | |
- return false; | |
- } | |
- if (empty($ThisFileInfo['video']['bits_per_sample'])) { | |
- return false; | |
- } | |
- | |
- switch ($ThisFileInfo['video']['dataformat']) { | |
- case 'bmp': | |
- case 'gif': | |
- case 'jpeg': | |
- case 'jpg': | |
- case 'png': | |
- case 'tiff': | |
- $FrameRate = 1; | |
- $PlaytimeSeconds = 1; | |
- $BitrateCompressed = $ThisFileInfo['filesize'] * 8; | |
- break; | |
- | |
- default: | |
- if (!empty($ThisFileInfo['video']['frame_rate'])) { | |
- $FrameRate = $ThisFileInfo['video']['frame_rate']; | |
- } else { | |
- return false; | |
- } | |
- if (!empty($ThisFileInfo['playtime_seconds'])) { | |
- $PlaytimeSeconds = $ThisFileInfo['playtime_seconds']; | |
- } else { | |
- return false; | |
- } | |
- if (!empty($ThisFileInfo['video']['bitrate'])) { | |
- $BitrateCompressed = $ThisFileInfo['video']['bitrate']; | |
- } else { | |
- return false; | |
- } | |
- break; | |
- } | |
- $BitrateUncompressed = $ThisFileInfo['video']['resolution_x'] * $ThisFileInfo['video']['resolution_y'] * $ThisFileInfo['video']['bits_per_sample'] * $FrameRate; | |
- | |
- $ThisFileInfo['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed; | |
- return true; | |
- } | |
-} | |
- | |
-if (!function_exists('CalculateCompressionRatioAudio')) { | |
- function CalculateCompressionRatioAudio(&$ThisFileInfo) { | |
- if (empty($ThisFileInfo['audio']['bitrate']) || empty($ThisFileInfo['audio']['channels']) || empty($ThisFileInfo['audio']['sample_rate']) || empty($ThisFileInfo['audio']['bits_per_sample'])) { | |
- return false; | |
- } | |
- $ThisFileInfo['audio']['compression_ratio'] = $ThisFileInfo['audio']['bitrate'] / ($ThisFileInfo['audio']['channels'] * $ThisFileInfo['audio']['sample_rate'] * $ThisFileInfo['audio']['bits_per_sample']); | |
- return true; | |
- } | |
-} | |
- | |
-if (!function_exists('IsValidMIMEstring')) { | |
- function IsValidMIMEstring($mimestring) { | |
- if ((strlen($mimestring) >= 3) && (strpos($mimestring, '/') > 0) && (strpos($mimestring, '/') < (strlen($mimestring) - 1))) { | |
- return true; | |
- } | |
- return false; | |
- } | |
-} | |
- | |
-if (!function_exists('IsWithinBitRange')) { | |
- function IsWithinBitRange($number, $maxbits, $signed=false) { | |
- if ($signed) { | |
- if (($number > (0 - pow(2, $maxbits - 1))) && ($number <= pow(2, $maxbits - 1))) { | |
- return true; | |
- } | |
- } else { | |
- if (($number >= 0) && ($number <= pow(2, $maxbits))) { | |
- return true; | |
- } | |
- } | |
- return false; | |
- } | |
-} | |
- | |
-if (!function_exists('safe_parse_url')) { | |
- function safe_parse_url($url) { | |
- ob_start(); | |
- $parts = parse_url($url); | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- $parts['scheme'] = (isset($parts['scheme']) ? $parts['scheme'] : ''); | |
- $parts['host'] = (isset($parts['host']) ? $parts['host'] : ''); | |
- $parts['user'] = (isset($parts['user']) ? $parts['user'] : ''); | |
- $parts['pass'] = (isset($parts['pass']) ? $parts['pass'] : ''); | |
- $parts['path'] = (isset($parts['path']) ? $parts['path'] : ''); | |
- $parts['query'] = (isset($parts['query']) ? $parts['query'] : ''); | |
- return $parts; | |
- } | |
-} | |
- | |
-if (!function_exists('IsValidURL')) { | |
- function IsValidURL($url, $allowUserPass=false) { | |
- if ($url == '') { | |
- return false; | |
- } | |
- if ($allowUserPass !== true) { | |
- if (strstr($url, '@')) { | |
- // in the format http://user:[email protected] or http://[email protected] | |
- // but could easily be somebody incorrectly entering an email address in place of a URL | |
- return false; | |
- } | |
- } | |
- if ($parts = safe_parse_url($url)) { | |
- if (($parts['scheme'] != 'http') && ($parts['scheme'] != 'https') && ($parts['scheme'] != 'ftp') && ($parts['scheme'] != 'gopher')) { | |
- return false; | |
- } elseif (!preg_match("#^[[:alnum:]]([-.]?[0-9a-z])*\.[a-z]{2,3}#i$", $parts['host'], $regs) && !preg_match('#^[0-9]{1,3}(\.[0-9]{1,3}){3}$#', $parts['host'])) { | |
- return false; | |
- } elseif (!preg_match("#^([[:alnum:]-]|[\_])*$#i", $parts['user'], $regs)) { | |
- return false; | |
- } elseif (!preg_match("#^([[:alnum:]-]|[\_])*$#i", $parts['pass'], $regs)) { | |
- return false; | |
- } elseif (!preg_match("#^[[:alnum:]/_\.@~-]*$#i", $parts['path'], $regs)) { | |
- return false; | |
- } elseif (!preg_match("#^[[:alnum:]?&=+:;_()%#/,\.-]*$#i", $parts['query'], $regs)) { | |
- return false; | |
- } else { | |
- return true; | |
- } | |
- } | |
- return false; | |
- } | |
-} | |
- | |
-echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">'; | |
-echo 'Enter 4 hex bytes of MPEG-audio header (ie <I>FF FA 92 44</I>)<BR>'; | |
-echo '<input type="text" name="HeaderHexBytes" value="'.htmlentities(isset($_POST['HeaderHexBytes']) ? strtoupper($_POST['HeaderHexBytes']) : '', ENT_QUOTES).'" size="11" maxlength="11">'; | |
-echo '<input type="submit" name="Analyze" value="Analyze"></form>'; | |
-echo '<hr>'; | |
- | |
-echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" METHOD="get">'; | |
-echo 'Generate a MPEG-audio 4-byte header from these values:<BR>'; | |
-echo '<table border="0">'; | |
- | |
-$MPEGgenerateValues = array( | |
- 'version'=>array('1', '2', '2.5'), | |
- 'layer'=>array('I', 'II', 'III'), | |
- 'protection'=>array('Y', 'N'), | |
- 'bitrate'=>array('free', '8', '16', '24', '32', '40', '48', '56', '64', '80', '96', '112', '128', '144', '160', '176', '192', '224', '256', '288', '320', '352', '384', '416', '448'), | |
- 'frequency'=>array('8000', '11025', '12000', '16000', '22050', '24000', '32000', '44100', '48000'), | |
- 'padding'=>array('Y', 'N'), | |
- 'private'=>array('Y', 'N'), | |
- 'channelmode'=>array('stereo', 'joint stereo', 'dual channel', 'mono'), | |
- 'modeextension'=>array('none', 'IS', 'MS', 'IS+MS', '4-31', '8-31', '12-31', '16-31'), | |
- 'copyright'=>array('Y', 'N'), | |
- 'original'=>array('Y', 'N'), | |
- 'emphasis'=>array('none', '50/15ms', 'CCIT J.17') | |
- ); | |
- | |
-foreach ($MPEGgenerateValues as $name => $dataarray) { | |
- echo '<tr><th>'.$name.':</th><td><select name="'.$name.'">'; | |
- foreach ($dataarray as $key => $value) { | |
- echo '<option'.((isset($_POST["$name"]) && ($_POST["$name"] == $value)) ? ' SELECTED' : '').'>'.$value.'</option>'; | |
- } | |
- echo '</select></td></tr>'; | |
-} | |
- | |
-if (isset($_POST['bitrate'])) { | |
- echo '<tr><th>Frame Length:</th><td>'.(int) MPEGaudioFrameLength($_POST['bitrate'], $_POST['version'], $_POST['layer'], (($_POST['padding'] == 'Y') ? '1' : '0'), $_POST['frequency']).'</td></tr>'; | |
-} | |
-echo '</table>'; | |
-echo '<input type="submit" name="Generate" value="Generate"></form>'; | |
-echo '<hr>'; | |
- | |
- | |
-if (isset($_POST['Analyze']) && $_POST['HeaderHexBytes']) { | |
- | |
- $headerbytearray = explode(' ', $_POST['HeaderHexBytes']); | |
- if (count($headerbytearray) != 4) { | |
- die('Invalid byte pattern'); | |
- } | |
- $headerstring = ''; | |
- foreach ($headerbytearray as $textbyte) { | |
- $headerstring .= chr(hexdec($textbyte)); | |
- } | |
- | |
- $MP3fileInfo['error'] = ''; | |
- | |
- $MPEGheaderRawArray = MPEGaudioHeaderDecode(substr($headerstring, 0, 4)); | |
- | |
- if (MPEGaudioHeaderValid($MPEGheaderRawArray, true)) { | |
- | |
- $MP3fileInfo['raw'] = $MPEGheaderRawArray; | |
- | |
- $MP3fileInfo['version'] = MPEGaudioVersionLookup($MP3fileInfo['raw']['version']); | |
- $MP3fileInfo['layer'] = MPEGaudioLayerLookup($MP3fileInfo['raw']['layer']); | |
- $MP3fileInfo['protection'] = MPEGaudioCRCLookup($MP3fileInfo['raw']['protection']); | |
- $MP3fileInfo['bitrate'] = MPEGaudioBitrateLookup($MP3fileInfo['version'], $MP3fileInfo['layer'], $MP3fileInfo['raw']['bitrate']); | |
- $MP3fileInfo['frequency'] = MPEGaudioFrequencyLookup($MP3fileInfo['version'], $MP3fileInfo['raw']['sample_rate']); | |
- $MP3fileInfo['padding'] = (bool) $MP3fileInfo['raw']['padding']; | |
- $MP3fileInfo['private'] = (bool) $MP3fileInfo['raw']['private']; | |
- $MP3fileInfo['channelmode'] = MPEGaudioChannelModeLookup($MP3fileInfo['raw']['channelmode']); | |
- $MP3fileInfo['channels'] = (($MP3fileInfo['channelmode'] == 'mono') ? 1 : 2); | |
- $MP3fileInfo['modeextension'] = MPEGaudioModeExtensionLookup($MP3fileInfo['layer'], $MP3fileInfo['raw']['modeextension']); | |
- $MP3fileInfo['copyright'] = (bool) $MP3fileInfo['raw']['copyright']; | |
- $MP3fileInfo['original'] = (bool) $MP3fileInfo['raw']['original']; | |
- $MP3fileInfo['emphasis'] = MPEGaudioEmphasisLookup($MP3fileInfo['raw']['emphasis']); | |
- | |
- if ($MP3fileInfo['protection']) { | |
- $MP3fileInfo['crc'] = BigEndian2Int(substr($headerstring, 4, 2)); | |
- } | |
- | |
- if ($MP3fileInfo['frequency'] > 0) { | |
- $MP3fileInfo['framelength'] = MPEGaudioFrameLength($MP3fileInfo['bitrate'], $MP3fileInfo['version'], $MP3fileInfo['layer'], (int) $MP3fileInfo['padding'], $MP3fileInfo['frequency']); | |
- } | |
- if ($MP3fileInfo['bitrate'] != 'free') { | |
- $MP3fileInfo['bitrate'] *= 1000; | |
- } | |
- | |
- } else { | |
- | |
- $MP3fileInfo['error'] .= "\n".'Invalid MPEG audio header'; | |
- | |
- } | |
- | |
- if (!$MP3fileInfo['error']) { | |
- unset($MP3fileInfo['error']); | |
- } | |
- | |
- echo table_var_dump($MP3fileInfo); | |
- | |
-} elseif (isset($_POST['Generate'])) { | |
- | |
- // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM | |
- | |
- $headerbitstream = '11111111111'; // A - Frame sync (all bits set) | |
- | |
- $MPEGversionLookup = array('2.5'=>'00', '2'=>'10', '1'=>'11'); | |
- $headerbitstream .= $MPEGversionLookup[$_POST['version']]; // B - MPEG Audio version ID | |
- | |
- $MPEGlayerLookup = array('III'=>'01', 'II'=>'10', 'I'=>'11'); | |
- $headerbitstream .= $MPEGlayerLookup[$_POST['layer']]; // C - Layer description | |
- | |
- $headerbitstream .= (($_POST['protection'] == 'Y') ? '0' : '1'); // D - Protection bit | |
- | |
- $MPEGaudioBitrateLookup['1']['I'] = array('free'=>'0000', '32'=>'0001', '64'=>'0010', '96'=>'0011', '128'=>'0100', '160'=>'0101', '192'=>'0110', '224'=>'0111', '256'=>'1000', '288'=>'1001', '320'=>'1010', '352'=>'1011', '384'=>'1100', '416'=>'1101', '448'=>'1110'); | |
- $MPEGaudioBitrateLookup['1']['II'] = array('free'=>'0000', '32'=>'0001', '48'=>'0010', '56'=>'0011', '64'=>'0100', '80'=>'0101', '96'=>'0110', '112'=>'0111', '128'=>'1000', '160'=>'1001', '192'=>'1010', '224'=>'1011', '256'=>'1100', '320'=>'1101', '384'=>'1110'); | |
- $MPEGaudioBitrateLookup['1']['III'] = array('free'=>'0000', '32'=>'0001', '40'=>'0010', '48'=>'0011', '56'=>'0100', '64'=>'0101', '80'=>'0110', '96'=>'0111', '112'=>'1000', '128'=>'1001', '160'=>'1010', '192'=>'1011', '224'=>'1100', '256'=>'1101', '320'=>'1110'); | |
- $MPEGaudioBitrateLookup['2']['I'] = array('free'=>'0000', '32'=>'0001', '48'=>'0010', '56'=>'0011', '64'=>'0100', '80'=>'0101', '96'=>'0110', '112'=>'0111', '128'=>'1000', '144'=>'1001', '160'=>'1010', '176'=>'1011', '192'=>'1100', '224'=>'1101', '256'=>'1110'); | |
- $MPEGaudioBitrateLookup['2']['II'] = array('free'=>'0000', '8'=>'0001', '16'=>'0010', '24'=>'0011', '32'=>'0100', '40'=>'0101', '48'=>'0110', '56'=>'0111', '64'=>'1000', '80'=>'1001', '96'=>'1010', '112'=>'1011', '128'=>'1100', '144'=>'1101', '160'=>'1110'); | |
- $MPEGaudioBitrateLookup['2']['III'] = $MPEGaudioBitrateLookup['2']['II']; | |
- $MPEGaudioBitrateLookup['2.5']['I'] = $MPEGaudioBitrateLookup['2']['I']; | |
- $MPEGaudioBitrateLookup['2.5']['II'] = $MPEGaudioBitrateLookup['2']['II']; | |
- $MPEGaudioBitrateLookup['2.5']['III'] = $MPEGaudioBitrateLookup['2']['II']; | |
- if (isset($MPEGaudioBitrateLookup[$_POST['version']][$_POST['layer']][$_POST['bitrate']])) { | |
- $headerbitstream .= $MPEGaudioBitrateLookup[$_POST['version']][$_POST['layer']][$_POST['bitrate']]; // E - Bitrate index | |
- } else { | |
- die('Invalid <B>Bitrate</B>'); | |
- } | |
- | |
- $MPEGaudioFrequencyLookup['1'] = array('44100'=>'00', '48000'=>'01', '32000'=>'10'); | |
- $MPEGaudioFrequencyLookup['2'] = array('22050'=>'00', '24000'=>'01', '16000'=>'10'); | |
- $MPEGaudioFrequencyLookup['2.5'] = array('11025'=>'00', '12000'=>'01', '8000'=>'10'); | |
- if (isset($MPEGaudioFrequencyLookup[$_POST['version']][$_POST['frequency']])) { | |
- $headerbitstream .= $MPEGaudioFrequencyLookup[$_POST['version']][$_POST['frequency']]; // F - Sampling rate frequency index | |
- } else { | |
- die('Invalid <B>Frequency</B>'); | |
- } | |
- | |
- $headerbitstream .= (($_POST['padding'] == 'Y') ? '1' : '0'); // G - Padding bit | |
- | |
- $headerbitstream .= (($_POST['private'] == 'Y') ? '1' : '0'); // H - Private bit | |
- | |
- $MPEGaudioChannelModeLookup = array('stereo'=>'00', 'joint stereo'=>'01', 'dual channel'=>'10', 'mono'=>'11'); | |
- $headerbitstream .= $MPEGaudioChannelModeLookup[$_POST['channelmode']]; // I - Channel Mode | |
- | |
- $MPEGaudioModeExtensionLookup['I'] = array('4-31'=>'00', '8-31'=>'01', '12-31'=>'10', '16-31'=>'11'); | |
- $MPEGaudioModeExtensionLookup['II'] = $MPEGaudioModeExtensionLookup['I']; | |
- $MPEGaudioModeExtensionLookup['III'] = array('none'=>'00', 'IS'=>'01', 'MS'=>'10', 'IS+MS'=>'11'); | |
- if ($_POST['channelmode'] != 'joint stereo') { | |
- $headerbitstream .= '00'; | |
- } elseif (isset($MPEGaudioModeExtensionLookup[$_POST['layer']][$_POST['modeextension']])) { | |
- $headerbitstream .= $MPEGaudioModeExtensionLookup[$_POST['layer']][$_POST['modeextension']]; // J - Mode extension (Only if Joint stereo) | |
- } else { | |
- die('Invalid <B>Mode Extension</B>'); | |
- } | |
- | |
- $headerbitstream .= (($_POST['copyright'] == 'Y') ? '1' : '0'); // K - Copyright | |
- | |
- $headerbitstream .= (($_POST['original'] == 'Y') ? '1' : '0'); // L - Original | |
- | |
- $MPEGaudioEmphasisLookup = array('none'=>'00', '50/15ms'=>'01', 'CCIT J.17'=>'11'); | |
- if (isset($MPEGaudioEmphasisLookup[$_POST['emphasis']])) { | |
- $headerbitstream .= $MPEGaudioEmphasisLookup[$_POST['emphasis']]; // M - Emphasis | |
- } else { | |
- die('Invalid <B>Emphasis</B>'); | |
- } | |
- | |
- echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 0, 8))), 2, '0', STR_PAD_LEFT)).' '; | |
- echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 8, 8))), 2, '0', STR_PAD_LEFT)).' '; | |
- echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 16, 8))), 2, '0', STR_PAD_LEFT)).' '; | |
- echo strtoupper(str_pad(dechex(bindec(substr($headerbitstream, 24, 8))), 2, '0', STR_PAD_LEFT)).'<BR>'; | |
- | |
-} | |
- | |
-function MPEGaudioVersionLookup($rawversion) { | |
- $MPEGaudioVersionLookup = array('2.5', FALSE, '2', '1'); | |
- return (isset($MPEGaudioVersionLookup["$rawversion"]) ? $MPEGaudioVersionLookup["$rawversion"] : FALSE); | |
-} | |
- | |
-function MPEGaudioLayerLookup($rawlayer) { | |
- $MPEGaudioLayerLookup = array(FALSE, 'III', 'II', 'I'); | |
- return (isset($MPEGaudioLayerLookup["$rawlayer"]) ? $MPEGaudioLayerLookup["$rawlayer"] : FALSE); | |
-} | |
- | |
-function MPEGaudioBitrateLookup($version, $layer, $rawbitrate) { | |
- static $MPEGaudioBitrateLookup; | |
- if (empty($MPEGaudioBitrateLookup)) { | |
- $MPEGaudioBitrateLookup = MPEGaudioBitrateArray(); | |
- } | |
- return (isset($MPEGaudioBitrateLookup["$version"]["$layer"]["$rawbitrate"]) ? $MPEGaudioBitrateLookup["$version"]["$layer"]["$rawbitrate"] : FALSE); | |
-} | |
- | |
-function MPEGaudioFrequencyLookup($version, $rawfrequency) { | |
- static $MPEGaudioFrequencyLookup; | |
- if (empty($MPEGaudioFrequencyLookup)) { | |
- $MPEGaudioFrequencyLookup = MPEGaudioFrequencyArray(); | |
- } | |
- return (isset($MPEGaudioFrequencyLookup["$version"]["$rawfrequency"]) ? $MPEGaudioFrequencyLookup["$version"]["$rawfrequency"] : FALSE); | |
-} | |
- | |
-function MPEGaudioChannelModeLookup($rawchannelmode) { | |
- $MPEGaudioChannelModeLookup = array('stereo', 'joint stereo', 'dual channel', 'mono'); | |
- return (isset($MPEGaudioChannelModeLookup["$rawchannelmode"]) ? $MPEGaudioChannelModeLookup["$rawchannelmode"] : FALSE); | |
-} | |
- | |
-function MPEGaudioModeExtensionLookup($layer, $rawmodeextension) { | |
- $MPEGaudioModeExtensionLookup['I'] = array('4-31', '8-31', '12-31', '16-31'); | |
- $MPEGaudioModeExtensionLookup['II'] = array('4-31', '8-31', '12-31', '16-31'); | |
- $MPEGaudioModeExtensionLookup['III'] = array('', 'IS', 'MS', 'IS+MS'); | |
- return (isset($MPEGaudioModeExtensionLookup["$layer"]["$rawmodeextension"]) ? $MPEGaudioModeExtensionLookup["$layer"]["$rawmodeextension"] : FALSE); | |
-} | |
- | |
-function MPEGaudioEmphasisLookup($rawemphasis) { | |
- $MPEGaudioEmphasisLookup = array('none', '50/15ms', FALSE, 'CCIT J.17'); | |
- return (isset($MPEGaudioEmphasisLookup["$rawemphasis"]) ? $MPEGaudioEmphasisLookup["$rawemphasis"] : FALSE); | |
-} | |
- | |
-function MPEGaudioCRCLookup($CRCbit) { | |
- // inverse boolean cast :) | |
- if ($CRCbit == '0') { | |
- return TRUE; | |
- } else { | |
- return FALSE; | |
- } | |
-} | |
- | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// available at http://getid3.sourceforge.net /// | |
-// or http://www.getid3.org /// | |
-///////////////////////////////////////////////////////////////// | |
-// // | |
-// getid3.mp3.php - part of getID3() // | |
-// See getid3.readme.txt for more details // | |
-// // | |
-///////////////////////////////////////////////////////////////// | |
- | |
-// number of frames to scan to determine if MPEG-audio sequence is valid | |
-// Lower this number to 5-20 for faster scanning | |
-// Increase this number to 50+ for most accurate detection of valid VBR/CBR | |
-// mpeg-audio streams | |
-define('MPEG_VALID_CHECK_FRAMES', 35); | |
- | |
-function getMP3headerFilepointer(&$fd, &$ThisFileInfo) { | |
- | |
- getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $ThisFileInfo['avdataoffset']); | |
- | |
- if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode'])) { | |
- $ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']); | |
- } | |
- | |
- if (((isset($ThisFileInfo['id3v2']) && ($ThisFileInfo['avdataoffset'] > $ThisFileInfo['id3v2']['headerlength'])) || (!isset($ThisFileInfo['id3v2']) && ($ThisFileInfo['avdataoffset'] > 0)))) { | |
- | |
- $ThisFileInfo['warning'] .= "\n".'Unknown data before synch '; | |
- if (isset($ThisFileInfo['id3v2']['headerlength'])) { | |
- $ThisFileInfo['warning'] .= '(ID3v2 header ends at '.$ThisFileInfo['id3v2']['headerlength'].', then '.($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']).' bytes garbage, '; | |
- } else { | |
- $ThisFileInfo['warning'] .= '(should be at beginning of file, '; | |
- } | |
- $ThisFileInfo['warning'] .= 'synch detected at '.$ThisFileInfo['avdataoffset'].')'; | |
- if ($ThisFileInfo['audio']['bitrate_mode'] == 'cbr') { | |
- if (!empty($ThisFileInfo['id3v2']['headerlength']) && (($ThisFileInfo['avdataoffset'] - $ThisFileInfo['id3v2']['headerlength']) == $ThisFileInfo['mpeg']['audio']['framelength'])) { | |
- $ThisFileInfo['warning'] .= '. This is a known problem with some versions of LAME (3.91, 3.92) DLL in CBR mode.'; | |
- $ThisFileInfo['audio']['codec'] = 'LAME'; | |
- } elseif (empty($ThisFileInfo['id3v2']['headerlength']) && ($ThisFileInfo['avdataoffset'] == $ThisFileInfo['mpeg']['audio']['framelength'])) { | |
- $ThisFileInfo['warning'] .= '. This is a known problem with some versions of LAME (3.91, 3.92) DLL in CBR mode.'; | |
- $ThisFileInfo['audio']['codec'] = 'LAME'; | |
- } | |
- } | |
- | |
- } | |
- | |
- if (isset($ThisFileInfo['mpeg']['audio']['layer']) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'II')) { | |
- $ThisFileInfo['audio']['dataformat'] = 'mp2'; | |
- } elseif (isset($ThisFileInfo['mpeg']['audio']['layer']) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'I')) { | |
- $ThisFileInfo['audio']['dataformat'] = 'mp1'; | |
- } | |
- if ($ThisFileInfo['fileformat'] == 'mp3') { | |
- switch ($ThisFileInfo['audio']['dataformat']) { | |
- case 'mp1': | |
- case 'mp2': | |
- case 'mp3': | |
- $ThisFileInfo['fileformat'] = $ThisFileInfo['audio']['dataformat']; | |
- break; | |
- | |
- default: | |
- $ThisFileInfo['warning'] .= "\n".'Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$ThisFileInfo['audio']['dataformat'].'"'; | |
- break; | |
- } | |
- } | |
- | |
- if (empty($ThisFileInfo['fileformat'])) { | |
- $ThisFileInfo['error'] .= "\n".'Synch not found'; | |
- unset($ThisFileInfo['fileformat']); | |
- unset($ThisFileInfo['audio']['bitrate_mode']); | |
- unset($ThisFileInfo['avdataoffset']); | |
- unset($ThisFileInfo['avdataend']); | |
- return false; | |
- } | |
- | |
- $ThisFileInfo['mime_type'] = 'audio/mpeg'; | |
- $ThisFileInfo['audio']['lossless'] = false; | |
- | |
- // Calculate playtime | |
- if (!isset($ThisFileInfo['playtime_seconds']) && isset($ThisFileInfo['audio']['bitrate']) && ($ThisFileInfo['audio']['bitrate'] > 0)) { | |
- $ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8 / $ThisFileInfo['audio']['bitrate']; | |
- } | |
- | |
- if (isset($ThisFileInfo['mpeg']['audio']['LAME'])) { | |
- $ThisFileInfo['audio']['codec'] = 'LAME'; | |
- if (!empty($ThisFileInfo['mpeg']['audio']['LAME']['long_version'])) { | |
- $ThisFileInfo['audio']['encoder'] = trim($ThisFileInfo['mpeg']['audio']['LAME']['long_version']); | |
- } | |
- } | |
- | |
- return true; | |
-} | |
- | |
- | |
-function decodeMPEGaudioHeader($fd, $offset, &$ThisFileInfo, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { | |
- | |
- static $MPEGaudioVersionLookup; | |
- static $MPEGaudioLayerLookup; | |
- static $MPEGaudioBitrateLookup; | |
- static $MPEGaudioFrequencyLookup; | |
- static $MPEGaudioChannelModeLookup; | |
- static $MPEGaudioModeExtensionLookup; | |
- static $MPEGaudioEmphasisLookup; | |
- if (empty($MPEGaudioVersionLookup)) { | |
- $MPEGaudioVersionLookup = MPEGaudioVersionArray(); | |
- $MPEGaudioLayerLookup = MPEGaudioLayerArray(); | |
- $MPEGaudioBitrateLookup = MPEGaudioBitrateArray(); | |
- $MPEGaudioFrequencyLookup = MPEGaudioFrequencyArray(); | |
- $MPEGaudioChannelModeLookup = MPEGaudioChannelModeArray(); | |
- $MPEGaudioModeExtensionLookup = MPEGaudioModeExtensionArray(); | |
- $MPEGaudioEmphasisLookup = MPEGaudioEmphasisArray(); | |
- } | |
- | |
- if ($offset >= $ThisFileInfo['avdataend']) { | |
- $ThisFileInfo['error'] .= "\n".'end of file encounter looking for MPEG synch'; | |
- return false; | |
- } | |
- fseek($fd, $offset, SEEK_SET); | |
- $headerstring = fread($fd, 1441); // worse-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame | |
- | |
- // MP3 audio frame structure: | |
- // $aa $aa $aa $aa [$bb $bb] $cc... | |
- // where $aa..$aa is the four-byte mpeg-audio header (below) | |
- // $bb $bb is the optional 2-byte CRC | |
- // and $cc... is the audio data | |
- | |
- $head4 = substr($headerstring, 0, 4); | |
- | |
- static $MPEGaudioHeaderDecodeCache = array(); | |
- if (isset($MPEGaudioHeaderDecodeCache[$head4])) { | |
- $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4]; | |
- } else { | |
- $MPEGheaderRawArray = MPEGaudioHeaderDecode($head4); | |
- $MPEGaudioHeaderDecodeCache[$head4] = $MPEGheaderRawArray; | |
- } | |
- | |
- static $MPEGaudioHeaderValidCache = array(); | |
- | |
- // Not in cache | |
- if (!isset($MPEGaudioHeaderValidCache[$head4])) { | |
- $MPEGaudioHeaderValidCache[$head4] = MPEGaudioHeaderValid($MPEGheaderRawArray); | |
- } | |
- | |
- if ($MPEGaudioHeaderValidCache[$head4]) { | |
- $ThisFileInfo['mpeg']['audio']['raw'] = $MPEGheaderRawArray; | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".'Invalid MPEG audio header at offset '.$offset; | |
- return false; | |
- } | |
- | |
- if (!$FastMPEGheaderScan) { | |
- | |
- $ThisFileInfo['mpeg']['audio']['version'] = $MPEGaudioVersionLookup[$ThisFileInfo['mpeg']['audio']['raw']['version']]; | |
- $ThisFileInfo['mpeg']['audio']['layer'] = $MPEGaudioLayerLookup[$ThisFileInfo['mpeg']['audio']['raw']['layer']]; | |
- | |
- $ThisFileInfo['mpeg']['audio']['channelmode'] = $MPEGaudioChannelModeLookup[$ThisFileInfo['mpeg']['audio']['raw']['channelmode']]; | |
- $ThisFileInfo['mpeg']['audio']['channels'] = (($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') ? 1 : 2); | |
- $ThisFileInfo['mpeg']['audio']['sample_rate'] = $MPEGaudioFrequencyLookup[$ThisFileInfo['mpeg']['audio']['version']][$ThisFileInfo['mpeg']['audio']['raw']['sample_rate']]; | |
- $ThisFileInfo['mpeg']['audio']['protection'] = !$ThisFileInfo['mpeg']['audio']['raw']['protection']; | |
- $ThisFileInfo['mpeg']['audio']['private'] = (bool) $ThisFileInfo['mpeg']['audio']['raw']['private']; | |
- $ThisFileInfo['mpeg']['audio']['modeextension'] = $MPEGaudioModeExtensionLookup[$ThisFileInfo['mpeg']['audio']['layer']][$ThisFileInfo['mpeg']['audio']['raw']['modeextension']]; | |
- $ThisFileInfo['mpeg']['audio']['copyright'] = (bool) $ThisFileInfo['mpeg']['audio']['raw']['copyright']; | |
- $ThisFileInfo['mpeg']['audio']['original'] = (bool) $ThisFileInfo['mpeg']['audio']['raw']['original']; | |
- $ThisFileInfo['mpeg']['audio']['emphasis'] = $MPEGaudioEmphasisLookup[$ThisFileInfo['mpeg']['audio']['raw']['emphasis']]; | |
- | |
- $ThisFileInfo['audio']['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; | |
- $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['protection']) { | |
- $ThisFileInfo['mpeg']['audio']['crc'] = BigEndian2Int(substr($headerstring, 4, 2)); | |
- } | |
- | |
- } | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['raw']['bitrate'] == 15) { | |
- // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 | |
- $ThisFileInfo['warning'] .= "\n".'Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'; | |
- $ThisFileInfo['mpeg']['audio']['raw']['bitrate'] = 0; | |
- } | |
- $ThisFileInfo['mpeg']['audio']['padding'] = (bool) $ThisFileInfo['mpeg']['audio']['raw']['padding']; | |
- $ThisFileInfo['mpeg']['audio']['bitrate'] = $MPEGaudioBitrateLookup[$ThisFileInfo['mpeg']['audio']['version']][$ThisFileInfo['mpeg']['audio']['layer']][$ThisFileInfo['mpeg']['audio']['raw']['bitrate']]; | |
- | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && ($offset == $ThisFileInfo['avdataoffset'])) { | |
- // only skip multiple frame check if free-format bitstream found at beginning of file | |
- // otherwise is quite possibly simply corrupted data | |
- $recursivesearch = false; | |
- } | |
- | |
- // For Layer II there are some combinations of bitrate and mode which are not allowed. | |
- if (!$FastMPEGheaderScan && ($ThisFileInfo['mpeg']['audio']['layer'] == 'II')) { | |
- | |
- $ThisFileInfo['audio']['dataformat'] = 'mp2'; | |
- switch ($ThisFileInfo['mpeg']['audio']['channelmode']) { | |
- | |
- case 'mono': | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') || ($ThisFileInfo['mpeg']['audio']['bitrate'] <= 192)) { | |
- // these are ok | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".$ThisFileInfo['mpeg']['audio']['bitrate'].'kbps not allowed in Layer II, '.$ThisFileInfo['mpeg']['audio']['channelmode'].'.'; | |
- return false; | |
- } | |
- break; | |
- | |
- case 'stereo': | |
- case 'joint stereo': | |
- case 'dual channel': | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') || ($ThisFileInfo['mpeg']['audio']['bitrate'] == 64) || ($ThisFileInfo['mpeg']['audio']['bitrate'] >= 96)) { | |
- // these are ok | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".$ThisFileInfo['mpeg']['audio']['bitrate'].'kbps not allowed in Layer II, '.$ThisFileInfo['mpeg']['audio']['channelmode'].'.'; | |
- return false; | |
- } | |
- break; | |
- | |
- } | |
- | |
- } | |
- | |
- | |
- if ($ThisFileInfo['audio']['sample_rate'] > 0) { | |
- $ThisFileInfo['mpeg']['audio']['framelength'] = MPEGaudioFrameLength($ThisFileInfo['mpeg']['audio']['bitrate'], $ThisFileInfo['mpeg']['audio']['version'], $ThisFileInfo['mpeg']['audio']['layer'], (int) $ThisFileInfo['mpeg']['audio']['padding'], $ThisFileInfo['audio']['sample_rate']); | |
- } | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['bitrate'] != 'free') { | |
- | |
- $ThisFileInfo['audio']['bitrate'] = 1000 * $ThisFileInfo['mpeg']['audio']['bitrate']; | |
- | |
- if (isset($ThisFileInfo['mpeg']['audio']['framelength'])) { | |
- $nextframetestoffset = $offset + $ThisFileInfo['mpeg']['audio']['framelength']; | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".'Frame at offset('.$offset.') is has an invalid frame length.'; | |
- return false; | |
- } | |
- | |
- } | |
- | |
- $ExpectedNumberOfAudioBytes = 0; | |
- | |
- //////////////////////////////////////////////////////////////////////////////////// | |
- // Variable-bitrate headers | |
- | |
- if (substr($headerstring, 4 + 32, 4) == 'VBRI') { | |
- // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) | |
- // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html | |
- | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr'; | |
- $ThisFileInfo['mpeg']['audio']['VBR_method'] = 'Fraunhofer'; | |
- $ThisFileInfo['audio']['codec'] = 'Fraunhofer'; | |
- | |
- $SideInfoData = substr($headerstring, 4 + 2, 32); | |
- | |
- $FraunhoferVBROffset = 36; | |
- | |
- $ThisFileInfo['mpeg']['audio']['VBR_encoder_version'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); | |
- $ThisFileInfo['mpeg']['audio']['VBR_encoder_delay'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); | |
- $ThisFileInfo['mpeg']['audio']['VBR_quality'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); | |
- $ThisFileInfo['mpeg']['audio']['VBR_bytes'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); | |
- $ThisFileInfo['mpeg']['audio']['VBR_frames'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); | |
- $ThisFileInfo['mpeg']['audio']['VBR_seek_offsets'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); | |
- //$ThisFileInfo['mpeg']['audio']['reserved'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 4)); // hardcoded $00 $01 $00 $02 - purpose unknown | |
- $ThisFileInfo['mpeg']['audio']['VBR_seek_offsets_stride'] = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); | |
- | |
- $ExpectedNumberOfAudioBytes = $ThisFileInfo['mpeg']['audio']['VBR_bytes']; | |
- | |
- $previousbyteoffset = $offset; | |
- for ($i = 0; $i < $ThisFileInfo['mpeg']['audio']['VBR_seek_offsets']; $i++) { | |
- $Fraunhofer_OffsetN = BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, 2)); | |
- $FraunhoferVBROffset += 2; | |
- $ThisFileInfo['mpeg']['audio']['VBR_offsets_relative'][$i] = $Fraunhofer_OffsetN; | |
- $ThisFileInfo['mpeg']['audio']['VBR_offsets_absolute'][$i] = $Fraunhofer_OffsetN + $previousbyteoffset; | |
- $previousbyteoffset += $Fraunhofer_OffsetN; | |
- } | |
- | |
- | |
- } else { | |
- | |
- // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) | |
- // depending on MPEG layer and number of channels | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') { | |
- // MPEG-1 (mono) | |
- $VBRidOffset = 4 + 17; // 0x15 | |
- $SideInfoData = substr($headerstring, 4 + 2, 17); | |
- } else { | |
- // MPEG-1 (stereo, joint-stereo, dual-channel) | |
- $VBRidOffset = 4 + 32; // 0x24 | |
- $SideInfoData = substr($headerstring, 4 + 2, 32); | |
- } | |
- } else { // 2 or 2.5 | |
- if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') { | |
- // MPEG-2, MPEG-2.5 (mono) | |
- $VBRidOffset = 4 + 9; // 0x0D | |
- $SideInfoData = substr($headerstring, 4 + 2, 9); | |
- } else { | |
- // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) | |
- $VBRidOffset = 4 + 17; // 0x15 | |
- $SideInfoData = substr($headerstring, 4 + 2, 17); | |
- } | |
- } | |
- | |
- if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { | |
- // 'Xing' is traditional Xing VBR frame | |
- // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) | |
- | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr'; | |
- $ThisFileInfo['mpeg']['audio']['VBR_method'] = 'Xing'; | |
- | |
- $ThisFileInfo['mpeg']['audio']['xing_flags_raw'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); | |
- | |
- $ThisFileInfo['mpeg']['audio']['xing_flags']['frames'] = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000001); | |
- $ThisFileInfo['mpeg']['audio']['xing_flags']['bytes'] = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000002); | |
- $ThisFileInfo['mpeg']['audio']['xing_flags']['toc'] = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000004); | |
- $ThisFileInfo['mpeg']['audio']['xing_flags']['vbr_scale'] = (bool) ($ThisFileInfo['mpeg']['audio']['xing_flags_raw'] & 0x00000008); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['xing_flags']['frames']) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_frames'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); | |
- } | |
- if ($ThisFileInfo['mpeg']['audio']['xing_flags']['bytes']) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_bytes'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); | |
- } | |
- | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && !empty($ThisFileInfo['mpeg']['audio']['VBR_frames']) && !empty($ThisFileInfo['mpeg']['audio']['VBR_bytes'])) { | |
- $framelengthfloat = $ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']; | |
- if ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') { | |
- // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 | |
- $ThisFileInfo['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 12; | |
- } else { | |
- // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 | |
- $ThisFileInfo['audio']['bitrate'] = (($framelengthfloat - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 144; | |
- } | |
- $ThisFileInfo['mpeg']['audio']['framelength'] = floor($framelengthfloat); | |
- } | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['xing_flags']['toc']) { | |
- $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); | |
- for ($i = 0; $i < 100; $i++) { | |
- $ThisFileInfo['mpeg']['audio']['toc'][$i] = ord($LAMEtocData{$i}); | |
- } | |
- } | |
- if ($ThisFileInfo['mpeg']['audio']['xing_flags']['vbr_scale']) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_scale'] = BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); | |
- } | |
- | |
- // http://gabriel.mp3-tech.org/mp3infotag.html | |
- if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { | |
- $ThisFileInfo['mpeg']['audio']['LAME']['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['short_version'] = substr($ThisFileInfo['mpeg']['audio']['LAME']['long_version'], 0, 9); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['long_version'] = rtrim($ThisFileInfo['mpeg']['audio']['LAME']['long_version'], "\x55\xAA"); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['short_version'] >= 'LAME3.90.') { | |
- | |
- // It the LAME tag was only introduced in LAME v3.90 | |
- // http://www.hydrogenaudio.org/?act=ST&f=15&t=9933 | |
- | |
- // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html | |
- // are assuming a 'Xing' identifier offset of 0x24, which is the case for | |
- // MPEG-1 non-mono, but not for other combinations | |
- $LAMEtagOffsetContant = $VBRidOffset - 0x24; | |
- | |
- // byte $9B VBR Quality | |
- // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. | |
- // Actually overwrites original Xing bytes | |
- unset($ThisFileInfo['mpeg']['audio']['VBR_scale']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['vbr_quality'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); | |
- | |
- // bytes $9C-$A4 Encoder short VersionString | |
- $ThisFileInfo['mpeg']['audio']['LAME']['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['long_version'] = $ThisFileInfo['mpeg']['audio']['LAME']['short_version']; | |
- | |
- // byte $A5 Info Tag revision + VBR method | |
- $LAMEtagRevisionVBRmethod = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); | |
- | |
- $ThisFileInfo['mpeg']['audio']['LAME']['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['vbr_method'] = LAMEvbrMethodLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method']); | |
- | |
- // byte $A6 Lowpass filter value | |
- $ThisFileInfo['mpeg']['audio']['LAME']['lowpass_frequency'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; | |
- | |
- // bytes $A7-$AE Replay Gain | |
- // http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html | |
- // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] = BigEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] == 0) { | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] = false; | |
- } | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] != 0) { | |
- require_once(GETID3_INCLUDEPATH.'getid3.rgad.php'); | |
- | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['name'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0xE000) >> 13; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['originator'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x1C00) >> 10; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['sign_bit'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x0200) >> 9; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['gain_adjust'] = $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_radio'] & 0x01FF; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['name'] = RGADnameLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['name']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['originator'] = RGADoriginatorLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['originator']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['gain_db'] = RGADadjustmentLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['gain_adjust'], $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['raw']['sign_bit']); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] !== false) { | |
- $ThisFileInfo['replay_gain']['radio']['peak'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude']; | |
- } | |
- $ThisFileInfo['replay_gain']['radio']['originator'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['originator']; | |
- $ThisFileInfo['replay_gain']['radio']['adjustment'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['radio']['gain_db']; | |
- } | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] != 0) { | |
- require_once(GETID3_INCLUDEPATH.'getid3.rgad.php'); | |
- | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['name'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0xE000) >> 13; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['originator'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x1C00) >> 10; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['sign_bit'] = ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x0200) >> 9; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['gain_adjust'] = $ThisFileInfo['mpeg']['audio']['LAME']['raw']['RGAD_audiophile'] & 0x01FF; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['name'] = RGADnameLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['name']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['originator'] = RGADoriginatorLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['originator']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['gain_db'] = RGADadjustmentLookup($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['gain_adjust'], $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['raw']['sign_bit']); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude'] !== false) { | |
- $ThisFileInfo['replay_gain']['audiophile']['peak'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['peak_amplitude']; | |
- } | |
- $ThisFileInfo['replay_gain']['audiophile']['originator'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['originator']; | |
- $ThisFileInfo['replay_gain']['audiophile']['adjustment'] = $ThisFileInfo['mpeg']['audio']['LAME']['RGAD']['audiophile']['gain_db']; | |
- } | |
- | |
- | |
- // byte $AF Encoding flags + ATH Type | |
- $EncodingFlagsATHtype = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['ath_type'] = $EncodingFlagsATHtype & 0x0F; | |
- | |
- // byte $B0 if ABR {specified bitrate} else {minimal bitrate} | |
- $ABRbitrateMinBitrate = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] == 2) { // Average BitRate (ABR) | |
- $ThisFileInfo['mpeg']['audio']['LAME']['bitrate_abr'] = $ABRbitrateMinBitrate; | |
- } elseif ($ABRbitrateMinBitrate > 0) { // Variable BitRate (VBR) - minimum bitrate | |
- $ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min'] = $ABRbitrateMinBitrate; | |
- } | |
- | |
- // bytes $B1-$B3 Encoder delays | |
- $EncoderDelays = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['end_padding'] = $EncoderDelays & 0x000FFF; | |
- | |
- // byte $B4 Misc | |
- $MiscByte = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['noise_shaping'] = ($MiscByte & 0x03); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['stereo_mode'] = ($MiscByte & 0x1C) >> 2; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['noise_shaping'] = $ThisFileInfo['mpeg']['audio']['LAME']['raw']['noise_shaping']; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['stereo_mode'] = LAMEmiscStereoModeLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['stereo_mode']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['not_optimal_quality'] = (bool) $ThisFileInfo['mpeg']['audio']['LAME']['raw']['not_optimal_quality']; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['source_sample_freq'] = LAMEmiscSourceSampleFrequencyLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['source_sample_freq']); | |
- | |
- // byte $B5 MP3 Gain | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['mp3_gain'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_db'] = 1.5 * $ThisFileInfo['mpeg']['audio']['LAME']['raw']['mp3_gain']; | |
- $ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_factor'] = pow(2, ($ThisFileInfo['mpeg']['audio']['LAME']['mp3_gain_db'] / 6)); | |
- | |
- // bytes $B6-$B7 Preset and surround info | |
- $PresetSurroundBytes = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); | |
- // Reserved = ($PresetSurroundBytes & 0xC000); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['raw']['surround_info'] = ($PresetSurroundBytes & 0x3800); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['surround_info'] = LAMEsurroundInfoLookup($ThisFileInfo['mpeg']['audio']['LAME']['raw']['surround_info']); | |
- $ThisFileInfo['mpeg']['audio']['LAME']['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); | |
- | |
- // bytes $B8-$BB MusicLength | |
- $ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); | |
- $ExpectedNumberOfAudioBytes = (($ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] > 0) ? $ThisFileInfo['mpeg']['audio']['LAME']['audio_bytes'] : $ThisFileInfo['mpeg']['audio']['VBR_bytes']); | |
- | |
- // bytes $BC-$BD MusicCRC | |
- $ThisFileInfo['mpeg']['audio']['LAME']['music_crc'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); | |
- | |
- // bytes $BE-$BF CRC-16 of Info Tag | |
- $ThisFileInfo['mpeg']['audio']['LAME']['lame_tag_crc'] = BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); | |
- | |
- | |
- // LAME CBR | |
- if ($ThisFileInfo['mpeg']['audio']['LAME']['raw']['vbr_method'] == 1) { | |
- | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr'; | |
- if (empty($ThisFileInfo['mpeg']['audio']['bitrate']) || ($ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min'] != 255)) { | |
- $ThisFileInfo['mpeg']['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['LAME']['bitrate_min']; | |
- } | |
- | |
- } | |
- | |
- } | |
- } | |
- | |
- } else { | |
- | |
- // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr'; | |
- if ($recursivesearch) { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr'; | |
- if (RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, true)) { | |
- $recursivesearch = false; | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr'; | |
- } | |
- if ($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') { | |
- $ThisFileInfo['warning'] .= "\n".'VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'; | |
- } | |
- } | |
- | |
- } | |
- | |
- } | |
- | |
- if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']))) { | |
- if (($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) == 1) { | |
- $ThisFileInfo['warning'] .= "\n".'Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'; | |
- } elseif ($ExpectedNumberOfAudioBytes > ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])) { | |
- $ThisFileInfo['warning'] .= "\n".'Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'])).' bytes)'; | |
- } else { | |
- $ThisFileInfo['warning'] .= "\n".'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']).' ('.(($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'; | |
- } | |
- } | |
- | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate'] == 'free') && empty($ThisFileInfo['audio']['bitrate'])) { | |
- if (($offset == $ThisFileInfo['avdataoffset']) && empty($ThisFileInfo['mpeg']['audio']['VBR_frames'])) { | |
- $framebytelength = FreeFormatFrameLength($fd, $offset, $ThisFileInfo, true); | |
- if ($framebytelength > 0) { | |
- $ThisFileInfo['mpeg']['audio']['framelength'] = $framebytelength; | |
- if ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') { | |
- // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 | |
- $ThisFileInfo['audio']['bitrate'] = ((($framebytelength / 4) - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 12; | |
- } else { | |
- // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 | |
- $ThisFileInfo['audio']['bitrate'] = (($framebytelength - intval($ThisFileInfo['mpeg']['audio']['padding'])) * $ThisFileInfo['mpeg']['audio']['sample_rate']) / 144; | |
- } | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".'Error calculating frame length of free-format MP3 without Xing/LAME header'; | |
- } | |
- } | |
- } | |
- | |
- if (($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') && isset($ThisFileInfo['mpeg']['audio']['VBR_frames']) && ($ThisFileInfo['mpeg']['audio']['VBR_frames'] > 1)) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_frames']--; // don't count the Xing / VBRI frame | |
- if (($ThisFileInfo['mpeg']['audio']['version'] == '1') && ($ThisFileInfo['mpeg']['audio']['layer'] == 'I')) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 384)) / 1000; | |
- } elseif ((($ThisFileInfo['mpeg']['audio']['version'] == '2') || ($ThisFileInfo['mpeg']['audio']['version'] == '2.5')) && ($ThisFileInfo['mpeg']['audio']['layer'] == 'III')) { | |
- $ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 576)) / 1000; | |
- } else { | |
- $ThisFileInfo['mpeg']['audio']['VBR_bitrate'] = ((($ThisFileInfo['mpeg']['audio']['VBR_bytes'] / $ThisFileInfo['mpeg']['audio']['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 1152)) / 1000; | |
- } | |
- if ($ThisFileInfo['mpeg']['audio']['VBR_bitrate'] > 0) { | |
- $ThisFileInfo['audio']['bitrate'] = 1000 * $ThisFileInfo['mpeg']['audio']['VBR_bitrate']; | |
- $ThisFileInfo['mpeg']['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['VBR_bitrate']; // to avoid confusion | |
- } | |
- } | |
- | |
- // End variable-bitrate headers | |
- //////////////////////////////////////////////////////////////////////////////////// | |
- | |
- if ($recursivesearch) { | |
- | |
- if (!RecursiveFrameScanning($fd, $ThisFileInfo, $offset, $nextframetestoffset, $ScanAsCBR)) { | |
- return false; | |
- } | |
- | |
- } | |
- | |
- | |
- //if (false) { | |
- // // experimental side info parsing section - not returning anything useful yet | |
- // | |
- // $SideInfoBitstream = BigEndian2Bin($SideInfoData); | |
- // $SideInfoOffset = 0; | |
- // | |
- // if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- // if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') { | |
- // // MPEG-1 (mono) | |
- // $ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); | |
- // $SideInfoOffset += 9; | |
- // $SideInfoOffset += 5; | |
- // } else { | |
- // // MPEG-1 (stereo, joint-stereo, dual-channel) | |
- // $ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); | |
- // $SideInfoOffset += 9; | |
- // $SideInfoOffset += 3; | |
- // } | |
- // } else { // 2 or 2.5 | |
- // if ($ThisFileInfo['mpeg']['audio']['channelmode'] == 'mono') { | |
- // // MPEG-2, MPEG-2.5 (mono) | |
- // $ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); | |
- // $SideInfoOffset += 8; | |
- // $SideInfoOffset += 1; | |
- // } else { | |
- // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) | |
- // $ThisFileInfo['mpeg']['audio']['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); | |
- // $SideInfoOffset += 8; | |
- // $SideInfoOffset += 2; | |
- // } | |
- // } | |
- // | |
- // if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- // for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) { | |
- // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { | |
- // $ThisFileInfo['mpeg']['audio']['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 2; | |
- // } | |
- // } | |
- // } | |
- // for ($granule = 0; $granule < (($ThisFileInfo['mpeg']['audio']['version'] == '1') ? 2 : 1); $granule++) { | |
- // for ($channel = 0; $channel < $ThisFileInfo['audio']['channels']; $channel++) { | |
- // $ThisFileInfo['mpeg']['audio']['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); | |
- // $SideInfoOffset += 12; | |
- // $ThisFileInfo['mpeg']['audio']['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); | |
- // $SideInfoOffset += 9; | |
- // $ThisFileInfo['mpeg']['audio']['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); | |
- // $SideInfoOffset += 8; | |
- // if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- // $ThisFileInfo['mpeg']['audio']['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); | |
- // $SideInfoOffset += 4; | |
- // } else { | |
- // $ThisFileInfo['mpeg']['audio']['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); | |
- // $SideInfoOffset += 9; | |
- // } | |
- // $ThisFileInfo['mpeg']['audio']['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 1; | |
- // | |
- // if ($ThisFileInfo['mpeg']['audio']['window_switching_flag'][$granule][$channel] == '1') { | |
- // | |
- // $ThisFileInfo['mpeg']['audio']['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); | |
- // $SideInfoOffset += 2; | |
- // $ThisFileInfo['mpeg']['audio']['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 1; | |
- // | |
- // for ($region = 0; $region < 2; $region++) { | |
- // $ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); | |
- // $SideInfoOffset += 5; | |
- // } | |
- // $ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][2] = 0; | |
- // | |
- // for ($window = 0; $window < 3; $window++) { | |
- // $ThisFileInfo['mpeg']['audio']['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); | |
- // $SideInfoOffset += 3; | |
- // } | |
- // | |
- // } else { | |
- // | |
- // for ($region = 0; $region < 3; $region++) { | |
- // $ThisFileInfo['mpeg']['audio']['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); | |
- // $SideInfoOffset += 5; | |
- // } | |
- // | |
- // $ThisFileInfo['mpeg']['audio']['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); | |
- // $SideInfoOffset += 4; | |
- // $ThisFileInfo['mpeg']['audio']['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); | |
- // $SideInfoOffset += 3; | |
- // $ThisFileInfo['mpeg']['audio']['block_type'][$granule][$channel] = 0; | |
- // } | |
- // | |
- // if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- // $ThisFileInfo['mpeg']['audio']['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 1; | |
- // } | |
- // $ThisFileInfo['mpeg']['audio']['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 1; | |
- // $ThisFileInfo['mpeg']['audio']['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); | |
- // $SideInfoOffset += 1; | |
- // } | |
- // } | |
- //} | |
- | |
- return true; | |
-} | |
- | |
-function RecursiveFrameScanning(&$fd, &$ThisFileInfo, &$offset, &$nextframetestoffset, $ScanAsCBR) { | |
- for ($i = 0; $i < MPEG_VALID_CHECK_FRAMES; $i++) { | |
- // check next MPEG_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch | |
- if (($nextframetestoffset + 4) >= $ThisFileInfo['avdataend']) { | |
- // end of file | |
- return true; | |
- } | |
- | |
- $nextframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']); | |
- if (decodeMPEGaudioHeader($fd, $nextframetestoffset, $nextframetestarray, false)) { | |
- if ($ScanAsCBR) { | |
- // force CBR mode, used for trying to pick out invalid audio streams with | |
- // valid(?) VBR headers, or VBR streams with no VBR header | |
- if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($ThisFileInfo['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $ThisFileInfo['mpeg']['audio']['bitrate'])) { | |
- return false; | |
- } | |
- } | |
- | |
- | |
- // next frame is OK, get ready to check the one after that | |
- if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { | |
- $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".'Frame at offset ('.$offset.') is has an invalid frame length.'; | |
- return false; | |
- } | |
- | |
- } else { | |
- | |
- // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence | |
- $ThisFileInfo['error'] .= "\n".'Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'; | |
- | |
- return false; | |
- } | |
- } | |
- return true; | |
-} | |
- | |
-function FreeFormatFrameLength($fd, $offset, &$ThisFileInfo, $deepscan=false) { | |
- fseek($fd, $offset, SEEK_SET); | |
- $MPEGaudioData = fread($fd, 32768); | |
- | |
- $SyncPattern1 = substr($MPEGaudioData, 0, 4); | |
- // may be different pattern due to padding | |
- $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3}; | |
- if ($SyncPattern2 === $SyncPattern1) { | |
- $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3}; | |
- } | |
- | |
- $framelength = false; | |
- $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); | |
- $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); | |
- if ($framelength1 > 4) { | |
- $framelength = $framelength1; | |
- } | |
- if (($framelength2 > 4) && ($framelength2 < $framelength1)) { | |
- $framelength = $framelength2; | |
- } | |
- if (!$framelength) { | |
- | |
- // LAME 3.88 has a different value for modeextension on the first frame vs the rest | |
- $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); | |
- $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); | |
- | |
- if ($framelength1 > 4) { | |
- $framelength = $framelength1; | |
- } | |
- if (($framelength2 > 4) && ($framelength2 < $framelength1)) { | |
- $framelength = $framelength2; | |
- } | |
- if (!$framelength) { | |
- $ThisFileInfo['error'] .= "\n".'Cannot find next free-format synch pattern ('.PrintHexBytes($SyncPattern1).' or '.PrintHexBytes($SyncPattern2).') after offset '.$offset; | |
- return false; | |
- } else { | |
- $ThisFileInfo['warning'] .= "\n".'ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'; | |
- $ThisFileInfo['audio']['codec'] = 'LAME'; | |
- $ThisFileInfo['audio']['encoder'] = 'LAME3.88'; | |
- $SyncPattern1 = substr($SyncPattern1, 0, 3); | |
- $SyncPattern2 = substr($SyncPattern2, 0, 3); | |
- } | |
- } | |
- | |
- if ($deepscan) { | |
- | |
- $ActualFrameLengthValues = array(); | |
- $nextoffset = $offset + $framelength; | |
- while ($nextoffset < ($ThisFileInfo['avdataend'] - 6)) { | |
- fseek($fd, $nextoffset - 1, SEEK_SET); | |
- $NextSyncPattern = fread($fd, 6); | |
- if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { | |
- // good - found where expected | |
- $ActualFrameLengthValues[] = $framelength; | |
- } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { | |
- // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) | |
- $ActualFrameLengthValues[] = ($framelength - 1); | |
- $nextoffset--; | |
- } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { | |
- // ok - found one byte later than expected (last frame was padded, first frame wasn't) | |
- $ActualFrameLengthValues[] = ($framelength + 1); | |
- $nextoffset++; | |
- } else { | |
- $ThisFileInfo['error'] .= "\n".'Did not find expected free-format sync pattern at offset '.$nextoffset; | |
- return false; | |
- } | |
- $nextoffset += $framelength; | |
- } | |
- if (count($ActualFrameLengthValues) > 0) { | |
- $framelength = round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues)); | |
- } | |
- } | |
- return $framelength; | |
-} | |
- | |
- | |
-function getOnlyMPEGaudioInfo($fd, &$ThisFileInfo, $avdataoffset, $BitrateHistogram=false) { | |
- // looks for synch, decodes MPEG audio header | |
- | |
- fseek($fd, $avdataoffset, SEEK_SET); | |
- $header = ''; | |
- $SynchSeekOffset = 0; | |
- | |
- if (!defined('CONST_FF')) { | |
- define('CONST_FF', chr(0xFF)); | |
- define('CONST_E0', chr(0xE0)); | |
- } | |
- | |
- static $MPEGaudioVersionLookup; | |
- static $MPEGaudioLayerLookup; | |
- static $MPEGaudioBitrateLookup; | |
- if (empty($MPEGaudioVersionLookup)) { | |
- $MPEGaudioVersionLookup = MPEGaudioVersionArray(); | |
- $MPEGaudioLayerLookup = MPEGaudioLayerArray(); | |
- $MPEGaudioBitrateLookup = MPEGaudioBitrateArray(); | |
- | |
- } | |
- | |
- $header_len = strlen($header) - round(32768 / 2); | |
- while (true) { | |
- | |
- if (($SynchSeekOffset > $header_len) && (($avdataoffset + $SynchSeekOffset) < $ThisFileInfo['avdataend']) && !feof($fd)) { | |
- | |
- if ($SynchSeekOffset > 131072) { | |
- // if a synch's not found within the first 128k bytes, then give up | |
- $ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch within the first 131072 bytes'; | |
- if (isset($ThisFileInfo['audio']['bitrate'])) { | |
- unset($ThisFileInfo['audio']['bitrate']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']['audio'])) { | |
- unset($ThisFileInfo['mpeg']['audio']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) { | |
- unset($ThisFileInfo['mpeg']); | |
- } | |
- return false; | |
- | |
- } elseif ($header .= fread($fd, 32768)) { | |
- | |
- // great | |
- $header_len = strlen($header) - round(32768 / 2); | |
- | |
- } else { | |
- | |
- $ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file'; | |
- if (isset($ThisFileInfo['audio']['bitrate'])) { | |
- unset($ThisFileInfo['audio']['bitrate']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']['audio'])) { | |
- unset($ThisFileInfo['mpeg']['audio']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) { | |
- unset($ThisFileInfo['mpeg']); | |
- } | |
- return false; | |
- | |
- } | |
- } | |
- | |
- if (($SynchSeekOffset + 1) >= strlen($header)) { | |
- $ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file'; | |
- return false; | |
- } | |
- | |
- if (($header{$SynchSeekOffset} == CONST_FF) && ($header{($SynchSeekOffset + 1)} > CONST_E0)) { // synch detected | |
- | |
- if (!isset($FirstFrameThisfileInfo) && !isset($ThisFileInfo['mpeg']['audio'])) { | |
- $FirstFrameThisfileInfo = $ThisFileInfo; | |
- $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; | |
- if (!decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $FirstFrameThisfileInfo, false)) { | |
- // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's | |
- // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below | |
- unset($FirstFrameThisfileInfo); | |
- } | |
- } | |
- $dummy = $ThisFileInfo; // only overwrite real data if valid header found | |
- | |
- if (decodeMPEGaudioHeader($fd, $avdataoffset + $SynchSeekOffset, $dummy, true)) { | |
- | |
- $ThisFileInfo = $dummy; | |
- $ThisFileInfo['avdataoffset'] = $avdataoffset + $SynchSeekOffset; | |
- switch ($ThisFileInfo['fileformat']) { | |
- case '': | |
- case 'id3': | |
- case 'ape': | |
- case 'mp3': | |
- $ThisFileInfo['fileformat'] = 'mp3'; | |
- $ThisFileInfo['audio']['dataformat'] = 'mp3'; | |
- } | |
- if (isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { | |
- if (!CloseMatch($ThisFileInfo['audio']['bitrate'], $FirstFrameThisfileInfo['audio']['bitrate'], 1)) { | |
- // If there is garbage data between a valid VBR header frame and a sequence | |
- // of valid MPEG-audio frames the VBR data is no longer discarded. | |
- $ThisFileInfo = $FirstFrameThisfileInfo; | |
- $ThisFileInfo['avdataoffset'] = $FirstFrameAVDataOffset; | |
- $ThisFileInfo['fileformat'] = 'mp3'; | |
- $ThisFileInfo['audio']['dataformat'] = 'mp3'; | |
- $dummy = $ThisFileInfo; | |
- unset($dummy['mpeg']['audio']); | |
- $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; | |
- $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; | |
- if (decodeMPEGaudioHeader($fd, $GarbageOffsetEnd, $dummy, true, true)) { | |
- | |
- $ThisFileInfo = $dummy; | |
- $ThisFileInfo['avdataoffset'] = $GarbageOffsetEnd; | |
- $ThisFileInfo['warning'] .= "\n".'apparently-valid VBR header not used because could not find '.MPEG_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd; | |
- | |
- } else { | |
- | |
- $ThisFileInfo['warning'] .= "\n".'using data from VBR header even though could not find '.MPEG_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'; | |
- | |
- } | |
- } | |
- } | |
- | |
- if (isset($ThisFileInfo['mpeg']['audio']['bitrate_mode']) && ($ThisFileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($ThisFileInfo['mpeg']['audio']['VBR_method'])) { | |
- // VBR file with no VBR header | |
- $BitrateHistogram = true; | |
- } | |
- | |
- if ($BitrateHistogram) { | |
- | |
- $ThisFileInfo['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); | |
- $ThisFileInfo['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); | |
- | |
- if ($ThisFileInfo['mpeg']['audio']['version'] == '1') { | |
- if ($ThisFileInfo['mpeg']['audio']['layer'] == 'III') { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 40=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 320=>0); | |
- } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'II') { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 320=>0, 384=>0); | |
- } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 64=>0, 96=>0, 128=>0, 160=>0, 192=>0, 224=>0, 256=>0, 288=>0, 320=>0, 352=>0, 384=>0, 416=>0, 448=>0); | |
- } | |
- } elseif ($ThisFileInfo['mpeg']['audio']['layer'] == 'I') { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 144=>0, 160=>0, 176=>0, 192=>0, 224=>0, 256=>0); | |
- } else { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8=>0, 16=>0, 24=>0, 32=>0, 40=>0, 48=>0, 56=>0, 64=>0, 80=>0, 96=>0, 112=>0, 128=>0, 144=>0, 160=>0); | |
- } | |
- | |
- $dummy = array('error'=>$ThisFileInfo['error'], 'warning'=>$ThisFileInfo['warning'], 'avdataend'=>$ThisFileInfo['avdataend'], 'avdataoffset'=>$ThisFileInfo['avdataoffset']); | |
- $synchstartoffset = $ThisFileInfo['avdataoffset']; | |
- | |
- $FastMode = false; | |
- while (decodeMPEGaudioHeader($fd, $synchstartoffset, $dummy, false, false, $FastMode)) { | |
- $FastMode = true; | |
- $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; | |
- | |
- $ThisFileInfo['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]++; | |
- $ThisFileInfo['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]++; | |
- $ThisFileInfo['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]++; | |
- if (empty($dummy['mpeg']['audio']['framelength'])) { | |
- $ThisFileInfo['warning'] .= "\n".'Invalid/missing framelength in histogram analysis - aborting'; | |
-$synchstartoffset += 4; | |
-// return false; | |
- } | |
- $synchstartoffset += $dummy['mpeg']['audio']['framelength']; | |
- } | |
- | |
- $bittotal = 0; | |
- $framecounter = 0; | |
- foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { | |
- $framecounter += $bitratecount; | |
- if ($bitratevalue != 'free') { | |
- $bittotal += ($bitratevalue * $bitratecount); | |
- } | |
- } | |
- if ($framecounter == 0) { | |
- $ThisFileInfo['error'] .= "\n".'Corrupt MP3 file: framecounter == zero'; | |
- return false; | |
- } | |
- $ThisFileInfo['mpeg']['audio']['frame_count'] = $framecounter; | |
- $ThisFileInfo['mpeg']['audio']['bitrate'] = 1000 * ($bittotal / $framecounter); | |
- | |
- $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['mpeg']['audio']['bitrate']; | |
- | |
- | |
- // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently | |
- $distinct_bitrates = 0; | |
- foreach ($ThisFileInfo['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { | |
- if ($bitrate_count > 0) { | |
- $distinct_bitrates++; | |
- } | |
- } | |
- if ($distinct_bitrates > 1) { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'vbr'; | |
- } else { | |
- $ThisFileInfo['mpeg']['audio']['bitrate_mode'] = 'cbr'; | |
- } | |
- $ThisFileInfo['audio']['bitrate_mode'] = $ThisFileInfo['mpeg']['audio']['bitrate_mode']; | |
- | |
- } | |
- | |
- break; // exit while() | |
- } | |
- } | |
- | |
- $SynchSeekOffset++; | |
- if (($avdataoffset + $SynchSeekOffset) >= $ThisFileInfo['avdataend']) { | |
- // end of file/data | |
- | |
- if (empty($ThisFileInfo['mpeg']['audio'])) { | |
- | |
- $ThisFileInfo['error'] .= "\n".'could not find valid MPEG synch before end of file'; | |
- if (isset($ThisFileInfo['audio']['bitrate'])) { | |
- unset($ThisFileInfo['audio']['bitrate']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']['audio'])) { | |
- unset($ThisFileInfo['mpeg']['audio']); | |
- } | |
- if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || empty($ThisFileInfo['mpeg']))) { | |
- unset($ThisFileInfo['mpeg']); | |
- } | |
- return false; | |
- | |
- } | |
- break; | |
- } | |
- | |
- } | |
- $ThisFileInfo['audio']['bits_per_sample'] = 16; | |
- $ThisFileInfo['audio']['channels'] = $ThisFileInfo['mpeg']['audio']['channels']; | |
- $ThisFileInfo['audio']['channelmode'] = $ThisFileInfo['mpeg']['audio']['channelmode']; | |
- $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['mpeg']['audio']['sample_rate']; | |
- return true; | |
-} | |
- | |
- | |
-function MPEGaudioVersionArray() { | |
- static $MPEGaudioVersion = array('2.5', false, '2', '1'); | |
- return $MPEGaudioVersion; | |
-} | |
- | |
-function MPEGaudioLayerArray() { | |
- static $MPEGaudioLayer = array(false, 'III', 'II', 'I'); | |
- return $MPEGaudioLayer; | |
-} | |
- | |
-function MPEGaudioBitrateArray() { | |
- static $MPEGaudioBitrate; | |
- if (empty($MPEGaudioBitrate)) { | |
- $MPEGaudioBitrate['1']['I'] = array('free', 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448); | |
- $MPEGaudioBitrate['1']['II'] = array('free', 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384); | |
- $MPEGaudioBitrate['1']['III'] = array('free', 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320); | |
- $MPEGaudioBitrate['2']['I'] = array('free', 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256); | |
- $MPEGaudioBitrate['2']['II'] = array('free', 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160); | |
- $MPEGaudioBitrate['2']['III'] = $MPEGaudioBitrate['2']['II']; | |
- $MPEGaudioBitrate['2.5']['I'] = $MPEGaudioBitrate['2']['I']; | |
- $MPEGaudioBitrate['2.5']['II'] = $MPEGaudioBitrate['2']['II']; | |
- $MPEGaudioBitrate['2.5']['III'] = $MPEGaudioBitrate['2']['III']; | |
- } | |
- return $MPEGaudioBitrate; | |
-} | |
- | |
-function MPEGaudioFrequencyArray() { | |
- static $MPEGaudioFrequency; | |
- if (empty($MPEGaudioFrequency)) { | |
- $MPEGaudioFrequency['1'] = array(44100, 48000, 32000); | |
- $MPEGaudioFrequency['2'] = array(22050, 24000, 16000); | |
- $MPEGaudioFrequency['2.5'] = array(11025, 12000, 8000); | |
- } | |
- return $MPEGaudioFrequency; | |
-} | |
- | |
-function MPEGaudioChannelModeArray() { | |
- static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); | |
- return $MPEGaudioChannelMode; | |
-} | |
- | |
-function MPEGaudioModeExtensionArray() { | |
- static $MPEGaudioModeExtension; | |
- if (empty($MPEGaudioModeExtension)) { | |
- $MPEGaudioModeExtension['I'] = array('4-31', '8-31', '12-31', '16-31'); | |
- $MPEGaudioModeExtension['II'] = array('4-31', '8-31', '12-31', '16-31'); | |
- $MPEGaudioModeExtension['III'] = array('', 'IS', 'MS', 'IS+MS'); | |
- } | |
- return $MPEGaudioModeExtension; | |
-} | |
- | |
-function MPEGaudioEmphasisArray() { | |
- static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); | |
- return $MPEGaudioEmphasis; | |
-} | |
- | |
- | |
-function MPEGaudioHeaderBytesValid($head4) { | |
- return MPEGaudioHeaderValid(MPEGaudioHeaderDecode($head4)); | |
-} | |
- | |
-function MPEGaudioHeaderValid($rawarray, $echoerrors=false) { | |
- | |
- if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) { | |
- return false; | |
- } | |
- | |
- static $MPEGaudioVersionLookup; | |
- static $MPEGaudioLayerLookup; | |
- static $MPEGaudioBitrateLookup; | |
- static $MPEGaudioFrequencyLookup; | |
- static $MPEGaudioChannelModeLookup; | |
- static $MPEGaudioModeExtensionLookup; | |
- static $MPEGaudioEmphasisLookup; | |
- if (empty($MPEGaudioVersionLookup)) { | |
- $MPEGaudioVersionLookup = MPEGaudioVersionArray(); | |
- $MPEGaudioLayerLookup = MPEGaudioLayerArray(); | |
- $MPEGaudioBitrateLookup = MPEGaudioBitrateArray(); | |
- $MPEGaudioFrequencyLookup = MPEGaudioFrequencyArray(); | |
- $MPEGaudioChannelModeLookup = MPEGaudioChannelModeArray(); | |
- $MPEGaudioModeExtensionLookup = MPEGaudioModeExtensionArray(); | |
- $MPEGaudioEmphasisLookup = MPEGaudioEmphasisArray(); | |
- } | |
- | |
- if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { | |
- $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; | |
- } else { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Version ('.$rawarray['version'].')'; | |
- } | |
- return false; | |
- } | |
- if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { | |
- $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; | |
- } else { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Layer ('.$rawarray['layer'].')'; | |
- } | |
- return false; | |
- } | |
- if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Bitrate ('.$rawarray['bitrate'].')'; | |
- } | |
- if ($rawarray['bitrate'] == 15) { | |
- // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 | |
- // let it go through here otherwise file will not be identified | |
- } else { | |
- return false; | |
- } | |
- } | |
- if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Frequency ('.$rawarray['sample_rate'].')'; | |
- } | |
- return false; | |
- } | |
- if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { | |
- if ($echoerrors) { | |
- echo "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')'; | |
- } | |
- return false; | |
- } | |
- if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')'; | |
- } | |
- return false; | |
- } | |
- if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { | |
- if ($echoerrors) { | |
- echo "\n".'invalid Emphasis ('.$rawarray['emphasis'].')'; | |
- } | |
- return false; | |
- } | |
- // These are just either set or not set, you can't mess that up :) | |
- // $rawarray['protection']; | |
- // $rawarray['padding']; | |
- // $rawarray['private']; | |
- // $rawarray['copyright']; | |
- // $rawarray['original']; | |
- | |
- return true; | |
-} | |
- | |
-function MPEGaudioHeaderDecode($Header4Bytes) { | |
- // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM | |
- // A - Frame sync (all bits set) | |
- // B - MPEG Audio version ID | |
- // C - Layer description | |
- // D - Protection bit | |
- // E - Bitrate index | |
- // F - Sampling rate frequency index | |
- // G - Padding bit | |
- // H - Private bit | |
- // I - Channel Mode | |
- // J - Mode extension (Only if Joint stereo) | |
- // K - Copyright | |
- // L - Original | |
- // M - Emphasis | |
- | |
- if (strlen($Header4Bytes) != 4) { | |
- return false; | |
- } | |
- | |
- $MPEGrawHeader['synch'] = (BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; | |
- $MPEGrawHeader['version'] = (ord($Header4Bytes{1}) & 0x18) >> 3; // BB | |
- $MPEGrawHeader['layer'] = (ord($Header4Bytes{1}) & 0x06) >> 1; // CC | |
- $MPEGrawHeader['protection'] = (ord($Header4Bytes{1}) & 0x01); // D | |
- $MPEGrawHeader['bitrate'] = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE | |
- $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes{2}) & 0x0C) >> 2; // FF | |
- $MPEGrawHeader['padding'] = (ord($Header4Bytes{2}) & 0x02) >> 1; // G | |
- $MPEGrawHeader['private'] = (ord($Header4Bytes{2}) & 0x01); // H | |
- $MPEGrawHeader['channelmode'] = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II | |
- $MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; // JJ | |
- $MPEGrawHeader['copyright'] = (ord($Header4Bytes{3}) & 0x08) >> 3; // K | |
- $MPEGrawHeader['original'] = (ord($Header4Bytes{3}) & 0x04) >> 2; // L | |
- $MPEGrawHeader['emphasis'] = (ord($Header4Bytes{3}) & 0x03); // MM | |
- | |
- return $MPEGrawHeader; | |
-} | |
- | |
-function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { | |
- static $AudioFrameLengthCache = array(); | |
- | |
- if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { | |
- $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; | |
- if ($bitrate != 'free') { | |
- | |
- if ($version == '1') { | |
- | |
- if ($layer == 'I') { | |
- | |
- // For Layer I slot is 32 bits long | |
- $FrameLengthCoefficient = 48; | |
- $SlotLength = 4; | |
- | |
- } else { // Layer II / III | |
- | |
- // for Layer II and Layer III slot is 8 bits long. | |
- $FrameLengthCoefficient = 144; | |
- $SlotLength = 1; | |
- | |
- } | |
- | |
- } else { // MPEG-2 / MPEG-2.5 | |
- | |
- if ($layer == 'I') { | |
- | |
- // For Layer I slot is 32 bits long | |
- $FrameLengthCoefficient = 24; | |
- $SlotLength = 4; | |
- | |
- } elseif ($layer == 'II') { | |
- | |
- // for Layer II and Layer III slot is 8 bits long. | |
- $FrameLengthCoefficient = 144; | |
- $SlotLength = 1; | |
- | |
- } else { // III | |
- | |
- // for Layer II and Layer III slot is 8 bits long. | |
- $FrameLengthCoefficient = 72; | |
- $SlotLength = 1; | |
- | |
- } | |
- | |
- } | |
- | |
- // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding | |
- // http://66.96.216.160/cgi-bin/YaBB.pl?board=c&action=display&num=1018474068 | |
- // -> [Finding the next frame synch] on www.r3mix.net forums if the above link goes dead | |
- if ($samplerate > 0) { | |
- $NewFramelength = ($FrameLengthCoefficient * $bitrate * 1000) / $samplerate; | |
- $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer II/III, 4 bytes for Layer I) | |
- if ($padding) { | |
- $NewFramelength += $SlotLength; | |
- } | |
- $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; | |
- } | |
- } | |
- } | |
- return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; | |
-} | |
- | |
-function LAMEvbrMethodLookup($VBRmethodID) { | |
- static $LAMEvbrMethodLookup = array(); | |
- if (empty($LAMEvbrMethodLookup)) { | |
- $LAMEvbrMethodLookup[0x00] = 'unknown'; | |
- $LAMEvbrMethodLookup[0x01] = 'cbr'; | |
- $LAMEvbrMethodLookup[0x02] = 'abr'; | |
- $LAMEvbrMethodLookup[0x03] = 'vbr-old / vbr-rh'; | |
- $LAMEvbrMethodLookup[0x04] = 'vbr-mtrh'; | |
- $LAMEvbrMethodLookup[0x05] = 'vbr-new / vbr-mt'; | |
- } | |
- return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); | |
-} | |
- | |
-function LAMEmiscStereoModeLookup($StereoModeID) { | |
- static $LAMEmiscStereoModeLookup = array(); | |
- if (empty($LAMEmiscStereoModeLookup)) { | |
- $LAMEmiscStereoModeLookup[0] = 'mono'; | |
- $LAMEmiscStereoModeLookup[1] = 'stereo'; | |
- $LAMEmiscStereoModeLookup[2] = 'dual'; | |
- $LAMEmiscStereoModeLookup[3] = 'joint'; | |
- $LAMEmiscStereoModeLookup[4] = 'forced'; | |
- $LAMEmiscStereoModeLookup[5] = 'auto'; | |
- $LAMEmiscStereoModeLookup[6] = 'intensity'; | |
- $LAMEmiscStereoModeLookup[7] = 'other'; | |
- } | |
- return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); | |
-} | |
- | |
-function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { | |
- static $LAMEmiscSourceSampleFrequencyLookup = array(); | |
- if (empty($LAMEmiscSourceSampleFrequencyLookup)) { | |
- $LAMEmiscSourceSampleFrequencyLookup[0] = '<= 32 kHz'; | |
- $LAMEmiscSourceSampleFrequencyLookup[1] = '44.1 kHz'; | |
- $LAMEmiscSourceSampleFrequencyLookup[2] = '48 kHz'; | |
- $LAMEmiscSourceSampleFrequencyLookup[3] = '> 48kHz'; | |
- } | |
- return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); | |
-} | |
- | |
-function LAMEsurroundInfoLookup($SurroundInfoID) { | |
- static $LAMEsurroundInfoLookup = array(); | |
- if (empty($LAMEsurroundInfoLookup)) { | |
- $LAMEsurroundInfoLookup[0] = 'no surround info'; | |
- $LAMEsurroundInfoLookup[1] = 'DPL encoding'; | |
- $LAMEsurroundInfoLookup[2] = 'DPL2 encoding'; | |
- $LAMEsurroundInfoLookup[3] = 'Ambisonic encoding'; | |
- } | |
- return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); | |
-} | |
- | |
-for ($i = 0x00; $i <= 0xFF; $i++) { | |
- $head4 = "\xFF\xFE".chr($i)."\x00"; | |
- $isvalid = MPEGaudioHeaderBytesValid($head4); | |
- echo '<div style="color: '.($isvalid ? 'green' : 'red').';">'.str_pad(strtoupper(dechex($i)), 2, '0', STR_PAD_LEFT).' = '.htmlentities(chr($i)).' = '.($isvalid ? 'valid' : 'INVALID').'</div>'; | |
-} | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.mysql.php b/demos/demo.mysql.php | |
deleted file mode 100644 | |
index 74748ce..0000000 | |
--- a/demos/demo.mysql.php | |
+++ /dev/null | |
@@ -1,2197 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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`; | |
- | |
-ob_start(); | |
-if (!mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>'); | |
-} | |
-if (!mysql_select_db(GETID3_DB_DB)) { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>'); | |
-} | |
-ob_end_clean(); | |
- | |
-$getid3PHP_filename = realpath('../getid3/getid3.php'); | |
-if (!file_exists($getid3PHP_filename) || !include_once($getid3PHP_filename)) { | |
- die('Cannot open '.$getid3PHP_filename); | |
-} | |
-// Initialize getID3 engine | |
-$getID3 = new getID3; | |
-$getID3->setOption(array( | |
- 'option_md5_data' => $getid3_demo_mysql_md5_data, | |
- 'encoding' => $getid3_demo_mysql_encoding, | |
-)); | |
- | |
- | |
-function RemoveAccents($string) { | |
- // Revised version by markstewardÿhotmail*com | |
- return strtr(strtr($string, 'äéöûü¿¡¬√ƒ≈«»… ÀÃÕŒœ—“”‘’÷ÿŸ⁄€‹›‡·‚„‰ÂÁËÈÍÎÏÌÓÔÒÚÛÙıˆ¯˘˙˚¸˝ˇ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('fi' => 'TH', '˛' => 'th', '–' => 'DH', '' => 'dh', 'fl' => 'ss', 'å' => 'OE', 'ú' => 'oe', '∆' => 'AE', 'Ê' => 'ae', 'µ' => 'u')); | |
-} | |
- | |
-function BitrateColor($bitrate, $BitrateMaxScale=768) { | |
- // $BitrateMaxScale is bitrate of maximum-quality color (bright green) | |
- // below this is gradient, above is solid green | |
- | |
- $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256 | |
- $bitrate = round(min(max($bitrate, 1), 256)); | |
- $bitrate--; // scale from 1-256kbps to 0-255kbps | |
- | |
- $Rcomponent = max(255 - ($bitrate * 2), 0); | |
- $Gcomponent = max(($bitrate * 2) - 255, 0); | |
- if ($bitrate > 127) { | |
- $Bcomponent = max((255 - $bitrate) * 2, 0); | |
- } else { | |
- $Bcomponent = max($bitrate * 2, 0); | |
- } | |
- return str_pad(dechex($Rcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Gcomponent), 2, '0', STR_PAD_LEFT).str_pad(dechex($Bcomponent), 2, '0', STR_PAD_LEFT); | |
-} | |
- | |
-function BitrateText($bitrate, $decimals=0) { | |
- return '<span style="color: #'.BitrateColor($bitrate).'">'.number_format($bitrate, $decimals).' kbps</span>'; | |
-} | |
- | |
-function fileextension($filename, $numextensions=1) { | |
- if (strstr($filename, '.')) { | |
- $reversedfilename = strrev($filename); | |
- $offset = 0; | |
- for ($i = 0; $i < $numextensions; $i++) { | |
- $offset = strpos($reversedfilename, '.', $offset + 1); | |
- if ($offset === false) { | |
- return ''; | |
- } | |
- } | |
- return strrev(substr($reversedfilename, 0, $offset)); | |
- } | |
- return ''; | |
-} | |
- | |
-function RenameFileFromTo($from, $to, &$results) { | |
- $success = true; | |
- if ($from === $to) { | |
- $results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename'; | |
- } elseif (!file_exists($from)) { | |
- $results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename'; | |
- } elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) { | |
- $results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename'; | |
- } else { | |
- ob_start(); | |
- if (rename($from, $to)) { | |
- ob_end_clean(); | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($from).'")'; | |
- mysql_query_safe($SQLquery); | |
- $results = '<span style="color: #008000;">Successfully renamed'; | |
- } else { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- $results = '<br><span style="color: #FF0000;">FAILED to rename'; | |
- $success = false; | |
- } | |
- } | |
- $results .= ' from:<br><i>'.$from.'</i><br>to:<br><i>'.$to.'</i></span><hr>'; | |
- return $success; | |
-} | |
- | |
-if (!empty($_REQUEST['renamefilefrom']) && !empty($_REQUEST['renamefileto'])) { | |
- | |
- $results = ''; | |
- RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results); | |
- echo $results; | |
- exit; | |
- | |
-} elseif (!empty($_REQUEST['m3ufilename'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- echo WindowsShareSlashTranslate($_REQUEST['m3ufilename'])."\n"; | |
- exit; | |
- | |
-} elseif (!isset($_REQUEST['m3u']) && !isset($_REQUEST['m3uartist']) && !isset($_REQUEST['m3utitle'])) { | |
- | |
- echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; | |
- echo '<html><head><title>getID3() demo - /demo/mysql.php</title><style>BODY, TD, TH { font-family: sans-serif; font-size: 10pt; } A { text-decoration: none; } A:hover { text-decoration: underline; } A:visited { font-style: italic; }</style></head><body>'; | |
- | |
-} | |
- | |
- | |
-function WindowsShareSlashTranslate($filename) { | |
- if (substr($filename, 0, 2) == '//') { | |
- return str_replace('/', '\\', $filename); | |
- } | |
- return $filename; | |
-} | |
- | |
-function mysql_query_safe($SQLquery) { | |
- static $TimeSpentQuerying = 0; | |
- if ($SQLquery === null) { | |
- return $TimeSpentQuerying; | |
- } | |
- $starttime = microtime(true); | |
- $result = mysql_query($SQLquery); | |
- $TimeSpentQuerying += (microtime(true) - $starttime); | |
- if (mysql_error()) { | |
- die('<div style="color: red; padding: 10px; margin: 10px; border: 3px red ridge;"><div style="font-weight: bold;">SQL error:</div><div style="color: blue; padding: 10px;">'.htmlentities(mysql_error()).'</div><hr size="1"><pre>'.htmlentities($SQLquery).'</pre></div>'); | |
- } | |
- return $result; | |
-} | |
- | |
-function mysql_table_exists($tablename) { | |
- return (bool) mysql_query_safe('DESCRIBE '.$tablename); | |
-} | |
- | |
-function AcceptableExtensions($fileformat, $audio_dataformat='', $video_dataformat='') { | |
- static $AcceptableExtensionsAudio = array(); | |
- if (empty($AcceptableExtensionsAudio)) { | |
- $AcceptableExtensionsAudio['mp3']['mp3'] = array('mp3'); | |
- $AcceptableExtensionsAudio['mp2']['mp2'] = array('mp2'); | |
- $AcceptableExtensionsAudio['mp1']['mp1'] = array('mp1'); | |
- $AcceptableExtensionsAudio['asf']['asf'] = array('asf'); | |
- $AcceptableExtensionsAudio['asf']['wma'] = array('wma'); | |
- $AcceptableExtensionsAudio['riff']['mp3'] = array('wav'); | |
- $AcceptableExtensionsAudio['riff']['wav'] = array('wav'); | |
- } | |
- static $AcceptableExtensionsVideo = array(); | |
- if (empty($AcceptableExtensionsVideo)) { | |
- $AcceptableExtensionsVideo['mp3']['mp3'] = array('mp3'); | |
- $AcceptableExtensionsVideo['mp2']['mp2'] = array('mp2'); | |
- $AcceptableExtensionsVideo['mp1']['mp1'] = array('mp1'); | |
- $AcceptableExtensionsVideo['asf']['asf'] = array('asf'); | |
- $AcceptableExtensionsVideo['asf']['wmv'] = array('wmv'); | |
- $AcceptableExtensionsVideo['gif']['gif'] = array('gif'); | |
- $AcceptableExtensionsVideo['jpg']['jpg'] = array('jpg'); | |
- $AcceptableExtensionsVideo['png']['png'] = array('png'); | |
- $AcceptableExtensionsVideo['bmp']['bmp'] = array('bmp'); | |
- } | |
- if (!empty($video_dataformat)) { | |
- return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array()); | |
- } else { | |
- return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array()); | |
- } | |
-} | |
- | |
- | |
-if (!empty($_REQUEST['scan'])) { | |
- if (mysql_table_exists(GETID3_DB_TABLE)) { | |
- $SQLquery = 'DROP TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- mysql_query_safe($SQLquery); | |
- } | |
-} | |
-if (!mysql_table_exists(GETID3_DB_TABLE)) { | |
- $SQLquery = "CREATE TABLE `".mysql_real_escape_string(GETID3_DB_TABLE)."` ("; | |
- $SQLquery .= " `ID` int(11) unsigned NOT NULL auto_increment,"; | |
- $SQLquery .= " `filename` text NOT NULL,"; | |
- $SQLquery .= " `last_modified` int(11) NOT NULL default '0',"; | |
- $SQLquery .= " `md5_file` varchar(32) NOT NULL default '',"; | |
- $SQLquery .= " `md5_data` varchar(32) NOT NULL default '',"; | |
- $SQLquery .= " `md5_data_source` varchar(32) NOT NULL default '',"; | |
- $SQLquery .= " `filesize` int(10) unsigned NOT NULL default '0',"; | |
- $SQLquery .= " `fileformat` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `audio_dataformat` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `video_dataformat` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `audio_bitrate` float NOT NULL default '0',"; | |
- $SQLquery .= " `video_bitrate` float NOT NULL default '0',"; | |
- $SQLquery .= " `playtime_seconds` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `tags` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `artist` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `title` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `remix` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `album` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `genre` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `comment` text NOT NULL,"; | |
- $SQLquery .= " `track` varchar(7) NOT NULL default '',"; | |
- $SQLquery .= " `comments_all` longtext NOT NULL,"; | |
- $SQLquery .= " `comments_id3v2` longtext NOT NULL,"; | |
- $SQLquery .= " `comments_ape` longtext NOT NULL,"; | |
- $SQLquery .= " `comments_lyrics3` longtext NOT NULL,"; | |
- $SQLquery .= " `comments_id3v1` text NOT NULL,"; | |
- $SQLquery .= " `warning` longtext NOT NULL,"; | |
- $SQLquery .= " `error` longtext NOT NULL,"; | |
- $SQLquery .= " `track_volume` float NOT NULL default '0',"; | |
- $SQLquery .= " `encoder_options` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " `vbr_method` varchar(255) NOT NULL default '',"; | |
- $SQLquery .= " PRIMARY KEY (`ID`)"; | |
- $SQLquery .= ")"; | |
- mysql_query_safe($SQLquery); | |
-} | |
- | |
-$ExistingTableFields = array(); | |
-$result = mysql_query_safe('DESCRIBE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'); | |
-while ($row = mysql_fetch_array($result)) { | |
- $ExistingTableFields[$row['Field']] = $row; | |
-} | |
-if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2 | |
- echo '<b>adding field `encoder_options`</b><br>'; | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `encoder_options` VARCHAR(255) default "" NOT NULL AFTER `error`'); | |
- mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'); | |
-} | |
-if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2 | |
- echo '<b>changing field `track` to VARCHAR(7)</b><br>'; | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `track` `track` VARCHAR(7) default "" NOT NULL'); | |
- mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'); | |
-} | |
-if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5 | |
- echo '<H1><FONT COLOR="red">WARNING! You should erase your database and rescan everything because the comment storing has been changed since the last version</FONT></H1><hr>'; | |
- echo '<b>adding field `track_volume`</b><br>'; | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `track_volume` FLOAT NOT NULL AFTER `error`'); | |
- mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'); | |
-} | |
-if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1 | |
- echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>'; | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `remix` VARCHAR(255) default "" NOT NULL AFTER `title`'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `alternate_name` VARCHAR(255) default "" NOT NULL AFTER `track`'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `parody` VARCHAR(255) default "" NOT NULL AFTER `alternate_name`'); | |
- mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'); | |
-} | |
-if (isset($ExistingTableFields['comments_all']) && ($ExistingTableFields['comments_all']['Type'] != 'longtext')) { // Changed in 1.9.0 | |
- echo '<b>changing comments fields from text to longtext</b><br>'; | |
- // no need to change id3v1 | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_all` `comments_all` LONGTEXT NOT NULL'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_id3v2` `comments_id3v2` LONGTEXT NOT NULL'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_ape` `comments_ape` LONGTEXT NOT NULL'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_lyrics3` `comments_lyrics3` LONGTEXT NOT NULL'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `warning` `warning` LONGTEXT NOT NULL'); | |
- mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `error` `error` LONGTEXT NOT NULL'); | |
-} | |
- | |
- | |
-function SynchronizeAllTags($filename, $synchronizefrom='all', $synchronizeto='A12', &$errors) { | |
- global $getID3; | |
- | |
- set_time_limit(30); | |
- | |
- $ThisFileInfo = $getID3->analyze($filename); | |
- getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
- if ($synchronizefrom == 'all') { | |
- $SourceArray = (!empty($ThisFileInfo['comments']) ? $ThisFileInfo['comments'] : array()); | |
- } elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) { | |
- $SourceArray = (!empty($ThisFileInfo['tags'][$synchronizefrom]) ? $ThisFileInfo['tags'][$synchronizefrom] : array()); | |
- } else { | |
- die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist'); | |
- } | |
- | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($filename).'")'; | |
- mysql_query_safe($SQLquery); | |
- | |
- | |
- $TagFormatsToWrite = array(); | |
- if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2')) { | |
- $TagFormatsToWrite[] = 'id3v2.3'; | |
- } | |
- if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape')) { | |
- $TagFormatsToWrite[] = 'ape'; | |
- } | |
- if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3')) { | |
- $TagFormatsToWrite[] = 'lyrics3'; | |
- } | |
- if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1')) { | |
- $TagFormatsToWrite[] = 'id3v1'; | |
- } | |
- | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true); | |
- $tagwriter = new getid3_writetags; | |
- $tagwriter->filename = $filename; | |
- $tagwriter->tagformats = $TagFormatsToWrite; | |
- $tagwriter->overwrite_tags = true; | |
- $tagwriter->tag_encoding = $getID3->encoding; | |
- $tagwriter->tag_data = $SourceArray; | |
- | |
- if ($tagwriter->WriteTags()) { | |
- $errors = $tagwriter->errors; | |
- return true; | |
- } | |
- $errors = $tagwriter->errors; | |
- return false; | |
-} | |
- | |
-$IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'pdf', 'zip', 'rar', 'mid', 'mod', 'xm', 'it', 's3m'); | |
- | |
-if (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan']) || !empty($_REQUEST['rescanerrors'])) { | |
- | |
- $SQLquery = 'DELETE from `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` = "")'; | |
- mysql_query_safe($SQLquery); | |
- | |
- $FilesInDir = array(); | |
- | |
- if (!empty($_REQUEST['rescanerrors'])) { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>'; | |
- | |
- echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>'; | |
- | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`error` <> "")'; | |
- $SQLquery .= ' OR (`warning` <> "")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- | |
- if (!file_exists($row['filename'])) { | |
- echo '<b>File missing: '.$row['filename'].'</b><br>'; | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")'; | |
- mysql_query_safe($SQLquery); | |
- } else { | |
- $FilesInDir[] = $row['filename']; | |
- } | |
- | |
- } | |
- | |
- } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>'; | |
- | |
- echo 'Scanning all media files in <b>'.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).'</b> (and subdirectories)<hr>'; | |
- | |
- $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' GROUP BY `filename`'; | |
- $SQLquery .= ' HAVING (`num` > 1)'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $DupesDeleted = 0; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"'; | |
- mysql_query_safe($SQLquery); | |
- $DupesDeleted++; | |
- } | |
- if ($DupesDeleted > 0) { | |
- echo 'Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>'; | |
- } | |
- | |
- if (!empty($_REQUEST['newscan'])) { | |
- $AlreadyInDatabase = array(); | |
- set_time_limit(60); | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- //$AlreadyInDatabase[] = strtolower($row['filename']); | |
- $AlreadyInDatabase[] = $row['filename']; | |
- } | |
- } | |
- | |
- $DirectoriesToScan = array(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan']); | |
- $DirectoriesScanned = array(); | |
- while (count($DirectoriesToScan) > 0) { | |
- foreach ($DirectoriesToScan as $DirectoryKey => $startingdir) { | |
- if ($dir = opendir($startingdir)) { | |
- set_time_limit(30); | |
- echo '<b>'.str_replace('\\', '/', $startingdir).'</b><br>'; | |
- flush(); | |
- while (($file = readdir($dir)) !== false) { | |
- if (($file != '.') && ($file != '..')) { | |
- $RealPathName = realpath($startingdir.'/'.$file); | |
- if (is_dir($RealPathName)) { | |
- if (!in_array($RealPathName, $DirectoriesScanned) && !in_array($RealPathName, $DirectoriesToScan)) { | |
- $DirectoriesToScan[] = $RealPathName; | |
- } | |
- } elseif (is_file($RealPathName)) { | |
- if (!empty($_REQUEST['newscan'])) { | |
- if (!in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase)) { | |
- $FilesInDir[] = $RealPathName; | |
- } | |
- } elseif (!empty($_REQUEST['scan'])) { | |
- $FilesInDir[] = $RealPathName; | |
- } | |
- } | |
- } | |
- } | |
- closedir($dir); | |
- } else { | |
- echo '<div style="color: red;">Failed to open directory "<b>'.htmlentities($startingdir).'</b>"</div><br>'; | |
- } | |
- $DirectoriesScanned[] = $startingdir; | |
- unset($DirectoriesToScan[$DirectoryKey]); | |
- } | |
- } | |
- echo '<i>List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)</i><hr>'; | |
- flush(); | |
- } | |
- | |
- $FilesInDir = array_unique($FilesInDir); | |
- sort($FilesInDir); | |
- | |
- $starttime = time(); | |
- $rowcounter = 0; | |
- $totaltoprocess = count($FilesInDir); | |
- | |
- foreach ($FilesInDir as $filename) { | |
- set_time_limit(300); | |
- | |
- echo '<br>'.date('H:i:s').' ['.number_format(++$rowcounter).' / '.number_format($totaltoprocess).'] '.str_replace('\\', '/', $filename); | |
- | |
- $ThisFileInfo = $getID3->analyze($filename); | |
- getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
- if (file_exists($filename)) { | |
- $ThisFileInfo['file_modified_time'] = filemtime($filename); | |
- $ThisFileInfo['md5_file'] = ($getid3_demo_mysql_md5_file ? md5_file($filename) : ''); | |
- } | |
- | |
- if (empty($ThisFileInfo['fileformat'])) { | |
- | |
- echo ' (<span style="color: #990099;">unknown file type</span>)'; | |
- | |
- } else { | |
- | |
- if (!empty($ThisFileInfo['error'])) { | |
- echo ' (<span style="color: #FF0000;">errors</span>)'; | |
- } elseif (!empty($ThisFileInfo['warning'])) { | |
- echo ' (<span style="color: #FF9999;">warnings</span>)'; | |
- } else { | |
- echo ' (<span style="color: #009900;">OK</span>)'; | |
- } | |
- | |
- $this_track_track = ''; | |
- if (!empty($ThisFileInfo['comments']['track'])) { | |
- foreach ($ThisFileInfo['comments']['track'] as $key => $value) { | |
- if (strlen($value) > strlen($this_track_track)) { | |
- $this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT); | |
- } | |
- } | |
- if (preg_match('#^([0-9]+)/([0-9]+)$#', $this_track_track, $matches)) { | |
- // change "1/5"->"01/05", "3/12"->"03/12", etc | |
- $this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT).'/'.str_pad($matches[2], 2, '0', STR_PAD_LEFT); | |
- } | |
- } | |
- | |
- $this_track_remix = ''; | |
- $this_track_title = ''; | |
- if (!empty($ThisFileInfo['comments']['title'])) { | |
- foreach ($ThisFileInfo['comments']['title'] as $possible_title) { | |
- if (strlen($possible_title) > strlen($this_track_title)) { | |
- $this_track_title = $possible_title; | |
- } | |
- } | |
- } | |
- | |
- $ParenthesesPairs = array('()', '[]', '{}'); | |
- foreach ($ParenthesesPairs as $pair) { | |
- if (preg_match_all('/(.*) '.preg_quote($pair{0}).'(([^'.preg_quote($pair).']*[\- '.preg_quote($pair{0}).'])?(cut|dub|edit|version|live|reprise|[a-z]*mix))'.preg_quote($pair{1}).'/iU', $this_track_title, $matches)) { | |
- $this_track_title = $matches[1][0]; | |
- $this_track_remix = implode("\t", $matches[2]); | |
- } | |
- } | |
- | |
- | |
- | |
- if (!empty($_REQUEST['rescanerrors'])) { | |
- | |
- $SQLquery = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` SET '; | |
- $SQLquery .= ' `last_modified` = "'. mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time'] ) ? $ThisFileInfo['file_modified_time'] : '').'"'; | |
- $SQLquery .= ', `md5_file` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_file'] ) ? $ThisFileInfo['md5_file'] : '').'"'; | |
- $SQLquery .= ', `md5_data` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_data'] ) ? $ThisFileInfo['md5_data'] : '').'"'; | |
- $SQLquery .= ', `md5_data_source` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source'] ) ? $ThisFileInfo['md5_data_source'] : '').'"'; | |
- $SQLquery .= ', `filesize` = "'. mysql_real_escape_string(!empty($ThisFileInfo['filesize'] ) ? $ThisFileInfo['filesize'] : 0).'"'; | |
- $SQLquery .= ', `fileformat` = "'. mysql_real_escape_string(!empty($ThisFileInfo['fileformat'] ) ? $ThisFileInfo['fileformat'] : '').'"'; | |
- $SQLquery .= ', `audio_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat'] ) ? $ThisFileInfo['audio']['dataformat'] : '').'"'; | |
- $SQLquery .= ', `video_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat'] ) ? $ThisFileInfo['video']['dataformat'] : '').'"'; | |
- $SQLquery .= ', `vbr_method` = "'. mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['VBR_method'] ) ? $ThisFileInfo['mpeg']['audio']['VBR_method'] : '').'"'; | |
- $SQLquery .= ', `audio_bitrate` = "'. mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate'] ) ? floatval($ThisFileInfo['audio']['bitrate']) : 0).'"'; | |
- $SQLquery .= ', `video_bitrate` = "'. mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate'] ) ? floatval($ThisFileInfo['video']['bitrate']) : 0).'"'; | |
- $SQLquery .= ', `playtime_seconds` = "'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds'] ) ? floatval($ThisFileInfo['playtime_seconds']) : 0).'"'; | |
- $SQLquery .= ', `track_volume` = "'. mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ? floatval($ThisFileInfo['replay_gain']['track']['volume']) : 0).'"'; | |
- $SQLquery .= ', `comments_all` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments'] ) ? serialize($ThisFileInfo['comments']) : '').'"'; | |
- $SQLquery .= ', `comments_id3v2` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2'] ) ? serialize($ThisFileInfo['tags']['id3v2']) : '').'"'; | |
- $SQLquery .= ', `comments_ape` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape'] ) ? serialize($ThisFileInfo['tags']['ape']) : '').'"'; | |
- $SQLquery .= ', `comments_lyrics3` = "'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3'] ) ? serialize($ThisFileInfo['tags']['lyrics3']) : '').'"'; | |
- $SQLquery .= ', `comments_id3v1` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1'] ) ? serialize($ThisFileInfo['tags']['id3v1']) : '').'"'; | |
- $SQLquery .= ', `warning` = "'. mysql_real_escape_string(!empty($ThisFileInfo['warning'] ) ? implode("\t", $ThisFileInfo['warning']) : '').'"'; | |
- $SQLquery .= ', `error` = "'. mysql_real_escape_string(!empty($ThisFileInfo['error'] ) ? implode("\t", $ThisFileInfo['error']) : '').'"'; | |
- $SQLquery .= ', `album` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['album'] ) ? implode("\t", $ThisFileInfo['comments']['album']) : '').'"'; | |
- $SQLquery .= ', `genre` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre'] ) ? implode("\t", $ThisFileInfo['comments']['genre']) : '').'"'; | |
- $SQLquery .= ', `comment` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment'] ) ? implode("\t", $ThisFileInfo['comments']['comment']) : '').'"'; | |
- $SQLquery .= ', `artist` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist'] ) ? implode("\t", $ThisFileInfo['comments']['artist']) : '').'"'; | |
- $SQLquery .= ', `tags` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", array_keys($ThisFileInfo['tags'])) : '').'"'; | |
- $SQLquery .= ', `encoder_options` = "'. mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'"'; | |
- $SQLquery .= ', `title` = "'. mysql_real_escape_string($this_track_title).'"'; | |
- $SQLquery .= ', `remix` = "'. mysql_real_escape_string($this_track_remix).'"'; | |
- $SQLquery .= ', `track` = "'. mysql_real_escape_string($this_track_track).'"'; | |
- $SQLquery .= 'WHERE (`filename` = "'. mysql_real_escape_string(isset($ThisFileInfo['filenamepath']) ? $ThisFileInfo['filenamepath'] : '').'")'; | |
- | |
- } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) { | |
- | |
- //$SQLquery = 'INSERT INTO `'.mysql_real_escape_string(GETID3_DB_TABLE).'` (`filename`, `last_modified`, `md5_file`, `md5_data`, `md5_data_source`, `filesize`, `fileformat`, `audio_dataformat`, `video_dataformat`, `audio_bitrate`, `video_bitrate`, `playtime_seconds`, `artist`, `title`, `remix`, `album`, `genre`, `comment`, `track`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`, `warning`, `error`, `encoder_options`, `vbr_method`, `track_volume`) VALUES ('; | |
- $SQLquery = 'INSERT INTO `'.mysql_real_escape_string(GETID3_DB_TABLE).'` (`filename`, `last_modified`, `md5_file`, `md5_data`, `md5_data_source`, `filesize`, `fileformat`, `audio_dataformat`, `video_dataformat`, `audio_bitrate`, `video_bitrate`, `playtime_seconds`, `tags`, `artist`, `title`, `remix`, `album`, `genre`, `comment`, `track`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`, `warning`, `error`, `encoder_options`, `vbr_method`, `track_volume`) VALUES ('; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filenamepath'] ) ? $ThisFileInfo['filenamepath'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time'] ) ? $ThisFileInfo['file_modified_time'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_file'] ) ? $ThisFileInfo['md5_file'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data'] ) ? $ThisFileInfo['md5_data'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source'] ) ? $ThisFileInfo['md5_data_source'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filesize'] ) ? $ThisFileInfo['filesize'] : 0).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['fileformat'] ) ? $ThisFileInfo['fileformat'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat'] ) ? $ThisFileInfo['audio']['dataformat'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat'] ) ? $ThisFileInfo['video']['dataformat'] : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate'] ) ? floatval($ThisFileInfo['audio']['bitrate']) : 0).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate'] ) ? floatval($ThisFileInfo['video']['bitrate']) : 0).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds'] ) ? floatval($ThisFileInfo['playtime_seconds']) : 0).'", '; | |
- //$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", $ThisFileInfo['tags']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", array_keys($ThisFileInfo['tags'])) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist'] ) ? implode("\t", $ThisFileInfo['comments']['artist']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string($this_track_title).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string($this_track_remix).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['album'] ) ? implode("\t", $ThisFileInfo['comments']['album']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre'] ) ? implode("\t", $ThisFileInfo['comments']['genre']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment'] ) ? implode("\t", $ThisFileInfo['comments']['comment']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string($this_track_track).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments'] ) ? serialize($ThisFileInfo['comments']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2'] ) ? serialize($ThisFileInfo['tags']['id3v2']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape'] ) ? serialize($ThisFileInfo['tags']['ape']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3'] ) ? serialize($ThisFileInfo['tags']['lyrics3']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1'] ) ? serialize($ThisFileInfo['tags']['id3v1']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['warning'] ) ? implode("\t", $ThisFileInfo['warning']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['error'] ) ? implode("\t", $ThisFileInfo['error']) : '').'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : (!empty($ThisFileInfo['mpeg']['audio']['VBR_method']) ? $ThisFileInfo['mpeg']['audio']['VBR_method'] : '')).'", '; | |
- $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ? floatval($ThisFileInfo['replay_gain']['track']['volume']) : 0).'")'; | |
- | |
- } | |
- flush(); | |
- mysql_query_safe($SQLquery); | |
- } | |
- | |
- } | |
- | |
- $SQLquery = 'OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- mysql_query_safe($SQLquery); | |
- | |
- echo '<hr>Done scanning!<hr>'; | |
- | |
-} elseif (!empty($_REQUEST['missingtrackvolume'])) { | |
- | |
- $MissingTrackVolumeFilesScanned = 0; | |
- $MissingTrackVolumeFilesAdjusted = 0; | |
- $MissingTrackVolumeFilesDeleted = 0; | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`track_volume` = 0)'; | |
- $SQLquery .= ' AND (`audio_bitrate` > 0)'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / '.number_format(mysql_num_rows($result)).' files for track volume information:<hr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- echo '<script type="text/javascript">if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "'.number_format($MissingTrackVolumeFilesScanned++).'";</script>. '; | |
- flush(); | |
- if (file_exists($row['filename'])) { | |
- | |
- $ThisFileInfo = $getID3->analyze($row['filename']); | |
- if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) { | |
- $MissingTrackVolumeFilesAdjusted++; | |
- $SQLquery = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")'; | |
- mysql_query_safe($SQLquery); | |
- } | |
- | |
- } else { | |
- | |
- $MissingTrackVolumeFilesDeleted++; | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")'; | |
- mysql_query_safe($SQLquery); | |
- | |
- } | |
- } | |
- echo '<hr>Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.<br>'; | |
- echo 'Found track volume information for '.number_format($MissingTrackVolumeFilesAdjusted).' of them (could not find info for '.number_format($MissingTrackVolumeFilesScanned - $MissingTrackVolumeFilesAdjusted).' files; deleted '.number_format($MissingTrackVolumeFilesDeleted).' records of missing files)<hr>'; | |
- | |
-} elseif (!empty($_REQUEST['deadfilescheck'])) { | |
- | |
- $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' GROUP BY `filename`'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $DupesDeleted = 0; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- if ($row['num'] <= 1) { | |
- break; | |
- } | |
- echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">duplicate</font>)'; | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"'; | |
- mysql_query_safe($SQLquery); | |
- $DupesDeleted++; | |
- } | |
- if ($DupesDeleted > 0) { | |
- echo '<hr>Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>'; | |
- } | |
- | |
- $SQLquery = 'SELECT `filename`, `filesize`, `last_modified`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $totalchecked = 0; | |
- $totalremoved = 0; | |
- $previousdir = ''; | |
- while ($row = mysql_fetch_array($result)) { | |
- $totalchecked++; | |
- set_time_limit(30); | |
- $reason = ''; | |
- if (!file_exists($row['filename'])) { | |
- $reason = 'deleted'; | |
- } elseif (filesize($row['filename']) != $row['filesize']) { | |
- $reason = 'filesize changed'; | |
- } elseif (filemtime($row['filename']) != $row['last_modified']) { | |
- if (abs(filemtime($row['filename']) - $row['last_modified']) != 3600) { | |
- // off by exactly one hour == daylight savings time | |
- $reason = 'last-modified time changed'; | |
- } | |
- } | |
- | |
- $thisdir = dirname($row['filename']); | |
- if ($reason) { | |
- | |
- $totalremoved++; | |
- echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">'.$reason.'</font>)'; | |
- flush(); | |
- $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")'; | |
- mysql_query_safe($SQLquery); | |
- | |
- } elseif ($thisdir != $previousdir) { | |
- | |
- echo '. '; | |
- flush(); | |
- | |
- } | |
- $previousdir = $thisdir; | |
- } | |
- | |
- echo '<hr><b>'.number_format($totalremoved).' of '.number_format($totalchecked).' files in database no longer exist, or have been altered since last scan. Removed from database.</b><hr>'; | |
- | |
-} elseif (!empty($_REQUEST['encodedbydistribution'])) { | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- | |
- $SQLquery = 'SELECT `filename`, `comments_id3v2`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`encoder_options` = "'.mysql_real_escape_string($_REQUEST['encodedbydistribution']).'")'; | |
- $result = mysql_query_safe($SQLquery); | |
- $NonBlankEncodedBy = ''; | |
- $BlankEncodedBy = ''; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $CommentArray = unserialize($row['comments_id3v2']); | |
- if (isset($CommentArray['encoded_by'][0])) { | |
- $NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } else { | |
- $BlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- } | |
- echo $NonBlankEncodedBy; | |
- echo $BlankEncodedBy; | |
- exit; | |
- | |
- } elseif (!empty($_REQUEST['showfiles'])) { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">show all</a><br>'; | |
- echo '<table border="1">'; | |
- | |
- $SQLquery = 'SELECT `filename`, `comments_id3v2`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $CommentArray = unserialize($row['comments_id3v2']); | |
- if (($_REQUEST['encodedbydistribution'] == '%') || (!empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0]))) { | |
- echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>'; | |
- } | |
- } | |
- echo '</table>'; | |
- | |
- } else { | |
- | |
- $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $EncodedBy = array(); | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $CommentArray = unserialize($row['comments_id3v2']); | |
- if (isset($CommentArray['encoded_by'][0])) { | |
- if (isset($EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]])) { | |
- $EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]]++; | |
- } else { | |
- $EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]] = 1; | |
- } | |
- } | |
- } | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'&m3u=1').'">.m3u version</a><br>'; | |
- echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>'; | |
- foreach ($EncodedBy as $key => $value) { | |
- echo '<tr><TD VALIGN="TOP"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($key).'&showfiles=1&m3u=1').'">m3u</a></td>'; | |
- echo '<TD VALIGN="TOP"><b>'.$key.'</b></td>'; | |
- echo '<td><table border="0" WIDTH="100%">'; | |
- arsort($value); | |
- foreach ($value as $string => $count) { | |
- echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>'.number_format($count).'</i></td><td> </td>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($string).'&showfiles=1').'">'.$string.'</a></td></tr>'; | |
- } | |
- echo '</table></td></tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['audiobitrates'])) { | |
- | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); | |
- $BitrateDistribution = array(); | |
- $SQLquery = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`audio_bitrate` > 0)'; | |
- $SQLquery .= ' GROUP BY `RoundBitrate`'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- $this_bitrate = getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000); | |
- if (isset($BitrateDistribution[$this_bitrate])) { | |
- $BitrateDistribution[$this_bitrate] += $row['num']; | |
- } else { | |
- $BitrateDistribution[$this_bitrate] = $row['num']; | |
- } | |
- } | |
- | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>Bitrate</th><th>Count</th></tr>'; | |
- foreach ($BitrateDistribution as $Bitrate => $Count) { | |
- echo '<tr>'; | |
- echo '<td align="right">'.round($Bitrate / 1000).' kbps</td>'; | |
- echo '<td align="right">'.number_format($Count).'</td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- | |
-} elseif (!empty($_REQUEST['emptygenres'])) { | |
- | |
- $SQLquery = 'SELECT `fileformat`, `filename`, `genre`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`genre` = "")'; | |
- $SQLquery .= ' OR (`genre` = "Unknown")'; | |
- $SQLquery .= ' OR (`genre` = "Other")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres='.urlencode($_REQUEST['emptygenres']).'&m3u=1').'">.m3u version</a><br>'; | |
- $EmptyGenreCounter = 0; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>m3u</th><th>filename</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) { | |
- $EmptyGenreCounter++; | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '</tr>'; | |
- } | |
- } | |
- echo '</table>'; | |
- echo '<b>'.number_format($EmptyGenreCounter).'</b> files with empty genres'; | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['nonemptycomments'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `comment`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`comment` <> "")'; | |
- $SQLquery .= ' ORDER BY `comment` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- $NonEmptyCommentsCounter = 0; | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments='.urlencode($_REQUEST['nonemptycomments']).'&m3u=1').'">.m3u version</a><br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- $NonEmptyCommentsCounter++; | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- if (strlen(trim($row['comment'])) > 0) { | |
- echo '<td>'.htmlentities($row['comment']).'</td>'; | |
- } else { | |
- echo '<td><i>space</i></td>'; | |
- } | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- echo '<b>'.number_format($NonEmptyCommentsCounter).'</b> files with non-empty comments'; | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['trackzero'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `track`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`track` <> "")'; | |
- $SQLquery .= ' AND ((`track` < "1")'; | |
- $SQLquery .= ' OR (`track` > "99"))'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero='.urlencode($_REQUEST['trackzero']).'&m3u=1').'">.m3u version</a><br>'; | |
- $TrackZeroCounter = 0; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) { | |
- $TrackZeroCounter++; | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.htmlentities($row['track']).'</td>'; | |
- echo '</tr>'; | |
- } | |
- } | |
- echo '</table>'; | |
- echo '<b>'.number_format($TrackZeroCounter).'</b> files with track "zero"'; | |
- | |
- } | |
- | |
- | |
-} elseif (!empty($_REQUEST['titlefeat'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `title`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`title` LIKE "%feat.%")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with "feat." in the title (instead of the artist)<br><br>'; | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat='.urlencode($_REQUEST['titlefeat']).'&m3u=1').'">.m3u version</a><br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.preg_replace('#(feat\. .*)#i', '<b>\\1</b>', htmlentities($row['title'])).'</td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- | |
- | |
-} elseif (!empty($_REQUEST['tracknoalbum'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `track`, `album`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`track` <> "")'; | |
- $SQLquery .= ' AND (`album` = "")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with a track number, but no album<br><br>'; | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum='.urlencode($_REQUEST['tracknoalbum']).'&m3u=1').'">.m3u version</a><br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.htmlentities($row['track']).'</td>'; | |
- echo '<td>'.htmlentities($row['album']).'</td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- | |
- | |
-} elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) { | |
- | |
- echo 'Applying new tags from <b>'.$_REQUEST['synchronizetagsfrom'].'</b> in <b>'.htmlentities($_REQUEST['filename']).'</b><ul>'; | |
- $errors = array(); | |
- if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) { | |
- echo '<li>Sucessfully wrote tags</li>'; | |
- } else { | |
- echo '<li>Tag writing had errors: <ul><li>'.implode('</li><li>', $errors).'</li></ul></li>'; | |
- } | |
- echo '</ul>'; | |
- | |
- | |
-} elseif (!empty($_REQUEST['unsynchronizedtags'])) { | |
- | |
- $NotOKfiles = 0; | |
- $Autofixedfiles = 0; | |
- $FieldsToCompare = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track'); | |
- $TagsToCompare = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false); | |
- $ID3v1FieldLengths = array('title'=>30, 'artist'=>30, 'album'=>30, 'year'=>4, 'genre'=>99, 'comment'=>28); | |
- if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false) { | |
- $TagsToCompare['id3v2'] = true; | |
- } | |
- if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false) { | |
- $TagsToCompare['ape'] = true; | |
- } | |
- if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false) { | |
- $TagsToCompare['lyrics3'] = true; | |
- } | |
- if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false) { | |
- $TagsToCompare['id3v1'] = true; | |
- } | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1').'">Auto-fix empty tags</a><br><br>'; | |
- echo '<div id="Autofixing"></div>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr>'; | |
- echo '<th>View</th>'; | |
- echo '<th>Filename</th>'; | |
- echo '<th>Combined</th>'; | |
- if ($TagsToCompare['id3v2']) { | |
- echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=id3v2&autofixforcedest=A1').'" title="Auto-fix all tags to match ID3v2 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v2?\');">ID3v2</a></th>'; | |
- } | |
- if ($TagsToCompare['ape']) { | |
- echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=21').'" title="Auto-fix all tags to match APE contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match APE?\');">APE</a></th>'; | |
- } | |
- if ($TagsToCompare['lyrics3']) { | |
- echo '<th>Lyrics3</th>'; | |
- } | |
- if ($TagsToCompare['id3v1']) { | |
- echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=2A').'" title="Auto-fix all tags to match ID3v1 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v1?\');">ID3v1</a></th>'; | |
- } | |
- echo '</tr>'; | |
- | |
- $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` = "mp3")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $lastdir = ''; | |
- $serializedCommentsFields = array('all', 'id3v2', 'ape', 'lyrics3', 'id3v1'); | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- if ($lastdir != dirname($row['filename'])) { | |
- echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($lastdir, ENT_QUOTES).'";</script>'; | |
- flush(); | |
- } | |
- | |
- $FileOK = true; | |
- $Mismatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false); | |
- $SemiMatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false); | |
- $EmptyTags = array('id3v2'=>true, 'ape'=>true, 'lyrics3'=>true, 'id3v1'=>true); | |
- | |
- foreach ($serializedCommentsFields as $field) { | |
- $Comments[$field] = array(); | |
- ob_start(); | |
- if ($unserialized = unserialize($row['comments_'.$field])) { | |
- $Comments[$field] = $unserialized; | |
- } | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- } | |
- | |
- if (isset($Comments['ape']['tracknumber'])) { | |
- $Comments['ape']['track'] = $Comments['ape']['tracknumber']; | |
- unset($Comments['ape']['tracknumber']); | |
- } | |
- if (isset($Comments['ape']['track_number'])) { | |
- $Comments['ape']['track'] = $Comments['ape']['track_number']; | |
- unset($Comments['ape']['track_number']); | |
- } | |
- if (isset($Comments['id3v2']['track_number'])) { | |
- $Comments['id3v2']['track'] = $Comments['id3v2']['track_number']; | |
- unset($Comments['id3v2']['track_number']); | |
- } | |
- if (!empty($Comments['all']['track'])) { | |
- $besttrack = ''; | |
- foreach ($Comments['all']['track'] as $key => $value) { | |
- if (strlen($value) > strlen($besttrack)) { | |
- $besttrack = $value; | |
- } | |
- } | |
- $Comments['all']['track'] = array(0=>$besttrack); | |
- } | |
- | |
- $ThisLine = '<tr>'; | |
- $ThisLine .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">view</a></td>'; | |
- $ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- $tagvalues = ''; | |
- foreach ($FieldsToCompare as $fieldname) { | |
- $tagvalues .= $fieldname.' = '.(!empty($Comments['all'][$fieldname]) ? implode(" \n", $Comments['all'][$fieldname]) : '')." \n"; | |
- } | |
- $ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom=all&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" target="retagwindow">all</a></td>'; | |
- foreach ($TagsToCompare as $tagtype => $CompareThisTagType) { | |
- if ($CompareThisTagType) { | |
- $tagvalues = ''; | |
- foreach ($FieldsToCompare as $fieldname) { | |
- | |
- if ($tagtype == 'id3v1') { | |
- | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); | |
- if (($fieldname == 'genre') && !empty($Comments['all'][$fieldname][0]) && !getid3_id3v1::LookupGenreID($Comments['all'][$fieldname][0])) { | |
- | |
- // non-standard genres can never match, so just ignore | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- | |
- } elseif ($fieldname == 'comment') { | |
- | |
- if (isset($Comments[$tagtype][$fieldname][0]) && isset($Comments['all'][$fieldname][0]) && (rtrim(substr($Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr($Comments['all'][$fieldname][0], 0, 28)))) { | |
- $tagvalues .= $fieldname.' = [['.$Comments[$tagtype][$fieldname][0].']]'."\n"; | |
- if (trim(strtolower(RemoveAccents(substr($Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr($Comments['all'][$fieldname][0], 0, 28))))) { | |
- $SemiMatched[$tagtype] = true; | |
- } else { | |
- $Mismatched[$tagtype] = true; | |
- } | |
- $FileOK = false; | |
- } else { | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- } | |
- | |
- } elseif ($fieldname == 'track') { | |
- | |
- // intval('01/20') == intval('1') | |
- $trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : ''); | |
- $trackB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : ''); | |
- if (intval($trackA) != intval($trackB)) { | |
- $tagvalues .= $fieldname.' = [['.$trackA.']]'."\n"; | |
- $Mismatched[$tagtype] = true; | |
- $FileOK = false; | |
- } else { | |
- $tagvalues .= $fieldname.' = '.$trackA."\n"; | |
- } | |
- | |
- } elseif ((isset($Comments[$tagtype][$fieldname][0]) ? rtrim(substr($Comments[$tagtype][$fieldname][0], 0, 30)) : '') != (isset($Comments['all'][$fieldname][0]) ? rtrim(substr($Comments['all'][$fieldname][0], 0, 30)) : '')) { | |
- | |
- $tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n"; | |
- if (strtolower(RemoveAccents(trim(substr((isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : ''), 0, 30)))) == strtolower(RemoveAccents(trim(substr((isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : ''), 0, 30))))) { | |
- $SemiMatched[$tagtype] = true; | |
- } else { | |
- $Mismatched[$tagtype] = true; | |
- } | |
- $FileOK = false; | |
- if (!empty($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } else { | |
- | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } | |
- | |
- } elseif (($tagtype == 'ape') && ($fieldname == 'year')) { | |
- | |
- if (((isset($Comments['ape']['date'][0]) ? $Comments['ape']['date'][0] : '') != (isset($Comments['all']['year'][0]) ? $Comments['all']['year'][0] : '')) && ((isset($Comments['ape']['year'][0]) ? $Comments['ape']['year'][0] : '') != (isset($Comments['all']['year'][0]) ? $Comments['all']['year'][0] : ''))) { | |
- | |
- $tagvalues .= $fieldname.' = [['.(isset($Comments['ape']['date'][0]) ? $Comments['ape']['date'][0] : '').']]'."\n"; | |
- $Mismatched[$tagtype] = true; | |
- $FileOK = false; | |
- if (isset($Comments['ape']['date'][0]) && (strlen(trim($Comments['ape']['date'][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } else { | |
- | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } | |
- | |
- } elseif (($fieldname == 'genre') && !empty($Comments['all'][$fieldname]) && !empty($Comments[$tagtype][$fieldname]) && in_array($Comments[$tagtype][$fieldname][0], $Comments['all'][$fieldname])) { | |
- | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } elseif ((isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '') != (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '')) { | |
- | |
- $skiptracknumberfield = false; | |
- switch ($fieldname) { | |
- case 'track': | |
- case 'tracknumber': | |
- case 'track_number': | |
- $trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : ''); | |
- $trackB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : ''); | |
- if (intval($trackA) == intval($trackB)) { | |
- $skiptracknumberfield = true; | |
- } | |
- break; | |
- } | |
- if (!$skiptracknumberfield) { | |
- $tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n"; | |
- $tagA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : ''); | |
- $tagB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : ''); | |
- if (trim(strtolower(RemoveAccents($tagA))) == trim(strtolower(RemoveAccents($tagB)))) { | |
- $SemiMatched[$tagtype] = true; | |
- } else { | |
- $Mismatched[$tagtype] = true; | |
- } | |
- $FileOK = false; | |
- if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- } | |
- | |
- } else { | |
- | |
- $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n"; | |
- if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) { | |
- $EmptyTags[$tagtype] = false; | |
- } | |
- | |
- } | |
- } | |
- | |
- if ($EmptyTags[$tagtype]) { | |
- $FileOK = false; | |
- $ThisLine .= '<td bgcolor="#0099cc">'; | |
- } elseif ($SemiMatched[$tagtype]) { | |
- $ThisLine .= '<td bgcolor="#ff9999">'; | |
- } elseif ($Mismatched[$tagtype]) { | |
- $ThisLine .= '<td bgcolor="#ff0000">'; | |
- } else { | |
- $ThisLine .= '<td bgcolor="#00cc00">'; | |
- } | |
- $ThisLine .= '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom='.$tagtype.'&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" TARGET="retagwindow">'.$tagtype.'</a>'; | |
- $ThisLine .= '</td>'; | |
- } | |
- } | |
- $ThisLine .= '</tr>'; | |
- | |
- if (!$FileOK) { | |
- $NotOKfiles++; | |
- | |
- echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($row['filename'], ENT_QUOTES).'";</script>'; | |
- flush(); | |
- | |
- if (!empty($_REQUEST['autofix'])) { | |
- | |
- $AnyMismatched = false; | |
- foreach ($Mismatched as $key => $value) { | |
- if ($value && ($EmptyTags["$key"] === false)) { | |
- $AnyMismatched = true; | |
- } | |
- } | |
- if ($AnyMismatched && empty($_REQUEST['autofixforcesource'])) { | |
- | |
- echo $ThisLine; | |
- | |
- } else { | |
- | |
- $TagsToSynch = ''; | |
- foreach ($EmptyTags as $key => $value) { | |
- if ($value) { | |
- switch ($key) { | |
- case 'id3v1': | |
- $TagsToSynch .= '1'; | |
- break; | |
- case 'id3v2': | |
- $TagsToSynch .= '2'; | |
- break; | |
- case 'ape': | |
- $TagsToSynch .= 'A'; | |
- break; | |
- } | |
- } | |
- } | |
- | |
- $autofixforcesource = (!empty($_REQUEST['autofixforcesource']) ? $_REQUEST['autofixforcesource'] : 'all'); | |
- $TagsToSynch = (!empty($_REQUEST['autofixforcedest']) ? $_REQUEST['autofixforcedest'] : $TagsToSynch); | |
- | |
- $errors = array(); | |
- if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors)) { | |
- $Autofixedfiles++; | |
- echo '<tr bgcolor="#00CC00">'; | |
- } else { | |
- echo '<tr bgcolor="#FF0000">'; | |
- } | |
- echo '<td> </th>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'" title="'.htmlentities(implode("\n", $errors), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td><table border="0">'; | |
- echo '<tr><td><b>'.$TagsToSynch.'</b></td></tr>'; | |
- echo '</table></td></tr>'; | |
- } | |
- | |
- } else { | |
- | |
- echo $ThisLine; | |
- | |
- } | |
- } | |
- } | |
- | |
- echo '</table><br>'; | |
- echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "";</script>'; | |
- echo 'Found <b>'.number_format($NotOKfiles).'</b> files with unsynchronized tags, and auto-fixed '.number_format($Autofixedfiles).' of them.'; | |
- | |
-} elseif (!empty($_REQUEST['filenamepattern'])) { | |
- | |
- $patterns['A'] = 'artist'; | |
- $patterns['T'] = 'title'; | |
- $patterns['M'] = 'album'; | |
- $patterns['N'] = 'track'; | |
- $patterns['G'] = 'genre'; | |
- $patterns['R'] = 'remix'; | |
- | |
- $FieldsToUse = explode(' ', wordwrap(preg_replace('#[^A-Z]#i', '', $_REQUEST['filenamepattern']), 1, ' ', 1)); | |
- //$FieldsToUse = explode(' ', wordwrap($_REQUEST['filenamepattern'], 1, ' ', 1)); | |
- foreach ($FieldsToUse as $FieldID) { | |
- $FieldNames[] = $patterns["$FieldID"]; | |
- } | |
- | |
- $SQLquery = 'SELECT `filename`, `fileformat`, '.implode(', ', $FieldNames); | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Files that do not match naming pattern: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&autofix=1').'">auto-fix</a>)<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>view</th><th>Why</th><td><b>Actual filename</b><br>(click to play/edit file)</td><td><b>Correct filename (based on tags)</b>'.(empty($_REQUEST['autofix']) ? '<br>(click to rename file to this)' : '').'</td></tr>'; | |
- $nonmatchingfilenames = 0; | |
- $Pattern = $_REQUEST['filenamepattern']; | |
- $PatternLength = strlen($Pattern); | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(10); | |
- $PatternFilename = ''; | |
- for ($i = 0; $i < $PatternLength; $i++) { | |
- if (isset($patterns[$Pattern{$i}])) { | |
- $PatternFilename .= trim(strtr($row[$patterns[$Pattern{$i}]], ':\\*<>|', ';-§´ª¶'), ' '); | |
- } else { | |
- $PatternFilename .= $Pattern{$i}; | |
- } | |
- } | |
- | |
- // Replace "~" with "-" if characters immediately before and after are both numbers, | |
- // "/" has been replaced with "~" above which is good for multi-song medley dividers, | |
- // but for things like 24/7, 7/8ths, etc it looks better if it's 24-7, 7-8ths, etc. | |
- $PatternFilename = preg_replace('#([ a-z]+)/([ a-z]+)#i', '\\1~\\2', $PatternFilename); | |
- $PatternFilename = str_replace('/', '◊', $PatternFilename); | |
- | |
- $PatternFilename = str_replace('?', 'ø', $PatternFilename); | |
- $PatternFilename = str_replace(' "', ' ì', $PatternFilename); | |
- $PatternFilename = str_replace('("', '(ì', $PatternFilename); | |
- $PatternFilename = str_replace('-"', '-ì', $PatternFilename); | |
- $PatternFilename = str_replace('" ', 'î ', $PatternFilename.' '); | |
- $PatternFilename = str_replace('"', 'î', $PatternFilename); | |
- $PatternFilename = str_replace(' ', ' ', $PatternFilename); | |
- | |
- | |
- $ParenthesesPairs = array('()', '[]', '{}'); | |
- foreach ($ParenthesesPairs as $pair) { | |
- | |
- // multiple remixes are stored tab-seperated in the database. | |
- // change "{2000 Version\tSomebody Remix}" into "{2000 Version} {Somebody Remix}" | |
- while (preg_match('#^(.*)'.preg_quote($pair{0}).'([^'.preg_quote($pair{1}).']*)('."\t".')([^'.preg_quote($pair{0}).']*)'.preg_quote($pair{1}).'#', $PatternFilename, $matches)) { | |
- $PatternFilename = $matches[1].$pair{0}.$matches[2].$pair{1}.' '.$pair{0}.$matches[4].$pair{1}; | |
- } | |
- | |
- // remove empty parenthesized pairs (probably where no track numbers, remix version, etc) | |
- $PatternFilename = preg_replace('#'.preg_quote($pair).'#', '', $PatternFilename); | |
- | |
- // "[01] - Title With No Artist.mp3" ==> "[01] Title With No Artist.mp3" | |
- $PatternFilename = preg_replace('#'.preg_quote($pair{1}).' +\- #', $pair{1}.' ', $PatternFilename); | |
- | |
- } | |
- | |
- // get rid of leading & trailing spaces if end items (artist or title for example) are missing | |
- $PatternFilename = trim($PatternFilename, ' -'); | |
- | |
- if (!$PatternFilename) { | |
- // no tags to create a filename from -- skip this file | |
- continue; | |
- } | |
- $PatternFilename .= '.'.$row['fileformat']; | |
- | |
- $ActualFilename = basename($row['filename']); | |
- if ($ActualFilename != $PatternFilename) { | |
- | |
- $NotMatchedReasons = ''; | |
- if (strtolower($ActualFilename) === strtolower($PatternFilename)) { | |
- $NotMatchedReasons .= 'Aa '; | |
- } elseif (RemoveAccents($ActualFilename) === RemoveAccents($PatternFilename)) { | |
- $NotMatchedReasons .= 'Èe '; | |
- } | |
- | |
- | |
- $actualExt = '.'.fileextension($ActualFilename); | |
- $patternExt = '.'.fileextension($PatternFilename); | |
- $ActualFilenameNoExt = (($actualExt != '.') ? substr($ActualFilename, 0, 0 - strlen($actualExt)) : $ActualFilename); | |
- $PatternFilenameNoExt = (($patternExt != '.') ? substr($PatternFilename, 0, 0 - strlen($patternExt)) : $PatternFilename); | |
- | |
- if (strpos($PatternFilenameNoExt, $ActualFilenameNoExt) !== false) { | |
- $DifferenceBoldedName = str_replace($ActualFilenameNoExt, '</b>'.$ActualFilenameNoExt.'<b>', $PatternFilenameNoExt); | |
- } else { | |
- $ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt)); | |
- for ($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset++) { | |
- if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset}) { | |
- break; | |
- } | |
- } | |
- $DifferenceBoldedName = '</b>'.substr($PatternFilenameNoExt, 0, $DifferenceOffset).'<b>'.substr($PatternFilenameNoExt, $DifferenceOffset); | |
- } | |
- $DifferenceBoldedName .= (($actualExt == $patternExt) ? '</b>'.$patternExt.'<b>' : $patternExt); | |
- | |
- | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">view</a></td>'; | |
- echo '<td> '.$NotMatchedReasons.'</td>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($ActualFilename).'</a></td>'; | |
- | |
- if (!empty($_REQUEST['autofix'])) { | |
- | |
- $results = ''; | |
- if (RenameFileFromTo($row['filename'], dirname($row['filename']).'/'.$PatternFilename, $results)) { | |
- echo '<TD BGCOLOR="#009900">'; | |
- } else { | |
- echo '<TD BGCOLOR="#FF0000">'; | |
- } | |
- echo '<b>'.$DifferenceBoldedName.'</b></td>'; | |
- | |
- | |
- } else { | |
- | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&renamefilefrom='.urlencode($row['filename']).'&renamefileto='.urlencode(dirname($row['filename']).'/'.$PatternFilename)).'" title="'.htmlentities(basename($row['filename'])."\n".basename($PatternFilename), ENT_QUOTES).'" target="renamewindow">'; | |
- echo '<b>'.$DifferenceBoldedName.'</b></a></td>'; | |
- | |
- } | |
- echo '</tr>'; | |
- | |
- $nonmatchingfilenames++; | |
- } | |
- } | |
- echo '</table><br>'; | |
- echo 'Found '.number_format($nonmatchingfilenames).' files that do not match naming pattern<br>'; | |
- | |
- | |
-} elseif (!empty($_REQUEST['encoderoptionsdistribution'])) { | |
- | |
- if (isset($_REQUEST['showtagfiles'])) { | |
- $SQLquery = 'SELECT `filename`, `encoder_options` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`encoder_options` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")'; | |
- $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Show all Encoder Options</a><hr>'; | |
- echo 'Files with Encoder Options <b>'.$_REQUEST['showtagfiles'].'</b>:<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.$row['encoder_options'].'</td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- | |
- } elseif (!isset($_REQUEST['m3u'])) { | |
- | |
- $SQLquery = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' GROUP BY `encoder_options`'; | |
- $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC, `num` DESC, `encoder_options` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Files with Encoder Options:<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>Encoder Options</th><th>Count</th><th>M3U</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td>'.$row['encoder_options'].'</td>'; | |
- echo '<TD ALIGN="RIGHT"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '')).'">'.number_format($row['num']).'</a></td>'; | |
- echo '<TD ALIGN="RIGHT"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '').'&m3u=.m3u').'">m3u</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['tagtypes'])) { | |
- | |
- if (!isset($_REQUEST['m3u'])) { | |
- $SQLquery = 'SELECT `tags`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' GROUP BY `tags`'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Files with tags:<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- echo '<tr><th>Tags</th><th>Count</th><th>M3U</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td>'.$row['tags'].'</td>'; | |
- echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '')).'">'.number_format($row['num']).'</a></td>'; | |
- echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '').'&m3u=.m3u').'">m3u</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- } | |
- | |
- if (isset($_REQUEST['showtagfiles'])) { | |
- $SQLquery = 'SELECT `filename`, `tags` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`tags` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")'; | |
- $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.$row['tags'].'</td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- } | |
- | |
- | |
-} elseif (!empty($_REQUEST['md5datadupes'])) { | |
- | |
- $OtherFormats = ''; | |
- $AVFormats = ''; | |
- | |
- $SQLquery = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`md5_data` <> "")'; | |
- $SQLquery .= ' GROUP BY `md5_data`'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) { | |
- set_time_limit(30); | |
- | |
- $filenames = array(); | |
- $tags = array(); | |
- $md5_data = array(); | |
- $SQLquery = 'SELECT `fileformat`, `filename`, `tags`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`md5_data` = "'.mysql_real_escape_string($row['md5_data']).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result2 = mysql_query_safe($SQLquery); | |
- while ($row2 = mysql_fetch_array($result2)) { | |
- $thisfileformat = $row2['fileformat']; | |
- $filenames[] = $row2['filename']; | |
- $tags[] = $row2['tags']; | |
- $md5_data[] = $row['md5_data']; | |
- } | |
- | |
- $thisline = '<tr>'; | |
- $thisline .= '<TD VALIGN="TOP" style="font-family: monospace;">'.implode('<br>', $md5_data).'</td>'; | |
- $thisline .= '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $tags).'</td>'; | |
- $thisline .= '<TD VALIGN="TOP">'.implode('<br>', $filenames).'</td>'; | |
- $thisline .= '</tr>'; | |
- | |
- if (in_array($thisfileformat, $IgnoreNoTagFormats)) { | |
- $OtherFormats .= $thisline; | |
- } else { | |
- $AVFormats .= $thisline; | |
- } | |
- } | |
- echo 'Duplicated MD5_DATA (Audio/Video files):<table border="1" cellspacing="0" cellpadding="2">'; | |
- echo $AVFormats.'</table><hr>'; | |
- echo 'Duplicated MD5_DATA (Other files):<table border="1" cellspacing="0" cellpadding="2">'; | |
- echo $OtherFormats.'</table><hr>'; | |
- | |
- | |
-} elseif (!empty($_REQUEST['artisttitledupes'])) { | |
- | |
- if (isset($_REQUEST['m3uartist']) && isset($_REQUEST['m3utitle'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($_REQUEST['m3uartist']).'")'; | |
- $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($_REQUEST['m3utitle']).'")'; | |
- $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } | |
- | |
- $SQLquery = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`artist` <> "")'; | |
- $SQLquery .= ' AND (`title` <> "")'; | |
- $SQLquery .= ' GROUP BY `artist`, `title`'.(!empty($_REQUEST['samemix']) ? ', `remix`' : ''); | |
- $SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $uniquetitles = 0; | |
- $uniquefiles = 0; | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) { | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")'; | |
- $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")'; | |
- if (!empty($_REQUEST['samemix'])) { | |
- $SQLquery .= ' AND (`remix` = "'.mysql_real_escape_string($row['remix']).'")'; | |
- } | |
- $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; | |
- $result2 = mysql_query_safe($SQLquery); | |
- while ($row2 = mysql_fetch_array($result2)) { | |
- echo WindowsShareSlashTranslate($row2['filename'])."\n"; | |
- } | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo 'Duplicated aritst + title: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1').'">Identical Mix/Version only</a>)<br>'; | |
- echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&m3u=.m3u').'">.m3u version</a>)<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="2">'; | |
- echo '<tr><th colspan="3"> </th><th>Artist</th><th>Title</th><th>Version</th><th> </th><th> </th><th>Filename</th></tr>'; | |
- | |
- while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) { | |
- $uniquetitles++; | |
- set_time_limit(30); | |
- | |
- $filenames = array(); | |
- $artists = array(); | |
- $titles = array(); | |
- $remixes = array(); | |
- $bitrates = array(); | |
- $playtimes = array(); | |
- $SQLquery = 'SELECT `filename`, `artist`, `title`, `remix`, `audio_bitrate`, `vbr_method`, `playtime_seconds`, `encoder_options`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")'; | |
- $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")'; | |
- $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC'; | |
- $result2 = mysql_query_safe($SQLquery); | |
- while ($row2 = mysql_fetch_array($result2)) { | |
- $uniquefiles++; | |
- $filenames[] = $row2['filename']; | |
- $artists[] = $row2['artist']; | |
- $titles[] = $row2['title']; | |
- $remixes[] = $row2['remix']; | |
- if ($row2['vbr_method']) { | |
- $bitrates[] = '<B'.($row2['encoder_options'] ? ' style="text-decoration: underline; cursor: help;" title="'.$row2['encoder_options'] : '').'">'.BitrateText($row2['audio_bitrate'] / 1000).'</b>'; | |
- } else { | |
- $bitrates[] = BitrateText($row2['audio_bitrate'] / 1000); | |
- } | |
- $playtimes[] = getid3_lib::PlaytimeString($row2['playtime_seconds']); | |
- } | |
- | |
- echo '<tr>'; | |
- echo '<TD NOWRAP VALIGN="TOP">'; | |
- foreach ($filenames as $file) { | |
- echo '<a href="'.htmlentities('demo.browse.php?deletefile='.urlencode($file).'&noalert=1').'" onClick="return confirm(\'Are you sure you want to delete '.addslashes($file).'? \n(this action cannot be un-done)\');" title="'.htmlentities('Permanently delete '."\n".$file, ENT_QUOTES).'" target="deletedupewindow">delete</a><br>'; | |
- } | |
- echo '</td>'; | |
- echo '<TD NOWRAP VALIGN="TOP">'; | |
- foreach ($filenames as $file) { | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($file)).'">play</a><br>'; | |
- } | |
- echo '</td>'; | |
- echo '<TD VALIGN="MIDDLE" ALIGN="CENTER" ><a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&m3uartist='.urlencode($artists[0]).'&m3utitle='.urlencode($titles[0])).'">play all</a></td>'; | |
- echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $artists).'</td>'; | |
- echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $titles).'</td>'; | |
- echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $remixes).'</td>'; | |
- echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $bitrates).'</td>'; | |
- echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $playtimes).'</td>'; | |
- | |
- echo '<TD VALIGN="TOP" NOWRAP ALIGN="LEFT"><table border="0" cellspacing="0" cellpadding="0">'; | |
- foreach ($filenames as $file) { | |
- echo '<tr><TD NOWRAP ALIGN="RIGHT"><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($file)).'"><span style="color: #339966;">'.dirname($file).'/</span>'.basename($file).'</a></td></tr>'; | |
- } | |
- echo '</table></td>'; | |
- | |
- echo '</tr>'; | |
- } | |
- | |
- } | |
- echo '</table>'; | |
- echo number_format($uniquefiles).' files with '.number_format($uniquetitles).' unique <i>aritst + title</i><br>'; | |
- echo '<hr>'; | |
- | |
-} elseif (!empty($_REQUEST['filetypelist'])) { | |
- | |
- list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']); | |
- $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` = "'.mysql_real_escape_string($fileformat).'")'; | |
- $SQLquery .= ' AND (`audio_dataformat` = "'.mysql_real_escape_string($audioformat).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Files of format <b>'.$fileformat.'.'.$audioformat.'</b>:<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>file</th><th>audio</th><th>filename</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td>'.$row['fileformat'].'</td>'; | |
- echo '<td>'.$row['audio_dataformat'].'</td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- | |
-} elseif (!empty($_REQUEST['trackinalbum'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `album`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`album` LIKE "% [%")'; | |
- $SQLquery .= ' ORDER BY `album` ASC, `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } elseif (!empty($_REQUEST['autofix'])) { | |
- | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); | |
- | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $ThisFileInfo = $getID3->analyze($filename); | |
- getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
- if (!empty($ThisFileInfo['tags'])) { | |
- | |
- $Album = trim(str_replace(strstr($ThisFileInfo['comments']['album'][0], ' ['), '', $ThisFileInfo['comments']['album'][0])); | |
- $Track = (string) intval(str_replace(' [', '', str_replace(']', '', strstr($ThisFileInfo['comments']['album'][0], ' [')))); | |
- if ($Track == '0') { | |
- $Track = ''; | |
- } | |
- if ($Album && $Track) { | |
- echo '<hr>'.htmlentities($row['filename']).'<br>'; | |
- echo '<i>'.htmlentities($Album).'</i> (track #'.$Track.')<br>'; | |
- echo '<b>ID3v2:</b> '.(RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!').', '; | |
- $WriteID3v1_title = (isset($ThisFileInfo['comments']['title'][0]) ? $ThisFileInfo['comments']['title'][0] : ''); | |
- $WriteID3v1_artist = (isset($ThisFileInfo['comments']['artist'][0]) ? $ThisFileInfo['comments']['artist'][0] : ''); | |
- $WriteID3v1_year = (isset($ThisFileInfo['comments']['year'][0]) ? $ThisFileInfo['comments']['year'][0] : ''); | |
- $WriteID3v1_comment = (isset($ThisFileInfo['comments']['comment'][0]) ? $ThisFileInfo['comments']['comment'][0] : ''); | |
- $WriteID3v1_genreid = (isset($ThisFileInfo['comments']['genreid'][0]) ? $ThisFileInfo['comments']['genreid'][0] : ''); | |
- echo '<b>ID3v1:</b> '.(WriteID3v1($row['filename'], $WriteID3v1_title, $WriteID3v1_artist, $Album, $WriteID3v1_year, $WriteID3v1_comment, $WriteID3v1_genreid, $Track, false) ? 'updated' : 'UPDATE FAILED').'<br>'; | |
- } else { | |
- echo ' . '; | |
- } | |
- | |
- } else { | |
- | |
- echo '<hr>FAILED<br>'.htmlentities($row['filename']).'<hr>'; | |
- | |
- } | |
- flush(); | |
- } | |
- | |
- } else { | |
- | |
- echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with <b>[??]</b>-format track numbers in album field:<br>'; | |
- if (mysql_num_rows($result) > 0) { | |
- echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&m3u=.m3u').'">.m3u version</a>)<br>'; | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&autofix=1').'">Try to auto-fix</a><br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="4">'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td>'.$row['album'].'</td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- } | |
- echo '<hr>'; | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['fileextensions'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $invalidextensionfiles = 0; | |
- $invalidextensionline = '<table border="1" cellspacing="0" cellpadding="4">'; | |
- $invalidextensionline .= '<tr><th>file</th><th>audio</th><th>video</th><th>tags</th><th>actual</th><th>correct</th><th>filename</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- | |
- $acceptableextensions = AcceptableExtensions($row['fileformat'], $row['audio_dataformat'], $row['video_dataformat']); | |
- $actualextension = strtolower(fileextension($row['filename'])); | |
- if ($acceptableextensions && !in_array($actualextension, $acceptableextensions)) { | |
- $invalidextensionfiles++; | |
- | |
- $invalidextensionline .= '<tr>'; | |
- $invalidextensionline .= '<td>'.$row['fileformat'].'</td>'; | |
- $invalidextensionline .= '<td>'.$row['audio_dataformat'].'</td>'; | |
- $invalidextensionline .= '<td>'.$row['video_dataformat'].'</td>'; | |
- $invalidextensionline .= '<td>'.$row['tags'].'</td>'; | |
- $invalidextensionline .= '<td>'.$actualextension.'</td>'; | |
- $invalidextensionline .= '<td>'.implode('; ', $acceptableextensions).'</td>'; | |
- $invalidextensionline .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- $invalidextensionline .= '</tr>'; | |
- } | |
- } | |
- $invalidextensionline .= '</table><hr>'; | |
- echo number_format($invalidextensionfiles).' files with incorrect filename extension:<br>'; | |
- echo $invalidextensionline; | |
- | |
-} elseif (isset($_REQUEST['genredistribution'])) { | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (BINARY `genre` = "'.$_REQUEST['genredistribution'].'")'; | |
- $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- if ($_REQUEST['genredistribution'] == '%') { | |
- | |
- $SQLquery = 'SELECT COUNT(*) AS `num`, `genre`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")'; | |
- $SQLquery .= ' GROUP BY `genre`'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); | |
- echo '<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>Count</th><th>Genre</th><th>m3u</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- $GenreID = getid3_id3v1::LookupGenreID($row['genre']); | |
- if (is_numeric($GenreID)) { | |
- echo '<tr bgcolor="#00FF00;">'; | |
- } else { | |
- echo '<tr bgcolor="#FF9999;">'; | |
- } | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode($row['genre'])).'">'.number_format($row['num']).'</a></td>'; | |
- echo '<td nowrap>'.str_replace("\t", '<br>', $row['genre']).'</td>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3u=.m3u&genredistribution='.urlencode($row['genre'])).'">.m3u</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- | |
- } else { | |
- | |
- $SQLquery = 'SELECT `filename`, `genre`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`genre` LIKE "'.mysql_real_escape_string($_REQUEST['genredistribution']).'")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">All Genres</a><br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>Genre</th><th>m3u</th><th>Filename</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<TD NOWRAP>'.str_replace("\t", '<br>', $row['genre']).'</td>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- | |
- } | |
- | |
- | |
- } | |
- | |
-} elseif (!empty($_REQUEST['formatdistribution'])) { | |
- | |
- $SQLquery = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`'; | |
- $SQLquery .= ' ORDER BY `num` DESC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'File format distribution:<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>Number</th><th>Format</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<TD ALIGN="RIGHT">'.number_format($row['num']).'</td>'; | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filetypelist='.$row['fileformat'].'|'.$row['audio_dataformat']).'">'.($row['fileformat'] ? $row['fileformat'] : '<i>unknown</i>').(($row['audio_dataformat'] && ($row['audio_dataformat'] != $row['fileformat'])) ? '.'.$row['audio_dataformat'] : '').'</a></td>'; | |
- echo '</tr>'; | |
- } | |
- echo '</table><hr>'; | |
- | |
-} elseif (!empty($_REQUEST['errorswarnings'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `error`, `warning`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`error` <> "")'; | |
- $SQLquery .= ' OR (`warning` <> "")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- | |
- if (!empty($_REQUEST['m3u'])) { | |
- | |
- header('Content-type: audio/x-mpegurl'); | |
- echo '#EXTM3U'."\n"; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo WindowsShareSlashTranslate($row['filename'])."\n"; | |
- } | |
- exit; | |
- | |
- } else { | |
- | |
- echo number_format(mysql_num_rows($result)).' files with errors or warnings:<br>'; | |
- echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1&m3u=.m3u').'">.m3u version</a>)<br>'; | |
- echo '<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>Filename</th><th>Error</th><th>Warning</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>'; | |
- echo '<td>'.(!empty($row['error']) ? '<li>'.str_replace("\t", '<li>', htmlentities($row['error'])).'</li>' : ' ').'</td>'; | |
- echo '<td>'.(!empty($row['warning']) ? '<li>'.str_replace("\t", '<li>', htmlentities($row['warning'])).'</li>' : ' ').'</td>'; | |
- echo '</tr>'; | |
- } | |
- } | |
- echo '</table><hr>'; | |
- | |
-} elseif (!empty($_REQUEST['fixid3v1padding'])) { | |
- | |
- getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.id3v1.php', __FILE__, true); | |
- $id3v1_writer = new getid3_write_id3v1; | |
- | |
- $SQLquery = 'SELECT `filename`, `error`, `warning`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` = "mp3")'; | |
- $SQLquery .= ' AND (`warning` <> "")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- $totaltofix = mysql_num_rows($result); | |
- $rowcounter = 0; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- if (strpos($row['warning'], 'Some ID3v1 fields do not use NULL characters for padding') !== false) { | |
- set_time_limit(30); | |
- $id3v1_writer->filename = $row['filename']; | |
- echo ($id3v1_writer->FixID3v1Padding() ? '<span style="color: #009900;">fixed - ' : '<span style="color: #FF0000;">error - '); | |
- } else { | |
- echo '<span style="color: #0000FF;">No error? - '; | |
- } | |
- echo '['.++$rowcounter.' / '.$totaltofix.'] '; | |
- echo htmlentities($row['filename']).'</span><br>'; | |
- flush(); | |
- } | |
- | |
-} elseif (!empty($_REQUEST['vbrmethod'])) { | |
- | |
- if ($_REQUEST['vbrmethod'] == '1') { | |
- | |
- $SQLquery = 'SELECT COUNT(*) AS `num`, `vbr_method`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' GROUP BY `vbr_method`'; | |
- $SQLquery .= ' ORDER BY `vbr_method`'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'VBR methods:<table border="1" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th>Count</th><th>VBR Method</th></tr>'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr>'; | |
- echo '<TD ALIGN="RIGHT">'.htmlentities(number_format($row['num'])).'</td>'; | |
- if ($row['vbr_method']) { | |
- echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod='.$row['vbr_method'], ENT_QUOTES).'">'.htmlentities($row['vbr_method']).'</a></td>'; | |
- } else { | |
- echo '<td><i>CBR</i></td>'; | |
- } | |
- echo '</tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } else { | |
- | |
- $SQLquery = 'SELECT `filename`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`vbr_method` = "'.mysql_real_escape_string($_REQUEST['vbrmethod']).'")'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo number_format(mysql_num_rows($result)).' files with VBR_method of "'.$_REQUEST['vbrmethod'].'":<table border="1" cellspacing="0" cellpadding="3">'; | |
- while ($row = mysql_fetch_array($result)) { | |
- echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>'; | |
- echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>'; | |
- } | |
- echo '</table>'; | |
- | |
- } | |
- echo '<hr>'; | |
- | |
-} elseif (!empty($_REQUEST['correctcase'])) { | |
- | |
- $SQLquery = 'SELECT `filename`, `fileformat`'; | |
- $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
- $SQLquery .= ' WHERE (`fileformat` <> "")'; | |
- $SQLquery .= ' ORDER BY `filename` ASC'; | |
- $result = mysql_query_safe($SQLquery); | |
- echo 'Copy and paste the following into a DOS batch file. You may have to run this script more than once to catch all the changes (remember to scan for deleted/changed files and rescan directory between scans)<hr>'; | |
- echo '<PRE>'; | |
- $lastdir = ''; | |
- while ($row = mysql_fetch_array($result)) { | |
- set_time_limit(30); | |
- $CleanedFilename = CleanUpFileName($row['filename']); | |
- if ($row['filename'] != $CleanedFilename) { | |
- if (strtolower($lastdir) != strtolower(str_replace('/', '\\', dirname($row['filename'])))) { | |
- $lastdir = str_replace('/', '\\', dirname($row['filename'])); | |
- echo 'cd "'.$lastdir.'"'."\n"; | |
- } | |
- echo 'ren "'.basename($row['filename']).'" "'.basename(CleanUpFileName($row['filename'])).'"'."\n"; | |
- } | |
- } | |
- echo '</PRE>'; | |
- echo '<hr>'; | |
- | |
-} | |
- | |
-function CleanUpFileName($filename) { | |
- $DirectoryName = dirname($filename); | |
- $FileExtension = fileextension(basename($filename)); | |
- $BaseFilename = basename($filename, '.'.$FileExtension); | |
- | |
- $BaseFilename = strtolower($BaseFilename); | |
- $BaseFilename = str_replace('_', ' ', $BaseFilename); | |
- //$BaseFilename = str_replace('-', ' - ', $BaseFilename); | |
- $BaseFilename = str_replace('(', ' (', $BaseFilename); | |
- $BaseFilename = str_replace('( ', '(', $BaseFilename); | |
- $BaseFilename = str_replace(')', ') ', $BaseFilename); | |
- $BaseFilename = str_replace(' )', ')', $BaseFilename); | |
- $BaseFilename = str_replace(' \'\'', ' ì', $BaseFilename); | |
- $BaseFilename = str_replace('\'\' ', 'î ', $BaseFilename); | |
- $BaseFilename = str_replace(' vs ', ' vs. ', $BaseFilename); | |
- while (strstr($BaseFilename, ' ') !== false) { | |
- $BaseFilename = str_replace(' ', ' ', $BaseFilename); | |
- } | |
- $BaseFilename = trim($BaseFilename); | |
- | |
- return $DirectoryName.'/'.BetterUCwords($BaseFilename).'.'.strtolower($FileExtension); | |
-} | |
- | |
-function BetterUCwords($string) { | |
- $stringlength = strlen($string); | |
- | |
- $string{0} = strtoupper($string{0}); | |
- for ($i = 1; $i < $stringlength; $i++) { | |
- if (($string{$i - 1} == '\'') && ($i > 1) && (($string{$i - 2} == 'O') || ($string{$i - 2} == ' '))) { | |
- // O'Clock, 'Em | |
- $string{$i} = strtoupper($string{$i}); | |
- } elseif (preg_match('#^[\'A-Za-z0-9¿-ˇ]$#', $string{$i - 1})) { | |
- $string{$i} = strtolower($string{$i}); | |
- } else { | |
- $string{$i} = strtoupper($string{$i}); | |
- } | |
- } | |
- | |
- static $LowerCaseWords = array('vs.', 'feat.'); | |
- static $UpperCaseWords = array('DJ', 'USA', 'II', 'MC', 'CD', 'TV', '\'N\''); | |
- | |
- $OutputListOfWords = array(); | |
- $ListOfWords = explode(' ', $string); | |
- foreach ($ListOfWords as $ThisWord) { | |
- if (in_array(strtolower(str_replace('(', '', $ThisWord)), $LowerCaseWords)) { | |
- $ThisWord = strtolower($ThisWord); | |
- } elseif (in_array(strtoupper(str_replace('(', '', $ThisWord)), $UpperCaseWords)) { | |
- $ThisWord = strtoupper($ThisWord); | |
- } elseif ((substr($ThisWord, 0, 2) == 'Mc') && (strlen($ThisWord) > 2)) { | |
- $ThisWord{2} = strtoupper($ThisWord{2}); | |
- } elseif ((substr($ThisWord, 0, 3) == 'Mac') && (strlen($ThisWord) > 3)) { | |
- $ThisWord{3} = strtoupper($ThisWord{3}); | |
- } | |
- $OutputListOfWords[] = $ThisWord; | |
- } | |
- $UCstring = implode(' ', $OutputListOfWords); | |
- $UCstring = str_replace(' From ì', ' from ì', $UCstring); | |
- $UCstring = str_replace(' \'n\' ', ' \'N\' ', $UCstring); | |
- | |
- return $UCstring; | |
-} | |
- | |
- | |
- | |
-echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">'; | |
-echo '<b>Warning:</b> Scanning a new directory will erase all previous entries in the database!<br>'; | |
-echo 'Directory: <input type="text" name="scan" size="50" value="'.htmlentities(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : '', ENT_QUOTES).'"> '; | |
-echo '<input type="submit" value="Go" onClick="return confirm(\'Are you sure you want to erase all entries in the database and start scanning again?\');">'; | |
-echo '</form>'; | |
-echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">'; | |
-echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).<br>'; | |
-echo 'Directory: <input type="text" name="newscan" size="50" value="'.htmlentities(!empty($_REQUEST['newscan']) ? $_REQUEST['newscan'] : '', ENT_QUOTES).'"> '; | |
-echo '<input type="submit" value="Go">'; | |
-echo '</form><hr>'; | |
-echo '<ul>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?deadfilescheck=1').'">Remove deleted or changed files from database</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?md5datadupes=1').'">List files with identical MD5_DATA values</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1').'">List files with identical artist + title</a> (<a href="'.$_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1">same mix only</a>)</li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fileextensions=1').'">File with incorrect file extension</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?formatdistribution=1').'">File Format Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?audiobitrates=1').'">Audio Bitrate Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod=1').'">VBR_Method Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1').'">Tag Type Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">Genre Distribution</a></li>'; | |
-//echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?missingtrackvolume=1').'">Scan for missing track volume information (update database from pre-v1.7.0b5)</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Encoder Options Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">Encoded By (ID3v2) Distribution</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1').'">Track number in Album field</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum=1').'">Track number, but no Album</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat=1').'">"feat." in Title field</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres=1').'">Blank genres</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero=1').'">Track "zero"</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments=1').'">non-empty comments</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1').'">Tags that are not synchronized</a> (<a href="'.$_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1&autofix=1">autofix</a>)</li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('[N] A - T {R}')).'">Filenames that don\'t match pattern</a> (<a href="?filenamepattern='.urlencode('[N] A - T {R}').'&autofix=1">auto-fix</a>)</li>'; | |
-//echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('A - T')).'">Filenames that don\'t match pattern</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?correctcase=1').'">Correct filename case (Win/DOS)</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fixid3v1padding=1').'">Fix ID3v1 invalid padding</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1').'">Files with Errors and/or Warnings</a></li>'; | |
-echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?rescanerrors=1').'">Re-scan only files with Errors and/or Warnings</a></li>'; | |
-echo '</ul>'; | |
- | |
-$SQLquery = 'SELECT COUNT(*) AS `TotalFiles`, SUM(`playtime_seconds`) AS `TotalPlaytime`, SUM(`filesize`) AS `TotalFilesize`, AVG(`playtime_seconds`) AS `AvgPlaytime`, AVG(`filesize`) AS `AvgFilesize`, AVG(`audio_bitrate` + `video_bitrate`) AS `AvgBitrate`'; | |
-$SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`'; | |
-$result = mysql_query_safe($SQLquery); | |
-if ($row = mysql_fetch_array($result)) { | |
- echo '<hr size="1">'; | |
- echo '<div style="float: right;">'; | |
- echo 'Spent '.number_format(mysql_query_safe(null), 3).' seconds querying the database<br>'; | |
- echo '</div>'; | |
- echo '<b>Currently in the database:</b><TABLE>'; | |
- echo '<tr><th align="left">Total Files</th><td>'.number_format($row['TotalFiles']).'</td></tr>'; | |
- echo '<tr><th align="left">Total Filesize</th><td>'.number_format($row['TotalFilesize'] / 1048576).' MB</td></tr>'; | |
- echo '<tr><th align="left">Total Playtime</th><td>'.number_format($row['TotalPlaytime'] / 3600, 1).' hours</td></tr>'; | |
- echo '<tr><th align="left">Average Filesize</th><td>'.number_format($row['AvgFilesize'] / 1048576, 1).' MB</td></tr>'; | |
- echo '<tr><th align="left">Average Playtime</th><td>'.getid3_lib::PlaytimeString($row['AvgPlaytime']).'</td></tr>'; | |
- echo '<tr><th align="left">Average Bitrate</th><td>'.BitrateText($row['AvgBitrate'] / 1000, 1).'</td></tr>'; | |
- echo '</table>'; | |
- echo '<br clear="all">'; | |
-} | |
- | |
-?> | |
-</body> | |
-</html> | |
\ No newline at end of file | |
diff --git a/demos/demo.simple.php b/demos/demo.simple.php | |
deleted file mode 100644 | |
index cad3ac8..0000000 | |
--- a/demos/demo.simple.php | |
+++ /dev/null | |
@@ -1,56 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
-echo '<html><head>'; | |
-echo '<title>getID3() - /demo/demo.simple.php (sample script)</title>'; | |
-echo '<style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt; }</style>'; | |
-echo '</head><body>'; | |
- | |
- | |
-// include getID3() library (can be in a different directory if full path is specified) | |
-require_once('../getid3/getid3.php'); | |
- | |
-// Initialize getID3 engine | |
-$getID3 = new getID3; | |
- | |
-$DirectoryToScan = '/change/to/directory/you/want/to/scan'; // change to whatever directory you want to scan | |
-$dir = opendir($DirectoryToScan); | |
-echo '<table border="1" cellspacing="0" cellpadding="3">'; | |
-echo '<tr><th>Filename</th><th>Artist</th><th>Title</th><th>Bitrate</th><th>Playtime</th></tr>'; | |
-while (($file = readdir($dir)) !== false) { | |
- $FullFileName = realpath($DirectoryToScan.'/'.$file); | |
- if ((substr($FullFileName, 0, 1) != '.') && is_file($FullFileName)) { | |
- set_time_limit(30); | |
- | |
- $ThisFileInfo = $getID3->analyze($FullFileName); | |
- | |
- getid3_lib::CopyTagsToComments($ThisFileInfo); | |
- | |
- // output desired information in whatever format you want | |
- echo '<tr>'; | |
- echo '<td>'.$ThisFileInfo['filenamepath'].'</TD>'; | |
- echo '<td>'.(!empty($ThisFileInfo['comments_html']['artist']) ? implode('<BR>', $ThisFileInfo['comments_html']['artist']) : ' ').'</td>'; | |
- echo '<td>'.(!empty($ThisFileInfo['comments_html']['title']) ? implode('<BR>', $ThisFileInfo['comments_html']['title']) : ' ').'</td>'; | |
- echo '<td align="right">'.(!empty($ThisFileInfo['audio']['bitrate']) ? round($ThisFileInfo['audio']['bitrate'] / 1000).' kbps' : ' ').'</td>'; | |
- echo '<td align="right">'.(!empty($ThisFileInfo['playtime_string']) ? $ThisFileInfo['playtime_string'] : ' ').'</td>'; | |
- echo '</tr>'; | |
- } | |
-} | |
-echo '</table>'; | |
- | |
-?> | |
-</body> | |
-</html> | |
\ No newline at end of file | |
diff --git a/demos/demo.simple.write.php b/demos/demo.simple.write.php | |
deleted file mode 100644 | |
index f693377..0000000 | |
--- a/demos/demo.simple.write.php | |
+++ /dev/null | |
@@ -1,60 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
-die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
-$TaggingFormat = 'UTF-8'; | |
- | |
-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->filename = 'P:/webroot/_dev/getID3/testfiles/_writing/2011-02-02/test.mp3'; | |
-//$tagwriter->tagformats = array('id3v1', 'id3v2.3'); | |
-$tagwriter->tagformats = array('id3v2.3'); | |
- | |
-// set various options (optional) | |
-$tagwriter->overwrite_tags = true; | |
- $tagwriter->overwrite_tags = false; | |
-$tagwriter->tag_encoding = $TaggingFormat; | |
-$tagwriter->remove_other_tags = true; | |
- | |
-// populate data array | |
-$TagData = array( | |
- 'title' => array('My Song'), | |
- 'artist' => array('The Artist'), | |
- 'album' => array('Greatest Hits'), | |
- 'year' => array('2004'), | |
- 'genre' => array('Rock'), | |
- 'comment' => array('excellent!'), | |
- 'track' => array('04/16'), | |
-); | |
-$tagwriter->tag_data = $TagData; | |
- | |
-// write tags | |
-if ($tagwriter->WriteTags()) { | |
- echo 'Successfully wrote tags<br>'; | |
- if (!empty($tagwriter->warnings)) { | |
- echo 'There were some warnings:<br>'.implode('<br><br>', $tagwriter->warnings); | |
- } | |
-} else { | |
- echo 'Failed to write tags!<br>'.implode('<br><br>', $tagwriter->errors); | |
-} | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/demo.write.php b/demos/demo.write.php | |
deleted file mode 100644 | |
index 95356c9..0000000 | |
--- a/demos/demo.write.php | |
+++ /dev/null | |
@@ -1,272 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// 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 '.__LINE__.' in '.$_SERVER['PHP_SELF']); | |
- | |
-$TaggingFormat = 'UTF-8'; | |
- | |
-header('Content-Type: text/html; charset='.$TaggingFormat); | |
-echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; | |
-echo '<html><head><title>getID3() - Sample tag writer</title></head><style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt;" }</style><body>'; | |
- | |
-require_once('../getid3/getid3.php'); | |
-// Initialize getID3 engine | |
-$getID3 = new getID3; | |
-$getID3->setOption(array('encoding'=>$TaggingFormat)); | |
- | |
-getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true); | |
- | |
-$browsescriptfilename = 'demo.browse.php'; | |
- | |
-$Filename = (isset($_REQUEST['Filename']) ? $_REQUEST['Filename'] : ''); | |
- | |
- | |
- | |
-if (isset($_POST['WriteTags'])) { | |
- | |
- $TagFormatsToWrite = (isset($_POST['TagFormatsToWrite']) ? $_POST['TagFormatsToWrite'] : array()); | |
- if (!empty($TagFormatsToWrite)) { | |
- echo 'starting to write tag(s)<BR>'; | |
- | |
- $tagwriter = new getid3_writetags; | |
- $tagwriter->filename = $Filename; | |
- $tagwriter->tagformats = $TagFormatsToWrite; | |
- $tagwriter->overwrite_tags = false; | |
- $tagwriter->tag_encoding = $TaggingFormat; | |
- if (!empty($_POST['remove_other_tags'])) { | |
- $tagwriter->remove_other_tags = true; | |
- } | |
- | |
- $commonkeysarray = array('Title', 'Artist', 'Album', 'Year', 'Comment'); | |
- foreach ($commonkeysarray as $key) { | |
- if (!empty($_POST[$key])) { | |
- $TagData[strtolower($key)][] = $_POST[$key]; | |
- } | |
- } | |
- if (!empty($_POST['Genre'])) { | |
- $TagData['genre'][] = $_POST['Genre']; | |
- } | |
- if (!empty($_POST['GenreOther'])) { | |
- $TagData['genre'][] = $_POST['GenreOther']; | |
- } | |
- if (!empty($_POST['Track'])) { | |
- $TagData['track'][] = $_POST['Track'].(!empty($_POST['TracksTotal']) ? '/'.$_POST['TracksTotal'] : ''); | |
- } | |
- | |
- if (!empty($_FILES['userfile']['tmp_name'])) { | |
- if (in_array('id3v2.4', $tagwriter->tagformats) || in_array('id3v2.3', $tagwriter->tagformats) || in_array('id3v2.2', $tagwriter->tagformats)) { | |
- if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { | |
- ob_start(); | |
- if ($fd = fopen($_FILES['userfile']['tmp_name'], 'rb')) { | |
- ob_end_clean(); | |
- $APICdata = fread($fd, filesize($_FILES['userfile']['tmp_name'])); | |
- fclose ($fd); | |
- | |
- list($APIC_width, $APIC_height, $APIC_imageTypeID) = GetImageSize($_FILES['userfile']['tmp_name']); | |
- $imagetypes = array(1=>'gif', 2=>'jpeg', 3=>'png'); | |
- if (isset($imagetypes[$APIC_imageTypeID])) { | |
- | |
- $TagData['attached_picture'][0]['data'] = $APICdata; | |
- $TagData['attached_picture'][0]['picturetypeid'] = $_POST['APICpictureType']; | |
- $TagData['attached_picture'][0]['description'] = $_FILES['userfile']['name']; | |
- $TagData['attached_picture'][0]['mime'] = 'image/'.$imagetypes[$APIC_imageTypeID]; | |
- | |
- } else { | |
- echo '<b>invalid image format (only GIF, JPEG, PNG)</b><br>'; | |
- } | |
- } else { | |
- $errormessage = ob_get_contents(); | |
- ob_end_clean(); | |
- echo '<b>cannot open '.$_FILES['userfile']['tmp_name'].'</b><br>'; | |
- } | |
- } else { | |
- echo '<b>!is_uploaded_file('.$_FILES['userfile']['tmp_name'].')</b><br>'; | |
- } | |
- } else { | |
- echo '<b>WARNING:</b> Can only embed images for ID3v2<br>'; | |
- } | |
- } | |
- | |
- $tagwriter->tag_data = $TagData; | |
- if ($tagwriter->WriteTags()) { | |
- echo 'Successfully wrote tags<BR>'; | |
- if (!empty($tagwriter->warnings)) { | |
- echo 'There were some warnings:<BLOCKQUOTE STYLE="background-color:#FFCC33; padding: 10px;">'.implode('<BR><BR>', $tagwriter->warnings).'</BLOCKQUOTE>'; | |
- } | |
- } else { | |
- echo 'Failed to write tags!<BLOCKQUOTE STYLE="background-color:#FF9999; padding: 10px;">'.implode('<BR><BR>', $tagwriter->errors).'</BLOCKQUOTE>'; | |
- } | |
- | |
- } else { | |
- | |
- echo 'WARNING: no tag formats selected for writing - nothing written'; | |
- | |
- } | |
- echo '<HR>'; | |
- | |
-} | |
- | |
- | |
-echo '<div style="font-size: 1.2em; font-weight: bold;">Sample tag editor/writer</div>'; | |
-echo '<a href="'.htmlentities($browsescriptfilename.'?listdirectory='.rawurlencode(realpath(dirname($Filename))), ENT_QUOTES).'">Browse current directory</a><br>'; | |
-if (!empty($Filename)) { | |
- echo '<a href="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'">Start Over</a><br><br>'; | |
- echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="post" enctype="multipart/form-data">'; | |
- echo '<table border="3" cellspacing="0" cellpadding="4">'; | |
- echo '<tr><th align="right">Filename:</th><td><input type="hidden" name="Filename" value="'.htmlentities($Filename, ENT_QUOTES).'"><a href="'.htmlentities($browsescriptfilename.'?filename='.rawurlencode($Filename), ENT_QUOTES).'" target="_blank">'.$Filename.'</a></td></tr>'; | |
- if (file_exists($Filename)) { | |
- | |
- // Initialize getID3 engine | |
- $getID3 = new getID3; | |
- $OldThisFileInfo = $getID3->analyze($Filename); | |
- getid3_lib::CopyTagsToComments($OldThisFileInfo); | |
- | |
- switch ($OldThisFileInfo['fileformat']) { | |
- case 'mp3': | |
- case 'mp2': | |
- case 'mp1': | |
- $ValidTagTypes = array('id3v1', 'id3v2.3', 'ape'); | |
- break; | |
- | |
- case 'mpc': | |
- $ValidTagTypes = array('ape'); | |
- break; | |
- | |
- case 'ogg': | |
- if (!empty($OldThisFileInfo['audio']['dataformat']) && ($OldThisFileInfo['audio']['dataformat'] == 'flac')) { | |
- //$ValidTagTypes = array('metaflac'); | |
- // metaflac doesn't (yet) work with OggFLAC files | |
- $ValidTagTypes = array(); | |
- } else { | |
- $ValidTagTypes = array('vorbiscomment'); | |
- } | |
- break; | |
- | |
- case 'flac': | |
- $ValidTagTypes = array('metaflac'); | |
- break; | |
- | |
- case 'real': | |
- $ValidTagTypes = array('real'); | |
- break; | |
- | |
- default: | |
- $ValidTagTypes = array(); | |
- break; | |
- } | |
- echo '<tr><td align="right"><b>Title</b></td> <td><input type="text" size="40" name="Title" value="'.htmlentities((!empty($OldThisFileInfo['comments']['title']) ? implode(', ', $OldThisFileInfo['comments']['title'] ) : ''), ENT_QUOTES).'"></td></tr>'; | |
- echo '<tr><td align="right"><b>Artist</b></td><td><input type="text" size="40" name="Artist" value="'.htmlentities((!empty($OldThisFileInfo['comments']['artist']) ? implode(', ', $OldThisFileInfo['comments']['artist']) : ''), ENT_QUOTES).'"></td></tr>'; | |
- echo '<tr><td align="right"><b>Album</b></td> <td><input type="text" size="40" name="Album" value="'.htmlentities((!empty($OldThisFileInfo['comments']['album']) ? implode(', ', $OldThisFileInfo['comments']['album'] ) : ''), ENT_QUOTES).'"></td></tr>'; | |
- echo '<tr><td align="right"><b>Year</b></td> <td><input type="text" size="4" name="Year" value="'.htmlentities((!empty($OldThisFileInfo['comments']['year']) ? implode(', ', $OldThisFileInfo['comments']['year'] ) : ''), ENT_QUOTES).'"></td></tr>'; | |
- | |
- $TracksTotal = ''; | |
- $TrackNumber = ''; | |
- if (!empty($OldThisFileInfo['comments']['track_number']) && is_array($OldThisFileInfo['comments']['track_number'])) { | |
- $RawTrackNumberArray = $OldThisFileInfo['comments']['track_number']; | |
- } elseif (!empty($OldThisFileInfo['comments']['track']) && is_array($OldThisFileInfo['comments']['track'])) { | |
- $RawTrackNumberArray = $OldThisFileInfo['comments']['track']; | |
- } else { | |
- $RawTrackNumberArray = array(); | |
- } | |
- foreach ($RawTrackNumberArray as $key => $value) { | |
- if (strlen($value) > strlen($TrackNumber)) { | |
- // ID3v1 may store track as "3" but ID3v2/APE would store as "03/16" | |
- $TrackNumber = $value; | |
- } | |
- } | |
- if (strstr($TrackNumber, '/')) { | |
- list($TrackNumber, $TracksTotal) = explode('/', $TrackNumber); | |
- } | |
- echo '<tr><td align="right"><b>Track</b></td><td><input type="text" size="2" name="Track" value="'.htmlentities($TrackNumber, ENT_QUOTES).'"> of <input type="text" size="2" name="TracksTotal" value="'.htmlentities($TracksTotal, ENT_QUOTES).'"></TD></TR>'; | |
- | |
- $ArrayOfGenresTemp = getid3_id3v1::ArrayOfGenres(); // get the array of genres | |
- foreach ($ArrayOfGenresTemp as $key => $value) { // change keys to match displayed value | |
- $ArrayOfGenres[$value] = $value; | |
- } | |
- unset($ArrayOfGenresTemp); // remove temporary array | |
- unset($ArrayOfGenres['Cover']); // take off these special cases | |
- unset($ArrayOfGenres['Remix']); | |
- unset($ArrayOfGenres['Unknown']); | |
- $ArrayOfGenres[''] = '- Unknown -'; // Add special cases back in with renamed key/value | |
- $ArrayOfGenres['Cover'] = '-Cover-'; | |
- $ArrayOfGenres['Remix'] = '-Remix-'; | |
- asort($ArrayOfGenres); // sort into alphabetical order | |
- echo '<tr><th align="right">Genre</th><td><select name="Genre">'; | |
- $AllGenresArray = (!empty($OldThisFileInfo['comments']['genre']) ? $OldThisFileInfo['comments']['genre'] : array()); | |
- foreach ($ArrayOfGenres as $key => $value) { | |
- echo '<option value="'.htmlentities($key, ENT_QUOTES).'"'; | |
- if (in_array($key, $AllGenresArray)) { | |
- echo ' selected="selected"'; | |
- unset($AllGenresArray[array_search($key, $AllGenresArray)]); | |
- sort($AllGenresArray); | |
- } | |
- echo '>'.htmlentities($value).'</option>'; | |
- } | |
- echo '</select><input type="text" name="GenreOther" size="10" value="'.htmlentities((!empty($AllGenresArray[0]) ? $AllGenresArray[0] : ''), ENT_QUOTES).'"></td></tr>'; | |
- | |
- echo '<tr><td align="right"><b>Write Tags</b></td><td>'; | |
- foreach ($ValidTagTypes as $ValidTagType) { | |
- echo '<input type="checkbox" name="TagFormatsToWrite[]" value="'.$ValidTagType.'"'; | |
- if (count($ValidTagTypes) == 1) { | |
- echo ' checked="checked"'; | |
- } else { | |
- switch ($ValidTagType) { | |
- case 'id3v2.2': | |
- case 'id3v2.3': | |
- case 'id3v2.4': | |
- if (isset($OldThisFileInfo['tags']['id3v2'])) { | |
- echo ' checked="checked"'; | |
- } | |
- break; | |
- | |
- default: | |
- if (isset($OldThisFileInfo['tags'][$ValidTagType])) { | |
- echo ' checked="checked"'; | |
- } | |
- break; | |
- } | |
- } | |
- echo '>'.$ValidTagType.'<br>'; | |
- } | |
- if (count($ValidTagTypes) > 1) { | |
- echo '<hr><input type="checkbox" name="remove_other_tags" value="1"> Remove non-selected tag formats when writing new tag<br>'; | |
- } | |
- echo '</td></tr>'; | |
- | |
- echo '<tr><td align="right"><b>Comment</b></td><td><textarea cols="30" rows="3" name="Comment" wrap="virtual">'.((isset($OldThisFileInfo['comments']['comment']) && is_array($OldThisFileInfo['comments']['comment'])) ? implode("\n", $OldThisFileInfo['comments']['comment']) : '').'</textarea></td></tr>'; | |
- | |
- echo '<tr><td align="right"><b>Picture</b><br>(ID3v2 only)</td><td><input type="file" name="userfile" accept="image/jpeg, image/gif, image/png"><br>'; | |
- echo '<select name="APICpictureType">'; | |
- $APICtypes = getid3_id3v2::APICPictureTypeLookup('', true); | |
- foreach ($APICtypes as $key => $value) { | |
- echo '<option value="'.htmlentities($key, ENT_QUOTES).'">'.htmlentities($value).'</option>'; | |
- } | |
- echo '</select></td></tr>'; | |
- echo '<tr><td align="center" colspan="2"><input type="submit" name="WriteTags" value="Save Changes"> '; | |
- echo '<input type="reset" value="Reset"></td></tr>'; | |
- | |
- } else { | |
- | |
- echo '<tr><td align="right"><b>Error</b></td><td>'.htmlentities($Filename).' does not exist</td></tr>'; | |
- | |
- } | |
- echo '</table>'; | |
- echo '</form>'; | |
- | |
-} | |
- | |
-?> | |
-</body> | |
-</html> | |
\ No newline at end of file | |
diff --git a/demos/demo.zip.php b/demos/demo.zip.php | |
deleted file mode 100644 | |
index 5dcbe59..0000000 | |
--- a/demos/demo.zip.php | |
+++ /dev/null | |
@@ -1,86 +0,0 @@ | |
-<?php | |
-///////////////////////////////////////////////////////////////// | |
-/// getID3() by James Heinrich <[email protected]> // | |
-// available at http://getid3.sourceforge.net // | |
-// or http://www.getid3.org // | |
-///////////////////////////////////////////////////////////////// | |
-// // | |
-// /demo/demo.zip.php - part of getID3() // | |
-// Sample script how to use getID3() to decompress zip files // | |
-// See readme.txt for more details // | |
-// /// | |
-///////////////////////////////////////////////////////////////// | |
- | |
- | |
-function UnzipFileContents($filename, &$errors) { | |
- $errors = array(); | |
- $DecompressedFileContents = array(); | |
- if (include_once('getid3.module.archive.zip.php')) { | |
- ob_start(); | |
- if ($fp_ziptemp = fopen($filename, 'rb')) { | |
- ob_end_clean(); | |
- $ThisFileInfo['filesize'] = filesize($filename); | |
- $getid3_zip = new getid3_zip($fp_ziptemp, $ThisFileInfo); | |
- if (($ThisFileInfo['fileformat'] == 'zip') && !empty($ThisFileInfo['zip']['files'])) { | |
- if (!empty($ThisFileInfo['zip']['central_directory'])) { | |
- $ZipDirectoryToWalk = $ThisFileInfo['zip']['central_directory']; | |
- } elseif (!empty($ThisFileInfo['zip']['entries'])) { | |
- $ZipDirectoryToWalk = $ThisFileInfo['zip']['entries']; | |
- } else { | |
- $errors[] = 'failed to parse ZIP attachment "'.$piece_filename.'" (no central directory)<br>'; | |
- fclose($fp_ziptemp); | |
- return false; | |
- } | |
- foreach ($ZipDirectoryToWalk as $key => $valuearray) { | |
- fseek($fp_ziptemp, $valuearray['entry_offset'], SEEK_SET); | |
- $LocalFileHeader = $getid3_zip->ZIPparseLocalFileHeader($fp_ziptemp); | |
- if ($LocalFileHeader['flags']['encrypted']) { | |
- // password-protected | |
- $DecompressedFileContents[$valuearray['filename']] = ''; | |
- } else { | |
- fseek($fp_ziptemp, $LocalFileHeader['data_offset'], SEEK_SET); | |
- $compressedFileData = ''; | |
- while ((strlen($compressedFileData) < $LocalFileHeader['compressed_size']) && !feof($fp_ziptemp)) { | |
- $compressedFileData .= fread($fp_ziptemp, 32768); | |
- } | |
- switch ($LocalFileHeader['raw']['compression_method']) { | |
- case 0: | |
- // store - great, do nothing at all | |
- $uncompressedFileData = $compressedFileData; | |
- break; | |
- | |
- case 8: | |
- ob_start(); | |
- $uncompressedFileData = gzinflate($compressedFileData); | |
- $gzinflate_errors = ob_get_contents(); | |
- ob_end_clean(); | |
- if ($gzinflate_errors) { | |
- $errors[] = 'gzinflate() failed: "'.trim($gzinflate_errors).'"'; | |
- continue 2; | |
- } | |
- break; | |
- | |
- default: | |
- $DecompressedFileContents[$valuearray['filename']] = ''; | |
- $errors[] = 'unknown ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].')'; | |
- continue 2; | |
- } | |
- $DecompressedFileContents[$valuearray['filename']] = $uncompressedFileData; | |
- unset($compressedFileData); | |
- } | |
- } | |
- } else { | |
- $errors[] = $filename.' does not appear to be a zip file'; | |
- } | |
- } else { | |
- $error_message = ob_get_contents(); | |
- ob_end_clean(); | |
- $errors[] = 'failed to fopen('.$filename.', rb): '.$error_message; | |
- } | |
- } else { | |
- $errors[] = 'failed to include_once(getid3.module.archive.zip.php)'; | |
- } | |
- return $DecompressedFileContents; | |
-} | |
- | |
-?> | |
\ No newline at end of file | |
diff --git a/demos/getid3.css b/demos/getid3.css | |
deleted file mode 100644 | |
index 0f5b730..0000000 | |
--- a/demos/getid3.css | |
+++ /dev/null | |
@@ -1,171 +0,0 @@ | |
-/** | |
-* Common elements | |
-*/ | |
- | |
-body { | |
- font: 12px Verdana, sans-serif; | |
- background-color: white; | |
- color: black; | |
- margin-top: 6px; | |
- margin-bottom: 30px; | |
- margin-left: 12px; | |
- margin-right: 12px; | |
-} | |
- | |
-h1 { | |
- font: bold 18px Verdana, sans-serif; | |
- line-height: 26px; | |
- margin-top: 12px; | |
- margin-bottom: 15px; | |
- margin-left: 0px; | |
- margin-right: 7px; | |
- background-color: #e6eaf6; | |
- padding-left: 10px; | |
- padding-top: 2px; | |
- padding-bottom: 4px; | |
-} | |
- | |
-h3 { | |
- font: bold 13px Verdana, sans-serif; | |
- line-height: 26px; | |
- margin-top: 12px; | |
- margin-bottom: 0px; | |
- margin-left: 0px; | |
- margin-right: 7px; | |
- padding-left: 4px; | |
-} | |
- | |
-ul { | |
- margin-top: 0px; | |
-} | |
- | |
-p, li { | |
- font: 9pt/135% sans-serif; | |
- margin-top: 1x; | |
- margin-bottom: 0x; | |
-} | |
- | |
-a, a:link, a:visited { | |
- color: #0000cc; | |
-} | |
- | |
-hr { | |
- height: 0; | |
- border: solid gray 0; | |
- border-top-width: thin; | |
- width: 700px; | |
-} | |
- | |
-table.table td { | |
- font: 9pt sans-serif; | |
- padding-top: 1px; | |
- padding-bottom: 1px; | |
- padding-left: 5px; | |
- padding-right: 5px; | |
-} | |
- | |
-table.table td.header { | |
- background-color: #cccccc; | |
- padding-top: 2px; | |
- padding-bottom: 2px; | |
- font-weight: bold; | |
-} | |
- | |
-table.table tr.even_files { | |
- background-color: #fefefe; | |
-} | |
- | |
-table.table tr.odd_files { | |
- background-color: #e9e9e9; | |
-} | |
- | |
-table.dump { | |
- border-top: solid 1px #cccccc; | |
- border-left: solid 1px #cccccc; | |
- margin: 2px; | |
-} | |
- | |
-table.dump td { | |
- font: 9pt sans-serif; | |
- padding-top: 1px; | |
- padding-bottom: 1px; | |
- padding-left: 5px; | |
- padding-right: 5px; | |
- border-right: solid 1px #cccccc; | |
- border-bottom: solid 1px #cccccc; | |
-} | |
- | |
-td.dump_string { | |
- font-weight: bold; | |
- color: #006600; | |
- font-family: Zawgyi-One,sans-serif; | |
-} | |
- | |
-td.dump_integer { | |
- color: #CC0000; | |
- font-weight: bold; | |
-} | |
- | |
-td.dump_double { | |
- color: #FF9900; | |
- font-weight: bold; | |
-} | |
- | |
-td.dump_boolean { | |
- color: #0000FF; | |
- font-weight: bold; | |
-} | |
- | |
-.error { | |
- color: red | |
-} | |
- | |
- | |
-/** | |
-* Tool Tips | |
-*/ | |
- | |
-.tooltip { | |
- font: 9pt sans-serif; | |
- background: #ffffe1; | |
- color: black; | |
- border: black 1px solid; | |
- margin: 2px; | |
- padding: 7px; | |
- position: absolute; | |
- top: 10px; | |
- left: 10px; | |
- z-index: 10000; | |
- visibility: hidden; | |
-} | |
- | |
-.tooltip p { | |
- margin-top: -2px; | |
- margin-bottom: 4px; | |
-} | |
- | |
- | |
-/** | |
-* Forms | |
-*/ | |
- | |
-table.form td { | |
- font: 9pt/135% sans-serif; | |
- padding: 2px; | |
-} | |
- | |
-select, input { | |
- font: 9pt/135% sans-serif; | |
-} | |
- | |
-.select, .field { | |
- width: 260px; | |
-} | |
- | |
-#sel_field { | |
- width: 85px; | |
-} | |
- | |
-.button { | |
- margin-top: 10px; | |
-} | |
diff --git a/demos/index.php b/demos/index.php | |
deleted file mode 100644 | |
index 8912075..0000000 | |
--- a/demos/index.php | |
+++ /dev/null | |
@@ -1,19 +0,0 @@ | |
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |
-<html><head><title>getID3 demos</title><style type="text/css">BODY, TD, TH { font-family: sans-serif; font-size: 10pt; }</style></head><body> | |
- | |
-In this directory are a number of examples of how to use <a href="http://www.getid3.org/">getID3()</a>.<br> | |
-If you don't know what to run, take a look at <a href="demo.browse.php"><b>demo.browse.php</b></a> | |
-<hr> | |
-Other demos:<ul> | |
-<?php | |
-if ($dh = opendir('.')) { | |
- while ($file = readdir($dh)) { | |
- if (preg_match('#^demo\\..+\\.php$#', $file)) { | |
- echo '<li><a href="'.htmlentities($file, ENT_QUOTES).'">'.htmlentities($file).'</a></li>'; | |
- } | |
- } | |
-} | |
-?> | |
-</ul> | |
-</body> | |
-</html> | |
\ No newline at end of file |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment