How to do it - Bread::Board
file: code/BreadBoard/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:
9: has 'ua' => (
10: is => 'ro',
11: required => 1,
12: isa => duck_type( [qw(get)] ),
13: );
14:
15: has 'formatter' => (
16: is => 'ro',
17: required => 1,
18: isa => duck_type( [qw(format_bytes)] ),
19: );
20:
21: has 'renderer' => (
22: is => 'ro',
23: required => 1,
24: isa => duck_type( [qw(process error)] ),
25: );
26:
27: sub run {
28: my ($self) = @_;
29: my $html = $self->fetch;
30: my $data = $self->find($html);
31: $self->write($data);
32: }
33:
34: sub fetch {
35: my ($self) = @_;
36:
37: my $res = $self->ua->get('http://www.ezrss.it/feed');
38: if ( $res->is_success ) {
39: return $res->decoded_content;
40: }
41: else {
42: die $res->status_line;
43: }
44: }
45:
46: sub find {
47: my ( $self, $html ) = @_;
48: my @data;
49: my $feed = XML::Feed->parse( \$html );
50: foreach my $item ( $feed->entries ) {
51: next unless $item->title =~ /\s1x1\s/ || $item->title =~ /s01e01/i;
52: next if $item->enclosure->length > 800_000_000;
53: next if $item->title =~ /720p/i;
54: push(
55: @data,
56: {
57: title => $item->title,
58: size =>
59: $self->formatter->format_bytes( $item->enclosure->length ),
60: url => $item->enclosure->url,
61: }
62: );
63: }
64: return \@data if @data;
65: }
66:
67: sub write {
68: my ( $self, $data ) = @_;
69:
70: my $renderer = $self->renderer;
71: my $out;
72: $renderer->process( 'new_series.tt', { data => $data }, \$out )
73: || die $renderer->error();
74: return $out;
75: }
76:
77: __PACKAGE__->meta->make_immutable;
78: 1;