Net-BitTorrent
view release on metacpan or search on metacpan
lib/Net/BitTorrent/Torrent/Generator.pm view on Meta::CPAN
$info->{pieces} = $self->_generate_pieces_v1();
return $self->_wrap_torrent( $info, $piece_layers );
}
method _base_info () {
my $info = { name => path($base_path)->basename, 'piece length' => $piece_length, private => $private, };
if ( @files == 1 && !$files[0]{padding} ) {
$info->{length} = $files[0]{size};
}
else {
$info->{files} = [ map { { length => $_->{size}, path => [ split m{/}, $_->{rel} ] } } @files ];
}
return $info;
}
method _wrap_torrent ( $info, $piece_layers = undef ) {
my $torrent = { info => $info, 'created by' => 'Net::BitTorrent 2.0.0', 'creation date' => time(), };
$torrent->{'piece layers'} = $piece_layers if $piece_layers;
$torrent->{announce} = $trackers[0] if @trackers;
$torrent->{'announce-list'} = [ map { [$_] } @trackers ] if @trackers > 1;
$torrent->{nodes} = \@nodes if @nodes;
lib/Net/BitTorrent/Torrent/Generator.pm view on Meta::CPAN
use Digest::Merkle::SHA256;
my $file_tree = {};
my %piece_layers;
for my $file ( grep { !$_->{padding} } @files ) {
my $merkle = Digest::Merkle::SHA256->new( file_size => $file->{size} );
my $fh = $file->{abs}->openr_raw;
my $block_idx = 0;
while ( read( $fh, my $block, 16384 ) ) {
$merkle->set_block( $block_idx++, sha256($block) );
}
my @path = split m{/}, $file->{rel};
my $curr = $file_tree;
my $name = pop @path;
$curr = ( $curr->{$_} //= {} ) for @path;
$curr->{$name} = { '' => { length => $file->{size}, 'pieces root' => $merkle->root } };
if ( $file->{size} > $piece_length ) {
$piece_layers{ $merkle->root } = $merkle->get_piece_layer($piece_length);
}
}
return ( $file_tree, \%piece_layers );
}
( run in 1.608 second using v1.01-cache-2.11-cpan-71847e10f99 )