PageRenderTime 62ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/components/com_fabrik/libs/getid3/demos/demo.mysql.php

https://github.com/chrisinammo/arthurmcneil
PHP | 2130 lines | 1790 code | 304 blank | 36 comment | 290 complexity | db9679172893e0a2f4024ed94d60afd2 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.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. // OPTIONS:
  15. $getid3_demo_mysql_encoding = 'ISO-8859-1';
  16. $getid3_demo_mysql_md5_data = false; // All data hashes are by far the slowest part of scanning
  17. $getid3_demo_mysql_md5_file = false;
  18. define('GETID3_DB_HOST', 'localhost');
  19. define('GETID3_DB_USER', 'getid3');
  20. define('GETID3_DB_PASS', 'getid3');
  21. define('GETID3_DB_DB', 'getid3');
  22. define('GETID3_DB_TABLE', 'files');
  23. if (!@mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) {
  24. die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
  25. }
  26. if (!@mysql_select_db(GETID3_DB_DB)) {
  27. die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
  28. }
  29. if (!@include_once('../getid3/getid3.php')) {
  30. die('Cannot open '.realpath('../getid3/getid3.php'));
  31. }
  32. // Initialize getID3 engine
  33. $getID3 = new getID3;
  34. $getID3->setOption(array(
  35. 'option_md5_data' => $getid3_demo_mysql_md5_data,
  36. 'encoding' => $getid3_demo_mysql_encoding,
  37. ));
  38. function RemoveAccents($string) {
  39. // Revised version by markstewardØhotmail*com
  40. return strtr(strtr($string, 'ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', 'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
  41. }
  42. function FixTextFields($text) {
  43. $text = getid3_lib::SafeStripSlashes($text);
  44. $text = htmlentities($text, ENT_QUOTES);
  45. return $text;
  46. }
  47. function BitrateColor($bitrate, $BitrateMaxScale=768) {
  48. // $BitrateMaxScale is bitrate of maximum-quality color (bright green)
  49. // below this is gradient, above is solid green
  50. $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
  51. $bitrate = round(min(max($bitrate, 1), 256));
  52. $bitrate--; // scale from 1-256kbps to 0-255kbps
  53. $Rcomponent = max(255 - ($bitrate * 2), 0);
  54. $Gcomponent = max(($bitrate * 2) - 255, 0);
  55. if ($bitrate > 127) {
  56. $Bcomponent = max((255 - $bitrate) * 2, 0);
  57. } else {
  58. $Bcomponent = max($bitrate * 2, 0);
  59. }
  60. 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);
  61. }
  62. function BitrateText($bitrate, $decimals=0) {
  63. return '<span style="color: #'.BitrateColor($bitrate).'">'.number_format($bitrate, $decimals).' kbps</span>';
  64. }
  65. function fileextension($filename, $numextensions=1) {
  66. if (strstr($filename, '.')) {
  67. $reversedfilename = strrev($filename);
  68. $offset = 0;
  69. for ($i = 0; $i < $numextensions; $i++) {
  70. $offset = strpos($reversedfilename, '.', $offset + 1);
  71. if ($offset === false) {
  72. return '';
  73. }
  74. }
  75. return strrev(substr($reversedfilename, 0, $offset));
  76. }
  77. return '';
  78. }
  79. function RenameFileFromTo($from, $to, &$results) {
  80. $success = true;
  81. if ($from === $to) {
  82. $results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename';
  83. } elseif (!file_exists($from)) {
  84. $results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename';
  85. } elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) {
  86. $results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename';
  87. } elseif (@rename($from, $to)) {
  88. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  89. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($from).'")';
  90. safe_mysql_query($SQLquery);
  91. $results = '<span style="color: #008000;">Successfully renamed';
  92. } else {
  93. $results = '<br><span style="color: #FF0000;">FAILED to rename';
  94. $success = false;
  95. }
  96. $results .= ' from:<br><i>'.$from.'</i><br>to:<br><i>'.$to.'</i></span><hr>';
  97. return $success;
  98. }
  99. if (!empty($_REQUEST['renamefilefrom']) && !empty($_REQUEST['renamefileto'])) {
  100. $results = '';
  101. RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results);
  102. echo $results;
  103. exit;
  104. } elseif (!empty($_REQUEST['m3ufilename'])) {
  105. header('Content-type: audio/x-mpegurl');
  106. echo '#EXTM3U'."\n";
  107. echo WindowsShareSlashTranslate($_REQUEST['m3ufilename'])."\n";
  108. exit;
  109. } elseif (!isset($_REQUEST['m3u']) && !isset($_REQUEST['m3uartist']) && !isset($_REQUEST['m3utitle'])) {
  110. 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>';
  111. }
  112. function WindowsShareSlashTranslate($filename) {
  113. if (substr($filename, 0, 2) == '//') {
  114. return str_replace('/', '\\', $filename);
  115. }
  116. return $filename;
  117. }
  118. function safe_mysql_query($SQLquery) {
  119. $result = @mysql_query($SQLquery);
  120. if (mysql_error()) {
  121. die('<FONT COLOR="red">'.mysql_error().'</FONT><hr><TT>'.$SQLquery.'</TT>');
  122. }
  123. return $result;
  124. }
  125. function mysql_table_exists($tablename) {
  126. return (bool) mysql_query('DESCRIBE '.$tablename);
  127. }
  128. function AcceptableExtensions($fileformat, $audio_dataformat='', $video_dataformat='') {
  129. static $AcceptableExtensionsAudio = array();
  130. if (empty($AcceptableExtensionsAudio)) {
  131. $AcceptableExtensionsAudio['mp3']['mp3'] = array('mp3');
  132. $AcceptableExtensionsAudio['mp2']['mp2'] = array('mp2');
  133. $AcceptableExtensionsAudio['mp1']['mp1'] = array('mp1');
  134. $AcceptableExtensionsAudio['asf']['asf'] = array('asf');
  135. $AcceptableExtensionsAudio['asf']['wma'] = array('wma');
  136. $AcceptableExtensionsAudio['riff']['mp3'] = array('wav');
  137. $AcceptableExtensionsAudio['riff']['wav'] = array('wav');
  138. }
  139. static $AcceptableExtensionsVideo = array();
  140. if (empty($AcceptableExtensionsVideo)) {
  141. $AcceptableExtensionsVideo['mp3']['mp3'] = array('mp3');
  142. $AcceptableExtensionsVideo['mp2']['mp2'] = array('mp2');
  143. $AcceptableExtensionsVideo['mp1']['mp1'] = array('mp1');
  144. $AcceptableExtensionsVideo['asf']['asf'] = array('asf');
  145. $AcceptableExtensionsVideo['asf']['wmv'] = array('wmv');
  146. $AcceptableExtensionsVideo['gif']['gif'] = array('gif');
  147. $AcceptableExtensionsVideo['jpg']['jpg'] = array('jpg');
  148. $AcceptableExtensionsVideo['png']['png'] = array('png');
  149. $AcceptableExtensionsVideo['bmp']['bmp'] = array('bmp');
  150. }
  151. if (!empty($video_dataformat)) {
  152. return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array());
  153. } else {
  154. return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array());
  155. }
  156. }
  157. if (!empty($_REQUEST['scan'])) {
  158. if (mysql_table_exists(GETID3_DB_TABLE)) {
  159. $SQLquery = 'DROP TABLE `'.GETID3_DB_TABLE.'`';
  160. safe_mysql_query($SQLquery);
  161. }
  162. }
  163. if (!mysql_table_exists(GETID3_DB_TABLE)) {
  164. $SQLquery = 'CREATE TABLE `'.GETID3_DB_TABLE.'` (';
  165. $SQLquery .= ' `ID` mediumint(8) unsigned NOT NULL auto_increment,';
  166. $SQLquery .= ' `filename` text NOT NULL,';
  167. $SQLquery .= ' `LastModified` text NOT NULL,';
  168. $SQLquery .= ' `md5_file` varchar(32) NOT NULL default "",';
  169. $SQLquery .= ' `md5_data` varchar(32) NOT NULL default "",';
  170. $SQLquery .= ' `md5_data_source` varchar(32) NOT NULL default "",';
  171. $SQLquery .= ' `filesize` int(10) unsigned NOT NULL default "0",';
  172. $SQLquery .= ' `fileformat` varchar(255) NOT NULL default "",';
  173. $SQLquery .= ' `audio_dataformat` varchar(255) NOT NULL default "",';
  174. $SQLquery .= ' `video_dataformat` varchar(255) NOT NULL default "",';
  175. $SQLquery .= ' `audio_bitrate` float NOT NULL default "0",';
  176. $SQLquery .= ' `video_bitrate` float NOT NULL default "0",';
  177. $SQLquery .= ' `playtime_seconds` varchar(255) NOT NULL default "",';
  178. $SQLquery .= ' `tags` varchar(255) NOT NULL default "",';
  179. $SQLquery .= ' `artist` varchar(255) NOT NULL default "",';
  180. $SQLquery .= ' `title` varchar(255) NOT NULL default "",';
  181. $SQLquery .= ' `remix` varchar(255) NOT NULL default "",';
  182. $SQLquery .= ' `album` varchar(255) NOT NULL default "",';
  183. $SQLquery .= ' `genre` varchar(255) NOT NULL default "",';
  184. $SQLquery .= ' `comment` varchar(255) NOT NULL default "",';
  185. $SQLquery .= ' `track` varchar(7) NOT NULL default "",';
  186. $SQLquery .= ' `comments_all` text NOT NULL,';
  187. $SQLquery .= ' `comments_id3v2` text NOT NULL,';
  188. $SQLquery .= ' `comments_ape` text NOT NULL,';
  189. $SQLquery .= ' `comments_lyrics3` text NOT NULL,';
  190. $SQLquery .= ' `comments_id3v1` text NOT NULL,';
  191. $SQLquery .= ' `warning` text NOT NULL,';
  192. $SQLquery .= ' `error` text NOT NULL,';
  193. $SQLquery .= ' `track_volume` float NOT NULL default "0",';
  194. $SQLquery .= ' `encoder_options` varchar(255) NOT NULL default "",';
  195. $SQLquery .= ' `vbr_method` varchar(255) NOT NULL default "",';
  196. $SQLquery .= ' PRIMARY KEY (`ID`)';
  197. $SQLquery .= ') TYPE=MyISAM;';
  198. safe_mysql_query($SQLquery);
  199. }
  200. $ExistingTableFields = array();
  201. $result = mysql_query('DESCRIBE `'.GETID3_DB_TABLE.'`');
  202. while ($row = mysql_fetch_array($result)) {
  203. $ExistingTableFields[$row['Field']] = $row;
  204. }
  205. if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2
  206. echo '<b>adding field `encoder_options`</b><br>';
  207. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `encoder_options` VARCHAR(255) DEFAULT "" NOT NULL AFTER `error`');
  208. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  209. }
  210. if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2
  211. echo '<b>changing field `track` to VARCHAR(7)</b><br>';
  212. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` CHANGE `track` `track` VARCHAR(7) DEFAULT "" NOT NULL');
  213. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  214. }
  215. if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5
  216. 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>';
  217. echo '<b>adding field `track_volume`</b><br>';
  218. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `track_volume` FLOAT NOT NULL AFTER `error`');
  219. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  220. }
  221. if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1
  222. echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>';
  223. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `remix` VARCHAR(255) DEFAULT "" NOT NULL AFTER `title`');
  224. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `alternate_name` VARCHAR(255) DEFAULT "" NOT NULL AFTER `track`');
  225. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `parody` VARCHAR(255) DEFAULT "" NOT NULL AFTER `alternate_name`');
  226. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  227. }
  228. function SynchronizeAllTags($filename, $synchronizefrom='all', $synchronizeto='A12', &$errors) {
  229. global $getID3;
  230. set_time_limit(30);
  231. $ThisFileInfo = $getID3->analyze($filename);
  232. getid3_lib::CopyTagsToComments($ThisFileInfo);
  233. if ($synchronizefrom == 'all') {
  234. $SourceArray = @$ThisFileInfo['comments'];
  235. } elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) {
  236. $SourceArray = @$ThisFileInfo['tags'][$synchronizefrom];
  237. } else {
  238. die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist');
  239. }
  240. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  241. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($filename).'")';
  242. safe_mysql_query($SQLquery);
  243. $TagFormatsToWrite = array();
  244. if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2')) {
  245. $TagFormatsToWrite[] = 'id3v2.3';
  246. }
  247. if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape')) {
  248. $TagFormatsToWrite[] = 'ape';
  249. }
  250. if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3')) {
  251. $TagFormatsToWrite[] = 'lyrics3';
  252. }
  253. if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1')) {
  254. $TagFormatsToWrite[] = 'id3v1';
  255. }
  256. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
  257. $tagwriter = new getid3_writetags;
  258. $tagwriter->filename = $filename;
  259. $tagwriter->tagformats = $TagFormatsToWrite;
  260. $tagwriter->overwrite_tags = true;
  261. $tagwriter->tag_encoding = $getID3->encoding;
  262. $tagwriter->tag_data = $SourceArray;
  263. if ($tagwriter->WriteTags()) {
  264. $errors = $tagwriter->errors;
  265. return true;
  266. }
  267. $errors = $tagwriter->errors;
  268. return false;
  269. }
  270. $IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'zip', 'mid', 'mod', 'xm', 'it', 's3m');
  271. if (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan']) || !empty($_REQUEST['rescanerrors'])) {
  272. $SQLquery = 'DELETE from `'.GETID3_DB_TABLE.'`';
  273. $SQLquery .= ' WHERE (`fileformat` = "")';
  274. safe_mysql_query($SQLquery);
  275. $FilesInDir = array();
  276. if (!empty($_REQUEST['rescanerrors'])) {
  277. echo '<a href="'.$_SERVER['PHP_SELF'].'">abort</a><hr>';
  278. echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>';
  279. $SQLquery = 'SELECT `filename`';
  280. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  281. $SQLquery .= ' WHERE (`error` <> "")';
  282. $SQLquery .= ' OR (`warning` <> "")';
  283. $SQLquery .= ' ORDER BY `filename` ASC';
  284. $result = safe_mysql_query($SQLquery);
  285. while ($row = mysql_fetch_array($result)) {
  286. if (!file_exists($row['filename'])) {
  287. echo '<b>File missing: '.$row['filename'].'</b><br>';
  288. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  289. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  290. safe_mysql_query($SQLquery);
  291. } else {
  292. $FilesInDir[] = $row['filename'];
  293. }
  294. }
  295. } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
  296. echo '<a href="'.$_SERVER['PHP_SELF'].'">abort</a><hr>';
  297. echo 'Scanning all media files in <b>'.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).'</b> (and subdirectories)<hr>';
  298. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  299. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  300. $SQLquery .= ' GROUP BY `filename`';
  301. $SQLquery .= ' ORDER BY `num` DESC';
  302. $result = safe_mysql_query($SQLquery);
  303. $DupesDeleted = 0;
  304. while ($row = mysql_fetch_array($result)) {
  305. set_time_limit(30);
  306. if ($row['num'] <= 1) {
  307. break;
  308. }
  309. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  310. $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"';
  311. safe_mysql_query($SQLquery);
  312. $DupesDeleted++;
  313. }
  314. if ($DupesDeleted > 0) {
  315. echo 'Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
  316. }
  317. if (!empty($_REQUEST['newscan'])) {
  318. $AlreadyInDatabase = array();
  319. set_time_limit(60);
  320. $SQLquery = 'SELECT `filename`';
  321. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  322. $SQLquery .= ' ORDER BY `filename` ASC';
  323. $result = safe_mysql_query($SQLquery);
  324. while ($row = mysql_fetch_array($result)) {
  325. //$AlreadyInDatabase[] = strtolower($row['filename']);
  326. $AlreadyInDatabase[] = $row['filename'];
  327. }
  328. }
  329. $DirectoriesToScan = array(@$_REQUEST['scan'] ? $_REQUEST['scan'] : $_REQUEST['newscan']);
  330. $DirectoriesScanned = array();
  331. while (count($DirectoriesToScan) > 0) {
  332. foreach ($DirectoriesToScan as $DirectoryKey => $startingdir) {
  333. if ($dir = opendir($startingdir)) {
  334. set_time_limit(30);
  335. echo '<b>'.str_replace('\\', '/', $startingdir).'</b><br>';
  336. flush();
  337. while (($file = readdir($dir)) !== false) {
  338. if (($file != '.') && ($file != '..')) {
  339. $RealPathName = realpath($startingdir.'/'.$file);
  340. if (is_dir($RealPathName)) {
  341. if (!in_array($RealPathName, $DirectoriesScanned) && !in_array($RealPathName, $DirectoriesToScan)) {
  342. $DirectoriesToScan[] = $RealPathName;
  343. }
  344. } else if (is_file($RealPathName)) {
  345. if (!empty($_REQUEST['newscan'])) {
  346. if (!in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase)) {
  347. $FilesInDir[] = $RealPathName;
  348. }
  349. } elseif (!empty($_REQUEST['scan'])) {
  350. $FilesInDir[] = $RealPathName;
  351. }
  352. }
  353. }
  354. }
  355. closedir($dir);
  356. } else {
  357. echo '<FONT COLOR="RED">Failed to open directory "<b>'.$startingdir.'</b>"</FONT><br><br>';
  358. }
  359. $DirectoriesScanned[] = $startingdir;
  360. unset($DirectoriesToScan[$DirectoryKey]);
  361. }
  362. }
  363. echo '<i>List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)</i><hr>';
  364. flush();
  365. }
  366. $FilesInDir = array_unique($FilesInDir);
  367. sort($FilesInDir);
  368. $starttime = time();
  369. $rowcounter = 0;
  370. $totaltoprocess = count($FilesInDir);
  371. foreach ($FilesInDir as $filename) {
  372. set_time_limit(300);
  373. echo '<br>'.date('H:i:s').' ['.number_format(++$rowcounter).' / '.number_format($totaltoprocess).'] '.str_replace('\\', '/', $filename);
  374. $ThisFileInfo = $getID3->analyze($filename);
  375. getid3_lib::CopyTagsToComments($ThisFileInfo);
  376. if (file_exists($filename)) {
  377. $ThisFileInfo['file_modified_time'] = filemtime($filename);
  378. $ThisFileInfo['md5_file'] = ($getid3_demo_mysql_md5_file ? md5_file($filename) : '');
  379. }
  380. if (empty($ThisFileInfo['fileformat'])) {
  381. echo ' (<span style="color: #990099;">unknown file type</span>)';
  382. } else {
  383. if (!empty($ThisFileInfo['error'])) {
  384. echo ' (<span style="color: #FF0000;">errors</span>)';
  385. } elseif (!empty($ThisFileInfo['warning'])) {
  386. echo ' (<span style="color: #FF9999;">warnings</span>)';
  387. } else {
  388. echo ' (<span style="color: #009900;">OK</span>)';
  389. }
  390. $this_track_track = '';
  391. if (!empty($ThisFileInfo['comments']['track'])) {
  392. foreach ($ThisFileInfo['comments']['track'] as $key => $value) {
  393. if (strlen($value) > strlen($this_track_track)) {
  394. $this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT);
  395. }
  396. }
  397. if (ereg('^([0-9]+)/([0-9]+)$', $this_track_track, $matches)) {
  398. // change "1/5"->"01/05", "3/12"->"03/12", etc
  399. $this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT).'/'.str_pad($matches[2], 2, '0', STR_PAD_LEFT);
  400. }
  401. }
  402. $this_track_remix = '';
  403. $this_track_title = '';
  404. if (!empty($ThisFileInfo['comments']['title'])) {
  405. foreach ($ThisFileInfo['comments']['title'] as $possible_title) {
  406. if (strlen($possible_title) > strlen($this_track_title)) {
  407. $this_track_title = $possible_title;
  408. }
  409. }
  410. }
  411. $ParenthesesPairs = array('()', '[]', '{}');
  412. foreach ($ParenthesesPairs as $pair) {
  413. 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)) {
  414. $this_track_title = $matches[1][0];
  415. $this_track_remix = implode("\t", $matches[2]);
  416. }
  417. }
  418. if (!empty($_REQUEST['rescanerrors'])) {
  419. $SQLquery = 'UPDATE `'.GETID3_DB_TABLE.'` SET ';
  420. $SQLquery .= '`LastModified` = "'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", ';
  421. $SQLquery .= '`md5_file` = "'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", ';
  422. $SQLquery .= '`md5_data` = "'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", ';
  423. $SQLquery .= '`md5_data_source` = "'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", ';
  424. $SQLquery .= '`filesize` = "'.mysql_escape_string(@$ThisFileInfo['filesize']).'", ';
  425. $SQLquery .= '`fileformat` = "'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", ';
  426. $SQLquery .= '`audio_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", ';
  427. $SQLquery .= '`video_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", ';
  428. $SQLquery .= '`audio_bitrate` = "'.mysql_escape_string(@$ThisFileInfo['audio']['bitrate']).'", ';
  429. $SQLquery .= '`video_bitrate` = "'.mysql_escape_string(@$ThisFileInfo['video']['bitrate']).'", ';
  430. $SQLquery .= '`playtime_seconds` = "'.mysql_escape_string(@$ThisFileInfo['playtime_seconds']).'", ';
  431. $SQLquery .= '`tags` = "'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", ';
  432. $SQLquery .= '`artist` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", ';
  433. $SQLquery .= '`title` = "'.mysql_escape_string($this_track_title).'", ';
  434. $SQLquery .= '`remix` = "'.mysql_escape_string($this_track_remix).'", ';
  435. $SQLquery .= '`album` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", ';
  436. $SQLquery .= '`genre` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", ';
  437. $SQLquery .= '`comment` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", ';
  438. $SQLquery .= '`track` = "'.mysql_escape_string($this_track_track).'", ';
  439. $SQLquery .= '`comments_all` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", ';
  440. $SQLquery .= '`comments_id3v2` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", ';
  441. $SQLquery .= '`comments_ape` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", ';
  442. $SQLquery .= '`comments_lyrics3` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", ';
  443. $SQLquery .= '`comments_id3v1` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", ';
  444. $SQLquery .= '`warning` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", ';
  445. $SQLquery .= '`error` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", ';
  446. $SQLquery .= '`encoder_options` = "'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", ';
  447. $SQLquery .= '`vbr_method` = "'.mysql_escape_string(@$ThisFileInfo['mpeg']['audio']['VBR_method']).'", ';
  448. $SQLquery .= '`track_volume` = "'.mysql_escape_string(@$ThisFileInfo['replay_gain']['track']['volume']).'" ';
  449. $SQLquery .= 'WHERE (`filename` = "'.mysql_escape_string(@$ThisFileInfo['filenamepath']).'")';
  450. } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
  451. $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 (';
  452. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['filenamepath']).'", ';
  453. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", ';
  454. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", ';
  455. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", ';
  456. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", ';
  457. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['filesize']).'", ';
  458. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", ';
  459. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", ';
  460. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", ';
  461. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['audio']['bitrate']).'", ';
  462. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['video']['bitrate']).'", ';
  463. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['playtime_seconds']).'", ';
  464. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", ';
  465. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", ';
  466. $SQLquery .= '"'.mysql_escape_string($this_track_title).'", ';
  467. $SQLquery .= '"'.mysql_escape_string($this_track_remix).'", ';
  468. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", ';
  469. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", ';
  470. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", ';
  471. $SQLquery .= '"'.mysql_escape_string($this_track_track).'", ';
  472. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", ';
  473. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", ';
  474. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", ';
  475. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", ';
  476. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", ';
  477. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", ';
  478. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", ';
  479. $SQLquery .= '"'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", ';
  480. $SQLquery .= '"'.mysql_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : @$ThisFileInfo['mpeg']['audio']['VBR_method']).'", ';
  481. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['replay_gain']['track']['volume']).'")';
  482. }
  483. flush();
  484. safe_mysql_query($SQLquery);
  485. }
  486. }
  487. $SQLquery = 'OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`';
  488. safe_mysql_query($SQLquery);
  489. echo '<hr>Done scanning!<hr>';
  490. } elseif (!empty($_REQUEST['missingtrackvolume'])) {
  491. $MissingTrackVolumeFilesScanned = 0;
  492. $MissingTrackVolumeFilesAdjusted = 0;
  493. $MissingTrackVolumeFilesDeleted = 0;
  494. $SQLquery = 'SELECT `filename`';
  495. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  496. $SQLquery .= ' WHERE (`track_volume` = "0")';
  497. $SQLquery .= ' AND (`audio_bitrate` > "0")';
  498. $result = safe_mysql_query($SQLquery);
  499. echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / '.number_format(mysql_num_rows($result)).' files for track volume information:<hr>';
  500. while ($row = mysql_fetch_array($result)) {
  501. set_time_limit(30);
  502. echo '<script>if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "'.number_format($MissingTrackVolumeFilesScanned++).'";</script>. ';
  503. flush();
  504. if (file_exists($row['filename'])) {
  505. $ThisFileInfo = $getID3->analyze($row['filename']);
  506. if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) {
  507. $MissingTrackVolumeFilesAdjusted++;
  508. $SQLquery = 'UPDATE `'.GETID3_DB_TABLE.'`';
  509. $SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"';
  510. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  511. safe_mysql_query($SQLquery);
  512. }
  513. } else {
  514. $MissingTrackVolumeFilesDeleted++;
  515. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  516. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  517. safe_mysql_query($SQLquery);
  518. }
  519. }
  520. echo '<hr>Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.<br>';
  521. 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>';
  522. } elseif (!empty($_REQUEST['deadfilescheck'])) {
  523. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  524. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  525. $SQLquery .= ' GROUP BY `filename`';
  526. $SQLquery .= ' ORDER BY `num` DESC';
  527. $result = safe_mysql_query($SQLquery);
  528. $DupesDeleted = 0;
  529. while ($row = mysql_fetch_array($result)) {
  530. set_time_limit(30);
  531. if ($row['num'] <= 1) {
  532. break;
  533. }
  534. echo '<br>'.FixTextFields($row['filename']).' (<font color="#FF9999">duplicate</font>)';
  535. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  536. $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"';
  537. safe_mysql_query($SQLquery);
  538. $DupesDeleted++;
  539. }
  540. if ($DupesDeleted > 0) {
  541. echo '<hr>Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
  542. }
  543. $SQLquery = 'SELECT `filename`, `filesize`, `LastModified`';
  544. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  545. $SQLquery .= ' ORDER BY `filename` ASC';
  546. $result = safe_mysql_query($SQLquery);
  547. $totalchecked = 0;
  548. $totalremoved = 0;
  549. $previousdir = '';
  550. while ($row = mysql_fetch_array($result)) {
  551. $totalchecked++;
  552. set_time_limit(30);
  553. $reason = '';
  554. if (!file_exists($row['filename'])) {
  555. $reason = 'deleted';
  556. } elseif (filesize($row['filename']) != $row['filesize']) {
  557. $reason = 'filesize changed';
  558. } elseif (filemtime($row['filename']) != $row['LastModified']) {
  559. if (abs(filemtime($row['filename']) - $row['LastModified']) != 3600) {
  560. // off by exactly one hour == daylight savings time
  561. $reason = 'last-modified time changed';
  562. }
  563. }
  564. $thisdir = dirname($row['filename']);
  565. if ($reason) {
  566. $totalremoved++;
  567. echo '<br>'.FixTextFields($row['filename']).' (<font color="#FF9999">'.$reason.'</font>)';
  568. flush();
  569. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  570. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  571. safe_mysql_query($SQLquery);
  572. } elseif ($thisdir != $previousdir) {
  573. echo '. ';
  574. flush();
  575. }
  576. $previousdir = $thisdir;
  577. }
  578. 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>';
  579. } elseif (!empty($_REQUEST['encodedbydistribution'])) {
  580. if (!empty($_REQUEST['m3u'])) {
  581. header('Content-type: audio/x-mpegurl');
  582. echo '#EXTM3U'."\n";
  583. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  584. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  585. $SQLquery .= ' WHERE (`encoder_options` = "'.mysql_escape_string($_REQUEST['encodedbydistribution']).'")';
  586. $result = mysql_query($SQLquery);
  587. $NonBlankEncodedBy = '';
  588. $BlankEncodedBy = '';
  589. while ($row = mysql_fetch_array($result)) {
  590. set_time_limit(30);
  591. $CommentArray = unserialize($row['comments_id3v2']);
  592. if (isset($CommentArray['encoded_by'][0])) {
  593. $NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
  594. } else {
  595. $BlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
  596. }
  597. }
  598. echo $NonBlankEncodedBy;
  599. echo $BlankEncodedBy;
  600. exit;
  601. } elseif (!empty($_REQUEST['showfiles'])) {
  602. echo '<a href="'.$_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'">show all</a><br>';
  603. echo '<table border="1">';
  604. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  605. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  606. $result = mysql_query($SQLquery);
  607. while ($row = mysql_fetch_array($result)) {
  608. set_time_limit(30);
  609. $CommentArray = unserialize($row['comments_id3v2']);
  610. if (($_REQUEST['encodedbydistribution'] == '%') || (!empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0]))) {
  611. echo '<tr><td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  612. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td></tr>';
  613. }
  614. }
  615. echo '</table>';
  616. } else {
  617. $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`';
  618. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  619. $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC';
  620. $result = mysql_query($SQLquery);
  621. $EncodedBy = array();
  622. while ($row = mysql_fetch_array($result)) {
  623. set_time_limit(30);
  624. $CommentArray = unserialize($row['comments_id3v2']);
  625. if (isset($EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]])) {
  626. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]]++;
  627. } else {
  628. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]] = 1;
  629. }
  630. }
  631. echo '<a href="'.$_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'&m3u=1">.m3u version</a><br>';
  632. echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>';
  633. foreach ($EncodedBy as $key => $value) {
  634. echo '<tr><TD VALIGN="TOP"><a href="'.$_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($key).'&showfiles=1&m3u=1">m3u</a></td>';
  635. echo '<TD VALIGN="TOP"><b>'.$key.'</b></td>';
  636. echo '<td><table border="0" WIDTH="100%">';
  637. arsort($value);
  638. foreach ($value as $string => $count) {
  639. echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>'.number_format($count).'</i></td><td>&nbsp;</td>';
  640. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($string).'&showfiles=1">'.$string.'</a></td></tr>';
  641. }
  642. echo '</table></td></tr>';
  643. }
  644. echo '</table>';
  645. }
  646. } elseif (!empty($_REQUEST['audiobitrates'])) {
  647. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
  648. $BitrateDistribution = array();
  649. $SQLquery = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`';
  650. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  651. $SQLquery .= ' WHERE (`audio_bitrate` > 0)';
  652. $SQLquery .= ' GROUP BY `RoundBitrate`';
  653. $result = safe_mysql_query($SQLquery);
  654. while ($row = mysql_fetch_array($result)) {
  655. @$BitrateDistribution[getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000)] += $row['num']; // safe_inc
  656. }
  657. echo '<table border="1" cellspacing="0" cellpadding="3">';
  658. echo '<tr><th>Bitrate</th><th>Count</th></tr>';
  659. foreach ($BitrateDistribution as $Bitrate => $Count) {
  660. echo '<tr>';
  661. echo '<TD ALIGN="RIGHT">'.round($Bitrate / 1000).' kbps</td>';
  662. echo '<TD ALIGN="RIGHT">'.number_format($Count).'</td>';
  663. echo '</tr>';
  664. }
  665. echo '</table>';
  666. } elseif (!empty($_REQUEST['emptygenres'])) {
  667. $SQLquery = 'SELECT `fileformat`, `filename`, `genre`';
  668. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  669. $SQLquery .= ' WHERE (`genre` = "")';
  670. $SQLquery .= ' OR (`genre` = "Unknown")';
  671. $SQLquery .= ' OR (`genre` = "Other")';
  672. $SQLquery .= ' ORDER BY `filename` ASC';
  673. $result = safe_mysql_query($SQLquery);
  674. if (!empty($_REQUEST['m3u'])) {
  675. header('Content-type: audio/x-mpegurl');
  676. echo '#EXTM3U'."\n";
  677. while ($row = mysql_fetch_array($result)) {
  678. if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
  679. echo WindowsShareSlashTranslate($row['filename'])."\n";
  680. }
  681. }
  682. exit;
  683. } else {
  684. echo '<a href="'.$_SERVER['PHP_SELF'].'?emptygenres='.urlencode($_REQUEST['emptygenres']).'&m3u=1">.m3u version</a><br>';
  685. $EmptyGenreCounter = 0;
  686. echo '<table border="1" cellspacing="0" cellpadding="3">';
  687. echo '<tr><th>m3u</th><th>filename</th></tr>';
  688. while ($row = mysql_fetch_array($result)) {
  689. if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
  690. $EmptyGenreCounter++;
  691. echo '<tr>';
  692. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  693. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  694. echo '</tr>';
  695. }
  696. }
  697. echo '</table>';
  698. echo '<b>'.number_format($EmptyGenreCounter).'</b> files with empty genres';
  699. }
  700. } elseif (!empty($_REQUEST['nonemptycomments'])) {
  701. $SQLquery = 'SELECT `filename`, `comment`';
  702. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  703. $SQLquery .= ' WHERE (`comment` <> "")';
  704. $SQLquery .= ' ORDER BY `comment` ASC';
  705. $result = safe_mysql_query($SQLquery);
  706. if (!empty($_REQUEST['m3u'])) {
  707. header('Content-type: audio/x-mpegurl');
  708. echo '#EXTM3U'."\n";
  709. while ($row = mysql_fetch_array($result)) {
  710. echo WindowsShareSlashTranslate($row['filename'])."\n";
  711. }
  712. exit;
  713. } else {
  714. $NonEmptyCommentsCounter = 0;
  715. echo '<a href="'.$_SERVER['PHP_SELF'].'?nonemptycomments='.urlencode($_REQUEST['nonemptycomments']).'&m3u=1">.m3u version</a><br>';
  716. echo '<table border="1" cellspacing="0" cellpadding="3">';
  717. echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>';
  718. while ($row = mysql_fetch_array($result)) {
  719. $NonEmptyCommentsCounter++;
  720. echo '<tr>';
  721. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  722. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  723. if (strlen(trim($row['comment'])) > 0) {
  724. echo '<td>'.FixTextFields($row['comment']).'</td>';
  725. } else {
  726. echo '<td><i>space</i></td>';
  727. }
  728. echo '</tr>';
  729. }
  730. echo '</table>';
  731. echo '<b>'.number_format($NonEmptyCommentsCounter).'</b> files with non-empty comments';
  732. }
  733. } elseif (!empty($_REQUEST['trackzero'])) {
  734. $SQLquery = 'SELECT `filename`, `track`';
  735. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  736. $SQLquery .= ' WHERE (`track` <> "")';
  737. $SQLquery .= ' AND ((`track` < "1")';
  738. $SQLquery .= ' OR (`track` > "99"))';
  739. $SQLquery .= ' ORDER BY `filename` ASC';
  740. $result = safe_mysql_query($SQLquery);
  741. if (!empty($_REQUEST['m3u'])) {
  742. header('Content-type: audio/x-mpegurl');
  743. echo '#EXTM3U'."\n";
  744. while ($row = mysql_fetch_array($result)) {
  745. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
  746. echo WindowsShareSlashTranslate($row['filename'])."\n";
  747. }
  748. }
  749. exit;
  750. } else {
  751. echo '<a href="'.$_SERVER['PHP_SELF'].'?trackzero='.urlencode($_REQUEST['trackzero']).'&m3u=1">.m3u version</a><br>';
  752. $TrackZeroCounter = 0;
  753. echo '<table border="1" cellspacing="0" cellpadding="3">';
  754. echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>';
  755. while ($row = mysql_fetch_array($result)) {
  756. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
  757. $TrackZeroCounter++;
  758. echo '<tr>';
  759. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  760. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  761. echo '<td>'.FixTextFields($row['track']).'</td>';
  762. echo '</tr>';
  763. }
  764. }
  765. echo '</table>';
  766. echo '<b>'.number_format($TrackZeroCounter).'</b> files with track "zero"';
  767. }
  768. } elseif (!empty($_REQUEST['titlefeat'])) {
  769. $SQLquery = 'SELECT `filename`, `title`';
  770. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  771. $SQLquery .= ' WHERE (`title` LIKE "%feat.%")';
  772. $SQLquery .= ' ORDER BY `filename` ASC';
  773. $result = safe_mysql_query($SQLquery);
  774. if (!empty($_REQUEST['m3u'])) {
  775. header('Content-type: audio/x-mpegurl');
  776. echo '#EXTM3U'."\n";
  777. while ($row = mysql_fetch_array($result)) {
  778. echo WindowsShareSlashTranslate($row['filename'])."\n";
  779. }
  780. exit;
  781. } else {
  782. echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with "feat." in the title (instead of the artist)<br><br>';
  783. echo '<a href="'.$_SERVER['PHP_SELF'].'?titlefeat='.urlencode($_REQUEST['titlefeat']).'&m3u=1">.m3u version</a><br>';
  784. echo '<table border="1" cellspacing="0" cellpadding="3">';
  785. echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>';
  786. while ($row = mysql_fetch_array($result)) {
  787. echo '<tr>';
  788. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  789. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  790. echo '<td>'.eregi_replace('(feat\. .*)', '<b>\\1</b>', FixTextFields($row['title'])).'</td>';
  791. echo '</tr>';
  792. }
  793. echo '</table>';
  794. }
  795. } elseif (!empty($_REQUEST['tracknoalbum'])) {
  796. $SQLquery = 'SELECT `filename`, `track`, `album`';
  797. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  798. $SQLquery .= ' WHERE (`track` <> "")';
  799. $SQLquery .= ' AND (`album` = "")';
  800. $SQLquery .= ' ORDER BY `filename` ASC';
  801. $result = safe_mysql_query($SQLquery);
  802. if (!empty($_REQUEST['m3u'])) {
  803. header('Content-type: audio/x-mpegurl');
  804. echo '#EXTM3U'."\n";
  805. while ($row = mysql_fetch_array($result)) {
  806. echo WindowsShareSlashTranslate($row['filename'])."\n";
  807. }
  808. exit;
  809. } else {
  810. echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with a track number, but no album<br><br>';
  811. echo '<a href="'.$_SERVER['PHP_SELF'].'?tracknoalbum='.urlencode($_REQUEST['tracknoalbum']).'&m3u=1">.m3u version</a><br>';
  812. echo '<table border="1" cellspacing="0" cellpadding="3">';
  813. echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>';
  814. while ($row = mysql_fetch_array($result)) {
  815. echo '<tr>';
  816. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  817. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  818. echo '<td>'.FixTextFields($row['track']).'</td>';
  819. echo '<td>'.FixTextFields($row['album']).'</td>';
  820. echo '</tr>';
  821. }
  822. echo '</table>';
  823. }
  824. } elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) {
  825. echo 'Applying new tags from <b>'.$_REQUEST['synchronizetagsfrom'].'</b> in <b>'.FixTextFields($_REQUEST['filename']).'</b><ul>';
  826. $errors = array();
  827. if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) {
  828. echo '<li>Sucessfully wrote tags</li>';
  829. } else {
  830. echo '<li>Tag writing had errors: <ul><li>'.implode('</li><li>', $errors).'</li></ul></li>';
  831. }
  832. echo '</ul>';
  833. } elseif (!empty($_REQUEST['unsynchronizedtags'])) {
  834. $NotOKfiles = 0;
  835. $Autofixedfiles = 0;
  836. $FieldsToCompare = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track');
  837. $TagsToCompare = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  838. $ID3v1FieldLengths = array('title'=>30, 'artist'=>30, 'album'=>30, 'year'=>4, 'genre'=>99, 'comment'=>28);
  839. if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false) {
  840. $TagsToCompare['id3v2'] = true;
  841. }
  842. if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false) {
  843. $TagsToCompare['ape'] = true;
  844. }
  845. if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false) {
  846. $TagsToCompare['lyrics3'] = true;
  847. }
  848. if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false) {
  849. $TagsToCompare['id3v1'] = true;
  850. }
  851. echo '<a href="'.$_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1">Auto-fix empty tags</a><br><br>';
  852. echo '<div id="Autofixing"></div>';
  853. echo '<table border="1" cellspacing="0" cellpadding="3">';
  854. echo '<tr>';
  855. echo '<th>View</th>';
  856. echo '<th>Filename</th>';
  857. echo '<th>Combined</th>';
  858. if ($TagsToCompare['id3v2']) {
  859. echo '<th><a href="'.$_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>';
  860. }
  861. if ($TagsToCompare['ape']) {
  862. echo '<th><a href="'.$_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>';
  863. }
  864. if ($TagsToCompare['lyrics3']) {
  865. echo '<th>Lyrics3</th>';
  866. }
  867. if ($TagsToCompare['id3v1']) {
  868. echo '<th><a href="'.$_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>';
  869. }
  870. echo '</tr>';
  871. $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`';
  872. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  873. $SQLquery .= ' WHERE (`fileformat` = "mp3")';
  874. $SQLquery .= ' ORDER BY `filename` ASC';
  875. $result = safe_mysql_query($SQLquery);
  876. $lastdir = '';
  877. while ($row = mysql_fetch_array($result)) {
  878. set_time_limit(30);
  879. if ($lastdir != dirname($row['filename'])) {
  880. echo '<script>if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($lastdir, ENT_QUOTES).'";</script>';
  881. flush();
  882. }
  883. $FileOK = true;
  884. $Mismatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  885. $SemiMatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  886. $EmptyTags = array('id3v2'=>true, 'ape'=>true, 'lyrics3'=>true, 'id3v1'=>true);
  887. $Comments['all'] = @unserialize($row['comments_all']);
  888. $Comments['id3v2'] = @unserialize($row['comments_id3v2']);
  889. $Comments['ape'] = @unserialize($row['comments_ape']);
  890. $Comments['lyrics3'] = @unserialize($row['comments_lyrics3']);
  891. $Comments['id3v1'] = @unserialize($row['comments_id3v1']);
  892. if (isset($Comments['ape']['tracknumber'])) {
  893. $Comments['ape']['track'] = $Comments['ape']['tracknumber'];
  894. unset($Comments['ape']['tracknumber']);
  895. }
  896. if (!empty($Comments['all']['track'])) {
  897. $besttrack = '';
  898. foreach ($Comments['all']['track'] as $key => $value) {
  899. if (strlen($value) > strlen($besttrack)) {
  900. $besttrack = $value;
  901. }
  902. }
  903. $Comments['all']['track'] = array(0=>$besttrack);
  904. }
  905. $ThisLine = '<tr>';
  906. $ThisLine .= '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">view</a></td>';
  907. $ThisLine .= '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  908. $tagvalues = '';
  909. foreach ($FieldsToCompare as $fieldname) {
  910. $tagvalues .= $fieldname.' = '.@implode(" \n", @$Comments['all'][$fieldname])." \n";
  911. }
  912. $ThisLine .= '<td><a href="'.$_SERVER['PHP_SELF'].'?synchronizetagsfrom=all&filename='.urlencode($row['filename']).'" TITLE="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" TARGET="retagwindow">all</a></td>';
  913. foreach ($TagsToCompare as $tagtype => $CompareThisTagType) {
  914. if ($CompareThisTagType) {
  915. $tagvalues = '';
  916. foreach ($FieldsToCompare as $fieldname) {
  917. if ($tagtype == 'id3v1') {
  918. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
  919. if (($fieldname == 'genre') && !getid3_id3v1::LookupGenreID(@$Comments['all'][$fieldname][0])) {
  920. // non-standard genres can never match, so just ignore
  921. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  922. } elseif ($fieldname == 'comment') {
  923. if (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 28))) {
  924. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  925. if (trim(strtolower(RemoveAccents(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr(@$Comments['all'][$fieldname][0], 0, 28))))) {
  926. $SemiMatched[$tagtype] = true;
  927. } else {
  928. $Mismatched[$tagtype] = true;
  929. }
  930. $FileOK = false;
  931. } else {
  932. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  933. }
  934. } elseif ($fieldname == 'track') {
  935. // intval('01/20') == intval('1')
  936. if (intval(@$Comments[$tagtype][$fieldname][0]) != intval(@$Comments['all'][$fieldname][0])) {
  937. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  938. $Mismatched[$tagtype] = true;
  939. $FileOK = false;
  940. } else {
  941. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  942. }
  943. } elseif (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 30))) {
  944. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  945. if (strtolower(RemoveAccents(trim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)))) == strtolower(RemoveAccents(trim(substr(@$Comments['all'][$fieldname][0], 0, 30))))) {
  946. $SemiMatched[$tagtype] = true;
  947. } else {
  948. $Mismatched[$tagtype] = true;
  949. }
  950. $FileOK = false;
  951. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  952. $EmptyTags[$tagtype] = false;
  953. }
  954. } else {
  955. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  956. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  957. $EmptyTags[$tagtype] = false;
  958. }
  959. }
  960. } elseif (($tagtype == 'ape') && ($fieldname == 'year')) {
  961. if ((@$Comments['ape']['date'][0] != @$Comments['all']['year'][0]) && (@$Comments['ape']['year'][0] != @$Comments['all']['year'][0])) {
  962. $tagvalues .= $fieldname.' = [['.@$Comments['ape']['date'][0].']]'."\n";
  963. $Mismatched[$tagtype] = true;
  964. $FileOK = false;
  965. if (strlen(trim(@$Comments['ape']['date'][0])) > 0) {
  966. $EmptyTags[$tagtype] = false;
  967. }
  968. } else {
  969. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  970. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  971. $EmptyTags[$tagtype] = false;
  972. }
  973. }
  974. } elseif (($fieldname == 'genre') && !empty($Comments['all'][$fieldname]) && !empty($Comments[$tagtype][$fieldname]) && in_array($Comments[$tagtype][$fieldname][0], $Comments['all'][$fieldname])) {
  975. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  976. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  977. $EmptyTags[$tagtype] = false;
  978. }
  979. } elseif (@$Comments[$tagtype][$fieldname][0] != @$Comments['all'][$fieldname][0]) {
  980. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  981. if (trim(strtolower(RemoveAccents(@$Comments[$tagtype][$fieldname][0]))) == trim(strtolower(RemoveAccents(@$Comments['all'][$fieldname][0])))) {
  982. $SemiMatched[$tagtype] = true;
  983. } else {
  984. $Mismatched[$tagtype] = true;
  985. }
  986. $FileOK = false;
  987. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  988. $EmptyTags[$tagtype] = false;
  989. }
  990. } else {
  991. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  992. if (strlen(trim(@$Comments[$tagtype][$fieldname][0])) > 0) {
  993. $EmptyTags[$tagtype] = false;
  994. }
  995. }
  996. }
  997. if ($EmptyTags[$tagtype]) {
  998. $FileOK = false;
  999. $ThisLine .= '<TD BGCOLOR="#0099CC">';
  1000. } elseif ($SemiMatched[$tagtype]) {
  1001. $ThisLine .= '<TD BGCOLOR="#FF9999">';
  1002. } elseif ($Mismatched[$tagtype]) {
  1003. $ThisLine .= '<TD BGCOLOR="#FF0000">';
  1004. } else {
  1005. $ThisLine .= '<TD BGCOLOR="#00CC00">';
  1006. }
  1007. $ThisLine .= '<a href="'.$_SERVER['PHP_SELF'].'?synchronizetagsfrom='.$tagtype.'&filename='.urlencode($row['filename']).'" TITLE="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" TARGET="retagwindow">'.$tagtype.'</a>';
  1008. $ThisLine .= '</td>';
  1009. }
  1010. }
  1011. $ThisLine .= '</tr>';
  1012. if (!$FileOK) {
  1013. $NotOKfiles++;
  1014. echo '<script>if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($row['filename'], ENT_QUOTES).'";</script>';
  1015. flush();
  1016. if (!empty($_REQUEST['autofix'])) {
  1017. $AnyMismatched = false;
  1018. foreach ($Mismatched as $key => $value) {
  1019. if ($value && ($EmptyTags["$key"] === false)) {
  1020. $AnyMismatched = true;
  1021. }
  1022. }
  1023. if ($AnyMismatched && empty($_REQUEST['autofixforcesource'])) {
  1024. echo $ThisLine;
  1025. } else {
  1026. $TagsToSynch = '';
  1027. foreach ($EmptyTags as $key => $value) {
  1028. if ($value) {
  1029. switch ($key) {
  1030. case 'id3v1':
  1031. $TagsToSynch .= '1';
  1032. break;
  1033. case 'id3v2':
  1034. $TagsToSynch .= '2';
  1035. break;
  1036. case 'ape':
  1037. $TagsToSynch .= 'A';
  1038. break;
  1039. }
  1040. }
  1041. }
  1042. $autofixforcesource = (@$_REQUEST['autofixforcesource'] ? $_REQUEST['autofixforcesource'] : 'all');
  1043. $TagsToSynch = (@$_REQUEST['autofixforcedest'] ? $_REQUEST['autofixforcedest'] : $TagsToSynch);
  1044. $errors = array();
  1045. if (SynchronizeAllTags($row['filename'], $autofixforcesource, $TagsToSynch, $errors)) {
  1046. $Autofixedfiles++;
  1047. echo '<tr bgcolor="#00CC00">';
  1048. } else {
  1049. echo '<tr bgcolor="#FF0000">';
  1050. }
  1051. echo '<td>&nbsp;</th>';
  1052. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'" TITLE="'.FixTextFields(implode("\n", $errors)).'">'.FixTextFields($row['filename']).'</a></td>';
  1053. echo '<td><table border="0">';
  1054. echo '<tr><td><b>'.$TagsToSynch.'</b></td></tr>';
  1055. echo '</table></td></tr>';
  1056. }
  1057. } else {
  1058. echo $ThisLine;
  1059. }
  1060. }
  1061. }
  1062. echo '</table><br>';
  1063. echo '<script>if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "";</script>';
  1064. echo 'Found <b>'.number_format($NotOKfiles).'</b> files with unsynchronized tags, and auto-fixed '.number_format($Autofixedfiles).' of them.';
  1065. } elseif (!empty($_REQUEST['filenamepattern'])) {
  1066. $patterns['A'] = 'artist';
  1067. $patterns['T'] = 'title';
  1068. $patterns['M'] = 'album';
  1069. $patterns['N'] = 'track';
  1070. $patterns['G'] = 'genre';
  1071. $patterns['R'] = 'remix';
  1072. $FieldsToUse = explode(' ', wordwrap(eregi_replace('[^A-Z]', '', $_REQUEST['filenamepattern']), 1, ' ', 1));
  1073. //$FieldsToUse = explode(' ', wordwrap($_REQUEST['filenamepattern'], 1, ' ', 1));
  1074. foreach ($FieldsToUse as $FieldID) {
  1075. $FieldNames[] = $patterns["$FieldID"];
  1076. }
  1077. $SQLquery = 'SELECT `filename`, `fileformat`, '.implode(', ', $FieldNames);
  1078. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1079. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1080. $SQLquery .= ' ORDER BY `filename` ASC';
  1081. $result = safe_mysql_query($SQLquery);
  1082. echo 'Files that do not match naming pattern: (<a href="?filenamepattern='.urlencode($_REQUEST['filenamepattern']).'&autofix=1">auto-fix</a>)<br>';
  1083. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1084. 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>';
  1085. $nonmatchingfilenames = 0;
  1086. $Pattern = $_REQUEST['filenamepattern'];
  1087. $PatternLength = strlen($Pattern);
  1088. while ($row = mysql_fetch_array($result)) {
  1089. set_time_limit(10);
  1090. $PatternFilename = '';
  1091. for ($i = 0; $i < $PatternLength; $i++) {
  1092. if (isset($patterns[$Pattern{$i}])) {
  1093. $PatternFilename .= trim(strtr($row[$patterns[$Pattern{$i}]], ':\\*<>|', ';-¤«»¦'), ' ');
  1094. } else {
  1095. $PatternFilename .= $Pattern{$i};
  1096. }
  1097. }
  1098. // Replace "~" with "-" if characters immediately before and after are both numbers,
  1099. // "/" has been replaced with "~" above which is good for multi-song medley dividers,
  1100. // but for things like 24/7, 7/8ths, etc it looks better if it's 24-7, 7-8ths, etc.
  1101. $PatternFilename = eregi_replace('([ a-z]+)/([ a-z]+)', '\\1~\\2', $PatternFilename);
  1102. $PatternFilename = str_replace('/', '×', $PatternFilename);
  1103. $PatternFilename = str_replace('?', '¿', $PatternFilename);
  1104. $PatternFilename = str_replace(' "', ' “', $PatternFilename);
  1105. $PatternFilename = str_replace('("', '(“', $PatternFilename);
  1106. $PatternFilename = str_replace('-"', '-“', $PatternFilename);
  1107. $PatternFilename = str_replace('" ', '” ', $PatternFilename.' ');
  1108. $PatternFilename = str_replace('"', '”', $PatternFilename);
  1109. $PatternFilename = str_replace(' ', ' ', $PatternFilename);
  1110. $ParenthesesPairs = array('()', '[]', '{}');
  1111. foreach ($ParenthesesPairs as $pair) {
  1112. // multiple remixes are stored tab-seperated in the database.
  1113. // change "{2000 Version\tSomebody Remix}" into "{2000 Version} {Somebody Remix}"
  1114. while (ereg('^(.*)'.preg_quote($pair{0}).'([^'.preg_quote($pair{1}).']*)('."\t".')([^'.preg_quote($pair{0}).']*)'.preg_quote($pair{1}), $PatternFilename, $matches)) {
  1115. $PatternFilename = $matches[1].$pair{0}.$matches[2].$pair{1}.' '.$pair{0}.$matches[4].$pair{1};
  1116. }
  1117. // remove empty parenthesized pairs (probably where no track numbers, remix version, etc)
  1118. $PatternFilename = ereg_replace(preg_quote($pair), '', $PatternFilename);
  1119. // "[01] - Title With No Artist.mp3" ==> "[01] Title With No Artist.mp3"
  1120. $PatternFilename = ereg_replace(preg_quote($pair{1}).' +\- ', $pair{1}.' ', $PatternFilename);
  1121. }
  1122. // get rid of leading & trailing spaces if end items (artist or title for example) are missing
  1123. $PatternFilename = trim($PatternFilename, ' -');
  1124. if (!$PatternFilename) {
  1125. // no tags to create a filename from -- skip this file
  1126. continue;
  1127. }
  1128. $PatternFilename .= '.'.$row['fileformat'];
  1129. $ActualFilename = basename($row['filename']);
  1130. if ($ActualFilename != $PatternFilename) {
  1131. $NotMatchedReasons = '';
  1132. if (strtolower($ActualFilename) === strtolower($PatternFilename)) {
  1133. $NotMatchedReasons .= 'Aa ';
  1134. } elseif (RemoveAccents($ActualFilename) === RemoveAccents($PatternFilename)) {
  1135. $NotMatchedReasons .= 'ée ';
  1136. }
  1137. $actualExt = '.'.fileextension($ActualFilename);
  1138. $patternExt = '.'.fileextension($PatternFilename);
  1139. $ActualFilenameNoExt = (($actualExt != '.') ? substr($ActualFilename, 0, 0 - strlen($actualExt)) : $ActualFilename);
  1140. $PatternFilenameNoExt = (($patternExt != '.') ? substr($PatternFilename, 0, 0 - strlen($patternExt)) : $PatternFilename);
  1141. if (strpos($PatternFilenameNoExt, $ActualFilenameNoExt) !== false) {
  1142. $DifferenceBoldedName = str_replace($ActualFilenameNoExt, '</b>'.$ActualFilenameNoExt.'<b>', $PatternFilenameNoExt);
  1143. } else {
  1144. $ShortestNameLength = min(strlen($ActualFilenameNoExt), strlen($PatternFilenameNoExt));
  1145. for ($DifferenceOffset = 0; $DifferenceOffset < $ShortestNameLength; $DifferenceOffset++) {
  1146. if ($ActualFilenameNoExt{$DifferenceOffset} !== $PatternFilenameNoExt{$DifferenceOffset}) {
  1147. break;
  1148. }
  1149. }
  1150. $DifferenceBoldedName = '</b>'.substr($PatternFilenameNoExt, 0, $DifferenceOffset).'<b>'.substr($PatternFilenameNoExt, $DifferenceOffset);
  1151. }
  1152. $DifferenceBoldedName .= (($actualExt == $patternExt) ? '</b>'.$patternExt.'<b>' : $patternExt);
  1153. echo '<tr>';
  1154. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">view</a></td>';
  1155. echo '<td>&nbsp;'.$NotMatchedReasons.'</td>';
  1156. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">'.FixTextFields($ActualFilename).'</a></td>';
  1157. if (@$_REQUEST['autofix']) {
  1158. $results = '';
  1159. if (RenameFileFromTo($row['filename'], dirname($row['filename']).'/'.$PatternFilename, $results)) {
  1160. echo '<TD BGCOLOR="#009900">';
  1161. } else {
  1162. echo '<TD BGCOLOR="#FF0000">';
  1163. }
  1164. echo '<b>'.$DifferenceBoldedName.'</b></td>';
  1165. } else {
  1166. echo '<td><a href="'.$_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">';
  1167. echo '<b>'.$DifferenceBoldedName.'</b></a></td>';
  1168. }
  1169. echo '</tr>';
  1170. $nonmatchingfilenames++;
  1171. }
  1172. }
  1173. echo '</table><br>';
  1174. echo 'Found '.number_format($nonmatchingfilenames).' files that do not match naming pattern<br>';
  1175. } elseif (!empty($_REQUEST['encoderoptionsdistribution'])) {
  1176. if (isset($_REQUEST['showtagfiles'])) {
  1177. $SQLquery = 'SELECT `filename`, `encoder_options` FROM `'.GETID3_DB_TABLE.'`';
  1178. $SQLquery .= ' WHERE (`encoder_options` LIKE "'.mysql_escape_string($_REQUEST['showtagfiles']).'")';
  1179. $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1180. $SQLquery .= ' ORDER BY `filename` ASC';
  1181. $result = safe_mysql_query($SQLquery);
  1182. if (!empty($_REQUEST['m3u'])) {
  1183. header('Content-type: audio/x-mpegurl');
  1184. echo '#EXTM3U'."\n";
  1185. while ($row = mysql_fetch_array($result)) {
  1186. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1187. }
  1188. exit;
  1189. } else {
  1190. echo '<a href="'.$_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1">Show all Encoder Options</a><hr>';
  1191. echo 'Files with Encoder Options <b>'.$_REQUEST['showtagfiles'].'</b>:<br>';
  1192. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1193. while ($row = mysql_fetch_array($result)) {
  1194. echo '<tr>';
  1195. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1196. echo '<td>'.$row['encoder_options'].'</td>';
  1197. echo '</tr>';
  1198. }
  1199. echo '</table>';
  1200. }
  1201. } elseif (!isset($_REQUEST['m3u'])) {
  1202. $SQLquery = 'SELECT `encoder_options`, COUNT(*) AS `num` FROM `'.GETID3_DB_TABLE.'`';
  1203. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1204. $SQLquery .= ' GROUP BY `encoder_options`';
  1205. $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC, `num` DESC, `encoder_options` ASC';
  1206. $result = safe_mysql_query($SQLquery);
  1207. echo 'Files with Encoder Options:<br>';
  1208. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1209. echo '<tr><th>Encoder Options</th><th>Count</th><th>M3U</th></tr>';
  1210. while ($row = mysql_fetch_array($result)) {
  1211. echo '<tr>';
  1212. echo '<td>'.$row['encoder_options'].'</td>';
  1213. echo '<TD ALIGN="RIGHT"><a href="'.$_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '').'">'.number_format($row['num']).'</a></td>';
  1214. echo '<TD ALIGN="RIGHT"><a href="'.$_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1&showtagfiles='.($row['encoder_options'] ? urlencode($row['encoder_options']) : '').'&m3u=.m3u">m3u</a></td>';
  1215. echo '</tr>';
  1216. }
  1217. echo '</table><hr>';
  1218. }
  1219. } elseif (!empty($_REQUEST['tagtypes'])) {
  1220. if (!isset($_REQUEST['m3u'])) {
  1221. $SQLquery = 'SELECT `tags`, COUNT(*) AS `num` FROM `'.GETID3_DB_TABLE.'`';
  1222. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1223. $SQLquery .= ' GROUP BY `tags`';
  1224. $SQLquery .= ' ORDER BY `num` DESC';
  1225. $result = safe_mysql_query($SQLquery);
  1226. echo 'Files with tags:<br>';
  1227. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1228. echo '<tr><th>Tags</th><th>Count</th><th>M3U</th></tr>';
  1229. while ($row = mysql_fetch_array($result)) {
  1230. echo '<tr>';
  1231. echo '<td>'.$row['tags'].'</td>';
  1232. echo '<TD ALIGN="RIGHT"><a href="'.$_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '').'">'.number_format($row['num']).'</a></td>';
  1233. echo '<TD ALIGN="RIGHT"><a href="'.$_SERVER['PHP_SELF'].'?tagtypes=1&showtagfiles='.($row['tags'] ? urlencode($row['tags']) : '').'&m3u=.m3u">m3u</a></td>';
  1234. echo '</tr>';
  1235. }
  1236. echo '</table><hr>';
  1237. }
  1238. if (isset($_REQUEST['showtagfiles'])) {
  1239. $SQLquery = 'SELECT `filename`, `tags` FROM `'.GETID3_DB_TABLE.'`';
  1240. $SQLquery .= ' WHERE (`tags` LIKE "'.mysql_escape_string($_REQUEST['showtagfiles']).'")';
  1241. $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1242. $SQLquery .= ' ORDER BY `filename` ASC';
  1243. $result = safe_mysql_query($SQLquery);
  1244. if (!empty($_REQUEST['m3u'])) {
  1245. header('Content-type: audio/x-mpegurl');
  1246. echo '#EXTM3U'."\n";
  1247. while ($row = mysql_fetch_array($result)) {
  1248. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1249. }
  1250. exit;
  1251. } else {
  1252. echo '<table border="1" cellspacing="0" cellpadding="3">';
  1253. while ($row = mysql_fetch_array($result)) {
  1254. echo '<tr>';
  1255. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1256. echo '<td>'.$row['tags'].'</td>';
  1257. echo '</tr>';
  1258. }
  1259. echo '</table>';
  1260. }
  1261. }
  1262. } elseif (!empty($_REQUEST['md5datadupes'])) {
  1263. $OtherFormats = '';
  1264. $AVFormats = '';
  1265. $SQLquery = 'SELECT `md5_data`, `filename`, COUNT(*) AS `num`';
  1266. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1267. $SQLquery .= ' WHERE (`md5_data` <> "")';
  1268. $SQLquery .= ' GROUP BY `md5_data`';
  1269. $SQLquery .= ' ORDER BY `num` DESC';
  1270. $result = safe_mysql_query($SQLquery);
  1271. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
  1272. set_time_limit(30);
  1273. $filenames = array();
  1274. $tags = array();
  1275. $md5_data = array();
  1276. $SQLquery = 'SELECT `fileformat`, `filename`, `tags`';
  1277. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1278. $SQLquery .= ' WHERE (`md5_data` = "'.mysql_escape_string($row['md5_data']).'")';
  1279. $SQLquery .= ' ORDER BY `filename` ASC';
  1280. $result2 = safe_mysql_query($SQLquery);
  1281. while ($row2 = mysql_fetch_array($result2)) {
  1282. $thisfileformat = $row2['fileformat'];
  1283. $filenames[] = $row2['filename'];
  1284. $tags[] = $row2['tags'];
  1285. $md5_data[] = $row['md5_data'];
  1286. }
  1287. $thisline = '<tr>';
  1288. $thisline .= '<TD VALIGN="TOP" style="font-family: monospace;">'.implode('<br>', $md5_data).'</td>';
  1289. $thisline .= '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $tags).'</td>';
  1290. $thisline .= '<TD VALIGN="TOP">'.implode('<br>', $filenames).'</td>';
  1291. $thisline .= '</tr>';
  1292. if (in_array($thisfileformat, $IgnoreNoTagFormats)) {
  1293. $OtherFormats .= $thisline;
  1294. } else {
  1295. $AVFormats .= $thisline;
  1296. }
  1297. }
  1298. echo 'Duplicated MD5_DATA (Audio/Video files):<table border="1" cellspacing="0" cellpadding="2">';
  1299. echo $AVFormats.'</table><hr>';
  1300. echo 'Duplicated MD5_DATA (Other files):<table border="1" cellspacing="0" cellpadding="2">';
  1301. echo $OtherFormats.'</table><hr>';
  1302. } elseif (!empty($_REQUEST['artisttitledupes'])) {
  1303. if (isset($_REQUEST['m3uartist']) && isset($_REQUEST['m3utitle'])) {
  1304. header('Content-type: audio/x-mpegurl');
  1305. echo '#EXTM3U'."\n";
  1306. $SQLquery = 'SELECT `filename`';
  1307. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1308. $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($_REQUEST['m3uartist']).'")';
  1309. $SQLquery .= ' AND (`title` = "'.mysql_escape_string($_REQUEST['m3utitle']).'")';
  1310. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1311. $result = safe_mysql_query($SQLquery);
  1312. while ($row = mysql_fetch_array($result)) {
  1313. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1314. }
  1315. exit;
  1316. }
  1317. $SQLquery = 'SELECT `artist`, `title`, `filename`, COUNT(*) AS `num`';
  1318. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1319. $SQLquery .= ' WHERE (`artist` <> "")';
  1320. $SQLquery .= ' AND (`title` <> "")';
  1321. $SQLquery .= ' GROUP BY `artist`, `title`'.(@$_REQUEST['samemix'] ? ', `remix`' : '');
  1322. $SQLquery .= ' ORDER BY `num` DESC, `artist` ASC, `title` ASC, `playtime_seconds` ASC, `remix` ASC';
  1323. $result = safe_mysql_query($SQLquery);
  1324. $uniquetitles = 0;
  1325. $uniquefiles = 0;
  1326. if (!empty($_REQUEST['m3u'])) {
  1327. header('Content-type: audio/x-mpegurl');
  1328. echo '#EXTM3U'."\n";
  1329. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
  1330. $SQLquery = 'SELECT `filename`';
  1331. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1332. $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($row['artist']).'")';
  1333. $SQLquery .= ' AND (`title` = "'.mysql_escape_string($row['title']).'")';
  1334. if (@$_REQUEST['samemix']) {
  1335. $SQLquery .= ' AND (`remix` = "'.mysql_escape_string($row['remix']).'")';
  1336. }
  1337. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1338. $result2 = safe_mysql_query($SQLquery);
  1339. while ($row2 = mysql_fetch_array($result2)) {
  1340. echo WindowsShareSlashTranslate($row2['filename'])."\n";
  1341. }
  1342. }
  1343. exit;
  1344. } else {
  1345. echo 'Duplicated aritst + title: (<a href="'.$_SERVER['PHP_SELF'].'?artisttitledupes=1&samemix=1">Identical Mix/Version only</a>)<br>';
  1346. echo '(<a href="'.$_SERVER['PHP_SELF'].'?artisttitledupes=1&m3u=.m3u">.m3u version</a>)<br>';
  1347. echo '<table border="1" cellspacing="0" cellpadding="2">';
  1348. 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>';
  1349. while (($row = mysql_fetch_array($result)) && ($row['num'] > 1)) {
  1350. $uniquetitles++;
  1351. set_time_limit(30);
  1352. $filenames = array();
  1353. $artists = array();
  1354. $titles = array();
  1355. $remixes = array();
  1356. $bitrates = array();
  1357. $playtimes = array();
  1358. $SQLquery = 'SELECT `filename`, `artist`, `title`, `remix`, `audio_bitrate`, `vbr_method`, `playtime_seconds`, `encoder_options`';
  1359. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1360. $SQLquery .= ' WHERE (`artist` = "'.mysql_escape_string($row['artist']).'")';
  1361. $SQLquery .= ' AND (`title` = "'.mysql_escape_string($row['title']).'")';
  1362. $SQLquery .= ' ORDER BY `playtime_seconds` ASC, `remix` ASC, `filename` ASC';
  1363. $result2 = safe_mysql_query($SQLquery);
  1364. while ($row2 = mysql_fetch_array($result2)) {
  1365. $uniquefiles++;
  1366. $filenames[] = $row2['filename'];
  1367. $artists[] = $row2['artist'];
  1368. $titles[] = $row2['title'];
  1369. $remixes[] = $row2['remix'];
  1370. if ($row2['vbr_method']) {
  1371. $bitrates[] = '<B'.($row2['encoder_options'] ? ' style="text-decoration: underline; cursor: help;" TITLE="'.$row2['encoder_options'] : '').'">'.BitrateText($row2['audio_bitrate'] / 1000).'</b>';
  1372. } else {
  1373. $bitrates[] = BitrateText($row2['audio_bitrate'] / 1000);
  1374. }
  1375. $playtimes[] = getid3_lib::PlaytimeString($row2['playtime_seconds']);
  1376. }
  1377. echo '<tr>';
  1378. echo '<TD NOWRAP VALIGN="TOP">';
  1379. foreach ($filenames as $file) {
  1380. echo '<a href="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>';
  1381. }
  1382. echo '</td>';
  1383. echo '<TD NOWRAP VALIGN="TOP">';
  1384. foreach ($filenames as $file) {
  1385. echo '<a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($file).'">play</a><br>';
  1386. }
  1387. echo '</td>';
  1388. echo '<TD VALIGN="MIDDLE" ALIGN="CENTER" ><a href="'.$_SERVER['PHP_SELF'].'?artisttitledupes=1&m3uartist='.urlencode($artists[0]).'&m3utitle='.urlencode($titles[0]).'">play all</a></td>';
  1389. echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $artists).'</td>';
  1390. echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $titles).'</td>';
  1391. echo '<TD VALIGN="TOP" NOWRAP>'.implode('<br>', $remixes).'</td>';
  1392. echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $bitrates).'</td>';
  1393. echo '<TD VALIGN="TOP" NOWRAP ALIGN="RIGHT">'.implode('<br>', $playtimes).'</td>';
  1394. echo '<TD VALIGN="TOP" NOWRAP ALIGN="LEFT"><table border="0" cellspacing="0" cellpadding="0">';
  1395. foreach ($filenames as $file) {
  1396. echo '<tr><TD NOWRAP ALIGN="RIGHT"><a href="demo.browse.php?filename='.rawurlencode($file).'"><span style="color: #339966;">'.dirname($file).'/</span>'.basename($file).'</a></td></tr>';
  1397. }
  1398. echo '</table></td>';
  1399. echo '</tr>';
  1400. }
  1401. }
  1402. echo '</table>';
  1403. echo number_format($uniquefiles).' files with '.number_format($uniquetitles).' unique <i>aritst + title</i><br>';
  1404. echo '<hr>';
  1405. } elseif (!empty($_REQUEST['filetypelist'])) {
  1406. list($fileformat, $audioformat) = explode('|', $_REQUEST['filetypelist']);
  1407. $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`';
  1408. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1409. $SQLquery .= ' WHERE (`fileformat` = "'.mysql_escape_string($fileformat).'")';
  1410. $SQLquery .= ' AND (`audio_dataformat` = "'.mysql_escape_string($audioformat).'")';
  1411. $SQLquery .= ' ORDER BY `filename` ASC';
  1412. $result = safe_mysql_query($SQLquery);
  1413. echo 'Files of format <b>'.$fileformat.'.'.$audioformat.'</b>:<table border="1" cellspacing="0" cellpadding="4">';
  1414. echo '<tr><th>file</th><th>audio</th><th>filename</th></tr>';
  1415. while ($row = mysql_fetch_array($result)) {
  1416. echo '<tr>';
  1417. echo '<td>'.$row['fileformat'].'</td>';
  1418. echo '<td>'.$row['audio_dataformat'].'</td>';
  1419. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1420. echo '</tr>';
  1421. }
  1422. echo '</table><hr>';
  1423. } elseif (!empty($_REQUEST['trackinalbum'])) {
  1424. $SQLquery = 'SELECT `filename`, `album`';
  1425. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1426. $SQLquery .= ' WHERE (`album` LIKE "% [%")';
  1427. $SQLquery .= ' ORDER BY `album` ASC, `filename` ASC';
  1428. $result = safe_mysql_query($SQLquery);
  1429. if (!empty($_REQUEST['m3u'])) {
  1430. header('Content-type: audio/x-mpegurl');
  1431. echo '#EXTM3U'."\n";
  1432. while ($row = mysql_fetch_array($result)) {
  1433. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1434. }
  1435. exit;
  1436. } elseif (!empty($_REQUEST['autofix'])) {
  1437. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
  1438. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
  1439. while ($row = mysql_fetch_array($result)) {
  1440. set_time_limit(30);
  1441. $ThisFileInfo = $getID3->analyze($filename);
  1442. getid3_lib::CopyTagsToComments($ThisFileInfo);
  1443. if (!empty($ThisFileInfo['tags'])) {
  1444. $Album = trim(str_replace(strstr($ThisFileInfo['comments']['album'][0], ' ['), '', $ThisFileInfo['comments']['album'][0]));
  1445. $Track = (string) intval(str_replace(' [', '', str_replace(']', '', strstr($ThisFileInfo['comments']['album'][0], ' ['))));
  1446. if ($Track == '0') {
  1447. $Track = '';
  1448. }
  1449. if ($Album && $Track) {
  1450. echo '<hr>'.FixTextFields($row['filename']).'<br>';
  1451. echo '<i>'.$Album.'</i> (track #'.$Track.')<br>';
  1452. echo '<b>ID3v2:</b> '.(RemoveID3v2($row['filename'], false) ? 'removed' : 'REMOVAL FAILED!').', ';
  1453. 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>';
  1454. } else {
  1455. echo ' . ';
  1456. }
  1457. } else {
  1458. echo '<hr>FAILED<br>'.FixTextFields($row['filename']).'<hr>';
  1459. }
  1460. flush();
  1461. }
  1462. } else {
  1463. echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with <b>[??]</b>-format track numbers in album field:<br>';
  1464. if (mysql_num_rows($result) > 0) {
  1465. echo '(<a href="'.$_SERVER['PHP_SELF'].'?trackinalbum=1&m3u=.m3u">.m3u version</a>)<br>';
  1466. echo '<a href="'.$_SERVER['PHP_SELF'].'?trackinalbum=1&autofix=1">Try to auto-fix</a><br>';
  1467. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1468. while ($row = mysql_fetch_array($result)) {
  1469. echo '<tr>';
  1470. echo '<td>'.$row['album'].'</td>';
  1471. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1472. echo '</tr>';
  1473. }
  1474. echo '</table>';
  1475. }
  1476. echo '<hr>';
  1477. }
  1478. } elseif (!empty($_REQUEST['fileextensions'])) {
  1479. $SQLquery = 'SELECT `filename`, `fileformat`, `audio_dataformat`, `video_dataformat`, `tags`';
  1480. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1481. $SQLquery .= ' ORDER BY `filename` ASC';
  1482. $result = safe_mysql_query($SQLquery);
  1483. $invalidextensionfiles = 0;
  1484. $invalidextensionline = '<table border="1" cellspacing="0" cellpadding="4">';
  1485. $invalidextensionline .= '<tr><th>file</th><th>audio</th><th>video</th><th>tags</th><th>actual</th><th>correct</th><th>filename</th></tr>';
  1486. while ($row = mysql_fetch_array($result)) {
  1487. set_time_limit(30);
  1488. $acceptableextensions = AcceptableExtensions($row['fileformat'], $row['audio_dataformat'], $row['video_dataformat']);
  1489. $actualextension = strtolower(fileextension($row['filename']));
  1490. if ($acceptableextensions && !in_array($actualextension, $acceptableextensions)) {
  1491. $invalidextensionfiles++;
  1492. $invalidextensionline .= '<tr>';
  1493. $invalidextensionline .= '<td>'.$row['fileformat'].'</td>';
  1494. $invalidextensionline .= '<td>'.$row['audio_dataformat'].'</td>';
  1495. $invalidextensionline .= '<td>'.$row['video_dataformat'].'</td>';
  1496. $invalidextensionline .= '<td>'.$row['tags'].'</td>';
  1497. $invalidextensionline .= '<td>'.$actualextension.'</td>';
  1498. $invalidextensionline .= '<td>'.implode('; ', $acceptableextensions).'</td>';
  1499. $invalidextensionline .= '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1500. $invalidextensionline .= '</tr>';
  1501. }
  1502. }
  1503. $invalidextensionline .= '</table><hr>';
  1504. echo number_format($invalidextensionfiles).' files with incorrect filename extension:<br>';
  1505. echo $invalidextensionline;
  1506. } elseif (isset($_REQUEST['genredistribution'])) {
  1507. if (!empty($_REQUEST['m3u'])) {
  1508. header('Content-type: audio/x-mpegurl');
  1509. echo '#EXTM3U'."\n";
  1510. $SQLquery = 'SELECT `filename`';
  1511. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1512. $SQLquery .= ' WHERE (BINARY `genre` = "'.$_REQUEST['genredistribution'].'")';
  1513. $SQLquery .= ' AND (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1514. $SQLquery .= ' ORDER BY `filename` ASC';
  1515. $result = safe_mysql_query($SQLquery);
  1516. while ($row = mysql_fetch_array($result)) {
  1517. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1518. }
  1519. exit;
  1520. } else {
  1521. if ($_REQUEST['genredistribution'] == '%') {
  1522. $SQLquery = 'SELECT COUNT(*) AS `num`, `genre`';
  1523. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1524. $SQLquery .= ' WHERE (`fileformat` NOT LIKE "'.implode('") AND (`fileformat` NOT LIKE "', $IgnoreNoTagFormats).'")';
  1525. $SQLquery .= ' GROUP BY `genre`';
  1526. $SQLquery .= ' ORDER BY `num` DESC';
  1527. $result = safe_mysql_query($SQLquery);
  1528. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
  1529. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1530. echo '<tr><th>Count</th><th>Genre</th><th>m3u</th></tr>';
  1531. while ($row = mysql_fetch_array($result)) {
  1532. $GenreID = getid3_id3v1::LookupGenreID($row['genre']);
  1533. if (is_numeric($GenreID)) {
  1534. echo '<tr bgcolor="#00FF00;">';
  1535. } else {
  1536. echo '<tr bgcolor="#FF9999;">';
  1537. }
  1538. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?genredistribution='.urlencode($row['genre']).'">'.number_format($row['num']).'</a></td>';
  1539. echo '<TD NOWRAP>'.str_replace("\t", '<br>', $row['genre']).'</td>';
  1540. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3u=.m3u&genredistribution='.urlencode($row['genre']).'">.m3u</a></td>';
  1541. echo '</tr>';
  1542. }
  1543. echo '</table><hr>';
  1544. } else {
  1545. $SQLquery = 'SELECT `filename`, `genre`';
  1546. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1547. $SQLquery .= ' WHERE (`genre` LIKE "'.mysql_escape_string($_REQUEST['genredistribution']).'")';
  1548. $SQLquery .= ' ORDER BY `filename` ASC';
  1549. $result = safe_mysql_query($SQLquery);
  1550. echo '<a href="'.$_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%').'">All Genres</a><br>';
  1551. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1552. echo '<tr><th>Genre</th><th>m3u</th><th>Filename</th></tr>';
  1553. while ($row = mysql_fetch_array($result)) {
  1554. echo '<tr>';
  1555. echo '<TD NOWRAP>'.str_replace("\t", '<br>', $row['genre']).'</td>';
  1556. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  1557. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1558. echo '</tr>';
  1559. }
  1560. echo '</table><hr>';
  1561. }
  1562. }
  1563. } elseif (!empty($_REQUEST['formatdistribution'])) {
  1564. $SQLquery = 'SELECT `fileformat`, `audio_dataformat`, COUNT(*) AS `num`';
  1565. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1566. $SQLquery .= ' GROUP BY `fileformat`, `audio_dataformat`';
  1567. $SQLquery .= ' ORDER BY `num` DESC';
  1568. $result = safe_mysql_query($SQLquery);
  1569. echo 'File format distribution:<table border="1" cellspacing="0" cellpadding="4">';
  1570. echo '<tr><th>Number</th><th>Format</th></tr>';
  1571. while ($row = mysql_fetch_array($result)) {
  1572. echo '<tr>';
  1573. echo '<TD ALIGN="RIGHT">'.number_format($row['num']).'</td>';
  1574. echo '<td><a href="'.$_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>';
  1575. echo '</tr>';
  1576. }
  1577. echo '</table><hr>';
  1578. } elseif (!empty($_REQUEST['errorswarnings'])) {
  1579. $SQLquery = 'SELECT `filename`, `error`, `warning`';
  1580. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1581. $SQLquery .= ' WHERE (`error` <> "")';
  1582. $SQLquery .= ' OR (`warning` <> "")';
  1583. $SQLquery .= ' ORDER BY `filename` ASC';
  1584. $result = safe_mysql_query($SQLquery);
  1585. if (!empty($_REQUEST['m3u'])) {
  1586. header('Content-type: audio/x-mpegurl');
  1587. echo '#EXTM3U'."\n";
  1588. while ($row = mysql_fetch_array($result)) {
  1589. echo WindowsShareSlashTranslate($row['filename'])."\n";
  1590. }
  1591. exit;
  1592. } else {
  1593. echo number_format(mysql_num_rows($result)).' files with errors or warnings:<br>';
  1594. echo '(<a href="'.$_SERVER['PHP_SELF'].'?errorswarnings=1&m3u=.m3u">.m3u version</a>)<br>';
  1595. echo '<table border="1" cellspacing="0" cellpadding="4">';
  1596. echo '<tr><th>Filename</th><th>Error</th><th>Warning</th></tr>';
  1597. while ($row = mysql_fetch_array($result)) {
  1598. echo '<tr>';
  1599. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td>';
  1600. echo '<td>'.(!empty($row['error']) ? '<li>'.str_replace("\t", '<li>', FixTextFields($row['error'])).'</li>' : '&nbsp;').'</td>';
  1601. echo '<td>'.(!empty($row['warning']) ? '<li>'.str_replace("\t", '<li>', FixTextFields($row['warning'])).'</li>' : '&nbsp;').'</td>';
  1602. echo '</tr>';
  1603. }
  1604. }
  1605. echo '</table><hr>';
  1606. } elseif (!empty($_REQUEST['fixid3v1padding'])) {
  1607. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.id3v1.php', __FILE__, true);
  1608. $id3v1_writer = new getid3_write_id3v1;
  1609. $SQLquery = 'SELECT `filename`, `error`, `warning`';
  1610. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1611. $SQLquery .= ' WHERE (`fileformat` = "mp3")';
  1612. $SQLquery .= ' AND (`warning` <> "")';
  1613. $SQLquery .= ' ORDER BY `filename` ASC';
  1614. $result = safe_mysql_query($SQLquery);
  1615. $totaltofix = mysql_num_rows($result);
  1616. $rowcounter = 0;
  1617. while ($row = mysql_fetch_array($result)) {
  1618. set_time_limit(30);
  1619. if (strpos($row['warning'], 'Some ID3v1 fields do not use NULL characters for padding') !== false) {
  1620. set_time_limit(30);
  1621. $id3v1_writer->filename = $row['filename'];
  1622. echo ($id3v1_writer->FixID3v1Padding() ? '<span style="color: #009900;">fixed - ' : '<span style="color: #FF0000;">error - ');
  1623. } else {
  1624. echo '<span style="color: #0000FF;">No error? - ';
  1625. }
  1626. echo '['.++$rowcounter.' / '.$totaltofix.'] ';
  1627. echo FixTextFields($row['filename']).'</span><br>';
  1628. flush();
  1629. }
  1630. } elseif (!empty($_REQUEST['vbrmethod'])) {
  1631. if ($_REQUEST['vbrmethod'] == '1') {
  1632. $SQLquery = 'SELECT COUNT(*) AS `num`, `vbr_method`';
  1633. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1634. $SQLquery .= ' GROUP BY `vbr_method`';
  1635. $SQLquery .= ' ORDER BY `vbr_method`';
  1636. $result = safe_mysql_query($SQLquery);
  1637. echo 'VBR methods:<table border="1" cellspacing="0" cellpadding="4">';
  1638. echo '<tr><th>Count</th><th>VBR Method</th></tr>';
  1639. while ($row = mysql_fetch_array($result)) {
  1640. echo '<tr>';
  1641. echo '<TD ALIGN="RIGHT">'.FixTextFields(number_format($row['num'])).'</td>';
  1642. if ($row['vbr_method']) {
  1643. echo '<td><a href="'.$_SERVER['PHP_SELF'].'?vbrmethod='.$row['vbr_method'].'">'.FixTextFields($row['vbr_method']).'</a></td>';
  1644. } else {
  1645. echo '<td><i>CBR</i></td>';
  1646. }
  1647. echo '</tr>';
  1648. }
  1649. echo '</table>';
  1650. } else {
  1651. $SQLquery = 'SELECT `filename`';
  1652. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1653. $SQLquery .= ' WHERE (`vbr_method` = "'.mysql_escape_string($_REQUEST['vbrmethod']).'")';
  1654. $result = safe_mysql_query($SQLquery);
  1655. echo number_format(mysql_num_rows($result)).' files with VBR_method of "'.$_REQUEST['vbrmethod'].'":<table border="1" cellspacing="0" cellpadding="3">';
  1656. while ($row = mysql_fetch_array($result)) {
  1657. echo '<tr><td><a href="'.$_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename']).'">m3u</a></td>';
  1658. echo '<td><a href="demo.browse.php?filename='.rawurlencode($row['filename']).'">'.FixTextFields($row['filename']).'</a></td></tr>';
  1659. }
  1660. echo '</table>';
  1661. }
  1662. echo '<hr>';
  1663. } elseif (!empty($_REQUEST['correctcase'])) {
  1664. $SQLquery = 'SELECT `filename`, `fileformat`';
  1665. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1666. $SQLquery .= ' WHERE (`fileformat` <> "")';
  1667. $SQLquery .= ' ORDER BY `filename` ASC';
  1668. $result = safe_mysql_query($SQLquery);
  1669. 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>';
  1670. echo '<PRE>';
  1671. $lastdir = '';
  1672. while ($row = mysql_fetch_array($result)) {
  1673. set_time_limit(30);
  1674. $CleanedFilename = CleanUpFileName($row['filename']);
  1675. if ($row['filename'] != $CleanedFilename) {
  1676. if (strtolower($lastdir) != strtolower(str_replace('/', '\\', dirname($row['filename'])))) {
  1677. $lastdir = str_replace('/', '\\', dirname($row['filename']));
  1678. echo 'cd "'.$lastdir.'"'."\n";
  1679. }
  1680. echo 'ren "'.basename($row['filename']).'" "'.basename(CleanUpFileName($row['filename'])).'"'."\n";
  1681. }
  1682. }
  1683. echo '</PRE>';
  1684. echo '<hr>';
  1685. }
  1686. function CleanUpFileName($filename) {
  1687. $DirectoryName = dirname($filename);
  1688. $FileExtension = fileextension(basename($filename));
  1689. $BaseFilename = basename($filename, '.'.$FileExtension);
  1690. $BaseFilename = strtolower($BaseFilename);
  1691. $BaseFilename = str_replace('_', ' ', $BaseFilename);
  1692. //$BaseFilename = str_replace('-', ' - ', $BaseFilename);
  1693. $BaseFilename = str_replace('(', ' (', $BaseFilename);
  1694. $BaseFilename = str_replace('( ', '(', $BaseFilename);
  1695. $BaseFilename = str_replace(')', ') ', $BaseFilename);
  1696. $BaseFilename = str_replace(' )', ')', $BaseFilename);
  1697. $BaseFilename = str_replace(' \'\'', ' “', $BaseFilename);
  1698. $BaseFilename = str_replace('\'\' ', '” ', $BaseFilename);
  1699. $BaseFilename = str_replace(' vs ', ' vs. ', $BaseFilename);
  1700. while (strstr($BaseFilename, ' ') !== false) {
  1701. $BaseFilename = str_replace(' ', ' ', $BaseFilename);
  1702. }
  1703. $BaseFilename = trim($BaseFilename);
  1704. return $DirectoryName.'/'.BetterUCwords($BaseFilename).'.'.strtolower($FileExtension);
  1705. }
  1706. function BetterUCwords($string) {
  1707. $stringlength = strlen($string);
  1708. $string{0} = strtoupper($string{0});
  1709. for ($i = 1; $i < $stringlength; $i++) {
  1710. if (($string{$i - 1} == '\'') && ($i > 1) && (($string{$i - 2} == 'O') || ($string{$i - 2} == ' '))) {
  1711. // O'Clock, 'Em
  1712. $string{$i} = strtoupper($string{$i});
  1713. } elseif (ereg('^[\'A-Za-z0-9À-ÿ]$', $string{$i - 1})) {
  1714. $string{$i} = strtolower($string{$i});
  1715. } else {
  1716. $string{$i} = strtoupper($string{$i});
  1717. }
  1718. }
  1719. static $LowerCaseWords = array('vs.', 'feat.');
  1720. static $UpperCaseWords = array('DJ', 'USA', 'II', 'MC', 'CD', 'TV', '\'N\'');
  1721. $OutputListOfWords = array();
  1722. $ListOfWords = explode(' ', $string);
  1723. foreach ($ListOfWords as $ThisWord) {
  1724. if (in_array(strtolower(str_replace('(', '', $ThisWord)), $LowerCaseWords)) {
  1725. $ThisWord = strtolower($ThisWord);
  1726. } elseif (in_array(strtoupper(str_replace('(', '', $ThisWord)), $UpperCaseWords)) {
  1727. $ThisWord = strtoupper($ThisWord);
  1728. } elseif ((substr($ThisWord, 0, 2) == 'Mc') && (strlen($ThisWord) > 2)) {
  1729. $ThisWord{2} = strtoupper($ThisWord{2});
  1730. } elseif ((substr($ThisWord, 0, 3) == 'Mac') && (strlen($ThisWord) > 3)) {
  1731. $ThisWord{3} = strtoupper($ThisWord{3});
  1732. }
  1733. $OutputListOfWords[] = $ThisWord;
  1734. }
  1735. $UCstring = implode(' ', $OutputListOfWords);
  1736. $UCstring = str_replace(' From “', ' from “', $UCstring);
  1737. $UCstring = str_replace(' \'n\' ', ' \'N\' ', $UCstring);
  1738. return $UCstring;
  1739. }
  1740. echo '<hr><form action="'.FixTextFields($_SERVER['PHP_SELF']).'">';
  1741. echo '<b>Warning:</b> Scanning a new directory will erase all previous entries in the database!<br>';
  1742. echo 'Directory: <input type="text" name="scan" size="50" value="'.FixTextFields(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : '').'"> ';
  1743. 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?\');">';
  1744. echo '</form>';
  1745. echo '<hr><form action="'.FixTextFields($_SERVER['PHP_SELF']).'">';
  1746. echo 'Re-scanning a new directory will only add new, previously unscanned files into the list (and not erase the database).<br>';
  1747. echo 'Directory: <input type="text" name="newscan" size="50" value="'.FixTextFields(!empty($_REQUEST['newscan']) ? $_REQUEST['newscan'] : '').'"> ';
  1748. echo '<input type="SUBMIT" value="Go">';
  1749. echo '</form><hr>';
  1750. echo '<ul>';
  1751. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?deadfilescheck=1">Remove deleted or changed files from database</a></li>';
  1752. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?md5datadupes=1">List files with identical MD5_DATA values</a></li>';
  1753. echo '<li><a href="'.$_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>';
  1754. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?fileextensions=1">File with incorrect file extension</a></li>';
  1755. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?formatdistribution=1">File Format Distribution</a></li>';
  1756. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?audiobitrates=1">Audio Bitrate Distribution</a></li>';
  1757. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?vbrmethod=1">VBR_Method Distribution</a></li>';
  1758. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?tagtypes=1">Tag Type Distribution</a></li>';
  1759. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?genredistribution='.urlencode('%').'">Genre Distribution</a></li>';
  1760. //echo '<li><a href="'.$_SERVER['PHP_SELF'].'?missingtrackvolume=1">Scan for missing track volume information (update database from pre-v1.7.0b5)</a></li>';
  1761. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?encoderoptionsdistribution=1">Encoder Options Distribution</a></li>';
  1762. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'">Encoded By (ID3v2) Distribution</a></li>';
  1763. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?trackinalbum=1">Track number in Album field</a></li>';
  1764. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?tracknoalbum=1">Track number, but no Album</a></li>';
  1765. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?titlefeat=1">"feat." in Title field</a></li>';
  1766. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?emptygenres=1">Blank genres</a></li>';
  1767. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?trackzero=1">Track "zero"</a></li>';
  1768. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?nonemptycomments=1">non-empty comments</a></li>';
  1769. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1">Tags that are not synchronized</a> (<a href="'.$_SERVER['PHP_SELF'].'?unsynchronizedtags=2A1&autofix=1">autofix</a>)</li>';
  1770. echo '<li><a href="'.$_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>';
  1771. //echo '<li><a href="'.$_SERVER['PHP_SELF'].'?filenamepattern='.urlencode('A - T').'">Filenames that don\'t match pattern</a></li>';
  1772. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?correctcase=1">Correct filename case (Win/DOS)</a></li>';
  1773. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?fixid3v1padding=1">Fix ID3v1 invalid padding</a></li>';
  1774. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?errorswarnings=1">Files with Errors and/or Warnings</a></li>';
  1775. echo '<li><a href="'.$_SERVER['PHP_SELF'].'?rescanerrors=1">Re-scan only files with Errors and/or Warnings</a></li>';
  1776. echo '</ul>';
  1777. $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`';
  1778. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  1779. $result = mysql_query($SQLquery);
  1780. if ($row = mysql_fetch_array($result)) {
  1781. echo '<hr><b>Currently in the database:</b><TABLE>';
  1782. echo '<tr><TH ALIGN="LEFT">Total Files</th><td>'.number_format($row['TotalFiles']).'</td></tr>';
  1783. echo '<tr><TH ALIGN="LEFT">Total Filesize</th><td>'.number_format($row['TotalFilesize'] / 1048576).' MB</td></tr>';
  1784. echo '<tr><TH ALIGN="LEFT">Total Playtime</th><td>'.number_format($row['TotalPlaytime'] / 3600, 1).' hours</td></tr>';
  1785. echo '<tr><TH ALIGN="LEFT">Average Filesize</th><td>'.number_format($row['AvgFilesize'] / 1048576, 1).' MB</td></tr>';
  1786. echo '<tr><TH ALIGN="LEFT">Average Playtime</th><td>'.getid3_lib::PlaytimeString($row['AvgPlaytime']).'</td></tr>';
  1787. echo '<tr><TH ALIGN="LEFT">Average Bitrate</th><td>'.BitrateText($row['AvgBitrate'] / 1000, 1).'</td></tr>';
  1788. echo '</table>';
  1789. }
  1790. ?>
  1791. </BODY>
  1792. </HTML>