You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
1.7 KiB

package Text::Playlist::PLS;
use strict;
use warnings;
use base 'Text::Playlist';
our $VERSION = 0.1;
sub new {
my ($class) = @_;
return bless({ }, $class);
}
sub parse {
my ($self, $text) = @_;
my @lines = split /\r?\n/, $text;
my @items = ();
# safeguard
return "Not looks like playlist"
unless grep { $_ eq "[playlist]" } @lines;
my $count = 0;
foreach my $line (@lines) {
if ($line =~ m/(File|Title|Length)(\d+)\s*=\s*(.*)/oi) {
my ($key, $num, $value) = (lc($1), $2 - 1, $3);
$value =~ s/(^\s*|\s*$)//og;
$items[$num] //= {};
$items[$num]->{$key} = $value;
next;
}
if ($line =~ m/numberofentries\s*=\s*(\d+)/oi) {
$count = $1;
next;
}
}
warn "Number of entries not matches parsed items"
if ($count != scalar @items);
return wantarray ? @items : [ @items ];
}
sub dump {
my ($self, @items) = @_;
my $count = 0;
my @lines = ('[playlist]');
foreach my $item (@items) {
$count += 1;
foreach my $key (qw(file title length)) {
push @lines, sprintf("%s%d=%s", ucfirst($key), $count, $item->{$key});
}
}
splice(@lines, 1, 0, sprintf("numberofentries=%d", $count));
push @lines, "Version=2", "";
return join("\n", @lines);
}
1;
__END__
=pod
=head1 NAME
Text::Playlist::PLS - parser for 'pls' format
=head1 DESCRIPTION
=head2 C<load>
=head2 C<parse>
=head2 C<save>
=head2 C<dump>
For description of these methods see description in base class L<Text::Playlist>
=head1 Item format
Each parsed item has the following keys in hashref:
* file -- path or url, required
* title -- title for given item, required
* length -- item duration in seconds, or -1 if not unknown
=head1 AUTHORS
Alex 'AdUser' Z <ad_user@runbox.com>
=cut