summaryrefslogtreecommitdiff
path: root/lib/Lifestream/Worker.pm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/Lifestream/Worker.pm90
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/Lifestream/Worker.pm b/lib/Lifestream/Worker.pm
new file mode 100644
index 0000000..c22abcb
--- /dev/null
+++ b/lib/Lifestream/Worker.pm
@@ -0,0 +1,90 @@
+package Lifestream::Worker;
+use Moose;
+extends 'Tatsumaki::Service';
+use Digest::SHA qw(sha256_hex);
+
+use Lifestream::Schema;
+
+use Tatsumaki::HTTPClient;
+use Try::Tiny;
+use XML::Feed;
+
+has config => (
+ is => "rw",
+ isa => "HashRef"
+);
+
+has schema => (
+ is => 'ro',
+ isa => 'Lifestream::Schema',
+ lazy => 1,
+ default => sub {
+ my $self = shift;
+ return Lifestream::Schema->connect(
+ @{ $self->config->{connect_info} } );
+ }
+);
+
+sub start {
+ my $self = shift;
+ my $t;
+ $t = AE::timer 0, 15, sub {
+ $self->fetch_feeds;
+ };
+ #$self->fetch_feeds();
+}
+
+sub fetch_feeds {
+ my $self = shift;
+ my $feeds = $self->schema->resultset('Feed')->search();
+ while ( my $feed = $feeds->next ) {
+ if ( !$feed->favico_url ) {
+ my $uri = URI->new( $feed->profile_url );
+ $uri->path('favicon.ico');
+ $self->schema->txn_do(
+ sub {
+ $feed->update( { favico_url => $uri->as_string } );
+ }
+ );
+ }
+ $self->work_feed( $feed->feed_url, $feed->id );
+ }
+}
+
+sub work_feed {
+ my ( $self, $url, $id ) = @_;
+ warn "fetching $url\n";
+ Tatsumaki::HTTPClient->new->get(
+ $url,
+ sub {
+ my $res = shift;
+ if ( !$res->is_success ) {
+ warn "can't fetch $url\n";
+ return;
+ }
+ my $feed = XML::Feed->parse( \$res->content );
+ for my $entry ( $feed->entries ) {
+ my $entry_id = sha256_hex( $entry->link );
+ next if $self->schema->resultset('Entry')->find($id);
+ try {
+ $self->schema->txn_do(
+ sub {
+ $self->schema->resultset('Entry')->find_or_create(
+ {
+ id => $entry_id,
+ permalink => $entry->link,
+ title => $entry->title,
+ date => $entry->issued,
+ feedid => $id,
+ }
+ );
+ }
+ );
+ }
+ catch { warn "can't insert meme : $_\n"; };
+ }
+ }
+ );
+}
+
+1;