How NOT to do it, but a bit better
file: code/LessBadExample/FindNewSeries.pm
1: package FindNewSeries;
2: use 5.014;
3: use Moose;
4: use namespace::autoclean;
5:
6: use LWP::UserAgent;
7: use XML::Feed;
8: use Number::Format;
9: use Template;
10:
11: my $ua = LWP::UserAgent->new(
12: agent => 'domms new series finder',
13: timeout => 5,
14: );
15:
16: my $formatter = Number::Format->new;
17:
18: my $tt = Template->new( INCLUDE_PATH => $FindBin::Bin . '/../tt/', );
19:
20: sub run {
21: my ($self) = @_;
22: my $html = $self->fetch;
23: my $data = $self->find($html);
24: $self->write($data);
25: }
26:
27: sub fetch {
28: my ($self) = @_;
29:
30: my $res = $ua->get('http://www.ezrss.it/feed');
31: if ( $res->is_success ) {
32: return $res->decoded_content;
33: }
34: else {
35: die $res->status_line;
36: }
37: }
38:
39: sub find {
40: my ( $self, $html ) = @_;
41: my @data;
42: my $feed = XML::Feed->parse( \$html );
43: foreach my $item ( $feed->entries ) {
44: next unless $item->title =~ /\s1x1\s/ || $item->title =~ /s01e01/i;
45: next if $item->enclosure->length > 800_000_000;
46: next if $item->title =~ /720p/i;
47: push(
48: @data,
49: {
50: title => $item->title,
51: size => $formatter->format_bytes( $item->enclosure->length ),
52: url => $item->enclosure->url,
53: }
54: );
55: }
56: return \@data if @data;
57: }
58:
59: sub write {
60: my ( $self, $data ) = @_;
61:
62: my $out;
63: $tt->process( 'new_series.tt', { data => $data }, \$out )
64: || die $tt->error();
65: return $out;
66: }
67:
68: __PACKAGE__->meta->make_immutable;
69: 1;