PageRenderTime 64ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://bitbucket.org/chamilo/chamilo/
PHP | 1528 lines | 1254 code | 214 blank | 60 comment | 207 complexity | 712d2a572e2d1745258e9f7f0fd93145 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0, GPL-3.0, MIT

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. //die('Due to a security issue, this demo has been disabled. It can be enabled by removing line 16 in demos/demo.mysql.php');
  15. // OPTIONS:
  16. $getid3_demo_mysql_encoding = 'ISO-8859-1';
  17. $getid3_demo_mysql_md5_data = false; // All data hashes are by far the slowest part of scanning
  18. $getid3_demo_mysql_md5_file = false;
  19. define('GETID3_DB_HOST', 'localhost');
  20. define('GETID3_DB_USER', 'root');
  21. define('GETID3_DB_PASS', 'password');
  22. define('GETID3_DB_DB', 'getid3');
  23. define('GETID3_DB_TABLE', 'files');
  24. // CREATE DATABASE `getid3`;
  25. if (!@mysql_connect(GETID3_DB_HOST, GETID3_DB_USER, GETID3_DB_PASS)) {
  26. die('Could not connect to MySQL host: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
  27. }
  28. if (!@mysql_select_db(GETID3_DB_DB)) {
  29. die('Could not select database: <blockquote style="background-color: #FF9933; padding: 10px;">'.mysql_error().'</blockquote>');
  30. }
  31. if (!@include_once('../getid3/getid3.php')) {
  32. die('Cannot open '.realpath('../getid3/getid3.php'));
  33. }
  34. // Initialize getID3 engine
  35. $getID3 = new getID3;
  36. $getID3->setOption(array(
  37. 'option_md5_data' => $getid3_demo_mysql_md5_data,
  38. 'encoding' => $getid3_demo_mysql_encoding,
  39. ));
  40. function RemoveAccents($string) {
  41. // Revised version by marksteward?hotmail*com
  42. return strtr(strtr($string, '&#x160;&#x17D;&#x161;&#x17E;&#x;?ÁÂ?Ä?Ç?É?Ë?ÍÎ???ÓÔ?Ö??Ú?ÜÝ?áâ?ä?ç?é?ë?íî???óô?ö??ú?üý?', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'), array('?' => 'TH', '?' => 'th', '?' => 'DH', '?' => 'dh', 'ß' => 'ss', '&#x152;' => 'OE', '&#x153;' => 'oe', '?' => 'AE', '?' => 'ae', '?' => 'u'));
  43. }
  44. function FixTextFields($text) {
  45. $text = getid3_lib::SafeStripSlashes($text);
  46. $text = htmlentities($text, ENT_QUOTES);
  47. return $text;
  48. }
  49. function BitrateColor($bitrate, $BitrateMaxScale=768) {
  50. // $BitrateMaxScale is bitrate of maximum-quality color (bright green)
  51. // below this is gradient, above is solid green
  52. $bitrate *= (256 / $BitrateMaxScale); // scale from 1-[768]kbps to 1-256
  53. $bitrate = round(min(max($bitrate, 1), 256));
  54. $bitrate--; // scale from 1-256kbps to 0-255kbps
  55. $Rcomponent = max(255 - ($bitrate * 2), 0);
  56. $Gcomponent = max(($bitrate * 2) - 255, 0);
  57. if ($bitrate > 127) {
  58. $Bcomponent = max((255 - $bitrate) * 2, 0);
  59. } else {
  60. $Bcomponent = max($bitrate * 2, 0);
  61. }
  62. 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);
  63. }
  64. function BitrateText($bitrate, $decimals=0) {
  65. return '<span style="color: #'.BitrateColor($bitrate).'">'.number_format($bitrate, $decimals).' kbps</span>';
  66. }
  67. function fileextension($filename, $numextensions=1) {
  68. if (strstr($filename, '.')) {
  69. $reversedfilename = strrev($filename);
  70. $offset = 0;
  71. for ($i = 0; $i < $numextensions; $i++) {
  72. $offset = strpos($reversedfilename, '.', $offset + 1);
  73. if ($offset === false) {
  74. return '';
  75. }
  76. }
  77. return strrev(substr($reversedfilename, 0, $offset));
  78. }
  79. return '';
  80. }
  81. function RenameFileFromTo($from, $to, &$results) {
  82. $success = true;
  83. if ($from === $to) {
  84. $results = '<span style="color: #FF0000;"><b>Source and Destination filenames identical</b><br>FAILED to rename';
  85. } elseif (!file_exists($from)) {
  86. $results = '<span style="color: #FF0000;"><b>Source file does not exist</b><br>FAILED to rename';
  87. } elseif (file_exists($to) && (strtolower($from) !== strtolower($to))) {
  88. $results = '<span style="color: #FF0000;"><b>Destination file already exists</b><br>FAILED to rename';
  89. } elseif (@rename($from, $to)) {
  90. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  91. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($from).'")';
  92. safe_mysql_query($SQLquery);
  93. $results = '<span style="color: #008000;">Successfully renamed';
  94. } else {
  95. $results = '<br><span style="color: #FF0000;">FAILED to rename';
  96. $success = false;
  97. }
  98. $results .= ' from:<br><i>'.$from.'</i><br>to:<br><i>'.$to.'</i></span><hr>';
  99. return $success;
  100. }
  101. if (!empty($_REQUEST['renamefilefrom']) && !empty($_REQUEST['renamefileto'])) {
  102. $results = '';
  103. RenameFileFromTo($_REQUEST['renamefilefrom'], $_REQUEST['renamefileto'], $results);
  104. echo $results;
  105. exit;
  106. } elseif (!empty($_REQUEST['m3ufilename'])) {
  107. header('Content-type: audio/x-mpegurl');
  108. echo '#EXTM3U'."\n";
  109. echo WindowsShareSlashTranslate($_REQUEST['m3ufilename'])."\n";
  110. exit;
  111. } elseif (!isset($_REQUEST['m3u']) && !isset($_REQUEST['m3uartist']) && !isset($_REQUEST['m3utitle'])) {
  112. echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
  113. 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>';
  114. }
  115. function WindowsShareSlashTranslate($filename) {
  116. if (substr($filename, 0, 2) == '//') {
  117. return str_replace('/', '\\', $filename);
  118. }
  119. return $filename;
  120. }
  121. function safe_mysql_query($SQLquery) {
  122. $result = @mysql_query($SQLquery);
  123. if (mysql_error()) {
  124. die('<FONT COLOR="red">'.mysql_error().'</FONT><hr><TT>'.$SQLquery.'</TT>');
  125. }
  126. return $result;
  127. }
  128. function mysql_table_exists($tablename) {
  129. return (bool) mysql_query('DESCRIBE '.$tablename);
  130. }
  131. function AcceptableExtensions($fileformat, $audio_dataformat='', $video_dataformat='') {
  132. static $AcceptableExtensionsAudio = array();
  133. if (empty($AcceptableExtensionsAudio)) {
  134. $AcceptableExtensionsAudio['mp3']['mp3'] = array('mp3');
  135. $AcceptableExtensionsAudio['mp2']['mp2'] = array('mp2');
  136. $AcceptableExtensionsAudio['mp1']['mp1'] = array('mp1');
  137. $AcceptableExtensionsAudio['asf']['asf'] = array('asf');
  138. $AcceptableExtensionsAudio['asf']['wma'] = array('wma');
  139. $AcceptableExtensionsAudio['riff']['mp3'] = array('wav');
  140. $AcceptableExtensionsAudio['riff']['wav'] = array('wav');
  141. }
  142. static $AcceptableExtensionsVideo = array();
  143. if (empty($AcceptableExtensionsVideo)) {
  144. $AcceptableExtensionsVideo['mp3']['mp3'] = array('mp3');
  145. $AcceptableExtensionsVideo['mp2']['mp2'] = array('mp2');
  146. $AcceptableExtensionsVideo['mp1']['mp1'] = array('mp1');
  147. $AcceptableExtensionsVideo['asf']['asf'] = array('asf');
  148. $AcceptableExtensionsVideo['asf']['wmv'] = array('wmv');
  149. $AcceptableExtensionsVideo['gif']['gif'] = array('gif');
  150. $AcceptableExtensionsVideo['jpg']['jpg'] = array('jpg');
  151. $AcceptableExtensionsVideo['png']['png'] = array('png');
  152. $AcceptableExtensionsVideo['bmp']['bmp'] = array('bmp');
  153. }
  154. if (!empty($video_dataformat)) {
  155. return (isset($AcceptableExtensionsVideo[$fileformat][$video_dataformat]) ? $AcceptableExtensionsVideo[$fileformat][$video_dataformat] : array());
  156. } else {
  157. return (isset($AcceptableExtensionsAudio[$fileformat][$audio_dataformat]) ? $AcceptableExtensionsAudio[$fileformat][$audio_dataformat] : array());
  158. }
  159. }
  160. if (!empty($_REQUEST['scan'])) {
  161. if (mysql_table_exists(GETID3_DB_TABLE)) {
  162. $SQLquery = 'DROP TABLE `'.GETID3_DB_TABLE.'`';
  163. safe_mysql_query($SQLquery);
  164. }
  165. }
  166. if (!mysql_table_exists(GETID3_DB_TABLE)) {
  167. $SQLquery = 'CREATE TABLE `'.GETID3_DB_TABLE.'` (';
  168. $SQLquery .= ' `ID` mediumint(8) unsigned NOT NULL auto_increment,';
  169. $SQLquery .= ' `filename` text NOT NULL,';
  170. $SQLquery .= ' `LastModified` int(11) NOT NULL default "0",';
  171. $SQLquery .= ' `md5_file` varchar(32) NOT NULL default "",';
  172. $SQLquery .= ' `md5_data` varchar(32) NOT NULL default "",';
  173. $SQLquery .= ' `md5_data_source` varchar(32) NOT NULL default "",';
  174. $SQLquery .= ' `filesize` int(10) unsigned NOT NULL default "0",';
  175. $SQLquery .= ' `fileformat` varchar(255) NOT NULL default "",';
  176. $SQLquery .= ' `audio_dataformat` varchar(255) NOT NULL default "",';
  177. $SQLquery .= ' `video_dataformat` varchar(255) NOT NULL default "",';
  178. $SQLquery .= ' `audio_bitrate` float NOT NULL default "0",';
  179. $SQLquery .= ' `video_bitrate` float NOT NULL default "0",';
  180. $SQLquery .= ' `playtime_seconds` varchar(255) NOT NULL default "",';
  181. $SQLquery .= ' `tags` varchar(255) NOT NULL default "",';
  182. $SQLquery .= ' `artist` varchar(255) NOT NULL default "",';
  183. $SQLquery .= ' `title` varchar(255) NOT NULL default "",';
  184. $SQLquery .= ' `remix` varchar(255) NOT NULL default "",';
  185. $SQLquery .= ' `album` varchar(255) NOT NULL default "",';
  186. $SQLquery .= ' `genre` varchar(255) NOT NULL default "",';
  187. $SQLquery .= ' `comment` text NOT NULL,';
  188. $SQLquery .= ' `track` varchar(7) NOT NULL default "",';
  189. $SQLquery .= ' `comments_all` text NOT NULL,';
  190. $SQLquery .= ' `comments_id3v2` text NOT NULL,';
  191. $SQLquery .= ' `comments_ape` text NOT NULL,';
  192. $SQLquery .= ' `comments_lyrics3` text NOT NULL,';
  193. $SQLquery .= ' `comments_id3v1` text NOT NULL,';
  194. $SQLquery .= ' `warning` text NOT NULL,';
  195. $SQLquery .= ' `error` text NOT NULL,';
  196. $SQLquery .= ' `track_volume` float NOT NULL default "0",';
  197. $SQLquery .= ' `encoder_options` varchar(255) NOT NULL default "",';
  198. $SQLquery .= ' `vbr_method` varchar(255) NOT NULL default "",';
  199. $SQLquery .= ' PRIMARY KEY (`ID`)';
  200. $SQLquery .= ') TYPE=MyISAM;';
  201. safe_mysql_query($SQLquery);
  202. }
  203. $ExistingTableFields = array();
  204. $result = mysql_query('DESCRIBE `'.GETID3_DB_TABLE.'`');
  205. while ($row = mysql_fetch_array($result)) {
  206. $ExistingTableFields[$row['Field']] = $row;
  207. }
  208. if (!isset($ExistingTableFields['encoder_options'])) { // Added in 1.7.0b2
  209. echo '<b>adding field `encoder_options`</b><br>';
  210. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `encoder_options` VARCHAR(255) DEFAULT "" NOT NULL AFTER `error`');
  211. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  212. }
  213. if (isset($ExistingTableFields['track']) && ($ExistingTableFields['track']['Type'] != 'varchar(7)')) { // Changed in 1.7.0b2
  214. echo '<b>changing field `track` to VARCHAR(7)</b><br>';
  215. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` CHANGE `track` `track` VARCHAR(7) DEFAULT "" NOT NULL');
  216. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  217. }
  218. if (!isset($ExistingTableFields['track_volume'])) { // Added in 1.7.0b5
  219. 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>';
  220. echo '<b>adding field `track_volume`</b><br>';
  221. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `track_volume` FLOAT NOT NULL AFTER `error`');
  222. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  223. }
  224. if (!isset($ExistingTableFields['remix'])) { // Added in 1.7.3b1
  225. echo '<b>adding field `encoder_options`, `alternate_name`, `parody`</b><br>';
  226. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `remix` VARCHAR(255) DEFAULT "" NOT NULL AFTER `title`');
  227. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `alternate_name` VARCHAR(255) DEFAULT "" NOT NULL AFTER `track`');
  228. mysql_query('ALTER TABLE `'.GETID3_DB_TABLE.'` ADD `parody` VARCHAR(255) DEFAULT "" NOT NULL AFTER `alternate_name`');
  229. mysql_query('OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`');
  230. }
  231. function SynchronizeAllTags($filename, $synchronizefrom='all', $synchronizeto='A12', &$errors) {
  232. global $getID3;
  233. set_time_limit(30);
  234. $ThisFileInfo = $getID3->analyze($filename);
  235. getid3_lib::CopyTagsToComments($ThisFileInfo);
  236. if ($synchronizefrom == 'all') {
  237. $SourceArray = @$ThisFileInfo['comments'];
  238. } elseif (!empty($ThisFileInfo['tags'][$synchronizefrom])) {
  239. $SourceArray = @$ThisFileInfo['tags'][$synchronizefrom];
  240. } else {
  241. die('ERROR: $ThisFileInfo[tags]['.$synchronizefrom.'] does not exist');
  242. }
  243. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  244. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($filename).'")';
  245. safe_mysql_query($SQLquery);
  246. $TagFormatsToWrite = array();
  247. if ((strpos($synchronizeto, '2') !== false) && ($synchronizefrom != 'id3v2')) {
  248. $TagFormatsToWrite[] = 'id3v2.3';
  249. }
  250. if ((strpos($synchronizeto, 'A') !== false) && ($synchronizefrom != 'ape')) {
  251. $TagFormatsToWrite[] = 'ape';
  252. }
  253. if ((strpos($synchronizeto, 'L') !== false) && ($synchronizefrom != 'lyrics3')) {
  254. $TagFormatsToWrite[] = 'lyrics3';
  255. }
  256. if ((strpos($synchronizeto, '1') !== false) && ($synchronizefrom != 'id3v1')) {
  257. $TagFormatsToWrite[] = 'id3v1';
  258. }
  259. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
  260. $tagwriter = new getid3_writetags;
  261. $tagwriter->filename = $filename;
  262. $tagwriter->tagformats = $TagFormatsToWrite;
  263. $tagwriter->overwrite_tags = true;
  264. $tagwriter->tag_encoding = $getID3->encoding;
  265. $tagwriter->tag_data = $SourceArray;
  266. if ($tagwriter->WriteTags()) {
  267. $errors = $tagwriter->errors;
  268. return true;
  269. }
  270. $errors = $tagwriter->errors;
  271. return false;
  272. }
  273. $IgnoreNoTagFormats = array('', 'png', 'jpg', 'gif', 'bmp', 'swf', 'pdf', 'zip', 'rar', 'mid', 'mod', 'xm', 'it', 's3m');
  274. if (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan']) || !empty($_REQUEST['rescanerrors'])) {
  275. $SQLquery = 'DELETE from `'.GETID3_DB_TABLE.'`';
  276. $SQLquery .= ' WHERE (`fileformat` = "")';
  277. safe_mysql_query($SQLquery);
  278. $FilesInDir = array();
  279. if (!empty($_REQUEST['rescanerrors'])) {
  280. echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
  281. echo 'Re-scanning all media files already in database that had errors and/or warnings in last scan<hr>';
  282. $SQLquery = 'SELECT `filename`';
  283. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  284. $SQLquery .= ' WHERE (`error` <> "")';
  285. $SQLquery .= ' OR (`warning` <> "")';
  286. $SQLquery .= ' ORDER BY `filename` ASC';
  287. $result = safe_mysql_query($SQLquery);
  288. while ($row = mysql_fetch_array($result)) {
  289. if (!file_exists($row['filename'])) {
  290. echo '<b>File missing: '.$row['filename'].'</b><br>';
  291. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  292. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  293. safe_mysql_query($SQLquery);
  294. } else {
  295. $FilesInDir[] = $row['filename'];
  296. }
  297. }
  298. } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
  299. echo '<a href="'.htmlentities($_SERVER['PHP_SELF']).'">abort</a><hr>';
  300. echo 'Scanning all media files in <b>'.str_replace('\\', '/', realpath(!empty($_REQUEST['scan']) ? $_REQUEST['scan'] : $_REQUEST['newscan'])).'</b> (and subdirectories)<hr>';
  301. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  302. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  303. $SQLquery .= ' GROUP BY `filename`';
  304. $SQLquery .= ' ORDER BY `num` DESC';
  305. $result = safe_mysql_query($SQLquery);
  306. $DupesDeleted = 0;
  307. while ($row = mysql_fetch_array($result)) {
  308. set_time_limit(30);
  309. if ($row['num'] <= 1) {
  310. break;
  311. }
  312. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  313. $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"';
  314. safe_mysql_query($SQLquery);
  315. $DupesDeleted++;
  316. }
  317. if ($DupesDeleted > 0) {
  318. echo 'Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
  319. }
  320. if (!empty($_REQUEST['newscan'])) {
  321. $AlreadyInDatabase = array();
  322. set_time_limit(60);
  323. $SQLquery = 'SELECT `filename`';
  324. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  325. $SQLquery .= ' ORDER BY `filename` ASC';
  326. $result = safe_mysql_query($SQLquery);
  327. while ($row = mysql_fetch_array($result)) {
  328. //$AlreadyInDatabase[] = strtolower($row['filename']);
  329. $AlreadyInDatabase[] = $row['filename'];
  330. }
  331. }
  332. $DirectoriesToScan = array(@$_REQUEST['scan'] ? $_REQUEST['scan'] : $_REQUEST['newscan']);
  333. $DirectoriesScanned = array();
  334. while (count($DirectoriesToScan) > 0) {
  335. foreach ($DirectoriesToScan as $DirectoryKey => $startingdir) {
  336. if ($dir = opendir($startingdir)) {
  337. set_time_limit(30);
  338. echo '<b>'.str_replace('\\', '/', $startingdir).'</b><br>';
  339. flush();
  340. while (($file = readdir($dir)) !== false) {
  341. if (($file != '.') && ($file != '..')) {
  342. $RealPathName = realpath($startingdir.'/'.$file);
  343. if (is_dir($RealPathName)) {
  344. if (!in_array($RealPathName, $DirectoriesScanned) && !in_array($RealPathName, $DirectoriesToScan)) {
  345. $DirectoriesToScan[] = $RealPathName;
  346. }
  347. } else if (is_file($RealPathName)) {
  348. if (!empty($_REQUEST['newscan'])) {
  349. if (!in_array(str_replace('\\', '/', $RealPathName), $AlreadyInDatabase)) {
  350. $FilesInDir[] = $RealPathName;
  351. }
  352. } elseif (!empty($_REQUEST['scan'])) {
  353. $FilesInDir[] = $RealPathName;
  354. }
  355. }
  356. }
  357. }
  358. closedir($dir);
  359. } else {
  360. echo '<FONT COLOR="RED">Failed to open directory "<b>'.$startingdir.'</b>"</FONT><br><br>';
  361. }
  362. $DirectoriesScanned[] = $startingdir;
  363. unset($DirectoriesToScan[$DirectoryKey]);
  364. }
  365. }
  366. echo '<i>List of files to scan complete (added '.number_format(count($FilesInDir)).' files to scan)</i><hr>';
  367. flush();
  368. }
  369. $FilesInDir = array_unique($FilesInDir);
  370. sort($FilesInDir);
  371. $starttime = time();
  372. $rowcounter = 0;
  373. $totaltoprocess = count($FilesInDir);
  374. foreach ($FilesInDir as $filename) {
  375. set_time_limit(300);
  376. echo '<br>'.date('H:i:s').' ['.number_format(++$rowcounter).' / '.number_format($totaltoprocess).'] '.str_replace('\\', '/', $filename);
  377. $ThisFileInfo = $getID3->analyze($filename);
  378. getid3_lib::CopyTagsToComments($ThisFileInfo);
  379. if (file_exists($filename)) {
  380. $ThisFileInfo['file_modified_time'] = filemtime($filename);
  381. $ThisFileInfo['md5_file'] = ($getid3_demo_mysql_md5_file ? md5_file($filename) : '');
  382. }
  383. if (empty($ThisFileInfo['fileformat'])) {
  384. echo ' (<span style="color: #990099;">unknown file type</span>)';
  385. } else {
  386. if (!empty($ThisFileInfo['error'])) {
  387. echo ' (<span style="color: #FF0000;">errors</span>)';
  388. } elseif (!empty($ThisFileInfo['warning'])) {
  389. echo ' (<span style="color: #FF9999;">warnings</span>)';
  390. } else {
  391. echo ' (<span style="color: #009900;">OK</span>)';
  392. }
  393. $this_track_track = '';
  394. if (!empty($ThisFileInfo['comments']['track'])) {
  395. foreach ($ThisFileInfo['comments']['track'] as $key => $value) {
  396. if (strlen($value) > strlen($this_track_track)) {
  397. $this_track_track = str_pad($value, 2, '0', STR_PAD_LEFT);
  398. }
  399. }
  400. if (ereg('^([0-9]+)/([0-9]+)$', $this_track_track, $matches)) {
  401. // change "1/5"->"01/05", "3/12"->"03/12", etc
  402. $this_track_track = str_pad($matches[1], 2, '0', STR_PAD_LEFT).'/'.str_pad($matches[2], 2, '0', STR_PAD_LEFT);
  403. }
  404. }
  405. $this_track_remix = '';
  406. $this_track_title = '';
  407. if (!empty($ThisFileInfo['comments']['title'])) {
  408. foreach ($ThisFileInfo['comments']['title'] as $possible_title) {
  409. if (strlen($possible_title) > strlen($this_track_title)) {
  410. $this_track_title = $possible_title;
  411. }
  412. }
  413. }
  414. $ParenthesesPairs = array('()', '[]', '{}');
  415. foreach ($ParenthesesPairs as $pair) {
  416. 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)) {
  417. $this_track_title = $matches[1][0];
  418. $this_track_remix = implode("\t", $matches[2]);
  419. }
  420. }
  421. if (!empty($_REQUEST['rescanerrors'])) {
  422. $SQLquery = 'UPDATE `'.GETID3_DB_TABLE.'` SET ';
  423. $SQLquery .= '`LastModified` = "'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", ';
  424. $SQLquery .= '`md5_file` = "'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", ';
  425. $SQLquery .= '`md5_data` = "'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", ';
  426. $SQLquery .= '`md5_data_source` = "'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", ';
  427. $SQLquery .= '`filesize` = "'.mysql_escape_string(@$ThisFileInfo['filesize']).'", ';
  428. $SQLquery .= '`fileformat` = "'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", ';
  429. $SQLquery .= '`audio_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", ';
  430. $SQLquery .= '`video_dataformat` = "'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", ';
  431. $SQLquery .= '`audio_bitrate` = "'.mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])).'", ';
  432. $SQLquery .= '`video_bitrate` = "'.mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])).'", ';
  433. $SQLquery .= '`playtime_seconds` = "'.mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])).'", ';
  434. $SQLquery .= '`tags` = "'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", ';
  435. $SQLquery .= '`artist` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", ';
  436. $SQLquery .= '`title` = "'.mysql_escape_string($this_track_title).'", ';
  437. $SQLquery .= '`remix` = "'.mysql_escape_string($this_track_remix).'", ';
  438. $SQLquery .= '`album` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", ';
  439. $SQLquery .= '`genre` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", ';
  440. $SQLquery .= '`comment` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", ';
  441. $SQLquery .= '`track` = "'.mysql_escape_string($this_track_track).'", ';
  442. $SQLquery .= '`comments_all` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", ';
  443. $SQLquery .= '`comments_id3v2` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", ';
  444. $SQLquery .= '`comments_ape` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", ';
  445. $SQLquery .= '`comments_lyrics3` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", ';
  446. $SQLquery .= '`comments_id3v1` = "'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", ';
  447. $SQLquery .= '`warning` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", ';
  448. $SQLquery .= '`error` = "'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", ';
  449. $SQLquery .= '`encoder_options` = "'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", ';
  450. $SQLquery .= '`vbr_method` = "'.mysql_escape_string(@$ThisFileInfo['mpeg']['audio']['VBR_method']).'", ';
  451. $SQLquery .= '`track_volume` = "'.mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])).'" ';
  452. $SQLquery .= 'WHERE (`filename` = "'.mysql_escape_string(@$ThisFileInfo['filenamepath']).'")';
  453. } elseif (!empty($_REQUEST['scan']) || !empty($_REQUEST['newscan'])) {
  454. $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 (';
  455. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['filenamepath']).'", ';
  456. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['file_modified_time']).'", ';
  457. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_file']).'", ';
  458. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data']).'", ';
  459. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['md5_data_source']).'", ';
  460. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['filesize']).'", ';
  461. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['fileformat']).'", ';
  462. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['audio']['dataformat']).'", ';
  463. $SQLquery .= '"'.mysql_escape_string(@$ThisFileInfo['video']['dataformat']).'", ';
  464. $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['audio']['bitrate'])).'", ';
  465. $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['video']['bitrate'])).'", ';
  466. $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['playtime_seconds'])).'", ';
  467. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @array_keys(@$ThisFileInfo['tags']))).'", ';
  468. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['artist'])).'", ';
  469. $SQLquery .= '"'.mysql_escape_string($this_track_title).'", ';
  470. $SQLquery .= '"'.mysql_escape_string($this_track_remix).'", ';
  471. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['album'])).'", ';
  472. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['genre'])).'", ';
  473. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['comments']['comment'])).'", ';
  474. $SQLquery .= '"'.mysql_escape_string($this_track_track).'", ';
  475. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['comments'])).'", ';
  476. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v2'])).'", ';
  477. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['ape'])).'", ';
  478. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['lyrics3'])).'", ';
  479. $SQLquery .= '"'.mysql_escape_string(@serialize(@$ThisFileInfo['tags']['id3v1'])).'", ';
  480. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['warning'])).'", ';
  481. $SQLquery .= '"'.mysql_escape_string(@implode("\t", @$ThisFileInfo['error'])).'", ';
  482. $SQLquery .= '"'.mysql_escape_string(trim(@$ThisFileInfo['audio']['encoder'].' '.@$ThisFileInfo['audio']['encoder_options'])).'", ';
  483. $SQLquery .= '"'.mysql_escape_string(!empty($ThisFileInfo['mpeg']['audio']['LAME']) ? 'LAME' : @$ThisFileInfo['mpeg']['audio']['VBR_method']).'", ';
  484. $SQLquery .= '"'.mysql_escape_string(floatval(@$ThisFileInfo['replay_gain']['track']['volume'])).'")';
  485. }
  486. flush();
  487. safe_mysql_query($SQLquery);
  488. }
  489. }
  490. $SQLquery = 'OPTIMIZE TABLE `'.GETID3_DB_TABLE.'`';
  491. safe_mysql_query($SQLquery);
  492. echo '<hr>Done scanning!<hr>';
  493. } elseif (!empty($_REQUEST['missingtrackvolume'])) {
  494. $MissingTrackVolumeFilesScanned = 0;
  495. $MissingTrackVolumeFilesAdjusted = 0;
  496. $MissingTrackVolumeFilesDeleted = 0;
  497. $SQLquery = 'SELECT `filename`';
  498. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  499. $SQLquery .= ' WHERE (`track_volume` = "0")';
  500. $SQLquery .= ' AND (`audio_bitrate` > "0")';
  501. $result = safe_mysql_query($SQLquery);
  502. echo 'Scanning <span ID="missingtrackvolumeNowScanning">0</span> / '.number_format(mysql_num_rows($result)).' files for track volume information:<hr>';
  503. while ($row = mysql_fetch_array($result)) {
  504. set_time_limit(30);
  505. echo '<script type="text/javascript">if (document.getElementById("missingtrackvolumeNowScanning")) document.getElementById("missingtrackvolumeNowScanning").innerHTML = "'.number_format($MissingTrackVolumeFilesScanned++).'";</script>. ';
  506. flush();
  507. if (file_exists($row['filename'])) {
  508. $ThisFileInfo = $getID3->analyze($row['filename']);
  509. if (!empty($ThisFileInfo['replay_gain']['track']['volume'])) {
  510. $MissingTrackVolumeFilesAdjusted++;
  511. $SQLquery = 'UPDATE `'.GETID3_DB_TABLE.'`';
  512. $SQLquery .= ' SET `track_volume` = "'.$ThisFileInfo['replay_gain']['track']['volume'].'"';
  513. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  514. safe_mysql_query($SQLquery);
  515. }
  516. } else {
  517. $MissingTrackVolumeFilesDeleted++;
  518. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  519. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  520. safe_mysql_query($SQLquery);
  521. }
  522. }
  523. echo '<hr>Scanned '.number_format($MissingTrackVolumeFilesScanned).' files with no track volume information.<br>';
  524. 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>';
  525. } elseif (!empty($_REQUEST['deadfilescheck'])) {
  526. $SQLquery = 'SELECT COUNT(*) AS `num`, `filename`';
  527. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  528. $SQLquery .= ' GROUP BY `filename`';
  529. $SQLquery .= ' ORDER BY `num` DESC';
  530. $result = safe_mysql_query($SQLquery);
  531. $DupesDeleted = 0;
  532. while ($row = mysql_fetch_array($result)) {
  533. set_time_limit(30);
  534. if ($row['num'] <= 1) {
  535. break;
  536. }
  537. echo '<br>'.FixTextFields($row['filename']).' (<font color="#FF9999">duplicate</font>)';
  538. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  539. $SQLquery .= ' WHERE `filename` LIKE "'.mysql_escape_string($row['filename']).'"';
  540. safe_mysql_query($SQLquery);
  541. $DupesDeleted++;
  542. }
  543. if ($DupesDeleted > 0) {
  544. echo '<hr>Deleted <b>'.number_format($DupesDeleted).'</b> duplicate filenames<hr>';
  545. }
  546. $SQLquery = 'SELECT `filename`, `filesize`, `LastModified`';
  547. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  548. $SQLquery .= ' ORDER BY `filename` ASC';
  549. $result = safe_mysql_query($SQLquery);
  550. $totalchecked = 0;
  551. $totalremoved = 0;
  552. $previousdir = '';
  553. while ($row = mysql_fetch_array($result)) {
  554. $totalchecked++;
  555. set_time_limit(30);
  556. $reason = '';
  557. if (!file_exists($row['filename'])) {
  558. $reason = 'deleted';
  559. } elseif (filesize($row['filename']) != $row['filesize']) {
  560. $reason = 'filesize changed';
  561. } elseif (filemtime($row['filename']) != $row['LastModified']) {
  562. if (abs(filemtime($row['filename']) - $row['LastModified']) != 3600) {
  563. // off by exactly one hour == daylight savings time
  564. $reason = 'last-modified time changed';
  565. }
  566. }
  567. $thisdir = dirname($row['filename']);
  568. if ($reason) {
  569. $totalremoved++;
  570. echo '<br>'.FixTextFields($row['filename']).' (<font color="#FF9999">'.$reason.'</font>)';
  571. flush();
  572. $SQLquery = 'DELETE FROM `'.GETID3_DB_TABLE.'`';
  573. $SQLquery .= ' WHERE (`filename` = "'.mysql_escape_string($row['filename']).'")';
  574. safe_mysql_query($SQLquery);
  575. } elseif ($thisdir != $previousdir) {
  576. echo '. ';
  577. flush();
  578. }
  579. $previousdir = $thisdir;
  580. }
  581. 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>';
  582. } elseif (!empty($_REQUEST['encodedbydistribution'])) {
  583. if (!empty($_REQUEST['m3u'])) {
  584. header('Content-type: audio/x-mpegurl');
  585. echo '#EXTM3U'."\n";
  586. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  587. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  588. $SQLquery .= ' WHERE (`encoder_options` = "'.mysql_escape_string($_REQUEST['encodedbydistribution']).'")';
  589. $result = mysql_query($SQLquery);
  590. $NonBlankEncodedBy = '';
  591. $BlankEncodedBy = '';
  592. while ($row = mysql_fetch_array($result)) {
  593. set_time_limit(30);
  594. $CommentArray = unserialize($row['comments_id3v2']);
  595. if (isset($CommentArray['encoded_by'][0])) {
  596. $NonBlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
  597. } else {
  598. $BlankEncodedBy .= WindowsShareSlashTranslate($row['filename'])."\n";
  599. }
  600. }
  601. echo $NonBlankEncodedBy;
  602. echo $BlankEncodedBy;
  603. exit;
  604. } elseif (!empty($_REQUEST['showfiles'])) {
  605. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%')).'">show all</a><br>';
  606. echo '<table border="1">';
  607. $SQLquery = 'SELECT `filename`, `comments_id3v2`';
  608. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  609. $result = mysql_query($SQLquery);
  610. while ($row = mysql_fetch_array($result)) {
  611. set_time_limit(30);
  612. $CommentArray = unserialize($row['comments_id3v2']);
  613. if (($_REQUEST['encodedbydistribution'] == '%') || (!empty($CommentArray['encoded_by'][0]) && ($_REQUEST['encodedbydistribution'] == $CommentArray['encoded_by'][0]))) {
  614. echo '<tr><td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  615. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td></tr>';
  616. }
  617. }
  618. echo '</table>';
  619. } else {
  620. $SQLquery = 'SELECT `encoder_options`, `comments_id3v2`';
  621. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  622. $SQLquery .= ' ORDER BY (`encoder_options` LIKE "LAME%") DESC, (`encoder_options` LIKE "CBR%") DESC';
  623. $result = mysql_query($SQLquery);
  624. $EncodedBy = array();
  625. while ($row = mysql_fetch_array($result)) {
  626. set_time_limit(30);
  627. $CommentArray = unserialize($row['comments_id3v2']);
  628. if (isset($EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]])) {
  629. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]]++;
  630. } else {
  631. $EncodedBy[$row['encoder_options']][@$CommentArray['encoded_by'][0]] = 1;
  632. }
  633. }
  634. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode('%').'&m3u=1').'">.m3u version</a><br>';
  635. echo '<table border="1"><tr><th>m3u</th><th>Encoder Options</th><th>Encoded By (ID3v2)</th></tr>';
  636. foreach ($EncodedBy as $key => $value) {
  637. echo '<tr><TD VALIGN="TOP"><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($key).'&showfiles=1&m3u=1').'">m3u</a></td>';
  638. echo '<TD VALIGN="TOP"><b>'.$key.'</b></td>';
  639. echo '<td><table border="0" WIDTH="100%">';
  640. arsort($value);
  641. foreach ($value as $string => $count) {
  642. echo '<tr><TD ALIGN="RIGHT" WIDTH="50"><i>'.number_format($count).'</i></td><td>&nbsp;</td>';
  643. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?encodedbydistribution='.urlencode($string).'&showfiles=1').'">'.$string.'</a></td></tr>';
  644. }
  645. echo '</table></td></tr>';
  646. }
  647. echo '</table>';
  648. }
  649. } elseif (!empty($_REQUEST['audiobitrates'])) {
  650. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);
  651. $BitrateDistribution = array();
  652. $SQLquery = 'SELECT ROUND(audio_bitrate / 1000) AS `RoundBitrate`, COUNT(*) AS `num`';
  653. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  654. $SQLquery .= ' WHERE (`audio_bitrate` > 0)';
  655. $SQLquery .= ' GROUP BY `RoundBitrate`';
  656. $result = safe_mysql_query($SQLquery);
  657. while ($row = mysql_fetch_array($result)) {
  658. @$BitrateDistribution[getid3_mp3::ClosestStandardMP3Bitrate($row['RoundBitrate'] * 1000)] += $row['num']; // safe_inc
  659. }
  660. echo '<table border="1" cellspacing="0" cellpadding="3">';
  661. echo '<tr><th>Bitrate</th><th>Count</th></tr>';
  662. foreach ($BitrateDistribution as $Bitrate => $Count) {
  663. echo '<tr>';
  664. echo '<TD ALIGN="RIGHT">'.round($Bitrate / 1000).' kbps</td>';
  665. echo '<TD ALIGN="RIGHT">'.number_format($Count).'</td>';
  666. echo '</tr>';
  667. }
  668. echo '</table>';
  669. } elseif (!empty($_REQUEST['emptygenres'])) {
  670. $SQLquery = 'SELECT `fileformat`, `filename`, `genre`';
  671. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  672. $SQLquery .= ' WHERE (`genre` = "")';
  673. $SQLquery .= ' OR (`genre` = "Unknown")';
  674. $SQLquery .= ' OR (`genre` = "Other")';
  675. $SQLquery .= ' ORDER BY `filename` ASC';
  676. $result = safe_mysql_query($SQLquery);
  677. if (!empty($_REQUEST['m3u'])) {
  678. header('Content-type: audio/x-mpegurl');
  679. echo '#EXTM3U'."\n";
  680. while ($row = mysql_fetch_array($result)) {
  681. if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
  682. echo WindowsShareSlashTranslate($row['filename'])."\n";
  683. }
  684. }
  685. exit;
  686. } else {
  687. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?emptygenres='.urlencode($_REQUEST['emptygenres']).'&m3u=1').'">.m3u version</a><br>';
  688. $EmptyGenreCounter = 0;
  689. echo '<table border="1" cellspacing="0" cellpadding="3">';
  690. echo '<tr><th>m3u</th><th>filename</th></tr>';
  691. while ($row = mysql_fetch_array($result)) {
  692. if (!in_array($row['fileformat'], $IgnoreNoTagFormats)) {
  693. $EmptyGenreCounter++;
  694. echo '<tr>';
  695. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  696. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  697. echo '</tr>';
  698. }
  699. }
  700. echo '</table>';
  701. echo '<b>'.number_format($EmptyGenreCounter).'</b> files with empty genres';
  702. }
  703. } elseif (!empty($_REQUEST['nonemptycomments'])) {
  704. $SQLquery = 'SELECT `filename`, `comment`';
  705. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  706. $SQLquery .= ' WHERE (`comment` <> "")';
  707. $SQLquery .= ' ORDER BY `comment` ASC';
  708. $result = safe_mysql_query($SQLquery);
  709. if (!empty($_REQUEST['m3u'])) {
  710. header('Content-type: audio/x-mpegurl');
  711. echo '#EXTM3U'."\n";
  712. while ($row = mysql_fetch_array($result)) {
  713. echo WindowsShareSlashTranslate($row['filename'])."\n";
  714. }
  715. exit;
  716. } else {
  717. $NonEmptyCommentsCounter = 0;
  718. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?nonemptycomments='.urlencode($_REQUEST['nonemptycomments']).'&m3u=1').'">.m3u version</a><br>';
  719. echo '<table border="1" cellspacing="0" cellpadding="3">';
  720. echo '<tr><th>m3u</th><th>filename</th><th>comments</th></tr>';
  721. while ($row = mysql_fetch_array($result)) {
  722. $NonEmptyCommentsCounter++;
  723. echo '<tr>';
  724. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  725. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  726. if (strlen(trim($row['comment'])) > 0) {
  727. echo '<td>'.FixTextFields($row['comment']).'</td>';
  728. } else {
  729. echo '<td><i>space</i></td>';
  730. }
  731. echo '</tr>';
  732. }
  733. echo '</table>';
  734. echo '<b>'.number_format($NonEmptyCommentsCounter).'</b> files with non-empty comments';
  735. }
  736. } elseif (!empty($_REQUEST['trackzero'])) {
  737. $SQLquery = 'SELECT `filename`, `track`';
  738. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  739. $SQLquery .= ' WHERE (`track` <> "")';
  740. $SQLquery .= ' AND ((`track` < "1")';
  741. $SQLquery .= ' OR (`track` > "99"))';
  742. $SQLquery .= ' ORDER BY `filename` ASC';
  743. $result = safe_mysql_query($SQLquery);
  744. if (!empty($_REQUEST['m3u'])) {
  745. header('Content-type: audio/x-mpegurl');
  746. echo '#EXTM3U'."\n";
  747. while ($row = mysql_fetch_array($result)) {
  748. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
  749. echo WindowsShareSlashTranslate($row['filename'])."\n";
  750. }
  751. }
  752. exit;
  753. } else {
  754. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?trackzero='.urlencode($_REQUEST['trackzero']).'&m3u=1').'">.m3u version</a><br>';
  755. $TrackZeroCounter = 0;
  756. echo '<table border="1" cellspacing="0" cellpadding="3">';
  757. echo '<tr><th>m3u</th><th>filename</th><th>track</th></tr>';
  758. while ($row = mysql_fetch_array($result)) {
  759. if ((strlen($row['track']) > 0) && ($row['track'] < 1) || ($row['track'] > 99)) {
  760. $TrackZeroCounter++;
  761. echo '<tr>';
  762. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  763. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  764. echo '<td>'.FixTextFields($row['track']).'</td>';
  765. echo '</tr>';
  766. }
  767. }
  768. echo '</table>';
  769. echo '<b>'.number_format($TrackZeroCounter).'</b> files with track "zero"';
  770. }
  771. } elseif (!empty($_REQUEST['titlefeat'])) {
  772. $SQLquery = 'SELECT `filename`, `title`';
  773. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  774. $SQLquery .= ' WHERE (`title` LIKE "%feat.%")';
  775. $SQLquery .= ' ORDER BY `filename` ASC';
  776. $result = safe_mysql_query($SQLquery);
  777. if (!empty($_REQUEST['m3u'])) {
  778. header('Content-type: audio/x-mpegurl');
  779. echo '#EXTM3U'."\n";
  780. while ($row = mysql_fetch_array($result)) {
  781. echo WindowsShareSlashTranslate($row['filename'])."\n";
  782. }
  783. exit;
  784. } else {
  785. echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with "feat." in the title (instead of the artist)<br><br>';
  786. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?titlefeat='.urlencode($_REQUEST['titlefeat']).'&m3u=1').'">.m3u version</a><br>';
  787. echo '<table border="1" cellspacing="0" cellpadding="3">';
  788. echo '<tr><th>m3u</th><th>filename</th><th>title</th></tr>';
  789. while ($row = mysql_fetch_array($result)) {
  790. echo '<tr>';
  791. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  792. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  793. echo '<td>'.eregi_replace('(feat\. .*)', '<b>\\1</b>', FixTextFields($row['title'])).'</td>';
  794. echo '</tr>';
  795. }
  796. echo '</table>';
  797. }
  798. } elseif (!empty($_REQUEST['tracknoalbum'])) {
  799. $SQLquery = 'SELECT `filename`, `track`, `album`';
  800. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  801. $SQLquery .= ' WHERE (`track` <> "")';
  802. $SQLquery .= ' AND (`album` = "")';
  803. $SQLquery .= ' ORDER BY `filename` ASC';
  804. $result = safe_mysql_query($SQLquery);
  805. if (!empty($_REQUEST['m3u'])) {
  806. header('Content-type: audio/x-mpegurl');
  807. echo '#EXTM3U'."\n";
  808. while ($row = mysql_fetch_array($result)) {
  809. echo WindowsShareSlashTranslate($row['filename'])."\n";
  810. }
  811. exit;
  812. } else {
  813. echo '<b>'.number_format(mysql_num_rows($result)).'</b> files with a track number, but no album<br><br>';
  814. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?tracknoalbum='.urlencode($_REQUEST['tracknoalbum']).'&m3u=1').'">.m3u version</a><br>';
  815. echo '<table border="1" cellspacing="0" cellpadding="3">';
  816. echo '<tr><th>m3u</th><th>filename</th><th>track</th><th>album</th></tr>';
  817. while ($row = mysql_fetch_array($result)) {
  818. echo '<tr>';
  819. echo '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">m3u</a></td>';
  820. echo '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  821. echo '<td>'.FixTextFields($row['track']).'</td>';
  822. echo '<td>'.FixTextFields($row['album']).'</td>';
  823. echo '</tr>';
  824. }
  825. echo '</table>';
  826. }
  827. } elseif (!empty($_REQUEST['synchronizetagsfrom']) && !empty($_REQUEST['filename'])) {
  828. echo 'Applying new tags from <b>'.$_REQUEST['synchronizetagsfrom'].'</b> in <b>'.FixTextFields($_REQUEST['filename']).'</b><ul>';
  829. $errors = array();
  830. if (SynchronizeAllTags($_REQUEST['filename'], $_REQUEST['synchronizetagsfrom'], 'A12', $errors)) {
  831. echo '<li>Sucessfully wrote tags</li>';
  832. } else {
  833. echo '<li>Tag writing had errors: <ul><li>'.implode('</li><li>', $errors).'</li></ul></li>';
  834. }
  835. echo '</ul>';
  836. } elseif (!empty($_REQUEST['unsynchronizedtags'])) {
  837. $NotOKfiles = 0;
  838. $Autofixedfiles = 0;
  839. $FieldsToCompare = array('title', 'artist', 'album', 'year', 'genre', 'comment', 'track');
  840. $TagsToCompare = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  841. $ID3v1FieldLengths = array('title'=>30, 'artist'=>30, 'album'=>30, 'year'=>4, 'genre'=>99, 'comment'=>28);
  842. if (strpos($_REQUEST['unsynchronizedtags'], '2') !== false) {
  843. $TagsToCompare['id3v2'] = true;
  844. }
  845. if (strpos($_REQUEST['unsynchronizedtags'], 'A') !== false) {
  846. $TagsToCompare['ape'] = true;
  847. }
  848. if (strpos($_REQUEST['unsynchronizedtags'], 'L') !== false) {
  849. $TagsToCompare['lyrics3'] = true;
  850. }
  851. if (strpos($_REQUEST['unsynchronizedtags'], '1') !== false) {
  852. $TagsToCompare['id3v1'] = true;
  853. }
  854. echo '<a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1').'">Auto-fix empty tags</a><br><br>';
  855. echo '<div id="Autofixing"></div>';
  856. echo '<table border="1" cellspacing="0" cellpadding="3">';
  857. echo '<tr>';
  858. echo '<th>View</th>';
  859. echo '<th>Filename</th>';
  860. echo '<th>Combined</th>';
  861. if ($TagsToCompare['id3v2']) {
  862. echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=id3v2&autofixforcedest=A1').'" title="Auto-fix all tags to match ID3v2 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v2?\');">ID3v2</a></th>';
  863. }
  864. if ($TagsToCompare['ape']) {
  865. echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=21').'" title="Auto-fix all tags to match APE contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match APE?\');">APE</a></th>';
  866. }
  867. if ($TagsToCompare['lyrics3']) {
  868. echo '<th>Lyrics3</th>';
  869. }
  870. if ($TagsToCompare['id3v1']) {
  871. echo '<th><a href="'.htmlentities($_SERVER['PHP_SELF'].'?unsynchronizedtags='.urlencode($_REQUEST['unsynchronizedtags']).'&autofix=1&autofixforcesource=ape&autofixforcedest=2A').'" title="Auto-fix all tags to match ID3v1 contents" onClick="return confirm(\'Are you SURE you want to synchronize all tags to match ID3v1?\');">ID3v1</a></th>';
  872. }
  873. echo '</tr>';
  874. $SQLquery = 'SELECT `filename`, `comments_all`, `comments_id3v2`, `comments_ape`, `comments_lyrics3`, `comments_id3v1`';
  875. $SQLquery .= ' FROM `'.GETID3_DB_TABLE.'`';
  876. $SQLquery .= ' WHERE (`fileformat` = "mp3")';
  877. $SQLquery .= ' ORDER BY `filename` ASC';
  878. $result = safe_mysql_query($SQLquery);
  879. $lastdir = '';
  880. while ($row = mysql_fetch_array($result)) {
  881. set_time_limit(30);
  882. if ($lastdir != dirname($row['filename'])) {
  883. echo '<script type="text/javascript">if (document.getElementById("Autofixing")) document.getElementById("Autofixing").innerHTML = "'.htmlentities($lastdir, ENT_QUOTES).'";</script>';
  884. flush();
  885. }
  886. $FileOK = true;
  887. $Mismatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  888. $SemiMatched = array('id3v2'=>false, 'ape'=>false, 'lyrics3'=>false, 'id3v1'=>false);
  889. $EmptyTags = array('id3v2'=>true, 'ape'=>true, 'lyrics3'=>true, 'id3v1'=>true);
  890. $Comments['all'] = @unserialize($row['comments_all']);
  891. $Comments['id3v2'] = @unserialize($row['comments_id3v2']);
  892. $Comments['ape'] = @unserialize($row['comments_ape']);
  893. $Comments['lyrics3'] = @unserialize($row['comments_lyrics3']);
  894. $Comments['id3v1'] = @unserialize($row['comments_id3v1']);
  895. if (isset($Comments['ape']['tracknumber'])) {
  896. $Comments['ape']['track'] = $Comments['ape']['tracknumber'];
  897. unset($Comments['ape']['tracknumber']);
  898. }
  899. if (isset($Comments['ape']['track_number'])) {
  900. $Comments['ape']['track'] = $Comments['ape']['track_number'];
  901. unset($Comments['ape']['track_number']);
  902. }
  903. if (isset($Comments['id3v2']['track_number'])) {
  904. $Comments['id3v2']['track'] = $Comments['id3v2']['track_number'];
  905. unset($Comments['id3v2']['track_number']);
  906. }
  907. if (!empty($Comments['all']['track'])) {
  908. $besttrack = '';
  909. foreach ($Comments['all']['track'] as $key => $value) {
  910. if (strlen($value) > strlen($besttrack)) {
  911. $besttrack = $value;
  912. }
  913. }
  914. $Comments['all']['track'] = array(0=>$besttrack);
  915. }
  916. $ThisLine = '<tr>';
  917. $ThisLine .= '<td><a href="'.htmlentities('demo.browse.php?filename='.rawurlencode($row['filename'])).'">view</a></td>';
  918. $ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?m3ufilename='.urlencode($row['filename'])).'">'.FixTextFields($row['filename']).'</a></td>';
  919. $tagvalues = '';
  920. foreach ($FieldsToCompare as $fieldname) {
  921. $tagvalues .= $fieldname.' = '.@implode(" \n", @$Comments['all'][$fieldname])." \n";
  922. }
  923. $ThisLine .= '<td><a href="'.htmlentities($_SERVER['PHP_SELF'].'?synchronizetagsfrom=all&filename='.urlencode($row['filename'])).'" title="'.htmlentities(rtrim($tagvalues, "\n"), ENT_QUOTES).'" target="retagwindow">all</a></td>';
  924. foreach ($TagsToCompare as $tagtype => $CompareThisTagType) {
  925. if ($CompareThisTagType) {
  926. $tagvalues = '';
  927. foreach ($FieldsToCompare as $fieldname) {
  928. if ($tagtype == 'id3v1') {
  929. getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);
  930. if (($fieldname == 'genre') && !getid3_id3v1::LookupGenreID(@$Comments['all'][$fieldname][0])) {
  931. // non-standard genres can never match, so just ignore
  932. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  933. } elseif ($fieldname == 'comment') {
  934. if (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 28))) {
  935. //echo __LINE__.'<br>';
  936. //echo '<pre>';
  937. //var_dump($tagtype);
  938. //var_dump($fieldname);
  939. //echo '<pre>';
  940. //exit;
  941. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  942. if (trim(strtolower(RemoveAccents(substr(@$Comments[$tagtype][$fieldname][0], 0, 28)))) == trim(strtolower(RemoveAccents(substr(@$Comments['all'][$fieldname][0], 0, 28))))) {
  943. $SemiMatched[$tagtype] = true;
  944. } else {
  945. $Mismatched[$tagtype] = true;
  946. }
  947. $FileOK = false;
  948. } else {
  949. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  950. }
  951. } elseif ($fieldname == 'track') {
  952. // intval('01/20') == intval('1')
  953. if (intval(@$Comments[$tagtype][$fieldname][0]) != intval(@$Comments['all'][$fieldname][0])) {
  954. //echo __LINE__.'<br>';
  955. //echo '<pre>';
  956. //var_dump($tagtype);
  957. //var_dump($fieldname);
  958. //echo '<pre>';
  959. //exit;
  960. $tagvalues .= $fieldname.' = [['.@$Comments[$tagtype][$fieldname][0].']]'."\n";
  961. $Mismatched[$tagtype] = true;
  962. $FileOK = false;
  963. } else {
  964. $tagvalues .= $fieldname.' = '.@$Comments[$tagtype][$fieldname][0]."\n";
  965. }
  966. } elseif (rtrim(substr(@$Comments[$tagtype][$fieldname][0], 0, 30)) != rtrim(substr(@$Comments['all'][$fieldname][0], 0, 30))) {
  967. //echo __LINE__.'<br>';
  968. //echo '<pre>';
  969. //var_dump($tagtype);
  970. //var_dump($fieldname);
  971. //echo '<pre>';
  972. //exit;
  973. $tag

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