MPD Class for PHP
I've just been going through a couple of folders and I found a very basic PHP class I wrote to control the Music Player Daemon. Assuming the text protocol hasn't changed much it should still work fine :)
<?php
/*
* Base MPDControl Class
* Provide functions for connecting and retrieving raw data from MPD
*/
class MPDControl {
var $hostname, $port, $timeout, $socket, $errno, $errstr;
function MPDControl($hostname = 'localhost', $port = '6600', $timeout = 3) {
$this->hostname = $hostname;
$this->port = $port;
$this->timeout = $timeout;
}
function connect() {
$this->socket = @fsockopen($this->hostname, $this->port, $this->errno, $this->errstr, $this->timeout);
if (!$this->socket) {
return false;
} else {
$this->getData();
return true;
}
}
function disconnect() {
$this->sendRaw('close');
fclose($this->socket);
}
function getData() {
$lines = Array();
$line = '';
while ((substr($line, 0, 2) != 'OK') && (substr($line, 0, 3) != 'ACK')) {
$line = fgets($this->socket, 256);
$lines[] = $line;
}
unset($lines[count($lines)-1]);
return $lines;
}
function sendRaw($string) {
fwrite($this->socket, $string."\n");
}
}
This is then complimented with a class that extends MPDControl.
<?php
/*
* Extended version of MPDControl
* Provides function for getting commonly used info
*/
class ExtendedMPDControl extends MPDControl {
function getNowPlaying() {
$this->sendRaw('currentsong');
$song = $this->getData();
foreach ($song as $line) {
$line = explode(':', $line);
switch ($line[0]) {
case 'Artist':
$artist = trim($line[1]);
break;
case 'Title':
$title = trim($line[1]);
break;
}
}
return Array((empty($artist) ? 'None' : $artist), (empty($title) ? 'None' : $title));
}
function randomOn() {
$this->sendRaw('random 1');
$this->getData();
}
function randomOff() {
$this->sendRaw('random 0');
$this->getData();
}
function play($id = '') {
$this->sendRaw('play '.$id);
$this->getData();
}
function stop() {
$this->sendRaw('stop');
$this->getData();
}
function clear() {
$this->sendRaw('clear');
$this->getData();
}
function remove($id) {
$this->sendRaw('delete '.$id);
$this->getData();
}
function add($path) {
$this->sendRaw('add "'.$path.'"');
$this->getData();
}
function getPlaylist() {
$this->sendRaw('playlistinfo');
$buffer = $this->getData();
$playpos = -1;
$artist = $album = $title = '';
$playlist = Array();
foreach ($buffer as $line) {
$line = explode(':', $line);
switch ($line[0]) {
case 'Artist':
$artist = trim($line[1]);
break;
case 'Album':
$album = trim($line[1]);
break;
case 'Title':
$title = trim($line[1]);
break;
case 'Pos': // End of song output
$playlist[$playpos+1] = Array($artist, $album, $title);
$playpos = trim($line[1]);
$artist = $album = $title = '';
break;
}
}
return $playlist;
}
}
Consider this code to be in the public domain, so have fun with it!