NAME

Net::BitTorrent::Torrent::Generator - .torrent File Generator

SYNOPSIS

use Net::BitTorrent::Torrent::Generator;

my $gen = Net::BitTorrent::Torrent::Generator->new(
    base_path    => './my_files',
    piece_length => 262144 # 256KiB
);

# Add files to the torrent
$gen->add_file( 'linux-distro.iso' );
$gen->add_file( 'README.txt' );

# Add metadata
$gen->add_tracker( 'https://tracker.example.com/announce' );
$gen->add_node( 'router.bittorrent.com' , 6881);

# Generate the .torrent file data (bencoded)
my $v1_data     = $gen->generate_v1( );
my $v2_data     = $gen->generate_v2( );
my $hybrid_data = $gen->generate_hybrid( );

path('my_project.torrent')->spew_raw( $hybrid_data );

DESCRIPTION

Net::BitTorrent::Torrent::Generator allows you to programmatically create BitTorrent metadata files (.torrent). It supports the latest BEP 52 standards for BitTorrent v2 and hybrid swarms.

METHODS

new( %params )

Creates a new Generator object.

my $gen = Net::BitTorrent::Torrent::Generator->new(
    base_path => './data'
);

Expected parameters:

base_path

The root directory containing the files to be included in the torrent.

piece_length - optional

The size of each piece in bytes. Defaults to 262144 (256KiB).

add_file( $rel_path )

Adds a file from the base_path to the metainfo.

$gen->add_file( 'data/movie.mp4' );

If set_align_files( 1 ) has been called, this will automatically insert padding files (BEP 47) to ensure files start on piece boundaries, which is highly recommended for hybrid torrents.

Expected parameters:

$rel_path

The relative path to the file from the base path.

add_tracker( $url )

Adds a tracker URL.

$gen->add_tracker( 'udp://tracker.openbittorrent.com:80/announce' );

Expected parameters:

$url

The tracker announce URL.

add_node( $host, $port )

Adds a DHT bootstrap node.

$gen->add_node( 'router.bittorrent.com', 6881 );

Expected parameters:

$host

The hostname or IP.

$port

The port number.

set_private( $val )

Sets the private flag.

$gen->set_private( 1 );

If true, a client will only use trackers and will not enable DHT or PEX for this swarm.

Expected parameters:

$val

Boolean.

set_align_files( $val )

Sets whether to align files to piece boundaries (v2/hybrid).

$gen->set_align_files( 1 );

If true, ensures every file starts at the beginning of a piece by adding zero-filled padding files. This optimizes performance and allows for better cross-swarm deduplication.

Expected parameters:

$val

Boolean.

generate_v1( )

Generates a BitTorrent v1 .torrent file using SHA-1 piece hashes. Compatible with all clients.

my $raw = $gen->generate_v1();

generate_v2( )

Generates a BitTorrent v2 .torrent file. Uses SHA-256 and Merkle trees. Only compatible with v2-aware clients (Net::BitTorrent, libtorrent, etc.).

my $raw = $gen->generate_v2();

generate_hybrid( )

Generates a torrent containing both v1 and v2 metadata. This allows v1-only clients to participate in the same swarm as v2 clients. Recommended for maximum compatibility.

my $raw = $gen->generate_hybrid();

AUTHOR

Sanko Robinson <sanko@cpan.org>

COPYRIGHT

Copyright (C) 2008-2026 by Sanko Robinson.

This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.