#!/usr/bin/perl -s
# mp3time - show total time of mp3 files

$ENV{PATH}="/bin:/usr/bin";
$ENV{BASH_ENV}="";

$mp3info = "/usr/bin/mp3info";
@mopts = ("-p", "%S\n"); # was -F1
$tfld = 17; # 17th field is seconds (in old mp3info)

foreach $a (@ARGV) {
    if (-d $a) {
	$seconds = &mp3secs(<$a/*.mp3>);
	push(@seclist,$seconds);
	&printtime($a,$seconds);
    } elsif (-f $a) {
	$seconds = &mp3secs($a);
	push(@seclist,$seconds);
	&printtime($a,$seconds);
    } else {
	print STDERR "Invalid name $a\n";
	next;
    }
}
if ($#ARGV > 0) {
    $seconds = 0;
    map { $seconds += $_ } @seclist;
    &printtime("------",$seconds);
}
exit 0;


sub printtime {
    my $name = shift;
    my $seconds = shift;

    my $minutes = $seconds/60;
    my $hours = $minutes/60;
    my $days = $hours/24;
    my $printed = 0;

    #my $opts = $s + $m + $h + $d;

    if ($name) {
	print "$name\t";
    }
    if ($s) {
	print "$seconds\t";
	$printed++;
    }
    if ($m) {
	if ($c) {
	    my ($min,$sec);
	    $min=int($minutes);
	    $sec=int(($minutes-$min)*60);
	    printf "%6d:%02d\t",$min,$sec;
	} else {
	    printf "%8.2f\t",$minutes;
	}
	$printed++;
    }
    if ($h) {
	if ($c) {
	    my ($hr,$min);
	    $hr=int($hours);
	    $min=int(($hours-$hr)*60);
	    printf "%5d:%02d\t",$hr,$min;
	} else {
	    printf "%8.2f\t",$hours;
	}
	$printed++;
    }
    if ($d) {
	if ($c) {
	    my ($dy,$hr);
	    $dy=int($days);
	    $hr=int(($days-$dy)*60);
	    printf "%3d:%02d\t",$dy,$hr;
	} else {
	    printf "%6.2f",$days;
	}
	$printed++;
    }
    if ($printed) {
	print "\n";
    } else {
	    printf "%d\t%8.2f\t%8.2f\t%6.2f\n",
		$seconds, $minutes, $hours, $days;
    }
}

sub mp3secs {
    my @margs = @_;
    my $seconds = 0;

    #print STDERR "$mp3info $mopts @margs\n";
    #open(INFO,"$mp3info $mopts @margs|");
    $pid = open(INFO, "-|");
    if ($pid) {   # parent
	while (<INFO>) {
	    #print STDERR;
	    $t = $_;
	    #$t = (split(/\|/, $_))[$tfld];
	    $seconds += $t;
	    #print STDERR "$t\n";
	}
        close(INFO) || warn "mp3info exited with $?\n";
    } else {      # child
	exec($mp3info, @mopts, @margs)
		|| die "can't exec program: $!";
	# NOTREACHED
    }

    return $seconds;
}
