summaryrefslogtreecommitdiffstats
path: root/modules/localplay/httpq.controller.php
diff options
context:
space:
mode:
authorKarl 'vollmerk' Vollmer <vollmer@ampache.org>2006-12-22 19:27:33 +0000
committerKarl 'vollmerk' Vollmer <vollmer@ampache.org>2006-12-22 19:27:33 +0000
commit2f2aff930ae0b590d0460e783ec090114b15f04f (patch)
tree6fcf3836966ff7b0e92c1a7c157bfc1c033b8a92 /modules/localplay/httpq.controller.php
parent2d06bf58a22f52e3ca3a3d046a48862da1790a40 (diff)
downloadampache-2f2aff930ae0b590d0460e783ec090114b15f04f.tar.gz
ampache-2f2aff930ae0b590d0460e783ec090114b15f04f.tar.bz2
ampache-2f2aff930ae0b590d0460e783ec090114b15f04f.zip
new httpq localplay method, fixes for preferences and mpd controller
Diffstat (limited to 'modules/localplay/httpq.controller.php')
-rw-r--r--modules/localplay/httpq.controller.php414
1 files changed, 414 insertions, 0 deletions
diff --git a/modules/localplay/httpq.controller.php b/modules/localplay/httpq.controller.php
new file mode 100644
index 00000000..57b9d5af
--- /dev/null
+++ b/modules/localplay/httpq.controller.php
@@ -0,0 +1,414 @@
+<?php
+/*
+
+ Copyright 2001 - 2006 Ampache.org
+ All Rights Reserved
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License v2
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/**
+ * AmpacheHttpQ Class
+ * This is the class for the HttpQ localplay method to remote control
+ * a WinAmp Instance
+ */
+class AmpacheHttpq {
+
+ /* Variables */
+
+
+ /* Constructed variables */
+ var $_httpq;
+
+ /**
+ * Constructor
+ * This returns the array map for the localplay object
+ * REQUIRED for Localplay
+ */
+ function AmpacheHttpq() {
+
+ /* Do a Require Once On the needed Libraries */
+ require_once(conf('prefix') . '/modules/httpq/httpqplayer.class.php');
+
+ } // AmpacheHttpq
+
+
+ /**
+ * 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
+ */
+ 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
+
+ /**
+ * preference
+ * This function returns an array of the preferences and their
+ * information for Ampache to use All preferences will get a
+ * localplay_mpd_ appended to their name to avoid conflicts
+ * however this controller does not need to take that into acount
+ * REQUIRE for Locaplay
+ */
+ function preferences() {
+
+ $preferences = array();
+
+ $preferences[] = array('name'=>'hostname','default'=>'localhost','type'=>'string','description'=>'HttpQ Hostname');
+ $preferences[] = array('name'=>'port','default'=>'4800','type'=>'integer','description'=>'HttpQ Port');
+ $preferences[] = array('name'=>'password','default'=>'','type'=>'string','description'=>'HttpQ Password');
+
+ return $preferences;
+
+ } // preferences
+
+
+ /**
+ * add_songs
+ * This must take an array of URL's from Ampache
+ * and then add them to HttpQ
+ */
+ function add_songs($songs) {
+
+ foreach ($songs as $song_id) {
+ $song = new Song($song_id);
+ $url = $song->get_url(0,1);
+ if (is_null($this->_httpq->add($song->title,$url))) {
+ debug_event('httpq_add','Error: Unable to add $url to Httpq','1');
+ }
+
+ } // end foreach
+
+ return true;
+
+ } // add_songs
+
+ /**
+ * add_url
+ * This adds urls directly to the playlist, recieves an array of urls
+ */
+ function add_url($urls) {
+
+ foreach ($urls as $url) {
+ if (is_null($this->_httpq->add('URL',$url))) {
+ debug_event('httpq_add','Error: Unable to add $url to Httpq ','1');
+ }
+
+ } // end foreach
+
+ return true;
+
+ } // add_url
+
+ /**
+ * delete_songs
+ * This must take an array of ID's (as passed by get function) from Ampache
+ * and delete them from Httpq
+ */
+ function delete_songs($songs) {
+
+ /* Default to true */
+ $return = true;
+
+ /* This should be an array of UID's as returned by
+ * the get function so that we can just call the class based
+ * functions to remove them or if there isn't a uid for
+ * the songs, then however ya'll have stored them
+ * in this controller
+ */
+ foreach ($songs as $uid) {
+
+ if (is_null($this->_httpq->delete_pos($uid))) { $return = false; }
+
+ } // foreach of songs
+
+ return $return;
+
+ } // delete_songs
+
+ /**
+ * clear_playlist
+ * This deletes the entire Httpq playlist... nuff said
+ */
+ function clear_playlist() {
+
+ if (is_null($this->_httpq->clear())) { return false; }
+
+ return true;
+
+ } // clear_playlist
+
+ /**
+ * play
+ * This just tells HttpQ to start playing, it does not
+ * take any arguments
+ */
+ function play() {
+
+ if (is_null($this->_httpq->play())) { return false; }
+ return true;
+
+ } // play
+
+ /**
+ * stop
+ * This just tells HttpQ to stop playing, it does not take
+ * any arguments
+ */
+ function stop() {
+
+ if (is_null($this->_httpq->stop())) { return false; }
+ return true;
+
+ } // stop
+
+ /**
+ * skip
+ * This tells MPD to skip to the specified song
+ */
+ function skip($song) {
+
+ if (is_null($this->_mpd->SkipTo($song))) { return false; }
+ return true;
+
+ } // skip
+
+ /**
+ * This tells MPD to increase the volume by 5
+ */
+ function volume_up() {
+
+ if (is_null($this->_mpd->AdjustVolume('5'))) { return false; }
+ return true;
+
+ } // volume_up
+
+ /**
+ * This tells MPD to decrese the volume by 5
+ */
+ function volume_down() {
+
+ if (is_null($this->_mpd->AdjustVolume('-5'))) { return false; }
+ return true;
+
+ } // volume_down
+
+ /**
+ * next
+ * This just tells MPD to skip to the next song
+ */
+ function next() {
+
+ if (is_null($this->_mpd->Next())) { return false; }
+ return true;
+
+ } // next
+
+ /**
+ * prev
+ * This just tells MPD to skip to the prev song
+ */
+ function prev() {
+
+ if (is_null($this->_mpd->Previous())) { return false; }
+ return true;
+
+ } // prev
+
+ /**
+ * pause
+ * This tells MPD to pause the current song
+ */
+ function pause() {
+
+ if (is_null($this->_httpq->pause())) { return false; }
+ return true;
+
+ } // pause
+
+ /**
+ * volume
+ * This tells MPD to set the volume to the parameter
+ */
+ function volume($volume) {
+
+ if (is_null($this->_mpd->SetVolume($volume))) { return false; }
+ return true;
+
+ } // volume
+
+ /**
+ * loop
+ * This tells MPD to set the repeating the playlist (i.e. loop) to either on or off
+ */
+ function loop($state) {
+
+ if (is_null($this->_httpq->repeat($state))) { return false; }
+ return true;
+
+ } // loop
+
+
+ /**
+ * random
+ * This tells MPD to turn on or off the playing of songs from the playlist in random order
+ */
+ function random($onoff) {
+
+ if (is_null($this->_httpq->random($onoff))) { return false; }
+ return true;
+
+ } // random
+
+ /**
+ * move
+ * This tells MPD to move song from SrcPos to DestPos
+ */
+ function move($SrcPos, $DestPos) {
+
+ if (is_null($this->_mpd->PLMoveTrack($SrcPos, $DestPos))) { return false; }
+
+ return true;
+ } // move
+
+ /**
+ * get_songs
+ * This functions returns an array containing information about
+ * The songs that MPD currently has in it's playlist. This must be
+ * done in a standardized fashion
+ */
+ function get_songs() {
+
+ /* Get the Current Playlist */
+ $list = $this->_httpq->get_tracks();
+
+ $songs = explode(":",$list);
+
+ foreach ($songs as $key=>$song) {
+ $data = array();
+
+ /* Required Elements */
+ $data['id'] = $key;
+ $data['raw'] = $entry['file'];
+
+ /* Parse out the song ID and then create the song object */
+ preg_match("/song=(\d+)\&/",$entry['file'],$matches);
+
+ /* Attempt to build the new song */
+ $song = new Song($matches['1']);
+
+ /* If we don't know it, look up by filename */
+ if (!$song->title) {
+ $filename = sql_escape($entry['file']);
+ $sql = "SELECT id FROM song WHERE file = '$filename'";
+ $db_results = mysql_query($sql, dbh());
+ if ($results = mysql_fetch_assoc($db_results)) {
+ $song = new Song($results['id']);
+ }
+ else {
+ $song->title = _('Unknown');
+ }
+ }
+
+ /* Make the name pretty */
+ $song->format_song();
+ $data['name'] = $song->f_title . ' - ' . $song->f_album . ' - ' . $song->f_artist;
+
+ /* Optional Elements */
+ $data['link'] = '';
+ $data['track'] = $key+1;
+
+ $results[] = $data;
+
+ } // foreach playlist items
+
+ return $results;
+
+ } // get_songs
+
+ /**
+ * get_status
+ * This returns bool/int values for features, loop, repeat and any other features
+ * That this localplay method supports. required function
+ */
+ function get_status() {
+
+ /* Construct the Array */
+ $array['state'] = $this->_httpq->state();
+ $array['volume'] = $this->_httpq->get_volume();
+ $array['repeat'] = $this->_httpq->get_repeat();
+ $array['random'] = $this->_httpq->get_random();
+ $array['track'] = $this->_httpq->get_now_playing();
+
+ preg_match("/song=(\d+)\&/",$array['track'],$matches);
+ $song_id = $matches['1'];
+ $song = new Song($song_id);
+ $array['track_title'] = $song->title;
+ $array['track_artist'] = $song->get_artist_name();
+ $array['track_album'] = $song->get_album_name();
+
+ return $array;
+
+ } // get_status
+
+ /**
+ * connect
+ * This functions creates the connection to HttpQ and returns
+ * a boolean value for the status, to save time this handle
+ * is stored in this class
+ */
+ function connect() {
+
+ $this->_httpq = new HttpQPlayer(conf('localplay_httpq_hostname'),conf('localplay_httpq_password'),conf('localplay_httpq_port'));
+
+ // Test our connection by retriving the version
+ if (!is_null($this->_httpq->version())) { return true; }
+
+ return false;
+
+ } // connect
+
+} //end of AmpacheHttpq
+
+?>