@@ -2,6 +2,11 @@ package BlogDB::Web::Plugin::MinionTasks;
22use Mojo::Base ' Mojolicious::Plugin' , -signatures;
33use WebService::WsScreenshot;
44use 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
611sub 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
241011;
0 commit comments