use strict; $|=1; package Piratebay; use strict; use WebServer; sub new { return bless { svr=>WebServer->new("http://thepiratebay.org") }, shift; } # 100 Audio # 101 Music # 102 Audio books # 103 Sound clips # 104 FLAC # 199 Other # 200 Video # 201 Movies # 202 Movies DVDR # 203 Music videos # 204 Movie clips # 205 TV shows # 206 Handheld # 207 Highres - Movies # 208 Highres - TV shows # 299 Other # 300 Applications # 301 Windows # 302 Mac # 303 UNIX # 304 Handheld # 399 Other OS # 400 Games # 401 PC # 402 Mac # 403 PS2 # 404 XBOX360 # 405 Wii # 406 Handheld # 499 Other # 600 Other # 601 E-books # 602 Comics # 603 Pictures # 604 Covers # 699 Other # 1 name # 3 uploaded # 5 size # 7 seeders # 9 leechers # 11 uploader # 13 type # +0 = ascending # +1 = descending sub parseline { my %r; if ($_[0] =~ /.*?\(/s) { $r{category}= $1; } while ($_[0] =~ /(\d+)<\/td>/gs) { if (exists $r{seeders}) { $r{leechers}= $1; } else { $r{seeders}= $1; } } if ($_[0] =~ /class="detLink" title="Details for (.*?)">/) { $r{description}= $1; } if ($_[0] =~ /magnet:\?xt=urn:btih:(\w+)/) { $r{infohash}= pack("H*", $1); } if ($_[0] =~ /Uploaded (.*?), Size (\S+?), ULed by (.*?)<\/font>/) { $r{uploaded}=$1; $r{size}=$2; $r{uploader}=$3; $r{uploaded} =~ s/ / /g; $r{uploaded} =~ s/<[^>]*>//g; $r{size} =~ s/ / /g; $r{uploader} =~ s/ / /g; $r{uploader} =~ s/<[^>]*>//g; } return \%r; } sub parseresult { if ($_[0] =~ /(.*?)<\/table>/s) { my $tab= $1; my @res; while ($tab =~ /(.*?)<\/tr>/gs) { my $line= $1; next if ($line =~ /"text-align:center;"/); push @res, parseline($line); } return \@res; } return []; } sub browse { my ($self, $class, $order, $page)= @_; print("===browse/$class/$page/$order\n"); my $rp= $self->{svr}->httpget("/browse/$class/$page/$order"); return parseresult($rp->content); } sub recent { my ($self, $page)= @_; print("===recent/$page\n"); my $rp= $self->{svr}->httpget("/recent/$page"); return parseresult($rp->content); } package main; use strict; use GetOpt::Long; my $tpb= Piratebay->new(); if (@ARGV==0) { for (my $p=0 ; ; $p++) { my $l= $tpb->recent($p); last if !@$l; printresults($l); } } else { my ($c, $o)= @ARGV; $o=3 unless defined $o; for (my $p=0 ; ; $p++) { my $l= $tpb->browse($c, $o, $p); last if !@$l; printresults($l); } } sub printresults { my ($l)= @_; for my $r (@$l) { printf("%4d %4d %3d %-11s %-11s %-16s %s %s\n", $r->{seeders}, $r->{leechers}, $r->{category}, $r->{uploaded}, $r->{size}, $r->{uploader}, unpack("H*", $r->{infohash}), $r->{description}); } }