Skip to content

Commit ff5e29e

Browse files
committed
RSS Feed Reader and Screenshots
1 parent f8ae89e commit ff5e29e

File tree

3 files changed

+83
-1
lines changed

3 files changed

+83
-1
lines changed

Web/cpanfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ requires 'Mojo::Pg';
55
requires 'DateTime::Format::Pg';
66
requires 'BlogDB::DB';
77
requires 'WebService::WsScreenshot';
8+
requires 'LWP::UserAgent';
9+
requires 'XML::RSS'; # This requires libexpat1-dev
810

911
test_requires "Test::Postgresql58";
1012
test_requires "Test::More";

Web/lib/BlogDB/Web/Controller/Blog.pm

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,10 @@ sub post_publish_new_blog ($c) {
187187
}
188188
$pb->delete;
189189

190-
$c->redirect_to( $c->url_for( 'view_blog', slug => $blog->id ) );
190+
$c->minion->enqueue( populate_blog_entires => [ $blog->id ]);
191+
$c->minion->enqueue( populate_blog_screenshot => [ $blog->id ]);
192+
193+
$c->redirect_to( $c->url_for( 'view_blog', slug => $blog->slug ) );
191194
}
192195

193196
1;

Web/lib/BlogDB/Web/Plugin/MinionTasks.pm

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ package BlogDB::Web::Plugin::MinionTasks;
22
use Mojo::Base 'Mojolicious::Plugin', -signatures;
33
use WebService::WsScreenshot;
44
use Minion;
5+
use LWP::UserAgent;
6+
use XML::RSS;
7+
use Try::Tiny;
8+
use Mojo::File qw( tempfile );
9+
use File::Path qw( make_path );
510

611
sub register ( $self, $app, $config ) {
712

@@ -12,13 +17,85 @@ sub register ( $self, $app, $config ) {
1217
$app->plugin( Minion => { Pg => $app->config->{database}->{minion} } );
1318
$app->plugin( 'Minion::Admin' );
1419

20+
$app->helper( extract_feed => sub ( $c, $url ) {
21+
my $rss = XML::RSS->new;
22+
my $ua = LWP::UserAgent->new(
23+
timeout => 60,
24+
agent => 'Mozilla/5.0 BlogDB.org RSS Reader',
25+
);
26+
27+
my $res = $ua->get( $url );
28+
29+
return [ ] unless $res->is_success;
30+
31+
my $did_parse_content = try {
32+
$rss->parse( $res->decoded_content );
33+
} catch {
34+
warn "Failed to parse $url: $_";
35+
return 0;
36+
};
37+
38+
return [ ] unless $did_parse_content;
39+
40+
my @items;
41+
foreach my $item ( @{$rss->{items}} ) {
42+
push @items, {
43+
title => $item->{title},
44+
link => $item->{link},
45+
date => $item->{pubDate},
46+
};
47+
}
48+
return [ @items ];
49+
});
50+
1551
$app->minion->add_task(download_screenshot => sub ( $job, $blog_url, $blog_id ) {
1652
$screenshot->store_screenshot(
1753
url => $blog_url,
1854
out_file => $job->app->config->{ws_screenshot}->{datadir} . "$blog_id.jpg",
1955
);
2056
});
57+
58+
$app->minion->add_task(populate_blog_screenshot => sub ( $job, $blog_id ) {
59+
my $blog = $job->app->db->resultset('Blog')->find( $blog_id );
2160

61+
make_path( $job->app->static->paths->[0] . '/screenshots/' );
62+
my $out = tempfile(
63+
DIR => $job->app->static->paths->[0] . '/screenshots/',
64+
SUFFIX => '.jpg',
65+
UNLINK => 0,
66+
);
67+
68+
$screenshot->store_screenshot(
69+
url => $blog->url,
70+
out_file => $out->to_string,
71+
);
72+
73+
$blog->img_url( '/screenshots/' . $out->basename );
74+
$blog->update;
75+
});
76+
77+
$app->minion->add_task(populate_blog_entires => sub ( $job, $blog_id ) {
78+
my $blog = $job->app->db->resultset('Blog')->find( $blog_id );
79+
80+
return unless $blog->rss_url;
81+
82+
my $entries = $job->app->extract_feed( $blog->rss_url );
83+
84+
foreach my $entry ( @{$entries} ) {
85+
my $entry_count = $job->app->db->resultset('BlogEntry')->search({
86+
url => $entry->{link},
87+
})->count;
88+
89+
next if $entry_count >= 1;
90+
91+
$blog->create_related( 'blog_entries', {
92+
title => $entry->{title},
93+
url => $entry->{link},
94+
publish_date => $entry->{date},
95+
});
96+
}
97+
98+
});
2299
}
23100

24101
1;

0 commit comments

Comments
 (0)