#!/usr/bin/perl -w

use strict ;

my $file = $ARGV[0] || die ;

sub test_mime {
  my $file = shift ;
  if (`which file`) {
    return `file -b --mime-type "$file"`;
  }
}

if (($file =~ /\.mp3$/i) || (test_mime($file) =~ /audio\/mpeg/))  {

  if (`which mp3gain`) {

    my $out = `mp3gain -q "$file" 2> /dev/null` ;
    $out =~ /Recommended "Track" dB change: (.*)$/m || die ;
    print "$1 dB\n" ;

  } else {

    print STDERR "Cannot find mp3gain binary!\n";

  }

} elsif (($file =~ /\.ogg$/i) || (test_mime($file) =~ /application\/ogg/)) {

  if ((`which vorbisgain`) && (`which ogginfo`)) {

    system("vorbisgain -q -f \"$file\" 2>/dev/null >/dev/null") ;
    my $info = `ogginfo "$file"` ;
    $info =~ /REPLAYGAIN_TRACK_GAIN=(.*) dB/ || die ;
    print "$1 dB\n" ;

  } else {

    print STDERR "Cannot find vorbisgain or ogginfo!\n";

  }

} elsif (($file =~ /\.flac$/i) || (test_mime($file) =~ /audio\/x-flac/)) {

  if (`which metaflac`) {

    my $info = `metaflac --show-tag=REPLAYGAIN_TRACK_GAIN "$file"` ;
    $info =~ /REPLAYGAIN_TRACK_GAIN=(.*) dB/;
    if (defined($1)) {

        print "$1 dB\n" ;

    } else {

      system("metaflac --add-replay-gain \"$file\" \
              2>/dev/null >/dev/null") ;
      $info = `metaflac --show-tag=REPLAYGAIN_TRACK_GAIN "$file"` ;
      $info =~ /REPLAYGAIN_TRACK_GAIN=(.*) dB/ || die "Error in $file" ;
      print "$1 dB\n" ;

    }

  } else {

    print STDERR "Cannot find metaflac!\n";

  }

} else {

  print STDERR "File format not supported...\n";

}