function drawFileHierarchy(File $file, $traceFileName, $currentFileName, $level = 1) { if ($level == 1 && $file instanceof Directory) { foreach ($file->subItems as $child) { drawFileHierarchy($child, $traceFileName, $currentFileName, $level + 1); } } elseif ($file instanceof Directory) { ?> <div> <div> <span id="<?php echo fileId(new File($traceFileName), $file); ?> " class="toggler store glyphicon glyphicon-plus"></span> <?php echo $file->getBaseName(); ?> <span class="label label-info"><?php echo $file->hits; ?> </span> </div> <div class="sub-list" style="padding-left: 15px"> <?php foreach ($file->subItems as $child) { drawFileHierarchy($child, $traceFileName, $currentFileName, $level + 1); } ?> </div> </div> <?php } else { ?> <div> <a id="<?php echo fileId(new File($traceFileName), $file); ?> " href="<?php echo '/file-trace/view/' . urlencode($traceFileName) . '/' . urlencode($file->getFullName()); ?> " class="<?php echo $currentFileName == $file->getFullName() ? 'active' : ''; ?> "> <?php echo $file->getBaseName(); ?> </a> <span class="label label-info"><?php echo $file->hits; ?> </span> </div> <?php } }
function fileInfo() { global $cfg, $db, $dirsCounter, $filesCounter, $curFilesCounter, $curDirsCounter, $prevDirsCounter, $prevFilesCounter; $year = NULL; $dr = NULL; // Initialize getID3 $getID3 = new getID3(); //initial settings for getID3: include 'include/getID3init.inc.php'; /* // Force update all tracks on new getID3() or netjukebox update.php version. $new_getid3_hash = hmacmd5($getID3->version(), file_get_contents(NJB_HOME_DIR . 'update.php')); if ($new_getid3_hash != $cfg['getid3_hash']) { mysql_query('UPDATE track SET filemtime = 0 WHERE 1'); mysql_query('UPDATE server SET value = "' . mysql_real_escape_string($new_getid3_hash) . '" WHERE name = "getid3_hash" LIMIT 1'); } */ $updated = false; $query = mysql_query('SELECT relative_file, filesize, filemtime, album_id FROM track WHERE updated ORDER BY relative_file'); $filesCounter = mysql_num_rows($query); while ($track = mysql_fetch_assoc($query)) { ++$curFilesCounter; $file = $cfg['media_dir'] . $track['relative_file']; if (is_file($file) == false) { message(__FILE__, __LINE__, 'error', '[b]Failed to read file:[/b][br]' . $file . '[list][*]Update again[*]Check file permission[/list]'); } $filemtime = filemtime($file); $filesize = filesize($file); $force_filename_update = false; if ($filesize != $track['filesize'] || filemtimeCompare($filemtime, $track['filemtime']) == false || $force_filename_update) { if ($cfg['cli_update'] == false && (microtime(true) - $cfg['timer']) * 1000 > $cfg['update_refresh_time'] && $curFilesCounter / $filesCounter > $prevFilesCounter / $filesCounter + 0.005) { $prevFilesCounter = $curFilesCounter; mysql_query('update update_progress set file_info = "<div class=\'out\'><div class=\'in\' style=\'width:' . html(floor($curFilesCounter / $filesCounter * 200)) . 'px\'></div></div> ' . html(floor($curFilesCounter / $filesCounter * 100)) . '%"'); // echo '<script type="text/javascript"> document.getElementById(\'fileinfo\').innerHTML="<div class=\'out\'><div class=\'in\' style=\'width:' . $curFilesCounter/$filesCounter * 200 . 'px\'></div></div> ' . html(floor($curFilesCounter/$filesCounter * 100)) . '%";</script>' . "\n"; // @ob_flush(); // flush(); $cfg['timer'] = microtime(true); $updated = true; } if ($cfg['cli_update'] && $cfg['cli_silent_update'] == false) { echo $file . "\n"; } $ThisFileInfo = $getID3->analyze($file); getid3_lib::CopyTagsToComments($ThisFileInfo); //print $ThisFileInfo['id3v1']['genre']; $mime_type = isset($ThisFileInfo['mime_type']) ? $ThisFileInfo['mime_type'] : 'application/octet-stream'; $miliseconds = isset($ThisFileInfo['playtime_seconds']) ? round($ThisFileInfo['playtime_seconds'] * 1000) : 0; $audio_bitrate = 0; $audio_bits_per_sample = 0; $audio_sample_rate = 0; $audio_channels = 0; $audio_lossless = 0; $audio_compression_ratio = 0; $audio_dataformat = ''; $audio_encoder = ''; $audio_bitrate_mode = ''; $audio_profile = ''; $video_dataformat = ''; $video_codec = ''; $video_resolution_x = 0; $video_resolution_y = 0; $video_framerate = 0; $track_id = $track['album_id'] . '_' . fileId($file); $error = isset($ThisFileInfo['error']) ? implode('<br>', $ThisFileInfo['error']) : ''; if (isset($ThisFileInfo['comments']['albumartist'][0])) { $artist = $ThisFileInfo['comments']['albumartist'][0]; } elseif (isset($ThisFileInfo['comments']['band'][0])) { $artist = $ThisFileInfo['comments']['band'][0]; } else { $artist = 'Unknown AlbumArtist'; } //if (isset($ThisFileInfo['comments']['artist'][1])) // $track_artist = $ThisFileInfo['comments']['artist'][1]; if (isset($ThisFileInfo['comments']['artist'][0])) { $track_artist = $ThisFileInfo['comments']['artist'][0]; } else { $track_artist = 'Unknown TrackArtist'; } //if (isset($ThisFileInfo['comments']['title'][1])) // $title = $ThisFileInfo['comments']['title'][1]; if (isset($ThisFileInfo['comments']['title'][0])) { $title = $ThisFileInfo['comments']['title'][0]; } else { $title = 'Unknown Title'; } if (isset($ThisFileInfo['comments']['genre'][0])) { $genre = $ThisFileInfo['comments']['genre'][0]; } else { $genre = 'Unknown Genre'; } $a = array_values($ThisFileInfo['comments']['comment']); if (isset($a[0])) { $comment = $a[0]; } else { $comment = ''; } if (isset($ThisFileInfo['comments']['year'][0])) { $year = $ThisFileInfo['comments']['year'][0]; } elseif (isset($ThisFileInfo['comments']['date'][0])) { $year = $ThisFileInfo['comments']['date'][0]; } if (preg_match('#[1][9][0-9]{2}|[2][0-9]{3}#', $year, $match)) { $year = $match[0]; } if (isset($ThisFileInfo['comments']['dynamic range'][0])) { $dr = $ThisFileInfo['comments']['dynamic range'][0]; } elseif (isset($ThisFileInfo['tags']['id3v2']['text']['DYNAMIC RANGE'])) { $dr = $ThisFileInfo['tags']['id3v2']['text']['DYNAMIC RANGE']; } /* if (isset($ThisFileInfo['comments']['date'][0])) $year = $ThisFileInfo['comments']['date'][0]; elseif (isset($ThisFileInfo['comments']['year'][0])) $year = $ThisFileInfo['comments']['year'][0]; */ if (isset($ThisFileInfo['audio']['dataformat'])) { $audio_dataformat = $ThisFileInfo['audio']['dataformat']; $audio_encoder = isset($ThisFileInfo['audio']['encoder']) ? $ThisFileInfo['audio']['encoder'] : 'Unknown encoder'; if (isset($ThisFileInfo['mpc']['header']['profile'])) { $audio_profile = $ThisFileInfo['mpc']['header']['profile']; } if (isset($ThisFileInfo['aac']['header']['profile_text'])) { $audio_profile = $ThisFileInfo['aac']['header']['profile_text']; } if (empty($ThisFileInfo['audio']['lossless']) == false) { $audio_lossless = 1; if (empty($ThisFileInfo['audio']['compression_ratio']) == false) { if ($ThisFileInfo['audio']['compression_ratio'] == 1) { $audio_profile = 'Lossless'; } else { $audio_profile = 'Lossless compression'; } } else { $audio_profile = 'Lossless'; } } if (isset($ThisFileInfo['audio']['compression_ratio'])) { $audio_compression_ratio = $ThisFileInfo['audio']['compression_ratio']; } if (isset($ThisFileInfo['audio']['bitrate_mode'])) { $audio_bitrate_mode = $ThisFileInfo['audio']['bitrate_mode']; } if (isset($ThisFileInfo['audio']['bitrate'])) { $audio_bitrate = $ThisFileInfo['audio']['bitrate']; } if (!$audio_profile) { $audio_profile = $audio_bitrate_mode . ' ' . round($audio_bitrate / 1000, 1) . ' kbps'; } $audio_bits_per_sample = isset($ThisFileInfo['audio']['bits_per_sample']) ? $ThisFileInfo['audio']['bits_per_sample'] : 16; $audio_sample_rate = isset($ThisFileInfo['audio']['sample_rate']) ? $ThisFileInfo['audio']['sample_rate'] : 44100; $audio_channels = isset($ThisFileInfo['audio']['channels']) ? $ThisFileInfo['audio']['channels'] : 2; $audio_bitrate = round($audio_bitrate); // integer in database } if (isset($ThisFileInfo['video']['dataformat'])) { $video_dataformat = $ThisFileInfo['video']['dataformat']; $video_codec = isset($ThisFileInfo['video']['codec']) ? $ThisFileInfo['video']['codec'] : 'Unknown codec'; if (isset($ThisFileInfo['video']['resolution_x'])) { $video_resolution_x = $ThisFileInfo['video']['resolution_x']; } if (isset($ThisFileInfo['video']['resolution_y'])) { $video_resolution_y = $ThisFileInfo['video']['resolution_y']; } if (isset($ThisFileInfo['video']['frame_rate'])) { $video_framerate = $ThisFileInfo['video']['frame_rate'] . ' fps'; } } mysql_query('UPDATE track SET mime_type = "' . mysql_real_escape_string($mime_type) . '", filesize = ' . (int) $filesize . ', filemtime = ' . (int) $filemtime . ', miliseconds = ' . (int) $miliseconds . ', audio_bitrate = ' . (int) $audio_bitrate . ', audio_bits_per_sample = ' . (int) $audio_bits_per_sample . ', audio_sample_rate = ' . (int) $audio_sample_rate . ', audio_channels = ' . (int) $audio_channels . ', audio_lossless = ' . (int) $audio_lossless . ', audio_compression_ratio = ' . (double) $audio_compression_ratio . ', audio_dataformat = "' . mysql_real_escape_string($audio_dataformat) . '", audio_encoder = "' . mysql_real_escape_string($audio_encoder) . '", audio_profile = "' . mysql_real_escape_string($audio_profile) . '", video_dataformat = "' . mysql_real_escape_string($video_dataformat) . '", video_codec = "' . mysql_real_escape_string($video_codec) . '", video_resolution_x = ' . (int) $video_resolution_x . ', video_resolution_y = ' . (int) $video_resolution_y . ', video_framerate = ' . (int) $video_framerate . ', error = "' . mysql_real_escape_string($error) . '", track_id = "' . mysql_real_escape_string($track_id) . '", genre = "' . mysql_real_escape_string($genre) . '", title = "' . mysql_real_escape_string($title) . '", artist = "' . mysql_real_escape_string($track_artist) . '", comment = "' . mysql_real_escape_string($comment) . '", track_artist = "' . mysql_real_escape_string($track_artist) . '", year = ' . (is_null($year) ? 'NULL' : (int) $year) . ', dr = ' . (is_null($dr) ? 'NULL' : (int) $dr) . ' WHERE relative_file = BINARY "' . mysql_real_escape_string($track['relative_file']) . '"'); } if ($updated && (microtime(true) - $cfg['timer']) * 1000 > 500) { echo '<script type="text/javascript">document.getElementById(\'fileinfo\').innerHTML=\'<img src="' . $cfg['img'] . 'small_animated_progress.gif" alt="" class="small">\';</script>' . "\n"; @ob_flush(); flush(); $updated = false; } if ($cfg['name_source'] != 'tags') { $result = mysql_query('SELECT genre_id FROM genre WHERE genre="' . mysql_real_escape_string($genre) . '"'); if (mysql_num_rows($result) == 0) { mysql_query('INSERT INTO genre (genre_id, genre) VALUES ("' . mysql_real_escape_string($lastGenre_id) . '", "' . mysql_real_escape_string($genre) . '")'); $aGenre_id = $lastGenre_id; ++$lastGenre_id; } else { $row = mysql_fetch_assoc($result); $genre_id = $row["genre_id"]; } } } // Close getID3 unset($getID3); }
function updateSong($currentSong, $currentDirectory, $mtimeDirectory, $mtime, $time, $artist, $title, $track, $album, $date, $genre) { global $cfg, $db, $allAlbumIds, $allGenreIds; // phase if (isset($allAlbumIds[$cfg['media_dir'] . $currentDirectory]) === TRUE) { $album_id = $allAlbumIds[$cfg['media_dir'] . $currentDirectory]; } else { // create a new album_id $album_id = base_convert(uniqid(), 16, 36); $album_add_time = $mtimeDirectory; mysql_query("\n\t\t\tINSERT INTO album_id(\n\t\t\t\talbum_id,\n\t\t\t\tpath,\n\t\t\t\talbum_add_time,\n\t\t\t\tupdated\n\t\t\t) VALUES ('" . mysql_real_escape_string($album_id) . "','" . mysql_real_escape_string($cfg['media_dir'] . $currentDirectory) . "','" . $album_add_time . "',\n\t\t\t\t'1'\n\t\t\t)"); $allAlbumIds[$cfg['media_dir'] . $currentDirectory] = $album_id; // initial insert with album-tags based on (first) track # genre is currently '1(Unknown)' - it will be updated in on of the next import/update phases mysql_query("\n\t\t\tINSERT INTO album(\n\t\t\t\tartist,\n\t\t\t\tartist_alphabetic,\n\t\t\t\talbum,\n\t\t\t\tyear,\n\t\t\t\talbum_id,\n\t\t\t\talbum_add_time,\n\t\t\t\tgenre_id,\n\t\t\t\tdiscs,\n\t\t\t\tupdated\n\t\t\t) VALUES (\n\t\t\t\t'" . mysql_real_escape_string($artist) . "',\n\t\t\t\t'" . mysql_real_escape_string($artist) . "',\n\t\t\t\t'" . mysql_real_escape_string($album) . "',\n\t\t\t\t'" . mysql_real_escape_string($date) . "',\n\t\t\t\t'" . mysql_real_escape_string($album_id) . "',\n\t\t\t\t'" . (int) $album_add_time . "',\n\t\t\t\t'1',\n\t\t\t\t'1',\n\t\t\t\t'1'\n\t\t\t)"); } // TODO: assign multiple genres to track and album based on splitchars $genre = genreUnifier($genre); $genreAz09 = az09($genre); // get Genre id $genre_id = isset($allGenreIds[$genreAz09]) === TRUE ? $allGenreIds[$genreAz09] : insertGenre($genre); $allGenreIds[$genreAz09] = $genre_id; // check if we do already have a matching track $res = mysql_query('SELECT track_id FROM track WHERE album_id = "' . mysql_real_escape_string($album_id) . '" AND relative_file = BINARY "' . mysql_real_escape_string($currentDirectory . $currentSong) . '" LIMIT 1'); if (mysql_num_rows($res) == 0) { mysql_query(' INSERT INTO track ( artist, title, relative_file, relative_file_hash, number, album_id, updated, track_id, filemtime, genre, year, disc, miliseconds, track_artist ) VALUES ( "' . mysql_real_escape_string($artist) . '", "' . mysql_real_escape_string($title) . '", "' . mysql_real_escape_string($currentDirectory . $currentSong) . '", "' . pathhash($currentDirectory . $currentSong) . '", ' . (is_numeric($track) ? (int) $track : 'NULL') . ', "' . mysql_real_escape_string($album_id) . '", 1, \'' . $album_id . '_' . fileId($cfg['media_dir'] . $currentDirectory . $currentSong) . '\', ' . (int) $mtime . ', ' . (int) $genre_id . ', ' . (int) $date . ', 1, ' . $time * 1000 . ', \'' . mysql_real_escape_string($artist) . '\' )'); } else { $row = mysql_fetch_assoc($res); $track_id = $row["track_id"]; mysql_query('UPDATE track SET artist = "' . mysql_real_escape_string($artist) . '", title = "' . mysql_real_escape_string($title) . '", number = ' . (is_numeric($track) ? (int) $track : 'NULL') . ', album_id = "' . mysql_real_escape_string($album_id) . '", updated = 1 WHERE track_id = "' . mysql_real_escape_string($track_id) . '" LIMIT 1'); } }