MP3-M3U-Parser
view release on metacpan or search on metacpan
lib/MP3/M3U/Parser.pm view on Meta::CPAN
sub _check_parse_file_params {
my($self, $file) = @_;
my $ref = ref $file;
if ( $ref && $ref ne 'GLOB' && $ref ne 'SCALAR' ) {
croak "Unknown parameter of type '$ref' passed to parse()";
}
my $cd;
if ( ! $ref ) {
my @tmp = split m{[\\/]}xms, $file;
($cd = pop @tmp) =~ s{ [.] m3u }{}xmsi;
}
my $this_file = $ref ? 'ANON'.$self->{ANON}++ : $self->_locate_file($file);
$self->{'_M3U_'}[ $self->{INDEX} ] = {
file => $this_file,
list => $ref ? $this_file : ($cd || EMPTY_STRING),
drive => DEFAULT_DRIVE,
data => [],
total => 0,
};
$self->{TOTAL_FILES} += 1; # Total lists counter
my($fh, @fh);
if ( $ref eq 'GLOB' ) {
$fh = $file;
}
elsif ( $ref eq 'SCALAR' ) {
@fh = split m{\n}xms, ${$file};
}
else {
# Open the file to parse:
require IO::File;
$fh = IO::File->new;
$fh->open( $file, '<' ) or croak "I could't open '$file': $!";
}
return $ref, $fh, @fh;
}
lib/MP3/M3U/Parser.pm view on Meta::CPAN
}
sub _extract_artist_song {
my($self, $i) = @_;
# Try to extract artist and song info
# and remove leading and trailing spaces
# Some artist names can also have a "-" in it.
# For this reason; require that the data has " - " in it.
# ... but the spaces can be one or more.
# So, things like "artist-song" does not work...
my($artist, @xsong) = split m{\s{1,}-\s{1,}}xms, $i->[ID3] || $i->[PATH];
if ( $artist ) {
$artist = $self->_trim( $artist );
$artist =~ s{.*[\\/]}{}xms; # remove path junk
$i->[ARTIST] = $artist;
}
if ( @xsong ) {
my $song = join q{-}, @xsong;
$song = $self->_trim( $song );
$song =~ s{ [.] [a-zA-Z0-9]+ \z }{}xms; # remove extension if exists
$i->[SONG] = $song;
lib/MP3/M3U/Parser.pm view on Meta::CPAN
my $index = 0; # index number of the list array
my $temp_sec; # must be defined outside
RECORD: while ( my $m3u = $next->() ) {
chomp $m3u;
next if ! $m3u; # Record may be blank if it is not a disk file.
$#{$dkey->[$index]} = MAXDATA; # For the absence of EXTINF line.
# If the extra information exists, parse it:
if ( $m3u =~ RE_INF_HEADER ) {
my($j, $sec, @song);
($j ,@song) = split m{\,}xms, $m3u;
($j ,$sec) = split m{:}xms, $j;
$temp_sec = $sec;
$ttime += $sec;
$dkey->[$index][ID3] = join q{,}, @song;
$dkey->[$index][LEN] = $self->_seconds($sec || 0);
$taver++;
next RECORD; # jump to path info
}
my $i = $dkey->[$index];
$self->_extract_path( $i, $m3u, $device, \$tsong );
lib/MP3/M3U/Parser/Export.pm view on Meta::CPAN
sub _export_to_html {
my($self, $encoding, $drives, $to_scalar, $file) = @_;
my $OUTPUT = EMPTY_STRING;
# I don't think that weird numbers in the html mean anything
# to anyone. So, if you didn't want to format seconds in your
# code, I'm overriding it here (only for export(); Outside
# export(), you'll get the old value):
my $old_seconds = $self->{seconds};
$self->{seconds} = 'format';
my %t;
@t{ qw( up cd data down ) } = split m{\Q<!-- MP3DATASPLIT -->\E}xms,
$self->_template;
foreach (keys %t) {
$t{$_} = $self->_trim( $t{$_} );
}
my $tmptime = $self->{TOTAL_TIME} ? $self->_seconds($self->{TOTAL_TIME})
: undef;
my @tmptime;
if ($tmptime) {
@tmptime = split m{:}xms,$tmptime;
unshift @tmptime, 'Z' if $#tmptime <= 1;
}
my $average = $self->{AVERAGE_TIME}
? $self->_seconds( $self->{AVERAGE_TIME} )
: '<i>Unknown</i>'
;
my $HTML = {
ENCODING => $encoding,
t/06-sub_search.t view on Meta::CPAN
package MyParser;
use base qw( MP3::M3U::Parser );
sub _search { ## no critic (ProhibitUnusedPrivateSubroutines)
my $self = shift;
my $path = shift;
my $id3 = shift;
my $search = $self->{search_string};
return 0 if ! $id3 && ! $path;
my @search = split m{ \s+ }xms, $search;
my %c = (id3 => 0, path => 0);
foreach my $s ( @search ) {
$c{id3 }++ if $id3 =~ m{$s}xmsi;
$c{path}++ if $path =~ m{$s}xmsi;
}
return 1 if $c{id3} == @search || $c{path} == @search;
return 0;
}
( run in 0.473 second using v1.01-cache-2.11-cpan-71847e10f99 )