Add support for view-only mode.
[patchfork.git] / player / config.php
CommitLineData
964dd0bc
JW
1<?php
2/*
3 Pitchfork Music Player Daemon Client
4 Copyright (C) 2007 Roger Bystrøm
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; version 2 of the License.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19 require_once("../inc/function_test.php");
20 function get_checkbox_from_config($name) {
21 $var = get_config($name);
22 if(!is_null($var)&&strlen($var)) {
23 return "checked='checked'";
24 }
25 return "";
26 }
27
28 function return_bytes($val) {
29 $val = trim($val);
30 $last = strtolower($val{strlen($val)-1});
31 switch($last) {
32 // The 'G' modifier is available since PHP 5.1.0
33 case 'g':
34 $val *= 1024;
35 case 'm':
36 $val *= 1024;
37 case 'k':
38 $val *= 1024;
39 }
40
41 return $val;
42 }
43
44
45 $title = "";
46 @ob_start();
f8fb3735 47 $need_rw = true;
964dd0bc
JW
48 require_once("../inc/base.php");
49 require_once("../lang/master.php");
3f2daf51 50 header("Content-Type: text/html; charset=UTF-8");
964dd0bc
JW
51?>
52<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
53<html>
54<head>
55<meta name="robots" content="noindex,nofollow" />
56<style type="text/css">
57 body {
58 font: 12.4px/160% sans-serif;
59 }
60 .main_container {
61 border: 1px solid #e2e2e2;
62 background-color: #f7f7f7;
63 padding-left: 8px;
64 padding-bottom: 10px;
65 }
66 .red-box {
67 border: 1px solid #a20000;
68 background-color: #ffcccc;
69 padding-left: 5px;
70 }
71 #pinfo {
72 border: 1px solid #877E6E;
73 background-color: #DEE7F7;
74 background: #f1f1f1;
75 padding: 0px 5px 0px 5px;
76 position: absolute;
77 top: 30px;
78 right: 20px;
79 }
80 select, input {
81 font-size: 0.90em;
82 line-height: 1em;
83 }
84</style>
85<script type='text/javascript'>
86 var showing = false;
87 function toggle_showing_plentries() {
88 var e = null;
89 var i =3;
90 showing = !showing;
91 while(e = document.getElementById('ple_' + i)) {
92 e.style.display = showing?"":"none";
93 i++;
94 }
95 var t = document.getElementById('plentry_show');
96 t.innerHTML = showing?"&nbsp;&nbsp;Hide nonstandard [~]":"&nbsp;&nbsp;Show nonstandard [+]";
97 }
98</script>
99<title><?php echo m("Pitchfork MPD Client Configuration"); ?></title>
100</head>
101<body>
102<?php
103 $new_config = $config?false:true;
104 if(!$config) {
105 $config = simplexml_load_string("<?xml version='1.0' ?>\n<root>\n</root>\n");
106 }
107 if(isset($_POST['submit'])) {
f8fb3735 108 $vars = array( 'mpd_host', 'mpd_port', 'mpd_pass', 'login_pass', 'ro_pass', 'update_delay',
f5c41499
JW
109 'metadata_disable', 'theme', 'stop_button', 'shout_url', 'pagination', 'lang',
110 'aws_keyid', 'aws_secret');
964dd0bc
JW
111 foreach ($vars as $var) {
112 $add = "";
113 if(isset($_POST[$var])&&trim($_POST[$var])!="")
114 $add = trim($_POST[$var]);
115
116 if($var=="pagination") {
117 if(!is_numeric($add))
118 $add = 0;
119 else $add = intval($add);
120 }
f8fb3735 121 else if(($var=="login_pass" || $var == "ro_pass") &&strlen($add)>0) {
964dd0bc
JW
122 if($add== HASH_PASS)
123 continue;
124 $add = generate_hash($add);
125 }
f5c41499
JW
126 else if ($var=='aws_secret') {
127 if ($add == HASH_PASS)
128 continue;
129 }
964dd0bc
JW
130
131
132 if(isset($config->$var)) {
133 $config->$var = $add;
134 }
135 else {
136 $config->addChild($var, $add);
137 }
138 }
139
140 $plentry = null;
141 if(isset($config->plentry))
142 $plentry = $config->plentry;
143 else
144 $plentry = $config->addChild("plentry");
145
146 foreach($pl_fields as $field) {
147 $val = isset($_POST['plentry_' . $field])?"yes":"";
148 $plentry->$field = $val;
149 }
150
151 // need to save config!
152 if($config->asXML("../config/config.xml")) {
153 header("Location: index.php");
154 echo "<p>If you're not redirected, go here: <a href='index.php'>player</a></p>";
155 exit();
156 }
157 else {
158 echo "<p class='error'>Could not save your configuration, check that config/config.xml is writeable</p>\n";
159 }
160 }
161
162 if(!is_writeable("../config")) {
163 echo "<p class='red-box'>";
164 echo m("Warning: Your config/ directory is not writeable! Please change owner of directory to apache user.");
165 echo "</p>\n";
166 }
167 @ob_end_flush();
168
169?>
170
171
172
173<div class='main_container' id='main_container'>
174
175<h1>Pitchfork configuration</h1>
176
177<?php if(isset($_GET['new_config']))
178 echo "<p>" . m("Let us take a minute to configure this player") . "</p>\n";
179 else echo "<p>" . m("Configure settings") . "</p>";
180?>
181<form action="config.php<?php echo $new_config?'?new_config':''; ?>" method="post">
182<h2><?php echo m("Connection-settings"); ?> </h2>
183<p><?php echo m("Where can I find your MPD-server?"); ?></p>
184<table>
185<tr><td><?php echo m("Hostname:"); ?> </td>
186<td><input type='text' value='<?php echo htmlspecialchars(get_config('mpd_host', 'localhost')) ?>' name='mpd_host' /></td></tr>
187<tr><td><?php echo m("Port:");?>
188</td><td><input type='text' value='<?php echo htmlspecialchars(get_config('mpd_port', '6600')) ?>' name='mpd_port' /></td></tr>
189<tr><td><?php echo m("Password:");?>
190</td><td><input type='password' value='<?php echo htmlspecialchars(get_config('mpd_pass', '')) ?>' name='mpd_pass' /></td></tr>
191
192</table>
193<h2><?php echo m("User interface");?></h2>
194<p><?php echo m("Some other settings!");?><br/></p>
195<table>
196<tr><td><?php echo m("Update time:"); ?>
197</td><td><input type='text' title='<?php echo m("How often we should request updates from the server");?>' value='<?php echo htmlspecialchars(get_config('update_delay', '1')) ?>' name='update_delay' /></td></tr>
198 <tr><td><?php echo m("Login password (optional):");?>
199 </td><td><input type='password' title='<?php echo m("If you want to require a password to see these pages you may specify it here");?>' value='<?php
200
201 $pass = get_config('login_pass', '');
202 if(substr($pass,0, 4)=="sha:") {
203 echo HASH_PASS;
204 }
205 else {
206 echo htmlspecialchars($pass);
207 }
208
209?>' name='login_pass' /></td></tr>
f8fb3735
JW
210 <tr><td><?php echo m("View-only password (optional):");?>
211 </td><td><input type='password' title='<?php echo m("If you want to allow users to view and listen, but not modify, specify a view-only password here");?>' value='<?php
212
213 $pass = get_config('ro_pass', '');
214 if(substr($pass,0, 4)=="sha:") {
215 echo HASH_PASS;
216 }
217 else {
218 echo htmlspecialchars($pass);
219 }
220
221?>' name='ro_pass' /></td></tr>
964dd0bc
JW
222<tr><td><?php echo m("Theme:");?> </td>
223<td>
224<select name='theme'>
225<?php
226$themes = get_available_themes();
227$ctheme = get_config("theme", "default");
228foreach($themes as $theme) {
0c1f6f50
JW
229 if ($theme == "mini")
230 continue;
964dd0bc
JW
231 echo "\n<option value='$theme' ";
232 if($theme==$ctheme)
233 echo "selected='selected' ";
234 echo ">$theme</option>";
235}
236
237?>
238</select>
239</td>
240</tr>
241<tr><td><?php echo m("Language:");?> </td><td>
242<select name="lang">
243<?php
244 // TODO: move
245 $languages = array("eu" => "Basque", "en" => "English", "fr" => "French", "de" => "German");
246 $clang = get_config("lang", "en");
247 foreach($languages as $l => $n) {
248 echo "\n<option value='$l'";
249 if($l==$clang)
250 echo " selected='selected' ";
251 echo ">$n</option>";
252 }
253?>
254</select>
255</td></tr>
256
257<tr><td><?php echo m("Include stop button:");?></td><td>
258<input type='checkbox' <?php if(!is_null(get_config("stop_button"))) echo "checked='checked'"; ?> name='stop_button' value='yesplease' />
259</td></tr>
260<tr><td><?php echo m("Pagination:");?></td><td><input name='pagination' type='text' value="<?php echo get_config("pagination", 0); ?>"
261title="<?php echo m("Maximum number of entries pr. page. Set to 0 to disable.");?>" size="5" /></td></tr>
262<tr><td>&nbsp; </td><td> </td></tr>
263<tr><td colspan="2"><?php echo m("Show these fields in the playlist:");?> </td></tr>
264<tr><td>&nbsp;</td><td><input type='checkbox' disabled='disabled' checked='checked' id='tnode_1' /> <label for='tnode_1'>
265<?php echo m("Position"); ?></label></td></tr>
266<?php
267
268$selected_fields = get_selected_plfields();
269$length = count($pl_fields);
270for($i=0; $i<$length;$i++) {
271 if($i==3) {
272 echo "<tr><td colspan='2' style='cursor: pointer;' id='plentry_show' onclick='toggle_showing_plentries();'>&nbsp;&nbsp;";
273 echo m("Show nonstandard") . " [+]</td></tr>";
274 }
275 echo "<tr id='ple_$i' ";
276 if($i>=3)
277 echo "style='display: none; ' ";
278 echo "><td>&nbsp;</td><td>";
279 echo "<input type='checkbox' ";
280 if($selected_fields[$i])
281 echo "checked='checked' ";
282 echo "name='plentry_".$pl_fields[$i]."' id='pl_i_$i' /> <label for='pl_i_$i'>".$pl_fields[$i]."</label></td></tr>\n";
283}
284
285?>
286<tr><td>&nbsp;</td><td><input type='checkbox' disabled='disabled' checked='checked' id='tnode_2' /> <label for='tnode_2'> Time</label></td></tr>
287</table>
288<h2>Metadata</h2>
f5c41499
JW
289<p><?php echo m("Configuration for retrieving metadata. This requires that the machine Patchfork is running on can access the internet. ".
290 "In order to use this feature, you must now have an Amazon AWS account; to get one, <a href=\"http://aws.amazon.com\">visit aws.amazon.com</a>. ".
291 "Then, get an <a href=\"https://aws-portal.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=access-key\">access key</a>, and fill in the details below."); ?></p>
964dd0bc
JW
292<table>
293<tr><td><?php echo m("Disable metadata:"); ?> </td><td><input type='checkbox' <?php echo get_checkbox_from_config('metadata_disable') ?> name='metadata_disable' /></td></tr>
f5c41499
JW
294<tr><td><?php echo m("Amazon Access Key ID:"); ?></td><td><input type='text' width='20' value='<?php echo htmlspecialchars(get_config('aws_keyid', '')) ?>' name='aws_keyid' /></td></tr>
295<tr><td><?php echo m("Amazon Secret Access Key:"); ?></td><td><input type='password' width='40' value='<?
296 $pass = get_config('aws_secret', '');
297 if(strlen($pass) != 0) {
298 echo HASH_PASS;
299 }
300 ?>' name='aws_secret' /></td></tr>
964dd0bc
JW
301</table>
302<h2><?php echo m("Shoutcast integration"); ?></h2>
303<p>
304<?php echo m("Optionally specify the URL to the shout stream provided by mpd to enable integration with pitchfork.");?> <br/>
305<input size="35" type='text' name='shout_url' value='<?php if(!is_null(get_config("shout_url"))) echo htmlspecialchars(get_config("shout_url")); ?>' />
306</p>
307<p style='padding: 12px 0px 12px 00px;'>
308<input name='cancel' type='button' value='Cancel' onclick='window.location = "index.php" ' />
309<input name='submit' type="submit" value="Save" />
310</p>
311</form>
312<?php if(!isset($_GET['new_config'])) { ?>
313<hr/>
314<p>
315For lyrics search to work in the directory browser file-names has to be saved with the lyrics, however when you move/delete files from your library this file reference become wrong. This button removes any references to such files.
316<br/>
317<span id='housecleaning_info'></span>
318<input type='button' value='Housecleaning' onclick='location.href="metadata.php?housecleaning"'/>
319</p>
320<?php }
321
322function print_yesno($test, $fatal) {
323 if($test) return "<span style='color: green;'>" . m("Yes") . "</span>";
324 else return "<span style='color: " . ($fatal?"red":"orange") . ";'>" . m("No") . "</span>";
325}
326
327// function_name:fatal (0/1)
328function test_function($stuff) {
329 $stuff = explode(":", $stuff);
330 $name = $stuff[0];
331 echo $name . ": ";
332 echo print_yesno(function_exists($name), $stuff[1]);
333 echo "<br/>\n";
334}
335
336?>
337
338<div id='pinfo'>
339<h2><?php echo m("Pitchfork info"); ?></h2>
340<p style='padding: 0px 0px 4px 0px;'>
341<?php
342 echo m("Release version:") . " $release_version<br/>\n";
343 echo m("Release date:") . " $release_date<br/><br/>\n";
344 $pl = get_playback();
345 $has_commands = true;
346 try {
347 if($pl) {
348 $commands = $pl->getCommands();
349 /* these are just some of the needed commands */
350 $needed = array("outputs", "disableoutput", "enableoutput", "plchangesposid");
351 $res = array_intersect($needed, $commands);
352 if(count($res)!=count($needed))
353 $has_commands = false;
354 $pl->disconnect();
355 }
356 }
357 catch(PEAR_Exception $e) {
358 $has_commands = false;
359 }
360
361 echo m("Connect to mpd:"). " ". print_yesno($pl, true) . "<br/>\n";
362 if($pl) {
363 echo m("MPD commands:")." " . print_yesno($has_commands, true) . "<br />\n";
364 }
365 echo m("Metadata directory:"). " " . print_yesno((file_exists($metadata_dir)&&is_writeable($metadata_dir))
366 ||(!file_exists($metadata_dir)&&is_writeable($config_dir)), true);
367?>
368</p>
369
370<h3><?php echo m("Functions:"); ?></h3>
371<p style='padding: 0px 0px 4px 0px; '>
372<?php
373 // name:fatal
374 foreach(array("json_encode:0", "simplexml_load_string:1", "mb_internal_encoding:0") as $f)
375 test_function($f);
376 echo "SimpleXMLaddChild: ";
377 $sxe = array_to_xml(array("test"));
378 if($sxe)
379 echo print_yesno(is_callable(array($sxe, "addChild"), true), true) . "<br/>";
380 else echo "<span class='color: red'>error</span>\n";
381 $mem = ceil(return_bytes(ini_get("memory_limit"))/(1024*1024));
382 echo m("PHP memory limit:") . " <span style='color: " . ($mem<32?"orange":"green") . "'>" . $mem . "MB</span>";
383
384?>
385</p>
386<?php
387 if(get_magic_quotes_runtime()) {
388 echo "<p style='color: orange'>";
389 echo m("Warning: Magic quotes runtime is on, <br/>please use pitchfork.conf or turn<br/> of manually.");
390 echo "</p>\n";
391 }
392 if(get_magic_quotes_gpc()) {
393 echo "<p style='color: orange'>";
394 echo m("Warning: Magic quotes gpc is on, <br/>please use pitchfork.conf or turn<br/> of manually.");
395 echo "</p>\n";
396 }
397
398?>
399</div>
400
401</div>
402
403</body>
404</html>
This page took 0.096186 seconds and 4 git commands to generate.