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'};
106 # This doesn't exist in RSS
109 sub previous_link { };
111 sub current_link { };
112 sub prev_archive_link { };
113 sub next_archive_link { };
118 $feed->{rss}->channel('generator', $_[0]);
119 $feed->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent} =
122 $feed->{rss}->channel('generator') ||
123 $feed->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent};
130 $feed->{rss}->channel('webMaster', $_[0]);
131 $feed->{rss}->channel->{dc}{creator} = $_[0];
133 $feed->{rss}->channel('webMaster') ||
134 $feed->{rss}->channel->{dc}{creator};
139 my $rss = shift->{rss};
141 $rss->channel('pubDate',
142 DateTime::Format::Mail->format_datetime($_[0]));
143 ## XML::RSS is so weird... if I set this, it will try to use
144 ## the value for the lastBuildDate, which I don't want--because
145 ## this date is formatted for an RSS 1.0 feed. So it's commented out.
146 #$rss->channel->{dc}{date} =
147 # DateTime::Format::W3CDTF->format_datetime($_[0]);
151 if (my $ts = $rss->channel('pubDate')) {
154 $date = DateTime::Format::Mail->parse_datetime($ts);
155 } elsif ($ts = $rss->channel->{dc}{date}) {
158 $date = DateTime::Format::W3CDTF->parse_datetime($ts);
167 my $rss = $self->{rss};
169 return @_ ? $rss->image(@_) : $rss->image('url');
173 my $rss = $_[0]->{rss};
175 for my $item (@{ $rss->{items} }) {
176 push @entries, XML::Feed::Entry::Format::RSS->wrap($item);
177 $entries[-1]->{_version} = $rss->{'version'};
184 my $entry = shift || return;
185 $entry = $feed->_convert_entry($entry);
186 $feed->{rss}->add_item(%{ $entry->unwrap });
189 sub as_xml { $_[0]->{rss}->as_string }