par2

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 3, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// PacketHeaderSize is the size of the PAR2 packet header in bytes
	PacketHeaderSize = 64

	// MinFileDescPacketSize is the minimum size for a file description packet
	// Header (64) + FileID (16) + FileMD5 (16) + Hash16k (16) + Length (8) = 120 bytes
	MinFileDescPacketSize = 120
)

Variables

View Source
var (
	// PacketTypePARMain is the main packet type "PAR 2.0\0Main\0\0\0\0"
	PacketTypePARMain = [16]byte{'P', 'A', 'R', ' ', '2', '.', '0', 0, 'M', 'a', 'i', 'n', 0, 0, 0, 0}

	// PacketTypeFileDesc is the file description packet type "PAR 2.0\0FileDesc"
	PacketTypeFileDesc = [16]byte{'P', 'A', 'R', ' ', '2', '.', '0', 0, 'F', 'i', 'l', 'e', 'D', 'e', 's', 'c'}

	// PacketTypeIFSC is the input file slice checksum packet type "PAR 2.0\0IFSC\0\0\0\0"
	PacketTypeIFSC = [16]byte{'P', 'A', 'R', ' ', '2', '.', '0', 0, 'I', 'F', 'S', 'C', 0, 0, 0, 0}

	// PacketTypeRecoverySlice is the recovery slice packet type "PAR 2.0\0RecvSlic"
	PacketTypeRecoverySlice = [16]byte{'P', 'A', 'R', ' ', '2', '.', '0', 0, 'R', 'e', 'c', 'v', 'S', 'l', 'i', 'c'}

	// PacketTypeCreator is the creator packet type "PAR 2.0\0Creator\0"
	PacketTypeCreator = [16]byte{'P', 'A', 'R', ' ', '2', '.', '0', 0, 'C', 'r', 'e', 'a', 't', 'o', 'r', 0}
)

PAR2 packet type identifiers Reference: https://github.com/akalin/gopar/blob/main/par2/packet.go

View Source
var MagicBytes = [8]byte{'P', 'A', 'R', '2', 0, 'P', 'K', 'T'}

MagicBytes is the PAR2 magic signature "PAR2\0PKT"

Functions

func GetFileDescriptors

func GetFileDescriptors(
	ctx context.Context,
	firstSegmentCache []*FirstSegmentData,
	poolManager pool.Manager,
) (map[[16]byte]*FileDescriptor, error)

GetFileDescriptors extracts file descriptors from PAR2 files in the NZB Similar to C# GetPar2FileDescriptorsStep.GetPar2FileDescriptors Uses cached first segment data and streams through the PAR2 file

func HasMagicBytes

func HasMagicBytes(data []byte) bool

HasMagicBytes checks if the provided data contains a valid PAR2 magic signature The PAR2 format uses "PAR2\0PKT" as its magic bytes at the start of each packet

Types

type FileDescriptor

type FileDescriptor struct {
	FileID  [16]byte // Unique file identifier (MD5 of [Hash16k, Length, Name])
	FileMD5 [16]byte // MD5 hash of entire file content
	Hash16k [16]byte // MD5 hash of first 16KB of file (for matching)
	Length  uint64   // File length in bytes
	Name    string   // Original filename (variable length, null-terminated, 4-byte aligned)
}

FileDescriptor represents a file description from a PAR2 FileDesc packet Reference: https://github.com/akalin/gopar/blob/main/par2/file_description_packet.go

type FirstSegmentData

type FirstSegmentData struct {
	File     *nzbparser.NzbFile
	RawBytes []byte // Up to 16KB for PAR2 detection
}

FirstSegmentData holds cached data from the first segment of an NZB file This is passed from the parser to avoid redundant fetches

type PacketHeader

type PacketHeader struct {
	Magic      [8]byte  // "PAR2\0PKT"
	Length     uint64   // Total packet length including header (must be multiple of 4)
	MD5Hash    [16]byte // MD5 hash of entire packet except first 32 bytes
	RecoveryID [16]byte // Recovery Set ID - same for all packets in a PAR2 set
	Type       [16]byte // Packet type identifier
}

PacketHeader represents the header of a PAR2 packet All PAR2 packets begin with this 64-byte header Reference: https://github.com/akalin/gopar/blob/main/par2/packet.go

type PacketReader

type PacketReader struct {
	// contains filtered or unexported fields
}

PacketReader provides streaming access to PAR2 packets Reference: https://github.com/akalin/gopar/blob/main/par2/packet.go

func NewPacketReader

func NewPacketReader(r io.Reader) *PacketReader

NewPacketReader creates a new PAR2 packet reader

func (*PacketReader) ReadFileDescriptor

func (pr *PacketReader) ReadFileDescriptor(header *PacketHeader) (*FileDescriptor, error)

ReadFileDescriptor reads a file descriptor from a FileDesc packet body The header must have already been read and validated as a FileDesc packet Reference: https://github.com/akalin/gopar/blob/main/par2/file_description_packet.go

func (*PacketReader) ReadHeader

func (pr *PacketReader) ReadHeader() (*PacketHeader, error)

ReadHeader reads and validates a PAR2 packet header from the stream

func (*PacketReader) SkipPacketBody

func (pr *PacketReader) SkipPacketBody(header *PacketHeader) error

SkipPacketBody skips the body of a packet (everything after the header)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL