DJ mode improvement
[mirrors/JukeBox.git] / index.php
1 <?php require_once('./http_auth.php'); /*Delete this line to disable password protection*/ ?>
2 <?php $exec_time = round(microtime(true), 3); /*
3 Harvie's JuKe!Box (2oo7-2o1o)
4 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5 Version info:
6 * 0.3.6 - Now sorting also directories and have icon link support in css
7 * 0.3.5 - Fixed security bug - directory traversal in filelisting (upgrade recommended)
8 * 0.3.4 - Generating playlist for flashplayer, searching for bugs, cleaning code and preparing for new version release
9 * 0.3.3 - Shorter URLs for flashplayer (due to discussion at #skola ;o), nicer national characters handling
10 * 0.3.2 - Better support for national charsets, few small bugfixes, css improvements, modular search engines
11 * 0.3.1 - Buckfickses in m3u generation, better navigation, magic_quotes_gpc handled, css improvements
12 * 0.3 - Migrated to standalone WPAudioPlayer (better, nicer, with more functions)
13 * 0.2 - Few new functions (search playlist, random,...)
14 * 0.1.1 - Few little fixups, written help.html in Czech language ;o)
15 * 0.1 - All functions are working - TODO: bugfix & replace ugly code
16 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17 */
18
19 //Config-basic
20 $title = 'Harvie\'s&nbsp;JuKe!Box'; //Title of jukebox
21 $music_dir = './music'; //Local path to directory with music
22 $music_dir_url = 'http://your-server.net/jukebox/music'; //URL path to the same directory
23 $cache_passwd = 'renew123'; //You need this passwd to refresh search cache
24 $sort = 3; //Sort? 0 = none, 1 = playlists, 2 = 1+listings; 3 = 2+search-EXPERIMENTAL! (sorting could eat lot of memory)
25 $access_limit = 40; //How many files could be accessed without using cache (while searching)
26
27 //Encoding settins
28 $charset = 'UTF-8'; //Charset for page
29 $national_characters = 1; //Support searching in filenames with national characters? 0 = no; 1 = yes; (may slowdown search a little)
30
31 //Playlist settings
32 $playlist_name = 'playlist.m3u'; //Name of downloaded pl
33 $m3u_exts = 'ogg|mp[0-9]|wma|wmv|wav'; //Allow only these files
34 $default_random_count = 30; //How many random songs by defaul?
35
36 //External files
37 $indexlist = array('index.html', 'index.txt'); //Search for this file in each directory
38 $bonus_dir = './jbx'; //Misc. files directory
39 ////
40 $search_cache = $bonus_dir.'/cache.db'; //Database for searching music (php +rw) - .htaccess: Deny from all!!!
41 $css_file = $bonus_dir.'/themes/default/jukebox.css'; //CSS (Design)
42 $favicon_file = './favicon.png'; //favicon
43 $header_file = $bonus_dir.'/header.html'; //header file
44 $footer_file = $bonus_dir.'/footer.html'; //footer file
45
46 //Search engines extend search experience
47 $search_engines = array(
48 'Google.com' => 'http://google.com/search?q=',
49 'Images' => 'http://google.com/images?q=',
50 'Karaoke-Lyrics.net' => 'http://www.karaoke-lyrics.net/index.php?page=find&q=',
51 'Jyxo.cz multimedia' => 'http://jyxo.cz/s?d=mm&q=',
52 'Centrum.cz mp3' => 'http://search.centrum.cz/index.php?sec=mp3&q=',
53 'YOUTube.com' => 'http://youtube.com/results?search_query='
54 );
55
56 //Flash MusicPlayer (info about settings: http://wpaudioplayer.com/standalone)
57 $flash_player_swf = $bonus_dir.'/player.swf'; //path to musicplayer
58 $flash_player_frame = 'playframe-show'; //FlashPlayer Target (playframe-show|playframe-hide) - usefull for compatibility with old music player
59 $flash_player_options = '?bg=000099&loader=000000&tracker=AAAAFF&skip=FFFFFF' //.'&leftbg=000077&rightbg=000077&righticon=999999'
60 .'&autostart=yes&initialvolume=100&soundFile='; //& arguments (urlencoded song url will be added)
61
62 //Security
63 error_reporting(0); //This will disable error reporting, wich can pass sensitive data to users
64
65 //External configuration file (overrides index.php configuration)
66 @include('./_config.php');
67
68 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
69
70 //Init
71 srand(time());
72 @ini_set('magic_quotes_gpc' , 'off');
73 if(get_magic_quotes_gpc()) die("Error: magic_quotes_gpc needs to be disabled!\n");
74
75 //Enable flash?
76 $useflash = is_file($flash_player_swf);
77
78 //Little magic with directories ;o)
79 $current_dir = ereg_replace('/+', '/', '/'.$_GET['dir'].'/');
80 if(eregi('(/|\\\\)\\.\\.(/|\\\\)', $current_dir)) { //check for directory traversal ;)
81 header('Location: ?');
82 die('Error - directory not found!');
83 }
84 $dir = $music_dir.$current_dir;
85 $url = $music_dir_url.$current_dir;
86 $parent_dir = dirname($current_dir);
87
88 //FCs
89 function serve_download($filename) {
90 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
91 header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
92 header('Pragma: no-cache');
93
94 //header('Content-Type: application/force-download');
95 header('Content-Type: audio/x-mpegurl');
96 header("Content-Disposition: attachment; filename={$filename}");
97 header('Content-Transfer-Encoding: binary');
98
99 header('X-PHP-Application: Harvie\'s JuKe!Box');
100 }
101
102 $nchars_f = array('Á','Ä','Č','Ç','Ď','É','Ě','Ë','Í','Ň','Ó','Ö','Ř','Š','Ť','Ú','Ů','Ü','Ý','Ž','á','ä','č','ç','ď','é','ě','ë','í','ň','ó','ö','ř','š','ť','ú','ů','ü','ý','ž');
103 $nchars_t = array('A','A','C','C','D','E','E','E','I','N','O','O','R','S','T','U','U','U','Y','Z','a','a','c','c','d','e','e','e','i','n','o','o','r','s','t','u','u','u','y','z');
104
105 function unational($text) {
106 if(!$GLOBALS['national_characters']) return $text;
107 return(str_replace($GLOBALS['nchars_f'], $GLOBALS['nchars_t'], $text));
108 }
109
110 function generate_m3u($dir, $prefix='', $recursive=0, $nl="\r\n", $doubleenc=0) {
111 $dir = $dir . '/';
112 if(isset($_GET['newline'])) $nl = $_GET['newline'];
113 if(!isset($_GET['search'])) {
114 $dd = opendir($dir);
115 while(($item = readdir($dd)) != false) {
116 if($item == '.' || $item == '..') continue;
117 if( is_file($dir.$item) && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item) ) {
118 if($GLOBALS['sort'] > 0) {
119 $temp[] = $item;
120 } else {
121 $item=($prefix.'/'.str_replace('%2F', '/', (rawurlencode($dir.$item))).$nl);
122 if($doubleenc) $item = rawurlencode($item);
123 echo($item);
124 }
125 }
126 if($recursive && is_dir($dir.$item)) {
127 generate_m3u($dir.$item, $prefix, $recursive, $nl, $doubleenc);
128 }
129 }
130 } else {
131 if(!($searchfp = fopen($GLOBALS['search_cache'], 'r')))
132 die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n");
133 while(!feof($searchfp)) {
134 $line = trim(fgets($searchfp));
135 if(@eregi(str_replace(' ', '(.*)', unational($_GET['search'])), unational($line))) {
136 $line=(dirname($GLOBALS['music_dir_url']).'/'.str_replace('%2F', '/', (rawurlencode($line))).$nl);
137 if($doubleenc) $line = rawurlencode($line);
138 echo($line);
139 }
140 }
141 }
142
143 if($GLOBALS['sort'] > 0) {
144 @sort($temp);
145 foreach($temp as $item) {
146 $temp=($prefix.'/'.str_replace('%2F', '/', (rawurlencode($dir.$item))).$nl);
147 if($doubleenc) $temp = rawurlencode($temp);
148 echo($temp);
149 }
150 }
151 }
152
153 function write_search_cache($dir, $outfp) {
154 $dir = $dir . '/';
155 $dd = opendir($dir);
156 while($item = readdir($dd)) {
157 if($item == '.' || $item == '..') continue;
158 if( is_file($dir.$item) && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item) ) {
159 fwrite($outfp, $dir.$item."\n");
160 }
161 if(is_dir($dir.$item)) {
162 write_search_cache($dir.$item, $outfp);
163 }
164 }
165 }
166
167 function generate_search_cache($dir, $outfile) {
168 echo("Generating search cache. Please wait...<br />\n"); flush();
169 @chmod($outfile, 0755); //At least i tryed ;D
170 if(!($outfp = fopen($outfile, 'w')))
171 die("Cannot write cache to $outfile<br />You probably haven't set the permissions properly!<br />\n");
172 write_search_cache($dir, $outfp);
173 fclose($outfp);
174 $osize = filesize($outfile); clearstatcache();
175 if($GLOBALS['sort'] > 2) {
176 echo("Sorting search cache. Please wait...<br />\n"); flush();
177
178 $items = file($outfile); @sort($items);
179 $total = ' ('.sizeof($items).' files)';
180 file_put_contents($outfile, @implode('', $items));
181 unset($items);
182 if(abs(filesize($outfile)-$osize) > 2)
183 die('ERROR! Please disable sorting of search cache ($sort < 3)<br />'."\nSorted only ".
184 filesize($outfile).' of '.$osize.' bytes!!!\n');
185 }
186 echo('Total: '.filesize($outfile).' of '.$osize.' bytes'.$total.' <a href="?">DONE!</a>'.'<br /><META http-equiv="refresh" content="2;URL=?">'."\n");
187 }
188
189 function render_file_line($dir, $item, $dir_url, $index, $filesize, $parent = false) {
190 $parclass=($index%2?'even':'odd'); $parcolor=($index%2?'lightblue':'white');
191 $temp=str_replace('&', '%26', dirname($dir_url)).'/'.str_replace('%2F', '/', (rawurlencode($dir.$item)));
192 if(is_numeric($filesize)) $filesize = round($filesize/(1024*1024), 2);
193 echo("<tr class=\"$parclass\" bgcolor=\"$parcolor\">".'<td><a href="#up">'.$index.'</a></td><td class="btntd">');
194 echo('<a href="?download&song='.rawurlencode($temp).'" class="icon iplay">P</a>');
195 if($parent) {
196 echo('/<a href="?dir='.
197 substr(str_replace(array('&','%2F'), array('%26','/'), (rawurlencode(dirname($dir.$item)))), strlen($GLOBALS['music_dir'])).
198 '" class="icon ifolder">D</a>');
199 }
200 if($GLOBALS['useflash'] && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item)) {
201 echo('/<a href="?f&song='.rawurlencode($temp).
202 '" target="'.$GLOBALS['flash_player_frame'].'" class="icon ifplay">F</a>/'.
203 '<a href="?blank" target="'.$GLOBALS['flash_player_frame'].'" class="icon ifstop">S</a>');
204 }
205 echo('&nbsp;</td><td class="maximize-width"><a href="'.$temp.'">'.unxss(str_replace('-',' - ',str_replace('_', ' ',
206 $item))).'</a></td><td>'.$filesize."&nbsp;MiB&nbsp;</td></tr>\n");
207 }
208
209 function render_dir_line($current_dir, $item, $i) {
210 $parclass=($i%2?'even':'odd'); $parcolor=($i%2?'lightblue':'white');
211 $temp=str_replace('%2F', '/', rawurlencode($current_dir)).rawurlencode($item);
212 echo("<tr class=\"$parclass directory\" bgcolor=\"$parcolor\">".
213 '<td><a href="#up">'.$i.'</a></td><td class="btntd"><a href="?download&playlist&dir='.$temp.'" class="icon iplay">P</a>/'.
214 '<a href="?download&recursive&playlist&dir='.$temp.'" class="icon irplay">R</a>');
215 if($GLOBALS['useflash']) echo('/<a href="?f&playlist&dir='.$temp.'" target="'.$GLOBALS['flash_player_frame'].'" class="icon ifplay">F</a>');
216 echo('</td><td colspan="100%" class="maximize-width"><span class="icon ifolder">[DIR] </span><a href="?dir='.$temp.'">'.unxss(str_replace('_', ' ', $item)).
217 "</a></td></tr>\n");
218 }
219
220 function render_tr_playframe_show() {
221 if($GLOBALS['flash_player_frame'] == 'playframe-show' && $GLOBALS['useflash']) { ?>
222 <tr id="playframe-tr">
223 <td><a href="?blank" target="playframe-show" title="Stop playback" class="icon ifstop">S</a></td>
224 <td colspan="100%">
225 <iframe
226 src="?blank"
227 name="playframe-show"
228 width="100%"
229 height="24"
230 style="border:none;"
231 transparentpagebg="yes"
232 ></iframe></td></tr>
233 <?php }
234 }
235
236 function render_footer() {
237 $quotes = array(
238 'This is NOT advertisments. This is just good text to think about... Remove it if you want!',
239 'Downloading without sharing and other forms of leeching equals STEALING! ;P',
240 'Do NOT support Microsoft!!! Use Linux! ;D',
241 'Don\'t steal! Steal and share!!! ;P',
242 'Linux is not matter of price, it\'s matter of freedom!',
243 'This software brought to you by <a href="http://blog.Harvie.cz">Harvie</a> free of charge! Of course...',
244 'Don\'t be looser, use GNU/Linux! ;P',
245 'Make love and not war!',
246 'Take your chance! Prove yourself!',
247 'This software is free of charge. If you wan\'t to donate, please send some money to children in Africa/etc...',
248 'Fork <a href="http://github.com/harvie/jukebox">'.$GLOBALS['title'].'</a> on GIThub :-)<a href="http://github.com/harvie/jukebox"><img style="position: absolute; top: 0; left: 0; border: 0; height:120px; background-color:transparent;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_red_aa0000.png" alt="Fork me on GitHub" /></a>'
249 );
250
251 echo('<span id="quote" style="float: left;"><i><small>'.$quotes[rand(0,sizeof($quotes)-1)]."</small></i></span>\n");
252 echo('<span id="exectime" style="float: right;"><small>Page was generated in '.(round(microtime(true), 3) - $GLOBALS['exec_time']).'
253 seconds</small></span>');
254 @readfile($GLOBALS['footer_file']);
255 echo('</body></html>');
256 }
257
258 function unxss($string) {
259 return htmlspecialchars($string);
260 }
261
262 function explode_path($dir) {
263 $dir = substr($dir, strlen($GLOBALS['music_dir'])+1);
264 $temp = split('/', ereg_replace('/+', '/', $dir));
265 $out = '';
266 for($j=sizeof($temp)-1;$j>0;$j--) {
267 $dir = '';
268 for($i=0;$i<(sizeof($temp)-$j);$i++) {
269 $dir.=$temp[$i].'/';
270 }
271 $out.='<a href="?dir='.rawurlencode($dir).'">'.unxss($temp[$i-1]).'</a>/';
272 }
273 return('<a href="?">.</a>/'.$out);
274 }
275
276 function flash_mp3_player() {
277 ?>
278 <html><head><title><?=$GLOBALS['title']?>: Flash Music Player Plugin</title>
279 <style> * { margin: 0; padding: 0; border: 0; } </style></head><body>
280 <object width="100%" height="344">
281 <embed src="<?php
282 echo($GLOBALS['flash_player_swf'].$GLOBALS['flash_player_options']);
283 if(isset($_GET['song'])) echo(rawurlencode($_GET['song']));
284 if(isset($_GET['playlist'])) generate_m3u($GLOBALS['dir'], dirname($GLOBALS['music_dir_url']), isset($_GET['recursive']), ',', true);
285 ?>"
286 type="application/x-shockwave-flash"
287 allowscriptaccess="never"
288 allowfullscreen="true"
289 transparentpagebg="yes"
290 quality="low"
291 width="100%" height="24px"
292 >You need Adobe Flash enabled browser to play records directly in website.</embed>
293 </object></body></html>
294 <?php die();
295 }
296
297 //GET
298 if(isset($_GET['dj'])) { ?><title><?php echo "DJ MODE @ $title"; ?></title><frameset cols="*,*"><frame name="dj-left" src="./"><frame name="dj-right" src="./"></frameset><?php die(); }
299 if(isset($_GET['download'])) serve_download($playlist_name);
300 if(isset($_GET['f'])) flash_mp3_player();
301 if(isset($_GET['song'])) {
302 die($_GET['song']."\r\n");
303 }
304
305
306
307 if($_POST['cache-refresh'] == $cache_passwd) {
308 generate_search_cache($music_dir, $search_cache);
309 die("\n");
310 }
311
312 if(isset($_GET['playlist'])) {
313 generate_m3u($dir, dirname($music_dir_url), isset($_GET['recursive']));
314 die();
315 }
316
317 if(isset($_GET['random'])) {
318 $flen = 0;
319 if(!($searchfp = fopen($search_cache, 'r')))
320 die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n");
321 while(!feof($searchfp)) { fgets($searchfp); $flen++; }
322 for($i=0; $i<$_GET['random']; $i++) {
323 rewind($searchfp);
324 for($j=0; $j<rand(0, $flen-1); $j++) fgets($searchfp);
325 echo(dirname($music_dir_url).'/'.str_replace('%2F', '/', (rawurlencode(trim(fgets($searchfp)))))."\r\n");
326 }
327 die();
328 }
329
330 if(isset($_GET['blank'])) {
331 ?>
332 <link rel="stylesheet" type="text/css" href="<?=$css_file?>" />
333 <body class="blank"><div class="blank"><b>Music player</b> <small><i>(click 'F' link next to the song name to start, 'S' to stop...)</i></small></div></body>
334 <?php die();
335 }
336
337 ?>
338 <!DOCTYPE html>
339 <meta http-equiv="Content-Type" content="text/html; charset=<?=$charset?>" />
340 <html>
341 <head>
342 <meta charset="<?=$charset?>" />
343 <link rel="stylesheet" type="text/css" href="<?=$css_file?>" />
344 <link rel="shortcut icon" href="<?=$favicon_file?>" />
345 <link href="<?=$favicon_file?>" rel="icon" type="image/gif" />
346 </head>
347 <body>
348
349 <div align="right" style="position: absolute; top: 5px; right: 5px;">
350 <a name="up"></a>
351 <iframe src="about:blank" name="playframe-hide" width="0" height="0" style="border: none;" class="hide"></iframe><!-- -----------???--------------- -->
352 <span class="icon">&lt;</span> <a href="javascript: history.go(-1)" class="icon iback">BACK</a>
353 | <a href="?" target="_parent" class="icon ihome">HOME&nbsp;(<?=$music_dir?>)</a>
354 | <a href="?dj" class="icon idjmode">DJ</a>
355 | <a href="?help" class="icon ihelp">ABOUT/HELP</a>
356 | <a href="?logout" class="icon ilogout">LOGOUT</a>
357 </div>
358
359 <?php
360 if(isset($_GET['help'])) {
361 ?><h1>About/Help</h1><?php
362 readfile($bonus_dir.'/help.html');
363 die();
364 }
365
366
367 if(!isset($_GET['search'])) {
368 echo('<title>'.$title.': '.unxss($dir).'</title>');
369 echo('<a href="?" style="color: black;"><h1 style="float: left;">'.$title.'</h1></a><h2 style="clear: left; display: inline; float: left;">Index of: '.explode_path($dir).'</h2>');
370 } else {
371 echo('<title>'.$title.': '.unxss($_GET['search']).'</title>');
372 echo('<a href="?" style="color: black;"><h1 style="float: left;">'.$title.'</h1></a><h2 style="clear: left; display: inline; float: left;">Searching for: '.unxss($_GET['search']).'</h2>');
373
374 ?>
375
376 <?php
377 }
378
379 ?>
380 <span style="float: right;">
381 <form action="?" method="GET" align="right" style="display: inline;">
382 <input type="hidden" name="download" value="" />
383 <input type="number" min="1" name="random" value="<?=$default_random_count?>" style="width:4em;" title="how many randomly selected tracks should be in
384 playlist?"
385 />
386 <input type="submit" value="random" title="Generate random music playlist..." />
387 </form>
388 <form action="?" method="GET" align="right" style="display: inline;">
389 <span class="icon isearch"></span><input type="search" name="search" autofocus placeholder="search regexp..."
390 title="Search in music/google/lyrics/mp3/youtube; Hint: You can use regular expressions in search query..."
391 value="<?=unxss($_GET['search'])?>"
392 />
393 <input type="submit" value="search" title="Search in this JuKe!Box..." />
394 </form>
395 </span><?php
396
397 if(!isset($_GET['search'])) {
398 echo('<br style="clear: both;" />');
399 } else {
400
401 ?>
402 <span style="float: right;">
403 <form action="?" method="POST" align="right">
404 <input type="password" name="cache-refresh" value="" style="width:5em;" title="Password for refreshing - good for avoiding DoS Attacks!!!" />
405 <input type="submit" value="refresh cache" title="You should refresh cache each time when you add new music or upgrade to newer version of JuKe!Box !!!" />
406 &nbsp;
407 </form>
408 </span>
409 <div align="right" style="clear: right;" title="Aditional search engines...">
410 <br />
411 <?php
412 $search_prefix = 0;
413 foreach($search_engines as $search_desc => $search_link) {
414 if(!$search_prefix) {
415 echo(unxss($_GET['search'])." @\n");
416 $search_prefix = 1;
417 }
418 echo('<a href="'.$search_link.rawurlencode($_GET['search']).'">'.$search_desc."</a>;\n");
419 }
420 ?>
421 </div><br style="clear: both;" />
422 <?php
423 echo('<small>Search DB size: '.(filesize($search_cache)/1024)." kB<br /></small>\n");
424
425 if(!($searchfp = fopen($search_cache, 'r')))
426 die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n");
427
428 $i = 0;
429 echo('<table border="1" width="100%">');
430 render_tr_playframe_show();
431 echo('<tr class="directory"><td>S</td><td><a href="?download&playlist&search='.unxss($_GET['search']).'" class="icon iplay">P</a>');
432 if($GLOBALS['useflash']) echo('/<a href="?f&playlist&search='.unxss($_GET['search']).'" target="'.$GLOBALS['flash_player_frame'].'" class="icon ifplay">F</a>');
433 echo('</td><td colspan="100%">Search: '.unxss($_GET['search']).'</td></tr>');
434
435 while(!feof($searchfp)) {
436 $line = trim(fgets($searchfp));
437 $parclass=($i%2?'even':'odd'); $parcolor=($i%2?'lightblue':'white');
438 if(@eregi(str_replace(' ', '(.*)', unational($_GET['search'])), unational($line))) {
439 $i++;
440 $filesize = 0; if($i <= $access_limit) $filesize = filesize($line); else $filesize = 'n/a';
441 render_file_line('', $line, $music_dir_url, $i, $filesize, true);
442 }
443 }
444 echo('<tr><td colspan="100%">Total: '.$i.' results...</td></tr></table>');
445 render_footer(); die();
446
447 }
448 @readfile($header_file);
449 foreach($indexlist as $index) @readfile($dir.$index);
450 ?>
451 <br />
452 <table border="1" width="100%">
453 <?php render_tr_playframe_show(); ?>
454
455 <tr class="directory"><td>&gt;</td>
456 <td><a href="?download&playlist&dir=<?=str_replace('%2F', '/', rawurlencode($current_dir))?>" class="icon iplay">P</a>/<a
457 href="?download&recursive&playlist&dir=<?=str_replace('%2F', '/', rawurlencode($current_dir))?>" class="icon irplay">R</a><?php
458 if($GLOBALS['useflash']) echo('/<a href="?f&playlist&dir='.str_replace('%2F', '/', rawurlencode($current_dir)).'" target="'.$GLOBALS['flash_player_frame'].'"
459 class="icon ifplay">F</a>'); ?>
460 </td>
461 <td colspan="100%"><?=unxss($dir)?></td></tr>
462 <tr><td>^</td><td>&nbsp;</td><td colspan="100%" class="directory"><span class="icon ifolder">[DIR] </span><a href="?dir=<?=rawurlencode($parent_dir)?>">..
463 (<?=$parent_dir?>)</a></td></tr>
464 <?php
465
466 $i = 0;
467 $dd = opendir($dir);
468 for($s=2;$s;$s--) { while(($item = readdir($dd)) != false) {
469 if($item == '.' || $item == '..') continue;
470 if(($s==2 && is_file($dir.$item)) || ($s!=2 && is_dir($dir.$item))) continue;
471 $i++;
472 //$parclass=($i%2?'even':'odd'); $parcolor=($i%2?'lightblue':'white');
473 if($sort > 1) {
474 if(is_file($dir.$item)) {
475 $i--;
476 $itemsf[] = $item;
477 }
478 if(is_dir($dir.$item)) {
479 $i--;
480 $itemsd[] = $item;
481 }
482 } else {
483 if(is_file($dir.$item)) {
484 render_file_line($dir, $item, $music_dir_url, $i, filesize($dir.$item));
485 }
486 if(is_dir($dir.$item)) {
487 render_dir_line($current_dir, $item, $i);
488 }
489 }
490 } rewinddir($dd); }
491
492 if($sort > 1) {
493 @sort($itemsf);
494 @sort($itemsd);
495 foreach($itemsd as $item) {
496 $i++;
497 render_dir_line($current_dir, $item, $i);
498 }
499 foreach($itemsf as $item) {
500 $i++;
501 render_file_line($dir, $item, $music_dir_url, $i, filesize($dir.$item));
502 }
503 }
504
505 ?></table>
506
507 <?php
508 render_footer();
This page took 1.973269 seconds and 4 git commands to generate.