How to do it - lazy building
file: code/LazyBuild/FindNewSeries.pm
1: package FindNewSeries;
2: use 5.014;
3: use Moose;
4: use namespace::autoclean;
5: use Moose::Util::TypeConstraints;
6:
7: use XML::Feed;
8: use LWP::UserAgent;
9: use Number::Format;
10: use Template;
11:
12: has 'ua' => (
13: is => 'ro',
14: required => 1,
15: isa => duck_type( [qw(get)] ),
16: lazy_build => 1,
17: );
18: sub _build_ua {
19: return LWP::UserAgent->new(
20: agent => 'domms new series finder',
21: timeout => 5,
22: );
23: }
24:
25: has 'formatter' => (
26: is => 'ro',
27: required => 1,
28: isa => duck_type( [qw(format_bytes)] ),
29: lazy_build => 1,
30: );
31: sub _build_formatter {
32: return Number::Format->new;
33: }
34:
35: has 'renderer' => (
36: is => 'ro',
37: required => 1,
38: isa => duck_type( [qw(process error)] ),
39: lazy_build => 1,
40: );
41: sub _build_renderer {
42: Template->new( INCLUDE_PATH => $FindBin::Bin . '/../tt/' );
43: }
44:
45: sub run {
46: my ($self) = @_;
47: my $html = $self->fetch;
48: my $data = $self->find($html);
49: $self->write($data);
50: }
51:
52: sub fetch {
53: my ($self) = @_;
54:
55: my $res = $self->ua->get('http://www.ezrss.it/feed');
56: if ( $res->is_success ) {
57: return $res->decoded_content;
58: }
59: else {
60: die $res->status_line;
61: }
62: }
63:
64: sub find {
65: my ( $self, $html ) = @_;
66: my @data;
67: my $feed = XML::Feed->parse( \$html );
68: foreach my $item ( $feed->entries ) {
69: next unless $item->title =~ /\s1x1\s/ || $item->title =~ /s01e01/i;
70: next if $item->enclosure->length > 800_000_000;
71: next if $item->title =~ /720p/i;
72: push(
73: @data,
74: {
75: title => $item->title,
76: size =>
77: $self->formatter->format_bytes( $item->enclosure->length ),
78: url => $item->enclosure->url,
79: }
80: );
81: }
82: return \@data if @data;
83: }
84:
85: sub write {
86: my ( $self, $data ) = @_;
87:
88: my $renderer = $self->renderer;
89: my $out;
90: $renderer->process( 'new_series.tt', { data => $data }, \$out )
91: || die $renderer->error();
92: return $out;
93: }
94:
95: __PACKAGE__->meta->make_immutable;
96: 1;