/lib/Data/Interleave/IcecastMetadata.pm
http://github.com/motemen/Teto · Perl · 61 lines · 48 code · 13 blank · 0 comment · 3 complexity · 3b65c616108b8e1ea7d3833bea4ee3ec MD5 · raw file
- package Data::Interleave::IcecastMetadata;
- use Mouse;
- use POSIX;
- has interval => (
- is => 'rw',
- isa => 'Int',
- default => 16 * 1024,
- );
- has pos => (
- is => 'rw',
- isa => 'Int',
- lazy => 1,
- default => sub { $_[0]->interval },
- );
- has position => (
- is => 'rw',
- isa => 'Int',
- default => 0,
- );
- has metadata => (
- is => 'rw',
- isa => 'HashRef',
- default => sub { +{} },
- );
- __PACKAGE__->meta->make_immutable;
- no Mouse;
- sub interleave {
- my ($self, $data) = @_;
- my $interleaved = '';
- my $title = $self->metadata->{title} || '';
- utf8::encode $title if utf8::is_utf8 $title;
- my $meta = qq(StreamTitle='$title';);
- my $len = ceil(length($meta) / 16);
- $meta = chr($len) . $meta . ("\x00" x (16 * $len - length $meta));
- while (length($data) >= $self->pos) {
- $interleaved .= substr $data, 0, $self->pos, '';
- $interleaved .= $meta;
- $self->reset_position;
- }
- $interleaved .= $data;
- $self->{pos} -= length $data;
- return $interleaved;
- }
- sub reset_position {
- my $self = shift;
- $self->pos($self->interval);
- }
- 1;