« Feed2JSON(feed.nomadscafe.jp)のソースコード | メイン | Perlにおける真偽 »

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/
においてあります。