PageRenderTime 67ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 1ms

/common/libraries/plugin/getid3/demos/demo.mysql.php

https://bitbucket.org/cbenelug/chamilo
PHP | 2615 lines | 2260 code | 291 blank | 64 comment | 248 complexity | 80552070f45bb4c53952935217b24f3e MD5 | raw file
Possible License(s): GPL-3.0, MIT, GPL-2.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0
  1. <?php
  2. /////////////////////////////////////////////////////////////////
  3. /// getID3() by James Heinrich <info@getid3.org> //
  4. // available at http://getid3.sourceforge.net //
  5. // or http://www.getid3.org //
  6. /////////////////////////////////////////////////////////////////
  7. // //
  8. // /demo/demo.mysql.php - part of getID3() //
  9. // Sample script for recursively scanning directories and //
  10. // storing the results in a database //
  11. // See readme.txt for more details //
  12. // ///
  13. /////////////////////////////////////////////////////////////////
  14. //die('Due to a security issue, this demo has been disabled. It can be enabled by removing line 16 in demos/demo.mysql.php');
  15. // OPTIONS:
  16. $getid3_demo_mysql_encoding = 'ISO-8859-1';
  17. $getid3_demo_mysql_md5_data = false; // All data hashes are by far the slowest part of scanning
  18. $getid3_demo_mysql_md5_file = false;
  19. define('GETID3_DB_HOST', 'localhost');
  20. define('GETID3_DB_USER', 'root');
  21. define('GETID3_DB_PASS', 'password');
  22. define('GETID3_DB_DB', 'getid3');
  23. define('GETID3_DB_TABLE', 'files');
  24. // CREATE DATABASE `getid3`;
  25. if (! @mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS))
  26. {
  27. die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">' . mysql_error() . '</blockquote>');
  28. }
  29. if (! @mysql_select_db(GETID3_DB_DB))
  30. {
  31. die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">' . mysql_error() . '</blockquote>');
  32. }
  33. if (! @include_once ('../getid3/getid3.php'))
  34. {
  35. die('Cannot open ' . realpath('../getid3/getid3.php'));
  36. }
  37. // Initialize getID3 engine
  38. $getID3 = new getID3();
  39. $getID3->setOption(array('option_md5_data' => $getid3_demo_mysql_md5_data,
  40. 'encoding' => $getid3_demo_mysql_encoding));
  41. function RemoveAccents($string)
  42. {
  43. // Revised version by marksteward�hotmail*com
  44. return strtr(strtr($string, '������������������������������������������������������������', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array(
  45. '�' => 'TH', '�' => 'th', '�' => 'DH', '�' => 'dh', '�' => 'ss', '�' => 'OE', '�' => 'oe', '�' => 'AE',
  46. '�' => 'ae', '�' => 'u'));
  47. }
  48. function FixTextFields($text)
  49. {
  50. $text = getid3_lib :: SafeStripSlashes($text);
  51. $text = htmlentities($text, ENT_QUOTES);
  52. return $text;
  53. }
  54. function BitrateColor($bitrate, $BitrateMaxScale = 768)
  55. {
  56. // $BitrateMaxScale is bitrate of maximum-quality color (bright green)
  57. // below this is gradient, above is solid green
  58. $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
  59. $bitrate = round(min(max($bitrate, 1), 256));
  60. $bitrate --; // scale from 1-256kbps to 0-255kbps
  61. $Rcomponent = max(255 - ($bitrate * 2), 0);
  62. $Gcomponent = max(($bitrate * 2) - 255, 0);
  63. if ($bitrate > 127)
  64. {
  65. $Bcomponent = max((255 - $bitrate) * 2, 0);
  66. }
  67. else
  68. {
  69. $Bcomponent = max($bitrate * 2, 0);
  70. }
  71. 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);
  72. }
  73. function BitrateText($bitrate, $decimals = 0)
  74. {
  75. return '<span style="color: #' . BitrateColor($bitrate) . '">' . number_format($bitrate, $decimals) . ' kbps</span>';
  76. }
  77. function fileextension($filename, $numextensions = 1)
  78. {
  79. if (strstr($filename, '.'))
  80. {
  81. $reversedfilename = strrev($filename);
  82. $offset = 0;
  83. for($i = 0; $i < $numextensions; $i ++)
  84. {
  85. $offset = strpos($reversedfilename, '.', $offset + 1);
  86. if ($offset === false)
  87. {
  88. return '';
  89. }
  90. }
  91. return strrev(substr($reversedfilename, 0, $offset));
  92. }
  93. return '';
  94. }
  95. function RenameFileFromTo($from, $to, &$results)
  96. {
  97. $success = true;
  98. if ($from === $to)
  99. {
  100. $results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename';
  101. }
  102. elseif (! file_exists($from))
  103. {
  104. $results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename';
  105. }
  106. elseif (file_exists($to) && (strtolower($from) !== strtolower($to)))
  107. {
  108. $results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename';
  109. }
  110. elseif (@rename($from, $to))
  111. {
  112. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  113. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($from) . '")';
  114. safe_mysql_query($SQLquery);
  115. $results = '<span style="color: #008000;">Successfully renamed';
  116. }
  117. else
  118. {
  119. $results = '<br><span style="color: #FF0000;">FAILED to rename';
  120. $success = false;
  121. }
  122. $results .= ' from:<br><i>' . $from . '</i><br>to:<br><i>' . $to . '</i></span><hr>';
  123. return $success;
  124. }
  125. if (! empty($_REQUEST['renamefilefrom']) && ! empty($_REQUEST['renamefileto']))
  126. {
  127. $results = '';
  128. RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results);
  129. echo $results;
  130. exit();
  131. }
  132. elseif (! empty($_REQUEST['m3ufilename']))
  133. {
  134. header('Content-type: audio/x-mpegurl');
  135. echo '#EXTM3U' . "\n";
  136. echo WindowsShareSlashTranslate($_REQUEST['m3ufilename']) . "\n";
  137. exit();
  138. }
  139. elseif (! isset($_REQUEST['m3u']) && ! isset($_REQUEST['m3uartist']) && ! isset($_REQUEST['m3utitle']))
  140. {
  141. echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
  142. 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>';
  143. }
  144. function WindowsShareSlashTranslate($filename)
  145. {
  146. if (substr($filename, 0, 2) == '//')
  147. {
  148. return str_replace('/', '\\', $filename);
  149. }
  150. return $filename;
  151. }
  152. function safe_mysql_query($SQLquery)
  153. {
  154. $result = @mysql_query($SQLquery);
  155. if (mysql_error())
  156. {
  157. die('<FONT COLOR="red">' . mysql_error() . '</FONT><hr><TT>' . $SQLquery . '</TT>');
  158. }
  159. return $result;
  160. }
  161. function mysql_table_exists($tablename)
  162. {
  163. return (bool) mysql_query('DESCRIBE ' . $tablename);
  164. }
  165. function AcceptableExtensions($fileformat, $audio_dataformat = '', $video_dataformat = '')
  166. {
  167. static $AcceptableExtensionsAudio = array();
  168. if (empty($AcceptableExtensionsAudio))
  169. {
  170. $AcceptableExtensionsAudio['mp3']['mp3'] = array('mp3');
  171. $AcceptableExtensionsAudio['mp2']['mp2'] = array('mp2');
  172. $AcceptableExtensionsAudio['mp1']['mp1'] = array('mp1');
  173. $AcceptableExtensionsAudio['asf']['asf'] = array('asf');
  174. $AcceptableExtensionsAudio['asf']['wma'] = array('wma');
  175. $AcceptableExtensionsAudio['riff']['mp3'] = array('wav');
  176. $AcceptableExtensionsAudio['riff']['wav'] = array('wav');
  177. }
  178. static $AcceptableExtensionsVideo = array();
  179. if (empty($AcceptableExtensionsVideo))
  180. {
  181. $AcceptableExtensionsVideo['mp3']['mp3'] = array('mp3');
  182. $AcceptableExtensionsVideo['mp2']['mp2'] = array('mp2');
  183. $AcceptableExtensionsVideo['mp1']['mp1'] = array('mp1');
  184. $AcceptableExtensionsVideo['asf']['asf'] = array('asf');
  185. $AcceptableExtensionsVideo['asf']['wmv'] = array('wmv');
  186. $AcceptableExtensionsVideo['gif']['gif'] = array('gif');
  187. $AcceptableExtensionsVideo['jpg']['jpg'] = array('jpg');
  188. $AcceptableExtensionsVideo['png']['png'] = array('png');
  189. $AcceptableExtensionsVideo['bmp']['bmp'] = array('bmp');
  190. }
  191. if (! empty($video_dataformat))
  192. {
  193. return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array());
  194. }
  195. else
  196. {
  197. return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array());
  198. }
  199. }
  200. if (! empty($_REQUEST['scan']))
  201. {
  202. if (mysql_table_exists(GETID3_DB_TABLE))
  203. {
  204. $SQLquery = 'DROP TABLE `' . GETID3_DB_TABLE . '`';
  205. safe_mysql_query($SQLquery);
  206. }
  207. }
  208. if (! mysql_table_exists(GETID3_DB_TABLE))
  209. {
  210. $SQLquery = 'CREATE TABLE `' . GETID3_DB_TABLE . '` (';
  211. $SQLquery .= ' `ID` mediumint(8) unsigned NOT NULL auto_increment,';
  212. $SQLquery .= ' `filename` text NOT NULL,';
  213. $SQLquery .= ' `LastModified` int(11) NOT NULL default "0",';
  214. $SQLquery .= ' `md5_file` varchar(32) NOT NULL default "",';
  215. $SQLquery .= ' `md5_data` varchar(32) NOT NULL default "",';
  216. $SQLquery .= ' `md5_data_source` varchar(32) NOT NULL default "",';
  217. $SQLquery .= ' `filesize` int(10) unsigned NOT NULL default "0",';
  218. $SQLquery .= ' `fileformat` varchar(255) NOT NULL default "",';
  219. $SQLquery .= ' `audio_dataformat` varchar(255) NOT NULL default "",';
  220. $SQLquery .= ' `video_dataformat` varchar(255) NOT NULL default "",';
  221. $SQLquery .= ' `audio_bitrate` float NOT NULL default "0",';
  222. $SQLquery .= ' `video_bitrate` float NOT NULL default "0",';
  223. $SQLquery .= ' `playtime_seconds` varchar(255) NOT NULL default "",';
  224. $SQLquery .= ' `tags` varchar(255) NOT NULL default "",';
  225. $SQLquery .= ' `artist` varchar(255) NOT NULL default "",';
  226. $SQLquery .= ' `title` varchar(255) NOT NULL default "",';
  227. $SQLquery .= ' `remix` varchar(255) NOT NULL default "",';
  228. $SQLquery .= ' `album` varchar(255) NOT NULL default "",';
  229. $SQLquery .= ' `genre` varchar(255) NOT NULL default "",';
  230. $SQLquery .= ' `comment` text NOT NULL,';
  231. $SQLquery .= ' `track` varchar(7) NOT NULL default "",';
  232. $SQLquery .= ' `comments_all` text NOT NULL,';
  233. $SQLquery .= ' `comments_id3v2` text NOT NULL,';
  234. $SQLquery .= ' `comments_ape` text NOT NULL,';
  235. $SQLquery .= ' `comments_lyrics3` text NOT NULL,';
  236. $SQLquery .= ' `comments_id3v1` text NOT NULL,';
  237. $SQLquery .= ' `warning` text NOT NULL,';
  238. $SQLquery .= ' `error` text NOT NULL,';
  239. $SQLquery .= ' `track_volume` float NOT NULL default "0",';
  240. $SQLquery .= ' `encoder_options` varchar(255) NOT NULL default "",';
  241. $SQLquery .= ' `vbr_method` varchar(255) NOT NULL default "",';
  242. $SQLquery .= ' PRIMARY KEY (`ID`)';
  243. $SQLquery .= ') TYPE=MyISAM;';
  244. safe_mysql_query($SQLquery);
  245. }
  246. $ExistingTableFields = array();
  247. $result = mysql_query('DESCRIBE `' . GETID3_DB_TABLE . '`');
  248. while ($row = mysql_fetch_array($result))
  249. {
  250. $ExistingTableFields[$row['Field']] = $row;
  251. }
  252. if (! isset($ExistingTableFields['encoder_options']))
  253. { // Added in 1.7.0b2
  254. echo '<b>adding field `encoder_options`</b><br>';
  255. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` ADD `encoder_options` VARCHAR(255) DEFAULT "" NOT NULL AFTER `error`');
  256. mysql_query('OPTIMIZE TABLE `' . GETID3_DB_TABLE . '`');
  257. }
  258. if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)'))
  259. { // Changed in 1.7.0b2
  260. echo '<b>changing field `track` to VARCHAR(7)</b><br>';
  261. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` CHANGE `track` `track` VARCHAR(7) DEFAULT "" NOT NULL');
  262. mysql_query('OPTIMIZE TABLE `' . GETID3_DB_TABLE . '`');
  263. }
  264. if (! isset($ExistingTableFields['track_volume']))
  265. { // Added in 1.7.0b5
  266. 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>';
  267. echo '<b>adding field `track_volume`</b><br>';
  268. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` ADD `track_volume` FLOAT NOT NULL AFTER `error`');
  269. mysql_query('OPTIMIZE TABLE `' . GETID3_DB_TABLE . '`');
  270. }
  271. if (! isset($ExistingTableFields['remix']))
  272. { // Added in 1.7.3b1
  273. echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>';
  274. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` ADD `remix` VARCHAR(255) DEFAULT "" NOT NULL AFTER `title`');
  275. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` ADD `alternate_name` VARCHAR(255) DEFAULT "" NOT NULL AFTER `track`');
  276. mysql_query('ALTER TABLE `' . GETID3_DB_TABLE . '` ADD `parody` VARCHAR(255) DEFAULT "" NOT NULL AFTER `alternate_name`');
  277. mysql_query('OPTIMIZE TABLE `' . GETID3_DB_TABLE . '`');
  278. }
  279. function SynchronizeAllTags($filename, $synchronizefrom = 'all', $synchronizeto = 'A12', &$errors)
  280. {
  281. global $getID3;
  282. set_time_limit(30);
  283. $ThisFileInfo = $getID3->analyze($filename);
  284. getid3_lib :: CopyTagsToComments($ThisFileInfo);
  285. if ($synchronizefrom == 'all')
  286. {
  287. $SourceArray = @$ThisFileInfo['comments'];
  288. }
  289. elseif (! empty($ThisFileInfo['tags'][$synchronizefrom]))
  290. {
  291. $SourceArray = @$ThisFileInfo['tags'][$synchronizefrom];
  292. }
  293. else
  294. {
  295. die('ERROR: $ThisFileInfo[tags][' . $synchronizefrom . '] does not exist');
  296. }
  297. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  298. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($filename) . '")';
  299. safe_mysql_query($SQLquery);
  300. $TagFormatsToWrite = array();
  301. if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2'))
  302. {
  303. $TagFormatsToWrite[] = 'id3v2.3';
  304. }
  305. if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape'))
  306. {
  307. $TagFormatsToWrite[] = 'ape';
  308. }
  309. if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3'))
  310. {
  311. $TagFormatsToWrite[] = 'lyrics3';
  312. }
  313. if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1'))
  314. {
  315. $TagFormatsToWrite[] = 'id3v1';
  316. }
  317. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'write.php', __FILE__, true);
  318. $tagwriter = new getid3_writetags();
  319. $tagwriter->filename = $filename;
  320. $tagwriter->tagformats = $TagFormatsToWrite;
  321. $tagwriter->overwrite_tags = true;
  322. $tagwriter->tag_encoding = $getID3->encoding;
  323. $tagwriter->tag_data = $SourceArray;
  324. if ($tagwriter->WriteTags())
  325. {
  326. $errors = $tagwriter->errors;
  327. return true;
  328. }
  329. $errors = $tagwriter->errors;
  330. return false;
  331. }
  332. $IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'pdf', 'zip', 'rar', 'mid', 'mod', 'xm', 'it', 's3m');
  333. if (! empty($_REQUEST['scan']) || ! empty($_REQUEST['newscan']) || ! empty($_REQUEST['rescanerrors']))
  334. {
  335. $SQLquery = 'DELETE from `' . GETID3_DB_TABLE . '`';
  336. $SQLquery .= ' WHERE (`fileformat` = "")';
  337. safe_mysql_query($SQLquery);
  338. $FilesInDir = array();
  339. if (! empty($_REQUEST['rescanerrors']))
  340. {
  341. echo '<a href="' . htmlentities($_SERVER['PHP_SELF']) . '">abort</a><hr>';
  342. echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>';
  343. $SQLquery = 'SELECT `filename`';
  344. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  345. $SQLquery .= ' WHERE (`error` <> "")';
  346. $SQLquery .= ' OR (`warning` <> "")';
  347. $SQLquery .= ' ORDER BY `filename` ASC';
  348. $result = safe_mysql_query($SQLquery);
  349. while ($row = mysql_fetch_array($result))
  350. {
  351. if (! file_exists($row['filename']))
  352. {
  353. echo '<b>File missing: ' . $row['filename'] . '</b><br>';
  354. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  355. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($row['filename']) . '")';
  356. safe_mysql_query($SQLquery);
  357. }
  358. else
  359. {
  360. $FilesInDir[] = $row['filename'];
  361. }
  362. }
  363. }
  364. elseif (! empty($_REQUEST['scan']) || ! empty($_REQUEST['newscan']))
  365. {
  366. echo '<a href="' . htmlentities($_SERVER['PHP_SELF']) . '">abort</a><hr>';
  367. echo 'Scanning all media files in <b>' . str_replace('\\', '/', realpath(! empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])) . '</b> (and subdirectories)<hr>';
  368. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  369. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  370. $SQLquery .= ' GROUP BY `filename`';
  371. $SQLquery .= ' ORDER BY `num` DESC';
  372. $result = safe_mysql_query($SQLquery);
  373. $DupesDeleted = 0;
  374. while ($row = mysql_fetch_array($result))
  375. {
  376. set_time_limit(30);
  377. if ($row['num'] <= 1)
  378. {
  379. break;
  380. }
  381. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  382. $SQLquery .= ' WHERE `filename` LIKE "' . mysql_escape_string($row['filename']) . '"';
  383. safe_mysql_query($SQLquery);
  384. $DupesDeleted ++;
  385. }
  386. if ($DupesDeleted > 0)
  387. {
  388. echo 'Deleted <b>' . number_format($DupesDeleted) . '</b> duplicate filenames<hr>';
  389. }
  390. if (! empty($_REQUEST['newscan']))
  391. {
  392. $AlreadyInDatabase = array();
  393. set_time_limit(60);
  394. $SQLquery = 'SELECT `filename`';
  395. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  396. $SQLquery .= ' ORDER BY `filename` ASC';
  397. $result = safe_mysql_query($SQLquery);
  398. while ($row = mysql_fetch_array($result))
  399. {
  400. //$AlreadyInDatabase[] = strtolower($row['filename']);
  401. $AlreadyInDatabase[] = $row['filename'];
  402. }
  403. }
  404. $DirectoriesToScan = array(@$_REQUEST['scan'] ? $_REQUEST['scan'] : $_REQUEST['newscan']);
  405. $DirectoriesScanned = array();
  406. while (count($DirectoriesToScan) > 0)
  407. {
  408. foreach ($DirectoriesToScan as $DirectoryKey => $startingdir)
  409. {
  410. if ($dir = opendir($startingdir))
  411. {
  412. set_time_limit(30);
  413. echo '<b>' . str_replace('\\', '/', $startingdir) . '</b><br>';
  414. flush();
  415. while (($file = readdir($dir)) !== false)
  416. {
  417. if (($file != '.') && ($file != '..'))
  418. {
  419. $RealPathName = realpath($startingdir . '/' . $file);
  420. if (is_dir($RealPathName))
  421. {
  422. if (! in_array($RealPathName, $DirectoriesScanned) && ! in_array($RealPathName, $DirectoriesToScan))
  423. {
  424. $DirectoriesToScan[] = $RealPathName;
  425. }
  426. }
  427. else
  428. if (is_file($RealPathName))
  429. {
  430. if (! empty($_REQUEST['newscan']))
  431. {
  432. if (! in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase))
  433. {
  434. $FilesInDir[] = $RealPathName;
  435. }
  436. }
  437. elseif (! empty($_REQUEST['scan']))
  438. {
  439. $FilesInDir[] = $RealPathName;
  440. }
  441. }
  442. }
  443. }
  444. closedir($dir);
  445. }
  446. else
  447. {
  448. echo '<FONT COLOR="RED">Failed to open directory "<b>' . $startingdir . '</b>"</FONT><br><br>';
  449. }
  450. $DirectoriesScanned[] = $startingdir;
  451. unset($DirectoriesToScan[$DirectoryKey]);
  452. }
  453. }
  454. echo '<i>List of files to scan complete (added ' . number_format(count($FilesInDir)) . ' files to scan)</i><hr>';
  455. flush();
  456. }
  457. $FilesInDir = array_unique($FilesInDir);
  458. sort($FilesInDir);
  459. $starttime = time();
  460. $rowcounter = 0;
  461. $totaltoprocess = count($FilesInDir);
  462. foreach ($FilesInDir as $filename)
  463. {
  464. set_time_limit(300);
  465. echo '<br>' . date('H:i:s') . ' [' . number_format(++ $rowcounter) . ' / ' . number_format($totaltoprocess) . '] ' . str_replace('\\', '/', $filename);
  466. $ThisFileInfo = $getID3->analyze($filename);
  467. getid3_lib :: CopyTagsToComments($ThisFileInfo);
  468. if (file_exists($filename))
  469. {
  470. $ThisFileInfo['file_modified_time'] = filemtime($filename);
  471. $ThisFileInfo['md5_file'] = ($getid3_demo_mysql_md5_file ? md5_file($filename) : '');
  472. }
  473. if (empty($ThisFileInfo['fileformat']))
  474. {
  475. echo ' (<span style="color: #990099;">unknown file type</span>)';
  476. }
  477. else
  478. {
  479. if (! empty($ThisFileInfo['error']))
  480. {
  481. echo ' (<span style="color: #FF0000;">errors</span>)';
  482. }
  483. elseif (! empty($ThisFileInfo['warning']))
  484. {
  485. echo ' (<span style="color: #FF9999;">warnings</span>)';
  486. }
  487. else
  488. {
  489. echo ' (<span style="color: #009900;">OK</span>)';
  490. }
  491. $this_track_track = '';
  492. if (! empty($ThisFileInfo['comments']['track']))
  493. {
  494. foreach ($ThisFileInfo['comments']['track'] as $key => $value)
  495. {
  496. if (strlen($value) > strlen($this_track_track))
  497. {
  498. $this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT);
  499. }
  500. }
  501. if (ereg('^([0-9]+)/([0-9]+)$', $this_track_track, $matches))
  502. {
  503. // change "1/5"->"01/05", "3/12"->"03/12", etc
  504. $this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT) . '/' . str_pad($matches[2], 2, '0', STR_PAD_LEFT);
  505. }
  506. }
  507. $this_track_remix = '';
  508. $this_track_title = '';
  509. if (! empty($ThisFileInfo['comments']['title']))
  510. {
  511. foreach ($ThisFileInfo['comments']['title'] as $possible_title)
  512. {
  513. if (strlen($possible_title) > strlen($this_track_title))
  514. {
  515. $this_track_title = $possible_title;
  516. }
  517. }
  518. }
  519. $ParenthesesPairs = array('()', '[]', '{}');
  520. foreach ($ParenthesesPairs as $pair)
  521. {
  522. 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))
  523. {
  524. $this_track_title = $matches[1][0];
  525. $this_track_remix = implode("\t", $matches[2]);
  526. }
  527. }
  528. if (! empty($_REQUEST['rescanerrors']))
  529. {
  530. $SQLquery = 'UPDATE `' . GETID3_DB_TABLE . '` SET ';
  531. $SQLquery .= '`LastModified` = "' . mysql_escape_string(@$ThisFileInfo['file_modified_time']) . '", ';
  532. $SQLquery .= '`md5_file` = "' . mysql_escape_string(@$ThisFileInfo['md5_file']) . '", ';
  533. $SQLquery .= '`md5_data` = "' . mysql_escape_string(@$ThisFileInfo['md5_data']) . '", ';
  534. $SQLquery .= '`md5_data_source` = "' . mysql_escape_string(@$ThisFileInfo['md5_data_source']) . '", ';
  535. $SQLquery .= '`filesize` = "' . mysql_escape_string(@$ThisFileInfo['filesize']) . '", ';
  536. $SQLquery .= '`fileformat` = "' . mysql_escape_string(@$ThisFileInfo['fileformat']) . '", ';
  537. $SQLquery .= '`audio_dataformat` = "' . mysql_escape_string(@$ThisFileInfo['audio']['dataformat']) . '", ';
  538. $SQLquery .= '`video_dataformat` = "' . mysql_escape_string(@$ThisFileInfo['video']['dataformat']) . '", ';
  539. $SQLquery .= '`audio_bitrate` = "' . mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])) . '", ';
  540. $SQLquery .= '`video_bitrate` = "' . mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])) . '", ';
  541. $SQLquery .= '`playtime_seconds` = "' . mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])) . '", ';
  542. $SQLquery .= '`tags` = "' . mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))) . '", ';
  543. $SQLquery .= '`artist` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])) . '", ';
  544. $SQLquery .= '`title` = "' . mysql_escape_string($this_track_title) . '", ';
  545. $SQLquery .= '`remix` = "' . mysql_escape_string($this_track_remix) . '", ';
  546. $SQLquery .= '`album` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])) . '", ';
  547. $SQLquery .= '`genre` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])) . '", ';
  548. $SQLquery .= '`comment` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])) . '", ';
  549. $SQLquery .= '`track` = "' . mysql_escape_string($this_track_track) . '", ';
  550. $SQLquery .= '`comments_all` = "' . mysql_escape_string(@serialize(@$ThisFileInfo['comments'])) . '", ';
  551. $SQLquery .= '`comments_id3v2` = "' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])) . '", ';
  552. $SQLquery .= '`comments_ape` = "' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])) . '", ';
  553. $SQLquery .= '`comments_lyrics3` = "' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])) . '", ';
  554. $SQLquery .= '`comments_id3v1` = "' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])) . '", ';
  555. $SQLquery .= '`warning` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])) . '", ';
  556. $SQLquery .= '`error` = "' . mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])) . '", ';
  557. $SQLquery .= '`encoder_options` = "' . mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'] . ' ' . @$ThisFileInfo['audio']['encoder_options'])) . '", ';
  558. $SQLquery .= '`vbr_method` = "' . mysql_escape_string(@$ThisFileInfo['mpeg']['audio']['VBR_method']) . '", ';
  559. $SQLquery .= '`track_volume` = "' . mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])) . '" ';
  560. $SQLquery .= 'WHERE (`filename` = "' . mysql_escape_string(@$ThisFileInfo['filenamepath']) . '")';
  561. }
  562. elseif (! empty($_REQUEST['scan']) || ! empty($_REQUEST['newscan']))
  563. {
  564. $SQLquery = 'INSERT INTO `' . GETID3_DB_TABLE . '` (`filename`, `LastModified`, `md5_file`, `md5_data`, `md5_data_source`, `filesize`, `fileformat`, `audio_dataformat`, `video_dataformat`, `audio_bitrate`, `video_bitrate`, `playtime_seconds`, `tags`, `artist`, `title`, `remix`, `album`, `genre`, `comment`, `track`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`, `warning`, `error`, `encoder_options`, `vbr_method`, `track_volume`) VALUES (';
  565. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['filenamepath']) . '", ';
  566. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['file_modified_time']) . '", ';
  567. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['md5_file']) . '", ';
  568. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['md5_data']) . '", ';
  569. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['md5_data_source']) . '", ';
  570. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['filesize']) . '", ';
  571. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['fileformat']) . '", ';
  572. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['audio']['dataformat']) . '", ';
  573. $SQLquery .= '"' . mysql_escape_string(@$ThisFileInfo['video']['dataformat']) . '", ';
  574. $SQLquery .= '"' . mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])) . '", ';
  575. $SQLquery .= '"' . mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])) . '", ';
  576. $SQLquery .= '"' . mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])) . '", ';
  577. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))) . '", ';
  578. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])) . '", ';
  579. $SQLquery .= '"' . mysql_escape_string($this_track_title) . '", ';
  580. $SQLquery .= '"' . mysql_escape_string($this_track_remix) . '", ';
  581. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])) . '", ';
  582. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])) . '", ';
  583. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])) . '", ';
  584. $SQLquery .= '"' . mysql_escape_string($this_track_track) . '", ';
  585. $SQLquery .= '"' . mysql_escape_string(@serialize(@$ThisFileInfo['comments'])) . '", ';
  586. $SQLquery .= '"' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])) . '", ';
  587. $SQLquery .= '"' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])) . '", ';
  588. $SQLquery .= '"' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])) . '", ';
  589. $SQLquery .= '"' . mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])) . '", ';
  590. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])) . '", ';
  591. $SQLquery .= '"' . mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])) . '", ';
  592. $SQLquery .= '"' . mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'] . ' ' . @$ThisFileInfo['audio']['encoder_options'])) . '", ';
  593. $SQLquery .= '"' . mysql_escape_string(! empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : @$ThisFileInfo['mpeg']['audio']['VBR_method']) . '", ';
  594. $SQLquery .= '"' . mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])) . '")';
  595. }
  596. flush();
  597. safe_mysql_query($SQLquery);
  598. }
  599. }
  600. $SQLquery = 'OPTIMIZE TABLE `' . GETID3_DB_TABLE . '`';
  601. safe_mysql_query($SQLquery);
  602. echo '<hr>Done scanning!<hr>';
  603. }
  604. elseif (! empty($_REQUEST['missingtrackvolume']))
  605. {
  606. $MissingTrackVolumeFilesScanned = 0;
  607. $MissingTrackVolumeFilesAdjusted = 0;
  608. $MissingTrackVolumeFilesDeleted = 0;
  609. $SQLquery = 'SELECT `filename`';
  610. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  611. $SQLquery .= ' WHERE (`track_volume` = "0")';
  612. $SQLquery .= ' AND (`audio_bitrate` > "0")';
  613. $result = safe_mysql_query($SQLquery);
  614. echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / ' . number_format(mysql_num_rows($result)) . ' files for track volume information:<hr>';
  615. while ($row = mysql_fetch_array($result))
  616. {
  617. set_time_limit(30);
  618. echo '<script type="text/javascript">if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "' . number_format($MissingTrackVolumeFilesScanned ++) . '";</script>. ';
  619. flush();
  620. if (file_exists($row['filename']))
  621. {
  622. $ThisFileInfo = $getID3->analyze($row['filename']);
  623. if (! empty($ThisFileInfo['replay_gain']['track']['volume']))
  624. {
  625. $MissingTrackVolumeFilesAdjusted ++;
  626. $SQLquery = 'UPDATE `' . GETID3_DB_TABLE . '`';
  627. $SQLquery .= ' SET `track_volume` = "' . $ThisFileInfo['replay_gain']['track']['volume'] . '"';
  628. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($row['filename']) . '")';
  629. safe_mysql_query($SQLquery);
  630. }
  631. }
  632. else
  633. {
  634. $MissingTrackVolumeFilesDeleted ++;
  635. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  636. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($row['filename']) . '")';
  637. safe_mysql_query($SQLquery);
  638. }
  639. }
  640. echo '<hr>Scanned ' . number_format($MissingTrackVolumeFilesScanned) . ' files with no track volume information.<br>';
  641. 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>';
  642. }
  643. elseif (! empty($_REQUEST['deadfilescheck']))
  644. {
  645. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  646. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  647. $SQLquery .= ' GROUP BY `filename`';
  648. $SQLquery .= ' ORDER BY `num` DESC';
  649. $result = safe_mysql_query($SQLquery);
  650. $DupesDeleted = 0;
  651. while ($row = mysql_fetch_array($result))
  652. {
  653. set_time_limit(30);
  654. if ($row['num'] <= 1)
  655. {
  656. break;
  657. }
  658. echo '<br>' . FixTextFields($row['filename']) . ' (<font color="#FF9999">duplicate</font>)';
  659. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  660. $SQLquery .= ' WHERE `filename` LIKE "' . mysql_escape_string($row['filename']) . '"';
  661. safe_mysql_query($SQLquery);
  662. $DupesDeleted ++;
  663. }
  664. if ($DupesDeleted > 0)
  665. {
  666. echo '<hr>Deleted <b>' . number_format($DupesDeleted) . '</b> duplicate filenames<hr>';
  667. }
  668. $SQLquery = 'SELECT `filename`, `filesize`, `LastModified`';
  669. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  670. $SQLquery .= ' ORDER BY `filename` ASC';
  671. $result = safe_mysql_query($SQLquery);
  672. $totalchecked = 0;
  673. $totalremoved = 0;
  674. $previousdir = '';
  675. while ($row = mysql_fetch_array($result))
  676. {
  677. $totalchecked ++;
  678. set_time_limit(30);
  679. $reason = '';
  680. if (! file_exists($row['filename']))
  681. {
  682. $reason = 'deleted';
  683. }
  684. elseif (filesize($row['filename']) != $row['filesize'])
  685. {
  686. $reason = 'filesize changed';
  687. }
  688. elseif (filemtime($row['filename']) != $row['LastModified'])
  689. {
  690. if (abs(filemtime($row['filename']) - $row['LastModified']) != 3600)
  691. {
  692. // off by exactly one hour == daylight savings time
  693. $reason = 'last-modified time changed';
  694. }
  695. }
  696. $thisdir = dirname($row['filename']);
  697. if ($reason)
  698. {
  699. $totalremoved ++;
  700. echo '<br>' . FixTextFields($row['filename']) . ' (<font color="#FF9999">' . $reason . '</font>)';
  701. flush();
  702. $SQLquery = 'DELETE FROM `' . GETID3_DB_TABLE . '`';
  703. $SQLquery .= ' WHERE (`filename` = "' . mysql_escape_string($row['filename']) . '")';
  704. safe_mysql_query($SQLquery);
  705. }
  706. elseif ($thisdir != $previousdir)
  707. {
  708. echo '. ';
  709. flush();
  710. }
  711. $previousdir = $thisdir;
  712. }
  713. 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>';
  714. }
  715. elseif (! empty($_REQUEST['encodedbydistribution']))
  716. {
  717. if (! empty($_REQUEST['m3u']))
  718. {
  719. header('Content-type: audio/x-mpegurl');
  720. echo '#EXTM3U' . "\n";
  721. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  722. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  723. $SQLquery .= ' WHERE (`encoder_options` = "' . mysql_escape_string($_REQUEST['encodedbydistribution']) . '")';
  724. $result = mysql_query($SQLquery);
  725. $NonBlankEncodedBy = '';
  726. $BlankEncodedBy = '';
  727. while ($row = mysql_fetch_array($result))
  728. {
  729. set_time_limit(30);
  730. $CommentArray = unserialize($row['comments_id3v2']);
  731. if (isset($CommentArray['encoded_by'][0]))
  732. {
  733. $NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename']) . "\n";
  734. }
  735. else
  736. {
  737. $BlankEncodedBy .= WindowsShareSlashTranslate($row['filename']) . "\n";
  738. }
  739. }
  740. echo $NonBlankEncodedBy;
  741. echo $BlankEncodedBy;
  742. exit();
  743. }
  744. elseif (! empty($_REQUEST['showfiles']))
  745. {
  746. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encodedbydistribution=' . urlencode('%')) . '">show all</a><br>';
  747. echo '<table border="1">';
  748. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  749. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  750. $result = mysql_query($SQLquery);
  751. while ($row = mysql_fetch_array($result))
  752. {
  753. set_time_limit(30);
  754. $CommentArray = unserialize($row['comments_id3v2']);
  755. if (($_REQUEST['encodedbydistribution'] == '%') || (! empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0])))
  756. {
  757. echo '<tr><td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  758. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td></tr>';
  759. }
  760. }
  761. echo '</table>';
  762. }
  763. else
  764. {
  765. $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`';
  766. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  767. $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC';
  768. $result = mysql_query($SQLquery);
  769. $EncodedBy = array();
  770. while ($row = mysql_fetch_array($result))
  771. {
  772. set_time_limit(30);
  773. $CommentArray = unserialize($row['comments_id3v2']);
  774. if (isset($EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]]))
  775. {
  776. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]] ++;
  777. }
  778. else
  779. {
  780. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]] = 1;
  781. }
  782. }
  783. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encodedbydistribution=' . urlencode('%') . '&m3u=1') . '">.m3u version</a><br>';
  784. echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>';
  785. foreach ($EncodedBy as $key => $value)
  786. {
  787. echo '<tr><TD VALIGN="TOP"><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encodedbydistribution=' . urlencode($key) . '&showfiles=1&m3u=1') . '">m3u</a></td>';
  788. echo '<TD VALIGN="TOP"><b>' . $key . '</b></td>';
  789. echo '<td><table border="0" WIDTH="100%">';
  790. arsort($value);
  791. foreach ($value as $string => $count)
  792. {
  793. echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>' . number_format($count) . '</i></td><td>&nbsp;</td>';
  794. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encodedbydistribution=' . urlencode($string) . '&showfiles=1') . '">' . $string . '</a></td></tr>';
  795. }
  796. echo '</table></td></tr>';
  797. }
  798. echo '</table>';
  799. }
  800. }
  801. elseif (! empty($_REQUEST['audiobitrates']))
  802. {
  803. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'module.audio.mp3.php', __FILE__, true);
  804. $BitrateDistribution = array();
  805. $SQLquery = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`';
  806. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  807. $SQLquery .= ' WHERE (`audio_bitrate` > 0)';
  808. $SQLquery .= ' GROUP BY `RoundBitrate`';
  809. $result = safe_mysql_query($SQLquery);
  810. while ($row = mysql_fetch_array($result))
  811. {
  812. @$BitrateDistribution[getid3_mp3 :: ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000)] += $row['num']; // safe_inc
  813. }
  814. echo '<table border="1" cellspacing="0" cellpadding="3">';
  815. echo '<tr><th>Bitrate</th><th>Count</th></tr>';
  816. foreach ($BitrateDistribution as $Bitrate => $Count)
  817. {
  818. echo '<tr>';
  819. echo '<TD ALIGN="RIGHT">' . round($Bitrate / 1000) . ' kbps</td>';
  820. echo '<TD ALIGN="RIGHT">' . number_format($Count) . '</td>';
  821. echo '</tr>';
  822. }
  823. echo '</table>';
  824. }
  825. elseif (! empty($_REQUEST['emptygenres']))
  826. {
  827. $SQLquery = 'SELECT `fileformat`, `filename`, `genre`';
  828. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  829. $SQLquery .= ' WHERE (`genre` = "")';
  830. $SQLquery .= ' OR (`genre` = "Unknown")';
  831. $SQLquery .= ' OR (`genre` = "Other")';
  832. $SQLquery .= ' ORDER BY `filename` ASC';
  833. $result = safe_mysql_query($SQLquery);
  834. if (! empty($_REQUEST['m3u']))
  835. {
  836. header('Content-type: audio/x-mpegurl');
  837. echo '#EXTM3U' . "\n";
  838. while ($row = mysql_fetch_array($result))
  839. {
  840. if (! in_array($row['fileformat'], $IgnoreNoTagFormats))
  841. {
  842. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  843. }
  844. }
  845. exit();
  846. }
  847. else
  848. {
  849. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?emptygenres=' . urlencode($_REQUEST['emptygenres']) . '&m3u=1') . '">.m3u version</a><br>';
  850. $EmptyGenreCounter = 0;
  851. echo '<table border="1" cellspacing="0" cellpadding="3">';
  852. echo '<tr><th>m3u</th><th>filename</th></tr>';
  853. while ($row = mysql_fetch_array($result))
  854. {
  855. if (! in_array($row['fileformat'], $IgnoreNoTagFormats))
  856. {
  857. $EmptyGenreCounter ++;
  858. echo '<tr>';
  859. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  860. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  861. echo '</tr>';
  862. }
  863. }
  864. echo '</table>';
  865. echo '<b>' . number_format($EmptyGenreCounter) . '</b> files with empty genres';
  866. }
  867. }
  868. elseif (! empty($_REQUEST['nonemptycomments']))
  869. {
  870. $SQLquery = 'SELECT `filename`, `comment`';
  871. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  872. $SQLquery .= ' WHERE (`comment` <> "")';
  873. $SQLquery .= ' ORDER BY `comment` ASC';
  874. $result = safe_mysql_query($SQLquery);
  875. if (! empty($_REQUEST['m3u']))
  876. {
  877. header('Content-type: audio/x-mpegurl');
  878. echo '#EXTM3U' . "\n";
  879. while ($row = mysql_fetch_array($result))
  880. {
  881. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  882. }
  883. exit();
  884. }
  885. else
  886. {
  887. $NonEmptyCommentsCounter = 0;
  888. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?nonemptycomments=' . urlencode($_REQUEST['nonemptycomments']) . '&m3u=1') . '">.m3u version</a><br>';
  889. echo '<table border="1" cellspacing="0" cellpadding="3">';
  890. echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>';
  891. while ($row = mysql_fetch_array($result))
  892. {
  893. $NonEmptyCommentsCounter ++;
  894. echo '<tr>';
  895. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  896. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  897. if (strlen(trim($row['comment'])) > 0)
  898. {
  899. echo '<td>' . FixTextFields($row['comment']) . '</td>';
  900. }
  901. else
  902. {
  903. echo '<td><i>space</i></td>';
  904. }
  905. echo '</tr>';
  906. }
  907. echo '</table>';
  908. echo '<b>' . number_format($NonEmptyCommentsCounter) . '</b> files with non-empty comments';
  909. }
  910. }
  911. elseif (! empty($_REQUEST['trackzero']))
  912. {
  913. $SQLquery = 'SELECT `filename`, `track`';
  914. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  915. $SQLquery .= ' WHERE (`track` <> "")';
  916. $SQLquery .= ' AND ((`track` < "1")';
  917. $SQLquery .= ' OR (`track` > "99"))';
  918. $SQLquery .= ' ORDER BY `filename` ASC';
  919. $result = safe_mysql_query($SQLquery);
  920. if (! empty($_REQUEST['m3u']))
  921. {
  922. header('Content-type: audio/x-mpegurl');
  923. echo '#EXTM3U' . "\n";
  924. while ($row = mysql_fetch_array($result))
  925. {
  926. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99))
  927. {
  928. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  929. }
  930. }
  931. exit();
  932. }
  933. else
  934. {
  935. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?trackzero=' . urlencode($_REQUEST['trackzero']) . '&m3u=1') . '">.m3u version</a><br>';
  936. $TrackZeroCounter = 0;
  937. echo '<table border="1" cellspacing="0" cellpadding="3">';
  938. echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>';
  939. while ($row = mysql_fetch_array($result))
  940. {
  941. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99))
  942. {
  943. $TrackZeroCounter ++;
  944. echo '<tr>';
  945. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  946. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  947. echo '<td>' . FixTextFields($row['track']) . '</td>';
  948. echo '</tr>';
  949. }
  950. }
  951. echo '</table>';
  952. echo '<b>' . number_format($TrackZeroCounter) . '</b> files with track "zero"';
  953. }
  954. }
  955. elseif (! empty($_REQUEST['titlefeat']))
  956. {
  957. $SQLquery = 'SELECT `filename`, `title`';
  958. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  959. $SQLquery .= ' WHERE (`title` LIKE "%feat.%")';
  960. $SQLquery .= ' ORDER BY `filename` ASC';
  961. $result = safe_mysql_query($SQLquery);
  962. if (! empty($_REQUEST['m3u']))
  963. {
  964. header('Content-type: audio/x-mpegurl');
  965. echo '#EXTM3U' . "\n";
  966. while ($row = mysql_fetch_array($result))
  967. {
  968. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  969. }
  970. exit();
  971. }
  972. else
  973. {
  974. echo '<b>' . number_format(mysql_num_rows($result)) . '</b> files with "feat." in the title (instead of the artist)<br><br>';
  975. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?titlefeat=' . urlencode($_REQUEST['titlefeat']) . '&m3u=1') . '">.m3u version</a><br>';
  976. echo '<table border="1" cellspacing="0" cellpadding="3">';
  977. echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>';
  978. while ($row = mysql_fetch_array($result))
  979. {
  980. echo '<tr>';
  981. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  982. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  983. echo '<td>' . eregi_replace('(feat\. .*)', '<b>\\1</b>', FixTextFields($row['title'])) . '</td>';
  984. echo '</tr>';
  985. }
  986. echo '</table>';
  987. }
  988. }
  989. elseif (! empty($_REQUEST['tracknoalbum']))
  990. {
  991. $SQLquery = 'SELECT `filename`, `track`, `album`';
  992. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  993. $SQLquery .= ' WHERE (`track` <> "")';
  994. $SQLquery .= ' AND (`album` = "")';
  995. $SQLquery .= ' ORDER BY `filename` ASC';
  996. $result = safe_mysql_query($SQLquery);
  997. if (! empty($_REQUEST['m3u']))
  998. {
  999. header('Content-type: audio/x-mpegurl');
  1000. echo '#EXTM3U' . "\n";
  1001. while ($row = mysql_fetch_array($result))
  1002. {
  1003. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1004. }
  1005. exit();
  1006. }
  1007. else
  1008. {
  1009. echo '<b>' . number_format(mysql_num_rows($result)) . '</b> files with a track number, but no album<br><br>';
  1010. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?tracknoalbum=' . urlencode($_REQUEST['tracknoalbum']) . '&m3u=1') . '">.m3u version</a><br>';
  1011. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1012. echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>';
  1013. while ($row = mysql_fetch_array($result))
  1014. {
  1015. echo '<tr>';
  1016. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  1017. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1018. echo '<td>' . FixTextFields($row['track']) . '</td>';
  1019. echo '<td>' . FixTextFields($row['album']) . '</td>';
  1020. echo '</tr>';
  1021. }
  1022. echo '</table>';
  1023. }
  1024. }
  1025. elseif (! empty($_REQUEST['synchronizetagsfrom']) && ! empty($_REQUEST['filename']))
  1026. {
  1027. echo 'Applying new tags from <b>' . $_REQUEST['synchronizetagsfrom'] . '</b> in <b>' . FixTextFields($_REQUEST['filename']) . '</b><ul>';
  1028. $errors = array();
  1029. if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors))
  1030. {
  1031. echo '<li>Sucessfully wrote tags</li>';
  1032. }
  1033. else
  1034. {
  1035. echo '<li>Tag writing had errors: <ul><li>' . implode('</li><li>', $errors) . '</li></ul></li>';
  1036. }
  1037. echo '</ul>';
  1038. }
  1039. elseif (! empty($_REQUEST['unsynchronizedtags']))
  1040. {
  1041. $NotOKfiles = 0;
  1042. $Autofixedfiles = 0;
  1043. $FieldsToCompare = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track');
  1044. $TagsToCompare = array('id3v2' => false, 'ape' => false, 'lyrics3' => false, 'id3v1' => false);
  1045. $ID3v1FieldLengths = array('title' => 30, 'artist' => 30, 'album' => 30, 'year' => 4, 'genre' => 99, 'comment' => 28);
  1046. if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false)
  1047. {
  1048. $TagsToCompare['id3v2'] = true;
  1049. }
  1050. if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false)
  1051. {
  1052. $TagsToCompare['ape'] = true;
  1053. }
  1054. if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false)
  1055. {
  1056. $TagsToCompare['lyrics3'] = true;
  1057. }
  1058. if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false)
  1059. {
  1060. $TagsToCompare['id3v1'] = true;
  1061. }
  1062. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?unsynchronizedtags=' . urlencode($_REQUEST['unsynchronizedtags']) . '&autofix=1') . '">Auto-fix empty tags</a><br><br>';
  1063. echo '<div id="Autofixing"></div>';
  1064. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1065. echo '<tr>';
  1066. echo '<th>View</th>';
  1067. echo '<th>Filename</th>';
  1068. echo '<th>Combined</th>';
  1069. if ($TagsToCompare['id3v2'])
  1070. {
  1071. 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>';
  1072. }
  1073. if ($TagsToCompare['ape'])
  1074. {
  1075. 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>';
  1076. }
  1077. if ($TagsToCompare['lyrics3'])
  1078. {
  1079. echo '<th>Lyrics3</th>';
  1080. }
  1081. if ($TagsToCompare['id3v1'])
  1082. {
  1083. 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>';
  1084. }
  1085. echo '</tr>';
  1086. $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`';
  1087. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1088. $SQLquery .= ' WHERE (`fileformat` = "mp3")';
  1089. $SQLquery .= ' ORDER BY `filename` ASC';
  1090. $result = safe_mysql_query($SQLquery);
  1091. $lastdir = '';
  1092. while ($row = mysql_fetch_array($result))
  1093. {
  1094. set_time_limit(30);
  1095. if ($lastdir != dirname($row['filename']))
  1096. {
  1097. echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "' . htmlentities($lastdir, ENT_QUOTES) . '";</script>';
  1098. flush();
  1099. }
  1100. $FileOK = true;
  1101. $Mismatched = array('id3v2' => false, 'ape' => false, 'lyrics3' => false, 'id3v1' => false);
  1102. $SemiMatched = array('id3v2' => false, 'ape' => false, 'lyrics3' => false, 'id3v1' => false);
  1103. $EmptyTags = array('id3v2' => true, 'ape' => true, 'lyrics3' => true, 'id3v1' => true);
  1104. $Comments['all'] = @unserialize($row['comments_all']);
  1105. $Comments['id3v2'] = @unserialize($row['comments_id3v2']);
  1106. $Comments['ape'] = @unserialize($row['comments_ape']);
  1107. $Comments['lyrics3'] = @unserialize($row['comments_lyrics3']);
  1108. $Comments['id3v1'] = @unserialize($row['comments_id3v1']);
  1109. if (isset($Comments['ape']['tracknumber']))
  1110. {
  1111. $Comments['ape']['track'] = $Comments['ape']['tracknumber'];
  1112. unset($Comments['ape']['tracknumber']);
  1113. }
  1114. if (isset($Comments['ape']['track_number']))
  1115. {
  1116. $Comments['ape']['track'] = $Comments['ape']['track_number'];
  1117. unset($Comments['ape']['track_number']);
  1118. }
  1119. if (isset($Comments['id3v2']['track_number']))
  1120. {
  1121. $Comments['id3v2']['track'] = $Comments['id3v2']['track_number'];
  1122. unset($Comments['id3v2']['track_number']);
  1123. }
  1124. if (! empty($Comments['all']['track']))
  1125. {
  1126. $besttrack = '';
  1127. foreach ($Comments['all']['track'] as $key => $value)
  1128. {
  1129. if (strlen($value) > strlen($besttrack))
  1130. {
  1131. $besttrack = $value;
  1132. }
  1133. }
  1134. $Comments['all']['track'] = array(0 => $besttrack);
  1135. }
  1136. $ThisLine = '<tr>';
  1137. $ThisLine .= '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">view</a></td>';
  1138. $ThisLine .= '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1139. $tagvalues = '';
  1140. foreach ($FieldsToCompare as $fieldname)
  1141. {
  1142. $tagvalues .= $fieldname . ' = ' . @implode(" \n", @$Comments['all'][$fieldname]) . " \n";
  1143. }
  1144. $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>';
  1145. foreach ($TagsToCompare as $tagtype => $CompareThisTagType)
  1146. {
  1147. if ($CompareThisTagType)
  1148. {
  1149. $tagvalues = '';
  1150. foreach ($FieldsToCompare as $fieldname)
  1151. {
  1152. if ($tagtype == 'id3v1')
  1153. {
  1154. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'module.tag.id3v1.php', __FILE__, true);
  1155. if (($fieldname == 'genre') && ! getid3_id3v1 :: LookupGenreID(@$Comments['all'][$fieldname][0]))
  1156. {
  1157. // non-standard genres can never match, so just ignore
  1158. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1159. }
  1160. elseif ($fieldname == 'comment')
  1161. {
  1162. if (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 28)))
  1163. {
  1164. //echo __LINE__.'<br>';
  1165. //echo '<pre>';
  1166. //var_dump($tagtype);
  1167. //var_dump($fieldname);
  1168. //echo '<pre>';
  1169. //exit;
  1170. $tagvalues .= $fieldname . ' = [[' . @$Comments[$tagtype][$fieldname][0] . ']]' . "\n";
  1171. if (trim(strtolower(RemoveAccents(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr(@$Comments['all'][$fieldname][0], 0, 28)))))
  1172. {
  1173. $SemiMatched[$tagtype] = true;
  1174. }
  1175. else
  1176. {
  1177. $Mismatched[$tagtype] = true;
  1178. }
  1179. $FileOK = false;
  1180. }
  1181. else
  1182. {
  1183. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1184. }
  1185. }
  1186. elseif ($fieldname == 'track')
  1187. {
  1188. // intval('01/20') == intval('1')
  1189. if (intval(@$Comments[$tagtype][$fieldname][0]) != intval(@$Comments['all'][$fieldname][0]))
  1190. {
  1191. //echo __LINE__.'<br>';
  1192. //echo '<pre>';
  1193. //var_dump($tagtype);
  1194. //var_dump($fieldname);
  1195. //echo '<pre>';
  1196. //exit;
  1197. $tagvalues .= $fieldname . ' = [[' . @$Comments[$tagtype][$fieldname][0] . ']]' . "\n";
  1198. $Mismatched[$tagtype] = true;
  1199. $FileOK = false;
  1200. }
  1201. else
  1202. {
  1203. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1204. }
  1205. }
  1206. elseif (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 30)))
  1207. {
  1208. //echo __LINE__.'<br>';
  1209. //echo '<pre>';
  1210. //var_dump($tagtype);
  1211. //var_dump($fieldname);
  1212. //echo '<pre>';
  1213. //exit;
  1214. $tagvalues .= $fieldname . ' = [[' . @$Comments[$tagtype][$fieldname][0] . ']]' . "\n";
  1215. if (strtolower(RemoveAccents(trim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)))) == strtolower(RemoveAccents(trim(substr(@$Comments['all'][$fieldname][0], 0, 30)))))
  1216. {
  1217. $SemiMatched[$tagtype] = true;
  1218. }
  1219. else
  1220. {
  1221. $Mismatched[$tagtype] = true;
  1222. }
  1223. $FileOK = false;
  1224. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1225. {
  1226. $EmptyTags[$tagtype] = false;
  1227. }
  1228. }
  1229. else
  1230. {
  1231. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1232. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1233. {
  1234. $EmptyTags[$tagtype] = false;
  1235. }
  1236. }
  1237. }
  1238. elseif (($tagtype == 'ape') && ($fieldname == 'year'))
  1239. {
  1240. if ((@$Comments['ape']['date'][0] != @$Comments['all']['year'][0]) && (@$Comments['ape']['year'][0] != @$Comments['all']['year'][0]))
  1241. {
  1242. $tagvalues .= $fieldname . ' = [[' . @$Comments['ape']['date'][0] . ']]' . "\n";
  1243. $Mismatched[$tagtype] = true;
  1244. $FileOK = false;
  1245. if (strlen(trim(@$Comments['ape']['date'][0])) > 0)
  1246. {
  1247. $EmptyTags[$tagtype] = false;
  1248. }
  1249. }
  1250. else
  1251. {
  1252. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1253. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1254. {
  1255. $EmptyTags[$tagtype] = false;
  1256. }
  1257. }
  1258. }
  1259. elseif (($fieldname == 'genre') && ! empty($Comments['all'][$fieldname]) && ! empty($Comments[$tagtype][$fieldname]) && in_array($Comments[$tagtype][$fieldname][0], $Comments['all'][$fieldname]))
  1260. {
  1261. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1262. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1263. {
  1264. $EmptyTags[$tagtype] = false;
  1265. }
  1266. }
  1267. elseif (@$Comments[$tagtype][$fieldname][0] != @$Comments['all'][$fieldname][0])
  1268. {
  1269. //echo __LINE__.'<br>';
  1270. //echo '<pre>';
  1271. //var_dump($tagtype);
  1272. //var_dump($fieldname);
  1273. //var_dump($Comments[$tagtype][$fieldname][0]);
  1274. //var_dump($Comments['all'][$fieldname][0]);
  1275. //echo '<pre>';
  1276. //exit;
  1277. $skiptracknumberfield = false;
  1278. switch ($fieldname)
  1279. {
  1280. case 'track' :
  1281. case 'tracknumber' :
  1282. case 'track_number' :
  1283. if (intval(@$Comments[$tagtype][$fieldname][0]) == intval(@$Comments['all'][$fieldname][0]))
  1284. {
  1285. $skiptracknumberfield = true;
  1286. }
  1287. break;
  1288. }
  1289. if (! $skiptracknumberfield)
  1290. {
  1291. $tagvalues .= $fieldname . ' = [[' . @$Comments[$tagtype][$fieldname][0] . ']]' . "\n";
  1292. if (trim(strtolower(RemoveAccents(@$Comments[$tagtype][$fieldname][0]))) == trim(strtolower(RemoveAccents(@$Comments['all'][$fieldname][0]))))
  1293. {
  1294. $SemiMatched[$tagtype] = true;
  1295. }
  1296. else
  1297. {
  1298. $Mismatched[$tagtype] = true;
  1299. }
  1300. $FileOK = false;
  1301. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1302. {
  1303. $EmptyTags[$tagtype] = false;
  1304. }
  1305. }
  1306. }
  1307. else
  1308. {
  1309. $tagvalues .= $fieldname . ' = ' . @$Comments[$tagtype][$fieldname][0] . "\n";
  1310. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0)
  1311. {
  1312. $EmptyTags[$tagtype] = false;
  1313. }
  1314. }
  1315. }
  1316. if ($EmptyTags[$tagtype])
  1317. {
  1318. $FileOK = false;
  1319. $ThisLine .= '<td bgcolor="#0099cc">';
  1320. }
  1321. elseif ($SemiMatched[$tagtype])
  1322. {
  1323. $ThisLine .= '<td bgcolor="#ff9999">';
  1324. }
  1325. elseif ($Mismatched[$tagtype])
  1326. {
  1327. $ThisLine .= '<td bgcolor="#ff0000">';
  1328. }
  1329. else
  1330. {
  1331. $ThisLine .= '<td bgcolor="#00cc00">';
  1332. }
  1333. $ThisLine .= '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?synchronizetagsfrom=' . $tagtype . '&filename=' . urlencode($row['filename'])) . '" title="' . htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES) . '" TARGET="retagwindow">' . $tagtype . '</a>';
  1334. $ThisLine .= '</td>';
  1335. }
  1336. }
  1337. $ThisLine .= '</tr>';
  1338. if (! $FileOK)
  1339. {
  1340. $NotOKfiles ++;
  1341. echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "' . htmlentities($row['filename'], ENT_QUOTES) . '";</script>';
  1342. flush();
  1343. if (! empty($_REQUEST['autofix']))
  1344. {
  1345. $AnyMismatched = false;
  1346. foreach ($Mismatched as $key => $value)
  1347. {
  1348. if ($value && ($EmptyTags["$key"] === false))
  1349. {
  1350. $AnyMismatched = true;
  1351. }
  1352. }
  1353. if ($AnyMismatched && empty($_REQUEST['autofixforcesource']))
  1354. {
  1355. echo $ThisLine;
  1356. }
  1357. else
  1358. {
  1359. $TagsToSynch = '';
  1360. foreach ($EmptyTags as $key => $value)
  1361. {
  1362. if ($value)
  1363. {
  1364. switch ($key)
  1365. {
  1366. case 'id3v1' :
  1367. $TagsToSynch .= '1';
  1368. break;
  1369. case 'id3v2' :
  1370. $TagsToSynch .= '2';
  1371. break;
  1372. case 'ape' :
  1373. $TagsToSynch .= 'A';
  1374. break;
  1375. }
  1376. }
  1377. }
  1378. $autofixforcesource = (@$_REQUEST['autofixforcesource'] ? $_REQUEST['autofixforcesource'] : 'all');
  1379. $TagsToSynch = (@$_REQUEST['autofixforcedest'] ? $_REQUEST['autofixforcedest'] : $TagsToSynch);
  1380. $errors = array();
  1381. if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors))
  1382. {
  1383. $Autofixedfiles ++;
  1384. echo '<tr bgcolor="#00CC00">';
  1385. }
  1386. else
  1387. {
  1388. echo '<tr bgcolor="#FF0000">';
  1389. }
  1390. echo '<td>&nbsp;</th>';
  1391. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '" title="' . FixTextFields(implode("\n", $errors)) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1392. echo '<td><table border="0">';
  1393. echo '<tr><td><b>' . $TagsToSynch . '</b></td></tr>';
  1394. echo '</table></td></tr>';
  1395. }
  1396. }
  1397. else
  1398. {
  1399. echo $ThisLine;
  1400. }
  1401. }
  1402. }
  1403. echo '</table><br>';
  1404. echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "";</script>';
  1405. echo 'Found <b>' . number_format($NotOKfiles) . '</b> files with unsynchronized tags, and auto-fixed ' . number_format($Autofixedfiles) . ' of them.';
  1406. }
  1407. elseif (! empty($_REQUEST['filenamepattern']))
  1408. {
  1409. $patterns['A'] = 'artist';
  1410. $patterns['T'] = 'title';
  1411. $patterns['M'] = 'album';
  1412. $patterns['N'] = 'track';
  1413. $patterns['G'] = 'genre';
  1414. $patterns['R'] = 'remix';
  1415. $FieldsToUse = explode(' ', wordwrap(eregi_replace('[^A-Z]', '', $_REQUEST['filenamepattern']), 1, ' ', 1));
  1416. //$FieldsToUse = explode(' ', wordwrap($_REQUEST['filenamepattern'], 1, ' ', 1));
  1417. foreach ($FieldsToUse as $FieldID)
  1418. {
  1419. $FieldNames[] = $patterns["$FieldID"];
  1420. }
  1421. $SQLquery = 'SELECT `filename`, `fileformat`, ' . implode(', ', $FieldNames);
  1422. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1423. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1424. $SQLquery .= ' ORDER BY `filename` ASC';
  1425. $result = safe_mysql_query($SQLquery);
  1426. echo 'Files that do not match naming pattern: (<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?filenamepattern=' . urlencode($_REQUEST['filenamepattern']) . '&autofix=1') . '">auto-fix</a>)<br>';
  1427. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1428. 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>' . (! @$_REQUEST['autofix'] ? '<br>(click to rename file to this)' : '') . '</td></tr>';
  1429. $nonmatchingfilenames = 0;
  1430. $Pattern = $_REQUEST['filenamepattern'];
  1431. $PatternLength = strlen($Pattern);
  1432. while ($row = mysql_fetch_array($result))
  1433. {
  1434. set_time_limit(10);
  1435. $PatternFilename = '';
  1436. for($i = 0; $i < $PatternLength; $i ++)
  1437. {
  1438. if (isset($patterns[$Pattern{$i}]))
  1439. {
  1440. $PatternFilename .= trim(strtr($row[$patterns[$Pattern{$i}]], ':\\*<>|', ';-����'), ' ');
  1441. }
  1442. else
  1443. {
  1444. $PatternFilename .= $Pattern{$i};
  1445. }
  1446. }
  1447. // Replace "~" with "-" if characters immediately before and after are both numbers,
  1448. // "/" has been replaced with "~" above which is good for multi-song medley dividers,
  1449. // but for things like 24/7, 7/8ths, etc it looks better if it's 24-7, 7-8ths, etc.
  1450. $PatternFilename = eregi_replace('([ a-z]+)/([ a-z]+)', '\\1~\\2', $PatternFilename);
  1451. $PatternFilename = str_replace('/', '�', $PatternFilename);
  1452. $PatternFilename = str_replace('?', '�', $PatternFilename);
  1453. $PatternFilename = str_replace(' "', ' �', $PatternFilename);
  1454. $PatternFilename = str_replace('("', '(�', $PatternFilename);
  1455. $PatternFilename = str_replace('-"', '-�', $PatternFilename);
  1456. $PatternFilename = str_replace('" ', '� ', $PatternFilename . ' ');
  1457. $PatternFilename = str_replace('"', '�', $PatternFilename);
  1458. $PatternFilename = str_replace(' ', ' ', $PatternFilename);
  1459. $ParenthesesPairs = array('()', '[]', '{}');
  1460. foreach ($ParenthesesPairs as $pair)
  1461. {
  1462. // multiple remixes are stored tab-seperated in the database.
  1463. // change "{2000 Version\tSomebody Remix}" into "{2000 Version} {Somebody Remix}"
  1464. while (ereg('^(.*)' . preg_quote($pair{0}) . '([^' . preg_quote($pair{1}) . ']*)(' . "\t" . ')([^' . preg_quote($pair{0}) . ']*)' . preg_quote($pair{1}), $PatternFilename, $matches))
  1465. {
  1466. $PatternFilename = $matches[1] . $pair{0} . $matches[2] . $pair{1} . ' ' . $pair{0} . $matches[4] . $pair{1};
  1467. }
  1468. // remove empty parenthesized pairs (probably where no track numbers, remix version, etc)
  1469. $PatternFilename = ereg_replace(preg_quote($pair), '', $PatternFilename);
  1470. // "[01] - Title With No Artist.mp3" ==> "[01] Title With No Artist.mp3"
  1471. $PatternFilename = ereg_replace(preg_quote($pair{1}) . ' +\- ', $pair{1} . ' ', $PatternFilename);
  1472. }
  1473. // get rid of leading & trailing spaces if end items (artist or title for example) are missing
  1474. $PatternFilename = trim($PatternFilename, ' -');
  1475. if (! $PatternFilename)
  1476. {
  1477. // no tags to create a filename from -- skip this file
  1478. continue;
  1479. }
  1480. $PatternFilename .= '.' . $row['fileformat'];
  1481. $ActualFilename = basename($row['filename']);
  1482. if ($ActualFilename != $PatternFilename)
  1483. {
  1484. $NotMatchedReasons = '';
  1485. if (strtolower($ActualFilename) === strtolower($PatternFilename))
  1486. {
  1487. $NotMatchedReasons .= 'Aa ';
  1488. }
  1489. elseif (RemoveAccents($ActualFilename) === RemoveAccents($PatternFilename))
  1490. {
  1491. $NotMatchedReasons .= '�e ';
  1492. }
  1493. $actualExt = '.' . fileextension($ActualFilename);
  1494. $patternExt = '.' . fileextension($PatternFilename);
  1495. $ActualFilenameNoExt = (($actualExt != '.') ? substr($ActualFilename, 0, 0 - strlen($actualExt)) : $ActualFilename);
  1496. $PatternFilenameNoExt = (($patternExt != '.') ? substr($PatternFilename, 0, 0 - strlen($patternExt)) : $PatternFilename);
  1497. if (strpos($PatternFilenameNoExt, $ActualFilenameNoExt) !== false)
  1498. {
  1499. $DifferenceBoldedName = str_replace($ActualFilenameNoExt, '</b>' . $ActualFilenameNoExt . '<b>', $PatternFilenameNoExt);
  1500. }
  1501. else
  1502. {
  1503. $ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt));
  1504. for($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset ++)
  1505. {
  1506. if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset})
  1507. {
  1508. break;
  1509. }
  1510. }
  1511. $DifferenceBoldedName = '</b>' . substr($PatternFilenameNoExt, 0, $DifferenceOffset) . '<b>' . substr($PatternFilenameNoExt, $DifferenceOffset);
  1512. }
  1513. $DifferenceBoldedName .= (($actualExt == $patternExt) ? '</b>' . $patternExt . '<b>' : $patternExt);
  1514. echo '<tr>';
  1515. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">view</a></td>';
  1516. echo '<td>&nbsp;' . $NotMatchedReasons . '</td>';
  1517. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">' . FixTextFields($ActualFilename) . '</a></td>';
  1518. if (@$_REQUEST['autofix'])
  1519. {
  1520. $results = '';
  1521. if (RenameFileFromTo($row['filename'], dirname($row['filename']) . '/' . $PatternFilename, $results))
  1522. {
  1523. echo '<TD BGCOLOR="#009900">';
  1524. }
  1525. else
  1526. {
  1527. echo '<TD BGCOLOR="#FF0000">';
  1528. }
  1529. echo '<b>' . $DifferenceBoldedName . '</b></td>';
  1530. }
  1531. else
  1532. {
  1533. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?filenamepattern=' . urlencode($_REQUEST['filenamepattern']) . '&renamefilefrom=' . urlencode($row['filename']) . '&renamefileto=' . urlencode(dirname($row['filename']) . '/' . $PatternFilename)) . '" title="' . FixTextFields(basename($row['filename'])) . "\n" . FixTextFields(basename($PatternFilename)) . '" TARGET="renamewindow">';
  1534. echo '<b>' . $DifferenceBoldedName . '</b></a></td>';
  1535. }
  1536. echo '</tr>';
  1537. $nonmatchingfilenames ++;
  1538. }
  1539. }
  1540. echo '</table><br>';
  1541. echo 'Found ' . number_format($nonmatchingfilenames) . ' files that do not match naming pattern<br>';
  1542. }
  1543. elseif (! empty($_REQUEST['encoderoptionsdistribution']))
  1544. {
  1545. if (isset($_REQUEST['showtagfiles']))
  1546. {
  1547. $SQLquery = 'SELECT `filename`, `encoder_options` FROM `' . GETID3_DB_TABLE . '`';
  1548. $SQLquery .= ' WHERE (`encoder_options` LIKE "' . mysql_escape_string($_REQUEST['showtagfiles']) . '")';
  1549. $SQLquery .= ' AND (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1550. $SQLquery .= ' ORDER BY `filename` ASC';
  1551. $result = safe_mysql_query($SQLquery);
  1552. if (! empty($_REQUEST['m3u']))
  1553. {
  1554. header('Content-type: audio/x-mpegurl');
  1555. echo '#EXTM3U' . "\n";
  1556. while ($row = mysql_fetch_array($result))
  1557. {
  1558. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1559. }
  1560. exit();
  1561. }
  1562. else
  1563. {
  1564. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encoderoptionsdistribution=1') . '">Show all Encoder Options</a><hr>';
  1565. echo 'Files with Encoder Options <b>' . $_REQUEST['showtagfiles'] . '</b>:<br>';
  1566. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1567. while ($row = mysql_fetch_array($result))
  1568. {
  1569. echo '<tr>';
  1570. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1571. echo '<td>' . $row['encoder_options'] . '</td>';
  1572. echo '</tr>';
  1573. }
  1574. echo '</table>';
  1575. }
  1576. }
  1577. elseif (! isset($_REQUEST['m3u']))
  1578. {
  1579. $SQLquery = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `' . GETID3_DB_TABLE . '`';
  1580. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1581. $SQLquery .= ' GROUP BY `encoder_options`';
  1582. $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC, `num` DESC, `encoder_options` ASC';
  1583. $result = safe_mysql_query($SQLquery);
  1584. echo 'Files with Encoder Options:<br>';
  1585. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1586. echo '<tr><th>Encoder Options</th><th>Count</th><th>M3U</th></tr>';
  1587. while ($row = mysql_fetch_array($result))
  1588. {
  1589. echo '<tr>';
  1590. echo '<td>' . $row['encoder_options'] . '</td>';
  1591. 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>';
  1592. 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>';
  1593. echo '</tr>';
  1594. }
  1595. echo '</table><hr>';
  1596. }
  1597. }
  1598. elseif (! empty($_REQUEST['tagtypes']))
  1599. {
  1600. if (! isset($_REQUEST['m3u']))
  1601. {
  1602. $SQLquery = 'SELECT `tags`, COUNT(*) AS `num` FROM `' . GETID3_DB_TABLE . '`';
  1603. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1604. $SQLquery .= ' GROUP BY `tags`';
  1605. $SQLquery .= ' ORDER BY `num` DESC';
  1606. $result = safe_mysql_query($SQLquery);
  1607. echo 'Files with tags:<br>';
  1608. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1609. echo '<tr><th>Tags</th><th>Count</th><th>M3U</th></tr>';
  1610. while ($row = mysql_fetch_array($result))
  1611. {
  1612. echo '<tr>';
  1613. echo '<td>' . $row['tags'] . '</td>';
  1614. echo '<TD ALIGN="RIGHT"><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?tagtypes=1&showtagfiles=' . ($row['tags'] ? urlencode($row['tags']) : '')) . '">' . number_format($row['num']) . '</a></td>';
  1615. echo '<TD ALIGN="RIGHT"><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?tagtypes=1&showtagfiles=' . ($row['tags'] ? urlencode($row['tags']) : '') . '&m3u=.m3u') . '">m3u</a></td>';
  1616. echo '</tr>';
  1617. }
  1618. echo '</table><hr>';
  1619. }
  1620. if (isset($_REQUEST['showtagfiles']))
  1621. {
  1622. $SQLquery = 'SELECT `filename`, `tags` FROM `' . GETID3_DB_TABLE . '`';
  1623. $SQLquery .= ' WHERE (`tags` LIKE "' . mysql_escape_string($_REQUEST['showtagfiles']) . '")';
  1624. $SQLquery .= ' AND (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1625. $SQLquery .= ' ORDER BY `filename` ASC';
  1626. $result = safe_mysql_query($SQLquery);
  1627. if (! empty($_REQUEST['m3u']))
  1628. {
  1629. header('Content-type: audio/x-mpegurl');
  1630. echo '#EXTM3U' . "\n";
  1631. while ($row = mysql_fetch_array($result))
  1632. {
  1633. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1634. }
  1635. exit();
  1636. }
  1637. else
  1638. {
  1639. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1640. while ($row = mysql_fetch_array($result))
  1641. {
  1642. echo '<tr>';
  1643. echo '<td><a href="demo.browse.php?filename=' . rawurlencode($row['filename']) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1644. echo '<td>' . $row['tags'] . '</td>';
  1645. echo '</tr>';
  1646. }
  1647. echo '</table>';
  1648. }
  1649. }
  1650. }
  1651. elseif (! empty($_REQUEST['md5datadupes']))
  1652. {
  1653. $OtherFormats = '';
  1654. $AVFormats = '';
  1655. $SQLquery = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`';
  1656. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1657. $SQLquery .= ' WHERE (`md5_data` <> "")';
  1658. $SQLquery .= ' GROUP BY `md5_data`';
  1659. $SQLquery .= ' ORDER BY `num` DESC';
  1660. $result = safe_mysql_query($SQLquery);
  1661. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1))
  1662. {
  1663. set_time_limit(30);
  1664. $filenames = array();
  1665. $tags = array();
  1666. $md5_data = array();
  1667. $SQLquery = 'SELECT `fileformat`, `filename`, `tags`';
  1668. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1669. $SQLquery .= ' WHERE (`md5_data` = "' . mysql_escape_string($row['md5_data']) . '")';
  1670. $SQLquery .= ' ORDER BY `filename` ASC';
  1671. $result2 = safe_mysql_query($SQLquery);
  1672. while ($row2 = mysql_fetch_array($result2))
  1673. {
  1674. $thisfileformat = $row2['fileformat'];
  1675. $filenames[] = $row2['filename'];
  1676. $tags[] = $row2['tags'];
  1677. $md5_data[] = $row['md5_data'];
  1678. }
  1679. $thisline = '<tr>';
  1680. $thisline .= '<TD VALIGN="TOP" style="font-family: monospace;">' . implode('<br>', $md5_data) . '</td>';
  1681. $thisline .= '<TD VALIGN="TOP" NOWRAP>' . implode('<br>', $tags) . '</td>';
  1682. $thisline .= '<TD VALIGN="TOP">' . implode('<br>', $filenames) . '</td>';
  1683. $thisline .= '</tr>';
  1684. if (in_array($thisfileformat, $IgnoreNoTagFormats))
  1685. {
  1686. $OtherFormats .= $thisline;
  1687. }
  1688. else
  1689. {
  1690. $AVFormats .= $thisline;
  1691. }
  1692. }
  1693. echo 'Duplicated MD5_DATA (Audio/Video files):<table border="1" cellspacing="0" cellpadding="2">';
  1694. echo $AVFormats . '</table><hr>';
  1695. echo 'Duplicated MD5_DATA (Other files):<table border="1" cellspacing="0" cellpadding="2">';
  1696. echo $OtherFormats . '</table><hr>';
  1697. }
  1698. elseif (! empty($_REQUEST['artisttitledupes']))
  1699. {
  1700. if (isset($_REQUEST['m3uartist']) && isset($_REQUEST['m3utitle']))
  1701. {
  1702. header('Content-type: audio/x-mpegurl');
  1703. echo '#EXTM3U' . "\n";
  1704. $SQLquery = 'SELECT `filename`';
  1705. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1706. $SQLquery .= ' WHERE (`artist` = "' . mysql_escape_string($_REQUEST['m3uartist']) . '")';
  1707. $SQLquery .= ' AND (`title` = "' . mysql_escape_string($_REQUEST['m3utitle']) . '")';
  1708. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1709. $result = safe_mysql_query($SQLquery);
  1710. while ($row = mysql_fetch_array($result))
  1711. {
  1712. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1713. }
  1714. exit();
  1715. }
  1716. $SQLquery = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`';
  1717. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1718. $SQLquery .= ' WHERE (`artist` <> "")';
  1719. $SQLquery .= ' AND (`title` <> "")';
  1720. $SQLquery .= ' GROUP BY `artist`, `title`' . (@$_REQUEST['samemix'] ? ', `remix`' : '');
  1721. $SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC';
  1722. $result = safe_mysql_query($SQLquery);
  1723. $uniquetitles = 0;
  1724. $uniquefiles = 0;
  1725. if (! empty($_REQUEST['m3u']))
  1726. {
  1727. header('Content-type: audio/x-mpegurl');
  1728. echo '#EXTM3U' . "\n";
  1729. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1))
  1730. {
  1731. $SQLquery = 'SELECT `filename`';
  1732. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1733. $SQLquery .= ' WHERE (`artist` = "' . mysql_escape_string($row['artist']) . '")';
  1734. $SQLquery .= ' AND (`title` = "' . mysql_escape_string($row['title']) . '")';
  1735. if (@$_REQUEST['samemix'])
  1736. {
  1737. $SQLquery .= ' AND (`remix` = "' . mysql_escape_string($row['remix']) . '")';
  1738. }
  1739. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1740. $result2 = safe_mysql_query($SQLquery);
  1741. while ($row2 = mysql_fetch_array($result2))
  1742. {
  1743. echo WindowsShareSlashTranslate($row2['filename']) . "\n";
  1744. }
  1745. }
  1746. exit();
  1747. }
  1748. else
  1749. {
  1750. echo 'Duplicated aritst + title: (<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?artisttitledupes=1&samemix=1') . '">Identical Mix/Version only</a>)<br>';
  1751. echo '(<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?artisttitledupes=1&m3u=.m3u') . '">.m3u version</a>)<br>';
  1752. echo '<table border="1" cellspacing="0" cellpadding="2">';
  1753. echo '<tr><th colspan="3">&nbsp;</th><th>Artist</th><th>Title</th><th>Version</th><th>&nbsp;</th><th>&nbsp;</th><th>Filename</th></tr>';
  1754. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1))
  1755. {
  1756. $uniquetitles ++;
  1757. set_time_limit(30);
  1758. $filenames = array();
  1759. $artists = array();
  1760. $titles = array();
  1761. $remixes = array();
  1762. $bitrates = array();
  1763. $playtimes = array();
  1764. $SQLquery = 'SELECT `filename`, `artist`, `title`, `remix`, `audio_bitrate`, `vbr_method`, `playtime_seconds`, `encoder_options`';
  1765. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1766. $SQLquery .= ' WHERE (`artist` = "' . mysql_escape_string($row['artist']) . '")';
  1767. $SQLquery .= ' AND (`title` = "' . mysql_escape_string($row['title']) . '")';
  1768. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1769. $result2 = safe_mysql_query($SQLquery);
  1770. while ($row2 = mysql_fetch_array($result2))
  1771. {
  1772. $uniquefiles ++;
  1773. $filenames[] = $row2['filename'];
  1774. $artists[] = $row2['artist'];
  1775. $titles[] = $row2['title'];
  1776. $remixes[] = $row2['remix'];
  1777. if ($row2['vbr_method'])
  1778. {
  1779. $bitrates[] = '<B' . ($row2['encoder_options'] ? ' style="text-decoration: underline; cursor: help;" title="' . $row2['encoder_options'] : '') . '">' . BitrateText($row2['audio_bitrate'] / 1000) . '</b>';
  1780. }
  1781. else
  1782. {
  1783. $bitrates[] = BitrateText($row2['audio_bitrate'] / 1000);
  1784. }
  1785. $playtimes[] = getid3_lib :: PlaytimeString($row2['playtime_seconds']);
  1786. }
  1787. echo '<tr>';
  1788. echo '<TD NOWRAP VALIGN="TOP">';
  1789. foreach ($filenames as $file)
  1790. {
  1791. 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="Permanently delete ' . "\n" . FixTextFields($file) . "\n" . '" TARGET="deletedupewindow">delete</a><br>';
  1792. }
  1793. echo '</td>';
  1794. echo '<TD NOWRAP VALIGN="TOP">';
  1795. foreach ($filenames as $file)
  1796. {
  1797. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($file)) . '">play</a><br>';
  1798. }
  1799. echo '</td>';
  1800. 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>';
  1801. echo '<TD VALIGN="TOP" NOWRAP>' . implode('<br>', $artists) . '</td>';
  1802. echo '<TD VALIGN="TOP" NOWRAP>' . implode('<br>', $titles) . '</td>';
  1803. echo '<TD VALIGN="TOP" NOWRAP>' . implode('<br>', $remixes) . '</td>';
  1804. echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">' . implode('<br>', $bitrates) . '</td>';
  1805. echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">' . implode('<br>', $playtimes) . '</td>';
  1806. echo '<TD VALIGN="TOP" NOWRAP ALIGN="LEFT"><table border="0" cellspacing="0" cellpadding="0">';
  1807. foreach ($filenames as $file)
  1808. {
  1809. 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>';
  1810. }
  1811. echo '</table></td>';
  1812. echo '</tr>';
  1813. }
  1814. }
  1815. echo '</table>';
  1816. echo number_format($uniquefiles) . ' files with ' . number_format($uniquetitles) . ' unique <i>aritst + title</i><br>';
  1817. echo '<hr>';
  1818. }
  1819. elseif (! empty($_REQUEST['filetypelist']))
  1820. {
  1821. list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']);
  1822. $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`';
  1823. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1824. $SQLquery .= ' WHERE (`fileformat` = "' . mysql_escape_string($fileformat) . '")';
  1825. $SQLquery .= ' AND (`audio_dataformat` = "' . mysql_escape_string($audioformat) . '")';
  1826. $SQLquery .= ' ORDER BY `filename` ASC';
  1827. $result = safe_mysql_query($SQLquery);
  1828. echo 'Files of format <b>' . $fileformat . '.' . $audioformat . '</b>:<table border="1" cellspacing="0" cellpadding="4">';
  1829. echo '<tr><th>file</th><th>audio</th><th>filename</th></tr>';
  1830. while ($row = mysql_fetch_array($result))
  1831. {
  1832. echo '<tr>';
  1833. echo '<td>' . $row['fileformat'] . '</td>';
  1834. echo '<td>' . $row['audio_dataformat'] . '</td>';
  1835. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1836. echo '</tr>';
  1837. }
  1838. echo '</table><hr>';
  1839. }
  1840. elseif (! empty($_REQUEST['trackinalbum']))
  1841. {
  1842. $SQLquery = 'SELECT `filename`, `album`';
  1843. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1844. $SQLquery .= ' WHERE (`album` LIKE "% [%")';
  1845. $SQLquery .= ' ORDER BY `album` ASC, `filename` ASC';
  1846. $result = safe_mysql_query($SQLquery);
  1847. if (! empty($_REQUEST['m3u']))
  1848. {
  1849. header('Content-type: audio/x-mpegurl');
  1850. echo '#EXTM3U' . "\n";
  1851. while ($row = mysql_fetch_array($result))
  1852. {
  1853. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1854. }
  1855. exit();
  1856. }
  1857. elseif (! empty($_REQUEST['autofix']))
  1858. {
  1859. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'module.tag.id3v1.php', __FILE__, true);
  1860. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'module.tag.id3v2.php', __FILE__, true);
  1861. while ($row = mysql_fetch_array($result))
  1862. {
  1863. set_time_limit(30);
  1864. $ThisFileInfo = $getID3->analyze($filename);
  1865. getid3_lib :: CopyTagsToComments($ThisFileInfo);
  1866. if (! empty($ThisFileInfo['tags']))
  1867. {
  1868. $Album = trim(str_replace(strstr($ThisFileInfo['comments']['album'][0], ' ['), '', $ThisFileInfo['comments']['album'][0]));
  1869. $Track = (string) intval(str_replace(' [', '', str_replace(']', '', strstr($ThisFileInfo['comments']['album'][0], ' ['))));
  1870. if ($Track == '0')
  1871. {
  1872. $Track = '';
  1873. }
  1874. if ($Album && $Track)
  1875. {
  1876. echo '<hr>' . FixTextFields($row['filename']) . '<br>';
  1877. echo '<i>' . $Album . '</i> (track #' . $Track . ')<br>';
  1878. echo '<b>ID3v2:</b> ' . (RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!') . ', ';
  1879. echo '<b>ID3v1:</b> ' . (WriteID3v1($row['filename'], @$ThisFileInfo['comments']['title'][0], @$ThisFileInfo['comments']['artist'][0], $Album, @$ThisFileInfo['comments']['year'][0], @$ThisFileInfo['comments']['comment'][0], @$ThisFileInfo['comments']['genreid'][0], $Track, false) ? 'updated' : 'UPDATE FAILED') . '<br>';
  1880. }
  1881. else
  1882. {
  1883. echo ' . ';
  1884. }
  1885. }
  1886. else
  1887. {
  1888. echo '<hr>FAILED<br>' . FixTextFields($row['filename']) . '<hr>';
  1889. }
  1890. flush();
  1891. }
  1892. }
  1893. else
  1894. {
  1895. echo '<b>' . number_format(mysql_num_rows($result)) . '</b> files with <b>[??]</b>-format track numbers in album field:<br>';
  1896. if (mysql_num_rows($result) > 0)
  1897. {
  1898. echo '(<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?trackinalbum=1&m3u=.m3u') . '">.m3u version</a>)<br>';
  1899. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?trackinalbum=1&autofix=1') . '">Try to auto-fix</a><br>';
  1900. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1901. while ($row = mysql_fetch_array($result))
  1902. {
  1903. echo '<tr>';
  1904. echo '<td>' . $row['album'] . '</td>';
  1905. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1906. echo '</tr>';
  1907. }
  1908. echo '</table>';
  1909. }
  1910. echo '<hr>';
  1911. }
  1912. }
  1913. elseif (! empty($_REQUEST['fileextensions']))
  1914. {
  1915. $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`';
  1916. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1917. $SQLquery .= ' ORDER BY `filename` ASC';
  1918. $result = safe_mysql_query($SQLquery);
  1919. $invalidextensionfiles = 0;
  1920. $invalidextensionline = '<table border="1" cellspacing="0" cellpadding="4">';
  1921. $invalidextensionline .= '<tr><th>file</th><th>audio</th><th>video</th><th>tags</th><th>actual</th><th>correct</th><th>filename</th></tr>';
  1922. while ($row = mysql_fetch_array($result))
  1923. {
  1924. set_time_limit(30);
  1925. $acceptableextensions = AcceptableExtensions($row['fileformat'], $row['audio_dataformat'], $row['video_dataformat']);
  1926. $actualextension = strtolower(fileextension($row['filename']));
  1927. if ($acceptableextensions && ! in_array($actualextension, $acceptableextensions))
  1928. {
  1929. $invalidextensionfiles ++;
  1930. $invalidextensionline .= '<tr>';
  1931. $invalidextensionline .= '<td>' . $row['fileformat'] . '</td>';
  1932. $invalidextensionline .= '<td>' . $row['audio_dataformat'] . '</td>';
  1933. $invalidextensionline .= '<td>' . $row['video_dataformat'] . '</td>';
  1934. $invalidextensionline .= '<td>' . $row['tags'] . '</td>';
  1935. $invalidextensionline .= '<td>' . $actualextension . '</td>';
  1936. $invalidextensionline .= '<td>' . implode('; ', $acceptableextensions) . '</td>';
  1937. $invalidextensionline .= '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  1938. $invalidextensionline .= '</tr>';
  1939. }
  1940. }
  1941. $invalidextensionline .= '</table><hr>';
  1942. echo number_format($invalidextensionfiles) . ' files with incorrect filename extension:<br>';
  1943. echo $invalidextensionline;
  1944. }
  1945. elseif (isset($_REQUEST['genredistribution']))
  1946. {
  1947. if (! empty($_REQUEST['m3u']))
  1948. {
  1949. header('Content-type: audio/x-mpegurl');
  1950. echo '#EXTM3U' . "\n";
  1951. $SQLquery = 'SELECT `filename`';
  1952. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1953. $SQLquery .= ' WHERE (BINARY `genre` = "' . $_REQUEST['genredistribution'] . '")';
  1954. $SQLquery .= ' AND (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1955. $SQLquery .= ' ORDER BY `filename` ASC';
  1956. $result = safe_mysql_query($SQLquery);
  1957. while ($row = mysql_fetch_array($result))
  1958. {
  1959. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  1960. }
  1961. exit();
  1962. }
  1963. else
  1964. {
  1965. if ($_REQUEST['genredistribution'] == '%')
  1966. {
  1967. $SQLquery = 'SELECT COUNT(*) AS `num`, `genre`';
  1968. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1969. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "' . implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats) . '")';
  1970. $SQLquery .= ' GROUP BY `genre`';
  1971. $SQLquery .= ' ORDER BY `num` DESC';
  1972. $result = safe_mysql_query($SQLquery);
  1973. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'module.tag.id3v1.php', __FILE__, true);
  1974. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1975. echo '<tr><th>Count</th><th>Genre</th><th>m3u</th></tr>';
  1976. while ($row = mysql_fetch_array($result))
  1977. {
  1978. $GenreID = getid3_id3v1 :: LookupGenreID($row['genre']);
  1979. if (is_numeric($GenreID))
  1980. {
  1981. echo '<tr bgcolor="#00FF00;">';
  1982. }
  1983. else
  1984. {
  1985. echo '<tr bgcolor="#FF9999;">';
  1986. }
  1987. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?genredistribution=' . urlencode($row['genre'])) . '">' . number_format($row['num']) . '</a></td>';
  1988. echo '<td nowrap>' . str_replace("\t", '<br>', $row['genre']) . '</td>';
  1989. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3u=.m3u&genredistribution=' . urlencode($row['genre'])) . '">.m3u</a></td>';
  1990. echo '</tr>';
  1991. }
  1992. echo '</table><hr>';
  1993. }
  1994. else
  1995. {
  1996. $SQLquery = 'SELECT `filename`, `genre`';
  1997. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  1998. $SQLquery .= ' WHERE (`genre` LIKE "' . mysql_escape_string($_REQUEST['genredistribution']) . '")';
  1999. $SQLquery .= ' ORDER BY `filename` ASC';
  2000. $result = safe_mysql_query($SQLquery);
  2001. echo '<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?genredistribution=' . urlencode('%')) . '">All Genres</a><br>';
  2002. echo '<table border="1" cellspacing="0" cellpadding="4">';
  2003. echo '<tr><th>Genre</th><th>m3u</th><th>Filename</th></tr>';
  2004. while ($row = mysql_fetch_array($result))
  2005. {
  2006. echo '<tr>';
  2007. echo '<TD NOWRAP>' . str_replace("\t", '<br>', $row['genre']) . '</td>';
  2008. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  2009. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  2010. echo '</tr>';
  2011. }
  2012. echo '</table><hr>';
  2013. }
  2014. }
  2015. }
  2016. elseif (! empty($_REQUEST['formatdistribution']))
  2017. {
  2018. $SQLquery = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`';
  2019. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2020. $SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`';
  2021. $SQLquery .= ' ORDER BY `num` DESC';
  2022. $result = safe_mysql_query($SQLquery);
  2023. echo 'File format distribution:<table border="1" cellspacing="0" cellpadding="4">';
  2024. echo '<tr><th>Number</th><th>Format</th></tr>';
  2025. while ($row = mysql_fetch_array($result))
  2026. {
  2027. echo '<tr>';
  2028. echo '<TD ALIGN="RIGHT">' . number_format($row['num']) . '</td>';
  2029. 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>';
  2030. echo '</tr>';
  2031. }
  2032. echo '</table><hr>';
  2033. }
  2034. elseif (! empty($_REQUEST['errorswarnings']))
  2035. {
  2036. $SQLquery = 'SELECT `filename`, `error`, `warning`';
  2037. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2038. $SQLquery .= ' WHERE (`error` <> "")';
  2039. $SQLquery .= ' OR (`warning` <> "")';
  2040. $SQLquery .= ' ORDER BY `filename` ASC';
  2041. $result = safe_mysql_query($SQLquery);
  2042. if (! empty($_REQUEST['m3u']))
  2043. {
  2044. header('Content-type: audio/x-mpegurl');
  2045. echo '#EXTM3U' . "\n";
  2046. while ($row = mysql_fetch_array($result))
  2047. {
  2048. echo WindowsShareSlashTranslate($row['filename']) . "\n";
  2049. }
  2050. exit();
  2051. }
  2052. else
  2053. {
  2054. echo number_format(mysql_num_rows($result)) . ' files with errors or warnings:<br>';
  2055. echo '(<a href="' . htmlentities($_SERVER['PHP_SELF'] . '?errorswarnings=1&m3u=.m3u') . '">.m3u version</a>)<br>';
  2056. echo '<table border="1" cellspacing="0" cellpadding="4">';
  2057. echo '<tr><th>Filename</th><th>Error</th><th>Warning</th></tr>';
  2058. while ($row = mysql_fetch_array($result))
  2059. {
  2060. echo '<tr>';
  2061. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td>';
  2062. echo '<td>' . (! empty($row['error']) ? '<li>' . str_replace("\t", '<li>', FixTextFields($row['error'])) . '</li>' : '&nbsp;') . '</td>';
  2063. echo '<td>' . (! empty($row['warning']) ? '<li>' . str_replace("\t", '<li>', FixTextFields($row['warning'])) . '</li>' : '&nbsp;') . '</td>';
  2064. echo '</tr>';
  2065. }
  2066. }
  2067. echo '</table><hr>';
  2068. }
  2069. elseif (! empty($_REQUEST['fixid3v1padding']))
  2070. {
  2071. getid3_lib :: IncludeDependency(GETID3_INCLUDEPATH . 'write.id3v1.php', __FILE__, true);
  2072. $id3v1_writer = new getid3_write_id3v1();
  2073. $SQLquery = 'SELECT `filename`, `error`, `warning`';
  2074. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2075. $SQLquery .= ' WHERE (`fileformat` = "mp3")';
  2076. $SQLquery .= ' AND (`warning` <> "")';
  2077. $SQLquery .= ' ORDER BY `filename` ASC';
  2078. $result = safe_mysql_query($SQLquery);
  2079. $totaltofix = mysql_num_rows($result);
  2080. $rowcounter = 0;
  2081. while ($row = mysql_fetch_array($result))
  2082. {
  2083. set_time_limit(30);
  2084. if (strpos($row['warning'], 'Some ID3v1 fields do not use NULL characters for padding') !== false)
  2085. {
  2086. set_time_limit(30);
  2087. $id3v1_writer->filename = $row['filename'];
  2088. echo ($id3v1_writer->FixID3v1Padding() ? '<span style="color: #009900;">fixed - ' : '<span style="color: #FF0000;">error - ');
  2089. }
  2090. else
  2091. {
  2092. echo '<span style="color: #0000FF;">No error? - ';
  2093. }
  2094. echo '[' . ++ $rowcounter . ' / ' . $totaltofix . '] ';
  2095. echo FixTextFields($row['filename']) . '</span><br>';
  2096. flush();
  2097. }
  2098. }
  2099. elseif (! empty($_REQUEST['vbrmethod']))
  2100. {
  2101. if ($_REQUEST['vbrmethod'] == '1')
  2102. {
  2103. $SQLquery = 'SELECT COUNT(*) AS `num`, `vbr_method`';
  2104. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2105. $SQLquery .= ' GROUP BY `vbr_method`';
  2106. $SQLquery .= ' ORDER BY `vbr_method`';
  2107. $result = safe_mysql_query($SQLquery);
  2108. echo 'VBR methods:<table border="1" cellspacing="0" cellpadding="4">';
  2109. echo '<tr><th>Count</th><th>VBR Method</th></tr>';
  2110. while ($row = mysql_fetch_array($result))
  2111. {
  2112. echo '<tr>';
  2113. echo '<TD ALIGN="RIGHT">' . FixTextFields(number_format($row['num'])) . '</td>';
  2114. if ($row['vbr_method'])
  2115. {
  2116. echo '<td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?vbrmethod=' . $row['vbr_method']) . '">' . FixTextFields($row['vbr_method']) . '</a></td>';
  2117. }
  2118. else
  2119. {
  2120. echo '<td><i>CBR</i></td>';
  2121. }
  2122. echo '</tr>';
  2123. }
  2124. echo '</table>';
  2125. }
  2126. else
  2127. {
  2128. $SQLquery = 'SELECT `filename`';
  2129. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2130. $SQLquery .= ' WHERE (`vbr_method` = "' . mysql_escape_string($_REQUEST['vbrmethod']) . '")';
  2131. $result = safe_mysql_query($SQLquery);
  2132. echo number_format(mysql_num_rows($result)) . ' files with VBR_method of "' . $_REQUEST['vbrmethod'] . '":<table border="1" cellspacing="0" cellpadding="3">';
  2133. while ($row = mysql_fetch_array($result))
  2134. {
  2135. echo '<tr><td><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?m3ufilename=' . urlencode($row['filename'])) . '">m3u</a></td>';
  2136. echo '<td><a href="' . htmlentities('demo.browse.php?filename=' . rawurlencode($row['filename'])) . '">' . FixTextFields($row['filename']) . '</a></td></tr>';
  2137. }
  2138. echo '</table>';
  2139. }
  2140. echo '<hr>';
  2141. }
  2142. elseif (! empty($_REQUEST['correctcase']))
  2143. {
  2144. $SQLquery = 'SELECT `filename`, `fileformat`';
  2145. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2146. $SQLquery .= ' WHERE (`fileformat` <> "")';
  2147. $SQLquery .= ' ORDER BY `filename` ASC';
  2148. $result = safe_mysql_query($SQLquery);
  2149. 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>';
  2150. echo '<PRE>';
  2151. $lastdir = '';
  2152. while ($row = mysql_fetch_array($result))
  2153. {
  2154. set_time_limit(30);
  2155. $CleanedFilename = CleanUpFileName($row['filename']);
  2156. if ($row['filename'] != $CleanedFilename)
  2157. {
  2158. if (strtolower($lastdir) != strtolower(str_replace('/', '\\', dirname($row['filename']))))
  2159. {
  2160. $lastdir = str_replace('/', '\\', dirname($row['filename']));
  2161. echo 'cd "' . $lastdir . '"' . "\n";
  2162. }
  2163. echo 'ren "' . basename($row['filename']) . '" "' . basename(CleanUpFileName($row['filename'])) . '"' . "\n";
  2164. }
  2165. }
  2166. echo '</PRE>';
  2167. echo '<hr>';
  2168. }
  2169. function CleanUpFileName($filename)
  2170. {
  2171. $DirectoryName = dirname($filename);
  2172. $FileExtension = fileextension(basename($filename));
  2173. $BaseFilename = basename($filename, '.' . $FileExtension);
  2174. $BaseFilename = strtolower($BaseFilename);
  2175. $BaseFilename = str_replace('_', ' ', $BaseFilename);
  2176. //$BaseFilename = str_replace('-', ' - ', $BaseFilename);
  2177. $BaseFilename = str_replace('(', ' (', $BaseFilename);
  2178. $BaseFilename = str_replace('( ', '(', $BaseFilename);
  2179. $BaseFilename = str_replace(')', ') ', $BaseFilename);
  2180. $BaseFilename = str_replace(' )', ')', $BaseFilename);
  2181. $BaseFilename = str_replace(' \'\'', ' �', $BaseFilename);
  2182. $BaseFilename = str_replace('\'\' ', '� ', $BaseFilename);
  2183. $BaseFilename = str_replace(' vs ', ' vs. ', $BaseFilename);
  2184. while (strstr($BaseFilename, ' ') !== false)
  2185. {
  2186. $BaseFilename = str_replace(' ', ' ', $BaseFilename);
  2187. }
  2188. $BaseFilename = trim($BaseFilename);
  2189. return $DirectoryName . '/' . BetterUCwords($BaseFilename) . '.' . strtolower($FileExtension);
  2190. }
  2191. function BetterUCwords($string)
  2192. {
  2193. $stringlength = strlen($string);
  2194. $string{0} = strtoupper($string{0});
  2195. for($i = 1; $i < $stringlength; $i ++)
  2196. {
  2197. if (($string{$i - 1} == '\'') && ($i > 1) && (($string{$i - 2} == 'O') || ($string{$i - 2} == ' ')))
  2198. {
  2199. // O'Clock, 'Em
  2200. $string{$i} = strtoupper($string{$i});
  2201. }
  2202. elseif (ereg('^[\'A-Za-z0-9�-�]$', $string{$i - 1}))
  2203. {
  2204. $string{$i} = strtolower($string{$i});
  2205. }
  2206. else
  2207. {
  2208. $string{$i} = strtoupper($string{$i});
  2209. }
  2210. }
  2211. static $LowerCaseWords = array('vs.', 'feat.');
  2212. static $UpperCaseWords = array('DJ', 'USA', 'II', 'MC', 'CD', 'TV', '\'N\'');
  2213. $OutputListOfWords = array();
  2214. $ListOfWords = explode(' ', $string);
  2215. foreach ($ListOfWords as $ThisWord)
  2216. {
  2217. if (in_array(strtolower(str_replace('(', '', $ThisWord)), $LowerCaseWords))
  2218. {
  2219. $ThisWord = strtolower($ThisWord);
  2220. }
  2221. elseif (in_array(strtoupper(str_replace('(', '', $ThisWord)), $UpperCaseWords))
  2222. {
  2223. $ThisWord = strtoupper($ThisWord);
  2224. }
  2225. elseif ((substr($ThisWord, 0, 2) == 'Mc') && (strlen($ThisWord) > 2))
  2226. {
  2227. $ThisWord{2} = strtoupper($ThisWord{2});
  2228. }
  2229. elseif ((substr($ThisWord, 0, 3) == 'Mac') && (strlen($ThisWord) > 3))
  2230. {
  2231. $ThisWord{3} = strtoupper($ThisWord{3});
  2232. }
  2233. $OutputListOfWords[] = $ThisWord;
  2234. }
  2235. $UCstring = implode(' ', $OutputListOfWords);
  2236. $UCstring = str_replace(' From �', ' from �', $UCstring);
  2237. $UCstring = str_replace(' \'n\' ', ' \'N\' ', $UCstring);
  2238. return $UCstring;
  2239. }
  2240. echo '<hr><form action="' . FixTextFields($_SERVER['PHP_SELF']) . '">';
  2241. echo '<b>Warning:</b> Scanning a new directory will erase all previous entries in the database!<br>';
  2242. echo 'Directory: <input type="text" name="scan" size="50" value="' . FixTextFields(! empty($_REQUEST['scan']) ? $_REQUEST['scan'] : '') . '"> ';
  2243. 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?\');">';
  2244. echo '</form>';
  2245. echo '<hr><form action="' . FixTextFields($_SERVER['PHP_SELF']) . '">';
  2246. echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).<br>';
  2247. echo 'Directory: <input type="text" name="newscan" size="50" value="' . FixTextFields(! empty($_REQUEST['newscan']) ? $_REQUEST['newscan'] : '') . '"> ';
  2248. echo '<input type="SUBMIT" value="Go">';
  2249. echo '</form><hr>';
  2250. echo '<ul>';
  2251. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?deadfilescheck=1') . '">Remove deleted or changed files from database</a></li>';
  2252. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?md5datadupes=1') . '">List files with identical MD5_DATA values</a></li>';
  2253. 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>';
  2254. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?fileextensions=1') . '">File with incorrect file extension</a></li>';
  2255. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?formatdistribution=1') . '">File Format Distribution</a></li>';
  2256. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?audiobitrates=1') . '">Audio Bitrate Distribution</a></li>';
  2257. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?vbrmethod=1') . '">VBR_Method Distribution</a></li>';
  2258. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?tagtypes=1') . '">Tag Type Distribution</a></li>';
  2259. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?genredistribution=' . urlencode('%')) . '">Genre Distribution</a></li>';
  2260. //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>';
  2261. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encoderoptionsdistribution=1') . '">Encoder Options Distribution</a></li>';
  2262. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?encodedbydistribution=' . urlencode('%')) . '">Encoded By (ID3v2) Distribution</a></li>';
  2263. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?trackinalbum=1') . '">Track number in Album field</a></li>';
  2264. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?tracknoalbum=1') . '">Track number, but no Album</a></li>';
  2265. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?titlefeat=1') . '">"feat." in Title field</a></li>';
  2266. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?emptygenres=1') . '">Blank genres</a></li>';
  2267. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?trackzero=1') . '">Track "zero"</a></li>';
  2268. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?nonemptycomments=1') . '">non-empty comments</a></li>';
  2269. 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>';
  2270. 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>';
  2271. //echo '<li><a href="'.htmlentities($_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('A - T')).'">Filenames that don\'t match pattern</a></li>';
  2272. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?correctcase=1') . '">Correct filename case (Win/DOS)</a></li>';
  2273. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?fixid3v1padding=1') . '">Fix ID3v1 invalid padding</a></li>';
  2274. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?errorswarnings=1') . '">Files with Errors and/or Warnings</a></li>';
  2275. echo '<li><a href="' . htmlentities($_SERVER['PHP_SELF'] . '?rescanerrors=1') . '">Re-scan only files with Errors and/or Warnings</a></li>';
  2276. echo '</ul>';
  2277. $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`';
  2278. $SQLquery .= ' FROM `' . GETID3_DB_TABLE . '`';
  2279. $result = mysql_query($SQLquery);
  2280. if ($row = mysql_fetch_array($result))
  2281. {
  2282. echo '<hr><b>Currently in the database:</b><TABLE>';
  2283. echo '<tr><TH ALIGN="LEFT">Total Files</th><td>' . number_format($row['TotalFiles']) . '</td></tr>';
  2284. echo '<tr><TH ALIGN="LEFT">Total Filesize</th><td>' . number_format($row['TotalFilesize'] / 1048576) . ' MB</td></tr>';
  2285. echo '<tr><TH ALIGN="LEFT">Total Playtime</th><td>' . number_format($row['TotalPlaytime'] / 3600, 1) . ' hours</td></tr>';
  2286. echo '<tr><TH ALIGN="LEFT">Average Filesize</th><td>' . number_format($row['AvgFilesize'] / 1048576, 1) . ' MB</td></tr>';
  2287. echo '<tr><TH ALIGN="LEFT">Average Playtime</th><td>' . getid3_lib :: PlaytimeString($row['AvgPlaytime']) . '</td></tr>';
  2288. echo '<tr><TH ALIGN="LEFT">Average Bitrate</th><td>' . BitrateText($row['AvgBitrate'] / 1000, 1) . '</td></tr>';
  2289. echo '</table>';
  2290. }
  2291. ?>
  2292. </BODY>
  2293. </HTML>