<para>The MPD Protocol has Three Components: Commands, Responses, and Command Lists. All communication between the client and server uses the UTF-8 character encoding.</para>
<para>Commands in MPD are specified begginning with the name of the command. The arguments of a command are delimitted by spaces and should be surrounded by double qutotation marks. The end of a command is delimitted by a return character '<literal>\n</literal>'.<programlisting>command "arg1""arg2"</programlisting></para>
<para>The different response elements of a command are seperated by the return character '<literal>\n</literal>'. The last element of a response begin with either <literal>OK</literal> or <literal>ACK</literal>. Thus, if a command is successful, the end of the response is <literal>OK\n</literal>. If a command is unsuccessful <literal>ACK</literal> terminates the command with the following format:<programlisting>ACK {err#:cmd#} {command} some error message</programlisting><literal>err#</literal> is an integer indicating the specific error that occured and <literal>cmd#</literal> is an integer indicating which command of the command list caused the error (See section 1.3 for more info on Command Lists). <literal>command</literal> gives the name of the command the error occurred on; however, its intended more for debugging persons (for human readability). <literal>some error message</literal> is also not intended to be parsed by clients but is intended more for debugging purposes.</para>
<para>The other response elements are data. The data is seperated into a name and value pare by <literal>: </literal>. Thus, a possible command response containing data would be:<programlisting>Name1: Value1
<para>Command lists allow for a fast, effecient, and atomic execution of multiple commands. Command lists are initiated with either <literal>command_list_begin</literal> or <literal>command_list_ok_begin</literal>and are terminated with <literal>command_list_end</literal>.<programlisting>command_list_begin
command1 arg1 arg2
command2 arg1 arg2
command3 arg1 arg2
command_list_end</programlisting></para>
<para>The responses for command executed with command lists are the same with the exception that an<literal>OK</literal> or <literal>ACK</literal> is not returned for each command. Instead a single <literal>OK</literal> or <literal>ACK</literal> is returned for the entire command list. An <literal>OK</literal> indicates that all the commands in the command list were successfully executed; while an <literal>ACK</literal> error is returned on the first unsuccessful command in the command list and none of the following commands in the command are executed.</para>
<para><literal>command_list_ok_begin</literal> responds with <literal>list_OK</literal> after each command is successfully completed. <literal>command_list_begin</literal> does not return anything between each command that is executed.</para>
<para>Browsing Responses usually contain groups of several responses. These groups are either begin with <literal>file</literal>, <literal>directory</literal>, or <literal>playlist</literal>. Each of these response groups maybe followed by metadata, which always begin with a capital letter (A-Z). Here's an example of a complete browsing response:<programlisting>file: Directory/file.mp3
Artist: Muscian
Album: Record
Time: 23
directory: Directory/Subdirectory
playlist: Directory/favorites
OK</programlisting></para>
<para><literal>directory</literal> and <literal>playlist</literal> have no metadata, however future versions of the MPD protocol may add metadata to either. Also, future versions of MPD may add othe response groups for browsing.</para>
<para>For query information on songs in the db (and the playlist), there is a common response for each song. The first response element is <literal>file</literal>. The remainng elements of the song info are one of the following metadata types: <literal>Artist</literal>, <literal>Album</literal>, <literal>Title</literal>, <literal>Track</literal>, <literal>Name</literal>, or <literal>Time</literal>.</para>
lsinfo <emphasis>file</emphasis></programlisting><literal>lsinfo</literal> responds with <linklinkend="browsing_responses">info</link> for the directory or file specified. If <literal>lsinfo</literal> is called without any arguments then the root directory is implied as the path.</para>
</sect3>
<sect3>
<titleid="listallinfo">
<literal>listallinfo</literal>
</title>
<para><programlisting>listallinfo
listallinfo <emphasis>directory</emphasis>
listallinfo <emphasis>file</emphasis></programlisting><literal>listallinfo</literal> is a recursive form of <literal>
search title <emphasis>pattern</emphasis></programlisting><literal>search</literal> respnds with the <linklinkend="song_info_responses">files</link> that match the specified pattern with the specified data (either <literal>filename</literal>, <literal>artist</literal>, <literal>album</literal>, or <literal>title</literal>).</para>
<para><programlisting>find artist <emphasis>match</emphasis>
find album <emphasis>match</emphasis></programlisting><literal>find</literal> responds with the <linklinkend="song_info_responses">files</link> whose <literal>artist</literal> or <literal>album</literal> are the same as <emphasis>match</emphasis>.</para>
<titleid="playlist_song_metadata">Additional Song Metadata</title>
<para>In addition to the same <linklinkend="song_info_responses">song metadata</link> returned when browsing, songs in a playlist have two additional metadata elements. <literal>Pos</literal> is the position in the playlist of the song and <literal>Id</literal> is the playlist id for a song (each song in the playlist has a unique <literal>Id</literal>, even if there is a duplicate entry for the same <literal>file</literal>).<programlisting>file: <emphasis>directory/song</emphasis>
<titleid="song_id_vs_positiion">Song ID's vs Playlist Position</title>
<para>When implementing a client for MPD, the developer must keep in mind that multiple clients maybe manipulating the playlist simultaneously. Thus, its essential to use playlist song id's instead of the playlist position for manipulating the playlist. This is due to the fact that another client maybe moving, deleting, etc... songs in the playlist, thus changing the order and positions of songs in the playlist. Consequently, using song id's is a safer method for manipulating the playlist as the song id's do not depend on the order and positions of songs in the playlist.</para>
playlistinfo <emphasis>position</emphasis></programlisting><literal>playlistinfo</literal> responds with the <linklinkend="playlist_song_metadata">information about songs</link> in the playlist. If no argument is passed to <literal>playlistinfo</literal> or an argument of <literal>-1</literal> is passed, then every song in the playlist is returned. If a playlist <emphasis>position</emphasis> is passed to <literal>playlistinfo</literal>, then the information about the song at <emphasis>position</emphasis> is returned. Note: It's suggest that <linklinkend="playlistid">
<literal>playlistid</literal>
</link> be used instead of <literal>playlistinfo</literal>.</para>
playlistid <emphasis>id</emphasis></programlisting><literal>playlistid</literal> is the same as <literal>
<linklinkend="playlistinfo">playlistinfo</link>
</literal> except that using optional argument <emphasis>id</emphasis> causes the information for the song with the playlist song ID <emphasis>id</emphasis>to be returned.</para>
<para><programlisting>plchanges <emphasis>version</emphasis></programlisting><literal>plchanges</literal> responds with the <linklinkend="playlist_song_metadata">song information</link> for songs that have changed since the <linklinkend="status">playlist version</link><emphasis>version</emphasis>. Note, to detect songs that were removed at the end of the playlist, use the playlist length returned by <linklinkend="status">status</link>.</para>
<para><programlisting>deleteid <emphasis>id</emphasis></programlisting><literal>deleteid</literal> removes the song with the playlist song id <emphasis>id</emphasis> from the playlist.</para>
<para><programlisting>delete <emphasis>position</emphasis></programlisting><literal>delete</literal> removes the song at the playlist position <emphasis>position</emphasis> from the playlist. Note: It's suggested that <linklinkend="deleteid">
<literal>deleteid</literal>
</link> be used instead of <literal>delete</literal>.</para>
add <emphasis>url</emphasis></programlisting><literal>add</literal> appends the <emphasis>file</emphasis> or <emphasis>url</emphasis> to the end of the playlist</para>