/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

  1. package Data::Interleave::IcecastMetadata;
  2. use Mouse;
  3. use POSIX;
  4. has interval => (
  5. is => 'rw',
  6. isa => 'Int',
  7. default => 16 * 1024,
  8. );
  9. has pos => (
  10. is => 'rw',
  11. isa => 'Int',
  12. lazy => 1,
  13. default => sub { $_[0]->interval },
  14. );
  15. has position => (
  16. is => 'rw',
  17. isa => 'Int',
  18. default => 0,
  19. );
  20. has metadata => (
  21. is => 'rw',
  22. isa => 'HashRef',
  23. default => sub { +{} },
  24. );
  25. __PACKAGE__->meta->make_immutable;
  26. no Mouse;
  27. sub interleave {
  28. my ($self, $data) = @_;
  29. my $interleaved = '';
  30. my $title = $self->metadata->{title} || '';
  31. utf8::encode $title if utf8::is_utf8 $title;
  32. my $meta = qq(StreamTitle='$title';);
  33. my $len = ceil(length($meta) / 16);
  34. $meta = chr($len) . $meta . ("\x00" x (16 * $len - length $meta));
  35. while (length($data) >= $self->pos) {
  36. $interleaved .= substr $data, 0, $self->pos, '';
  37. $interleaved .= $meta;
  38. $self->reset_position;
  39. }
  40. $interleaved .= $data;
  41. $self->{pos} -= length $data;
  42. return $interleaved;
  43. }
  44. sub reset_position {
  45. my $self = shift;
  46. $self->pos($self->interval);
  47. }
  48. 1;