2 /////////////////////////////////////////////////////////////////
3 /// getID3() by James Heinrich <info@getid3.org> //
4 // available at http://getid3.sourceforge.net //
5 // or http://www.getid3.org //
6 // also https://github.com/JamesHeinrich/getID3 //
7 /////////////////////////////////////////////////////////////////
9 // /demo/demo.mysql.php - part of getID3() //
10 // Sample script for recursively scanning directories and //
11 // storing the results in a database //
12 // See readme.txt for more details //
14 /////////////////////////////////////////////////////////////////
16 die('Due to a security issue, this demo has been disabled. It can be enabled by removing line 16 in demos/demo.mysql.php');
20 $getid3_demo_mysql_encoding = 'ISO-8859-1';
21 $getid3_demo_mysql_md5_data = false; // All data hashes are by far the slowest part of scanning
22 $getid3_demo_mysql_md5_file = false;
24 define('GETID3_DB_HOST', 'localhost');
25 define('GETID3_DB_USER', 'root');
26 define('GETID3_DB_PASS', 'password');
27 define('GETID3_DB_DB', 'getid3');
28 define('GETID3_DB_TABLE', 'files');
30 // CREATE DATABASE `getid3`;
33 if (!mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) {
34 $errormessage = ob_get_contents();
36 die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
38 if (!mysql_select_db(GETID3_DB_DB)) {
39 $errormessage = ob_get_contents();
41 die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
45 $getid3PHP_filename = realpath('../getid3/getid3.php');
46 if (!file_exists($getid3PHP_filename) || !include_once($getid3PHP_filename)) {
47 die('Cannot open '.$getid3PHP_filename);
49 // Initialize getID3 engine
51 $getID3->setOption(array(
52 'option_md5_data' => $getid3_demo_mysql_md5_data,
53 'encoding' => $getid3_demo_mysql_encoding,
57 function RemoveAccents($string) {
58 // Revised version by markstewardØhotmail*com
59 return strtr(strtr($string, '
\8a\8e\9a\9e\9fÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', '
\8c' => 'OE', '
\9c' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
62 function BitrateColor($bitrate, $BitrateMaxScale=768) {
63 // $BitrateMaxScale is bitrate of maximum-quality color (bright green)
64 // below this is gradient, above is solid green
66 $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
67 $bitrate = round(min(max($bitrate, 1), 256));
68 $bitrate--; // scale from 1-256kbps to 0-255kbps
70 $Rcomponent = max(255 - ($bitrate * 2), 0);
71 $Gcomponent = max(($bitrate * 2) - 255, 0);
73 $Bcomponent = max((255 - $bitrate) * 2, 0);
75 $Bcomponent = max($bitrate * 2, 0);
77 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);
80 function BitrateText($bitrate, $decimals=0) {
81 return '<span style="color: #'.BitrateColor($bitrate).'">'.number_format($bitrate, $decimals).' kbps</span>';
84 function fileextension($filename, $numextensions=1) {
85 if (strstr($filename, '.')) {
86 $reversedfilename = strrev($filename);
88 for ($i = 0; $i < $numextensions; $i++) {
89 $offset = strpos($reversedfilename, '.', $offset + 1);
90 if ($offset === false) {
94 return strrev(substr($reversedfilename, 0, $offset));
99 function RenameFileFromTo($from, $to, &$results) {
102 $results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename';
103 } elseif (!file_exists($from)) {
104 $results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename';
105 } elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) {
106 $results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename';
109 if (rename($from, $to)) {
111 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
112 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($from).'")';
113 mysql_query_safe($SQLquery);
114 $results = '<span style="color: #008000;">Successfully renamed';
116 $errormessage = ob_get_contents();
118 $results = '<br><span style="color: #FF0000;">FAILED to rename';
122 $results .= ' from:<br><i>'.$from.'</i><br>to:<br><i>'.$to.'</i></span><hr>';
126 if (!empty($_REQUEST['renamefilefrom']) && !empty($_REQUEST['renamefileto'])) {
129 RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results);
133 } elseif (!empty($_REQUEST['m3ufilename'])) {
135 header('Content-type: audio/x-mpegurl');
137 echo WindowsShareSlashTranslate($_REQUEST['m3ufilename'])."\n";
140 } elseif (!isset($_REQUEST['m3u']) && !isset($_REQUEST['m3uartist']) && !isset($_REQUEST['m3utitle'])) {
142 echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
143 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>';
148 function WindowsShareSlashTranslate($filename) {
149 if (substr($filename, 0, 2) == '//') {
150 return str_replace('/', '\\', $filename);
155 function mysql_query_safe($SQLquery) {
156 static $TimeSpentQuerying = 0;
157 if ($SQLquery === null) {
158 return $TimeSpentQuerying;
160 $starttime = microtime(true);
161 $result = mysql_query($SQLquery);
162 $TimeSpentQuerying += (microtime(true) - $starttime);
164 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>');
169 function mysql_table_exists($tablename) {
170 return (bool) mysql_query('DESCRIBE '.$tablename);
173 function AcceptableExtensions($fileformat, $audio_dataformat='', $video_dataformat='') {
174 static $AcceptableExtensionsAudio = array();
175 if (empty($AcceptableExtensionsAudio)) {
176 $AcceptableExtensionsAudio['mp3']['mp3'] = array('mp3');
177 $AcceptableExtensionsAudio['mp2']['mp2'] = array('mp2');
178 $AcceptableExtensionsAudio['mp1']['mp1'] = array('mp1');
179 $AcceptableExtensionsAudio['asf']['asf'] = array('asf');
180 $AcceptableExtensionsAudio['asf']['wma'] = array('wma');
181 $AcceptableExtensionsAudio['riff']['mp3'] = array('wav');
182 $AcceptableExtensionsAudio['riff']['wav'] = array('wav');
184 static $AcceptableExtensionsVideo = array();
185 if (empty($AcceptableExtensionsVideo)) {
186 $AcceptableExtensionsVideo['mp3']['mp3'] = array('mp3');
187 $AcceptableExtensionsVideo['mp2']['mp2'] = array('mp2');
188 $AcceptableExtensionsVideo['mp1']['mp1'] = array('mp1');
189 $AcceptableExtensionsVideo['asf']['asf'] = array('asf');
190 $AcceptableExtensionsVideo['asf']['wmv'] = array('wmv');
191 $AcceptableExtensionsVideo['gif']['gif'] = array('gif');
192 $AcceptableExtensionsVideo['jpg']['jpg'] = array('jpg');
193 $AcceptableExtensionsVideo['png']['png'] = array('png');
194 $AcceptableExtensionsVideo['bmp']['bmp'] = array('bmp');
196 if (!empty($video_dataformat)) {
197 return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array());
199 return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array());
204 if (!empty($_REQUEST['scan'])) {
205 if (mysql_table_exists(GETID3_DB_TABLE)) {
206 $SQLquery = 'DROP TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
207 mysql_query_safe($SQLquery);
210 if (!mysql_table_exists(GETID3_DB_TABLE)) {
211 $SQLquery = "CREATE TABLE `".mysql_real_escape_string(GETID3_DB_TABLE)."` (";
212 $SQLquery .= " `ID` int(11) unsigned NOT NULL auto_increment,";
213 $SQLquery .= " `filename` text NOT NULL,";
214 $SQLquery .= " `last_modified` int(11) NOT NULL default '0',";
215 $SQLquery .= " `md5_file` varchar(32) NOT NULL default '',";
216 $SQLquery .= " `md5_data` varchar(32) NOT NULL default '',";
217 $SQLquery .= " `md5_data_source` varchar(32) NOT NULL default '',";
218 $SQLquery .= " `filesize` int(10) unsigned NOT NULL default '0',";
219 $SQLquery .= " `fileformat` varchar(255) NOT NULL default '',";
220 $SQLquery .= " `audio_dataformat` varchar(255) NOT NULL default '',";
221 $SQLquery .= " `video_dataformat` varchar(255) NOT NULL default '',";
222 $SQLquery .= " `audio_bitrate` float NOT NULL default '0',";
223 $SQLquery .= " `video_bitrate` float NOT NULL default '0',";
224 $SQLquery .= " `playtime_seconds` varchar(255) NOT NULL default '',";
225 $SQLquery .= " `tags` varchar(255) NOT NULL default '',";
226 $SQLquery .= " `artist` varchar(255) NOT NULL default '',";
227 $SQLquery .= " `title` varchar(255) NOT NULL default '',";
228 $SQLquery .= " `remix` varchar(255) NOT NULL default '',";
229 $SQLquery .= " `album` varchar(255) NOT NULL default '',";
230 $SQLquery .= " `genre` varchar(255) NOT NULL default '',";
231 $SQLquery .= " `comment` text NOT NULL,";
232 $SQLquery .= " `track` varchar(7) NOT NULL default '',";
233 $SQLquery .= " `comments_all` longtext NOT NULL,";
234 $SQLquery .= " `comments_id3v2` longtext NOT NULL,";
235 $SQLquery .= " `comments_ape` longtext NOT NULL,";
236 $SQLquery .= " `comments_lyrics3` longtext NOT NULL,";
237 $SQLquery .= " `comments_id3v1` text NOT NULL,";
238 $SQLquery .= " `warning` longtext NOT NULL,";
239 $SQLquery .= " `error` longtext NOT NULL,";
240 $SQLquery .= " `track_volume` float NOT NULL default '0',";
241 $SQLquery .= " `encoder_options` varchar(255) NOT NULL default '',";
242 $SQLquery .= " `vbr_method` varchar(255) NOT NULL default '',";
243 $SQLquery .= " PRIMARY KEY (`ID`)";
245 mysql_query_safe($SQLquery);
248 $ExistingTableFields = array();
249 $result = mysql_query_safe('DESCRIBE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
250 while ($row = mysql_fetch_array($result)) {
251 $ExistingTableFields[$row['Field']] = $row;
253 if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2
254 echo '<b>adding field `encoder_options`</b><br>';
255 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `encoder_options` VARCHAR(255) default "" NOT NULL AFTER `error`');
256 mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
258 if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2
259 echo '<b>changing field `track` to VARCHAR(7)</b><br>';
260 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `track` `track` VARCHAR(7) default "" NOT NULL');
261 mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
263 if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5
264 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>';
265 echo '<b>adding field `track_volume`</b><br>';
266 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `track_volume` FLOAT NOT NULL AFTER `error`');
267 mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
269 if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1
270 echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>';
271 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `remix` VARCHAR(255) default "" NOT NULL AFTER `title`');
272 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `alternate_name` VARCHAR(255) default "" NOT NULL AFTER `track`');
273 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` ADD `parody` VARCHAR(255) default "" NOT NULL AFTER `alternate_name`');
274 mysql_query_safe('OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`');
276 if (isset($ExistingTableFields['comments_all']) && ($ExistingTableFields['comments_all']['Type'] != 'longtext')) { // Changed in 1.9.0
277 echo '<b>changing comments fields from text to longtext</b><br>';
278 // no need to change id3v1
279 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_all` `comments_all` LONGTEXT NOT NULL');
280 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_id3v2` `comments_id3v2` LONGTEXT NOT NULL');
281 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_ape` `comments_ape` LONGTEXT NOT NULL');
282 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `comments_lyrics3` `comments_lyrics3` LONGTEXT NOT NULL');
283 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `warning` `warning` LONGTEXT NOT NULL');
284 mysql_query_safe('ALTER TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` CHANGE `error` `error` LONGTEXT NOT NULL');
288 function SynchronizeAllTags($filename, $synchronizefrom='all', $synchronizeto='A12', &$errors) {
293 $ThisFileInfo = $getID3->analyze($filename);
294 getid3_lib::CopyTagsToComments($ThisFileInfo);
296 if ($synchronizefrom == 'all') {
297 $SourceArray = (!empty($ThisFileInfo['comments']) ? $ThisFileInfo['comments'] : array());
298 } elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) {
299 $SourceArray = (!empty($ThisFileInfo['tags'][$synchronizefrom]) ? $ThisFileInfo['tags'][$synchronizefrom] : array());
301 die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist');
304 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
305 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($filename).'")';
306 mysql_query_safe($SQLquery);
309 $TagFormatsToWrite = array();
310 if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2')) {
311 $TagFormatsToWrite[] = 'id3v2.3';
313 if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape')) {
314 $TagFormatsToWrite[] = 'ape';
316 if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3')) {
317 $TagFormatsToWrite[] = 'lyrics3';
319 if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1')) {
320 $TagFormatsToWrite[] = 'id3v1';
323 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
324 $tagwriter = new getid3_writetags;
325 $tagwriter->filename = $filename;
326 $tagwriter->tagformats = $TagFormatsToWrite;
327 $tagwriter->overwrite_tags = true;
328 $tagwriter->tag_encoding = $getID3->encoding;
329 $tagwriter->tag_data = $SourceArray;
331 if ($tagwriter->WriteTags()) {
332 $errors = $tagwriter->errors;
335 $errors = $tagwriter->errors;
339 $IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'pdf', 'zip', 'rar', 'mid', 'mod', 'xm', 'it', 's3m');
341 if (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan']) || !empty($_REQUEST['rescanerrors'])) {
343 $SQLquery = 'DELETE from `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
344 $SQLquery .= ' WHERE (`fileformat` = "")';
345 mysql_query_safe($SQLquery);
347 $FilesInDir = array();
349 if (!empty($_REQUEST['rescanerrors'])) {
351 echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
353 echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>';
355 $SQLquery = 'SELECT `filename`';
356 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
357 $SQLquery .= ' WHERE (`error` <> "")';
358 $SQLquery .= ' OR (`warning` <> "")';
359 $SQLquery .= ' ORDER BY `filename` ASC';
360 $result = mysql_query_safe($SQLquery);
361 while ($row = mysql_fetch_array($result)) {
363 if (!file_exists($row['filename'])) {
364 echo '<b>File missing: '.$row['filename'].'</b><br>';
365 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
366 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
367 mysql_query_safe($SQLquery);
369 $FilesInDir[] = $row['filename'];
374 } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
376 echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
378 echo 'Scanning all media files in <b>'.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).'</b> (and subdirectories)<hr>';
380 $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
381 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
382 $SQLquery .= ' GROUP BY `filename`';
383 $SQLquery .= ' HAVING (`num` > 1)';
384 $SQLquery .= ' ORDER BY `num` DESC';
385 $result = mysql_query_safe($SQLquery);
387 while ($row = mysql_fetch_array($result)) {
389 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
390 $SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"';
391 mysql_query_safe($SQLquery);
394 if ($DupesDeleted > 0) {
395 echo 'Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
398 if (!empty($_REQUEST['newscan'])) {
399 $AlreadyInDatabase = array();
401 $SQLquery = 'SELECT `filename`';
402 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
403 $SQLquery .= ' ORDER BY `filename` ASC';
404 $result = mysql_query_safe($SQLquery);
405 while ($row = mysql_fetch_array($result)) {
406 //$AlreadyInDatabase[] = strtolower($row['filename']);
407 $AlreadyInDatabase[] = $row['filename'];
411 $DirectoriesToScan = array(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan']);
412 $DirectoriesScanned = array();
413 while (count($DirectoriesToScan) > 0) {
414 foreach ($DirectoriesToScan as $DirectoryKey => $startingdir) {
415 if ($dir = opendir($startingdir)) {
417 echo '<b>'.str_replace('\\', '/', $startingdir).'</b><br>';
419 while (($file = readdir($dir)) !== false) {
420 if (($file != '.') && ($file != '..')) {
421 $RealPathName = realpath($startingdir.'/'.$file);
422 if (is_dir($RealPathName)) {
423 if (!in_array($RealPathName, $DirectoriesScanned) && !in_array($RealPathName, $DirectoriesToScan)) {
424 $DirectoriesToScan[] = $RealPathName;
426 } elseif (is_file($RealPathName)) {
427 if (!empty($_REQUEST['newscan'])) {
428 if (!in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase)) {
429 $FilesInDir[] = $RealPathName;
431 } elseif (!empty($_REQUEST['scan'])) {
432 $FilesInDir[] = $RealPathName;
439 echo '<div style="color: red;">Failed to open directory "<b>'.htmlentities($startingdir).'</b>"</div><br>';
441 $DirectoriesScanned[] = $startingdir;
442 unset($DirectoriesToScan[$DirectoryKey]);
445 echo '<i>List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)</i><hr>';
449 $FilesInDir = array_unique($FilesInDir);
454 $totaltoprocess = count($FilesInDir);
456 foreach ($FilesInDir as $filename) {
459 echo '<br>'.date('H:i:s').' ['.number_format(++$rowcounter).' / '.number_format($totaltoprocess).'] '.str_replace('\\', '/', $filename);
461 $ThisFileInfo = $getID3->analyze($filename);
462 getid3_lib::CopyTagsToComments($ThisFileInfo);
464 if (file_exists($filename)) {
465 $ThisFileInfo['file_modified_time'] = filemtime($filename);
466 $ThisFileInfo['md5_file'] = ($getid3_demo_mysql_md5_file ? md5_file($filename) : '');
469 if (empty($ThisFileInfo['fileformat'])) {
471 echo ' (<span style="color: #990099;">unknown file type</span>)';
475 if (!empty($ThisFileInfo['error'])) {
476 echo ' (<span style="color: #FF0000;">errors</span>)';
477 } elseif (!empty($ThisFileInfo['warning'])) {
478 echo ' (<span style="color: #FF9999;">warnings</span>)';
480 echo ' (<span style="color: #009900;">OK</span>)';
483 $this_track_track = '';
484 if (!empty($ThisFileInfo['comments']['track'])) {
485 foreach ($ThisFileInfo['comments']['track'] as $key => $value) {
486 if (strlen($value) > strlen($this_track_track)) {
487 $this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT);
490 if (preg_match('#^([0-9]+)/([0-9]+)$#', $this_track_track, $matches)) {
491 // change "1/5"->"01/05", "3/12"->"03/12", etc
492 $this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT).'/'.str_pad($matches[2], 2, '0', STR_PAD_LEFT);
496 $this_track_remix = '';
497 $this_track_title = '';
498 if (!empty($ThisFileInfo['comments']['title'])) {
499 foreach ($ThisFileInfo['comments']['title'] as $possible_title) {
500 if (strlen($possible_title) > strlen($this_track_title)) {
501 $this_track_title = $possible_title;
506 $ParenthesesPairs = array('()', '[]', '{}');
507 foreach ($ParenthesesPairs as $pair) {
508 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)) {
509 $this_track_title = $matches[1][0];
510 $this_track_remix = implode("\t", $matches[2]);
516 if (!empty($_REQUEST['rescanerrors'])) {
518 $SQLquery = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'` SET ';
519 $SQLquery .= ' `last_modified` = "'. mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time'] ) ? $ThisFileInfo['file_modified_time'] : '').'"';
520 $SQLquery .= ', `md5_file` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_file'] ) ? $ThisFileInfo['md5_file'] : '').'"';
521 $SQLquery .= ', `md5_data` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_data'] ) ? $ThisFileInfo['md5_data'] : '').'"';
522 $SQLquery .= ', `md5_data_source` = "'. mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source'] ) ? $ThisFileInfo['md5_data_source'] : '').'"';
523 $SQLquery .= ', `filesize` = "'. mysql_real_escape_string(!empty($ThisFileInfo['filesize'] ) ? $ThisFileInfo['filesize'] : 0).'"';
524 $SQLquery .= ', `fileformat` = "'. mysql_real_escape_string(!empty($ThisFileInfo['fileformat'] ) ? $ThisFileInfo['fileformat'] : '').'"';
525 $SQLquery .= ', `audio_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat'] ) ? $ThisFileInfo['audio']['dataformat'] : '').'"';
526 $SQLquery .= ', `video_dataformat` = "'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat'] ) ? $ThisFileInfo['video']['dataformat'] : '').'"';
527 $SQLquery .= ', `vbr_method` = "'. mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['VBR_method'] ) ? $ThisFileInfo['mpeg']['audio']['VBR_method'] : '').'"';
528 $SQLquery .= ', `audio_bitrate` = "'. mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate'] ) ? floatval($ThisFileInfo['audio']['bitrate']) : 0).'"';
529 $SQLquery .= ', `video_bitrate` = "'. mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate'] ) ? floatval($ThisFileInfo['video']['bitrate']) : 0).'"';
530 $SQLquery .= ', `playtime_seconds` = "'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds'] ) ? floatval($ThisFileInfo['playtime_seconds']) : 0).'"';
531 $SQLquery .= ', `track_volume` = "'. mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ? floatval($ThisFileInfo['replay_gain']['track']['volume']) : 0).'"';
532 $SQLquery .= ', `comments_all` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments'] ) ? serialize($ThisFileInfo['comments']) : '').'"';
533 $SQLquery .= ', `comments_id3v2` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2'] ) ? serialize($ThisFileInfo['tags']['id3v2']) : '').'"';
534 $SQLquery .= ', `comments_ape` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape'] ) ? serialize($ThisFileInfo['tags']['ape']) : '').'"';
535 $SQLquery .= ', `comments_lyrics3` = "'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3'] ) ? serialize($ThisFileInfo['tags']['lyrics3']) : '').'"';
536 $SQLquery .= ', `comments_id3v1` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1'] ) ? serialize($ThisFileInfo['tags']['id3v1']) : '').'"';
537 $SQLquery .= ', `warning` = "'. mysql_real_escape_string(!empty($ThisFileInfo['warning'] ) ? implode("\t", $ThisFileInfo['warning']) : '').'"';
538 $SQLquery .= ', `error` = "'. mysql_real_escape_string(!empty($ThisFileInfo['error'] ) ? implode("\t", $ThisFileInfo['error']) : '').'"';
539 $SQLquery .= ', `album` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['album'] ) ? implode("\t", $ThisFileInfo['comments']['album']) : '').'"';
540 $SQLquery .= ', `genre` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre'] ) ? implode("\t", $ThisFileInfo['comments']['genre']) : '').'"';
541 $SQLquery .= ', `comment` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment'] ) ? implode("\t", $ThisFileInfo['comments']['comment']) : '').'"';
542 $SQLquery .= ', `artist` = "'. mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist'] ) ? implode("\t", $ThisFileInfo['comments']['artist']) : '').'"';
543 $SQLquery .= ', `tags` = "'. mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", array_keys($ThisFileInfo['tags'])) : '').'"';
544 $SQLquery .= ', `encoder_options` = "'. mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'"';
545 $SQLquery .= ', `title` = "'. mysql_real_escape_string($this_track_title).'"';
546 $SQLquery .= ', `remix` = "'. mysql_real_escape_string($this_track_remix).'"';
547 $SQLquery .= ', `track` = "'. mysql_real_escape_string($this_track_track).'"';
548 $SQLquery .= 'WHERE (`filename` = "'. mysql_real_escape_string(isset($ThisFileInfo['filenamepath']) ? $ThisFileInfo['filenamepath'] : '').'")';
550 } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
552 //$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 (';
553 $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 (';
554 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filenamepath'] ) ? $ThisFileInfo['filenamepath'] : '').'", ';
555 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['file_modified_time'] ) ? $ThisFileInfo['file_modified_time'] : '').'", ';
556 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_file'] ) ? $ThisFileInfo['md5_file'] : '').'", ';
557 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data'] ) ? $ThisFileInfo['md5_data'] : '').'", ';
558 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['md5_data_source'] ) ? $ThisFileInfo['md5_data_source'] : '').'", ';
559 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['filesize'] ) ? $ThisFileInfo['filesize'] : 0).'", ';
560 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['fileformat'] ) ? $ThisFileInfo['fileformat'] : '').'", ';
561 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['dataformat'] ) ? $ThisFileInfo['audio']['dataformat'] : '').'", ';
562 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['dataformat'] ) ? $ThisFileInfo['video']['dataformat'] : '').'", ';
563 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['audio']['bitrate'] ) ? floatval($ThisFileInfo['audio']['bitrate']) : 0).'", ';
564 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['video']['bitrate'] ) ? floatval($ThisFileInfo['video']['bitrate']) : 0).'", ';
565 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['playtime_seconds'] ) ? floatval($ThisFileInfo['playtime_seconds']) : 0).'", ';
566 //$SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", $ThisFileInfo['tags']) : '').'", ';
567 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags'] ) ? implode("\t", array_keys($ThisFileInfo['tags'])) : '').'", ';
568 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['artist'] ) ? implode("\t", $ThisFileInfo['comments']['artist']) : '').'", ';
569 $SQLquery .= '"'.mysql_real_escape_string($this_track_title).'", ';
570 $SQLquery .= '"'.mysql_real_escape_string($this_track_remix).'", ';
571 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['album'] ) ? implode("\t", $ThisFileInfo['comments']['album']) : '').'", ';
572 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['genre'] ) ? implode("\t", $ThisFileInfo['comments']['genre']) : '').'", ';
573 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments']['comment'] ) ? implode("\t", $ThisFileInfo['comments']['comment']) : '').'", ';
574 $SQLquery .= '"'.mysql_real_escape_string($this_track_track).'", ';
575 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['comments'] ) ? serialize($ThisFileInfo['comments']) : '').'", ';
576 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v2'] ) ? serialize($ThisFileInfo['tags']['id3v2']) : '').'", ';
577 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['ape'] ) ? serialize($ThisFileInfo['tags']['ape']) : '').'", ';
578 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['lyrics3'] ) ? serialize($ThisFileInfo['tags']['lyrics3']) : '').'", ';
579 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['tags']['id3v1'] ) ? serialize($ThisFileInfo['tags']['id3v1']) : '').'", ';
580 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['warning'] ) ? implode("\t", $ThisFileInfo['warning']) : '').'", ';
581 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['error'] ) ? implode("\t", $ThisFileInfo['error']) : '').'", ';
582 $SQLquery .= '"'.mysql_real_escape_string(trim((!empty($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : '').' '.(!empty($ThisFileInfo['audio']['encoder_options']) ? $ThisFileInfo['audio']['encoder_options'] : ''))).'", ';
583 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : (!empty($ThisFileInfo['mpeg']['audio']['VBR_method']) ? $ThisFileInfo['mpeg']['audio']['VBR_method'] : '')).'", ';
584 $SQLquery .= '"'.mysql_real_escape_string(!empty($ThisFileInfo['replay_gain']['track']['volume']) ? floatval($ThisFileInfo['replay_gain']['track']['volume']) : 0).'")';
588 mysql_query_safe($SQLquery);
593 $SQLquery = 'OPTIMIZE TABLE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
594 mysql_query_safe($SQLquery);
596 echo '<hr>Done scanning!<hr>';
598 } elseif (!empty($_REQUEST['missingtrackvolume'])) {
600 $MissingTrackVolumeFilesScanned = 0;
601 $MissingTrackVolumeFilesAdjusted = 0;
602 $MissingTrackVolumeFilesDeleted = 0;
603 $SQLquery = 'SELECT `filename`';
604 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
605 $SQLquery .= ' WHERE (`track_volume` = 0)';
606 $SQLquery .= ' AND (`audio_bitrate` > 0)';
607 $result = mysql_query_safe($SQLquery);
608 echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / '.number_format(mysql_num_rows($result)).' files for track volume information:<hr>';
609 while ($row = mysql_fetch_array($result)) {
611 echo '<script type="text/javascript">if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "'.number_format($MissingTrackVolumeFilesScanned++).'";</script>. ';
613 if (file_exists($row['filename'])) {
615 $ThisFileInfo = $getID3->analyze($row['filename']);
616 if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) {
617 $MissingTrackVolumeFilesAdjusted++;
618 $SQLquery = 'UPDATE `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
619 $SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"';
620 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
621 mysql_query_safe($SQLquery);
626 $MissingTrackVolumeFilesDeleted++;
627 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
628 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
629 mysql_query_safe($SQLquery);
633 echo '<hr>Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.<br>';
634 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>';
636 } elseif (!empty($_REQUEST['deadfilescheck'])) {
638 $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
639 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
640 $SQLquery .= ' GROUP BY `filename`';
641 $SQLquery .= ' ORDER BY `num` DESC';
642 $result = mysql_query_safe($SQLquery);
644 while ($row = mysql_fetch_array($result)) {
646 if ($row['num'] <= 1) {
649 echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">duplicate</font>)';
650 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
651 $SQLquery .= ' WHERE `filename` LIKE "'.mysql_real_escape_string($row['filename']).'"';
652 mysql_query_safe($SQLquery);
655 if ($DupesDeleted > 0) {
656 echo '<hr>Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
659 $SQLquery = 'SELECT `filename`, `filesize`, `last_modified`';
660 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
661 $SQLquery .= ' ORDER BY `filename` ASC';
662 $result = mysql_query_safe($SQLquery);
666 while ($row = mysql_fetch_array($result)) {
670 if (!file_exists($row['filename'])) {
672 } elseif (filesize($row['filename']) != $row['filesize']) {
673 $reason = 'filesize changed';
674 } elseif (filemtime($row['filename']) != $row['last_modified']) {
675 if (abs(filemtime($row['filename']) - $row['last_modified']) != 3600) {
676 // off by exactly one hour == daylight savings time
677 $reason = 'last-modified time changed';
681 $thisdir = dirname($row['filename']);
685 echo '<br>'.htmlentities($row['filename']).' (<font color="#FF9999">'.$reason.'</font>)';
687 $SQLquery = 'DELETE FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
688 $SQLquery .= ' WHERE (`filename` = "'.mysql_real_escape_string($row['filename']).'")';
689 mysql_query_safe($SQLquery);
691 } elseif ($thisdir != $previousdir) {
697 $previousdir = $thisdir;
700 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>';
702 } elseif (!empty($_REQUEST['encodedbydistribution'])) {
704 if (!empty($_REQUEST['m3u'])) {
706 header('Content-type: audio/x-mpegurl');
709 $SQLquery = 'SELECT `filename`, `comments_id3v2`';
710 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
711 $SQLquery .= ' WHERE (`encoder_options` = "'.mysql_real_escape_string($_REQUEST['encodedbydistribution']).'")';
712 $result = mysql_query_safe($SQLquery);
713 $NonBlankEncodedBy = '';
714 $BlankEncodedBy = '';
715 while ($row = mysql_fetch_array($result)) {
717 $CommentArray = unserialize($row['comments_id3v2']);
718 if (isset($CommentArray['encoded_by'][0])) {
719 $NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
721 $BlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
724 echo $NonBlankEncodedBy;
725 echo $BlankEncodedBy;
728 } elseif (!empty($_REQUEST['showfiles'])) {
730 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">show all</a><br>';
731 echo '<table border="1">';
733 $SQLquery = 'SELECT `filename`, `comments_id3v2`';
734 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
735 $result = mysql_query_safe($SQLquery);
736 while ($row = mysql_fetch_array($result)) {
738 $CommentArray = unserialize($row['comments_id3v2']);
739 if (($_REQUEST['encodedbydistribution'] == '%') || (!empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0]))) {
740 echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
741 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>';
748 $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`';
749 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
750 $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC';
751 $result = mysql_query_safe($SQLquery);
752 $EncodedBy = array();
753 while ($row = mysql_fetch_array($result)) {
755 $CommentArray = unserialize($row['comments_id3v2']);
756 if (isset($CommentArray['encoded_by'][0])) {
757 if (isset($EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]])) {
758 $EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]]++;
760 $EncodedBy[$row['encoder_options']][$CommentArray['encoded_by'][0]] = 1;
764 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'&m3u=1').'">.m3u version</a><br>';
765 echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>';
766 foreach ($EncodedBy as $key => $value) {
767 echo '<tr><TD VALIGN="TOP"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($key).'&showfiles=1&m3u=1').'">m3u</a></td>';
768 echo '<TD VALIGN="TOP"><b>'.$key.'</b></td>';
769 echo '<td><table border="0" WIDTH="100%">';
771 foreach ($value as $string => $count) {
772 echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>'.number_format($count).'</i></td><td> </td>';
773 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($string).'&showfiles=1').'">'.$string.'</a></td></tr>';
775 echo '</table></td></tr>';
781 } elseif (!empty($_REQUEST['audiobitrates'])) {
783 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
784 $BitrateDistribution = array();
785 $SQLquery = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`';
786 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
787 $SQLquery .= ' WHERE (`audio_bitrate` > 0)';
788 $SQLquery .= ' GROUP BY `RoundBitrate`';
789 $result = mysql_query_safe($SQLquery);
790 while ($row = mysql_fetch_array($result)) {
791 $this_bitrate = getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000);
792 if (isset($BitrateDistribution[$this_bitrate])) {
793 $BitrateDistribution[$this_bitrate] += $row['num'];
795 $BitrateDistribution[$this_bitrate] = $row['num'];
799 echo '<table border="1" cellspacing="0" cellpadding="3">';
800 echo '<tr><th>Bitrate</th><th>Count</th></tr>';
801 foreach ($BitrateDistribution as $Bitrate => $Count) {
803 echo '<td align="right">'.round($Bitrate / 1000).' kbps</td>';
804 echo '<td align="right">'.number_format($Count).'</td>';
810 } elseif (!empty($_REQUEST['emptygenres'])) {
812 $SQLquery = 'SELECT `fileformat`, `filename`, `genre`';
813 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
814 $SQLquery .= ' WHERE (`genre` = "")';
815 $SQLquery .= ' OR (`genre` = "Unknown")';
816 $SQLquery .= ' OR (`genre` = "Other")';
817 $SQLquery .= ' ORDER BY `filename` ASC';
818 $result = mysql_query_safe($SQLquery);
820 if (!empty($_REQUEST['m3u'])) {
822 header('Content-type: audio/x-mpegurl');
824 while ($row = mysql_fetch_array($result)) {
825 if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
826 echo WindowsShareSlashTranslate($row['filename'])."\n";
833 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres='.urlencode($_REQUEST['emptygenres']).'&m3u=1').'">.m3u version</a><br>';
834 $EmptyGenreCounter = 0;
835 echo '<table border="1" cellspacing="0" cellpadding="3">';
836 echo '<tr><th>m3u</th><th>filename</th></tr>';
837 while ($row = mysql_fetch_array($result)) {
838 if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
839 $EmptyGenreCounter++;
841 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
842 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
847 echo '<b>'.number_format($EmptyGenreCounter).'</b> files with empty genres';
851 } elseif (!empty($_REQUEST['nonemptycomments'])) {
853 $SQLquery = 'SELECT `filename`, `comment`';
854 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
855 $SQLquery .= ' WHERE (`comment` <> "")';
856 $SQLquery .= ' ORDER BY `comment` ASC';
857 $result = mysql_query_safe($SQLquery);
859 if (!empty($_REQUEST['m3u'])) {
861 header('Content-type: audio/x-mpegurl');
863 while ($row = mysql_fetch_array($result)) {
864 echo WindowsShareSlashTranslate($row['filename'])."\n";
870 $NonEmptyCommentsCounter = 0;
871 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments='.urlencode($_REQUEST['nonemptycomments']).'&m3u=1').'">.m3u version</a><br>';
872 echo '<table border="1" cellspacing="0" cellpadding="3">';
873 echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>';
874 while ($row = mysql_fetch_array($result)) {
875 $NonEmptyCommentsCounter++;
877 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
878 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
879 if (strlen(trim($row['comment'])) > 0) {
880 echo '<td>'.htmlentities($row['comment']).'</td>';
882 echo '<td><i>space</i></td>';
887 echo '<b>'.number_format($NonEmptyCommentsCounter).'</b> files with non-empty comments';
891 } elseif (!empty($_REQUEST['trackzero'])) {
893 $SQLquery = 'SELECT `filename`, `track`';
894 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
895 $SQLquery .= ' WHERE (`track` <> "")';
896 $SQLquery .= ' AND ((`track` < "1")';
897 $SQLquery .= ' OR (`track` > "99"))';
898 $SQLquery .= ' ORDER BY `filename` ASC';
899 $result = mysql_query_safe($SQLquery);
901 if (!empty($_REQUEST['m3u'])) {
903 header('Content-type: audio/x-mpegurl');
905 while ($row = mysql_fetch_array($result)) {
906 if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
907 echo WindowsShareSlashTranslate($row['filename'])."\n";
914 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero='.urlencode($_REQUEST['trackzero']).'&m3u=1').'">.m3u version</a><br>';
915 $TrackZeroCounter = 0;
916 echo '<table border="1" cellspacing="0" cellpadding="3">';
917 echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>';
918 while ($row = mysql_fetch_array($result)) {
919 if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
922 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
923 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
924 echo '<td>'.htmlentities($row['track']).'</td>';
929 echo '<b>'.number_format($TrackZeroCounter).'</b> files with track "zero"';
934 } elseif (!empty($_REQUEST['titlefeat'])) {
936 $SQLquery = 'SELECT `filename`, `title`';
937 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
938 $SQLquery .= ' WHERE (`title` LIKE "%feat.%")';
939 $SQLquery .= ' ORDER BY `filename` ASC';
940 $result = mysql_query_safe($SQLquery);
942 if (!empty($_REQUEST['m3u'])) {
944 header('Content-type: audio/x-mpegurl');
946 while ($row = mysql_fetch_array($result)) {
947 echo WindowsShareSlashTranslate($row['filename'])."\n";
953 echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with "feat." in the title (instead of the artist)<br><br>';
954 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat='.urlencode($_REQUEST['titlefeat']).'&m3u=1').'">.m3u version</a><br>';
955 echo '<table border="1" cellspacing="0" cellpadding="3">';
956 echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>';
957 while ($row = mysql_fetch_array($result)) {
959 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
960 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
961 echo '<td>'.preg_replace('#(feat\. .*)#i', '<b>\\1</b>', htmlentities($row['title'])).'</td>';
969 } elseif (!empty($_REQUEST['tracknoalbum'])) {
971 $SQLquery = 'SELECT `filename`, `track`, `album`';
972 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
973 $SQLquery .= ' WHERE (`track` <> "")';
974 $SQLquery .= ' AND (`album` = "")';
975 $SQLquery .= ' ORDER BY `filename` ASC';
976 $result = mysql_query_safe($SQLquery);
978 if (!empty($_REQUEST['m3u'])) {
980 header('Content-type: audio/x-mpegurl');
982 while ($row = mysql_fetch_array($result)) {
983 echo WindowsShareSlashTranslate($row['filename'])."\n";
989 echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with a track number, but no album<br><br>';
990 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum='.urlencode($_REQUEST['tracknoalbum']).'&m3u=1').'">.m3u version</a><br>';
991 echo '<table border="1" cellspacing="0" cellpadding="3">';
992 echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>';
993 while ($row = mysql_fetch_array($result)) {
995 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">m3u</a></td>';
996 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
997 echo '<td>'.htmlentities($row['track']).'</td>';
998 echo '<td>'.htmlentities($row['album']).'</td>';
1006 } elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) {
1008 echo 'Applying new tags from <b>'.$_REQUEST['synchronizetagsfrom'].'</b> in <b>'.htmlentities($_REQUEST['filename']).'</b><ul>';
1010 if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) {
1011 echo '<li>Sucessfully wrote tags</li>';
1013 echo '<li>Tag writing had errors: <ul><li>'.implode('</li><li>', $errors).'</li></ul></li>';
1018 } elseif (!empty($_REQUEST['unsynchronizedtags'])) {
1021 $Autofixedfiles = 0;
1022 $FieldsToCompare = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track');
1023 $TagsToCompare = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
1024 $ID3v1FieldLengths = array('title'=>30, 'artist'=>30, 'album'=>30, 'year'=>4, 'genre'=>99, 'comment'=>28);
1025 if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false) {
1026 $TagsToCompare['id3v2'] = true;
1028 if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false) {
1029 $TagsToCompare['ape'] = true;
1031 if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false) {
1032 $TagsToCompare['lyrics3'] = true;
1034 if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false) {
1035 $TagsToCompare['id3v1'] = true;
1038 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1').'">Auto-fix empty tags</a><br><br>';
1039 echo '<div id="Autofixing"></div>';
1040 echo '<table border="1" cellspacing="0" cellpadding="3">';
1042 echo '<th>View</th>';
1043 echo '<th>Filename</th>';
1044 echo '<th>Combined</th>';
1045 if ($TagsToCompare['id3v2']) {
1046 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>';
1048 if ($TagsToCompare['ape']) {
1049 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>';
1051 if ($TagsToCompare['lyrics3']) {
1052 echo '<th>Lyrics3</th>';
1054 if ($TagsToCompare['id3v1']) {
1055 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>';
1059 $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`';
1060 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1061 $SQLquery .= ' WHERE (`fileformat` = "mp3")';
1062 $SQLquery .= ' ORDER BY `filename` ASC';
1063 $result = mysql_query_safe($SQLquery);
1065 $serializedCommentsFields = array('all', 'id3v2', 'ape', 'lyrics3', 'id3v1');
1066 while ($row = mysql_fetch_array($result)) {
1068 if ($lastdir != dirname($row['filename'])) {
1069 echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($lastdir, ENT_QUOTES).'";</script>';
1074 $Mismatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
1075 $SemiMatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
1076 $EmptyTags = array('id3v2'=>true, 'ape'=>true, 'lyrics3'=>true, 'id3v1'=>true);
1078 foreach ($serializedCommentsFields as $field) {
1079 $Comments[$field] = array();
1081 if ($unserialized = unserialize($row['comments_'.$field])) {
1082 $Comments[$field] = $unserialized;
1084 $errormessage = ob_get_contents();
1088 if (isset($Comments['ape']['tracknumber'])) {
1089 $Comments['ape']['track'] = $Comments['ape']['tracknumber'];
1090 unset($Comments['ape']['tracknumber']);
1092 if (isset($Comments['ape']['track_number'])) {
1093 $Comments['ape']['track'] = $Comments['ape']['track_number'];
1094 unset($Comments['ape']['track_number']);
1096 if (isset($Comments['id3v2']['track_number'])) {
1097 $Comments['id3v2']['track'] = $Comments['id3v2']['track_number'];
1098 unset($Comments['id3v2']['track_number']);
1100 if (!empty($Comments['all']['track'])) {
1102 foreach ($Comments['all']['track'] as $key => $value) {
1103 if (strlen($value) > strlen($besttrack)) {
1104 $besttrack = $value;
1107 $Comments['all']['track'] = array(0=>$besttrack);
1111 $ThisLine .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">view</a></td>';
1112 $ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1114 foreach ($FieldsToCompare as $fieldname) {
1115 $tagvalues .= $fieldname.' = '.(!empty($Comments['all'][$fieldname]) ? implode(" \n", $Comments['all'][$fieldname]) : '')." \n";
1117 $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>';
1118 foreach ($TagsToCompare as $tagtype => $CompareThisTagType) {
1119 if ($CompareThisTagType) {
1121 foreach ($FieldsToCompare as $fieldname) {
1123 if ($tagtype == 'id3v1') {
1125 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
1126 if (($fieldname == 'genre') && !empty($Comments['all'][$fieldname][0]) && !getid3_id3v1::LookupGenreID($Comments['all'][$fieldname][0])) {
1128 // non-standard genres can never match, so just ignore
1129 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1131 } elseif ($fieldname == 'comment') {
1133 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)))) {
1134 $tagvalues .= $fieldname.' = [['.$Comments[$tagtype][$fieldname][0].']]'."\n";
1135 if (trim(strtolower(RemoveAccents(substr($Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr($Comments['all'][$fieldname][0], 0, 28))))) {
1136 $SemiMatched[$tagtype] = true;
1138 $Mismatched[$tagtype] = true;
1142 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1145 } elseif ($fieldname == 'track') {
1147 // intval('01/20') == intval('1')
1148 $trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
1149 $trackB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '');
1150 if (intval($trackA) != intval($trackB)) {
1151 $tagvalues .= $fieldname.' = [['.$trackA.']]'."\n";
1152 $Mismatched[$tagtype] = true;
1155 $tagvalues .= $fieldname.' = '.$trackA."\n";
1158 } 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)) : '')) {
1160 $tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n";
1161 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))))) {
1162 $SemiMatched[$tagtype] = true;
1164 $Mismatched[$tagtype] = true;
1167 if (!empty($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1168 $EmptyTags[$tagtype] = false;
1173 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1174 if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1175 $EmptyTags[$tagtype] = false;
1180 } elseif (($tagtype == 'ape') && ($fieldname == 'year')) {
1182 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] : ''))) {
1184 $tagvalues .= $fieldname.' = [['.(isset($Comments['ape']['date'][0]) ? $Comments['ape']['date'][0] : '').']]'."\n";
1185 $Mismatched[$tagtype] = true;
1187 if (isset($Comments['ape']['date'][0]) && (strlen(trim($Comments['ape']['date'][0])) > 0)) {
1188 $EmptyTags[$tagtype] = false;
1193 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1194 if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1195 $EmptyTags[$tagtype] = false;
1200 } elseif (($fieldname == 'genre') && !empty($Comments['all'][$fieldname]) && !empty($Comments[$tagtype][$fieldname]) && in_array($Comments[$tagtype][$fieldname][0], $Comments['all'][$fieldname])) {
1202 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1203 if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1204 $EmptyTags[$tagtype] = false;
1207 } elseif ((isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '') != (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '')) {
1209 $skiptracknumberfield = false;
1210 switch ($fieldname) {
1213 case 'track_number':
1214 $trackA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
1215 $trackB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '');
1216 if (intval($trackA) == intval($trackB)) {
1217 $skiptracknumberfield = true;
1221 if (!$skiptracknumberfield) {
1222 $tagvalues .= $fieldname.' = [['.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '').']]'."\n";
1223 $tagA = (isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '');
1224 $tagB = (isset($Comments['all'][$fieldname][0]) ? $Comments['all'][$fieldname][0] : '');
1225 if (trim(strtolower(RemoveAccents($tagA))) == trim(strtolower(RemoveAccents($tagB)))) {
1226 $SemiMatched[$tagtype] = true;
1228 $Mismatched[$tagtype] = true;
1231 if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1232 $EmptyTags[$tagtype] = false;
1238 $tagvalues .= $fieldname.' = '.(isset($Comments[$tagtype][$fieldname][0]) ? $Comments[$tagtype][$fieldname][0] : '')."\n";
1239 if (isset($Comments[$tagtype][$fieldname][0]) && (strlen(trim($Comments[$tagtype][$fieldname][0])) > 0)) {
1240 $EmptyTags[$tagtype] = false;
1246 if ($EmptyTags[$tagtype]) {
1248 $ThisLine .= '<td bgcolor="#0099cc">';
1249 } elseif ($SemiMatched[$tagtype]) {
1250 $ThisLine .= '<td bgcolor="#ff9999">';
1251 } elseif ($Mismatched[$tagtype]) {
1252 $ThisLine .= '<td bgcolor="#ff0000">';
1254 $ThisLine .= '<td bgcolor="#00cc00">';
1256 $ThisLine .= '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom='.$tagtype.'&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" TARGET="retagwindow">'.$tagtype.'</a>';
1257 $ThisLine .= '</td>';
1260 $ThisLine .= '</tr>';
1265 echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($row['filename'], ENT_QUOTES).'";</script>';
1268 if (!empty($_REQUEST['autofix'])) {
1270 $AnyMismatched = false;
1271 foreach ($Mismatched as $key => $value) {
1272 if ($value && ($EmptyTags["$key"] === false)) {
1273 $AnyMismatched = true;
1276 if ($AnyMismatched && empty($_REQUEST['autofixforcesource'])) {
1283 foreach ($EmptyTags as $key => $value) {
1287 $TagsToSynch .= '1';
1290 $TagsToSynch .= '2';
1293 $TagsToSynch .= 'A';
1299 $autofixforcesource = (!empty($_REQUEST['autofixforcesource']) ? $_REQUEST['autofixforcesource'] : 'all');
1300 $TagsToSynch = (!empty($_REQUEST['autofixforcedest']) ? $_REQUEST['autofixforcedest'] : $TagsToSynch);
1303 if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors)) {
1305 echo '<tr bgcolor="#00CC00">';
1307 echo '<tr bgcolor="#FF0000">';
1309 echo '<td> </th>';
1310 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'" title="'.htmlentities(implode("\n", $errors), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1311 echo '<td><table border="0">';
1312 echo '<tr><td><b>'.$TagsToSynch.'</b></td></tr>';
1313 echo '</table></td></tr>';
1324 echo '</table><br>';
1325 echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "";</script>';
1326 echo 'Found <b>'.number_format($NotOKfiles).'</b> files with unsynchronized tags, and auto-fixed '.number_format($Autofixedfiles).' of them.';
1328 } elseif (!empty($_REQUEST['filenamepattern'])) {
1330 $patterns['A'] = 'artist';
1331 $patterns['T'] = 'title';
1332 $patterns['M'] = 'album';
1333 $patterns['N'] = 'track';
1334 $patterns['G'] = 'genre';
1335 $patterns['R'] = 'remix';
1337 $FieldsToUse = explode(' ', wordwrap(preg_replace('#[^A-Z]#i', '', $_REQUEST['filenamepattern']), 1, ' ', 1));
1338 //$FieldsToUse = explode(' ', wordwrap($_REQUEST['filenamepattern'], 1, ' ', 1));
1339 foreach ($FieldsToUse as $FieldID) {
1340 $FieldNames[] = $patterns["$FieldID"];
1343 $SQLquery = 'SELECT `filename`, `fileformat`, '.implode(', ', $FieldNames);
1344 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1345 $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1346 $SQLquery .= ' ORDER BY `filename` ASC';
1347 $result = mysql_query_safe($SQLquery);
1348 echo 'Files that do not match naming pattern: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&autofix=1').'">auto-fix</a>)<br>';
1349 echo '<table border="1" cellspacing="0" cellpadding="3">';
1350 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>';
1351 $nonmatchingfilenames = 0;
1352 $Pattern = $_REQUEST['filenamepattern'];
1353 $PatternLength = strlen($Pattern);
1354 while ($row = mysql_fetch_array($result)) {
1356 $PatternFilename = '';
1357 for ($i = 0; $i < $PatternLength; $i++) {
1358 if (isset($patterns[$Pattern{$i}])) {
1359 $PatternFilename .= trim(strtr($row[$patterns[$Pattern{$i}]], ':\\*<>|', ';-¤«»¦'), ' ');
1361 $PatternFilename .= $Pattern{$i};
1365 // Replace "~" with "-" if characters immediately before and after are both numbers,
1366 // "/" has been replaced with "~" above which is good for multi-song medley dividers,
1367 // but for things like 24/7, 7/8ths, etc it looks better if it's 24-7, 7-8ths, etc.
1368 $PatternFilename = preg_replace('#([ a-z]+)/([ a-z]+)#i', '\\1~\\2', $PatternFilename);
1369 $PatternFilename = str_replace('/', '×', $PatternFilename);
1371 $PatternFilename = str_replace('?', '¿', $PatternFilename);
1372 $PatternFilename = str_replace(' "', '
\93', $PatternFilename);
1373 $PatternFilename = str_replace('("', '(
\93', $PatternFilename);
1374 $PatternFilename = str_replace('-"', '-
\93', $PatternFilename);
1375 $PatternFilename = str_replace('" ', '
\94 ', $PatternFilename.' ');
1376 $PatternFilename = str_replace('"', '
\94', $PatternFilename);
1377 $PatternFilename = str_replace(' ', ' ', $PatternFilename);
1380 $ParenthesesPairs = array('()', '[]', '{}');
1381 foreach ($ParenthesesPairs as $pair) {
1383 // multiple remixes are stored tab-seperated in the database.
1384 // change "{2000 Version\tSomebody Remix}" into "{2000 Version} {Somebody Remix}"
1385 while (preg_match('#^(.*)'.preg_quote($pair{0}).'([^'.preg_quote($pair{1}).']*)('."\t".')([^'.preg_quote($pair{0}).']*)'.preg_quote($pair{1}).'#', $PatternFilename, $matches)) {
1386 $PatternFilename = $matches[1].$pair{0}.$matches[2].$pair{1}.' '.$pair{0}.$matches[4].$pair{1};
1389 // remove empty parenthesized pairs (probably where no track numbers, remix version, etc)
1390 $PatternFilename = preg_replace('#'.preg_quote($pair).'#', '', $PatternFilename);
1392 // "[01] - Title With No Artist.mp3" ==> "[01] Title With No Artist.mp3"
1393 $PatternFilename = preg_replace('#'.preg_quote($pair{1}).' +\- #', $pair{1}.' ', $PatternFilename);
1397 // get rid of leading & trailing spaces if end items (artist or title for example) are missing
1398 $PatternFilename = trim($PatternFilename, ' -');
1400 if (!$PatternFilename) {
1401 // no tags to create a filename from -- skip this file
1404 $PatternFilename .= '.'.$row['fileformat'];
1406 $ActualFilename = basename($row['filename']);
1407 if ($ActualFilename != $PatternFilename) {
1409 $NotMatchedReasons = '';
1410 if (strtolower($ActualFilename) === strtolower($PatternFilename)) {
1411 $NotMatchedReasons .= 'Aa ';
1412 } elseif (RemoveAccents($ActualFilename) === RemoveAccents($PatternFilename)) {
1413 $NotMatchedReasons .= 'ée ';
1417 $actualExt = '.'.fileextension($ActualFilename);
1418 $patternExt = '.'.fileextension($PatternFilename);
1419 $ActualFilenameNoExt = (($actualExt != '.') ? substr($ActualFilename, 0, 0 - strlen($actualExt)) : $ActualFilename);
1420 $PatternFilenameNoExt = (($patternExt != '.') ? substr($PatternFilename, 0, 0 - strlen($patternExt)) : $PatternFilename);
1422 if (strpos($PatternFilenameNoExt, $ActualFilenameNoExt) !== false) {
1423 $DifferenceBoldedName = str_replace($ActualFilenameNoExt, '</b>'.$ActualFilenameNoExt.'<b>', $PatternFilenameNoExt);
1425 $ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt));
1426 for ($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset++) {
1427 if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset}) {
1431 $DifferenceBoldedName = '</b>'.substr($PatternFilenameNoExt, 0, $DifferenceOffset).'<b>'.substr($PatternFilenameNoExt, $DifferenceOffset);
1433 $DifferenceBoldedName .= (($actualExt == $patternExt) ? '</b>'.$patternExt.'<b>' : $patternExt);
1437 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">view</a></td>';
1438 echo '<td> '.$NotMatchedReasons.'</td>';
1439 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($ActualFilename).'</a></td>';
1441 if (!empty($_REQUEST['autofix'])) {
1444 if (RenameFileFromTo($row['filename'], dirname($row['filename']).'/'.$PatternFilename, $results)) {
1445 echo '<TD BGCOLOR="#009900">';
1447 echo '<TD BGCOLOR="#FF0000">';
1449 echo '<b>'.$DifferenceBoldedName.'</b></td>';
1454 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">';
1455 echo '<b>'.$DifferenceBoldedName.'</b></a></td>';
1460 $nonmatchingfilenames++;
1463 echo '</table><br>';
1464 echo 'Found '.number_format($nonmatchingfilenames).' files that do not match naming pattern<br>';
1467 } elseif (!empty($_REQUEST['encoderoptionsdistribution'])) {
1469 if (isset($_REQUEST['showtagfiles'])) {
1470 $SQLquery = 'SELECT `filename`, `encoder_options` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1471 $SQLquery .= ' WHERE (`encoder_options` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")';
1472 $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1473 $SQLquery .= ' ORDER BY `filename` ASC';
1474 $result = mysql_query_safe($SQLquery);
1476 if (!empty($_REQUEST['m3u'])) {
1478 header('Content-type: audio/x-mpegurl');
1479 echo '#EXTM3U'."\n";
1480 while ($row = mysql_fetch_array($result)) {
1481 echo WindowsShareSlashTranslate($row['filename'])."\n";
1487 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Show all Encoder Options</a><hr>';
1488 echo 'Files with Encoder Options <b>'.$_REQUEST['showtagfiles'].'</b>:<br>';
1489 echo '<table border="1" cellspacing="0" cellpadding="3">';
1490 while ($row = mysql_fetch_array($result)) {
1492 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1493 echo '<td>'.$row['encoder_options'].'</td>';
1500 } elseif (!isset($_REQUEST['m3u'])) {
1502 $SQLquery = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1503 $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1504 $SQLquery .= ' GROUP BY `encoder_options`';
1505 $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC, `num` DESC, `encoder_options` ASC';
1506 $result = mysql_query_safe($SQLquery);
1507 echo 'Files with Encoder Options:<br>';
1508 echo '<table border="1" cellspacing="0" cellpadding="3">';
1509 echo '<tr><th>Encoder Options</th><th>Count</th><th>M3U</th></tr>';
1510 while ($row = mysql_fetch_array($result)) {
1512 echo '<td>'.$row['encoder_options'].'</td>';
1513 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>';
1514 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>';
1517 echo '</table><hr>';
1521 } elseif (!empty($_REQUEST['tagtypes'])) {
1523 if (!isset($_REQUEST['m3u'])) {
1524 $SQLquery = 'SELECT `tags`, COUNT(*) AS `num` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1525 $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1526 $SQLquery .= ' GROUP BY `tags`';
1527 $SQLquery .= ' ORDER BY `num` DESC';
1528 $result = mysql_query_safe($SQLquery);
1529 echo 'Files with tags:<br>';
1530 echo '<table border="1" cellspacing="0" cellpadding="3">';
1531 echo '<tr><th>Tags</th><th>Count</th><th>M3U</th></tr>';
1532 while ($row = mysql_fetch_array($result)) {
1534 echo '<td>'.$row['tags'].'</td>';
1535 echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '')).'">'.number_format($row['num']).'</a></td>';
1536 echo '<td align="right"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '').'&m3u=.m3u').'">m3u</a></td>';
1539 echo '</table><hr>';
1542 if (isset($_REQUEST['showtagfiles'])) {
1543 $SQLquery = 'SELECT `filename`, `tags` FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1544 $SQLquery .= ' WHERE (`tags` LIKE "'.mysql_real_escape_string($_REQUEST['showtagfiles']).'")';
1545 $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1546 $SQLquery .= ' ORDER BY `filename` ASC';
1547 $result = mysql_query_safe($SQLquery);
1549 if (!empty($_REQUEST['m3u'])) {
1551 header('Content-type: audio/x-mpegurl');
1552 echo '#EXTM3U'."\n";
1553 while ($row = mysql_fetch_array($result)) {
1554 echo WindowsShareSlashTranslate($row['filename'])."\n";
1560 echo '<table border="1" cellspacing="0" cellpadding="3">';
1561 while ($row = mysql_fetch_array($result)) {
1563 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1564 echo '<td>'.$row['tags'].'</td>';
1573 } elseif (!empty($_REQUEST['md5datadupes'])) {
1578 $SQLquery = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`';
1579 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1580 $SQLquery .= ' WHERE (`md5_data` <> "")';
1581 $SQLquery .= ' GROUP BY `md5_data`';
1582 $SQLquery .= ' ORDER BY `num` DESC';
1583 $result = mysql_query_safe($SQLquery);
1584 while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
1587 $filenames = array();
1589 $md5_data = array();
1590 $SQLquery = 'SELECT `fileformat`, `filename`, `tags`';
1591 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1592 $SQLquery .= ' WHERE (`md5_data` = "'.mysql_real_escape_string($row['md5_data']).'")';
1593 $SQLquery .= ' ORDER BY `filename` ASC';
1594 $result2 = mysql_query_safe($SQLquery);
1595 while ($row2 = mysql_fetch_array($result2)) {
1596 $thisfileformat = $row2['fileformat'];
1597 $filenames[] = $row2['filename'];
1598 $tags[] = $row2['tags'];
1599 $md5_data[] = $row['md5_data'];
1603 $thisline .= '<TD VALIGN="TOP" style="font-family: monospace;">'.implode('<br>', $md5_data).'</td>';
1604 $thisline .= '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $tags).'</td>';
1605 $thisline .= '<TD VALIGN="TOP">'.implode('<br>', $filenames).'</td>';
1606 $thisline .= '</tr>';
1608 if (in_array($thisfileformat, $IgnoreNoTagFormats)) {
1609 $OtherFormats .= $thisline;
1611 $AVFormats .= $thisline;
1614 echo 'Duplicated MD5_DATA (Audio/Video files):<table border="1" cellspacing="0" cellpadding="2">';
1615 echo $AVFormats.'</table><hr>';
1616 echo 'Duplicated MD5_DATA (Other files):<table border="1" cellspacing="0" cellpadding="2">';
1617 echo $OtherFormats.'</table><hr>';
1620 } elseif (!empty($_REQUEST['artisttitledupes'])) {
1622 if (isset($_REQUEST['m3uartist']) && isset($_REQUEST['m3utitle'])) {
1624 header('Content-type: audio/x-mpegurl');
1625 echo '#EXTM3U'."\n";
1626 $SQLquery = 'SELECT `filename`';
1627 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1628 $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($_REQUEST['m3uartist']).'")';
1629 $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($_REQUEST['m3utitle']).'")';
1630 $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
1631 $result = mysql_query_safe($SQLquery);
1632 while ($row = mysql_fetch_array($result)) {
1633 echo WindowsShareSlashTranslate($row['filename'])."\n";
1639 $SQLquery = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`';
1640 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1641 $SQLquery .= ' WHERE (`artist` <> "")';
1642 $SQLquery .= ' AND (`title` <> "")';
1643 $SQLquery .= ' GROUP BY `artist`, `title`'.(!empty($_REQUEST['samemix']) ? ', `remix`' : '');
1644 $SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC';
1645 $result = mysql_query_safe($SQLquery);
1649 if (!empty($_REQUEST['m3u'])) {
1651 header('Content-type: audio/x-mpegurl');
1652 echo '#EXTM3U'."\n";
1653 while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
1654 $SQLquery = 'SELECT `filename`';
1655 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1656 $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")';
1657 $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")';
1658 if (!empty($_REQUEST['samemix'])) {
1659 $SQLquery .= ' AND (`remix` = "'.mysql_real_escape_string($row['remix']).'")';
1661 $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
1662 $result2 = mysql_query_safe($SQLquery);
1663 while ($row2 = mysql_fetch_array($result2)) {
1664 echo WindowsShareSlashTranslate($row2['filename'])."\n";
1671 echo 'Duplicated aritst + title: (<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1').'">Identical Mix/Version only</a>)<br>';
1672 echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?artisttitledupes=1&m3u=.m3u').'">.m3u version</a>)<br>';
1673 echo '<table border="1" cellspacing="0" cellpadding="2">';
1674 echo '<tr><th colspan="3"> </th><th>Artist</th><th>Title</th><th>Version</th><th> </th><th> </th><th>Filename</th></tr>';
1676 while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
1680 $filenames = array();
1684 $bitrates = array();
1685 $playtimes = array();
1686 $SQLquery = 'SELECT `filename`, `artist`, `title`, `remix`, `audio_bitrate`, `vbr_method`, `playtime_seconds`, `encoder_options`';
1687 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1688 $SQLquery .= ' WHERE (`artist` = "'.mysql_real_escape_string($row['artist']).'")';
1689 $SQLquery .= ' AND (`title` = "'.mysql_real_escape_string($row['title']).'")';
1690 $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
1691 $result2 = mysql_query_safe($SQLquery);
1692 while ($row2 = mysql_fetch_array($result2)) {
1694 $filenames[] = $row2['filename'];
1695 $artists[] = $row2['artist'];
1696 $titles[] = $row2['title'];
1697 $remixes[] = $row2['remix'];
1698 if ($row2['vbr_method']) {
1699 $bitrates[] = '<B'.($row2['encoder_options'] ? ' style="text-decoration: underline; cursor: help;" title="'.$row2['encoder_options'] : '').'">'.BitrateText($row2['audio_bitrate'] / 1000).'</b>';
1701 $bitrates[] = BitrateText($row2['audio_bitrate'] / 1000);
1703 $playtimes[] = getid3_lib::PlaytimeString($row2['playtime_seconds']);
1707 echo '<TD NOWRAP VALIGN="TOP">';
1708 foreach ($filenames as $file) {
1709 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>';
1712 echo '<TD NOWRAP VALIGN="TOP">';
1713 foreach ($filenames as $file) {
1714 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($file)).'">play</a><br>';
1717 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>';
1718 echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $artists).'</td>';
1719 echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $titles).'</td>';
1720 echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $remixes).'</td>';
1721 echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $bitrates).'</td>';
1722 echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $playtimes).'</td>';
1724 echo '<TD VALIGN="TOP" NOWRAP ALIGN="LEFT"><table border="0" cellspacing="0" cellpadding="0">';
1725 foreach ($filenames as $file) {
1726 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>';
1728 echo '</table></td>';
1735 echo number_format($uniquefiles).' files with '.number_format($uniquetitles).' unique <i>aritst + title</i><br>';
1738 } elseif (!empty($_REQUEST['filetypelist'])) {
1740 list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']);
1741 $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`';
1742 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1743 $SQLquery .= ' WHERE (`fileformat` = "'.mysql_real_escape_string($fileformat).'")';
1744 $SQLquery .= ' AND (`audio_dataformat` = "'.mysql_real_escape_string($audioformat).'")';
1745 $SQLquery .= ' ORDER BY `filename` ASC';
1746 $result = mysql_query_safe($SQLquery);
1747 echo 'Files of format <b>'.$fileformat.'.'.$audioformat.'</b>:<table border="1" cellspacing="0" cellpadding="4">';
1748 echo '<tr><th>file</th><th>audio</th><th>filename</th></tr>';
1749 while ($row = mysql_fetch_array($result)) {
1751 echo '<td>'.$row['fileformat'].'</td>';
1752 echo '<td>'.$row['audio_dataformat'].'</td>';
1753 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1756 echo '</table><hr>';
1758 } elseif (!empty($_REQUEST['trackinalbum'])) {
1760 $SQLquery = 'SELECT `filename`, `album`';
1761 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1762 $SQLquery .= ' WHERE (`album` LIKE "% [%")';
1763 $SQLquery .= ' ORDER BY `album` ASC, `filename` ASC';
1764 $result = mysql_query_safe($SQLquery);
1765 if (!empty($_REQUEST['m3u'])) {
1767 header('Content-type: audio/x-mpegurl');
1768 echo '#EXTM3U'."\n";
1769 while ($row = mysql_fetch_array($result)) {
1770 echo WindowsShareSlashTranslate($row['filename'])."\n";
1774 } elseif (!empty($_REQUEST['autofix'])) {
1776 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
1777 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
1779 while ($row = mysql_fetch_array($result)) {
1781 $ThisFileInfo = $getID3->analyze($filename);
1782 getid3_lib::CopyTagsToComments($ThisFileInfo);
1784 if (!empty($ThisFileInfo['tags'])) {
1786 $Album = trim(str_replace(strstr($ThisFileInfo['comments']['album'][0], ' ['), '', $ThisFileInfo['comments']['album'][0]));
1787 $Track = (string) intval(str_replace(' [', '', str_replace(']', '', strstr($ThisFileInfo['comments']['album'][0], ' ['))));
1788 if ($Track == '0') {
1791 if ($Album && $Track) {
1792 echo '<hr>'.htmlentities($row['filename']).'<br>';
1793 echo '<i>'.htmlentities($Album).'</i> (track #'.$Track.')<br>';
1794 echo '<b>ID3v2:</b> '.(RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!').', ';
1795 $WriteID3v1_title = (isset($ThisFileInfo['comments']['title'][0]) ? $ThisFileInfo['comments']['title'][0] : '');
1796 $WriteID3v1_artist = (isset($ThisFileInfo['comments']['artist'][0]) ? $ThisFileInfo['comments']['artist'][0] : '');
1797 $WriteID3v1_year = (isset($ThisFileInfo['comments']['year'][0]) ? $ThisFileInfo['comments']['year'][0] : '');
1798 $WriteID3v1_comment = (isset($ThisFileInfo['comments']['comment'][0]) ? $ThisFileInfo['comments']['comment'][0] : '');
1799 $WriteID3v1_genreid = (isset($ThisFileInfo['comments']['genreid'][0]) ? $ThisFileInfo['comments']['genreid'][0] : '');
1800 echo '<b>ID3v1:</b> '.(WriteID3v1($row['filename'], $WriteID3v1_title, $WriteID3v1_artist, $Album, $WriteID3v1_year, $WriteID3v1_comment, $WriteID3v1_genreid, $Track, false) ? 'updated' : 'UPDATE FAILED').'<br>';
1807 echo '<hr>FAILED<br>'.htmlentities($row['filename']).'<hr>';
1815 echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with <b>[??]</b>-format track numbers in album field:<br>';
1816 if (mysql_num_rows($result) > 0) {
1817 echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&m3u=.m3u').'">.m3u version</a>)<br>';
1818 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1&autofix=1').'">Try to auto-fix</a><br>';
1819 echo '<table border="1" cellspacing="0" cellpadding="4">';
1820 while ($row = mysql_fetch_array($result)) {
1822 echo '<td>'.$row['album'].'</td>';
1823 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1832 } elseif (!empty($_REQUEST['fileextensions'])) {
1834 $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`';
1835 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1836 $SQLquery .= ' ORDER BY `filename` ASC';
1837 $result = mysql_query_safe($SQLquery);
1838 $invalidextensionfiles = 0;
1839 $invalidextensionline = '<table border="1" cellspacing="0" cellpadding="4">';
1840 $invalidextensionline .= '<tr><th>file</th><th>audio</th><th>video</th><th>tags</th><th>actual</th><th>correct</th><th>filename</th></tr>';
1841 while ($row = mysql_fetch_array($result)) {
1844 $acceptableextensions = AcceptableExtensions($row['fileformat'], $row['audio_dataformat'], $row['video_dataformat']);
1845 $actualextension = strtolower(fileextension($row['filename']));
1846 if ($acceptableextensions && !in_array($actualextension, $acceptableextensions)) {
1847 $invalidextensionfiles++;
1849 $invalidextensionline .= '<tr>';
1850 $invalidextensionline .= '<td>'.$row['fileformat'].'</td>';
1851 $invalidextensionline .= '<td>'.$row['audio_dataformat'].'</td>';
1852 $invalidextensionline .= '<td>'.$row['video_dataformat'].'</td>';
1853 $invalidextensionline .= '<td>'.$row['tags'].'</td>';
1854 $invalidextensionline .= '<td>'.$actualextension.'</td>';
1855 $invalidextensionline .= '<td>'.implode('; ', $acceptableextensions).'</td>';
1856 $invalidextensionline .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1857 $invalidextensionline .= '</tr>';
1860 $invalidextensionline .= '</table><hr>';
1861 echo number_format($invalidextensionfiles).' files with incorrect filename extension:<br>';
1862 echo $invalidextensionline;
1864 } elseif (isset($_REQUEST['genredistribution'])) {
1866 if (!empty($_REQUEST['m3u'])) {
1868 header('Content-type: audio/x-mpegurl');
1869 echo '#EXTM3U'."\n";
1870 $SQLquery = 'SELECT `filename`';
1871 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1872 $SQLquery .= ' WHERE (BINARY `genre` = "'.$_REQUEST['genredistribution'].'")';
1873 $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1874 $SQLquery .= ' ORDER BY `filename` ASC';
1875 $result = mysql_query_safe($SQLquery);
1876 while ($row = mysql_fetch_array($result)) {
1877 echo WindowsShareSlashTranslate($row['filename'])."\n";
1883 if ($_REQUEST['genredistribution'] == '%') {
1885 $SQLquery = 'SELECT COUNT(*) AS `num`, `genre`';
1886 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1887 $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
1888 $SQLquery .= ' GROUP BY `genre`';
1889 $SQLquery .= ' ORDER BY `num` DESC';
1890 $result = mysql_query_safe($SQLquery);
1891 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
1892 echo '<table border="1" cellspacing="0" cellpadding="4">';
1893 echo '<tr><th>Count</th><th>Genre</th><th>m3u</th></tr>';
1894 while ($row = mysql_fetch_array($result)) {
1895 $GenreID = getid3_id3v1::LookupGenreID($row['genre']);
1896 if (is_numeric($GenreID)) {
1897 echo '<tr bgcolor="#00FF00;">';
1899 echo '<tr bgcolor="#FF9999;">';
1901 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode($row['genre'])).'">'.number_format($row['num']).'</a></td>';
1902 echo '<td nowrap>'.str_replace("\t", '<br>', $row['genre']).'</td>';
1903 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3u=.m3u&genredistribution='.urlencode($row['genre'])).'">.m3u</a></td>';
1906 echo '</table><hr>';
1910 $SQLquery = 'SELECT `filename`, `genre`';
1911 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1912 $SQLquery .= ' WHERE (`genre` LIKE "'.mysql_real_escape_string($_REQUEST['genredistribution']).'")';
1913 $SQLquery .= ' ORDER BY `filename` ASC';
1914 $result = mysql_query_safe($SQLquery);
1915 echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">All Genres</a><br>';
1916 echo '<table border="1" cellspacing="0" cellpadding="4">';
1917 echo '<tr><th>Genre</th><th>m3u</th><th>Filename</th></tr>';
1918 while ($row = mysql_fetch_array($result)) {
1920 echo '<TD NOWRAP>'.str_replace("\t", '<br>', $row['genre']).'</td>';
1921 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
1922 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1925 echo '</table><hr>';
1932 } elseif (!empty($_REQUEST['formatdistribution'])) {
1934 $SQLquery = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`';
1935 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1936 $SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`';
1937 $SQLquery .= ' ORDER BY `num` DESC';
1938 $result = mysql_query_safe($SQLquery);
1939 echo 'File format distribution:<table border="1" cellspacing="0" cellpadding="4">';
1940 echo '<tr><th>Number</th><th>Format</th></tr>';
1941 while ($row = mysql_fetch_array($result)) {
1943 echo '<TD ALIGN="RIGHT">'.number_format($row['num']).'</td>';
1944 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>';
1947 echo '</table><hr>';
1949 } elseif (!empty($_REQUEST['errorswarnings'])) {
1951 $SQLquery = 'SELECT `filename`, `error`, `warning`';
1952 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1953 $SQLquery .= ' WHERE (`error` <> "")';
1954 $SQLquery .= ' OR (`warning` <> "")';
1955 $SQLquery .= ' ORDER BY `filename` ASC';
1956 $result = mysql_query_safe($SQLquery);
1958 if (!empty($_REQUEST['m3u'])) {
1960 header('Content-type: audio/x-mpegurl');
1961 echo '#EXTM3U'."\n";
1962 while ($row = mysql_fetch_array($result)) {
1963 echo WindowsShareSlashTranslate($row['filename'])."\n";
1969 echo number_format(mysql_num_rows($result)).' files with errors or warnings:<br>';
1970 echo '(<a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1&m3u=.m3u').'">.m3u version</a>)<br>';
1971 echo '<table border="1" cellspacing="0" cellpadding="4">';
1972 echo '<tr><th>Filename</th><th>Error</th><th>Warning</th></tr>';
1973 while ($row = mysql_fetch_array($result)) {
1975 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td>';
1976 echo '<td>'.(!empty($row['error']) ? '<li>'.str_replace("\t", '<li>', htmlentities($row['error'])).'</li>' : ' ').'</td>';
1977 echo '<td>'.(!empty($row['warning']) ? '<li>'.str_replace("\t", '<li>', htmlentities($row['warning'])).'</li>' : ' ').'</td>';
1981 echo '</table><hr>';
1983 } elseif (!empty($_REQUEST['fixid3v1padding'])) {
1985 getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.id3v1.php', __FILE__, true);
1986 $id3v1_writer = new getid3_write_id3v1;
1988 $SQLquery = 'SELECT `filename`, `error`, `warning`';
1989 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
1990 $SQLquery .= ' WHERE (`fileformat` = "mp3")';
1991 $SQLquery .= ' AND (`warning` <> "")';
1992 $SQLquery .= ' ORDER BY `filename` ASC';
1993 $result = mysql_query_safe($SQLquery);
1994 $totaltofix = mysql_num_rows($result);
1996 while ($row = mysql_fetch_array($result)) {
1998 if (strpos($row['warning'], 'Some ID3v1 fields do not use NULL characters for padding') !== false) {
2000 $id3v1_writer->filename = $row['filename'];
2001 echo ($id3v1_writer->FixID3v1Padding() ? '<span style="color: #009900;">fixed - ' : '<span style="color: #FF0000;">error - ');
2003 echo '<span style="color: #0000FF;">No error? - ';
2005 echo '['.++$rowcounter.' / '.$totaltofix.'] ';
2006 echo htmlentities($row['filename']).'</span><br>';
2010 } elseif (!empty($_REQUEST['vbrmethod'])) {
2012 if ($_REQUEST['vbrmethod'] == '1') {
2014 $SQLquery = 'SELECT COUNT(*) AS `num`, `vbr_method`';
2015 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
2016 $SQLquery .= ' GROUP BY `vbr_method`';
2017 $SQLquery .= ' ORDER BY `vbr_method`';
2018 $result = mysql_query_safe($SQLquery);
2019 echo 'VBR methods:<table border="1" cellspacing="0" cellpadding="4">';
2020 echo '<tr><th>Count</th><th>VBR Method</th></tr>';
2021 while ($row = mysql_fetch_array($result)) {
2023 echo '<TD ALIGN="RIGHT">'.htmlentities(number_format($row['num'])).'</td>';
2024 if ($row['vbr_method']) {
2025 echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod='.$row['vbr_method'], ENT_QUOTES).'">'.htmlentities($row['vbr_method']).'</a></td>';
2027 echo '<td><i>CBR</i></td>';
2035 $SQLquery = 'SELECT `filename`';
2036 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
2037 $SQLquery .= ' WHERE (`vbr_method` = "'.mysql_real_escape_string($_REQUEST['vbrmethod']).'")';
2038 $result = mysql_query_safe($SQLquery);
2039 echo number_format(mysql_num_rows($result)).' files with VBR_method of "'.$_REQUEST['vbrmethod'].'":<table border="1" cellspacing="0" cellpadding="3">';
2040 while ($row = mysql_fetch_array($result)) {
2041 echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
2042 echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename']), ENT_QUOTES).'">'.htmlentities($row['filename']).'</a></td></tr>';
2049 } elseif (!empty($_REQUEST['correctcase'])) {
2051 $SQLquery = 'SELECT `filename`, `fileformat`';
2052 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
2053 $SQLquery .= ' WHERE (`fileformat` <> "")';
2054 $SQLquery .= ' ORDER BY `filename` ASC';
2055 $result = mysql_query_safe($SQLquery);
2056 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>';
2059 while ($row = mysql_fetch_array($result)) {
2061 $CleanedFilename = CleanUpFileName($row['filename']);
2062 if ($row['filename'] != $CleanedFilename) {
2063 if (strtolower($lastdir) != strtolower(str_replace('/', '\\', dirname($row['filename'])))) {
2064 $lastdir = str_replace('/', '\\', dirname($row['filename']));
2065 echo 'cd "'.$lastdir.'"'."\n";
2067 echo 'ren "'.basename($row['filename']).'" "'.basename(CleanUpFileName($row['filename'])).'"'."\n";
2075 function CleanUpFileName($filename) {
2076 $DirectoryName = dirname($filename);
2077 $FileExtension = fileextension(basename($filename));
2078 $BaseFilename = basename($filename, '.'.$FileExtension);
2080 $BaseFilename = strtolower($BaseFilename);
2081 $BaseFilename = str_replace('_', ' ', $BaseFilename);
2082 //$BaseFilename = str_replace('-', ' - ', $BaseFilename);
2083 $BaseFilename = str_replace('(', ' (', $BaseFilename);
2084 $BaseFilename = str_replace('( ', '(', $BaseFilename);
2085 $BaseFilename = str_replace(')', ') ', $BaseFilename);
2086 $BaseFilename = str_replace(' )', ')', $BaseFilename);
2087 $BaseFilename = str_replace(' \'\'', '
\93', $BaseFilename);
2088 $BaseFilename = str_replace('\'\' ', '
\94 ', $BaseFilename);
2089 $BaseFilename = str_replace(' vs ', ' vs. ', $BaseFilename);
2090 while (strstr($BaseFilename, ' ') !== false) {
2091 $BaseFilename = str_replace(' ', ' ', $BaseFilename);
2093 $BaseFilename = trim($BaseFilename);
2095 return $DirectoryName.'/'.BetterUCwords($BaseFilename).'.'.strtolower($FileExtension);
2098 function BetterUCwords($string) {
2099 $stringlength = strlen($string);
2101 $string{0} = strtoupper($string{0});
2102 for ($i = 1; $i < $stringlength; $i++) {
2103 if (($string{$i - 1} == '\'') && ($i > 1) && (($string{$i - 2} == 'O') || ($string{$i - 2} == ' '))) {
2105 $string{$i} = strtoupper($string{$i});
2106 } elseif (preg_match('#^[\'A-Za-z0-9À-ÿ]$#', $string{$i - 1})) {
2107 $string{$i} = strtolower($string{$i});
2109 $string{$i} = strtoupper($string{$i});
2113 static $LowerCaseWords = array('vs.', 'feat.');
2114 static $UpperCaseWords = array('DJ', 'USA', 'II', 'MC', 'CD', 'TV', '\'N\'');
2116 $OutputListOfWords = array();
2117 $ListOfWords = explode(' ', $string);
2118 foreach ($ListOfWords as $ThisWord) {
2119 if (in_array(strtolower(str_replace('(', '', $ThisWord)), $LowerCaseWords)) {
2120 $ThisWord = strtolower($ThisWord);
2121 } elseif (in_array(strtoupper(str_replace('(', '', $ThisWord)), $UpperCaseWords)) {
2122 $ThisWord = strtoupper($ThisWord);
2123 } elseif ((substr($ThisWord, 0, 2) == 'Mc') && (strlen($ThisWord) > 2)) {
2124 $ThisWord{2} = strtoupper($ThisWord{2});
2125 } elseif ((substr($ThisWord, 0, 3) == 'Mac') && (strlen($ThisWord) > 3)) {
2126 $ThisWord{3} = strtoupper($ThisWord{3});
2128 $OutputListOfWords[] = $ThisWord;
2130 $UCstring = implode(' ', $OutputListOfWords);
2131 $UCstring = str_replace(' From
\93', ' from
\93', $UCstring);
2132 $UCstring = str_replace(' \'n\' ', ' \'N\' ', $UCstring);
2139 echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">';
2140 echo '<b>Warning:</b> Scanning a new directory will erase all previous entries in the database!<br>';
2141 echo 'Directory: <input type="text" name="scan" size="50" value="'.htmlentities(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : '', ENT_QUOTES).'"> ';
2142 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?\');">';
2144 echo '<hr><form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="get">';
2145 echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).<br>';
2146 echo 'Directory: <input type="text" name="newscan" size="50" value="'.htmlentities(!empty($_REQUEST['newscan']) ? $_REQUEST['newscan'] : '', ENT_QUOTES).'"> ';
2147 echo '<input type="submit" value="Go">';
2150 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?deadfilescheck=1').'">Remove deleted or changed files from database</a></li>';
2151 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?md5datadupes=1').'">List files with identical MD5_DATA values</a></li>';
2152 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>';
2153 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fileextensions=1').'">File with incorrect file extension</a></li>';
2154 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?formatdistribution=1').'">File Format Distribution</a></li>';
2155 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?audiobitrates=1').'">Audio Bitrate Distribution</a></li>';
2156 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?vbrmethod=1').'">VBR_Method Distribution</a></li>';
2157 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tagtypes=1').'">Tag Type Distribution</a></li>';
2158 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%')).'">Genre Distribution</a></li>';
2159 //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>';
2160 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1').'">Encoder Options Distribution</a></li>';
2161 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">Encoded By (ID3v2) Distribution</a></li>';
2162 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackinalbum=1').'">Track number in Album field</a></li>';
2163 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum=1').'">Track number, but no Album</a></li>';
2164 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat=1').'">"feat." in Title field</a></li>';
2165 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres=1').'">Blank genres</a></li>';
2166 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero=1').'">Track "zero"</a></li>';
2167 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments=1').'">non-empty comments</a></li>';
2168 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>';
2169 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>';
2170 //echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('A - T')).'">Filenames that don\'t match pattern</a></li>';
2171 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?correctcase=1').'">Correct filename case (Win/DOS)</a></li>';
2172 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?fixid3v1padding=1').'">Fix ID3v1 invalid padding</a></li>';
2173 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?errorswarnings=1').'">Files with Errors and/or Warnings</a></li>';
2174 echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?rescanerrors=1').'">Re-scan only files with Errors and/or Warnings</a></li>';
2177 $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`';
2178 $SQLquery .= ' FROM `'.mysql_real_escape_string(GETID3_DB_TABLE).'`';
2179 $result = mysql_query_safe($SQLquery);
2180 if ($row = mysql_fetch_array($result)) {
2181 echo '<hr size="1">';
2182 echo '<div style="float: right;">';
2183 echo 'Spent '.number_format(mysql_query_safe(null), 3).' seconds querying the database<br>';
2185 echo '<b>Currently in the database:</b><TABLE>';
2186 echo '<tr><th align="left">Total Files</th><td>'.number_format($row['TotalFiles']).'</td></tr>';
2187 echo '<tr><th align="left">Total Filesize</th><td>'.number_format($row['TotalFilesize'] / 1048576).' MB</td></tr>';
2188 echo '<tr><th align="left">Total Playtime</th><td>'.number_format($row['TotalPlaytime'] / 3600, 1).' hours</td></tr>';
2189 echo '<tr><th align="left">Average Filesize</th><td>'.number_format($row['AvgFilesize'] / 1048576, 1).' MB</td></tr>';
2190 echo '<tr><th align="left">Average Playtime</th><td>'.getid3_lib::PlaytimeString($row['AvgPlaytime']).'</td></tr>';
2191 echo '<tr><th align="left">Average Bitrate</th><td>'.BitrateText($row['AvgBitrate'] / 1000, 1).'</td></tr>';
2193 echo '<br clear="all">';
2196 echo '</body></html>';