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 )