[xiph-commits] r11893 - websites/xspf.org

lgonze at svn.xiph.org lgonze at svn.xiph.org
Sun Oct 8 18:51:10 PDT 2006


Author: lgonze
Date: 2006-10-08 18:51:09 -0700 (Sun, 08 Oct 2006)
New Revision: 11893

Modified:
   websites/xspf.org/draft-xspf-v1.html
Log:
Incorporate numerous improvements and corrections to the text from Ivo Goncalves.  Add acknowledgements to Ivo and Sebastien.

These changes are all along the lines of proofreading, so should not have an impact on whether any implementation is valid. 



Modified: websites/xspf.org/draft-xspf-v1.html
===================================================================
--- websites/xspf.org/draft-xspf-v1.html	2006-10-08 18:22:09 UTC (rev 11892)
+++ websites/xspf.org/draft-xspf-v1.html	2006-10-09 01:51:09 UTC (rev 11893)
@@ -2,23 +2,22 @@
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html lang="en-US" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
 <head>
-<meta name="generator" content="HTML Tidy for Cygwin (vers 1st September 2004), see www.w3.org" />
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>XSPF Version 1</title>
 
 <style type="text/css">
 /*<![CDATA[*/
 a
 {
-  text-decoration: none
+  text-decoration: none;
 }
 a:hover
 {
-  text-decoration: underline
+  text-decoration: underline;
 }
 a:active
 {
-  text-decoration: underline
+  text-decoration: underline;
 }
 body
 {
@@ -112,7 +111,7 @@
   color:#ffffff;
   font-weight: normal;
   text-decoration: none;
-  font-family: chelvetica, arial, sans-serif;
+  font-family: helvetica, arial, sans-serif;
   font-size: 9px
 }
 .link2
@@ -275,6 +274,9 @@
 <b>4.1.1.2.8 <a href="#rfc.section.4.1.1.2.8">date</a></b><br />
 <b>4.1.1.2.9 <a href="#rfc.section.4.1.1.2.9">license</a></b><br />
 <b>4.1.1.2.10 <a href="#rfc.section.4.1.1.2.10">attribution</a></b><br />
+<b>4.1.1.2.10.1 <a href="#rfc.section.4.1.1.2.10.1">elements</a></b><br />
+<b>4.1.1.2.10.1.1 <a href="#rfc.section.4.1.1.2.10.1.1">link</a></b><br />
+<b>4.1.1.2.10.1.2 <a href="#rfc.section.4.1.1.2.10.1.2">identifier</a></b><br />
 <b>4.1.1.2.11 <a href="#rfc.section.4.1.1.2.11">link</a></b><br />
 <b>4.1.1.2.11.1 <a href="#rfc.section.4.1.1.2.11.1">attributes</a></b><br />
 <b>4.1.1.2.11.1.1 <a href="#rfc.section.4.1.1.2.11.1.1">rel</a></b><br />
@@ -340,20 +342,20 @@
 <div><a name="rfc.section.1.p.1" id="rfc.section.1.p.1"></a></div>
 <p>There is no XML format for playlists that can measure up to the standards of the formats for web pages (HTML), weblogs (RSS), and web graphs (RDF/XML). It is evident that there is a need, because XML is the preferred data description language of the moment and as a result the tools and skills to use it are ubiquitous.</p>
 <div><a name="rfc.section.1.p.2" id="rfc.section.1.p.2"></a></div>
-<p>It is also evident that existing playlist formats fall short. ASX (for Windows Media Player) and the iTunes library format are proprietary. ASX resembles XML in that it uses angle brackets, but is not XML by any means. M3U, RAM, and M4U are flat files; QuickTime is binary; Pls is in the Windows .ini format; Gnomoradio RDF is RDF, not XML. SMIL addresses a much larger problem space than the average MP3 player. The timing model of RSS doesn't fit audio and video. Forcing timing models into HTML, as HTML+Time does, creates an unintelligible feature set. Few of these formats are well documented. None of these formats make simple features easy to code and hard features possible. Only one is an open standard. Not one offers playlist interoperability across major vendors.</p>
+<p>It is also evident that existing playlist formats fall short. ASX (for Windows Media Player) and the iTunes library format are proprietary. ASX resembles XML in that it uses angle brackets, but is not XML by any means. M3U, RAM, and M4U are flat files; QuickTime is binary; Pls is in the Windows .ini format; Gnomoradio RDF is RDF, not XML. SMIL addresses a much larger problem space than the average digital music player. The timing model of RSS doesn't fit audio and video. Forcing timing models into HTML, as HTML+Time does, creates an unintelligible feature set. Few of these formats are well documented. None of these formats make simple features easy to code and hard features possible. Only one is an open standard. Not one offers playlist interoperability across major vendors.</p>
 <div><a name="rfc.section.1.p.3" id="rfc.section.1.p.3"></a></div>
-<p>The question for software developers is <em>why should I support this new XML playlist format</em>? The choice is mainly between M3U and SMIL. Almost every MP3 player accepts M3U but also invents an XML playlist format. Inventing a format creates work, for example to study related formats; you should use XSPF to avoid the work. SMIL, on the other hand, is a prescription for a kind of application that is different from an MP3 player -- it describes layouts in time, while XSPF describes concepts common among MP3 players. Given a song with the comment "danceable!", SMIL might have an instruction to write that text in the upper left in a bold sans-serif font, while XSPF would tell an MP3 player that the text is a comment and say nothing about formatting.</p>
+<p>The question for software developers is <em>why should I support this new XML playlist format</em>? The choice is mainly between M3U and SMIL. Almost every digital music player accepts M3U but also invents an XML playlist format. Inventing a format creates work, for example to study related formats; you should use XSPF to avoid the work. SMIL, on the other hand, is a prescription for a kind of application that is different from a typical music player &mdash; it describes layouts in time, while XSPF describes concepts common among music players. Given a song with the comment "danceable!", SMIL might have an instruction to write that text in the upper left in a bold sans-serif font, while XSPF would tell a player that the text is a comment and say nothing about formatting.</p>
 <h2><a name="rfc.section.1.1" id="rfc.section.1.1">1.1</a> Example</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.figure.u.1" id="rfc.figure.u.1"></a></div>
 <p>A very simple document looks like this:</p>
 <pre>
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;playlist version="1" xmlns = "http://xspf.org/ns/0/"&gt;
+&lt;playlist version="1" xmlns="http://xspf.org/ns/0/"&gt;
   &lt;trackList&gt;
-    &lt;track&gt;&lt;location&gt;file:///mp3s/song_1.mp3&lt;/location&gt;&lt;/track&gt;
-    &lt;track&gt;&lt;location&gt;file:///mp3s/song_2.mp3&lt;/location&gt;&lt;/track&gt;
-    &lt;track&gt;&lt;location&gt;file:///mp3s/song_3.mp3&lt;/location&gt;&lt;/track&gt;
+    &lt;track&gt;&lt;location&gt;file:///music/song_1.ogg&lt;/location&gt;&lt;/track&gt;
+    &lt;track&gt;&lt;location&gt;file:///music/song_2.flac&lt;/location&gt;&lt;/track&gt;
+    &lt;track&gt;&lt;location&gt;file:///music/song_3.mp3&lt;/location&gt;&lt;/track&gt;
   &lt;/trackList&gt;
 &lt;/playlist&gt;
                   
@@ -362,10 +364,10 @@
 <p>or this:</p>
 <pre>
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;playlist version="1" xmlns = "http://xspf.org/ns/0/"&gt;
+&lt;playlist version="1" xmlns="http://xspf.org/ns/0/"&gt;
   &lt;trackList&gt;
-    &lt;track&gt;&lt;location&gt;http://example.com/song_1.mp3&lt;/location&gt;&lt;/track&gt;
-    &lt;track&gt;&lt;location&gt;http://example.com/song_2.mp3&lt;/location&gt;&lt;/track&gt;
+    &lt;track&gt;&lt;location&gt;http://example.net/song_1.ogg&lt;/location&gt;&lt;/track&gt;
+    &lt;track&gt;&lt;location&gt;http://example.net/song_2.flac&lt;/location&gt;&lt;/track&gt;
     &lt;track&gt;&lt;location&gt;http://example.com/song_3.mp3&lt;/location&gt;&lt;/track&gt;
   &lt;/trackList&gt;
 &lt;/playlist&gt;
@@ -392,7 +394,7 @@
 <h2><a name="rfc.section.2.2" id="rfc.section.2.2">2.2</a> Acknowledgements</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.2.2.p.1" id="rfc.section.2.2.p.1"></a></div>
-<p>We have benefitted a great deal from the contributions of Dan Brickley, Kevin Marks and Ian C. Rogers, each of whom strongly influenced the shape of the format. We are grateful for comments and feedback from Ryan Shaw, Alf Eaton, Steve Gedikian, Russell Garrett, and Ben Tesch. Special thanks to the developers Tomas Franz&eacute;n (who participated in our work from the very beginning), Jim Garrison, Brander Lien, and Fabricio Zuardi, and to everyone who contributed their time and skill on the mailing list and wiki.</p>
+<p>We have benefitted a great deal from the contributions of Dan Brickley, Kevin Marks and Ian C. Rogers, each of whom strongly influenced the shape of the format. We are grateful for comments and feedback from Ryan Shaw, Alf Eaton, Steve Gedikian, Russell Garrett, and Ben Tesch.  We would like to acknowledge the debt we owe to Sebastian Pipping and Ivo Emanuel Gonçalves, whose contributions to the final revision of the version 1 specification were instrumental.  Special thanks to the developers Tomas Franz&eacute;n (who participated in our work from the very beginning), Jim Garrison, Brander Lien, and Fabricio Zuardi, and to everyone who contributed their time and skill on the mailing list and wiki.</p>
 </div>
 <h2><a name="rfc.section.2.3" id="rfc.section.2.3">2.3</a> terminology</h2>
 <div style="margin-left: 8px;">
@@ -426,7 +428,7 @@
 <h2><a name="rfc.section.3.2" id="rfc.section.3.2">3.2</a> What a playlist is not</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.3.2.p.1" id="rfc.section.3.2.p.1"></a></div>
-<p>The function of a playlist <em>is not</em> to communicate metadata about the composer, song title, etc. Metadata is hard and there are many providers already. We decided that we couldn't compete, and that there was no need for us to try. Moreover, good metadata does not travel well -- every user has to recreate it. Metadata should come from external sources and namespaces like MusicBrainz or Gracenote; this what the XSPF <em>link</em> and <em>meta</em> elements are for.</p>
+<p>The function of a playlist <em>is not</em> to communicate metadata about the composer, song title, etc. Metadata is hard and there are many providers already. We decided that we couldn't compete, and that there was no need for us to try. Moreover, good metadata does not travel well &mdash; every user has to recreate it. Metadata should come from external sources and namespaces like MusicBrainz or Gracenote; this what the XSPF <em>link</em> and <em>meta</em> elements are for.</p>
 <div><a name="rfc.section.3.2.p.2" id="rfc.section.3.2.p.2"></a></div>
 <p>The function of a playlist <em>is not</em> to store derived information about objects that a user has a copy of. A playlist is not a catalog. A catalog is computed across hard data like files; it stores information like filesystem paths and the contents of ID3 tags. This data has no value on any machine but the one on which it originated. Sharing this data would be a privacy and security violation. Software which needs access to this data has no reason to maintain it in a standard format, because it has no reason to allow access to it. Standardizing this data would be fruitless, because there are an endless number of measurements that software might take and store. Derived information belongs in a <em>catalog</em>.</p>
 <div><a name="rfc.section.3.2.p.3" id="rfc.section.3.2.p.3"></a></div>
@@ -437,7 +439,7 @@
 <div><a name="rfc.section.3.3.p.1" id="rfc.section.3.3.p.1"></a></div>
 <p>If there is no reason for a playlist to be shared, there is no need for a new format. Even a buggy format does no damage if it is created and consumed by the same software on the same machine. The need for a new format only comes up when a playlist travels from one machine to another, for example when it is published on the internet.</p>
 <div><a name="rfc.section.3.3.p.2" id="rfc.section.3.3.p.2"></a></div>
-<p>One type of shareability is between different pieces of software on the same machine. It is common for playlists created with one application to not be usable by another application on the same machine because of different or conflicting interpretations of the playlist format. M3U suffers from this very badly, because M3U playlists often reference files according to a base path which changes from application to application. The XSPF group aimed to fix this by providing unambiguous definitions.</p>
+<p>One type of shareability is between different pieces of software on the same machine. It is common for playlists created with one application to not be usable by another application on the same machine, because of different or conflicting interpretations of the playlist format. M3U suffers from this very badly, because M3U playlists often reference files according to a base path which changes from application to application. The XSPF group aimed to fix this by providing unambiguous definitions.</p>
 <div><a name="rfc.section.3.3.p.3" id="rfc.section.3.3.p.3"></a></div>
 <p>The other type of shareability is between different machines. For playlists to be meaningful on different machines, they must be able to identify network resources. Audio and video objects are often abstractions like "movie X by director Y" rather than computer-friendly objects like "whatever file can be gotten from the URI http://foo/x/y". To handle this problem, we have provided support for media objects to be found via queries; XSPF identifiers are <em>fuzzy names</em>.</p>
 </div>
@@ -446,16 +448,16 @@
 <div><a name="rfc.section.3.4.p.1" id="rfc.section.3.4.p.1"></a></div>
 <p>On a surface level you can use XSPF like any other playlist format. Drop a bunch of filenames into an XSPF document, prepend "file://" to each, and you're ready to go. Under the surface there is much more.</p>
 <div><a name="rfc.section.3.4.p.2" id="rfc.section.3.4.p.2"></a></div>
-<p>The guiding design principle was to separate the functionality of a catalog of files from the functionality of a list of songs. Most MP3 players have some sort of cache for file information. This cache stores a list, or catalog, of available files and metadata from ID3 tags and other sources. XSPF is not a catalog format. XSPF exists only to say which songs to play. Almost everything in XSPF is for the purpose of answering the question <em>which resource</em>, rather than the question <em>what is this resource</em>.</p>
+<p>The guiding design principle was to separate the functionality of a catalog of files from the functionality of a list of songs. Most software music players on the PC have some sort of cache for file information. This cache stores a list, or catalog, of available files and metadata from ID3 tags and other sources. XSPF is not a catalog format. XSPF exists only to say which songs to play. Almost everything in XSPF is for the purpose of answering the question <em>which resource</em>, rather than the question <em>what is this resource</em>.</p>
 <div><a name="rfc.section.3.4.p.3" id="rfc.section.3.4.p.3"></a></div>
-<p>If XSPF is not a catalog format, what is it? XSPF is an intermediate format. We expected a new kind of software called a <em>content resolver</em> to do the job of converting XSPF to a plain old list of files or URIs. A content resolver would be smart enough to keep your playlists from breaking when you move your MP3s from /mp3s to /music/mp3. It would be able to figure out that a playlist entry by the artist "Hank Williams" with the title "Your Cheating Heart" could be satisfied by the file /mp3s/hankwilliams/yourcheatingheart.mp3. It might even know how to query the iTunes music store or another online provider to locate and download a missing song.</p>
+<p>If XSPF is not a catalog format, what is it? XSPF is an intermediate format. We expected a new kind of software called a <em>content resolver</em> to do the job of converting XSPF to a plain old list of files or URIs. A content resolver would be smart enough to keep your playlists from breaking when you move your media from /oggs to /music/ogg. It would be able to figure out that a playlist entry by the artist "Hank Williams" with the title "Your Cheating Heart" could be satisfied by the file /vorbis/hankwilliams/yourcheatingheart.ogg. It might even know how to query the iTunes music store or another online provider to locate and download a missing song.</p>
 <div><a name="rfc.section.3.4.p.4" id="rfc.section.3.4.p.4"></a></div>
 <p>The content resolver maintains the catalog of your songs in whatever format it prefers. It might use a flatfile, a file in the Berkeley DB format, or a SQL database. It might use only ID3 metadata, but it might also know how to query MusicBrainz or another metadata service.</p>
 </div>
 <h2><a name="rfc.section.3.5" id="rfc.section.3.5">3.5</a> Fuzzy names</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.3.5.p.1" id="rfc.section.3.5.p.1"></a></div>
-<p>Any given track can be identified in a number of ways. We provided means for absolute identifiers like URIs, filesystem paths and secure hashes, but also for query-based identifiers -- free text fields like artist and work title and numeric fields for song length, all of which together should be enough for a good content resolver to turn into files.</p>
+<p>Any given track can be identified in a number of ways. We provided means for absolute identifiers like URIs, filesystem paths and secure hashes, but also for query-based identifiers &mdash; free text fields like artist and work title and numeric fields for song length, all of which together should be enough for a good content resolver to turn into files.</p>
 </div>
 </div>
 <hr class="noprint" />
@@ -608,10 +610,11 @@
 <p>The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. xspf:playlist elements MAY contain zero or more extension elements.</p>
 <div><a name="rfc.figure.u.7" id="rfc.figure.u.7"></a></div>
 <pre>
-&lt;playlist xmlns:cl="http://example.com"&gt;
+&lt;playlist version="1" xmlns="http://xspf.org/ns/0/" xmlns:cl="http://example.com"&gt;
    &lt;extension application="http://example.com"&gt;
       &lt;cl:clip start="25000" end="34500"/&gt;
    &lt;/extension&gt;
+ &lt;trackList /&gt;
 &lt;/playlist&gt;
                         
 </pre>
@@ -692,7 +695,7 @@
 <h3><a name="rfc.section.4.1.1.2.14.1.1.1.10" id="rfc.section.4.1.1.2.14.1.1.1.10">4.1.1.2.14.1.1.1.10</a> duration</h3>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.4.1.1.2.14.1.1.1.10.p.1" id="rfc.section.4.1.1.2.14.1.1.1.10.p.1"></a></div>
-<p>The time to render a resource, in milliseconds. It MUST be a valid <a href="http://www.w3.org/TR/xmlschema-2/#dt-nonNegativeInteger">XML Schema nonNegativeInteger</a>. This value is only a hint -- different XSPF generators will generate slightly different values. A user-agent MUST NOT use this value to determine the rendering duration, since the data will likely be low quality. xspf:track elements MAY contain exactly one duration element.</p>
+<p>The time to render a resource, in milliseconds. It MUST be a valid <a href="http://www.w3.org/TR/xmlschema-2/#dt-nonNegativeInteger">XML Schema nonNegativeInteger</a>. This value is only a hint &mdash; different XSPF generators will generate slightly different values. A user-agent MUST NOT use this value to determine the rendering duration, since the data will likely be low quality. xspf:track elements MAY contain exactly one duration element.</p>
 </div>
 <h3><a name="rfc.section.4.1.1.2.14.1.1.1.11" id="rfc.section.4.1.1.2.14.1.1.1.11">4.1.1.2.14.1.1.1.11</a> link</h3>
 <div style="margin-left: 8px;">
@@ -746,7 +749,7 @@
 <p>The extension element allows non-XSPF XML to be included in XSPF documents without breaking XSPF validation. The purpose is to allow nested XML, which the meta and link elements do not. xspf:playlist elements MAY contain zero or more extension elements.</p>
 <div><a name="rfc.figure.u.10" id="rfc.figure.u.10"></a></div>
 <pre>
-&lt;playlist xmlns:cl="http://example.com"&gt;
+&lt;playlist version="1" xmlns="http://xspf.org/ns/0/" xmlns:cl="http://example.com"&gt;
    &lt;trackList&gt;
       &lt;track&gt;
          &lt;extension application="http://example.com"&gt;
@@ -801,7 +804,7 @@
 <h2><a name="rfc.section.6.1" id="rfc.section.6.1">6.1</a> Graceful failure</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.6.1.p.1" id="rfc.section.6.1.p.1"></a></div>
-<p>If a media player is unable to render a resource, the show MUST go on. Playlists exist in time; a player that stops processing when it encounters an error is considered broken; it is not conformant with the standard; it must be shunned by the community and made an outcast. Players will frequently encounter resources that they cannot render -- this is not a fatal error unless the player stops processing the playlist.</p>
+<p>If a media player is unable to render a resource, the show MUST go on. Playlists exist in time; a player that stops processing when it encounters an error is considered broken; it is not conformant with the standard; it must be shunned by the community and made an outcast. Players will frequently encounter resources that they cannot render &mdash; this is not a fatal error unless the player stops processing the playlist.</p>
 </div>
 <h2><a name="rfc.section.6.2" id="rfc.section.6.2">6.2</a> Relative paths</h2>
 <div style="margin-left: 8px;">
@@ -834,9 +837,9 @@
 <h2><a name="rfc.section.7.1" id="rfc.section.7.1">7.1</a> Flag player application</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.7.1.p.1" id="rfc.section.7.1.p.1"></a></div>
-<p>Scenario: A user clicks on a link to an audio or video object in their browser. The browser needs to hand the object off to a helper application like an MP3 player. If there is an intermediate playlist object between the browser and helper application, and the browser needs to ensure that the right helper is launched, the playlist needs to be of a type which is mapped to the same helper application.</p>
+<p>Scenario: A user clicks on a link to an audio or video object in their browser. The browser needs to hand the object off to a helper application like a music player. If there is an intermediate playlist object between the browser and helper application, and the browser needs to ensure that the right helper is launched, the playlist needs to be of a type which is mapped to the same helper application.</p>
 <div><a name="rfc.section.7.1.p.2" id="rfc.section.7.1.p.2"></a></div>
-<p>Typical solution: Use a dedicated playlist format for almost every media subtype. For Real audio there is RAM; for MP4 video there is M4U; for MP3 there is M3U; even though RAM, M4U and M3U are almost identical in syntax. The QuickTime format is able to avoid this problem only because the container format and media format are integrated -- a QuickTime file is both a playlist and a media object.</p>
+<p>Typical solution: Use a dedicated playlist format for almost every media subtype. For Real audio there is RAM; for MP4 video there is M4U; for MP3 there is M3U; even though RAM, M4U and M3U are almost identical in syntax. The QuickTime format is able to avoid this problem only because the container format and media format are integrated &mdash; a QuickTime file is both a playlist and a media object.</p>
 <div><a name="rfc.section.7.1.p.3" id="rfc.section.7.1.p.3"></a></div>
 <p>XSPF' solution: The XSPF format does not yet have a solution to this problem, because the working group has not yet tackled it. (Though I can speculate that a content resolver in between the browser and helper application would have the means to do it).</p>
 </div>
@@ -854,7 +857,7 @@
 <div><a name="rfc.section.7.3.p.1" id="rfc.section.7.3.p.1"></a></div>
 <p>Scenario: There is a very large object like a DVD rip. The likelyhood of downloading the entire object in one shot is low, so the object has been split into pieces. The object then needs to be reassembled on the client side.</p>
 <div><a name="rfc.section.7.3.p.2" id="rfc.section.7.3.p.2"></a></div>
-<p>Typical solution: Create a zip file or tarball, which use checksums to ensure integrity of the download; start by sending a playlist which acts a file manifest and allows a user agent to download sub-objects in digestible chunks. However, a manifest has to express paths to related objects according to a filesystem which does not exist on the client, there has to be agreement between the client and server on how to interpret relative paths in a playlist. The problem is that few playlist formats -- only SMIL, to my knowledge -- define the meaning of relative paths in a playlist.</p>
+<p>Typical solution: Create a zip file or tarball, which use checksums to ensure integrity of the download; start by sending a playlist which acts a file manifest and allows a user agent to download sub-objects in digestible chunks. However, a manifest has to express paths to related objects according to a filesystem which does not exist on the client, there has to be agreement between the client and server on how to interpret relative paths in a playlist. The problem is that few playlist formats &mdash; only SMIL, to my knowledge &mdash; define the meaning of relative paths in a playlist.</p>
 <div><a name="rfc.section.7.3.p.3" id="rfc.section.7.3.p.3"></a></div>
 <p>XSPF' solution: XSPF clearly defines the meaning of relative paths according to the rule that a client must interpret relative paths in a playlist according to the XML Base specification or IETF RFC 2396.</p>
 </div>
@@ -870,9 +873,9 @@
 <h2><a name="rfc.section.7.5" id="rfc.section.7.5">7.5</a> Caching derived info</h2>
 <div style="margin-left: 8px;">
 <div><a name="rfc.section.7.5.p.1" id="rfc.section.7.5.p.1"></a></div>
-<p>Scenario: An MP3 player needs to access information about media objects which is too expensive to compute in real time. For a large number of file a user can't wait to re-read ID3 tags, computing SHA1 hashes, or perform a fourier transform for each.</p>
+<p>Scenario: a digital music player needs to access information about media objects which is too expensive to compute in real time. For a large number of files a user can't wait to re-read ID3 tags, computing SHA1 hashes, or perform a fourier transform for each.</p>
 <div><a name="rfc.section.7.5.p.2" id="rfc.section.7.5.p.2"></a></div>
-<p>Typical solution: An MP3 player computes the information once, the first time it encounters an object, then caches the data. The iTunes library format stores computed information like ID3 data in the global catalog and playlist.</p>
+<p>Typical solution: a digital music player computes the information once, the first time it encounters an object, then caches the data. The iTunes library format stores computed information like ID3 data in the global catalog and playlist.</p>
 <div><a name="rfc.section.7.5.p.3" id="rfc.section.7.5.p.3"></a></div>
 <p>XSPF' solution: XSPF defers this information to an external module called the content resolver, and mandates that the information not be included in shared playlists.</p>
 </div>
@@ -881,7 +884,7 @@
 <div><a name="rfc.section.7.6.p.1" id="rfc.section.7.6.p.1"></a></div>
 <p>Scenario: A user needs information about high level concepts like artist and song title rather than machine-level concepts like file name and bit rate. How should artist and song title be communicated, and how should they be stored?</p>
 <div><a name="rfc.section.7.6.p.2" id="rfc.section.7.6.p.2"></a></div>
-<p>Typical solution: Derive the metadata according to an application-defined process like extracting ID3 tags, then then store a copy of the metadata in any playlists that reference a media object. The EXTINF property of the extended M3U format is used in this way.</p>
+<p>Typical solution: Derive the metadata according to an application-defined process like extracting ID3 tags, then store a copy of the metadata in any playlists that reference a media object. The EXTINF property of the extended M3U format is used in this way.</p>
 <div><a name="rfc.section.7.6.p.3" id="rfc.section.7.6.p.3"></a></div>
 <p>XSPF' solution: XSPF defers this functionality to other sources. Metadata is hard; there are already many projects to deal with it, some of which are very good. Metadata is attached to an XSPF track according to whatever syntax an imported vocabulary defines. XML namespaces may be used, but the preferred syntax is the XSPF <em>link</em> and <em>meta</em> elements. (These elements allows us to validate metadata from external sources, while namespaces don't.)</p>
 </div>
@@ -926,7 +929,7 @@
 </tr>
 <tr>
 <td class="right"><b>EMail:</b></td>
-<td><a href="mailto:lucas at gonze.com">lucas at gonze.com</a></td>
+<td><a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;&#108;&#117;&#099;&#097;&#115;&#064;&#103;&#111;&#110;&#122;&#101;&#046;&#099;&#111;&#109;">&#108;&#117;&#099;&#097;&#115;&#064;&#103;&#111;&#110;&#122;&#101;&#046;&#099;&#111;&#109;</a></td>
 </tr>
 <tr>
 <td></td>
@@ -942,7 +945,7 @@
 </tr>
 <tr>
 <td class="right"><b>EMail:</b></td>
-<td><a href="mailto:matt at mafr.de">matt at mafr.de</a></td>
+<td><a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;&#109;&#097;&#116;&#116;&#064;&#109;&#097;&#102;&#114;&#046;&#100;&#101;">&#109;&#097;&#116;&#116;&#064;&#109;&#097;&#102;&#114;&#046;&#100;&#101;</a></td>
 </tr>
 <tr>
 <td></td>
@@ -958,7 +961,7 @@
 </tr>
 <tr>
 <td class="right"><b>EMail:</b></td>
-<td><a href="mailto:rob at eorbit.net">rob at eorbit.net</a></td>
+<td><a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;&#114;&#111;&#098;&#064;&#101;&#111;&#114;&#098;&#105;&#116;&#046;&#110;&#101;&#116;">&#114;&#111;&#098;&#064;&#101;&#111;&#114;&#098;&#105;&#116;&#046;&#110;&#101;&#116;</a></td>
 </tr>
 <tr>
 <td></td>
@@ -974,7 +977,7 @@
 </tr>
 <tr>
 <td class="right"><b>EMail:</b></td>
-<td><a href="mailto:dabrown at yahoo-inc.com">dabrown at yahoo-inc.com</a></td>
+<td><a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;&#100;&#097;&#098;&#114;&#111;&#119;&#110;&#064;&#121;&#097;&#104;&#111;&#111;&#045;&#105;&#110;&#099;&#046;&#099;&#111;&#109;">&#100;&#097;&#098;&#114;&#111;&#119;&#110;&#064;&#121;&#097;&#104;&#111;&#111;&#045;&#105;&#110;&#099;&#046;&#099;&#111;&#109;</a></td>
 </tr>
 <tr>
 <td></td>



More information about the commits mailing list