XML::FeedとAtom 1.0
いまさら気付いたんだけど、XML::FeedってAtom
1.0に対応していないのね。。
FeedとEntryのissuedとmodifiedが、Atom
1.0ではpublishedとupdatedになっているので、Atomのバージョンを見ながら参照先を変えるとかが必要になると思われ。
feed.nomadscafe.jpの方では、無理矢理対応した。カテゴリーへの対応だけがまだできてない。
Modelクラスの部分を↓だんだんBKの固まりになってきそう。
use XML::Atom::Util qw( iso2dt );
sub process{
my ( $self, $c ) = @_;
my %ret;
local $XML::Feed::RSS::PREFERRED_PARSER = "XML::RSS::LibXML";
my $feed = XML::Feed->parse(URI->new($c->stash->{uri}));
if(!$feed){
$c->stash->{errstr} = XML::Feed->errstr;
return
}
my $pf = DateTime::Format::Mail->new();
my $is_atom10 = ($feed->{atom} && $feed->{atom}->version > 0.3) ? 1 : 0;
my %feed;
$feed{title} = $feed->title;
$feed{link} = $feed->link;
$feed{description} = ($is_atom10) ? $feed->{atom}->subtitle : $feed->description;
$feed{author} = $feed->author;
$feed{language} = $feed->language;
$feed{copyright} = ($is_atom10) ? $feed->{atom}->{rights} : $feed->copyright;
if($is_atom10){
$feed{modified} = $feed->{atom}->updated ? $pf->format_datetime(iso2dt($feed->{atom}->updated)) : undef;
}else{
$feed{modified} = $feed->modified ? $pf->format_datetime($feed->modified) : undef;
}
$feed{generator} = (ref $feed->generator) ? $feed->generator->{resource} : $feed->generator;
foreach (qw(title link description author language copyright modified generator)){
utf8::decode($feed{$_}) unless utf8::is_utf8($feed{$_});
}
$feed{entries}=[];
for my $entry ($feed->entries) {
my %entry;
$entry{title} = $entry->title;
$entry{link} = $entry->link;
$entry{summary} = ($entry->summary) ? $entry->summary->body : undef;
$entry{category} = $entry->category;
$entry{author} = $entry->author;
#issued,modified
if($is_atom10){
$entry{issued} = $entry->{entry}->published ? $pf->format_datetime(iso2dt($entry->{entry}->published)) : undef;
$entry{modified} = $entry->{entry}->updated ? $pf->format_datetime(iso2dt($entry->{entry}->updated)) : undef;
}else{
$entry{issued} = $entry->issued ? $pf->format_datetime($entry->issued) : undef;
$entry{modified} = $entry->modified ? $pf->format_datetime($entry->modified) : undef;
}
foreach (qw(title link summary category author issued modified)){
utf8::decode($entry{$_}) unless utf8::is_utf8($entry{$_});
}
push(@{$feed{entries}},\%entry);
}
$ret{$c->stash->{uri}} = \%feed;
$c->stash->{feed} = \%ret;
}
feed.nomadscafe.jpもバージョンあがって、0.04。ソースは
http://nomadscafe.jp/archives/
においてあります。