3 package XML::Feed::Format::RSS;
6 use base qw( XML::Feed );
7 use DateTime::Format::Mail;
8 use DateTime::Format::W3CDTF;
9 use XML::Atom::Util qw(iso2dt);
10 use XML::Feed::Enclosure;
11 use XML::Feed::Entry::Format::RSS;
13 our $PREFERRED_PARSER = "XML::RSS";
19 my $tag = $class->_get_first_tag($xml);
20 return ($tag eq 'rss' || $tag eq 'RDF');
24 my ($feed, %args) = @_;
25 $args{'version'} ||= '2.0';
26 eval "use $PREFERRED_PARSER"; die $@ if $@;
27 $feed->{rss} = $PREFERRED_PARSER->new(%args);
28 $feed->{rss}->add_module(prefix => "content", uri => 'http://purl.org/rss/1.0/modules/content/');
29 $feed->{rss}->add_module(prefix => "dcterms", uri => 'http://purl.org/dc/terms/');
30 $feed->{rss}->add_module(prefix => "atom", uri => 'http://www.w3.org/2005/Atom');
31 $feed->{rss}->add_module(prefix => "geo", uri => 'http://www.w3.org/2003/01/geo/wgs84_pos#');
40 hashrefs_instead_of_strings => 1,
42 $opts->{allow_multiple} = [ 'enclosure' ] if $XML::Feed::MULTIPLE_ENCLOSURES;
44 $feed->{rss}->parse($$str, $opts );
49 sub format { 'RSS ' . $_[0]->{rss}->{'version'} }
51 ## The following elements are the same in all versions of RSS.
52 sub title { shift->{rss}->channel('title', @_) }
54 my $link = shift->{rss}->channel('link', @_);
59 sub description { shift->{rss}->channel('description', @_) }
60 sub updated { shift->modified(@_) }
62 # This doesn't exist in RSS
65 ## This is RSS 2.0 only--what's the equivalent in RSS 1.0?
66 sub copyright { shift->{rss}->channel('copyright', @_) }
71 $feed->{rss}->{'xml:base'} = $_[0];
73 $feed->{rss}->{'xml:base'};
77 ## The following all work transparently in any RSS version.
81 $feed->{rss}->channel('language', $_[0]);
82 $feed->{rss}->channel->{dc}{language} = $_[0];
84 $feed->{rss}->channel('language') ||
85 $feed->{rss}->channel->{dc}{language};
95 $feed->{rss}->channel->{'atom'}{'link'} =
99 type => "application/rss+xml",
103 return $feed->{rss}->channel->{'atom'}{'link'};
110 $feed->{rss}->channel('generator', $_[0]);
111 $feed->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent} =
114 $feed->{rss}->channel('generator') ||
115 $feed->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent};
122 $feed->{rss}->channel('webMaster', $_[0]);
123 $feed->{rss}->channel->{dc}{creator} = $_[0];
125 $feed->{rss}->channel('webMaster') ||
126 $feed->{rss}->channel->{dc}{creator};
131 my $rss = shift->{rss};
133 $rss->channel('pubDate',
134 DateTime::Format::Mail->format_datetime($_[0]));
135 ## XML::RSS is so weird... if I set this, it will try to use
136 ## the value for the lastBuildDate, which I don't want--because
137 ## this date is formatted for an RSS 1.0 feed. So it's commented out.
138 #$rss->channel->{dc}{date} =
139 # DateTime::Format::W3CDTF->format_datetime($_[0]);
143 if (my $ts = $rss->channel('pubDate')) {
146 $date = DateTime::Format::Mail->parse_datetime($ts);
147 } elsif ($ts = $rss->channel->{dc}{date}) {
150 $date = DateTime::Format::W3CDTF->parse_datetime($ts);
158 my $rss = $_[0]->{rss};
160 for my $item (@{ $rss->{items} }) {
161 push @entries, XML::Feed::Entry::Format::RSS->wrap($item);
162 $entries[-1]->{_version} = $rss->{'version'};
169 my $entry = shift || return;
170 $entry = $feed->_convert_entry($entry);
171 $feed->{rss}->add_item(%{ $entry->unwrap });
174 sub as_xml { $_[0]->{rss}->as_string }