use base qw( XML::Feed );
use DateTime::Format::Mail;
use DateTime::Format::W3CDTF;
+use XML::Atom::Util qw(iso2dt);
+use XML::Feed::Enclosure;
our $PREFERRED_PARSER = "XML::RSS";
## The following elements are the same in all versions of RSS.
sub title { shift->{rss}->channel('title', @_) }
-sub link { shift->{rss}->channel('link', @_) }
+sub link {
+ my $link = shift->{rss}->channel('link', @_);
+ $link =~ s/^\s+//;
+ $link =~ s/\s+$//;
+ return $link;
+}
sub description { shift->{rss}->channel('description', @_) }
+sub updated { shift->modified(@_) }
# This doesn't exist in RSS
sub id { }
my $date;
eval {
if (my $ts = $rss->channel('pubDate')) {
+ $ts =~ s/^\s+//;
+ $ts =~ s/\s+$//;
$date = DateTime::Format::Mail->parse_datetime($ts);
} elsif ($ts = $rss->channel->{dc}{date}) {
+ $ts =~ s/^\s+//;
+ $ts =~ s/\s+$//;
$date = DateTime::Format::W3CDTF->parse_datetime($ts);
}
};
## For RSS 2.0 output from XML::RSS. Sigh.
$entry->{entry}{permaLink} = $_[0];
} else {
- $entry->{entry}{link} || $entry->{entry}{guid};
+ my $link = $entry->{entry}{link} ||
+ $entry->{entry}{permaLink} ||
+ $entry->{entry}{guid};
+ if (defined $link) {
+ $link =~ s/^\s+//;
+ $link =~ s/\s+$//;
+ }
+ return $link;
}
}
($item->{content}{encoded} ||
$item->{'http://www.w3.org/1999/xhtml'}{body})) {
$txt = $item->{description};
+ ## Blogspot's 'short' RSS feeds do this in the Atom namespace
+ ## for no obviously good reason.
+ } elsif ($item->{'http://www.w3.org/2005/Atom'}{summary}) {
+ $txt = $item->{'http://www.w3.org/2005/Atom'}{summary};
}
XML::Feed::Content->wrap({ type => 'text/plain', body => $txt });
}
if (my $ts = $item->{pubDate}) {
my $parser = DateTime::Format::Mail->new;
$parser->loose;
+ $ts =~ s/^\s+//;
+ $ts =~ s/\s+$//;
$date = $parser->parse_datetime($ts);
- } elsif ($ts = $item->{dc}{date}) {
+ } elsif ($ts = $item->{dc}{date} or $ts = $item->{dcterms}{date}) {
+ $ts =~ s/^\s+//;
+ $ts =~ s/\s+$//;
$date = DateTime::Format::W3CDTF->parse_datetime($ts);
}
};
$item->{dcterms}{modified} =
DateTime::Format::W3CDTF->format_datetime($_[0]);
} else {
- if (my $ts = $item->{dcterms}{modified}) {
- return eval { DateTime::Format::W3CDTF->parse_datetime($ts) };
- }
+ if (my $ts = $item->{dcterms}{modified} ||
+ $item->{'http://www.w3.org/2005/Atom'}{updated}) {
+ $ts =~ s/^\s+//;
+ $ts =~ s/\s+$//;
+ return eval { DateTime::Format::W3CDTF->parse_datetime($ts) } || eval { XML::Atom::Util::iso2dt($ts) };
+ }
}
}
}
} else {
my $tmp = $entry->{entry}->{enclosure};
- my @encs = map { XML::Feed::Enclosure->new($_) } (ref $tmp eq 'ARRAY')? @$tmp : ($tmp);
- return ($XML::Feed::MULTIPLE_ENCLOSURES)? @encs : $encs[-1];
+ if (defined $tmp) {
+ my @encs = map { XML::Feed::Enclosure->new($_) }
+ (ref $tmp eq 'ARRAY')? @$tmp : ($tmp);
+ return ($XML::Feed::MULTIPLE_ENCLOSURES)? @encs : $encs[-1];
+ }
+ return;
}
}