#!/usr/bin/perl -w
# $Id: itunes-encode,v 1.2 2007/06/15 16:07:49 moquist Exp moquist $

# Usage:
# Create an iTunes playlist and burn it to a CD.  Export the Song List
# as a plain text file.  Then put your burned CD in the drive, cd to a clean
# directory, and run 'cdparanoia -B'.  Then:
#
# cat itunes-playlist.txt | itunes-encode [ -o ] [ -d ] [ -q <-1...10> ]
# -o for ogg-vorbis output, flac is default
# -d for debug
# -q for oggenc quality
#
# You may want to change the $fn_dir setting below; I have it set to
# "$fn_artist/$fn_album", but you might like something else.

use Getopt::Std;
require "/home/moquist/bin/mungefilename.pm";

getopts("doq:");

if (!$opt_q) { $opt_q = 3; }
if ($opt_d) {
  print "opt_q: $opt_q\n";
}

if (defined($opt_o)) {
  $extension = "ogg";
} else {
  $extension = "flac";
}

$dosinput = <STDIN>;
my @unixinput = split //,$dosinput;

my $cddanum = 1;
foreach my $line (@unixinput) {
  chomp $line;
  if ($line =~ /^[^A-Za-z0-9]*Name/) {
    next;
  }

  @fields = split /\t/,$line;
  my $trackname = $fields[0];
  my $artist = $fields[1];
  my $composer = $fields[2];
  my $album = $fields[3];
  my $genre = $fields[5];
  my $tracknum = $fields[10];
  my $trackcount = $fields[11];
  my $year = $fields[12];

  if ($opt_d) {
    print "Track Name: $trackname\n";
    print "\tArtist: $artist\n";
    print "\tComposer: $composer\n";
    print "\talbum: $album\n";
    print "\tGenre: $genre\n";
    print "\tTrack Number: $tracknum\n";
    print "\tTrack Count: $trackcount\n";
    print "\tYear: $year\n";
  }
  my $fn_trackname = &mungefilename($trackname);
  my $fn_artist = &mungefilename($artist);
  my $fn_album = &mungefilename($album);
  my $fn_tracknum = &mungefilename($tracknum);
  my $length = length $trackcount;
  my $fn_dir = "$fn_artist/$fn_album";
  my $fn = sprintf ("%s/%0${length}s-%s.$extension",
                    $fn_dir, $fn_tracknum, $fn_trackname);

  if ($opt_d) { print "fn: $fn\n"; }

  my $cddafile = sprintf ("track%02d.cdda.wav", $cddanum);
  system ("mkdir -p \"$fn_dir\"");

  if (defined($opt_o)) {
    system ("oggenc -q $opt_q -o \"$fn\" -d \"$year\" -N \"$tracknum\" -t \"$trackname\" -l \"$album\" -a \"$artist\" -G \"$genre\" $cddafile");
  } else {
    # do flac
    system ("flac --best -o \"$fn\" $cddafile");
    open TAGFLAC, "| metaflac --import-tags-from=- \"$fn\"";
    print TAGFLAC "ARTIST=$artist\n";
    print TAGFLAC "ALBUM=$album\n";
    print TAGFLAC "TITLE=$trackname\n";
    print TAGFLAC "DATE=$year\n";
    print TAGFLAC "GENRE=$genre\n";
    print TAGFLAC "TRACKNUMBER=$tracknum\n";
    close TAGFLAC;
  }

  $cddanum++;
}

# Here is an example mungefilename function.
# mungefilename ()
# {
#   echo "$@" | perl -e 'while (<STDIN>) {print lc;}'     \
#             | sed 's/\&/and/g'                          \
#             | sed 's/ /-/g'
# }

