Commit | Line | Data |
---|---|---|
ca88871f H |
1 | <?php require_once('./http_auth.php'); /*Delete this line to disable password protection*/ ?> |
2 | <?php /* | |
3 | Harvie's JuKe!Box | |
4 | /////////////////////////////////////////////////////////////////////// | |
5 | Version info: | |
6 | 0.2 - Few new functions (search playlist, random,...) | |
7 | 0.1.1 - Few little fixups, written help.html in Czech language ;D | |
8 | 0.1 - All functions works - TODO: bugfix & replace ugly code | |
9 | /////////////////////////////////////////////////////////////////////// | |
10 | */ | |
11 | ||
12 | //Config-basic | |
13 | $title = 'Harvie\'s JuKe!Box'; //Title of jukebox | |
14 | $music_dir = './music'; //Local path to directory with music | |
15 | $music_dir_url = 'http://192.168.2.163/pub/m3gen/music'; //URL path to same directory | |
16 | //$music_dir_url = 'http://music.harvie.cz/music'; | |
17 | //$music_dir_url = 'http://softz.harvie.cz/jukebox/demo/music'; | |
18 | $cache_passwd = 'reload'; //You need this passwd to refresh search cache | |
19 | $sort = 3; //Sort? 0 = none, 1 = playlists, 2 = 1+listings; 3 = 2+search-EXPERIMENTAL! (sorting could eat lot of memory) | |
20 | $access_limit = 20; //How many files could be accessed without using cache (while searching) | |
21 | ||
22 | //Playlist settings | |
23 | $playlist_name = 'playlist.m3u'; //Name of downloaded pl | |
24 | $m3u_exts = 'ogg|mp[0-9]|wma|wmv|wav'; //Allow only these files | |
25 | $default_random_count = 30; //How many random songs by defaul? | |
26 | ||
27 | //External files | |
28 | $indexlist = array('index.html', 'index.txt'); //Search for this file in each directory | |
29 | $bonus_dir = './jukebox-bonus'; //Misc. files directory | |
30 | $search_cache = $bonus_dir.'/cache.db'; //Database for searching music (php +rw) - .htaccess: Deny from all!!! | |
31 | $flash_player = $bonus_dir.'/musicplayer.swf'; //path to musicplayer | |
32 | $css_file = $bonus_dir.'/jukebox.css'; //CSS | |
33 | $header_file = $bonus_dir.'/header.html'; //header file | |
34 | $footer_file = $bonus_dir.'/footer.html'; //footer file | |
35 | ||
36 | //Security | |
37 | error_reporting(0); | |
38 | ||
39 | //Init | |
40 | srand(time()); | |
41 | $current_dir = ereg_replace('/+', '/', '/'.$_GET['dir'].'/'); | |
42 | $dir = $music_dir.$current_dir; | |
43 | $url = $music_dir_url.$current_dir; | |
44 | $parent_dir = dirname($current_dir); | |
45 | ||
46 | //FCs | |
47 | function serve_download($filename) { | |
48 | header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); | |
49 | header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past | |
50 | header('Pragma: no-cache'); | |
51 | ||
52 | //header('Content-Type: application/force-download'); | |
53 | header('Content-Type: audio/x-mpegurl'); | |
54 | header("Content-Disposition: attachment; filename={$filename}"); | |
55 | header('Content-Transfer-Encoding: binary'); | |
56 | ||
57 | header('X-PHP-Application: Harvie\'s JuKe!Box'); | |
58 | } | |
59 | ||
60 | function generate_m3u($dir, $prefix='', $recursive=0) { | |
61 | $dir = $dir . '/'; | |
62 | $dd = opendir($dir); | |
63 | while(($item = readdir($dd)) != false) { | |
64 | if($item == '.' || $item == '..') continue; | |
65 | if( is_file($dir.$item) && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item) ) { | |
66 | if($GLOBALS['sort'] > 0) { | |
67 | $temp[] = $item; | |
68 | } else { | |
69 | echo($prefix.'/'.str_replace('%2F', '/', (rawurlencode($dir.$item)))."\r\n"); | |
70 | } | |
71 | } | |
72 | if($recursive && is_dir($dir.$item)) { | |
73 | generate_m3u($dir.$item, $prefix); | |
74 | } | |
75 | } | |
76 | if($GLOBALS['sort'] > 0) { | |
77 | @sort($temp); | |
78 | foreach($temp as $item) | |
79 | echo($prefix.'/'.str_replace('%2F', '/', (rawurlencode($dir.$item)))."\r\n"); | |
80 | } | |
81 | } | |
82 | ||
83 | function write_search_cache($dir, $outfp) { | |
84 | $dir = $dir . '/'; | |
85 | $dd = opendir($dir); | |
86 | while($item = readdir($dd)) { | |
87 | if($item == '.' || $item == '..') continue; | |
88 | if( is_file($dir.$item) && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item) ) { | |
89 | fwrite($outfp, $dir.$item."\n"); | |
90 | } | |
91 | if(is_dir($dir.$item)) { | |
92 | write_search_cache($dir.$item, $outfp); | |
93 | } | |
94 | } | |
95 | } | |
96 | ||
97 | function generate_search_cache($dir, $outfile) { | |
98 | echo("Generating search cache. Please wait...<br />\n"); flush(); | |
99 | @chmod($outfile, 0755); //At least i tryed ;D | |
100 | if(!($outfp = fopen($outfile, 'w'))) | |
101 | die("Cannot write cache to $outfile<br />You probably haven't set the permissions properly!<br />\n"); | |
102 | write_search_cache($dir, $outfp); | |
103 | fclose($outfp); | |
104 | $osize = filesize($outfile); clearstatcache(); | |
105 | if($GLOBALS['sort'] > 2) { | |
106 | echo("Sorting search cache. Please wait...<br />\n"); flush(); | |
107 | ||
108 | $items = file($outfile); @sort($items); | |
109 | $total = ' ('.sizeof($items).' files)'; | |
110 | file_put_contents($outfile, @implode('', $items)); | |
111 | unset($items); | |
112 | if(abs(filesize($outfile)-$osize) > 2) | |
113 | die('ERROR! Please disable sorting of search cache ($sort < 3)<br />'."\nSorted only ". | |
114 | filesize($outfile).' of '.$osize.' bytes!!!\n'); | |
115 | } | |
116 | echo('Total: '.filesize($outfile).' of '.$osize.' bytes'.$total.' <a href="?">DONE!</a>'.'<br /><META http-equiv="refresh" content="2;URL=?">'."\n"); | |
117 | } | |
118 | ||
119 | function render_file_line($dir, $item, $dir_url, $index, $filesize, $parent = false) { | |
120 | $parclass=($index%2?"even":"odd"); $parcolor=($index%2?"lightblue":"white"); | |
121 | $temp=str_replace('&', '%26', dirname($dir_url)).'/'.str_replace('%2F', '/', (rawurlencode($dir.$item))); | |
122 | if(is_numeric($filesize)) $filesize = round($filesize/(1024*1024), 2); | |
123 | echo("<tr class=\"$parclass\" bgcolor=\"$parcolor\">".'<td>'.$index.'</td><td>'); | |
124 | echo('<a href="?download&song='.rawurlencode($temp).'">P</a>'); | |
125 | if($parent) { | |
126 | echo('/<a href="?dir='. | |
127 | substr(str_replace(array('&','%2F'), array('%26','/'), (rawurlencode(dirname($dir.$item)))), strlen($GLOBALS['music_dir'])). | |
128 | '">D</a>'); | |
129 | } | |
130 | if(is_file($GLOBALS['flash_player']) && eregi(('\.('.$GLOBALS['m3u_exts'].')$'), $item)) { | |
131 | /*echo('/<object type="application/x-shockwave-flash" width=17 height=17 data="'. | |
132 | $GLOBALS['flash_player'].'?song_url='.rawurlencode($temp).'"></object>');*/ | |
133 | echo('/<a href="'.$GLOBALS['flash_player'].'?autoplay=true&song_url='.rawurlencode($temp).'" target="playframe">F</a>/'. | |
134 | '<a href="about:blank" target="playframe">S</a>'); | |
135 | } | |
136 | echo(' </td><td><a href="'.$temp.'">'.str_replace('_', ' ', $item).'</a></td><td>'.$filesize." MiB </td></tr>\n"); | |
137 | } | |
138 | ||
139 | function unxss($string) { | |
140 | return str_replace( | |
141 | array('&', '"', '\'', '<', '>'), | |
142 | array('&', '"', ''', '<', '>'), | |
143 | $string); | |
144 | } | |
145 | ||
146 | //GET | |
147 | if(isset($_GET['download'])) serve_download($playlist_name); | |
148 | if(isset($_GET['song'])) die($_GET['song']."\r\n"); | |
149 | ||
150 | if($_POST['cache-refresh'] == $cache_passwd) { | |
151 | generate_search_cache($music_dir, $search_cache); | |
152 | die("\n"); | |
153 | } | |
154 | ||
155 | if(isset($_GET['playlist'])) { | |
156 | if(!isset($_GET['search'])) { | |
157 | generate_m3u($dir, dirname($music_dir_url), isset($_GET['recursive'])); | |
158 | } else { | |
159 | if(!($searchfp = fopen($search_cache, 'r'))) | |
160 | die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n"); | |
161 | while(!feof($searchfp)) { | |
162 | $line = trim(fgets($searchfp)); | |
163 | if(@eregi(str_replace(' ', '(.*)', $_GET['search']), $line)) | |
164 | echo(dirname($music_dir_url).'/'.str_replace('%2F', '/', (rawurlencode($line)))."\r\n"); | |
165 | } | |
166 | } | |
167 | die("\n"); | |
168 | } | |
169 | ||
170 | if(isset($_GET['random'])) { | |
171 | $flen = 0; | |
172 | if(!($searchfp = fopen($search_cache, 'r'))) | |
173 | die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n"); | |
174 | while(!feof($searchfp)) { fgets($searchfp); $flen++; } | |
175 | for($i=0; $i<$_GET['random']; $i++) { | |
176 | rewind($searchfp); | |
177 | for($j=0; $j<rand(0, $flen-1); $j++) fgets($searchfp); | |
178 | echo(dirname($music_dir_url).'/'.str_replace('%2F', '/', (rawurlencode(trim(fgets($searchfp)))))."\r\n"); | |
179 | } | |
180 | die("\n"); | |
181 | } | |
182 | ||
183 | ?> | |
184 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
185 | <link rel="stylesheet" type="text/css" href="<?=$css_file?>"> | |
186 | ||
187 | <div align="right" style="position: absolute; top: 0; right: 0;"> | |
188 | <iframe src="about:blank" name="playframe" width="0" height="0" style="border: none;"></iframe> | |
189 | < <a href="javascript: history.go(-1)">BACK</a> | <a href="?">HOME (<?=$music_dir?>)</a> | <a href="?help">ABOUT/HELP</a> | <a href="?logout">LOGOUT</a> | |
190 | </div> | |
191 | ||
192 | <?php | |
193 | if(isset($_GET['help'])) { | |
194 | ?><h1>About/Help</h1><?php | |
195 | readfile($bonus_dir.'/help.html'); | |
196 | die(); | |
197 | } | |
198 | ||
199 | if(!isset($_GET['search'])) { | |
200 | echo('<title>'.$title.': '.$dir.'</title>'); | |
201 | echo('<a href="?" style="color: black;"><h1>'.$title.'</h1></a><h2>Index of: '.$dir.'</h2>'); | |
202 | } else { | |
203 | echo('<title>'.$title.': '.unxss($_GET['search']).'</title>'); | |
204 | echo('<a href="?" style="color: black;"><h1>'.$title.'</h1></a><h2>Searching for: '.unxss($_GET['search']).'</h2>'); | |
205 | } | |
206 | ||
207 | ?> | |
208 | ||
209 | <div align="right"> | |
210 | <form action="?" method="GET" align="right" style="display: inline;"> | |
211 | <input type="hidden" name="download" value="" /> | |
212 | <input type="text" name="random" value="<?=$default_random_count?>" /> | |
213 | <input type="submit" value="random" title="Generate random music playlist..." /> | |
214 | </form> | |
215 | <form action="?" method="GET" align="right" style="display: inline;"> | |
216 | <input type="text" name="search" | |
217 | title="Search in music/google/lyrics/mp3/youtube; Hint: You can use regular expressions in search query..." | |
218 | value="<?=unxss($_GET['search'])?>" | |
219 | /> | |
220 | <input type="submit" value="search" title="Search in this JuKe!Box..." /> | |
221 | </form> | |
222 | </div><br /><?php | |
223 | ||
224 | if(isset($_GET['search'])) { | |
225 | ||
226 | ?><div align="right"> | |
227 | <form action="http://google.com/search" method="GET" align="right" style="display: inline;"> | |
228 | <input type="text" name="q" value="<?=unxss($_GET['search'])?>" /> | |
229 | <input type="submit" value="google" title="Search on Google..." /> | |
230 | </form> | |
231 | <form action="http://www.elyricsworld.com/search.php?phrase=marley" method="GET" align="right" style="display: inline;"> | |
232 | <input type="text" name="phrase" value="<?=unxss($_GET['search'])?>" /> | |
233 | <input type="submit" value="lyrics" title="Search for lyrics on internet..." /> | |
234 | </form> | |
235 | <form action="http://jyxo.cz/s" method="GET" align="right" style="display: inline;"> | |
236 | <input type="hidden" name="d" value="mm" /> | |
237 | <input type="text" name="q" value="<?=unxss($_GET['search'])?>" /> | |
238 | <input type="submit" value="jyxo multimedia" title="Search media on internet..." /> | |
239 | </form> | |
240 | <form action="http://youtube.com/results" method="GET" align="right" style="display: inline;"> | |
241 | <input type="text" name="search_query" value="<?=unxss($_GET['search'])?>" /> | |
242 | <input type="submit" value="youtube" title="Search on YOUTube..." /> | |
243 | </form> | |
244 | </div><br /> | |
245 | <div align="right"> | |
246 | <form action="?" method="POST" align="right"> | |
247 | <input type="password" name="cache-refresh" value="" title="Password for refreshing - good for avoiding DoS Attacks!!!" /> | |
248 | <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 !!!" /> | |
249 | </form> | |
250 | </div><?php | |
251 | echo('Search DB size: '.(filesize($search_cache)/1024)." kB<br />\n"); | |
252 | ||
253 | if(!($searchfp = fopen($search_cache, 'r'))) | |
254 | die("Cannot read cache from $outfile<br />Refresh cache or set permissions properly!<br />\n"); | |
255 | ||
256 | $i = 0; | |
257 | echo('<table border="1" width="100%">'); | |
258 | echo('<tr><td>S</td><td><a href="?download&playlist&search='.unxss($_GET['search']).'">P</a></td><td colspan="100%">Search: '.unxss($_GET['search']).'</td></tr>'); | |
259 | while(!feof($searchfp)) { | |
260 | $line = trim(fgets($searchfp)); | |
261 | $parclass=($i%2?"even":"odd"); $parcolor=($i%2?"lightblue":"white"); | |
262 | if(@eregi(str_replace(' ', '(.*)', $_GET['search']), $line)) { | |
263 | $i++; | |
264 | echo("<tr class=\"$parclass\" bgcolor=\"$parcolor\">"); | |
265 | $filesize = 0; if($i <= $access_limit) $filesize = filesize($line); else $filesize = 'n/a'; | |
266 | render_file_line('', $line, $music_dir_url, $i, $filesize, true); | |
267 | echo("</tr>\n"); | |
268 | } | |
269 | } | |
270 | echo("</table>Total: $i results...<br />"); | |
271 | die(); | |
272 | ||
273 | } | |
274 | @readfile($header_file); | |
275 | foreach($indexlist as $index) @readfile($dir.$index); | |
276 | ?> | |
277 | <br /> | |
278 | <table border="1" width="100%"> | |
279 | <tr><td>></td> | |
280 | <td><b><a href="?download&playlist&dir=<?=str_replace('%2F', '/', rawurlencode($current_dir))?>">P</a>/<a | |
281 | href="?download&recursive&playlist&dir=<?=str_replace('%2F', '/', rawurlencode($current_dir))?>">R</a></b></td> | |
282 | <td colspan="100%"><?=$dir?></td></tr> | |
283 | <tr><td>^</td><td> </td><td colspan="100%">[DIR] <a href="?dir=<?=rawurlencode($parent_dir)?>">.. (<?=$parent_dir?>)</a></td></tr> | |
284 | <?php | |
285 | ||
286 | $i = 0; | |
287 | $dd = opendir($dir); | |
288 | for($s=2;$s;$s--) { while(($item = readdir($dd)) != false) { | |
289 | if($item == '.' || $item == '..') continue; | |
290 | if(($s==2 && is_file($dir.$item)) || ($s!=2 && is_dir($dir.$item))) continue; | |
291 | $i++; | |
292 | $parclass=($i%2?"even":"odd"); $parcolor=($i%2?"lightblue":"white"); | |
293 | if(is_file($dir.$item)) { | |
294 | if($sort > 1) { | |
295 | $i--; | |
296 | $items[] = $item; | |
297 | } else { | |
298 | render_file_line($dir, $item, $music_dir_url, $i, filesize($dir.$item)); | |
299 | } | |
300 | } | |
301 | if(is_dir($dir.$item)) { | |
302 | $temp=str_replace('%2F', '/', rawurlencode($current_dir)).rawurlencode($item); | |
303 | echo("<tr class=\"$parclass\" bgcolor=\"$parcolor\">". | |
304 | '<td>'.$i.'</td><td><a href="?download&playlist&dir='.$temp.'">P</a>/'. | |
305 | '<a href="?download&recursive&playlist&dir='.$temp.'">R</a></td>'. | |
306 | '<td colspan="100%">[DIR] <a href="?dir='.$temp.'">'.str_replace('_', ' ', $item)."</a></td></tr>\n"); | |
307 | } | |
308 | } rewinddir($dd); } | |
309 | if($sort > 1) { | |
310 | @sort($items); | |
311 | foreach($items as $item) { | |
312 | $i++; | |
313 | render_file_line($dir, $item, $music_dir_url, $i, filesize($dir.$item)); | |
314 | } | |
315 | } | |
316 | ||
317 | ?></table> | |
318 | ||
319 | <?php | |
320 | $quotes = array( | |
321 | 'This is NOT advertisments. This is just good text to think about... Remove it if you want!', | |
322 | 'Downloading without sharing and other forms of leeching equals STEALING! ;P', | |
323 | 'Do NOT support Microsoft!!! Use Linux! ;D', | |
324 | 'Don\'t steal! Steal and share!!! ;P', | |
325 | 'Linux is not matter of price, it\'s matter of freedom!', | |
326 | 'This software brought to you by <a href="http://blog.Harvie.cz">Harvie</a> free of charge! Of course...', | |
327 | 'Don\'t be looser, use GNU/Linux! ;P', | |
328 | 'Make love and not war!', | |
329 | 'Take your chance! Prove yourself!', | |
330 | 'This software is free of charge. If you wan\'t to donate, please send some money to children in Africa/etc...' | |
331 | ); | |
332 | ||
333 | echo('<i>'.$quotes[rand(0,sizeof($quotes)-1)]."</i>\n"); | |
334 | @readfile($footer_file); |