PageRenderTime 47ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/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

Large files files are truncated, but you can click here to view the full file

  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. $t…

Large files files are truncated, but you can click here to view the full file