WWW::Spinn3r::Synced - A interface that provides synced access to


WWW-Spinn3r documentation Contained in the WWW-Spinn3r distribution.

Index


Code Index:

NAME

Top

WWW::Spinn3r::Synced - A interface that provides synced access to permalink and feed APIs.

SYNOPOSIS

Top

 use WWW::Spinn3r::Synced;
 use DateTime;

 my $API = { 
          vendor                  => 'acme',   # required
          limit                   => 5, 
          after                   => DateTime->now()->subtract(hours => 48),
 };

 my $spnr = new WWW::Spinn3r::Synced (params => $API, debug => 1);

 while(1) { 
           my ($p, $f) = @{ $spnr->next };
           if ($p and $f) { 
                  print "both! $$p{link}\n"
           } else { 
                  print "permalink only! $$p{link}\n"
           }
 }

DESCRIPTION

Top

WWW::Spinn3r::Synced synchronizes the permalink3.getDelta and feed3.getDelta APIs provided by Spinn3r such that next() returns both the permalink and feed items associated with a link.

new()

Top

The same as new() in WWW::Spinn3r but doesn't accept an api key, since both APIs are used internally by this module.

next()

Top

Returns an arrayref, the first element is the permalink item and the second element is the feed item. When a feed item is not available, the permalink is returned as first item, and the second item is set to undef.

SEE ALSO

Top

examples/synced.pl, WWW::Spinn3r

AUTHOR

Top

Dan Brumleve <opensource@slaant.com>


WWW-Spinn3r documentation Contained in the WWW-Spinn3r distribution.

package WWW::Spinn3r::Synced;

use WWW::Spinn3r;
use DateTime;
use DateTime::Duration;
use DateTime::Format::ISO8601;
use Data::Dumper;

use DB_File;
use Fcntl;
use File::Temp qw(tempfile);
use Storable qw(freeze thaw);

my $iso8601 = DateTime::Format::ISO8601->new;

sub new {

    my $p = shift;

    my %param = @_;
    exists $param{api} and die "don't pass api to WWW::Spinn3r::Synced, use WWW::Spinn3r instead if you want a specific api";
    delete $param{api};

    my $match_range = delete($param{match_range}) || 30;

    my %pparam = %param;

    my $self = bless {
        permalink	=> WWW::Spinn3r->new(api => 'permalink3.getDelta', %pparam),
        fi		    => { },
        last_ftime	=> undef,
        match_range	=> $match_range,
        orig_param  => \%param,
    }, $p;

    $self
}

sub feed_begin { 

    my ($self, $after) = @_;
    my %param = %{$self->{orig_param}};
    $param{params}->{after} = $after;
    $self->{feed} = WWW::Spinn3r->new(api => 'feed3.getDelta', %param);
    $self->{feed}->next();

}

sub feed_next {
    my $self = shift;
    $self->{feed}->next(@_);
}

sub permalink_next {
    my $self = shift;
    $self->{permalink}->next(@_);
}

sub next {
    my $self = shift;
    my $fi = $self->{fi};
    my $match_range = $self->{match_range};

    my $pitem = $self->permalink_next;
    return unless $pitem;
    my $ptime = $pitem->{t} = $iso8601->parse_datetime($pitem->{'post:date_found'})->epoch;
    my $min_t = $ptime - $match_range;
    my $max_t = $ptime + $match_range;
    my $link = $$pitem{link};

    unless ($self->{feed}) { 
        $self->feed_begin($iso8601->parse_datetime($pitem->{'post:date_found'}) - DateTime::Duration->new(seconds => $match_range));
    }

    my $feed_count = 0;
    while ($self->{last_ftime} <= $max_t and $feed_count < 1024) {
          my $fitem = $self->feed_next;
          my $ftime = $fitem->{t} = $iso8601->parse_datetime($fitem->{'post:date_found'})->epoch;
          $$fi{$$fitem{link}} = $fitem;
          $self->{last_ftime} = $ftime;
          $feed_count++;
    }

    # this feed item, if defined, goes with this permalink
    my $fitem = delete $$fi{$link};

    # remove feed items which don't refer to permalink items
    for my $flink (keys %$fi) {
          my $fitem = $$fi{$flink};
          my $ftime = $$fitem{t};
          $ftime < $min_t and delete $$fi{$flink};
    }

    return [$pitem, $fitem];
}


1;