#!/usr/local/bin/perl -w use Test::More; use strict; use MP3::Info 1.02; use File::Path; use File::Spec::Functions qw(catfile catdir devnull); # this test takes a long time -- even up to an hour -- so it is # turned off by default. if you want to run it, just comment # this block out. BEGIN { plan tests => 1; pass("Test disabled; see source for more information"); exit; } ### NOTE # sometimes lame pukes on an MP3. if you get a few errors in the test, run # with `make test TEST_VERBOSE=1` (if you are running via make test) and # find out which file(s) are not working; delete those manually, and re-run # the tests. the files currently are not deleted when the tests complete; # you may wish to manually delete them later. my($lame, @mp3s, %files); my @lamedirs = qw(/sw/bin /usr/local/bin /usr/bin); my @lopts = qw(--silent); # this is in newer versions of lame my $file = 'test.aiff'; my $dir = 'lamemp3s'; my $tdir = 't'; my %hopts = ( v => [undef, 'true'], # c => [undef, 'true'], b => [ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 192, 224, 256, 320], resample => [ 16, 22.05, 24, 32, 44.1, 48], # 8, 11.025, 12, 'm' => [qw(m s j f d)], ); my %mmap = ( 'm' => 3, 's' => 0, j => 1, d => 2, f => 1 ); my %fmap = ( 1 => { map { ($_, 1) } (32, 44.1, 48) }, 2 => { map { ($_, 1) } (16, 22.05, 24) }, ); for my $lamedir (@lamedirs) { last if -x ($lame = catfile($lamedir, 'lame')); } unless (-x $lame) { plan tests => 1; pass("No lame found"); exit; } if ( ! -e $file && (-e catfile($tdir, $file)) ) { $file = catfile($tdir, $file); $dir = catdir($tdir, $dir); } exit if ! -e $file; # hrm mkpath $dir; { # define MP3s to create for my $opt (sort keys %hopts) { if (! @mp3s) { for (@{$hopts{$opt}}) { push @mp3s, { $opt => $_ }; } } else { my @newmp3s; for my $mp3 (@mp3s) { for (@{$hopts{$opt}}) { push @newmp3s, { %$mp3, $opt => $_ }; } } @mp3s = @newmp3s; } } } { # create MP3s my($done, $total) = (0, scalar @mp3s); diag("Creating $total MP3s, this could take a long time"); print "# $done of $total\n"; for my $set (@mp3s) { my(@nopts, @output); for my $nopt (sort keys %$set) { if (defined $set->{$nopt}) { push @output, $nopt; push @nopts, length($nopt) > 1 ? "--$nopt" : "-$nopt"; if ($set->{$nopt} ne 'true') { push @nopts, $set->{$nopt}; push @output, $set->{$nopt}; } } } my $output = sprintf 'test-%s.mp3', join '_', @output; $files{$output}++; my $ofile = catfile($dir, $output); qx($lame @lopts @nopts $file $ofile 2>/dev/null) unless -e $ofile; print "# $done of $total\n" if ++$done =~ /00$/; } } print "# Deleting empty MP3s\n"; { # delete empty files for my $file (keys %files) { my $f = catfile($dir, $file); if (-z $f) { unlink $f; delete $files{$file}; } } } my $numtests = 8; plan tests => $numtests * scalar keys %files; MP3S: for my $file (sort keys %files) { my $info = get_mp3info(catfile($dir, $file)); if (!$info) { my $err = $@; for (1..$numtests) { fail("$file: $err"); } next MP3S; } my($b, $c, $m, $f, $v) = $file =~ /^test-b_(\d+)(_c)?_m_(\w)_resample_([\d.]+)(_v)?\.mp3$/ or do { for (1..$numtests) { fail("$file: name incorrect"); } next MP3S; }; $v = $v ? $b == 320 ? 0 : 1 : 0; my $ver = $fmap{1}{$f} ? 1 : $fmap{2}{$f} ? 2 : 3; is($info->{VBR}, $v, "VBR : $file"); is($info->{FREQUENCY}, $f, "FREQ: $file"); is($info->{MODE}, $mmap{$m}, "MODE: $file"); is($info->{VERSION}, $ver, "VERS: $file"); is($info->{LAYER}, 3, "LAYR: $file"); is($info->{TIME}, "00:01", "SECS: $file"); is($info->{COPYRIGHT}, $c?1:0, "COPY: $file"); if ($v) { ok($info->{BITRATE} >= ($b - 10), "BITR: $file, $info->{BITRATE} >= $b"); } else { is($info->{BITRATE}, $b, "BITR: $file"); } } if (0) { # clean up files, but honestly ... it takes so long to do it, just leave them for my $file (keys %files) { my $f = catfile($dir, $file); unlink $f; } } __END__