Index: trunk/flactrack
===================================================================
--- trunk/flactrack	(revision 3)
+++ trunk/flactrack	(revision 4)
@@ -7,5 +7,8 @@
 # TODO: separate sox filter for each track!
 
-use Getopt::Long;
+use Getopt::Long qw{:config no_ignore_case};
+use File::Spec::Functions qw{catfile};
+use File::Path;
+use Audio::FLAC::Header;
 use MusicBrainz;
 
@@ -14,4 +17,6 @@
     't=s' => \my $TYPE,
     'x=s' => \my $SOX_FILTER,
+    'all|a' => \my $ALL,
+    'dir|d=s' => \my $DIRECTORY,
 );
 
@@ -21,17 +26,31 @@
 $TYPE ||= 'mp3';
 
+# default the directory to be named like the flac file
+($DIRECTORY ||= $FLAC_FILE) =~ s/\.flac$//;
+
+my $flac = Audio::FLAC::Header->new($FLAC_FILE) or die "Can't read FLAC header from $FLAC_FILE\n";
+
 # for getting track metadata from MusicBrainz
 my $info;
-if ($TYPE eq 'mp3') {
-    require Audio::FLAC::Header;
-    require LWP;
-    require XML::XPath;
-    require XML::XPath::XMLParser;
-
-    my $flac = Audio::FLAC::Header->new($FLAC_FILE) or warn "Can't read FLAC header from $FLAC_FILE\n";
+if ($ALL || $TYPE eq 'mp3') {
     my $discid = $flac->tags('MBZ_DISCID') or warn "No MBZ_DISCID tag in $FLAC_FILE\n" if $flac;
     #TODO: calculate TOC and DISCID from cuesheet if there is no MBZ_DISCID tag present
 
+    #TODO: also get the year from MBZ
     $info = get_musicbrainz_info($discid);
+}
+
+if ($ALL) {
+    die "Use of --all requires a --directory\n" unless $DIRECTORY;
+    use YAML;
+    my $cuesheet = $flac->cuesheet;
+    my $count = scalar grep { /TRACK \d\d/ } @{ $flac->cuesheet };
+    print "Found $count tracks\n";
+    #TODO: default to just 01, 02, etc. if there is no $info
+    %TRACKS = map {
+        $_ => catfile($DIRECTORY, sprintf('%02d.%s', $_, to_filename($info->{TRACKS}[$_]{TITLE})))
+    } (1 .. $count);
+    print Dump(\%TRACKS);
+    mkpath($DIRECTORY);
 }
 
@@ -79,2 +98,12 @@
     return qq{"$string"};
 }
+
+sub to_filename {
+    my @strings = @_;
+    #TODO: deal with non-ascii characters (unidecode) e.g. ü --> ue
+    return map {
+        s/[^a-z0-9-_ ]+//gi;
+        s/ +/_/g;
+        lc;
+    } @strings;
+}
