chiark / gitweb /
Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/disorder
[disorder] / doc / disorder_protocol.5.in
index f4c5b2fbfd446c744c484383229d0ef1f5f0aa71..3389bd926e0c1fbc7b9c88e9e761078858ce0253 100644 (file)
@@ -1,20 +1,18 @@
 .\"
-.\" Copyright (C) 2004-2008 Richard Kettlewell
+.\" Copyright (C) 2004-2011, 2013 Richard Kettlewell
 .\"
-.\" This program is free software; you can redistribute it and/or modify
+.\" This program is free software: you can redistribute it and/or modify
 .\" it under the terms of the GNU General Public License as published by
-.\" the Free Software Foundation; either version 2 of the License, or
+.\" the Free Software Foundation, either version 3 of the License, or
 .\" (at your option) any later version.
-.\"
-.\" 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.
-.\"
+.\" 
+.\" 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
+.\" along with this program.  If not, see <http://www.gnu.org/licenses/>.
 .\"
 .TH disorder_protocol 5
 .SH NAME
@@ -23,34 +21,63 @@ disorder_protocol \- DisOrder communication protocol
 The DisOrder client and server communicate via the protocol described
 in this man page.
 .PP
-The protocol is liable to change without notice.
-You are recommended to check the implementation before believing this document.
-.SH "GENERAL SYNTAX"
-Everything is encoded using UTF-8.
-See
-.B "CHARACTER ENCODING"
-below for more detail on character encoding issues.
+The protocol is usually modified in each new version of the server.
+.SH "MESSAGE STRUCTURE"
+A \fIline\fR is a sequence of printable Unicode characters encoded in UTF-8 and
+terminated by the octet 0x0A.
+Note that unlike some other protocols, a carriage return is not used as part of
+the end-of-line sequence.
+.PP
+A \fIcommand message\fR consists of a \fIcommand line\fR followed, in some cases, by a \fIbody\fR.
+Similarly a \fIresponse message\fR consists of a \fIresponse line\fR followed
+sometimes by a \fIbody\fR.
 .PP
-Commands and responses consist of a line perhaps followed (depending on the
-command or response) by a body.
+A \fIbody\fR consists of a sequence of dot-stuffed lines followed by a line
+containing a single full stop character.
+Dot-stuffing means that any line in the body starting with a full stop have
+another full stop inserted at the start prior to transmission, and removed
+again after reception.
 .PP
-The line syntax is the same as described in \fBdisorder_config\fR(5) except
-that comments are prohibited.
+Whether a command message includes a body depends on the specific command being
+sent; see below for details.
+This is also true of reply messages, although it is guaranteed that if the is a
+response body then the reply status code (see below) will end with the digit 3.
+.PP
+Command lines, and some response lines, are split into \fIfields\fR.
+Fields are separated by one or more spaces and may be \fIunquoted\fR or
+\fIquoted\fR.
+.PP
+An \fIunquoted field\fR can contain any (non-control) characters except for a
+space, quotation mark or apostrophe.
+They are always at least one character long.
+.PP
+A \fIquoted field\fR begins with a quotation mark or apostrophe and is
+terminated by the same character.
+Any occurrence of the backslash or the surrounding quotation mark must be
+escaped.
+The full set of escapes permitted is:
+.TP
+.B \e\e
+Backslash
+.TP
+.B \e"
+Quotation mark
+.\" "
+.TP
+.B \e\(aq
+Apostrophe
+.TP
+.B \en
+Line feed
 .PP
-Bodies borrow their syntax from RFC821; they consist of zero or more ordinary
-lines, with any initial full stop doubled up, and are terminated by a line
-consisting of a full stop and a line feed.
 .SH COMMANDS
-Commands always have a command name as the first field of the line; responses
-always have a 3-digit response code as the first field.
-See below for more details about this field.
+Commands always have a command name as the first field of the line.
 .PP
 All commands require the connection to have been already authenticated unless
 stated otherwise.
+See \fBAUTHENTICATION\fR below.
 If not stated otherwise, the \fBread\fR right is sufficient to execute
 the command.
-.PP
-Neither commands nor responses have a body unless stated otherwise.
 .TP
 .B adduser \fIUSERNAME PASSWORD \fR[\fIRIGHTS\fR]
 Create a new user with the given username and password.
@@ -59,6 +86,10 @@ then the \fBdefault_rights\fR setting applies instead.
 Requires the \fBadmin\fR right, and only works on local
 connections.
 .TP
+.B adopt \fIID\fR
+Adopts a randomly picked track, leaving it in a similar state to if it was
+picked by this user.  Requires the \fBplay\fR right.
+.TP
 .B allfiles \fIDIRECTORY\fR [\fIREGEXP\fR]
 List all the files and directories in \fIDIRECTORY\fR in a response body.
 If \fIREGEXP\fR is present only matching files and directories are returned.
@@ -66,7 +97,8 @@ If \fIREGEXP\fR is present only matching files and directories are returned.
 .B confirm \fICONFIRMATION
 Confirm user registration.
 \fICONFIRMATION\fR is as returned from \fBregister\fR below.
-This command can be used without logging in.
+This command logs the user in.
+The response contains the logged-in username.
 .TP
 .B cookie \fICOOKIE
 Log a user back in using a cookie created with \fBmake\-cookie\fR.
@@ -95,6 +127,8 @@ Otherwise the \fBuserinfo\fR right is required and only the
 User properties are syntax-checked before setting.  For instance \fBemail\fR
 must contain an "@" sign or you will get an error.  (Setting an empty value for
 \fBemail\fR is allowed and removes the property.)
+.IP
+See \fBUSER PROPERTIES\fR below.
 .TP
 .B enable
 Re-enable further playing, and is the opposite of \fBdisable\fR.
@@ -113,7 +147,7 @@ List all the files in \fIDIRECTORY\fR in a response body.
 If \fIREGEXP\fR is present only matching files are returned.
 .TP
 .B get \fITRACK\fR \fIPREF\fR
-Getsa preference value.
+Gets a preference value.
 On success the second field of the response line will have the value.
 .IP
 If the track or preference do not exist then the response code is 555.
@@ -162,7 +196,7 @@ depending on how the tracks came to be added to the queue.
 .TP
 .B new \fR[\fIMAX\fR]
 Send the most recently added \fIMAX\fR tracks in a response body.
-If the argument is ommitted, the \fBnew_max\fR most recent tracks are
+If the argument is omitted, the \fBnew_max\fR most recent tracks are
 listed (see \fBdisorder_config\fR(5)).
 .TP
 .B nop
@@ -198,6 +232,16 @@ Add a track to the queue.
 The response contains the queue ID of the track.
 Requires the \fBplay\fR right.
 .TP
+.B playafter \fITARGET\fR \fITRACK\fR ...
+Add all the tracks in the \fITRACK\fR list to the queue after \fITARGET\fR
+(which should be a track ID).
+If \fITARGET\fR is the empty string then the listed tracks are put
+at the head of the queue.
+.IP
+Currently the success result does \fInot\fR include the new track IDs.
+.IP
+Requires the \fBplay\fR right.
+.TP
 .B playing
 Report what track is playing.
 .IP
@@ -206,6 +250,44 @@ track information (see below).
 .IP
 If the response is \fB259\fR then nothing is playing.
 .TP
+.B playlist-delete \fIPLAYLIST\fR
+Delete a playlist.
+Requires permission to modify that playlist and the \fBplay\fR right.
+.TP
+.B playlist-get \fIPLAYLIST\fR
+Get the contents of a playlist, in a response body.
+Requires permission to read that playlist and the \fBread\fR right.
+If the playlist does not exist the response is 555.
+.TP
+.B playlist-get-share \fIPLAYLIST\fR
+Get the sharing status of a playlist.
+The result will be \fBpublic\fR, \fBprivate\fR or \fBshared\fR.
+Requires permission to read that playlist and the \fBread\fR right.
+.TP
+.B playlist-lock \fIPLAYLIST\fR
+Lock a playlist.
+Requires permission to modify that playlist and the \fBplay\fR right.
+Only one playlist may be locked at a time on a given connection and the lock
+automatically expires when the connection is closed.
+.TP
+.B playlist-set \fIPLAYLIST\fR
+Set the contents of a playlist.
+The new contents should be supplied in a command body.
+Requires permission to modify that playlist and the \fBplay\fR right.
+The playlist must be locked.
+.TP
+.B playlist-set-share \fIPLAYLIST\fR \fISHARE\fR
+Set the sharing status of a playlist to
+\fBpublic\fR, \fBprivate\fR or \fBshared\fR.
+Requires permission to modify that playlist and the \fBplay\fR right.
+.TP
+.B playlist-unlock\fR
+Unlock the locked playlist.
+.TP
+.B playlists
+List all playlists that this connection has permission to read.
+Requires the \fBread\fR right.
+.TP
 .B prefs \fBTRACK\fR
 Send back the preferences for \fITRACK\fR in a response body.
 Each line of the response has the usual line syntax, the first field being the
@@ -236,6 +318,11 @@ See below for the track information syntax.
 .B reconfigure
 Request that DisOrder reconfigure itself.
 Requires the \fBadmin\fR right.
+.IP
+Not all configuration options can be modified during the lifetime of the
+server; of those that can't, some will just be ignored if they change while
+others will cause the new configuration to be rejected.
+See \fBdisorder_config\fR(5) for details.
 .TP
 .B register \fIUSERNAME PASSWORD EMAIL
 Register a new user.
@@ -278,15 +365,24 @@ Resolve a track name, i.e. if this is an alias then return the real track name.
 Resume the current track after a \fBpause\fR command.
 Requires the \fBpause\fR right.
 .TP
-.B revoke \fBcookie\fR
-Revoke a cookie previously created with \fBmake\-cookie\fR.
-It will not be possible to use this cookie in the future.
+.B revoke
+Revoke the current login's cookie.
+It will not be possible to use the cookie in the future.
 .TP
 .B rtp\-address
 Report the RTP broadcast (or multicast) address, in the form \fIADDRESS
 PORT\fR.
+If the server is in RTP request mode then the result is \fB- -\fR.
 This command does not require authentication.
 .TP
+.B rtp\-cancel
+Cancel the unicast RTP stream associated with this connection.
+.TP
+.B rtp\-request \fIADDRESS PORT\fR
+Request that an RTP stream be transmitted to a given destination address.
+Only one unicast stream may be requested per connection.
+WHen the connection is closed the stream is terminated.
+.TP
 .B scratch \fR[\fIID\fR]
 Remove the track identified by \fIID\fR, or the currently playing track if no
 \fIID\fR is specified.
@@ -298,7 +394,8 @@ added to the queue.
 Schedule an event for the future.
 .IP
 .I WHEN
-is the time when it should happen, as \fBtime_t\fR value.
+is the time when it should happen, as a timestamp.
+See \fBTIMESTAMPS\fR below.
 It must refer to a time in the future.
 .IP
 .I PRIORITY
@@ -374,6 +471,10 @@ Requires the \fBprefs\fR right.
 Set a global preference.
 Requires the \fBglobal prefs\fR right.
 .TP
+.B shutdown
+Requests server shutdown.
+Requires the \fBadmin\fR right.
+.TP
 .B stats
 Send server statistics in plain text in a response body.
 .TP
@@ -396,6 +497,7 @@ below.
 .TP
 .B userinfo \fIUSERNAME PROPERTY
 Get a user property.
+See \fBUSER PROPERTIES\fR below.
 .TP
 .B users
 Send the list of currently known users in a response body.
@@ -413,8 +515,11 @@ With one parameter sets both sides to the same value.
 With two parameters sets each side independently.
 Setting the volume requires the \fBvolume\fR right.
 .SH RESPONSES
-Responses are three-digit codes.
-The first digit distinguishes errors from succesful responses:
+Response lines start with a three-digit status code followed by a space.
+The meaning the response and the interpretation of the rest of the line depends
+on that code.
+.PP
+The first digit distinguishes errors from successful responses:
 .TP
 .B 2
 Operation succeeded.
@@ -426,7 +531,6 @@ The second digit breaks down the origin of the response:
 .TP
 .B 0
 Generic responses not specific to the handling of the command.
-Mostly this is parse errors.
 .TP
 .B 1
 51x errors indicate that the user had insufficient rights for the command.
@@ -440,10 +544,12 @@ Responses specific to the handling of the command.
 The third digit provides extra information about the response:
 .TP
 .B 0
-Text part is just commentary.
+Text part is just commentary, intended to be human-readable.
 .TP
 .B 1
-Text part is a constant result e.g. \fBversion\fR.
+Text part is a constant result (e.g. \fBversion\fR).
+It will not change on a subsequent use of the same command on the same
+conneciton.
 .TP
 .B 2
 Text part is a potentially variable result.
@@ -456,7 +562,7 @@ Text part is just commentary; an indefinite dot-stuffed body follows.
 (Used for \fBlog\fR.)
 .TP
 .B 5
-Used with "normal" errors, for instance a preference not being found.
+Used with "harmless" errors, for instance a preference not being found.
 The text part is commentary.
 .TP
 .B 9
@@ -464,24 +570,23 @@ The text part is just commentary (but would normally be a response for this
 command) e.g. \fBplaying\fR.
 .PP
 Result strings (not bodies) intended for machine parsing (i.e. xx1 and xx2
-responses) are quoted.
+responses) are structure into fields in the the same way as command lines.
 .SH AUTHENTICATION
 When a connection is made the server sends a \fB231\fR response before any
 command is received.
 This contains a protocol generation, an algorithm name and a
-challenge encoded in hex, all separated by whitespace.
+challenge encoded in hex, in the fields of the response line.
 .PP
 The current protocol generation is \fB2\fR.
 .PP
 The possible algorithms are (currently) \fBsha1\fR, \fBsha256\fR, \fBsha384\fR
 and \fBsha512\fR.
-\fBSHA1\fR etc work as synonyms.
+Completely upper-case names such as \fBSHA1\fR etc work as synonyms.
 .PP
 The \fBuser\fR response consists of the selected hash of the user's password
 concatenated with the challenge, encoded in hex.
 .SH "TRACK INFORMATION"
-Track information is encoded in a line (i.e. using the usual line syntax) as
-pairs of fields.
+Track information is encoded in a response line as pairs of fields.
 The first is a name, the second a value.
 The names have the following meanings:
 .TP 12
@@ -497,6 +602,26 @@ The time the track was played at.
 .B scratched
 The user that scratched the track.
 .TP
+.B origin
+The origin of the track.  Valid origins are:
+.RS
+.TP 12
+.B adopted
+The track was originally randomly picked but has been adopted by a user.
+.TP
+.B picked
+The track was picked by a user.
+.TP
+.B random
+The track was randomly picked.
+.TP
+.B scheduled
+The track was played from a scheduled action.
+.TP
+.B scratch
+The track is a scratch sound.
+.RE
+.TP
 .B state
 The current track state.
 Valid states are:
@@ -505,12 +630,6 @@ Valid states are:
 .B failed
 The player failed (exited with nonzero status but wasn't scratched).
 .TP
-.B isscratch
-The track is actually a scratch.
-.TP
-.B no_player
-No player could be found for the track.
-.TP
 .B ok
 The track was played without any problems.
 .TP
@@ -520,6 +639,9 @@ The track was scratched.
 .B started
 The track is currently playing.
 .TP
+.B paused
+Track is playing but paused.
+.TP
 .B unplayed
 In the queue, hasn't been played yet.
 .TP
@@ -527,6 +649,9 @@ In the queue, hasn't been played yet.
 The track was terminated because the server is shutting down.
 .RE
 .TP
+.B sofar
+The number of seconds of the track that have been played so far.
+.TP
 .B submitter
 The user that submitted the track.
 .TP
@@ -538,29 +663,27 @@ The time the track was added to the queue.
 .TP
 .B wstat
 The wait status of the player in decimal.
-.SH NOTES
-Times are decimal integers using the server's \fBtime_t\fR.
-.PP
-For file listings, the regexp applies to the basename of the returned file, not
-the whole filename, and letter case is ignored.
-\fBpcrepattern\fR(3) describes the regexp syntax.
 .PP
-Filenames are in UTF-8 even if the collection they come from uses some other
-encoding - if you want to access the real file (in such cases as the filenames
-actually correspond to a real file) you'll have to convert to whatever the
-right encoding is.
+Note that \fBorigin\fR is new with DisOrder 4.3, and obsoletes some old
+\fBstate\fR values.
 .SH "EVENT LOG"
 The event log consists of lines starting with a hexadecimal timestamp and a
-keyword followed by (optionally) parameters.
-The parameters are quoted in the usual DisOrder way.
+keyword followed by (optionally) parameters, which are structured into fields
+in the same way as command and response lines.
 Currently the following keywords are used:
 .TP
+.B adopted \fIID\fR \fIUSERNAME\fR
+\fIUSERNAME\fR adopted track \fIID\fR.
+.TP
 .B completed \fITRACK\fR
 Completed playing \fITRACK\fR
 .TP
 .B failed \fITRACK\fR \fIERROR\fR
 Completed playing \fITRACK\fR with an error status
 .TP
+.B global_pref \fIPREF\fR [\fIVALUE\fR]
+A global preference was set or unset.
+.TP
 .B moved \fIUSERNAME\fR
 User \fIUSERNAME\fR moved some track(s).
 Further details aren't included any more.
@@ -568,6 +691,21 @@ Further details aren't included any more.
 .B playing \fITRACK\fR [\fIUSERNAME\fR]
 Started playing \fITRACK\fR.
 .TP
+.B playlist_created \fIPLAYLIST\fR \fISHARING\fR
+Sent when a playlist is created.
+For private playlists this is intended to be sent only to the owner (but
+this is not currently implemented).
+.TP
+.B playlist_deleted \fIPLAYLIST\fR
+Sent when a playlist is deleted.
+For private playlists this is intended to be sent only to the owner (but
+this is not currently implemented).
+.TP
+.B playlist_modified \fIPLAYLIST\fR \fISHARING\fR
+Sent when a playlist is modified (either its contents or its sharing status).
+For private playlists this is intended to be sent only to the owner (but
+this is not currently implemented).
+.TP
 .B queue \fIQUEUE-ENTRY\fR...
 Added \fITRACK\fR to the queue.
 .TP
@@ -620,6 +758,9 @@ A track started playing.
 .B resume
 The current track was resumed.
 .TP
+.B rights_changed \fIRIGHTS\fR
+User's rights were changed.
+.TP
 .B scratched
 The current track was scratched.
 .PP
@@ -627,6 +768,18 @@ To simplify client implementation, \fBstate\fR commands reflecting the current
 state are sent at the start of the log.
 .RE
 .TP
+.B user_add \fIUSERNAME\fR
+A user was created.
+.TP
+.B user_delete \fIUSERNAME\fR
+A user was deleted.
+.TP
+.B user_edit \fIUSERNAME\fR \fIPROPERTY\fR
+Some property of a user was edited.
+.TP
+.B user_confirm \fIUSERNAME\fR
+A user's login was confirmed (via the web interface).
+.TP
 .B volume \fILEFT\fR \fIRIGHT\fR
 The volume changed.
 .PP
@@ -634,71 +787,100 @@ The volume changed.
 is as defined in
 .B "TRACK INFORMATION"
 above.
-.SH "CHARACTER ENCODING"
-All data sent by both server and client is encoded using UTF-8.
-Moreover it must be valid UTF-8, i.e. non-minimal sequences are not
-permitted, nor are surrogates, nor are code points outside the
-Unicode code space.
-.PP
-There are no particular normalization requirements on either side of the
-protocol.
-The server currently converts internally to NFC, the client must
-normalize the responses returned if it needs some normalized form for further
-processing.
 .PP
-The various characters which divide up lines may not be followed by combining
-characters.
-For instance all of the following are prohibited:
-.TP
-.B o
-LINE FEED followed by a combining character.
-For example the sequence LINE FEED, COMBINING GRAVE ACCENT is never permitted.
-.TP
-.B o
-APOSTROPHE or QUOTATION MARK followed by a combining character when used to
-delimit fields.
-For instance a line starting APOSTROPHE, COMBINING CEDILLA is prohibited.
-.IP
-Note that such sequences are not prohibited when the quote character cannot be
-interpreted as a field delimiter.
-For instance APOSTROPHE, REVERSE SOLIDUS, APOSTROPHE, COMBINING CEDILLA,
-APOSTROPHE would be permitted.
-.TP
-.B o
-REVERSE SOLIDUS (BACKSLASH) followed by a combining character in a quoted
-string when it is the first character of an escape sequence.
-For instance a line starting APOSTROPHE, REVERSE SOLIDUS, COMBINING TILDE
-is prohibited.
-.IP
-As above such sequences are not prohibited when the character is not being used
-to start an escape sequence.
-For instance APOSTROPHE, REVERSE SOLIDUS, REVERSE SOLIDS, COMBINING TILDE,
-APOSTROPHE is permitted.
-.TP
-.B o
-Any of the field-splitting whitespace characters followed by a combining
-character when not part of a quoted field.
-For instance a line starting COLON, SPACE, COMBINING CANDRABINDU is prohibited.
-.IP
-As above non-delimiter uses are fine.
+The \fBuser-*\fR messages are only sent to admin users, and are not sent over
+non-local connections unless \fBremote_userman\fR is enabled.
+.SH "USER PROPERTIES"
+The following user properties are defined:
 .TP
-.B o
-The FULL STOP characters used to quote or delimit a body.
-.PP
-Furthermore none of these characters are permitted to appear in the context of
-a canonical decomposition (i.e. they must still be present when converted to
-NFC).
-In practice however this is not an issue in Unicode 5.0.
+.B created
+The timestamp when the user was created.
+See \fBTIMESTAMPS\fR below.
+This user property cannot be modified.
+.TP
+.B email
+The user's email address.
+.TP
+.B password
+The user's password.
+.TP
+.B rights
+The rights the user has, separated by commas.
+.SH RIGHTS
+The full set of rights are:
+.TP
+.B read
+User can perform read-only operations
+.TP
+.B play
+User can add tracks to the queue
+.TP
+.B "move any"
+User can move any track
+.TP
+.B "move mine"
+User can move their own tracks
+.TP
+.B "move random"
+User can move randomly chosen tracks
+.TP
+.B "remove any"
+User can remove any track
+.TP
+.B "remove mine"
+User can remove their own tracks
+.TP
+.B "remove random"
+User can remove randomly chosen tracks
+.TP
+.B "scratch any"
+User can scratch any track
+.TP
+.B "scratch mine"
+User can scratch their own tracks
+.TP
+.B "scratch random"
+User can scratch randomly chosen tracks
+.TP
+.B volume
+User can change the volume
+.TP
+.B admin
+User can perform admin operations
+.TP
+.B rescan
+User can initiate a rescan
+.TP
+.B register
+User can register new users.
+Normally only the
+.B guest
+user would have this right.
+.TP
+.B userinfo
+User can edit their own userinfo
+.TP
+.B prefs
+User can modify track preferences
+.TP
+.B "global prefs"
+User can modify global preferences
+.TP
+.B pause
+User can pause/resume
+.SH TIMESTAMPS
+A \fItimestamp\fR is a decimal integer giving a number of seconds past the
+epoch, disregarding counting leap seconds.
+The epoch is midnight, January 1 1970, UTC.
+.SH NOTES
+For file listings, the regexp applies to the basename of the returned file, not
+the whole filename, and letter case is ignored.
+\fBpcrepattern\fR(3) describes the regexp syntax.
 .PP
-These rules are consistent with the observation that the split() function is
-essentially a naive ASCII parser.
-The implication is not that these sequences never actually appear in
-the protocol, merely that the server is not required to honor them in
-any useful way nor be consistent between versions: in current
-versions the result will be lines and fields that start with combining
-characters and are not necessarily split where you expect, but future versions
-may remove them, reject them or ignore some or all of the delimiters that have
-following combining characters, and no notice will be given of any change.
+Filenames are in UTF-8 even if the collection they come from uses some other
+encoding - if you want to access the real file (in such cases as the filenames
+actually correspond to a real file) you'll have to convert to whatever the
+right encoding is.
 .SH "SEE ALSO"
 \fBdisorder\fR(1),
 \fBtime\fR(2),