1 # $Id: RSS.pm 942 2004-12-31 23:01:21Z btrott $
3 package XML::Feed::RSS;
6 use base qw( XML::Feed );
8 use DateTime::Format::Mail;
9 use DateTime::Format::W3CDTF;
14 my $rss = $feed->{rss} = XML::RSS->new;
21 sub format { 'RSS ' . $_[0]->{rss}->{'version'} }
23 ## The following elements are the same in all versions of RSS.
24 sub title { $_[0]->{rss}->channel('title') }
25 sub link { $_[0]->{rss}->channel('link') }
26 sub description { $_[0]->{rss}->channel('description') }
28 ## This is RSS 2.0 only--what's the equivalent in RSS 1.0?
29 sub copyright { $_[0]->{rss}->channel('copyright') }
31 ## The following all work transparently in any RSS version.
33 $_[0]->{rss}->channel('language') ||
34 $_[0]->{rss}->channel->{dc}{language}
38 $_[0]->{rss}->channel('generator') ||
39 $_[0]->{rss}->channel->{'http://webns.net/mvcb/'}{generatorAgent};
43 $_[0]->{rss}->channel('webMaster') ||
44 $_[0]->{rss}->channel->{dc}{creator};
48 my $rss = $_[0]->{rss};
49 if (my $ts = $rss->channel('pubDate')) {
50 return DateTime::Format::Mail->parse_datetime($ts);
51 } elsif ($ts = $rss->channel->{dc}{date}) {
52 return DateTime::Format::W3CDTF->parse_datetime($ts);
57 my $rss = $_[0]->{rss};
59 for my $item (@{ $rss->{items} }) {
60 push @entries, XML::Feed::RSS::Entry->wrap($item);
65 package XML::Feed::RSS::Entry;
68 use XML::Feed::Content;
70 use base qw( XML::Feed::Entry );
72 sub title { $_[0]->{entry}{title} }
73 sub link { $_[0]->{entry}{link} || $_[0]->{entry}{guid} }
76 my $item = $_[0]->{entry};
77 ## Some RSS feeds use <description> for a summary, and some use it
78 ## for the full content. Pretty gross. We don't want to return the
79 ## full content if the caller expects a summary, so the heuristic is:
80 ## if the <entry> contains both a <description> and one of the elements
81 ## typically used for the full content, use <description> as the summary.
83 if ($item->{description} &&
84 ($item->{'http://purl.org/rss/1.0/modules/content/'}{encoded} ||
85 $item->{'http://www.w3.org/1999/xhtml'}{body})) {
86 $txt = $item->{description};
88 XML::Feed::Content->wrap({ type => 'text/plain', body => $txt });
92 my $item = $_[0]->{entry};
94 $_[0]->{entry}{'http://purl.org/rss/1.0/modules/content/'}{encoded} ||
95 $_[0]->{entry}{'http://www.w3.org/1999/xhtml'}{body} ||
96 $_[0]->{entry}{description};
97 XML::Feed::Content->wrap({ type => 'text/html', body => $body });
101 $_[0]->{entry}{category} || $_[0]->{entry}{dc}{subject};
105 $_[0]->{entry}{author} || $_[0]->{entry}{dc}{creator};
108 ## XML::RSS doesn't give us access to the rdf:about for the <item>,
109 ## so we have to fall back to the <link> element in RSS 1.0 feeds.
111 $_[0]->{entry}{guid} || $_[0]->{entry}{link};
115 if (my $ts = $_[0]->{entry}{pubDate}) {
116 my $parser = DateTime::Format::Mail->new;
118 return $parser->parse_datetime($ts);
119 } elsif ($ts = $_[0]->{entry}{dc}{date}) {
120 return DateTime::Format::W3CDTF->parse_datetime($ts);
125 if (my $ts = $_[0]->{entry}{'http://purl.org/rss/1.0/modules/dcterms/'}{modified}) {
126 return DateTime::Format::W3CDTF->parse_datetime($ts);