line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package WWW::Search::Torrentz::Result; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
44617
|
use 5.014000; |
|
1
|
|
|
|
|
3
|
|
4
|
1
|
|
|
1
|
|
3
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
20
|
|
5
|
1
|
|
|
1
|
|
3
|
use warnings; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
21
|
|
6
|
1
|
|
|
1
|
|
391
|
use parent qw/WWW::SearchResult/; |
|
1
|
|
|
|
|
213
|
|
|
1
|
|
|
|
|
4
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
our $VERSION = '0.002'; |
9
|
|
|
|
|
|
|
|
10
|
1
|
|
|
1
|
|
23800
|
use HTML::TreeBuilder; |
|
1
|
|
|
|
|
20996
|
|
|
1
|
|
|
|
|
7
|
|
11
|
1
|
|
|
1
|
|
438
|
use URI::Escape qw/uri_escape/; |
|
1
|
|
|
|
|
911
|
|
|
1
|
|
|
|
|
589
|
|
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
sub new{ |
14
|
1
|
|
|
1
|
1
|
72
|
my ($class, %args) = @_; |
15
|
1
|
|
|
|
|
9
|
my $self = $class->SUPER::new(@_); |
16
|
1
|
|
|
|
|
15
|
$self->{parsed} = 0; |
17
|
|
|
|
|
|
|
|
18
|
1
|
|
|
|
|
8
|
$self->_elem($_ => $args{$_}) for qw/title verified age size seeders leechers infohash/; |
19
|
1
|
|
|
|
|
30
|
$self->{ua} = $args{ua}; |
20
|
1
|
|
|
|
|
8
|
$self->add_url("https://torrentz.eu/$args{infohash}"); |
21
|
1
|
|
|
|
|
13
|
$self |
22
|
|
|
|
|
|
|
} |
23
|
|
|
|
|
|
|
|
24
|
2
|
|
|
2
|
1
|
313
|
sub infohash { shift->_elem(infohash => @_) } |
25
|
1
|
|
|
1
|
1
|
518
|
sub verified { shift->_elem(verified => @_) } |
26
|
1
|
|
|
1
|
1
|
306
|
sub age { shift->_elem(age => @_) } |
27
|
1
|
|
|
1
|
1
|
296
|
sub size { shift->_elem(size => @_) } |
28
|
1
|
|
|
1
|
1
|
310
|
sub seeders { shift->_elem(seeders => @_) } |
29
|
1
|
|
|
1
|
1
|
335
|
sub leechers { shift->_elem(leechers => @_) } |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
sub magnet{ |
32
|
1
|
|
|
1
|
1
|
342
|
my ($self, $full) = @_; |
33
|
1
|
|
|
|
|
2
|
my $infohash = $self->infohash; |
34
|
1
|
|
|
|
|
6
|
my $title = uri_escape $self->title; |
35
|
1
|
|
|
|
|
35
|
my $uri = "magnet:?xt=urn:btih:$infohash&dn=$title"; |
36
|
|
|
|
|
|
|
|
37
|
1
|
50
|
|
|
|
3
|
$uri .= join '', map { "&tr=$_"} map { uri_escape $_ } $self->trackers if $full; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
38
|
|
|
|
|
|
|
|
39
|
1
|
|
|
|
|
4
|
$uri |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
sub parse_page { |
43
|
0
|
|
|
0
|
1
|
|
my $self = $_[0]; |
44
|
0
|
|
|
|
|
|
my $tree = HTML::TreeBuilder->new; |
45
|
0
|
|
|
|
|
|
$tree->utf8_mode(1); |
46
|
0
|
|
|
|
|
|
$tree->parse($self->{ua}->get($self->url)->content); |
47
|
0
|
|
|
|
|
|
$tree->eof; |
48
|
|
|
|
|
|
|
|
49
|
0
|
|
|
|
|
|
my $trackers = $tree->look_down(class => 'trackers'); |
50
|
0
|
|
0
|
|
|
|
$self->{trackers} //= []; |
51
|
0
|
|
|
|
|
|
for my $tracker ($trackers->find('dl')) { |
52
|
0
|
|
|
|
|
|
push @{$self->{trackers}}, $tracker->find('a')->as_text; |
|
0
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
} |
54
|
|
|
|
|
|
|
|
55
|
0
|
|
|
|
|
|
my $files = $tree->look_down(class => 'files'); |
56
|
0
|
|
0
|
|
|
|
$self->{files} //= []; |
57
|
0
|
|
|
|
|
|
$self->parse_directory(scalar $files->find('li'), ''); |
58
|
|
|
|
|
|
|
|
59
|
0
|
|
|
|
|
|
$self->{parsed} = 1; |
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
sub parse_directory{ |
63
|
0
|
|
|
0
|
0
|
|
my ($self, $directory, $prefix) = @_; |
64
|
0
|
|
|
|
|
|
$prefix .= $directory->as_text . '/'; |
65
|
0
|
|
|
|
|
|
my $contents_ul = $directory->right->find('ul'); |
66
|
0
|
0
|
|
|
|
|
return unless defined $contents_ul; # Empty directory |
67
|
0
|
|
|
|
|
|
my @children = $contents_ul->content_list; |
68
|
0
|
|
|
|
|
|
my $skip = 0; |
69
|
0
|
|
|
|
|
|
for my $child (@children) { |
70
|
0
|
0
|
|
|
|
|
if ($skip) { |
71
|
0
|
|
|
|
|
|
$skip = 0; |
72
|
0
|
|
|
|
|
|
next; |
73
|
|
|
|
|
|
|
} |
74
|
|
|
|
|
|
|
|
75
|
0
|
0
|
0
|
|
|
|
if (defined $child->attr('class') && $child->attr('class') eq 't') { |
76
|
0
|
|
|
|
|
|
$self->parse_directory($child, $prefix); |
77
|
0
|
|
|
|
|
|
$skip = 1; |
78
|
|
|
|
|
|
|
} else { |
79
|
0
|
|
|
|
|
|
$child->objectify_text; |
80
|
0
|
|
|
|
|
|
my ($filename, $size) = $child->find('~text'); |
81
|
0
|
|
|
|
|
|
push @{$self->{files}}, +{ |
|
0
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
path => $prefix.$filename->attr('text'), |
83
|
|
|
|
|
|
|
size => $size->attr('text') |
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
} |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
sub trackers{ |
90
|
0
|
|
|
0
|
1
|
|
my $self = $_[0]; |
91
|
0
|
0
|
|
|
|
|
$self->parse_page unless $self->{parsed}; |
92
|
0
|
|
|
|
|
|
@{$self->{trackers}} |
|
0
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
} |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
sub files{ |
96
|
0
|
|
|
0
|
1
|
|
my $self = $_[0]; |
97
|
0
|
0
|
|
|
|
|
$self->parse_page unless $self->{parsed}; |
98
|
0
|
|
|
|
|
|
@{$self->{files}} |
|
0
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
} |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
sub torrent{ |
102
|
0
|
|
|
0
|
1
|
|
my $self = $_[0]; |
103
|
0
|
|
|
|
|
|
my $torrage = 'http://torrage.com/torrent/' . uc $self->infohash . '.torrent'; |
104
|
0
|
|
|
|
|
|
my $torrent = $self->{ua}->get($torrage)->content; |
105
|
|
|
|
|
|
|
|
106
|
0
|
|
|
|
|
|
$torrent; # TODO: if this is undef, download metadata with magnet link |
107
|
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
1; |
110
|
|
|
|
|
|
|
__END__ |