MPD Class for PHP Monday, May 31st 2010
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.

/*
 * 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! Comment on this Post