diff cddb_howto.txt @ 2:5cead4da1db9

Initial import. Seems to work nicely.
author darius
date Wed, 09 Aug 2000 02:18:47 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cddb_howto.txt	Wed Aug 09 02:18:47 2000 +0000
@@ -0,0 +1,1273 @@
+
+	    USE OF CDDB SERVICE IN YOUR SOFTWARE
+	    ------------------------------------
+		  Copyright (c) CDDB, Inc.
+
+		  @(#)cddb.howto	1.27 98/12/09
+
+
+
+	In this document:
+
+	- WHAT IS THE CDDB
+	- CDDB USE RESTRICTIONS
+	- TWO FORMS OF ACCESS TO THE CDDB
+	- CDDB DISCID
+	- REMOTE CDDB ACCESS
+	- CDDB SUBMISSION
+	- QUESTIONS?
+	- APPENDIX A - CDDB DISCID ALGORITHM
+	- APPENDIX B - CDDB FILE FORMAT
+	- APPENDIX C - CDDB SERVER PROTOCOL
+	- APPENDIX D - OFFICIAL CDDB SOFTWARE DISTRIBUTION SITES
+
+
+
+WHAT IS THE CDDB
+----------------
+
+CDDB (CD database) is an information database containing artist, disc
+title, track titles, and other information for digital audio compact
+discs. Over time, this archive has grown to contain a substantial
+collection of CD information and is continuing to grow at a rapid rate.
+This database can be accessed by applications via the CDDB server hosts
+that have been set up on the Internet around the world.
+
+The CDDB data format and the CDDB servers are designed to be open, and
+are used by many client applications requiring CD information. CDDB has
+become the de facto standard for Internet access of compact disc
+information.
+
+
+CDDB USE RESTRICTIONS
+---------------------
+
+Users of CDDB-capable freeware and shareware applications may use the
+public CDDB servers for free. Commercial uses of CDDB data and/or servers
+are subject to negotiations with CDDB Inc. Please write to us at
+licensing@cddb.com for more information.
+
+If you plan to use CDDB and/or the CDDB servers in your software, please
+notify support@cddb.com of your intent. Also, we appreciate that you
+keep us posted as to your development/test progress and release schedules.
+Before you release your CDDB application we must verify that it properly
+implements the CDDB functionality. You must provide us with a copy of your
+software for testing when it is ready. Please do not release your software
+with CDDB functionality until it has been tested.
+
+You must explicitly give credit to CDDB, Inc. in your application, both in
+all documentation that mentions the CDDB functionality in any way, and when
+the product is operating. The exact details should be obtained from
+licensing@cddb.com before you release your software.
+
+
+
+TWO FORMS OF ACCESS TO THE CDDB
+-------------------------------
+
+If you are interested in incorporating the use of CDDB in your
+software, there are two forms of access that you may consider.
+
+1. Local access
+
+   In this mode your software simply attempts to open local files on
+   the computer to access the CDDB.
+
+   You may store the CD information in the CDDB-native format (See
+   Appendix B), or another format of your choice (for example, the
+   Win95 cdplayer.ini format). Users appreciate a the ability to import
+   CDDB data from and export to a variety of formats.
+
+   Note that the CDDB archive is not available for downloads, therefore
+   this mode is only useful to retrieve CD data that is entered by the
+   user and saved to disk.
+
+2. Remote access
+
+   In this mode the software must connect to a CDDB server on the
+   network to access the CDDB.  There is a CDDB server protocol that
+   the software (also known as the "client") must use to converse with
+   the server.
+
+   This mode allows the client application full access to the entire
+   CD database over the Internet.  The data returned is in the CDDB
+   native file format as described in Appendix B.
+
+You may choose to support only remote access mode, or both remote and
+local. We do not recommend a local-only application, since it is not
+very useful.
+
+
+CDDB DISCID
+-----------
+
+Both forms of CDDB access require that the software compute a "disc
+ID" which is an identifier that is used to access the CDDB.  The disc
+ID is a 8-digit hexadecimal (base-16) number, computed using data from
+a CD's Table-of-Contents (TOC) in MSF (Minute Second Frame) form.  The
+algorithm is listed below in Appendix A.
+
+It is crucial that your software compute the disc ID correctly.  If it
+does not generate the correct disc ID, it will not be compatible with CDDB.
+Moreover, if your software submits CDDB entries with bad disc IDs to the
+CDDB archives, it could compromise the integrity of the CDDB.
+
+We suggest installing one of the disc ID checker programs listed on the
+CDDB web page at http://www.cddb.com/downloads, and then testing the disc
+ID code in your software by comparing the disc ID generated by the program
+with that of your software for as large a number of CDs as possible. Bugs
+in disc ID calculation can be subtle, and history shows that it sometimes
+takes hundreds of discs to find problems.
+
+
+REMOTE CDDB ACCESS
+------------------
+
+In order to perform remote access of CDDB servers, your software must be
+able to communicate with a remote CD server system via HTTP. There are a
+number of public CDDB servers operating on the Internet. The current list
+of public servers may be obtained programmatically via the CDDB protocol
+"sites" command. The permanent server site, cddb.cddb.com has been
+established in order to provide a reliable source of server site information
+via the "sites" command. This address may be safely hard-wired into client
+software for this purpose, as it is guaranteed to exist on a permanent basis.
+Furthermore, the "cddb.cgi" program is guaranteed to always reside at the
+following path: /~cddb/cddb.cgi
+
+Thus, the URL for accessing the server at cddb.cddb.com is:
+
+http://cddb.cddb.com/~cddb/cddb.cgi
+
+You should make the CDDB server host (or hosts) user-selectable in your
+software. DO NOT hard-wire the list of CD database servers into your code.
+The list of active servers changes over time.
+
+The CDDB server protocol is described below in Appendix C.
+
+The CDDB entry returned from the server via a "cddb read" command is in
+the format described in Appendix B below.
+
+Some additional notes for accessing CDDB over the Internet:
+
+Your application should always specify the highest documented protocol
+level in the "proto=" field of the HTTP command. The highest level currently
+specified is "4". Lower protocol levels will work, but are only provided
+for compatibility with older CDDB applications. If you do not use the
+highest available protocol level, certain important features will not be
+available to your application.
+
+Make sure to use the proper arguments in the "hello=" command. The user
+and hostname arguments should be that of the user's email address, not
+some fixed hard-coded value. The application name and version should be
+that of your application, not that of another existing application.
+
+We consider the use of the "cddb query" command mandatory for all CDDB
+clients. It is not valid to issue a "cddb read" command without issuing
+a prior "cddb query" and receiving a good response, as it may yield incorrect
+results. In addition, it is required that clients support close matches
+(aka "fuzzy" matches, or response code 211) and multiple exact matches
+(response code 210) in response to a query.
+
+The proper way to handle multiple exact/fuzzy matches is to present the
+entire list of matches to the user and to let the user choose between them.
+Matches are listed in the order of best fit for the user's disc, so they
+should be presented to the user in the order they are listed by the server.
+
+The suggested algorithm for obtaining the list of server sites is
+as follows.  The application should attempt to get the list from
+cddb.cddb.com with the "sites" command the first time the user runs the
+program. After the initial download of the site list, the application
+should periodically attempt to download the site list, or at least
+provide the user with some method of downloading the list on-demand.
+Should the user be unable to subsequently download the list of sites
+due to temporary network perturbation, the application should attempt
+to download the site list from one of the sites in its current list. All
+of the official CDDB server sites will contain a valid list of servers,
+though cddb.cddb.com is the only site which is guaranteed to always exist.
+
+We do strongly suggest that you provide your users with the capability of
+choosing CDDB server sites as described above. However, for some applications
+this may not be feasible. If you do not wish to offer this functionality,
+you may safely hard-code "cddb.cddb.com" in your application as the sole
+CDDB site to access. This will deprive your users of the option to choose
+a site near their locale for optimal response, but that is your choice.
+
+PLEASE NOTE: older versions of the CDDB specification describe two methods
+of accessing the CDDB servers: HTTP mode and CDDBP mode. CDDBP mode is
+being deprecated in favor of HTTP mode, so new applications should be sure
+to only implement the HTTP mode of access. All text describing CDDBP
+mode has been removed from this document.
+
+
+CDDB SUBMISSION
+---------------
+
+Your software may allow users to enter CDDB data and then submit it to the
+CDDB archives. The method of submission is to transmit the entry to the
+database through a CGI program at the following URL:
+
+http://hostname.cddb.com/~cddb/submit.cgi
+
+where "hostname.cddb.com" is one of the hosts listed in the CDDB server
+"sites" command, and also cddb.cddb.com.
+
+Submissions are made through the CGI program as follows. You must only use
+the "POST" method of sending data; "GET" is not supported. There are several
+HTTP "Entity-Header" fields that must be included in the data followed by a
+blank line, followed by the "Entity-Body" (a.k.a the CDDB entry) in the
+format described in Appendix B below. The required header fields are:
+
+Category: CDDB_category
+Discid: CDDB_discid
+User-Email: user@domain
+Submit-Mode: test_or_submit
+Content-Length: length_of_CDDB_entry
+
+Where:
+
+- "CDDB_category" is one of the valid CDDB categories listed by the CDDB
+  server "cddb lscat" command. Invalid categories will result in the entry
+  being rejected.
+
+- "CDDB_discid" is the 8-digit hex CDDB disc ID of the entry as described in
+  the "CDDB Discid" section below. This must be the same disc ID that appears
+  in the "DISCID=" section of the entry being submitted. If not, the entry
+  will be rejected.
+
+- "user@domain" is the valid email address of the user submitting the entry.
+  This is required in case a submission failure notice must be sent to the
+  user.
+
+- "test_or_submit" is the word "test" or "submit" (without the surrounding
+  quotes) to indicate whether the submission is a test submission or a real
+  submission to the database, respectively. See below for an explanation of
+  test submissions.
+
+- "length_of_CDDB_entry" is the size in bytes of the CDDB entry being
+  submitted. This number does not include the length of the header or the
+  blank line separating the HTTP header and the CDDB entry.
+
+There are several additional optional HTTP header fields that may also
+be specified:
+
+Charset: character_set_of_CDDB_entry
+X-Cddbd-Note: message for user
+
+Where:
+
+- "character_set_of_CDDB_entry" is one of ISO-8859-1 or US-ASCII (lower case
+  may be used if desired). This specifies to the CDDB server which character
+  set the CDDB entry has been encoded in. If your application knows the
+  user's character set, then you should specify it here. Only these two
+  character sets are supported currently. DO NOT specify the character set
+  if your application does not have any way of verifying the user's character
+  set (i.e. do not guess; it's better not to specify it at all).
+
+- "message for user" is an arbitrary message to be included at the top of
+  any rejection notice that may be sent to the submitting user.
+
+An example submission showing the HTTP command, "Entity-Header" and "Entity-
+Body" follows:
+
+POST /~cddb/submit.cgi HTTP/1.0
+Category: rock
+Discid: 2a09310a
+User-Email: joe@joeshost.joesdomain.com
+Submit-Mode: submit
+Charset: ISO-8859-1
+X-Cddbd-Note: Problems with Super CD Player? Send email to support@supercd.com.
+Content-Length: 820
+
+# xmcd
+# Copyright (c) 1998 CDDB Inc.
+#
+# Track frame offsets:
+[ data omitted in this example for brevity ]
+PLAYORDER=
+
+Note the blank line between the "Content-Length" header field and the
+"# xmcd" which marks the beginning of the CDDB entry.
+
+When your application submits an entry through the CGI program, it will
+respond with a 3-digit response code indicating whether or not the entry has
+been forwarded to the CDDB server for inclusion in the database, followed
+by a textual description of the response code. For example:
+
+200 OK, submission has been sent.
+400 Internal error: failed to forward submission.
+500 Missing required header information.
+
+These are but a few of the possible responses. See the description of the
+CDDB server protocol in Appendix C for more information on handling response
+codes.
+
+The body of the CDDB entry being submitted should be sent verbatim as
+described in Appendix B. DO NOT encode the data in any way before transmitting
+it; data must be sent as raw text. For example, Windows programmers should not
+use the Windows URL encode function prior to calling the submit CGI program.
+Doing so may lead to corrupt data being sent and also possibly to rejected
+submissions.
+
+You may implement a button or somesuch in your software's user interface
+to initiate submissions. Rejected submissions are automatically returned
+via email to the sender specified in the "User-Email" header field with an
+explanation of the reason for the rejection.
+
+Please do not allow a user to submit CD database entries that have
+completely unfilled contents (i.e., blank information in the disc
+artist/title as well as the track titles).  Please design your client
+with this in mind.  An example minimum requirement that a CD player client
+should meet is listed below:
+
+1. Don't allow the "send" or "submit" feature to be activated if
+   the CD database information form is not edited at all.
+2. Check that the disc artist/title contains something (that the user
+   typed in).
+3. Don't submit a default string if a field is not filled in
+   (e.g. If track 3 is not filled in, submit a blank "TTITLE3=" line.)
+   If you must use a default string, please use "track N" where N
+   is the track number.
+
+Before you release your software, please be sure that it produces
+submissions that adhere to the CDDB file format, and that the frame
+offset, disc length, and disc ID information are correctly computed.
+For testing, please make your software send submissions with the
+"Submit-Mode" HTTP header field set to "test".
+
+CDDB submissions sent in test mode will be sanity-checked by the CDDB server
+and pass/fail confirmation sent back to the submitter, but will not actually
+be deposited in the CD database. Please DO NOT send submisions in "submit"
+mode until your application has been approved by the CDDB support group.
+
+When you feel your application is ready to support submissions, please contact
+us at support@cddb.com. We will provide you with our qualification
+procedure, which involves submitting a number of entries of different types.
+Once qualified, your application will be permitted to submit to the database.
+
+
+QUESTIONS?
+----------
+
+Please send any questions or comments to support@cddb.com.
+
+APPENDIX A - CDDB DISCID ALGORITHM
+----------------------------------
+
+The following is a C code example that illustrates how to generate the
+CDDB disc ID. Examples in other programming languages may be found on
+the CDDB web site at http://www.cddb.com/downloads. A text description
+of the algorithm follows, which should contain the necessary information
+to code the algorithm in any programming language.
+
+
+struct toc {
+	int	min;
+	int	sec;
+	int	frame;
+};
+
+struct toc cdtoc[100];
+
+int
+read_cdtoc_from_drive(void)
+{
+	/* Do whatever is appropriate to read the TOC of the CD
+	 * into the cdtoc[] structure array.
+	 */
+	return (tot_trks);
+}
+
+int
+cddb_sum(int n)
+{
+	int	ret;
+
+	/* For backward compatibility this algorithm must not change */
+
+	ret = 0;
+
+	while (n > 0) {
+		ret = ret + (n % 10);
+		n = n / 10;
+	}
+
+	return (ret);
+}
+
+unsigned long
+cddb_discid(int tot_trks)
+{
+	int	i,
+		t = 0,
+		n = 0;
+
+	/* For backward compatibility this algorithm must not change */
+
+	i = 0;
+
+	while (i < tot_trks) {
+		n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
+		i++;
+	}
+
+	t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
+	    ((cdtoc[0].min * 60) + cdtoc[0].sec);
+
+	return ((n % 0xff) << 24 | t << 8 | tot_trks);
+}
+
+main()
+{
+	int tot_trks;
+
+	tot_trks = read_cdtoc_from_drive();
+	printf("The discid is %08x", cddb_discid(tot_trks));
+}
+
+
+This code assumes that your compiler and architecture support 32-bit
+integers.
+
+The cddb_discid function computes the discid based on the CD's TOC data
+in MSF form.  The frames are ignored for this purpose.  The function is
+passed a parameter of tot_trks (which is the total number of tracks on
+the CD), and returns the discid integer number.
+
+It is assumed that cdtoc[] is an array of data structures (records)
+containing the fields min, sec and frame, which are the minute, second
+and frame offsets (the starting location) of each track.  This
+information is read from the TOC of the CD.  There are actually
+tot_trks + 1 "active" elements in the array, the last one being the
+offset of the lead-out (also known as track 0xAA).
+
+The function loops through each track in the TOC, and for each track
+it takes the (M * 60) + S (total offset in seconds) of the track and
+feeds it to cddb_sum() function, which simply adds the value of each digit
+in the decimal string representation of the number. A running sum of this
+result for each track is kept in the variable n.
+
+At the end of the loop:
+1. t is calculated by subtracting the (M * 60) + S offset of the lead-out
+minus the (M * 60) + S offset of first track (yielding the length of
+the disc in seconds).
+
+2. The result of (n modulo FFh) is left-shifted by 24 bits.
+
+3. t is left shifted by 8.
+
+The bitwise-OR operation of result 2., 3. and the tot_trks number is
+used as the discid.
+
+The discid is represented in hexadecimal form for the purpose of
+xmcd cddb file names and the DISCID= field in the xmcd cddb file itself.
+If the hexadecimal string is less than 8 characters long, it is
+zero-padded to 8 characters (i.e., 3a8f07 becomes 003a8f07).  All
+alpha characters in the string should be in lower case, where
+applicable.
+
+Important note for clients using the MS-Windows MCI interface:
+
+The Windows MCI interface does not provide the MSF location of the
+lead-out.  Thus, you must compute the lead-out location by taking the
+starting position of the last track and add the length of the last track
+to it.  However, the MCI interface returns the length of the last track
+as ONE FRAME SHORT of the actual length found in the CD's TOC.  In most
+cases this does not affect the disc ID generated, because we truncate
+the frame count when computing the disc ID anyway.  However, if the
+lead-out track has an actual a frame count of 0, the computed quantity
+(based on the MSF data returned from the MCI interface) would result in
+the seconds being one short and the frame count be 74.  For example,
+a CD with the last track at an offset of 48m 32s 12f and having a
+track length of 2m 50s 63f has a lead-out offset of 51m 23s 0f. Windows
+MCI incorrectly reports the length as 2m 50s 62f, which would yield a
+lead-out offset of 51m 22s 74f, which causes the resulting truncated
+disc length to be off by one second.  This will cause an incorrect disc
+ID to be generated. You should thus add one frame to the length of the
+last track when computing the location of the lead-out.
+
+The easiest way for Windows clients to compute the lead-out given information
+in MSF format is like this:
+
+(offset_minutes * 60 * 75) + (offset_seconds * 75) + offset_frames +
+(length_minutes * 60 * 75) + (length_seconds * 75) + length_frames + 1 = X
+
+Where X is the offset of the lead-out in frames. To find the lead-out in
+seconds, simply divide by 75 and discard the remainder.
+
+
+APPENDIX B - CDDB FILE FORMAT
+-----------------------------
+
+Database entries must be in the ISO-8859-1 character set (the 8-bit ASCII
+extension also known as "Latin alphabet #1" or ISO-Latin-1). Lines must
+always be terminated by a newline/linefeed (ctrl-J, or 0Ah) character
+or a carriage return character (ctrl-M, or 0Dh) followed by a newline/linefeed
+character. All lines in a database entry must be less than or equal to 80
+bytes in length, including the terminating character(s). Database entries
+with lines that are longer will be considered invalid. There must be no
+blank lines in a database entry.
+
+Lines that begin with # are comments. Comments should appear only at the
+top of the file before any keywords. Comments in the body of the file are
+subject to removal when submitted for inclusion to the database. Comments
+may consist only of characters in the set:
+
+{ tab (09h); space (20h) through tilde (7Eh) inclusive }
+
+Comments should be ignored by applications using the database file, with
+several exceptions described below.
+
+The beginning of the first line in a database entry should consist of the
+string "# xmcd". This string identifies the file as an xmcd format CD
+database file. More text can appear after the "xmcd", but is unnecessary.
+
+The comments should also contain the string "# Track frame offsets:" followed
+by the list of track offsets (the # of frames from the beginning of the CD)
+obtained from the table of contents on the CD itself, with any amount of white
+space between the "#" and the offset. There should be no other comments
+interspersed between the list of track offsets. This list must follow the
+initial identifier string described above. Following the offset list should
+be at least one blank comment.
+
+After the offset list, the following string should appear:
+
+"# Disc length: N seconds"
+
+where the number of seconds in the CD's play length is substituted for "N".
+The number of seconds should be computed by dividing the total number of
+1/75th second frames in the CD by 75 and truncating any remainder. This number
+should not be rounded. 
+
+Note for Windows programmers:
+
+The disc length provided by the Windows MCI interface should not be used here.
+Instead, the lead-out (address of the N+1th track) should be used. Since the
+MCI interface does not provide the address of the lead-out, it should be
+computed by adding the length of the last track to the offset of the last
+track and truncating (not rounding) any remaining fraction of a second. Note
+that the MCI interface yields an incorrect track offset which must be
+corrected by adding one frame to the total frame count when performing the
+disc length computation. For more information, see Appendix A.
+
+After the disc length, the following string should appear:
+
+"# Revision: N"
+
+where the database entry revision (decimal integer) is substituted for "N".
+
+Files missing a revision are assumed to have a revision revision level of 0.
+The revision is used for database management when comparing two entries in
+order to determine which is the most recent. Client programs which allow the
+user to modify a database entry should increment the revision when the user
+submits a modified entry for inclusion in the database.
+
+After the revision, the following string should appear:
+
+"# Submitted via: client_name client_version optional_comments"
+
+where the name of the client submitting the entry is substituted for
+"client_name", the version of the client is substituted for "client_version",
+and "optional_comments" is any sequence of legal characters. Clients which
+allow users to modify database entries read from the database should update
+this string with their own information before submitting.
+
+The "client_version" field has a very specific format which should be observed:
+
+[leading text]version_number[release type][level]
+
+Where:
+
+	Leading text: is any string which does not include numbers.
+	Version number and level: is any (possibly) decimal-separated list of
+	    positive numbers.
+	Release type: is a string of the form:
+	    alpha, a, beta, b, patchlevel, patch, pl
+	Level: is a positive number.
+
+For example:
+
+	release:2.35.1alpha7
+	v4.0PL0
+	2.4
+
+The only required portion of the version field is the version number. The
+other parts are optional, though it is strongly recommended that the release
+type field be filled in if relevant. Strict version checking may be
+applied by software which evaluates the submitter revision, so it is wise
+to make it clear when a release is beta, etc.
+
+Following the comments is the disc data. Each line of disc data consists
+of the format "KEYWORD=data", where "KEYWORD" is a valid keyword as described
+below and "data" is any string consisting of characters in the set:
+
+{ space (20h) through tilde (7Eh) inclusive; no-break-space (A0h) through
+  y-umlaut (FFh) inclusive }
+
+Newlines (0Ah), tabs (09h) and backslashes (2Fh) may be represented by the
+two-character sequences "\n", "\t" and "\\" respectively. Client programs must
+translate these sequences to the appropriate characters when displaying
+disc data.
+
+All of the applicable keywords must be present in the file. They must appear
+in the file in the order shown below. Multiple occurrences of the same keyword
+indicate that the data contained on those lines should be concatenated; this
+applies to any of the textual fields. There is no practical limit to the size
+of any of the textual fields or a database entry itself, though the CDDB server
+software may place a restriction on especially large entries. Valid keywords
+are as follows:
+
+DISCID: The data following this keyword should contain the 8-byte disc ID.
+	indicated by the track offsets in the comment section. The algorithm
+	for generating the disc ID is explained in Appendix A.
+
+DTITLE: Technically, this may consist of any data, but by convention contains
+	the artist and disc title (in that order) separated by a "/" with a
+	single space on either side to separate it from the text. If the "/"
+	is absent, it is implied that the artist and disc title are the same.
+
+TTITLEN:There must be one of these for each track in the CD. The track
+	number should be substituted for the "N", starting with 0. This field
+	should contain the title of the Nth track on the CD.
+
+EXTD:	This field contains the "extended data" for the CD. This is intended
+	to be used as a place for interesting information related to the CD,
+	such as credits, et cetera. If there is more than one of these lines
+	in the file, the data is concatenated. This allows for extended data
+	of arbitrary length.
+
+EXTTN:	This field contains the "extended track data" for track "N". There
+	must be one of these for each track in the CD. The track number
+	should be substituted for the "N", starting with 0. This field is
+	intended to be used as a place for interesting information related to
+	the Nth track, such as the author and other credits, or lyrics. If
+	there is more than one of these lines in the file, the data is
+	concatenated. This allows for extended data of arbitrary length.
+
+PLAYORDER:
+	This field contains a comma-separated list of track numbers which
+	represent a programmed track play order. This field is generally
+	stripped of data in non-local database entries. Applications that
+	submit entries for addition to the main database should strip this
+	keyword of data.
+
+
+An example database entry follows:
+
+# xmcd
+# Copyright (C) 1993-1998  CDDB, Inc.
+#
+# Track frame offsets:
+#	150
+#	47275
+#	76072
+#	89507
+#	117547
+#	136377
+#	157530
+#
+# Disc length: 2663 seconds
+#
+# Revision: 2
+# Submitted via: xmcd 2.3beta PL0
+#
+DISCID=470a6507
+DTITLE=Led Zeppelin / Presence
+TTITLE0=Achilles' Last Stand
+TTITLE1=For Your Life
+TTITLE2=Royal Orleans
+TTITLE3=Nobody's Fault But Mine
+TTITLE4=Candy Store Rock
+TTITLE5=Hots On For Nowhere
+TTITLE6=Tea For One
+EXTD=Producer: Jimmy Page\nExecutive Producer: Peter Gr
+EXTD=ant\n\nUPC: 7567-90329-2\nLABEL: Atlantic Recordin
+EXTD=g Corporation\nYEAR: 1976
+EXTT0=Jimmy Page and Robert Plant
+EXTT1=Jimmy Page and Robert Plant
+EXTT2=John Bonham, John Paul Jones, Jimmy Page and\nRob
+EXTT2=ert Plant
+EXTT3=Jimmy Page and Robert Plant
+EXTT4=Jimmy Page and Robert Plant
+EXTT5=Jimmy Page and Robert Plant
+EXTT6=Jimmy Page and Robert Plant
+PLAYORDER=
+
+Please note that the EXTD section above is split into three pieces. When
+displayed to the user, it should appear like this:
+
+Producer: Jimmy Page
+Executive Producer: Peter Grant
+
+UPC: 7567-90329-2
+LABEL: Atlantic Recording Corporation
+YEAR: 1976
+
+
+APPENDIX C - CDDB SERVER PROTOCOL
+---------------------------------
+
+
+				CDDB Protocol
+				-------------
+
+
+Notation:
+-> : client to server
+<- : server to client
+
+terminating marker: `.' character in the beginning of a line
+
+
+Server response code (three digit code):
+
+First digit:
+1xx	Informative message
+2xx	Command OK
+3xx	Command OK so far, continue
+4xx	Command OK, but cannot be performed for some specified reasons
+5xx	Command unimplemented, incorrect, or program error
+ 
+Second digit:
+x0x	Ready for further commands
+x1x	More server-to-client output follows (until terminating marker)
+x2x	More client-to-server input follows (until terminating marker)
+x3x	Connection will close
+
+Third digit:
+xx[0-9]	Command-specific code
+
+It is best if client applications treat response codes generically when
+possible, rather than having hard-coded "expected" or known codes in the
+application. Here is the suggested method for generically handling error
+codes:
+
+20x - OK, command successful. No action necessary.
+21x - OK, prepare to read data from the server. If unexpected you can
+        disconnect, but it's probably an error on the app's part so retrying
+        in that case is not indicated.
+22x - OK, prepare to give the server data. If unexpected, treat as above.
+23x - OK, connection closing at client's request.
+
+40x - Command failed due to server error or permission problem. Reconnecting
+        to a different server might help.
+41x - Command failed, as above. Information follows regarding the problem,
+        so client should read it and perhaps display it. Reconnect as above.
+43x - Command failed, as 40x. Connection is dropped by the server. Reconnect
+        as 40x.
+
+50x - Command failed due to client error. Retrying in any fashion is probably
+        pointless, because a bug in the client is usually indicated.
+51x - As above, with explanatory information following.
+53x - Some sort of client error forced the server to disconnect. Connection is
+        dropped. Retry might help, because this code is often due to a timeout
+        condition or some other limit that gets reset upon reconnect.
+
+It is okay to ignore the 'x' portion of an error code, but if there are
+specific ones that you want to react to, you can. Just don't preclude
+reacting to general codes at any time. Any 2-level codes that don't appear
+here, such as "42x" are either not possible or will not be seen by clients.
+You might want to have a general default case for these; consider them a
+server error indicating a serious problem.
+
+
+CDDB Protocol Level 1:
+----------------------
+
+Initial client-server handshake:
+--------------------------------
+Note: This command is not used directly in HTTP mode. It is implied by
+the "hello=" field in the HTTP query. See Addendum A below for more
+information. It is described here only as a reference.
+
+Client command:
+-> cddb hello username hostname clientname version
+
+    username:
+	Login name of user.  Example: johndoe
+    hostname:
+	Host name of client.  Example: abc.fubar.com
+    clientname:
+	The name of the connecting client.  Example: xmcd, cda, EasyCD,
+	et cetera. Do not use the name of another client which already
+	exists.
+    version:
+	Version number of client software.  Example: v1.0PL0
+
+Server response:
+<- code hello and welcome username@hostname running clientname version
+
+    code:
+	200	Handshake successful
+	431	Handshake not successful, closing connection
+	402	Already shook hands
+
+
+CDDB lscat:
+----------
+Client command:
+-> cddb lscat
+
+Server response:
+<- code Okay category list follows
+<- category
+<- category
+<- (more categories...)
+<- .
+
+    code:
+	210	Okay category list follows (until terminating marker)
+    category:
+	CD category.  Example: rock
+
+
+CDDB query:
+-----------
+Client command:
+-> cddb query discid ntrks off1 off2 ... nsecs
+
+    discid:
+	CD disc ID number.  Example: f50a3b13
+    ntrks:
+	Total number of tracks on CD.
+    off1, off2, ...:
+	Frame offset of the starting location of each track.
+    nsecs:
+	Total playing length of CD in seconds.
+
+Server response:
+<- code categ discid dtitle
+	or
+<- code close matches found
+<- categ discid dtitle
+<- categ discid dtitle
+<- (more matches...)
+<- .
+
+    code:
+	200	Found exact match
+	211	Found inexact matches, list follows (until terminating marker)
+	202	No match found
+	403	Database entry is corrupt
+	409	No handshake
+    categ:
+	CD category.  Example: rock
+    discid:
+	CD disc ID number of the found entry.  Example: f50a3b13
+    dtitle:
+	The Disc Artist and Disc Title (The DTITLE line).  For example:
+	Pink Floyd / The Dark Side of the Moon
+
+
+CDDB read:
+----------
+Client command:
+-> cddb read categ discid
+
+    categ:
+	CD category.  Example: rock
+    discid:
+	CD disc ID number.  Example: f50a3b13
+
+Server response:
+<- code categ discid
+<- # xmcd CD database file
+<- # ...
+<- (CDDB data...)
+<- .
+	or
+<- code categ discid No such CD entry in database
+
+    code:
+	210	OK, CDDB database entry follows (until terminating marker)
+	401	Specified CDDB entry not found.
+	402	Server error.
+	403	Database entry is corrupt.
+	409	No handshake.
+	417     Access limit exceeded, explanation follows (until marker)
+    categ:
+	CD category.  Example: rock
+    discid:
+	CD disc ID number.  Example: f50a3b13
+
+
+Help information:
+-----------------
+Client command:
+-> help
+	or
+-> help cmd
+
+    cmd:
+	CDDB command.  Example: quit
+
+	or
+
+-> help cmd subcmd
+
+    cmd:
+	CDDB command.  Example: cddb
+    subcmd:
+	CDDB command argument.  Example: query
+
+Server response:
+<- code Help information follows
+<- (help data ...)
+<- .
+	or
+<- code no help information available
+
+    code:
+	210	OK, help information follows (until terminating marker)
+	401	No help information available
+
+
+Message of the day:
+------------------
+Client command:
+-> motd
+
+Server response:
+<- code Last modified: date MOTD follows (until terminating marker)
+<- (message text)
+<- .
+
+    code:
+	210	Last modified: 05/31/96 06:31:14 MOTD follows (until terminating marker)
+	401	No message of the day available
+    date:
+	The date the text of the message of the day was modified. The date
+	appears in the following format:
+
+		05/31/96 06:31:14
+
+	This value may be used by client software as a message timestamp
+	for purposes of determining if it has already been displayed. This
+	format was chosen because it is more easily parsed than the standard
+	ctime() format.
+
+
+Server protocol level:
+----------------------
+Note: This command is not used directly in HTTP mode. It is implied by
+the "proto=" field in the HTTP query. See Addendum A below for more
+information. It is described here only as a reference.
+
+Client command:
+-> proto [level]
+
+    level:
+	The (numerical) protocol level to set the server to.
+
+Server response:
+<- code CDDB protocol level: current cur_level, supported supported_level
+	or
+<- code OK, protocol version now: cur_level
+
+    code:
+	200	CDDB protocol level: current cur_level, supported supp_level
+	201	OK, protocol version now: cur_level
+	501	Illegal protocol level.
+	502	Protocol level already cur_level.
+    cur_level:
+	The current protocol level at which the server is running.
+    supported_level:
+	The maximum supported protocol level.
+
+
+Server sites:
+--------------
+Client command:
+-> sites
+
+Server response:
+<- code OK, site information follows (until terminating `.')
+<- (data)
+<- .
+
+    code:
+	210	Ok, site information follows
+	401	No site information available.
+
+    The data format is as follows:
+	site port latitude longitude description
+
+    The fields are as follows:
+	site:
+	    The Internet address of the remote site.
+	port:
+	    The port at which the server resides on that site.
+	latitude:
+	    The latitude of the server site. The format is as follows:
+		CDDD.MM
+	    Where "C" is the compass direction (N, S), "DDD" is the
+	    degrees, and "MM" is the minutes.
+	longitude:
+	    The longitude of the server site. Format is as above, except
+	    the compass direction must be one of (E, W).
+	description:
+	    A short description of the geographical location of the site.
+
+    Example:
+	ca.us.cddb.com 888 N037.23 W122.01 Fremont, CA USA
+
+
+Server status:
+--------------
+Client command:
+-> stat
+
+Server response:
+<- code OK, status information follows (until terminating `.')
+<- (data)
+<- .
+
+    code:
+	210	Ok, status information follows
+
+    The possible data is as follows:
+	current proto: <current_level>
+	    An integer representing the server's current operating protocol
+	    level.
+	max proto:     <max_level>
+	    The maximum supported protocol level.
+	gets:          <yes | no>
+	    Whether or not the client is allowed to get log information,
+	    according to the string "yes" or "no".
+	updates:       <yes | no>
+	    Whether or not the client is allowed to initiate a database
+	    update, according to the string "yes" or "no".
+	posting:       <yes | no>
+	    Whether or not the client is allowed to post new entries,
+	    according to the string "yes" or "no".
+	quotes:        <yes | no>
+	    Whether or not quoted arguments are enabled, according to
+	    the string "yes" or "no".
+	current users: <num_users>
+	    The number of users currently connected to the server.
+	max users:     <num_max_users>
+	    The number of users that can concurrently connect to the server.
+	strip ext:	<yes | no>
+	    Whether or not extended data is stripped by the server before
+	    presented to the user.
+	Database entries: <num_db_entries>
+	    The total number of entries in the database.
+	Database entries by category:
+	    This field is followed by a list of catgories and the number
+	    of entries in that category. Each entry is of the following
+	    format:
+
+		<white space>catgory: <num_db_entries>
+
+	    The list of entries is terminated by the first line that does
+	    not begin with white space.
+
+	Pending file transmissions:
+	    This field is followed by a list of sites that are fed new
+	    database entries at periodic intervals, and the number of
+	    entries that have yet to be transmitted to that site.
+	    Each entry is of the following format:
+
+		<white space>site: <num_db_entries>
+
+	    The list of entries is terminated by the first line that does
+	    not begin with white space.
+
+	This list may grow as needed, so clients must expect possible
+	unrecognizable data. Also, additional fields may be added to
+	the currently existing lines, although no existing fields will
+	be removed or change position.
+	
+
+Server version:
+---------------
+Client command:
+-> ver
+
+Server response:
+<- code servername version copyright
+	or
+<- code Version information follows
+
+    code:
+	200	Version information.
+	211	OK, version information follows (until terminating marker)
+    version:
+	Server version.  Example: v1.0PL0
+    copyright:
+	Copyright string.  Example: Copyright (c) 1996 Steve Scherf
+
+
+Server users:
+-------------
+Client command:
+-> whom
+
+Server response:
+<- code User list follows
+
+    code:
+	210	OK, user list follows (until terminating marker)
+	401	No user information available.
+
+
+Reserved errors:
+----------------
+
+The following error codes are reserved, and will never be returned as a
+response to a CDDB protocol command. They are intended to be used internally
+by clients that have a need for generating pseudo-responses.
+
+	600-699
+
+
+CDDB Protocol Level 2:
+----------------------
+
+In all respects, protocol level 2 is the same as level 1, with the exceptions
+listed below.
+
+Arguments to commands may be surrounded by double quotes. All characters
+within the quotes, including white space, are included in the argument. All
+white space is replaced by the `_' (2Dh) character by the server. White space
+is defined as ` ' (20h) and `^I' (control-I, or 09h).
+
+Arguments containing quotes that should not be interpreted with the special
+meaning described above should be escaped with a preceding backslash character,
+or '\' (5Ch). If an actual backslash appears in an argument, it should be
+escaped with a preceding backslash. In both cases, the preceding backslash
+will be removed from the input before being interpreted.
+
+
+CDDB Protocol Level 3:
+----------------------
+
+Protocol level 3 is the same as level 2, with the exception listed below.
+
+The output of the "sites" command has changed to meet the folowing description:
+
+    The data format is as follows:
+	site protocol port address latitude longitude description
+
+    The fields are as follows:
+	site:
+	    The Internet address of the remote site.
+	protocol:
+	    The transfer protocol used to access the site. Sites specified
+	    as "cddbp" protocol sites are listed only for compatibility
+	    with older clients. Newer clients should ignore these and
+	    only pay attention to "http" sites.
+	port:
+	    The port at which the server resides on that site.
+	address:
+	    Any additional addressing information needed to access the
+	    server. For example, for HTTP protocol servers, this would be
+	    the path to the CDDB server CGI script. This field will be
+	    "-" if no additional addressing information is needed.
+	latitude:
+	    The latitude of the server site. The format is as follows:
+		CDDD.MM
+	    Where "C" is the compass direction (N, S), "DDD" is the
+	    degrees, and "MM" is the minutes.
+	longitude:
+	    The longitude of the server site. Format is as above, except
+	    the compass direction must be one of (E, W).
+	description:
+	    A short description of the geographical location of the site.
+
+    Example:
+	ca.us.cddb.com cddbp 888 - N037.23 W122.01 Fremont, CA USA
+	ca.us.cddb.com http 80 /~cddb/cddb.cgi N037.23 W122.01 Fremont, CA USA
+
+Note that a site may appear once for each type of protocol it supports for
+accessing the server.
+
+
+CDDB Protocol Level 4:
+----------------------
+
+Protocol level 4 is the same as level 3, with the exception listed below.
+
+The output of the "cddb query" command may result in multiple exact matches.
+A new response code, 210, has been added to indicate that more than one
+exact match has been found.
+
+Server response:
+----------------
+<- code exact matches found
+<- categ discid dtitle
+<- categ discid dtitle
+<- (more matches...)
+<- .
+
+    code:
+        210 Found exact matches, list follows (until terminating marker)
+	417 Database access limit exceeded, explanation follows (until marker)
+
+
+Addendum A: CDDB Protocol Under HTTP:
+-------------------------------------
+
+Accessing a CDDB server CGI script is done by encapsulating the CDDB protocol
+command in the HTTP protocol. The only limitation is that a single command
+may be executed per connection, since HTTP is not truly interactive. For the
+server to be accessed in this way, it must reside on the target host at a
+known URL which is accessible by the host HTTP server. The client program
+must connect to the HTTP server on the target host and issue an HTTP command
+with the appropriate CDDB protocol command encapsulated within.
+
+Commands may be submitted to servers in CGI mode using either the "GET" or
+"POST" HTTP commands. Both methods are supported, and there is no real
+difference between how both are to be used other than the syntactical
+difference between the two methods. The "POST" method may provide the ability
+to issue longer commands, though, depending on the architecture of the HTTP
+server on the remote system.
+
+The server command must be sent as part of the "Request-URI" in the case
+of the "GET" method, and as the "Entity-Body" in the case of the "POST"
+method. In both cases, the command must be of the following form:
+
+cmd=server+command&hello=joe+my.host.com+clientname+version&proto=1
+
+Where the text following the "cmd=" represents the CDDB Protocol command to
+be executed, the text following the "hello=" represents the arguments to
+the "cddb hello" command that is implied by this operation, and the
+text following the "proto=" represents the argument to the "proto" command
+that is implied by this operation.
+
+The "+" characters in the input represent spaces, and will be translated
+by the server before performing the request. Special characters may be
+represented by the sequence "%XX" where "XX" is a two-digit hex number
+corresponding to the ASCII (ISO-8859-1) sequence of that character. The
+"&" characters denote separations between the command, hello and proto
+arguments. Newlines and carriage returns must not appear anywhere in the
+string except at the end.
+
+For example, should user "joe" on system "my.host.com" be running CDclient
+version 2.1, a read request for his currenly playing CD might look like this:
+
+cmd=cddb+read+rock+12345678&hello=joe+my.host.com+CDclient+2.1&proto=4
+
+The server will perform the implied "proto" and "cddb hello" commands,
+and then perform the requested "cddb read" command.
+
+Server response to the command is encapsulated in the HTTP server response,
+and appears in the "Entity-Body". Note that the HTTP response "Entity-Header"
+is not guaranteed to contain a "Content-Length" field, so clients should be
+prepared to accept variable length input. The header will always contain a
+Mime "Content-Type" field which describes the body of data as "text/plain".
+
+Here is an example HTTP-mode request, including the necessary HTTP protocol:
+
+GET /~cddb/cddb.cgi?cmd=help&hello=steve+cddb.com+CDclient+2.1&proto=4 HTTP/1.0
+
+For more detailed information on HTTP and Mime, see RFC 1945 and RFC 1521,
+as well as later amendments to those RFCs.
+
+
+APPENDIX D - OFFICIAL CDDB SOFTWARE DISTRIBUTION SITES
+------------------------------------------------------
+
+All CDDB-related software and other files are distributed via the
+CDDB web page (under "Downloads"):
+
+	http://www.cddb.com/