summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--admin/modules.php34
-rwxr-xr-xdocs/CHANGELOG3
-rw-r--r--lib/class/localplay.class.php96
-rw-r--r--lib/class/scrobbler.class.php4
-rw-r--r--lib/class/stream.class.php4
-rw-r--r--localplay.php19
-rw-r--r--modules/localplay/mpd.controller.php80
-rw-r--r--play/index.php8
-rw-r--r--server/localplay.ajax.php4
-rw-r--r--templates/show_localplay_add_instance.inc.php16
-rw-r--r--templates/show_localplay_controllers.inc.php4
-rw-r--r--templates/sidebar_localplay.inc.php14
-rw-r--r--templates/sidebar_preferences.inc.php1
13 files changed, 157 insertions, 130 deletions
diff --git a/admin/modules.php b/admin/modules.php
index d5eb3db9..42f82ef5 100644
--- a/admin/modules.php
+++ b/admin/modules.php
@@ -32,32 +32,16 @@ if (!$GLOBALS['user']->has_access(100)) {
show_header();
switch ($_REQUEST['action']) {
- case 'insert_localplay_preferences':
- $type = scrub_in($_REQUEST['type']);
- insert_localplay_preferences($type);
- $url = conf('web_path') . '/admin/preferences.php?tab=modules';
- $title = _('Module Activated');
- $body = '';
- show_confirmation($title,$body,$url);
- break;
- case 'confirm_remove_localplay_preferences':
- $type = scrub_in($_REQUEST['type']);
- $url = conf('web_path') . '/admin/modules.php?action=remove_localplay_preferences&type=' . $type;
- $title = _('Are you sure you want to remove this module?');
- $body = '';
- show_confirmation($title,$body,$url,1);
- break;
- case 'remove_localplay_preferences':
- $type = scrub_in($_REQUEST['type']);
- remove_localplay_preferences($type);
- $url = conf('web_path') . '/admin/preferences.php?tab=modules';
- $title = _('Module Deactivated');
- $body = '';
- show_confirmation($title,$body,$url);
- break;
case 'install_localplay':
-
-
+ $localplay = new Localplay($_REQUEST['type']);
+ if (!$localplay->player_loaded()) {
+ Error::add('general',_('Install Failed, Controller Error'));
+ Error::display('general');
+ break;
+ }
+ // Install it!
+ $localplay->install();
+ header("Location:" . Config::get('web_path') . '/admin/modules.php?action=show_localplay');
break;
case 'confirm_uninstall_localplay':
diff --git a/docs/CHANGELOG b/docs/CHANGELOG
index 8c2661a9..bca60006 100755
--- a/docs/CHANGELOG
+++ b/docs/CHANGELOG
@@ -4,6 +4,9 @@
--------------------------------------------------------------------------
v.3.4-Alpha3
+ - Tweaked the Playback to try to fix some issues with WMP
+ - Reduced the timeout on the LastFM Plugin to reduce delay
+ when scrobbling is down
- Added Add buttons to single playlist view, and put the delete
link back for catalogs
- Fixed Playlist Play links
diff --git a/lib/class/localplay.class.php b/lib/class/localplay.class.php
index d2611609..2f77cfd9 100644
--- a/lib/class/localplay.class.php
+++ b/lib/class/localplay.class.php
@@ -115,8 +115,6 @@ class Localplay {
unset($this->_player);
return false;
}
- $function_map = $this->_player->function_map();
- $this->_map_functions($function_map);
}
} // _load_player
@@ -158,48 +156,6 @@ class Localplay {
} // format_name
/**
- * _map_functions
- * This takes the results from the loaded from the target player
- * and maps them to the defined functions that Ampache currently
- * supports, this is broken into require and optional componets
- * Failure of required componets will cause log entry and gui
- * warning. The value of the elements in the $data array should
- * be function names that are called on the action in question
- */
- private function _map_functions($data) {
-
- /* Required Functions */
- $this->_function_map['add'] = $data['add'];
- $this->_function_map['delete'] = $data['delete'];
- $this->_function_map['play'] = $data['play'];
- $this->_function_map['stop'] = $data['stop'];
- $this->_function_map['get'] = $data['get'];
- $this->_function_map['connect'] = $data['connect'];
- $this->_function_map['status'] = $data['status'];
-
- /* Recommended Functions */
- $this->_function_map['pause'] = $data['pause'];
- $this->_function_map['next'] = $data['next'];
- $this->_function_map['prev'] = $data['prev'];
- $this->_function_map['skip'] = $data['skip'];
- $this->_function_map['get_playlist'] = $data['get_playlist'];
- $this->_function_map['get_playing'] = $data['get_playing'];
- $this->_function_map['repeat'] = $data['repeat'];
- $this->_function_map['random'] = $data['random'];
- $this->_function_map['loop'] = $data['loop'];
-
- /* Optional Functions */
- $this->_function_map['volume_set'] = $data['volume_set'];
- $this->_function_map['volume_up'] = $data['volume_up'];
- $this->_function_map['volume_down'] = $data['volume_down'];
- $this->_function_map['delete_all'] = $data['delete_all'];
- $this->_function_map['randomize'] = $data['randomize'];
- $this->_function_map['move'] = $data['move'];
- $this->_function_map['add_url'] = $data['add_url'];
-
- } // _map_functions
-
- /**
* get_controllers
* This returns the controllers that are currently loaded into this instance
*/
@@ -248,6 +204,20 @@ class Localplay {
} // is_enabled
/**
+ * install
+ * This runs the install for the localplay controller we've
+ * currently got pimped out
+ */
+ public function install() {
+
+ // Run the player's installer
+ $installed = $this->_player->install();
+
+ return $installed;
+
+ } // install
+
+ /**
* connect
* This function attempts to connect to the localplay
* player that we are using
@@ -576,17 +546,26 @@ class Localplay {
} // pause
/**
- * get_preferences
- * This functions returns an array of the preferences that the localplay
- * controller needs in order to actually work
+ * get_instances
+ * This returns the instances of the current type
*/
- public function get_preferences() {
+ public function get_instances() {
- $preferences = $this->_player->get_preferences();
-
- return $preferences;
+ $instances = $this->_player->get_instances();
+
+ return $instances;
- } // get_preferences
+ } // get_instances
+
+ /**
+ * add_instance
+ * This adds a new instance for the current controller type
+ */
+ public function add_instance($data) {
+
+ $this->_player->add_instance($data);
+
+ } // add_instance
/**
* delete
@@ -626,6 +605,19 @@ class Localplay {
} // delete_all
/**
+ * get_instance_fields
+ * This loads the fields from the localplay
+ * player and returns them
+ */
+ public function get_instance_fields() {
+
+ $fields = $this->_player->instance_fields();
+
+ return $fields;
+
+ } // get_instance_fields
+
+ /**
* get_user_state
* This function returns a user friendly version
* of the current player state
diff --git a/lib/class/scrobbler.class.php b/lib/class/scrobbler.class.php
index dd9775c3..43a62016 100644
--- a/lib/class/scrobbler.class.php
+++ b/lib/class/scrobbler.class.php
@@ -73,7 +73,7 @@ class scrobbler {
*/
public function handshake() {
- $as_socket = @fsockopen('post.audioscrobbler.com', 80, $errno, $errstr, 5);
+ $as_socket = fsockopen('post.audioscrobbler.com', 80, $errno, $errstr, 2);
if(!$as_socket) {
$this->error_msg = $errstr;
return false;
@@ -186,7 +186,7 @@ class scrobbler {
return false;
}
- $as_socket = @fsockopen($this->submit_host, intval($this->submit_port), $errno, $errstr, 5);
+ $as_socket = fsockopen($this->submit_host, intval($this->submit_port), $errno, $errstr, 2);
if(!$as_socket) {
$this->error_msg = $errstr;
diff --git a/lib/class/stream.class.php b/lib/class/stream.class.php
index 2cdd6617..3e932997 100644
--- a/lib/class/stream.class.php
+++ b/lib/class/stream.class.php
@@ -428,7 +428,7 @@ class Stream {
*/
function create_localplay() {
- if (!$localplay = init_localplay()) {
+ if (!$localplay = new Localplay($GLOBALS['user']->prefs['localplay_controller'])) {
debug_event('localplay','Player failed to init on song add','3');
echo "Error: Localplay Init Failed check config";
return false;
@@ -449,8 +449,6 @@ class Stream {
$localplay->play();
- header("Location: " . return_referer());
-
} // create_localplay
/**
diff --git a/localplay.php b/localplay.php
index 4cc0b094..c808270c 100644
--- a/localplay.php
+++ b/localplay.php
@@ -23,12 +23,29 @@ require 'lib/init.php';
show_header();
+// Check to see if we've got the rights to be here
+if (!Config::get('allow_localplay_playback') || !$GLOBALS['user']->has_access('25')) {
+ access_denied();
+}
+
+
switch ($_REQUEST['action']) {
case 'show_add_instance':
+ // This requires 50 or better
+ if (!$GLOBALS['user']->has_access('50')) { access_denied(); break; }
+
+ // Get the current localplay fields
+ $localplay = new Localplay($GLOBALS['user']->prefs['localplay_controller']);
+ $fields = $localplay->get_instance_fields();
require_once Config::get('prefix') . '/templates/show_localplay_add_instance.inc.php';
break;
case 'add_instance':
-
+ // This requires 50 or better!
+ if (!$GLOBALS['user']->has_access('50')) { access_denied(); break; }
+
+ // Setup the object
+ $localplay = new Localplay($GLOBALS['user']->prefs['localplay_controller']);
+ $localplay->add_instance($_POST);
break;
case 'delete_song':
$song_id = scrub_in($_REQUEST['song_id']);
diff --git a/modules/localplay/mpd.controller.php b/modules/localplay/mpd.controller.php
index d7819c48..b212b38c 100644
--- a/modules/localplay/mpd.controller.php
+++ b/modules/localplay/mpd.controller.php
@@ -66,44 +66,6 @@ class AmpacheMpd extends localplay_controller {
} // get_version
/**
- * function_map
- * This function returns a named array of the functions
- * that this player supports and their names in this local
- * class. This is a REQUIRED function
- */
- public function function_map() {
-
- $map = array();
-
- /* Required Functions */
- $map['add'] = 'add_songs';
- $map['delete'] = 'delete_songs';
- $map['play'] = 'play';
- $map['stop'] = 'stop';
- $map['get'] = 'get_songs';
- $map['status'] = 'get_status';
- $map['connect'] = 'connect';
-
- /* Recommended Functions */
- $map['skip'] = 'skip';
- $map['next'] = 'next';
- $map['prev'] = 'prev';
- $map['pause'] = 'pause';
- $map['volume_up'] = 'volume_up';
- $map['volume_down'] = 'volume_down';
- $map['random'] = 'random';
- $map['repeat'] = 'loop';
-
- /* Optional Functions */
- $map['move'] = 'move';
- $map['delete_all'] = 'clear_playlist';
- $map['add_url'] = 'add_url';
-
- return $map;
-
- } // function_map
-
- /**
* is_installed
* This returns true or false if MPD controller is installed
*/
@@ -129,12 +91,13 @@ class AmpacheMpd extends localplay_controller {
"`host` VARCHAR( 255 ) NOT NULL , " .
"`port` INT( 11 ) UNSIGNED NOT NULL DEFAULT '6600', " .
"`password` VARCHAR( 255 ) NOT NULL , " .
- "`access` SMALLINT( 4 ) UNSIGNED NOT NULL DEFAULT '0', " .
+ "`access` SMALLINT( 4 ) UNSIGNED NOT NULL DEFAULT '0'" .
") ENGINE = MYISAM";
$db_results = Dba::query($sql);
-
+
// Add an internal preference for the users current active instance
Preference::insert('mpd_active','MPD Active Instance','0','25','integer','internal');
+ User::rebuild_all_preferences();
return true;
@@ -149,6 +112,8 @@ class AmpacheMpd extends localplay_controller {
$sql = "DROP TABLE `localplay_mpd`";
$db_results = Dba::query($sql);
+ Preference::delete('mpd_active');
+
return true;
} // uninstall
@@ -159,7 +124,27 @@ class AmpacheMpd extends localplay_controller {
*/
public function add_instance($data) {
+ foreach ($data as $key=>$value) {
+ switch ($key) {
+ case 'name':
+ case 'hostname':
+ case 'port':
+ case 'password':
+ ${$key} = Dba::escape($value);
+ break;
+ default:
+
+ break;
+ } // end switch
+ } // end foreach
+
+ $user_id = Dba::escape($GLOBALS['user']->id);
+ $sql = "INSERT INTO `localplay_mpd` (`name`,`host`,`port`,`password`,`owner`) " .
+ "VALUES ('$name','$hostname','$port','$password','$user_id')";
+ $db_results = Dba::query($sql);
+
+ return $db_results;
} // add_instance
@@ -179,6 +164,16 @@ class AmpacheMpd extends localplay_controller {
*/
public function get_instances() {
+ $sql = "SELECT * FROM `localplay_mpd`";
+ $db_results = Dba::query($sql);
+
+ $results = array();
+
+ while ($row = Dba::fetch_assoc($db_results)) {
+ $results[$row['id']] = $row['name'];
+ }
+
+ return $results;
} // get_instances
@@ -189,7 +184,12 @@ class AmpacheMpd extends localplay_controller {
*/
public function instance_fields() {
+ $fields['name'] = array('description'=>_('Instance Name'),'type'=>'textbox');
+ $fields['hostname'] = array('description'=>_('Hostname'),'type'=>'textbox');
+ $fields['port'] = array('description'=>_('Port'),'type'=>'textbox');
+ $fields['password'] = array('description'=>_('Password'),'type'=>'textbox');
+ return $fields;
} // instance_fields
diff --git a/play/index.php b/play/index.php
index 5ce996dd..42641138 100644
--- a/play/index.php
+++ b/play/index.php
@@ -266,10 +266,10 @@ else {
} // else not downsampling
// We need to check to see if they are rate limited
-$chunk_size = '4096';
+$chunk_size = '2084';
// Attempted fix, pimp up the size a bit
-$song->size = $song->size + ($chunk_size*2);
+$song->size = $song->size;
// Put this song in the now_playing table
insert_now_playing($song->id,$uid,$song->time,$sid);
@@ -299,11 +299,11 @@ $bytesStreamed = 0;
$minBytesStreamed = $song->size / 2;
// Actually do the streaming
-while (!feof($fp) && (connection_status() == 0)) {
+do {
$buf = fread($fp, $chunk_size);
print($buf);
$bytesStreamed += $chunk_size;
-}
+} while (!feof($fp) && (connection_status() == 0));
// Make sure that a good chunk of the song has been played
if ($bytesStreamed > $minBytesStreamed) {
diff --git a/server/localplay.ajax.php b/server/localplay.ajax.php
index aa8f9db3..7153b344 100644
--- a/server/localplay.ajax.php
+++ b/server/localplay.ajax.php
@@ -26,6 +26,10 @@ if (AJAX_INCLUDE != '1') { exit; }
switch ($_REQUEST['action']) {
case 'set_instance':
+ // Make sure they they are allowed to do this
+ //... ok I don't really know what that means yet
+
+ Preference::update('mpd_active',$GLOBALS['user']->id,$_REQUEST['instance']);
break;
default:
diff --git a/templates/show_localplay_add_instance.inc.php b/templates/show_localplay_add_instance.inc.php
index c2ab559f..3e158f3b 100644
--- a/templates/show_localplay_add_instance.inc.php
+++ b/templates/show_localplay_add_instance.inc.php
@@ -22,5 +22,19 @@
?>
<?php show_box_top(_('Add Localplay Instance')); ?>
-
+<form method="post" action="<?php echo Config::get('web_path'); ?>/localplay.php?action=add_instance">
+<table border="0" cellpadding="3" cellspacing="0" class="table-data">
+<?php foreach ($fields as $key=>$field) { ?>
+<tr>
+ <td><?php echo $field['description']; ?></td>
+ <td><input type="textbox" name="<?php echo $key; ?>" /></td>
+</tr>
+<?php } ?>
+<tr>
+ <td colspan="2">
+ <input type="submit" value="<?php echo _('Add Instance'); ?>" />
+ </td>
+</tr>
+</table>
+</form>
<?php show_box_bottom(); ?>
diff --git a/templates/show_localplay_controllers.inc.php b/templates/show_localplay_controllers.inc.php
index cfbe7e30..68611d45 100644
--- a/templates/show_localplay_controllers.inc.php
+++ b/templates/show_localplay_controllers.inc.php
@@ -33,7 +33,7 @@ foreach ($controllers as $controller) {
$localplay = new Localplay($controller);
if (!$localplay->player_loaded()) { continue; }
$localplay->format();
- if ($localplay->is_enabled()) {
+ if (Localplay::is_enabled($controller)) {
$action = 'confirm_uninstall_localplay';
$action_txt = _('Disable');
}
@@ -46,7 +46,7 @@ foreach ($controllers as $controller) {
<td><?php echo scrub_out($localplay->f_name); ?></td>
<td><?php echo scrub_out($localplay->f_description); ?></td>
<td><?php echo scrub_out($localplay->f_version); ?></td>
- <td><a href="<?php echo $web_path; ?>/admin/modules.php?action=<?php echo $action; ?>&amp;type="<?php urlencode($localplay->type); ?>"><?php echo $action_txt; ?></a></td>
+ <td><a href="<?php echo $web_path; ?>/admin/modules.php?action=<?php echo $action; ?>&amp;type=<?php echo urlencode($controller); ?>"><?php echo $action_txt; ?></a></td>
</tr>
<?php } if (!count($controllers)) { ?>
<tr class="<?php echo flip_class(); ?>">
diff --git a/templates/sidebar_localplay.inc.php b/templates/sidebar_localplay.inc.php
index 815ffc2b..7525fd7f 100644
--- a/templates/sidebar_localplay.inc.php
+++ b/templates/sidebar_localplay.inc.php
@@ -1,12 +1,26 @@
<ul class="sb2" id="sb_localplay">
+<?php if (Config::get('allow_localplay_playback')) { ?>
+<?php if ($GLOBALS['user']->has_access('50')) { ?>
<li><h4><?php echo _('Localplay'); ?></h4>
<ul class="sb3" id="sb_localplay_info">
<li id="sb_localplay_info_add_instance"><a href="<?php echo $web_path; ?>/localplay.php?action=show_add_instance"><?php echo _('Add Instance'); ?></a></li>
</ul>
</li>
+<?php } ?>
<li><h4><?php echo _('Active Instance'); ?></h4>
<ul class="sb3" id="sb_localplay_instances">
<li id="sb_localplay_instances_none"><?php echo Ajax::text('?page=localplay&action=set_instance&instance=0',_('None'),'localplay_instance_none'); ?></li>
+ <?php
+ // Requires a little work.. :(
+ $localplay = new Localplay($GLOBALS['user']->prefs['localplay_controller']);
+ $instances = $localplay->get_instances();
+ foreach ($instances as $uid=>$name) {
+ ?>
+ <li id="sb_localplay_instances_<?php echo $uid; ?>"><?php echo Ajax::text('?page=localplay&action=set_instance&instance=' . $uid,$name,'localplay_instance_' . $uid); ?></li>
+ <?php } ?>
</ul>
</li>
+<?php } else { ?>
+ <li><h4><?php echo _('Localplay Disabled'); ?></h4></li>
+<?php } ?>
</ul>
diff --git a/templates/sidebar_preferences.inc.php b/templates/sidebar_preferences.inc.php
index a960e667..be018df9 100644
--- a/templates/sidebar_preferences.inc.php
+++ b/templates/sidebar_preferences.inc.php
@@ -15,6 +15,7 @@ $catagories = Preference::get_catagories();
?>
<li id="sb_preferences_sections_<?php echo $f_name; ?>"><a href="<?php echo $web_path; ?>/preferences.php?tab=<?php echo $name; ?>"><?php echo _($f_name); ?></a></li>
<?php } ?>
+ <li id="sb_preferences_sections_account"><a href="<?php echo $web_path; ?>/preferences.php?tab=account"><?php echo _('Account'); ?></a></li>
</ul>
</li>
<?php if ($GLOBALS['user']->has_access('100')) { ?>