xspf 0.4 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,9 @@
1
+ 0.4.1
2
+
3
+ * Added the to_rdf method to export XSPF to RDF
4
+
5
+ * Added an example showing how to transform m3u playlists to XSPF
6
+
1
7
  0.4
2
8
 
3
9
  * XSPF document generator (see examples of use)
@@ -149,7 +149,7 @@ table.report tr.dark {
149
149
  </head>
150
150
  <body>
151
151
  <h3>C0 code coverage information</h3>
152
- <p>Generated on Mon Oct 30 22:55:21 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
152
+ <p>Generated on Sun Dec 03 14:34:00 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
153
153
  </p>
154
154
  <hr /> <table class='report'>
155
155
  <thead>
@@ -165,10 +165,10 @@ table.report tr.dark {
165
165
  <tr class='light'>
166
166
  <td>TOTAL</td>
167
167
  <td class='value'>
168
- <tt>480</tt>
168
+ <tt>481</tt>
169
169
  </td>
170
170
  <td class='value'>
171
- <tt>321</tt>
171
+ <tt>322</tt>
172
172
  </td>
173
173
  <td>
174
174
  <table cellspacing='0' cellpadding='0' align='right'>
@@ -208,10 +208,10 @@ table.report tr.dark {
208
208
  <a href='lib-xspf_rb.html'>lib/xspf.rb</a>
209
209
  </td>
210
210
  <td class='value'>
211
- <tt>480</tt>
211
+ <tt>481</tt>
212
212
  </td>
213
213
  <td class='value'>
214
- <tt>321</tt>
214
+ <tt>322</tt>
215
215
  </td>
216
216
  <td>
217
217
  <table cellspacing='0' cellpadding='0' align='right'>
@@ -554,7 +554,7 @@ span.run100 {
554
554
  </head>
555
555
  <body>
556
556
  <h3>C0 code coverage information</h3>
557
- <p>Generated on Mon Oct 30 22:55:21 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
557
+ <p>Generated on Sun Dec 03 14:34:00 CET 2006 with <a href='http://eigenclass.org/hiki.rb?rcov'>rcov 0.7.0</a>
558
558
  </p>
559
559
  <hr /><pre><span class='marked0'>Code reported as executed by Ruby looks like this...
560
560
  </span><span class='marked1'>and this: this line is also marked as covered.
@@ -578,10 +578,10 @@ span.run100 {
578
578
  <a href='lib-xspf_rb.html'>lib/xspf.rb</a>
579
579
  </td>
580
580
  <td class='value'>
581
- <tt>480</tt>
581
+ <tt>481</tt>
582
582
  </td>
583
583
  <td class='value'>
584
- <tt>321</tt>
584
+ <tt>322</tt>
585
585
  </td>
586
586
  <td>
587
587
  <table cellspacing='0' cellpadding='0' align='right'>
@@ -706,397 +706,398 @@ span.run100 {
706
706
  </span><span class="marked1"><a name="line87" /> 87 VERSION_RDOC = 'Version for the XML document or _nil_ if not defined'
707
707
  </span><span class="marked0"><a name="line88" /> 88 ENCODING_RDOC = 'Encoding of the XML document or _nil_ if not defined'
708
708
  </span><span class="inferred1"><a name="line89" /> 89
709
- </span><span class="marked0"><a name="line90" /> 90 OUTPUT_FORMATS = %w{ m3u html smil soundblox }
709
+ </span><span class="marked0"><a name="line90" /> 90 OUTPUT_FORMATS = %w{ m3u html smil rdf soundblox }
710
710
  </span><span class="marked1"><a name="line91" /> 91 M3U_RDOC = 'Creates a .m3u playlist from the XSPF document. This method makes use of the official XSPF to M3U XSLT transformation by Lucas Gonze.'
711
711
  </span><span class="marked0"><a name="line92" /> 92 HTML_RDOC = 'Outputs the playlist as an HTML page. This method makes use of the official XSPF to HTML XSLT transformation by Lucas Gonze.'
712
712
  </span><span class="marked1"><a name="line93" /> 93 SMIL_RDOC = 'Creates a .smil playlist from the XSPF document. This method makes use of the official XSPF to SMIL XSLT transformation by Lucas Gonze.'
713
713
  </span><span class="marked0"><a name="line94" /> 94 SOUNDBLOX_RDOC = 'Creates a SoundBlox playlist from the XSPF document. This method makes use of the official XSPF to SoundBlox XSLT tranformation by Lucas Gonze.'
714
- </span><span class="inferred1"><a name="line95" /> 95
715
- </span><span class="marked0"><a name="line96" /> 96 ATTRIBUTES.each do |attrib|
716
- </span><span class="marked1"><a name="line97" /> 97 MetaGen.add_method(self, attrib, &quot;@xspf.#{attrib}&quot;, eval(attrib.upcase + '_RDOC').to_s )
717
- </span><span class="inferred0"><a name="line98" /> 98 end
718
- </span><span class="inferred1"><a name="line99" /> 99
719
- </span><span class="marked0"><a name="line100" />100 OUTPUT_FORMATS.each do |format|
720
- </span><span class="marked1"><a name="line101" />101 MetaGen.add_output_format(self, format, eval(format.upcase + '_RDOC').to_s )
721
- </span><span class="inferred0"><a name="line102" />102 end
722
- </span><span class="inferred1"><a name="line103" />103
723
- </span><span class="inferred0"><a name="line104" />104 #:startdoc:
724
- </span><span class="inferred1"><a name="line105" />105
725
- </span><span class="inferred0"><a name="line106" />106 # Creates a XSPF object from a file or string (parse mode) or from a hash or nil (generation mode).
726
- </span><span class="inferred1"><a name="line107" />107 #
727
- </span><span class="inferred0"><a name="line108" />108 # Possible keys in the hash: :version, :encoding
728
- </span><span class="marked1"><a name="line109" />109 def initialize(source = nil)
729
- </span><span class="marked0"><a name="line110" />110 if ( source.nil? || source.instance_of?(Hash) ) then
730
- </span><span class="marked1"><a name="line111" />111 @version = if source.nil? || !source.has_key?(:version)
731
- </span><span class="marked0"><a name="line112" />112 '1.0'
732
- </span><span class="inferred1"><a name="line113" />113 else
733
- </span><span class="marked0"><a name="line114" />114 source[:version]
734
- </span><span class="inferred1"><a name="line115" />115 end
735
- </span><span class="marked0"><a name="line116" />116 @encoding = if source.nil? || !source.has_key?(:encoding)
736
- </span><span class="marked1"><a name="line117" />117 'UTF-8'
737
- </span><span class="inferred0"><a name="line118" />118 else
738
- </span><span class="marked1"><a name="line119" />119 source[:encoding]
739
- </span><span class="inferred0"><a name="line120" />120 end
740
- </span><span class="marked1"><a name="line121" />121 @playlist = nil
741
- </span><span class="marked0"><a name="line122" />122 @playlist = if !source.nil? &amp;&amp; source.has_key?(:playlist) then
742
- </span><span class="marked1"><a name="line123" />123 if source[:playlist].instance_of?(XSPF::Playlist)
743
- </span><span class="marked0"><a name="line124" />124 source[:playlist]
744
- </span><span class="inferred1"><a name="line125" />125 else
745
- </span><span class="marked0"><a name="line126" />126 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
746
- </span><span class="inferred1"><a name="line127" />127 end
747
- </span><span class="inferred0"><a name="line128" />128 end
748
- </span><span class="inferred1"><a name="line129" />129
749
- </span><span class="marked0"><a name="line130" />130 elsif ( source.instance_of?(File) || source.instance_of?(String) ) then
750
- </span><span class="marked1"><a name="line131" />131 @xspf = REXML::Document.new(source)
751
- </span><span class="marked0"><a name="line132" />132 ATTRIBUTES.each do |attrib|
752
- </span><span class="marked1"><a name="line133" />133 eval('@' + attrib + '= parse_' + attrib)
753
- </span><span class="inferred0"><a name="line134" />134 end
754
- </span><span class="inferred1"><a name="line135" />135
755
- </span><span class="marked0"><a name="line136" />136 @playlist = XSPF::Playlist.new(self)
756
- </span><span class="inferred1"><a name="line137" />137
757
- </span><span class="inferred0"><a name="line138" />138 else
758
- </span><span class="marked1"><a name="line139" />139 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
759
- </span><span class="inferred0"><a name="line140" />140 end
760
- </span><span class="marked1"><a name="line141" />141 end
761
- </span><span class="inferred0"><a name="line142" />142
762
- </span><span class="inferred1"><a name="line143" />143 # A XSPF::Playlist object
763
- </span><span class="marked0"><a name="line144" />144 def playlist
764
- </span><span class="marked1"><a name="line145" />145 @playlist
765
- </span><span class="marked0"><a name="line146" />146 end
766
- </span><span class="inferred1"><a name="line147" />147
767
- </span><span class="marked0"><a name="line148" />148 def playlist=(value)
768
- </span><span class="marked1"><a name="line149" />149 raise(TypeError, 'The playlist must be an instance of XSPF::Playlist') unless value.instance_of?(XSPF::Playlist)
769
- </span><span class="marked0"><a name="line150" />150 @playlist = value
770
- </span><span class="inferred1"><a name="line151" />151 end
771
- </span><span class="inferred0"><a name="line152" />152
772
- </span><span class="inferred1"><a name="line153" />153 # Exports the XSPF object to XML
773
- </span><span class="marked0"><a name="line154" />154 def to_xml
774
- </span><span class="marked1"><a name="line155" />155 xml = REXML::Document.new
775
- </span><span class="marked0"><a name="line156" />156 xml &lt;&lt; REXML::XMLDecl.new(@version, @encoding)
776
- </span><span class="marked1"><a name="line157" />157 xml &lt;&lt; REXML::Document.new(@playlist.to_xml) unless @playlist.nil?
777
- </span><span class="marked0"><a name="line158" />158 xml.to_s
778
- </span><span class="inferred1"><a name="line159" />159 end
779
- </span><span class="inferred0"><a name="line160" />160
780
- </span><span class="inferred1"><a name="line161" />161 # The &lt;playlist&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
781
- </span><span class="marked0"><a name="line162" />162 protected
782
- </span><span class="marked1"><a name="line163" />163 def playlist_xml
783
- </span><span class="marked0"><a name="line164" />164 @xspf.root
784
- </span><span class="marked1"><a name="line165" />165 end
785
- </span><span class="inferred0"><a name="line166" />166
786
- </span><span class="inferred1"><a name="line167" />167 end
787
- </span><span class="inferred0"><a name="line168" />168
788
- </span><span class="marked1"><a name="line169" />169 class XSPF::Playlist &lt; XSPF
789
- </span><span class="inferred0"><a name="line170" />170
790
- </span><span class="marked1"><a name="line171" />171 attr_reader :playlist
791
- </span><span class="inferred0"><a name="line172" />172
792
- </span><span class="inferred1"><a name="line173" />173 #:stopdoc:
793
- </span><span class="marked0"><a name="line174" />174 ATTRIBUTES = %w{ xmlns version }
794
- </span><span class="marked1"><a name="line175" />175 ELEMENTS = %w{ title creator annotation info location identifier image date license attribution extension }
795
- </span><span class="marked0"><a name="line176" />176 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
796
- </span><span class="marked1"><a name="line177" />177 ATTRIBUTION_CHILD_ELEMENTS = %w{ location identifier }
797
- </span><span class="marked0"><a name="line178" />178 EXTENSION_CHILD_ELEMENTS = %w{ application content }
798
- </span><span class="inferred1"><a name="line179" />179
799
- </span><span class="marked0"><a name="line180" />180 XMLNS_RDOC = 'The XML namespace. It must be http://xspf.org/ns/0/ for a valid XSPF document.'
800
- </span><span class="marked1"><a name="line181" />181 XMLNS_DEFAULT = 'http://xspf.org/ns/0/'
801
- </span><span class="marked0"><a name="line182" />182 VERSION_RDOC = 'The XSPF version. It may be 0 or 1, although 1 is strongly advised.'
802
- </span><span class="marked1"><a name="line183" />183 VERSION_DEFAULT = '1'
803
- </span><span class="marked0"><a name="line184" />184 TITLE_RDOC = 'A human-readable title for the playlist. xspf:playlist elements MAY contain exactly one.'
804
- </span><span class="marked1"><a name="line185" />185 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the playlist. XSPF::Playlist objects MAY contain exactly one.'
805
- </span><span class="marked0"><a name="line186" />186 ANNOTATION_RDOC = 'A human-readable comment on the playlist. This is character data, not HTML, and it may not contain markup. XSPF::Playlist objects elements MAY contain exactly one.'
806
- </span><span class="marked1"><a name="line187" />187 INFO_RDOC = 'URL of a web page to find out more about this playlist. Likely to be homepage of the author, and would be used to find out more about the author and to find more playlists by the author. XSPF::Playlist objects MAY contain exactly one.'
807
- </span><span class="marked0"><a name="line188" />188 LOCATION_RDOC = 'Source URL for this playlist. XSPF::Playlist objects MAY contain exactly one.'
808
- </span><span class="marked1"><a name="line189" />189 IDENTIFIER_RDOC = 'Canonical ID for this playlist. Likely to be a hash or other location-independent name. MUST be a legal URN. XSPF::Playlist objects MAY contain exactly one.'
809
- </span><span class="marked0"><a name="line190" />190 IMAGE_RDOC = 'URL of an image to display if XSPF::Playlist#image return nil. XSPF::Playlist objects MAY contain exactly one.'
810
- </span><span class="marked1"><a name="line191" />191 DATE_RDOC = 'Creation date (not last-modified date) of the playlist, formatted as a XML schema dateTime. XSPF::Playlist objects MAY contain exactly one.'
811
- </span><span class="marked0"><a name="line192" />192 LICENSE_RDOC = 'URL of a resource that describes the license under which this playlist was released. XSPF::Playlist objects MAY contain zero or one license element.'
812
- </span><span class="marked1"><a name="line193" />193 ATTRIBUTION_RDOC = 'An ordered list of URIs. The purpose is to satisfy licenses allowing modification but requiring attribution. If you modify such a playlist, move its XSPF::Playlist#location or XSPF::Playlist#identifier element to the top of the items in the XSPF::Playlist#attribution element. XSPF::Playlist objects MAY contain exactly one attribution element. Please note that currently XSPF for Ruby does not parse the contents of XSPF::Playlist#attribution.'
813
- </span><span class="marked0"><a name="line194" />194 EXTENSION_RDOC = '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 objects MAY contain zero or more extension elements but currently XSPF for Ruby returns only the first one.'
814
- </span><span class="marked1"><a name="line195" />195 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
815
- </span><span class="marked0"><a name="line196" />196 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
816
- </span><span class="marked1"><a name="line197" />197 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
817
- </span><span class="marked0"><a name="line198" />198 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
818
- </span><span class="inferred1"><a name="line199" />199
819
- </span><span class="inferred0"><a name="line200" />200 # FIXME Currently we only return the first &quot;link&quot;
820
- </span><span class="inferred1"><a name="line201" />201 # FIXME Currently we only return the first &quot;meta&quot;
821
- </span><span class="inferred0"><a name="line202" />202 # FIXME Currently we only return the first &quot;extension&quot;
822
- </span><span class="inferred1"><a name="line203" />203 # TODO Parse &quot;attribution&quot;
823
- </span><span class="inferred0"><a name="line204" />204 # TODO Parse &quot;extension&quot;
824
- </span><span class="inferred1"><a name="line205" />205
825
- </span><span class="inferred0"><a name="line206" />206 # Returns the value of the attribute or nil if the attribute is not present
826
- </span><span class="marked1"><a name="line207" />207 ATTRIBUTES.each do |attrib|
827
- </span><span class="marked0"><a name="line208" />208 MetaGen.add_method( self, attrib, &quot;@playlist.root.attributes['#{attrib}']&quot;, eval(attrib.upcase + '_RDOC').to_s )
828
- </span><span class="inferred1"><a name="line209" />209 end
829
- </span><span class="inferred0"><a name="line210" />210
830
- </span><span class="marked1"><a name="line211" />211 ELEMENTS.each do |element|
831
- </span><span class="marked0"><a name="line212" />212 MetaGen.add_method( self, element, &quot;@playlist.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
832
- </span><span class="inferred1"><a name="line213" />213 end
833
- </span><span class="inferred0"><a name="line214" />214
834
- </span><span class="marked1"><a name="line215" />215 ATTRIBUTE_AND_ELEMENT.each do |ae|
835
- </span><span class="marked0"><a name="line216" />216 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@playlist.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
836
- </span><span class="marked1"><a name="line217" />217 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@playlist.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
837
- </span><span class="inferred0"><a name="line218" />218 end
838
- </span><span class="inferred1"><a name="line219" />219
839
- </span><span class="inferred0"><a name="line220" />220 #:startdoc:
840
- </span><span class="inferred1"><a name="line221" />221
841
- </span><span class="inferred0"><a name="line222" />222 # Creates a XSPF::Playlist from a XSPF document (parse mode) or from a hash of values (generation mode)
842
- </span><span class="inferred1"><a name="line223" />223 #
843
- </span><span class="inferred0"><a name="line224" />224 # Possible keys in the hash: :xmlns, :version, :title, :creator, :annotation, :info, :location, :identifier, :image, :date, :license, :attribution, :extension, :link_rel, :link_content, :meta_rel, :meta_content
844
- </span><span class="marked1"><a name="line225" />225 def initialize(source = nil)
845
- </span><span class="inferred0"><a name="line226" />226
846
- </span><span class="marked1"><a name="line227" />227 if ( source.instance_of?(Hash) || source.nil? ) then
847
- </span><span class="inferred0"><a name="line228" />228
848
- </span><span class="marked1"><a name="line229" />229 ATTRIBUTES.each do |attrib|
849
- </span><span class="marked0"><a name="line230" />230 add_instance_variable(source, attrib)
850
- </span><span class="inferred1"><a name="line231" />231 end
851
- </span><span class="inferred0"><a name="line232" />232
852
- </span><span class="marked1"><a name="line233" />233 ELEMENTS.each do |element|
853
- </span><span class="marked0"><a name="line234" />234 add_instance_variable(source, element)
854
- </span><span class="inferred1"><a name="line235" />235 end
855
- </span><span class="inferred0"><a name="line236" />236
856
- </span><span class="marked1"><a name="line237" />237 ATTRIBUTE_AND_ELEMENT.each do |ae|
857
- </span><span class="marked0"><a name="line238" />238 add_instance_variable(source, &quot;#{ae}_content&quot; )
858
- </span><span class="marked1"><a name="line239" />239 add_instance_variable(source, &quot;#{ae}_rel&quot; )
859
- </span><span class="inferred0"><a name="line240" />240 end
860
- </span><span class="inferred1"><a name="line241" />241
861
- </span><span class="marked0"><a name="line242" />242 @tracklist = if ( !source.nil? &amp;&amp; source.has_key?(:tracklist) &amp;&amp; source[:tracklist].instance_of?(XSPF::Tracklist) )
862
- </span><span class="marked1"><a name="line243" />243 source[:tracklist]
863
- </span><span class="inferred0"><a name="line244" />244 else
864
- </span><span class="marked1"><a name="line245" />245 nil
865
- </span><span class="inferred0"><a name="line246" />246 end
866
- </span><span class="inferred1"><a name="line247" />247
867
- </span><span class="marked0"><a name="line248" />248 elsif source.instance_of?(XSPF) then
868
- </span><span class="inferred1"><a name="line249" />249
869
- </span><span class="marked0"><a name="line250" />250 @playlist = source.playlist_xml
870
- </span><span class="inferred1"><a name="line251" />251
871
- </span><span class="marked0"><a name="line252" />252 ATTRIBUTES.each do |attrib|
872
- </span><span class="marked1"><a name="line253" />253 eval('@' + attrib.downcase + '= parse_' + attrib.downcase)
873
- </span><span class="inferred0"><a name="line254" />254 end
874
- </span><span class="inferred1"><a name="line255" />255
875
- </span><span class="marked0"><a name="line256" />256 ELEMENTS.each do |element|
876
- </span><span class="marked1"><a name="line257" />257 eval('@' + element.downcase + '= parse_' + element.downcase)
877
- </span><span class="inferred0"><a name="line258" />258 end
878
- </span><span class="inferred1"><a name="line259" />259
879
- </span><span class="marked0"><a name="line260" />260 ATTRIBUTE_AND_ELEMENT.each do |ae|
880
- </span><span class="marked1"><a name="line261" />261 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
881
- </span><span class="marked0"><a name="line262" />262 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
882
- </span><span class="inferred1"><a name="line263" />263 end
883
- </span><span class="inferred0"><a name="line264" />264
884
- </span><span class="marked1"><a name="line265" />265 @tracklist = XSPF::Tracklist.new(self)
885
- </span><span class="inferred0"><a name="line266" />266
886
- </span><span class="inferred1"><a name="line267" />267 else
887
- </span><span class="marked0"><a name="line268" />268 raise(TypeError, 'You must pass a XSPF object (parsing mode) or a hash (generator mode) as argument to XSPF::Playlist#new')
888
- </span><span class="inferred1"><a name="line269" />269 end
889
- </span><span class="inferred0"><a name="line270" />270
890
- </span><span class="marked1"><a name="line271" />271 end
891
- </span><span class="inferred0"><a name="line272" />272
892
- </span><span class="inferred1"><a name="line273" />273 # A XSPF::Tracklist object
893
- </span><span class="marked0"><a name="line274" />274 def tracklist
894
- </span><span class="marked1"><a name="line275" />275 @tracklist
895
- </span><span class="marked0"><a name="line276" />276 end
896
- </span><span class="inferred1"><a name="line277" />277
897
- </span><span class="marked0"><a name="line278" />278 def tracklist=(value)
898
- </span><span class="marked1"><a name="line279" />279 raise(TypeError, 'The tracklist must be an instance of XSPF::Tracklist') unless value.instance_of?(XSPF::Tracklist)
899
- </span><span class="marked0"><a name="line280" />280 @tracklist = value
900
- </span><span class="inferred1"><a name="line281" />281 end
901
- </span><span class="inferred0"><a name="line282" />282
902
- </span><span class="marked1"><a name="line283" />283 alias :&lt;&lt; :tracklist=
903
- </span><span class="inferred0"><a name="line284" />284
904
- </span><span class="inferred1"><a name="line285" />285 # Exports the XSPF::Playlist to XML (only the &lt;playlist&gt; section)
905
- </span><span class="marked0"><a name="line286" />286 def to_xml
906
- </span><span class="inferred1"><a name="line287" />287
907
- </span><span class="marked0"><a name="line288" />288 xml = REXML::Element.new('playlist')
908
- </span><span class="inferred1"><a name="line289" />289
909
- </span><span class="marked0"><a name="line290" />290 ATTRIBUTES.each do |attrib|
910
- </span><span class="inferred1"><a name="line291" />291 # TODO Sure there is a nicer way to do evaluate this condition...
911
- </span><span class="marked0"><a name="line292" />292 unless eval('@' + attrib.downcase + '.nil?')
912
- </span><span class="marked1"><a name="line293" />293 xml.attributes[attrib] = eval('@' + attrib.downcase)
913
- </span><span class="inferred0"><a name="line294" />294 end
914
- </span><span class="inferred1"><a name="line295" />295 end
915
- </span><span class="inferred0"><a name="line296" />296
916
- </span><span class="marked1"><a name="line297" />297 ELEMENTS.each do |element|
917
- </span><span class="inferred0"><a name="line298" />298 # TODO Sure there is a nicer way to do evaluate this condition...
918
- </span><span class="marked1"><a name="line299" />299 unless eval('@' + element.downcase + '.nil?')
919
- </span><span class="marked0"><a name="line300" />300 el = REXML::Element.new(element)
920
- </span><span class="marked1"><a name="line301" />301 el.add_text( eval('@' + element.downcase) )
921
- </span><span class="marked0"><a name="line302" />302 xml.add_element(el)
922
- </span><span class="inferred1"><a name="line303" />303 end
923
- </span><span class="inferred0"><a name="line304" />304 end
924
- </span><span class="inferred1"><a name="line305" />305
925
- </span><span class="marked0"><a name="line306" />306 ATTRIBUTE_AND_ELEMENT.each do |ae|
926
- </span><span class="inferred1"><a name="line307" />307 # TODO Sure there is a nicer way to do evaluate this condition...
927
- </span><span class="marked0"><a name="line308" />308 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
928
- </span><span class="marked1"><a name="line309" />309 el = REXML::Element.new(ae.downcase)
929
- </span><span class="marked0"><a name="line310" />310 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
930
- </span><span class="marked1"><a name="line311" />311 el.add_text( eval('@' + ae.downcase + '_content') )
931
- </span><span class="marked0"><a name="line312" />312 xml.add_element(el)
932
- </span><span class="inferred1"><a name="line313" />313 end
933
- </span><span class="inferred0"><a name="line314" />314 end
934
- </span><span class="inferred1"><a name="line315" />315
935
- </span><span class="marked0"><a name="line316" />316 xml &lt;&lt; REXML::Document.new(@tracklist.to_xml)
936
- </span><span class="inferred1"><a name="line317" />317
937
- </span><span class="marked0"><a name="line318" />318 xml.to_s
938
- </span><span class="inferred1"><a name="line319" />319
939
- </span><span class="inferred0"><a name="line320" />320 end
940
- </span><span class="inferred1"><a name="line321" />321
941
- </span><span class="inferred0"><a name="line322" />322 # The &lt;trackList&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
942
- </span><span class="marked1"><a name="line323" />323 protected
943
- </span><span class="marked0"><a name="line324" />324 def tracklist_xml
944
- </span><span class="marked1"><a name="line325" />325 @playlist.elements['trackList']
945
- </span><span class="marked0"><a name="line326" />326 end
946
- </span><span class="inferred1"><a name="line327" />327
947
- </span><span class="marked0"><a name="line328" />328 private
948
- </span><span class="marked1"><a name="line329" />329 def add_instance_variable(hash, var)
949
- </span><span class="inferred0"><a name="line330" />330
950
- </span><span class="marked1"><a name="line331" />331 if !hash.nil? &amp;&amp; hash.has_key?(var.downcase.to_sym)
951
- </span><span class="marked0"><a name="line332" />332 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
952
- </span><span class="inferred1"><a name="line333" />333 else
953
- </span><span class="marked0"><a name="line334" />334 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
954
- </span><span class="inferred1"><a name="line335" />335 end
955
- </span><span class="inferred0"><a name="line336" />336
956
- </span><span class="marked1"><a name="line337" />337 end
957
- </span><span class="inferred0"><a name="line338" />338
958
- </span><span class="inferred1"><a name="line339" />339 end
959
- </span><span class="inferred0"><a name="line340" />340
960
- </span><span class="marked1"><a name="line341" />341 class XSPF::Tracklist &lt; XSPF::Playlist
961
- </span><span class="inferred0"><a name="line342" />342
962
- </span><span class="marked1"><a name="line343" />343 attr_reader :tracklist
963
- </span><span class="inferred0"><a name="line344" />344
964
- </span><span class="inferred1"><a name="line345" />345 # Creates a XSPF::Tracklist from a XSPF::Playlist (parse mode) or without parameters (generation mode)
965
- </span><span class="marked0"><a name="line346" />346 def initialize(playlist=nil)
966
- </span><span class="marked1"><a name="line347" />347 if (playlist.instance_of?(Hash) || playlist.nil?) then
967
- </span><span class="marked0"><a name="line348" />348 @tracklist = ''
968
- </span><span class="marked1"><a name="line349" />349 @tracks = []
969
- </span><span class="inferred0"><a name="line350" />350 else
970
- </span><span class="marked1"><a name="line351" />351 @tracklist = playlist.tracklist_xml
971
- </span><span class="marked0"><a name="line352" />352 @tracks = @tracklist.elements.collect { |track| XSPF::Track.new(track) }
972
- </span><span class="inferred1"><a name="line353" />353 end
973
- </span><span class="marked0"><a name="line354" />354 end
974
- </span><span class="inferred1"><a name="line355" />355
975
- </span><span class="inferred0"><a name="line356" />356 # Returns an array XSPF::Track objects
976
- </span><span class="marked1"><a name="line357" />357 def tracks
977
- </span><span class="marked0"><a name="line358" />358 @tracks
978
- </span><span class="marked1"><a name="line359" />359 end
979
- </span><span class="inferred0"><a name="line360" />360
980
- </span><span class="inferred1"><a name="line361" />361 # Adds a new XSPF::Track to the XSPF::Tracklist
981
- </span><span class="marked0"><a name="line362" />362 def &lt;&lt;(track)
982
- </span><span class="marked1"><a name="line363" />363 @tracks &lt;&lt; track
983
- </span><span class="marked0"><a name="line364" />364 end
984
- </span><span class="inferred1"><a name="line365" />365
985
- </span><span class="inferred0"><a name="line366" />366 # Exports the XSPF::Tracklist to XML (only the &lt;trackList&gt; section)
986
- </span><span class="marked1"><a name="line367" />367 def to_xml
987
- </span><span class="marked0"><a name="line368" />368 xml = REXML::Element.new('trackList')
988
- </span><span class="marked1"><a name="line369" />369 @tracks.each { |t| xml &lt;&lt; REXML::Document.new(t.to_xml) }
989
- </span><span class="marked0"><a name="line370" />370 xml.to_s
990
- </span><span class="inferred1"><a name="line371" />371 end
991
- </span><span class="inferred0"><a name="line372" />372
992
- </span><span class="inferred1"><a name="line373" />373 end
993
- </span><span class="inferred0"><a name="line374" />374
994
- </span><span class="marked1"><a name="line375" />375 class XSPF::Track
995
- </span><span class="inferred0"><a name="line376" />376
996
- </span><span class="marked1"><a name="line377" />377 attr_reader :track
997
- </span><span class="inferred0"><a name="line378" />378
998
- </span><span class="inferred1"><a name="line379" />379 #:stopdoc:
999
- </span><span class="marked0"><a name="line380" />380 ELEMENTS = %w{ location identifier title creator annotation info image album trackNum duration extension }
1000
- </span><span class="marked1"><a name="line381" />381 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
1001
- </span><span class="inferred0"><a name="line382" />382
1002
- </span><span class="marked1"><a name="line383" />383 LOCATION_RDOC = 'URL of resource to be rendered. Probably an audio resource, but MAY be any type of resource with a well-known duration, such as video, a SMIL document, or an XSPF document. The duration of the resource defined in this element defines the duration of rendering. XSPF::Track objects MAY contain zero or more location elements, but a user-agent MUST NOT render more than one of the named resources. Currently, XSPF for Ruby returns only the first location.'
1003
- </span><span class="marked0"><a name="line384" />384 IDENTIFIER_RDOC = 'Canonical ID for this resource. Likely to be a hash or other location-independent name, such as a MusicBrainz identifier or isbn URN (if there existed isbn numbers for audio). MUST be a legal URN. XSPF::Track objects elements MAY contain zero or more identifier elements, but currently XSPF for Ruby returns only the first one.'
1004
- </span><span class="marked1"><a name="line385" />385 TITLE_RDOC = 'Human-readable name of the track that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1005
- </span><span class="marked0"><a name="line386" />386 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1006
- </span><span class="marked1"><a name="line387" />387 ANNOTATION_RDOC = 'A human-readable comment on the track. This is character data, not HTML, and it may not contain markup. XSPF::Track objects MAY contain exactly one.'
1007
- </span><span class="marked0"><a name="line388" />388 INFO_RDOC = 'URL of a place where this resource can be bought or more info can be found.'
1008
- </span><span class="marked1"><a name="line389" />389 IMAGE_RDOC = 'URL of an image to display for the duration of the track. XSPF::Track objects MAY contain exactly one.'
1009
- </span><span class="marked0"><a name="line390" />390 ALBUM_RDOC = 'Human-readable name of the collection from which the resource which defines the duration of track rendering comes. For a song originally published as a part of a CD or LP, this would be the title of the original release. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1010
- </span><span class="marked1"><a name="line391" />391 TRACKNUM_RDOC = 'Integer with value greater than zero giving the ordinal position of the media on the XSPF::Track#album. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one. It MUST be a valid XML Schema nonNegativeInteger.'
1011
- </span><span class="marked0"><a name="line392" />392 DURATION_RDOC = 'The time to render a resource, in milliseconds. It MUST be a valid XML Schema nonNegativeInteger. 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 objects MAY contain exactly one duration element.'
1012
- </span><span class="marked1"><a name="line393" />393 EXTENSION_RDOC = '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::Track objects MAY contain zero or more extension elements, but currently XSPF for Ruby returns only the first one.'
1013
- </span><span class="marked0"><a name="line394" />394 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
1014
- </span><span class="marked1"><a name="line395" />395 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1015
- </span><span class="marked0"><a name="line396" />396 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1016
- </span><span class="marked1"><a name="line397" />397 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1017
- </span><span class="inferred0"><a name="line398" />398
1018
- </span><span class="marked1"><a name="line399" />399 ELEMENTS.each do |element|
1019
- </span><span class="marked0"><a name="line400" />400 MetaGen.add_method( self, element, &quot;@track.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
1020
- </span><span class="inferred1"><a name="line401" />401 end
1021
- </span><span class="inferred0"><a name="line402" />402
1022
- </span><span class="marked1"><a name="line403" />403 ATTRIBUTE_AND_ELEMENT.each do |ae|
1023
- </span><span class="marked0"><a name="line404" />404 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@track.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
1024
- </span><span class="marked1"><a name="line405" />405 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@track.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
1025
- </span><span class="inferred0"><a name="line406" />406 end
1026
- </span><span class="inferred1"><a name="line407" />407
1027
- </span><span class="inferred0"><a name="line408" />408 # :startdoc:
1028
- </span><span class="inferred1"><a name="line409" />409
1029
- </span><span class="inferred0"><a name="line410" />410 # Creates a XSPF::Track object from a &lt;track&gt; section of the XSPF document or from a hash of values
1030
- </span><span class="inferred1"><a name="line411" />411 #
1031
- </span><span class="inferred0"><a name="line412" />412 # Possible keys in the hash in generation mode: :location, :identifier, :title, :creator, :annotation, :info, :image, :album, :tracknum, :duration, :extension, :link_rel, :link_content, :meta_rel, :meta_content)
1032
- </span><span class="marked1"><a name="line413" />413 def initialize(tr)
1033
- </span><span class="inferred0"><a name="line414" />414
1034
- </span><span class="marked1"><a name="line415" />415 if tr.instance_of?(Hash)
1035
- </span><span class="inferred0"><a name="line416" />416
1036
- </span><span class="marked1"><a name="line417" />417 ELEMENTS.each do |element|
1037
- </span><span class="marked0"><a name="line418" />418 add_instance_variable(tr, element.downcase)
1038
- </span><span class="inferred1"><a name="line419" />419 end
1039
- </span><span class="inferred0"><a name="line420" />420
1040
- </span><span class="marked1"><a name="line421" />421 ATTRIBUTE_AND_ELEMENT.each do |ae|
1041
- </span><span class="marked0"><a name="line422" />422 add_instance_variable(tr, &quot;#{ae.downcase}_content&quot; )
1042
- </span><span class="marked1"><a name="line423" />423 add_instance_variable(tr, &quot;#{ae.downcase}_rel&quot; )
1043
- </span><span class="inferred0"><a name="line424" />424 end
1044
- </span><span class="inferred1"><a name="line425" />425
1045
- </span><span class="inferred0"><a name="line426" />426 else
1046
- </span><span class="marked1"><a name="line427" />427 @track = tr
1047
- </span><span class="inferred0"><a name="line428" />428
1048
- </span><span class="marked1"><a name="line429" />429 ELEMENTS.each do |element|
1049
- </span><span class="marked0"><a name="line430" />430 eval('@' + element.downcase + '= parse_' + element.downcase)
1050
- </span><span class="inferred1"><a name="line431" />431 end
1051
- </span><span class="inferred0"><a name="line432" />432
1052
- </span><span class="marked1"><a name="line433" />433 ATTRIBUTE_AND_ELEMENT.each do |ae|
1053
- </span><span class="marked0"><a name="line434" />434 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
1054
- </span><span class="marked1"><a name="line435" />435 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
1055
- </span><span class="inferred0"><a name="line436" />436 end
1056
- </span><span class="inferred1"><a name="line437" />437 end
1057
- </span><span class="inferred0"><a name="line438" />438
1058
- </span><span class="marked1"><a name="line439" />439 end
1059
- </span><span class="inferred0"><a name="line440" />440
1060
- </span><span class="inferred1"><a name="line441" />441 # Exports the XSPF::Track to XML (only the &lt;track&gt; section)
1061
- </span><span class="marked0"><a name="line442" />442 def to_xml
1062
- </span><span class="inferred1"><a name="line443" />443
1063
- </span><span class="marked0"><a name="line444" />444 xml = REXML::Element.new('track')
1064
- </span><span class="inferred1"><a name="line445" />445
1065
- </span><span class="marked0"><a name="line446" />446 ELEMENTS.each do |element|
1066
- </span><span class="inferred1"><a name="line447" />447 # TODO Sure there is a nicer way to do evaluate this condition...
1067
- </span><span class="marked0"><a name="line448" />448 unless eval('@' + element.downcase + '.nil?')
1068
- </span><span class="marked1"><a name="line449" />449 el = REXML::Element.new(element)
1069
- </span><span class="marked0"><a name="line450" />450 el.add_text( eval('@' + element.downcase) )
1070
- </span><span class="marked1"><a name="line451" />451 xml.add_element(el)
1071
- </span><span class="inferred0"><a name="line452" />452 end
1072
- </span><span class="inferred1"><a name="line453" />453 end
1073
- </span><span class="inferred0"><a name="line454" />454
1074
- </span><span class="marked1"><a name="line455" />455 ATTRIBUTE_AND_ELEMENT.each do |ae|
1075
- </span><span class="inferred0"><a name="line456" />456 # TODO Sure there is a nicer way to do evaluate this condition...
1076
- </span><span class="marked1"><a name="line457" />457 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
1077
- </span><span class="marked0"><a name="line458" />458 el = REXML::Element.new(ae.downcase)
1078
- </span><span class="marked1"><a name="line459" />459 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
1079
- </span><span class="marked0"><a name="line460" />460 el.add_text( eval('@' + ae.downcase + '_content') )
1080
- </span><span class="marked1"><a name="line461" />461 xml.add_element(el)
1081
- </span><span class="inferred0"><a name="line462" />462 end
1082
- </span><span class="inferred1"><a name="line463" />463 end
1083
- </span><span class="inferred0"><a name="line464" />464
1084
- </span><span class="marked1"><a name="line465" />465 xml.to_s
1085
- </span><span class="inferred0"><a name="line466" />466
1086
- </span><span class="inferred1"><a name="line467" />467 end
1087
- </span><span class="inferred0"><a name="line468" />468
1088
- </span><span class="marked1"><a name="line469" />469 private
1089
- </span><span class="marked0"><a name="line470" />470 def add_instance_variable(hash, var)
1090
- </span><span class="inferred1"><a name="line471" />471
1091
- </span><span class="marked0"><a name="line472" />472 if hash.has_key?(var.downcase.to_sym)
1092
- </span><span class="marked1"><a name="line473" />473 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
1093
- </span><span class="inferred0"><a name="line474" />474 else
1094
- </span><span class="marked1"><a name="line475" />475 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
1095
- </span><span class="inferred0"><a name="line476" />476 end
1096
- </span><span class="inferred1"><a name="line477" />477
1097
- </span><span class="marked0"><a name="line478" />478 end
1098
- </span><span class="inferred1"><a name="line479" />479
1099
- </span><span class="inferred0"><a name="line480" />480 end
714
+ </span><span class="marked1"><a name="line95" /> 95 RDF_RDOC = 'Creates a RDF feed from the XSPF document. This method makes use of the XSPF to RDF XSLT transformation by Libby Miller.'
715
+ </span><span class="inferred0"><a name="line96" /> 96
716
+ </span><span class="marked1"><a name="line97" /> 97 ATTRIBUTES.each do |attrib|
717
+ </span><span class="marked0"><a name="line98" /> 98 MetaGen.add_method(self, attrib, &quot;@xspf.#{attrib}&quot;, eval(attrib.upcase + '_RDOC').to_s )
718
+ </span><span class="inferred1"><a name="line99" /> 99 end
719
+ </span><span class="inferred0"><a name="line100" />100
720
+ </span><span class="marked1"><a name="line101" />101 OUTPUT_FORMATS.each do |format|
721
+ </span><span class="marked0"><a name="line102" />102 MetaGen.add_output_format(self, format, eval(format.upcase + '_RDOC').to_s )
722
+ </span><span class="inferred1"><a name="line103" />103 end
723
+ </span><span class="inferred0"><a name="line104" />104
724
+ </span><span class="inferred1"><a name="line105" />105 #:startdoc:
725
+ </span><span class="inferred0"><a name="line106" />106
726
+ </span><span class="inferred1"><a name="line107" />107 # Creates a XSPF object from a file or string (parse mode) or from a hash or nil (generation mode).
727
+ </span><span class="inferred0"><a name="line108" />108 #
728
+ </span><span class="inferred1"><a name="line109" />109 # Possible keys in the hash: :version, :encoding
729
+ </span><span class="marked0"><a name="line110" />110 def initialize(source = nil)
730
+ </span><span class="marked1"><a name="line111" />111 if ( source.nil? || source.instance_of?(Hash) ) then
731
+ </span><span class="marked0"><a name="line112" />112 @version = if source.nil? || !source.has_key?(:version)
732
+ </span><span class="marked1"><a name="line113" />113 '1.0'
733
+ </span><span class="inferred0"><a name="line114" />114 else
734
+ </span><span class="marked1"><a name="line115" />115 source[:version]
735
+ </span><span class="inferred0"><a name="line116" />116 end
736
+ </span><span class="marked1"><a name="line117" />117 @encoding = if source.nil? || !source.has_key?(:encoding)
737
+ </span><span class="marked0"><a name="line118" />118 'UTF-8'
738
+ </span><span class="inferred1"><a name="line119" />119 else
739
+ </span><span class="marked0"><a name="line120" />120 source[:encoding]
740
+ </span><span class="inferred1"><a name="line121" />121 end
741
+ </span><span class="marked0"><a name="line122" />122 @playlist = nil
742
+ </span><span class="marked1"><a name="line123" />123 @playlist = if !source.nil? &amp;&amp; source.has_key?(:playlist) then
743
+ </span><span class="marked0"><a name="line124" />124 if source[:playlist].instance_of?(XSPF::Playlist)
744
+ </span><span class="marked1"><a name="line125" />125 source[:playlist]
745
+ </span><span class="inferred0"><a name="line126" />126 else
746
+ </span><span class="marked1"><a name="line127" />127 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
747
+ </span><span class="inferred0"><a name="line128" />128 end
748
+ </span><span class="inferred1"><a name="line129" />129 end
749
+ </span><span class="inferred0"><a name="line130" />130
750
+ </span><span class="marked1"><a name="line131" />131 elsif ( source.instance_of?(File) || source.instance_of?(String) ) then
751
+ </span><span class="marked0"><a name="line132" />132 @xspf = REXML::Document.new(source)
752
+ </span><span class="marked1"><a name="line133" />133 ATTRIBUTES.each do |attrib|
753
+ </span><span class="marked0"><a name="line134" />134 eval('@' + attrib + '= parse_' + attrib)
754
+ </span><span class="inferred1"><a name="line135" />135 end
755
+ </span><span class="inferred0"><a name="line136" />136
756
+ </span><span class="marked1"><a name="line137" />137 @playlist = XSPF::Playlist.new(self)
757
+ </span><span class="inferred0"><a name="line138" />138
758
+ </span><span class="inferred1"><a name="line139" />139 else
759
+ </span><span class="marked0"><a name="line140" />140 raise(TypeError, 'You must pass a file/string (parsing mode) or a hash/nothing (generator mode) as argument to XSPF#new')
760
+ </span><span class="inferred1"><a name="line141" />141 end
761
+ </span><span class="marked0"><a name="line142" />142 end
762
+ </span><span class="inferred1"><a name="line143" />143
763
+ </span><span class="inferred0"><a name="line144" />144 # A XSPF::Playlist object
764
+ </span><span class="marked1"><a name="line145" />145 def playlist
765
+ </span><span class="marked0"><a name="line146" />146 @playlist
766
+ </span><span class="marked1"><a name="line147" />147 end
767
+ </span><span class="inferred0"><a name="line148" />148
768
+ </span><span class="marked1"><a name="line149" />149 def playlist=(value)
769
+ </span><span class="marked0"><a name="line150" />150 raise(TypeError, 'The playlist must be an instance of XSPF::Playlist') unless value.instance_of?(XSPF::Playlist)
770
+ </span><span class="marked1"><a name="line151" />151 @playlist = value
771
+ </span><span class="inferred0"><a name="line152" />152 end
772
+ </span><span class="inferred1"><a name="line153" />153
773
+ </span><span class="inferred0"><a name="line154" />154 # Exports the XSPF object to XML
774
+ </span><span class="marked1"><a name="line155" />155 def to_xml
775
+ </span><span class="marked0"><a name="line156" />156 xml = REXML::Document.new
776
+ </span><span class="marked1"><a name="line157" />157 xml &lt;&lt; REXML::XMLDecl.new(@version, @encoding)
777
+ </span><span class="marked0"><a name="line158" />158 xml &lt;&lt; REXML::Document.new(@playlist.to_xml) unless @playlist.nil?
778
+ </span><span class="marked1"><a name="line159" />159 xml.to_s
779
+ </span><span class="inferred0"><a name="line160" />160 end
780
+ </span><span class="inferred1"><a name="line161" />161
781
+ </span><span class="inferred0"><a name="line162" />162 # The &lt;playlist&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
782
+ </span><span class="marked1"><a name="line163" />163 protected
783
+ </span><span class="marked0"><a name="line164" />164 def playlist_xml
784
+ </span><span class="marked1"><a name="line165" />165 @xspf.root
785
+ </span><span class="marked0"><a name="line166" />166 end
786
+ </span><span class="inferred1"><a name="line167" />167
787
+ </span><span class="inferred0"><a name="line168" />168 end
788
+ </span><span class="inferred1"><a name="line169" />169
789
+ </span><span class="marked0"><a name="line170" />170 class XSPF::Playlist &lt; XSPF
790
+ </span><span class="inferred1"><a name="line171" />171
791
+ </span><span class="marked0"><a name="line172" />172 attr_reader :playlist
792
+ </span><span class="inferred1"><a name="line173" />173
793
+ </span><span class="inferred0"><a name="line174" />174 #:stopdoc:
794
+ </span><span class="marked1"><a name="line175" />175 ATTRIBUTES = %w{ xmlns version }
795
+ </span><span class="marked0"><a name="line176" />176 ELEMENTS = %w{ title creator annotation info location identifier image date license attribution extension }
796
+ </span><span class="marked1"><a name="line177" />177 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
797
+ </span><span class="marked0"><a name="line178" />178 ATTRIBUTION_CHILD_ELEMENTS = %w{ location identifier }
798
+ </span><span class="marked1"><a name="line179" />179 EXTENSION_CHILD_ELEMENTS = %w{ application content }
799
+ </span><span class="inferred0"><a name="line180" />180
800
+ </span><span class="marked1"><a name="line181" />181 XMLNS_RDOC = 'The XML namespace. It must be http://xspf.org/ns/0/ for a valid XSPF document.'
801
+ </span><span class="marked0"><a name="line182" />182 XMLNS_DEFAULT = 'http://xspf.org/ns/0/'
802
+ </span><span class="marked1"><a name="line183" />183 VERSION_RDOC = 'The XSPF version. It may be 0 or 1, although 1 is strongly advised.'
803
+ </span><span class="marked0"><a name="line184" />184 VERSION_DEFAULT = '1'
804
+ </span><span class="marked1"><a name="line185" />185 TITLE_RDOC = 'A human-readable title for the playlist. xspf:playlist elements MAY contain exactly one.'
805
+ </span><span class="marked0"><a name="line186" />186 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the playlist. XSPF::Playlist objects MAY contain exactly one.'
806
+ </span><span class="marked1"><a name="line187" />187 ANNOTATION_RDOC = 'A human-readable comment on the playlist. This is character data, not HTML, and it may not contain markup. XSPF::Playlist objects elements MAY contain exactly one.'
807
+ </span><span class="marked0"><a name="line188" />188 INFO_RDOC = 'URL of a web page to find out more about this playlist. Likely to be homepage of the author, and would be used to find out more about the author and to find more playlists by the author. XSPF::Playlist objects MAY contain exactly one.'
808
+ </span><span class="marked1"><a name="line189" />189 LOCATION_RDOC = 'Source URL for this playlist. XSPF::Playlist objects MAY contain exactly one.'
809
+ </span><span class="marked0"><a name="line190" />190 IDENTIFIER_RDOC = 'Canonical ID for this playlist. Likely to be a hash or other location-independent name. MUST be a legal URN. XSPF::Playlist objects MAY contain exactly one.'
810
+ </span><span class="marked1"><a name="line191" />191 IMAGE_RDOC = 'URL of an image to display if XSPF::Playlist#image return nil. XSPF::Playlist objects MAY contain exactly one.'
811
+ </span><span class="marked0"><a name="line192" />192 DATE_RDOC = 'Creation date (not last-modified date) of the playlist, formatted as a XML schema dateTime. XSPF::Playlist objects MAY contain exactly one.'
812
+ </span><span class="marked1"><a name="line193" />193 LICENSE_RDOC = 'URL of a resource that describes the license under which this playlist was released. XSPF::Playlist objects MAY contain zero or one license element.'
813
+ </span><span class="marked0"><a name="line194" />194 ATTRIBUTION_RDOC = 'An ordered list of URIs. The purpose is to satisfy licenses allowing modification but requiring attribution. If you modify such a playlist, move its XSPF::Playlist#location or XSPF::Playlist#identifier element to the top of the items in the XSPF::Playlist#attribution element. XSPF::Playlist objects MAY contain exactly one attribution element. Please note that currently XSPF for Ruby does not parse the contents of XSPF::Playlist#attribution.'
814
+ </span><span class="marked1"><a name="line195" />195 EXTENSION_RDOC = '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 objects MAY contain zero or more extension elements but currently XSPF for Ruby returns only the first one.'
815
+ </span><span class="marked0"><a name="line196" />196 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
816
+ </span><span class="marked1"><a name="line197" />197 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#link_rel and XSPF::Playlist#link_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
817
+ </span><span class="marked0"><a name="line198" />198 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
818
+ </span><span class="marked1"><a name="line199" />199 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Playlist#meta_rel and XSPF::Playlist#meta_content respectively. XSPF::Playlist objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
819
+ </span><span class="inferred0"><a name="line200" />200
820
+ </span><span class="inferred1"><a name="line201" />201 # FIXME Currently we only return the first &quot;link&quot;
821
+ </span><span class="inferred0"><a name="line202" />202 # FIXME Currently we only return the first &quot;meta&quot;
822
+ </span><span class="inferred1"><a name="line203" />203 # FIXME Currently we only return the first &quot;extension&quot;
823
+ </span><span class="inferred0"><a name="line204" />204 # TODO Parse &quot;attribution&quot;
824
+ </span><span class="inferred1"><a name="line205" />205 # TODO Parse &quot;extension&quot;
825
+ </span><span class="inferred0"><a name="line206" />206
826
+ </span><span class="inferred1"><a name="line207" />207 # Returns the value of the attribute or nil if the attribute is not present
827
+ </span><span class="marked0"><a name="line208" />208 ATTRIBUTES.each do |attrib|
828
+ </span><span class="marked1"><a name="line209" />209 MetaGen.add_method( self, attrib, &quot;@playlist.root.attributes['#{attrib}']&quot;, eval(attrib.upcase + '_RDOC').to_s )
829
+ </span><span class="inferred0"><a name="line210" />210 end
830
+ </span><span class="inferred1"><a name="line211" />211
831
+ </span><span class="marked0"><a name="line212" />212 ELEMENTS.each do |element|
832
+ </span><span class="marked1"><a name="line213" />213 MetaGen.add_method( self, element, &quot;@playlist.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
833
+ </span><span class="inferred0"><a name="line214" />214 end
834
+ </span><span class="inferred1"><a name="line215" />215
835
+ </span><span class="marked0"><a name="line216" />216 ATTRIBUTE_AND_ELEMENT.each do |ae|
836
+ </span><span class="marked1"><a name="line217" />217 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@playlist.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
837
+ </span><span class="marked0"><a name="line218" />218 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@playlist.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
838
+ </span><span class="inferred1"><a name="line219" />219 end
839
+ </span><span class="inferred0"><a name="line220" />220
840
+ </span><span class="inferred1"><a name="line221" />221 #:startdoc:
841
+ </span><span class="inferred0"><a name="line222" />222
842
+ </span><span class="inferred1"><a name="line223" />223 # Creates a XSPF::Playlist from a XSPF document (parse mode) or from a hash of values (generation mode)
843
+ </span><span class="inferred0"><a name="line224" />224 #
844
+ </span><span class="inferred1"><a name="line225" />225 # Possible keys in the hash: :xmlns, :version, :title, :creator, :annotation, :info, :location, :identifier, :image, :date, :license, :attribution, :extension, :link_rel, :link_content, :meta_rel, :meta_content
845
+ </span><span class="marked0"><a name="line226" />226 def initialize(source = nil)
846
+ </span><span class="inferred1"><a name="line227" />227
847
+ </span><span class="marked0"><a name="line228" />228 if ( source.instance_of?(Hash) || source.nil? ) then
848
+ </span><span class="inferred1"><a name="line229" />229
849
+ </span><span class="marked0"><a name="line230" />230 ATTRIBUTES.each do |attrib|
850
+ </span><span class="marked1"><a name="line231" />231 add_instance_variable(source, attrib)
851
+ </span><span class="inferred0"><a name="line232" />232 end
852
+ </span><span class="inferred1"><a name="line233" />233
853
+ </span><span class="marked0"><a name="line234" />234 ELEMENTS.each do |element|
854
+ </span><span class="marked1"><a name="line235" />235 add_instance_variable(source, element)
855
+ </span><span class="inferred0"><a name="line236" />236 end
856
+ </span><span class="inferred1"><a name="line237" />237
857
+ </span><span class="marked0"><a name="line238" />238 ATTRIBUTE_AND_ELEMENT.each do |ae|
858
+ </span><span class="marked1"><a name="line239" />239 add_instance_variable(source, &quot;#{ae}_content&quot; )
859
+ </span><span class="marked0"><a name="line240" />240 add_instance_variable(source, &quot;#{ae}_rel&quot; )
860
+ </span><span class="inferred1"><a name="line241" />241 end
861
+ </span><span class="inferred0"><a name="line242" />242
862
+ </span><span class="marked1"><a name="line243" />243 @tracklist = if ( !source.nil? &amp;&amp; source.has_key?(:tracklist) &amp;&amp; source[:tracklist].instance_of?(XSPF::Tracklist) )
863
+ </span><span class="marked0"><a name="line244" />244 source[:tracklist]
864
+ </span><span class="inferred1"><a name="line245" />245 else
865
+ </span><span class="marked0"><a name="line246" />246 nil
866
+ </span><span class="inferred1"><a name="line247" />247 end
867
+ </span><span class="inferred0"><a name="line248" />248
868
+ </span><span class="marked1"><a name="line249" />249 elsif source.instance_of?(XSPF) then
869
+ </span><span class="inferred0"><a name="line250" />250
870
+ </span><span class="marked1"><a name="line251" />251 @playlist = source.playlist_xml
871
+ </span><span class="inferred0"><a name="line252" />252
872
+ </span><span class="marked1"><a name="line253" />253 ATTRIBUTES.each do |attrib|
873
+ </span><span class="marked0"><a name="line254" />254 eval('@' + attrib.downcase + '= parse_' + attrib.downcase)
874
+ </span><span class="inferred1"><a name="line255" />255 end
875
+ </span><span class="inferred0"><a name="line256" />256
876
+ </span><span class="marked1"><a name="line257" />257 ELEMENTS.each do |element|
877
+ </span><span class="marked0"><a name="line258" />258 eval('@' + element.downcase + '= parse_' + element.downcase)
878
+ </span><span class="inferred1"><a name="line259" />259 end
879
+ </span><span class="inferred0"><a name="line260" />260
880
+ </span><span class="marked1"><a name="line261" />261 ATTRIBUTE_AND_ELEMENT.each do |ae|
881
+ </span><span class="marked0"><a name="line262" />262 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
882
+ </span><span class="marked1"><a name="line263" />263 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
883
+ </span><span class="inferred0"><a name="line264" />264 end
884
+ </span><span class="inferred1"><a name="line265" />265
885
+ </span><span class="marked0"><a name="line266" />266 @tracklist = XSPF::Tracklist.new(self)
886
+ </span><span class="inferred1"><a name="line267" />267
887
+ </span><span class="inferred0"><a name="line268" />268 else
888
+ </span><span class="marked1"><a name="line269" />269 raise(TypeError, 'You must pass a XSPF object (parsing mode) or a hash (generator mode) as argument to XSPF::Playlist#new')
889
+ </span><span class="inferred0"><a name="line270" />270 end
890
+ </span><span class="inferred1"><a name="line271" />271
891
+ </span><span class="marked0"><a name="line272" />272 end
892
+ </span><span class="inferred1"><a name="line273" />273
893
+ </span><span class="inferred0"><a name="line274" />274 # A XSPF::Tracklist object
894
+ </span><span class="marked1"><a name="line275" />275 def tracklist
895
+ </span><span class="marked0"><a name="line276" />276 @tracklist
896
+ </span><span class="marked1"><a name="line277" />277 end
897
+ </span><span class="inferred0"><a name="line278" />278
898
+ </span><span class="marked1"><a name="line279" />279 def tracklist=(value)
899
+ </span><span class="marked0"><a name="line280" />280 raise(TypeError, 'The tracklist must be an instance of XSPF::Tracklist') unless value.instance_of?(XSPF::Tracklist)
900
+ </span><span class="marked1"><a name="line281" />281 @tracklist = value
901
+ </span><span class="inferred0"><a name="line282" />282 end
902
+ </span><span class="inferred1"><a name="line283" />283
903
+ </span><span class="marked0"><a name="line284" />284 alias :&lt;&lt; :tracklist=
904
+ </span><span class="inferred1"><a name="line285" />285
905
+ </span><span class="inferred0"><a name="line286" />286 # Exports the XSPF::Playlist to XML (only the &lt;playlist&gt; section)
906
+ </span><span class="marked1"><a name="line287" />287 def to_xml
907
+ </span><span class="inferred0"><a name="line288" />288
908
+ </span><span class="marked1"><a name="line289" />289 xml = REXML::Element.new('playlist')
909
+ </span><span class="inferred0"><a name="line290" />290
910
+ </span><span class="marked1"><a name="line291" />291 ATTRIBUTES.each do |attrib|
911
+ </span><span class="inferred0"><a name="line292" />292 # TODO Sure there is a nicer way to do evaluate this condition...
912
+ </span><span class="marked1"><a name="line293" />293 unless eval('@' + attrib.downcase + '.nil?')
913
+ </span><span class="marked0"><a name="line294" />294 xml.attributes[attrib] = eval('@' + attrib.downcase)
914
+ </span><span class="inferred1"><a name="line295" />295 end
915
+ </span><span class="inferred0"><a name="line296" />296 end
916
+ </span><span class="inferred1"><a name="line297" />297
917
+ </span><span class="marked0"><a name="line298" />298 ELEMENTS.each do |element|
918
+ </span><span class="inferred1"><a name="line299" />299 # TODO Sure there is a nicer way to do evaluate this condition...
919
+ </span><span class="marked0"><a name="line300" />300 unless eval('@' + element.downcase + '.nil?')
920
+ </span><span class="marked1"><a name="line301" />301 el = REXML::Element.new(element)
921
+ </span><span class="marked0"><a name="line302" />302 el.add_text( eval('@' + element.downcase) )
922
+ </span><span class="marked1"><a name="line303" />303 xml.add_element(el)
923
+ </span><span class="inferred0"><a name="line304" />304 end
924
+ </span><span class="inferred1"><a name="line305" />305 end
925
+ </span><span class="inferred0"><a name="line306" />306
926
+ </span><span class="marked1"><a name="line307" />307 ATTRIBUTE_AND_ELEMENT.each do |ae|
927
+ </span><span class="inferred0"><a name="line308" />308 # TODO Sure there is a nicer way to do evaluate this condition...
928
+ </span><span class="marked1"><a name="line309" />309 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
929
+ </span><span class="marked0"><a name="line310" />310 el = REXML::Element.new(ae.downcase)
930
+ </span><span class="marked1"><a name="line311" />311 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
931
+ </span><span class="marked0"><a name="line312" />312 el.add_text( eval('@' + ae.downcase + '_content') )
932
+ </span><span class="marked1"><a name="line313" />313 xml.add_element(el)
933
+ </span><span class="inferred0"><a name="line314" />314 end
934
+ </span><span class="inferred1"><a name="line315" />315 end
935
+ </span><span class="inferred0"><a name="line316" />316
936
+ </span><span class="marked1"><a name="line317" />317 xml &lt;&lt; REXML::Document.new(@tracklist.to_xml)
937
+ </span><span class="inferred0"><a name="line318" />318
938
+ </span><span class="marked1"><a name="line319" />319 xml.to_s
939
+ </span><span class="inferred0"><a name="line320" />320
940
+ </span><span class="inferred1"><a name="line321" />321 end
941
+ </span><span class="inferred0"><a name="line322" />322
942
+ </span><span class="inferred1"><a name="line323" />323 # The &lt;trackList&gt; section of the XSPF document (outputs XML code). This method is only used while parsing.
943
+ </span><span class="marked0"><a name="line324" />324 protected
944
+ </span><span class="marked1"><a name="line325" />325 def tracklist_xml
945
+ </span><span class="marked0"><a name="line326" />326 @playlist.elements['trackList']
946
+ </span><span class="marked1"><a name="line327" />327 end
947
+ </span><span class="inferred0"><a name="line328" />328
948
+ </span><span class="marked1"><a name="line329" />329 private
949
+ </span><span class="marked0"><a name="line330" />330 def add_instance_variable(hash, var)
950
+ </span><span class="inferred1"><a name="line331" />331
951
+ </span><span class="marked0"><a name="line332" />332 if !hash.nil? &amp;&amp; hash.has_key?(var.downcase.to_sym)
952
+ </span><span class="marked1"><a name="line333" />333 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
953
+ </span><span class="inferred0"><a name="line334" />334 else
954
+ </span><span class="marked1"><a name="line335" />335 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
955
+ </span><span class="inferred0"><a name="line336" />336 end
956
+ </span><span class="inferred1"><a name="line337" />337
957
+ </span><span class="marked0"><a name="line338" />338 end
958
+ </span><span class="inferred1"><a name="line339" />339
959
+ </span><span class="inferred0"><a name="line340" />340 end
960
+ </span><span class="inferred1"><a name="line341" />341
961
+ </span><span class="marked0"><a name="line342" />342 class XSPF::Tracklist &lt; XSPF::Playlist
962
+ </span><span class="inferred1"><a name="line343" />343
963
+ </span><span class="marked0"><a name="line344" />344 attr_reader :tracklist
964
+ </span><span class="inferred1"><a name="line345" />345
965
+ </span><span class="inferred0"><a name="line346" />346 # Creates a XSPF::Tracklist from a XSPF::Playlist (parse mode) or without parameters (generation mode)
966
+ </span><span class="marked1"><a name="line347" />347 def initialize(playlist=nil)
967
+ </span><span class="marked0"><a name="line348" />348 if (playlist.instance_of?(Hash) || playlist.nil?) then
968
+ </span><span class="marked1"><a name="line349" />349 @tracklist = ''
969
+ </span><span class="marked0"><a name="line350" />350 @tracks = []
970
+ </span><span class="inferred1"><a name="line351" />351 else
971
+ </span><span class="marked0"><a name="line352" />352 @tracklist = playlist.tracklist_xml
972
+ </span><span class="marked1"><a name="line353" />353 @tracks = @tracklist.elements.collect { |track| XSPF::Track.new(track) }
973
+ </span><span class="inferred0"><a name="line354" />354 end
974
+ </span><span class="marked1"><a name="line355" />355 end
975
+ </span><span class="inferred0"><a name="line356" />356
976
+ </span><span class="inferred1"><a name="line357" />357 # Returns an array XSPF::Track objects
977
+ </span><span class="marked0"><a name="line358" />358 def tracks
978
+ </span><span class="marked1"><a name="line359" />359 @tracks
979
+ </span><span class="marked0"><a name="line360" />360 end
980
+ </span><span class="inferred1"><a name="line361" />361
981
+ </span><span class="inferred0"><a name="line362" />362 # Adds a new XSPF::Track to the XSPF::Tracklist
982
+ </span><span class="marked1"><a name="line363" />363 def &lt;&lt;(track)
983
+ </span><span class="marked0"><a name="line364" />364 @tracks &lt;&lt; track
984
+ </span><span class="marked1"><a name="line365" />365 end
985
+ </span><span class="inferred0"><a name="line366" />366
986
+ </span><span class="inferred1"><a name="line367" />367 # Exports the XSPF::Tracklist to XML (only the &lt;trackList&gt; section)
987
+ </span><span class="marked0"><a name="line368" />368 def to_xml
988
+ </span><span class="marked1"><a name="line369" />369 xml = REXML::Element.new('trackList')
989
+ </span><span class="marked0"><a name="line370" />370 @tracks.each { |t| xml &lt;&lt; REXML::Document.new(t.to_xml) }
990
+ </span><span class="marked1"><a name="line371" />371 xml.to_s
991
+ </span><span class="inferred0"><a name="line372" />372 end
992
+ </span><span class="inferred1"><a name="line373" />373
993
+ </span><span class="inferred0"><a name="line374" />374 end
994
+ </span><span class="inferred1"><a name="line375" />375
995
+ </span><span class="marked0"><a name="line376" />376 class XSPF::Track
996
+ </span><span class="inferred1"><a name="line377" />377
997
+ </span><span class="marked0"><a name="line378" />378 attr_reader :track
998
+ </span><span class="inferred1"><a name="line379" />379
999
+ </span><span class="inferred0"><a name="line380" />380 #:stopdoc:
1000
+ </span><span class="marked1"><a name="line381" />381 ELEMENTS = %w{ location identifier title creator annotation info image album trackNum duration extension }
1001
+ </span><span class="marked0"><a name="line382" />382 ATTRIBUTE_AND_ELEMENT = %w{ link meta }
1002
+ </span><span class="inferred1"><a name="line383" />383
1003
+ </span><span class="marked0"><a name="line384" />384 LOCATION_RDOC = 'URL of resource to be rendered. Probably an audio resource, but MAY be any type of resource with a well-known duration, such as video, a SMIL document, or an XSPF document. The duration of the resource defined in this element defines the duration of rendering. XSPF::Track objects MAY contain zero or more location elements, but a user-agent MUST NOT render more than one of the named resources. Currently, XSPF for Ruby returns only the first location.'
1004
+ </span><span class="marked1"><a name="line385" />385 IDENTIFIER_RDOC = 'Canonical ID for this resource. Likely to be a hash or other location-independent name, such as a MusicBrainz identifier or isbn URN (if there existed isbn numbers for audio). MUST be a legal URN. XSPF::Track objects elements MAY contain zero or more identifier elements, but currently XSPF for Ruby returns only the first one.'
1005
+ </span><span class="marked0"><a name="line386" />386 TITLE_RDOC = 'Human-readable name of the track that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1006
+ </span><span class="marked1"><a name="line387" />387 CREATOR_RDOC = 'Human-readable name of the entity (author, authors, group, company, etc) that authored the resource which defines the duration of track rendering. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1007
+ </span><span class="marked0"><a name="line388" />388 ANNOTATION_RDOC = 'A human-readable comment on the track. This is character data, not HTML, and it may not contain markup. XSPF::Track objects MAY contain exactly one.'
1008
+ </span><span class="marked1"><a name="line389" />389 INFO_RDOC = 'URL of a place where this resource can be bought or more info can be found.'
1009
+ </span><span class="marked0"><a name="line390" />390 IMAGE_RDOC = 'URL of an image to display for the duration of the track. XSPF::Track objects MAY contain exactly one.'
1010
+ </span><span class="marked1"><a name="line391" />391 ALBUM_RDOC = 'Human-readable name of the collection from which the resource which defines the duration of track rendering comes. For a song originally published as a part of a CD or LP, this would be the title of the original release. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one.'
1011
+ </span><span class="marked0"><a name="line392" />392 TRACKNUM_RDOC = 'Integer with value greater than zero giving the ordinal position of the media on the XSPF::Track#album. This value is primarily for fuzzy lookups, though a user-agent may display it. XSPF::Track objects MAY contain exactly one. It MUST be a valid XML Schema nonNegativeInteger.'
1012
+ </span><span class="marked1"><a name="line393" />393 DURATION_RDOC = 'The time to render a resource, in milliseconds. It MUST be a valid XML Schema nonNegativeInteger. 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 objects MAY contain exactly one duration element.'
1013
+ </span><span class="marked0"><a name="line394" />394 EXTENSION_RDOC = '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::Track objects MAY contain zero or more extension elements, but currently XSPF for Ruby returns only the first one.'
1014
+ </span><span class="marked1"><a name="line395" />395 LINK_REL_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more link elements, but currently XSPF for Ruby returns only the first one.'
1015
+ </span><span class="marked0"><a name="line396" />396 LINK_CONTENT_RDOC = 'The link element allows non-XSPF web resources to be included in XSPF documents without breaking XSPF validation. A valid _link_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#link_rel and XSPF::Track#link_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1016
+ </span><span class="marked1"><a name="line397" />397 META_REL_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1017
+ </span><span class="marked0"><a name="line398" />398 META_CONTENT_RDOC = 'The meta element allows non-XSPF metadata to be included in XSPF documents without breaking XSPF validation. A valid _meta_ element has a _rel_ attribute and a _content_ element, obtained with XSPF::Track#meta_rel and XSPF::Track#meta_content respectively. XSPF::Track objects MAY contain zero or more meta elements, but currently XSPF for Ruby returns only the first one.'
1018
+ </span><span class="inferred1"><a name="line399" />399
1019
+ </span><span class="marked0"><a name="line400" />400 ELEMENTS.each do |element|
1020
+ </span><span class="marked1"><a name="line401" />401 MetaGen.add_method( self, element, &quot;@track.elements['#{element}'].text&quot;, eval(element.upcase + '_RDOC').to_s )
1021
+ </span><span class="inferred0"><a name="line402" />402 end
1022
+ </span><span class="inferred1"><a name="line403" />403
1023
+ </span><span class="marked0"><a name="line404" />404 ATTRIBUTE_AND_ELEMENT.each do |ae|
1024
+ </span><span class="marked1"><a name="line405" />405 MetaGen.add_method( self, &quot;#{ae}_content&quot;, &quot;@track.elements['#{ae}'].text&quot;, eval(ae.upcase + '_CONTENT_RDOC').to_s )
1025
+ </span><span class="marked0"><a name="line406" />406 MetaGen.add_method( self, &quot;#{ae}_rel&quot;, &quot;@track.elements['#{ae}'].attributes['rel']&quot;, eval(ae.upcase + '_REL_RDOC').to_s )
1026
+ </span><span class="inferred1"><a name="line407" />407 end
1027
+ </span><span class="inferred0"><a name="line408" />408
1028
+ </span><span class="inferred1"><a name="line409" />409 # :startdoc:
1029
+ </span><span class="inferred0"><a name="line410" />410
1030
+ </span><span class="inferred1"><a name="line411" />411 # Creates a XSPF::Track object from a &lt;track&gt; section of the XSPF document or from a hash of values
1031
+ </span><span class="inferred0"><a name="line412" />412 #
1032
+ </span><span class="inferred1"><a name="line413" />413 # Possible keys in the hash in generation mode: :location, :identifier, :title, :creator, :annotation, :info, :image, :album, :tracknum, :duration, :extension, :link_rel, :link_content, :meta_rel, :meta_content)
1033
+ </span><span class="marked0"><a name="line414" />414 def initialize(tr)
1034
+ </span><span class="inferred1"><a name="line415" />415
1035
+ </span><span class="marked0"><a name="line416" />416 if tr.instance_of?(Hash)
1036
+ </span><span class="inferred1"><a name="line417" />417
1037
+ </span><span class="marked0"><a name="line418" />418 ELEMENTS.each do |element|
1038
+ </span><span class="marked1"><a name="line419" />419 add_instance_variable(tr, element.downcase)
1039
+ </span><span class="inferred0"><a name="line420" />420 end
1040
+ </span><span class="inferred1"><a name="line421" />421
1041
+ </span><span class="marked0"><a name="line422" />422 ATTRIBUTE_AND_ELEMENT.each do |ae|
1042
+ </span><span class="marked1"><a name="line423" />423 add_instance_variable(tr, &quot;#{ae.downcase}_content&quot; )
1043
+ </span><span class="marked0"><a name="line424" />424 add_instance_variable(tr, &quot;#{ae.downcase}_rel&quot; )
1044
+ </span><span class="inferred1"><a name="line425" />425 end
1045
+ </span><span class="inferred0"><a name="line426" />426
1046
+ </span><span class="inferred1"><a name="line427" />427 else
1047
+ </span><span class="marked0"><a name="line428" />428 @track = tr
1048
+ </span><span class="inferred1"><a name="line429" />429
1049
+ </span><span class="marked0"><a name="line430" />430 ELEMENTS.each do |element|
1050
+ </span><span class="marked1"><a name="line431" />431 eval('@' + element.downcase + '= parse_' + element.downcase)
1051
+ </span><span class="inferred0"><a name="line432" />432 end
1052
+ </span><span class="inferred1"><a name="line433" />433
1053
+ </span><span class="marked0"><a name="line434" />434 ATTRIBUTE_AND_ELEMENT.each do |ae|
1054
+ </span><span class="marked1"><a name="line435" />435 eval('@' + ae.downcase + '_content = parse_' + ae.downcase + '_content')
1055
+ </span><span class="marked0"><a name="line436" />436 eval('@' + ae.downcase + '_rel = parse_' + ae.downcase + '_rel')
1056
+ </span><span class="inferred1"><a name="line437" />437 end
1057
+ </span><span class="inferred0"><a name="line438" />438 end
1058
+ </span><span class="inferred1"><a name="line439" />439
1059
+ </span><span class="marked0"><a name="line440" />440 end
1060
+ </span><span class="inferred1"><a name="line441" />441
1061
+ </span><span class="inferred0"><a name="line442" />442 # Exports the XSPF::Track to XML (only the &lt;track&gt; section)
1062
+ </span><span class="marked1"><a name="line443" />443 def to_xml
1063
+ </span><span class="inferred0"><a name="line444" />444
1064
+ </span><span class="marked1"><a name="line445" />445 xml = REXML::Element.new('track')
1065
+ </span><span class="inferred0"><a name="line446" />446
1066
+ </span><span class="marked1"><a name="line447" />447 ELEMENTS.each do |element|
1067
+ </span><span class="inferred0"><a name="line448" />448 # TODO Sure there is a nicer way to do evaluate this condition...
1068
+ </span><span class="marked1"><a name="line449" />449 unless eval('@' + element.downcase + '.nil?')
1069
+ </span><span class="marked0"><a name="line450" />450 el = REXML::Element.new(element)
1070
+ </span><span class="marked1"><a name="line451" />451 el.add_text( eval('@' + element.downcase) )
1071
+ </span><span class="marked0"><a name="line452" />452 xml.add_element(el)
1072
+ </span><span class="inferred1"><a name="line453" />453 end
1073
+ </span><span class="inferred0"><a name="line454" />454 end
1074
+ </span><span class="inferred1"><a name="line455" />455
1075
+ </span><span class="marked0"><a name="line456" />456 ATTRIBUTE_AND_ELEMENT.each do |ae|
1076
+ </span><span class="inferred1"><a name="line457" />457 # TODO Sure there is a nicer way to do evaluate this condition...
1077
+ </span><span class="marked0"><a name="line458" />458 unless eval('@' + ae.downcase + '_rel.nil? &amp;&amp; @'+ ae.downcase + '_content.nil?')
1078
+ </span><span class="marked1"><a name="line459" />459 el = REXML::Element.new(ae.downcase)
1079
+ </span><span class="marked0"><a name="line460" />460 el.add_attribute('rel', eval('@' + ae.downcase + '_rel') )
1080
+ </span><span class="marked1"><a name="line461" />461 el.add_text( eval('@' + ae.downcase + '_content') )
1081
+ </span><span class="marked0"><a name="line462" />462 xml.add_element(el)
1082
+ </span><span class="inferred1"><a name="line463" />463 end
1083
+ </span><span class="inferred0"><a name="line464" />464 end
1084
+ </span><span class="inferred1"><a name="line465" />465
1085
+ </span><span class="marked0"><a name="line466" />466 xml.to_s
1086
+ </span><span class="inferred1"><a name="line467" />467
1087
+ </span><span class="inferred0"><a name="line468" />468 end
1088
+ </span><span class="inferred1"><a name="line469" />469
1089
+ </span><span class="marked0"><a name="line470" />470 private
1090
+ </span><span class="marked1"><a name="line471" />471 def add_instance_variable(hash, var)
1091
+ </span><span class="inferred0"><a name="line472" />472
1092
+ </span><span class="marked1"><a name="line473" />473 if hash.has_key?(var.downcase.to_sym)
1093
+ </span><span class="marked0"><a name="line474" />474 eval('@' + var.downcase + ' = \'' + hash[var.downcase.to_sym] + '\'')
1094
+ </span><span class="inferred1"><a name="line475" />475 else
1095
+ </span><span class="marked0"><a name="line476" />476 eval('@' + var.downcase + ' = defined?(' + var.upcase + '_DEFAULT) ? ' + var.upcase + '_DEFAULT : nil')
1096
+ </span><span class="inferred1"><a name="line477" />477 end
1097
+ </span><span class="inferred0"><a name="line478" />478
1098
+ </span><span class="marked1"><a name="line479" />479 end
1099
+ </span><span class="inferred0"><a name="line480" />480
1100
+ </span><span class="inferred1"><a name="line481" />481 end
1100
1101
  </span></pre><hr /> <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> version 0.7.0.</p><p>
1101
1102
  <a href='http://validator.w3.org/check/referer'>
1102
1103
  <img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' />