3 Pitchfork Music Player Daemon Client
4 Copyright (C) 2007 Roger Bystrøm
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.
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.
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.
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'";
28 function return_bytes($val) {
30 $last = strtolower($val{strlen($val)-1});
32 // The 'G' modifier is available since PHP 5.1.0
48 require_once("../inc/base.php");
49 require_once("../lang/master.php");
50 header("Content-Type: text/html; charset=UTF-8");
52 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
55 <meta name="robots" content="noindex,nofollow" />
56 <style type="text/css">
58 font: 12.4px/160% sans-serif;
61 border: 1px solid #e2e2e2;
62 background-color: #f7f7f7;
67 border: 1px solid #a20000;
68 background-color: #ffcccc;
72 border: 1px solid #877E6E;
73 background-color: #DEE7F7;
75 padding: 0px 5px 0px 5px;
85 <script type='text/javascript'>
87 function toggle_showing_plentries() {
91 while(e = document.getElementById('ple_' + i)) {
92 e.style.display = showing?"":"none";
95 var t = document.getElementById('plentry_show');
96 t.innerHTML = showing?" Hide nonstandard [~]":" Show nonstandard [+]";
99 <title><?php echo m("Pitchfork MPD Client Configuration"); ?></title>
103 $new_config = $config?false:true;
105 $config = simplexml_load_string("<?xml version='1.0' ?>\n<root>\n</root>\n");
107 if(isset($_POST['submit'])) {
108 $vars = array( 'mpd_host', 'mpd_port', 'mpd_pass', 'login_pass', 'ro_pass', 'update_delay',
109 'metadata_disable', 'theme', 'stop_button', 'shout_url', 'pagination', 'lang',
110 'aws_keyid', 'aws_secret');
111 foreach ($vars as $var) {
113 if(isset($_POST[$var])&&trim($_POST[$var])!="")
114 $add = trim($_POST[$var]);
116 if($var=="pagination") {
117 if(!is_numeric($add))
119 else $add = intval($add);
121 else if(($var=="login_pass" || $var == "ro_pass") &&strlen($add)>0) {
124 $add = generate_hash($add);
126 else if ($var=='aws_secret') {
127 if ($add == HASH_PASS)
132 if(isset($config->$var)) {
133 $config->$var = $add;
136 $config->addChild($var, $add);
141 if(isset($config->plentry))
142 $plentry = $config->plentry;
144 $plentry = $config->addChild("plentry");
146 foreach($pl_fields as $field) {
147 $val = isset($_POST['plentry_' . $field])?"yes":"";
148 $plentry->$field = $val;
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>";
158 echo "<p class='error'>Could not save your configuration, check that config/config.xml is writeable</p>\n";
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.");
173 <div class='main_container' id='main_container'>
175 <h1>Pitchfork configuration</h1>
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>";
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>
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>
193 <h2><?php echo m("User interface");?></h2>
194 <p><?php echo m("Some other settings!");?><br/></p>
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
201 $pass = get_config('login_pass', '');
202 if(substr($pass,0, 4)=="sha:") {
206 echo htmlspecialchars($pass);
209 ?>' name='login_pass' /></td></tr>
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
213 $pass = get_config('ro_pass', '');
214 if(substr($pass,0, 4)=="sha:") {
218 echo htmlspecialchars($pass);
221 ?>' name='ro_pass' /></td></tr>
222 <tr><td><?php echo m("Theme:");?> </td>
224 <select name='theme'>
226 $themes = get_available_themes();
227 $ctheme = get_config("theme", "default");
228 foreach($themes as $theme) {
229 if ($theme == "mini")
231 echo "\n<option value='$theme' ";
233 echo "selected='selected' ";
234 echo ">$theme</option>";
241 <tr><td><?php echo m("Language:");?> </td><td>
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'";
250 echo " selected='selected' ";
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' />
260 <tr><td><?php echo m("Pagination:");?></td><td><input name='pagination' type='text' value="<?php echo get_config("pagination", 0); ?>"
261 title="<?php echo m("Maximum number of entries pr. page. Set to 0 to disable.");?>" size="5" /></td></tr>
262 <tr><td> </td><td> </td></tr>
263 <tr><td colspan="2"><?php echo m("Show these fields in the playlist:");?> </td></tr>
264 <tr><td> </td><td><input type='checkbox' disabled='disabled' checked='checked' id='tnode_1' /> <label for='tnode_1'>
265 <?php echo m("Position"); ?></label></td></tr>
268 $selected_fields = get_selected_plfields();
269 $length = count($pl_fields);
270 for($i=0; $i<$length;$i++) {
272 echo "<tr><td colspan='2' style='cursor: pointer;' id='plentry_show' onclick='toggle_showing_plentries();'> ";
273 echo m("Show nonstandard") . " [+]</td></tr>";
275 echo "<tr id='ple_$i' ";
277 echo "style='display: none; ' ";
278 echo "><td> </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";
286 <tr><td> </td><td><input type='checkbox' disabled='disabled' checked='checked' id='tnode_2' /> <label for='tnode_2'> Time</label></td></tr>
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>
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>
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) {
300 ?>' name='aws_secret' /></td></tr>
302 <h2><?php echo m("Shoutcast integration"); ?></h2>
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")); ?>' />
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" />
312 <?php if(!isset($_GET['new_config'])) { ?>
315 For 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.
317 <span id='housecleaning_info'></span>
318 <input type='button' value='Housecleaning' onclick='location.href="metadata.php?housecleaning"'/>
322 function 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>";
327 // function_name:fatal (0/1)
328 function test_function($stuff) {
329 $stuff = explode(":", $stuff);
332 echo print_yesno(function_exists($name), $stuff[1]);
339 <h2><?php echo m("Pitchfork info"); ?></h2>
340 <p style='padding: 0px 0px 4px 0px;'>
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;
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;
357 catch(PEAR_Exception $e) {
358 $has_commands = false;
361 echo m("Connect to mpd:"). " ". print_yesno($pl, true) . "<br/>\n";
363 echo m("MPD commands:")." " . print_yesno($has_commands, true) . "<br />\n";
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);
370 <h3><?php echo m("Functions:"); ?></h3>
371 <p style='padding: 0px 0px 4px 0px; '>
374 foreach(array("json_encode:0", "simplexml_load_string:1", "mb_internal_encoding:0") as $f)
376 echo "SimpleXMLaddChild: ";
377 $sxe = array_to_xml(array("test"));
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>";
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.");
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.");