Index: trunk/MusicBrainz.pm
===================================================================
--- trunk/MusicBrainz.pm	(revision 7)
+++ trunk/MusicBrainz.pm	(revision 8)
@@ -5,5 +5,5 @@
 
 our @ISA    = qw{Exporter};
-our @EXPORT = qw{get_musicbrainz_info};
+our @EXPORT = qw{get_musicbrainz_info lookup_release};
 
 #use WebService::MusicBrainz;
@@ -36,5 +36,7 @@
     my %info;
 
+    #TODO: deprecate the old MBZ tag name
     $info{MBZ_DISCID} = $discid;
+    $info{MUSICBRAINZ_DISCID} = $discid;
 
     my $xpath = XML::XPath->new();
@@ -44,12 +46,32 @@
 
     # get the release; if there is more than one, take the first one
+    my $release_count = $xpath->findvalue('count(//release)');
+    my @releases = $xpath->findnodes('//release');
+    my $base = 'http://musicbrainz.org/release/';
+
+    my $i = 1;
+    #TODO: use this as the basis for an interactive menu to pick the correct release ID
+    warn "$release_count release(s) found matching $discid\n";
+    for my $release (@releases) {
+        warn sprintf "%2d) $base%s %s %s (%s)\n", 
+            $i++,
+            $xpath->findvalue('@id', $release)->value,
+            $xpath->findvalue('.//label-info/label/name', $release)->value,
+            $xpath->findvalue('.//label-info/catalog-number', $release)->value,
+            $xpath->findvalue('barcode', $release)->value;
+    }
+
+    # use the VorbisComment names from here http://musicbrainz.org/doc/MusicBrainz_Picard/Tags/Mapping
+
+    # use the first release by default
     # TODO: configurable release selection criteria
-    my $release_count = $xpath->findvalue('count(//release)');
-    my ($release) = $xpath->findnodes('//release[1]');
-    $info{RELEASE_MBID} = $xpath->findvalue('@id', $release)->value;
-    $info{ALBUM}        = $xpath->findvalue('title', $release)->value;
-    $info{ARTIST}       = $xpath->findvalue('artist-credit/name-credit/artist/name', $release)->value;
-
-    # TODO: get release date
+    my $release = $releases[0];
+
+    $info{MUSICBRAINZ_ALBUMID} = $xpath->findvalue('@id', $release)->value;
+    $info{ALBUM}               = $xpath->findvalue('title', $release)->value;
+    $info{ALBUMARTIST}         = $xpath->findvalue('artist-credit/name-credit/artist/name', $release)->value;
+    $info{ALBUMARTISTSORT}     = $xpath->findvalue('artist-credit/name-credit/artist/sort-name', $release)->value;
+    $info{DATE}                = $xpath->findvalue('date', $release)->value;
+    $info{ORIGINALDATE}        = $xpath->findvalue('release-group/first-release-date', $release)->value;
 
     # select the proper medium (important for multidisc releases)
@@ -60,10 +82,21 @@
     for my $track_node ($xpath->findnodes('track-list/track', $medium)) {
         my $prefix = sprintf('TRACK%02d', $tracknum);
-        #$info{"$prefix.MB_TRACKID"} = $xpath->findvalue('@id', $track_node);
-        my $recording_mbid = $info{"$prefix.RECORDING_MBID"} = $xpath->findvalue('recording/@id', $track_node)->value;
+        my $track_mbid = $info{"$prefix.MUSICBRAINZ_TRACKID"} = $xpath->findvalue('@id', $track_node)->value;
+        my $recording_mbid = $info{"$prefix.MUSICBRAINZ_RECORDINGID"} = $xpath->findvalue('recording/@id', $track_node)->value;
+
         $info{"$prefix.TITLE"}          = $xpath->findvalue('recording/title', $track_node)->value;
-        $info{"$prefix.ARTIST"}         = $xpath->findvalue('recording/artist-credit/name-credit/artist/name', $track_node)->value || $info{ARTIST};
+
+        # use the MusicBrainz join phrase to build up the multiple artist credits
+        my ($credit, $sort_credit) = ('', '');
+        for my $credit_node ($xpath->findnodes('recording/artist-credit/name-credit', $track_node)) {
+            $credit .= $xpath->findvalue('concat(artist/name, @joinphrase)', $credit_node)->value;
+            $sort_credit .= $xpath->findvalue('concat(artist/sort-name, @joinphrase)', $credit_node)->value;
+        }
+        $info{"$prefix.ARTIST"}     = $credit;
+        $info{"$prefix.ARTISTSORT"} = $sort_credit;
+
         $info{TRACKS}[$tracknum]{TITLE} = $info{"$prefix.TITLE"};
         $info{TRACKS}[$tracknum]{ARTIST} = $info{"$prefix.ARTIST"};
+        $info{TRACKS}[$tracknum]{ARTISTSORT} = $info{"$prefix.ARTISTSORT"};
         #my $uri = URI->new("http://musicbrainz.org/ws/2/recording/$recording_mbid");
         #$uri->query_form(inc => 'artists');
Index: trunk/applymeta
===================================================================
--- trunk/applymeta	(revision 8)
+++ trunk/applymeta	(revision 8)
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+use strict;
+
+use Getopt::Long;
+use Config::Properties;
+use YAML;
+use MP3::Tag;
+
+GetOptions(
+    'file|f=s' => \my $META_FILE,
+    'clear'    => \my $CLEAR,
+);
+
+my @AUDIO_FILES = @ARGV;
+
+my $meta;
+
+if ($META_FILE eq '-') {
+    $meta = Config::Properties->new;
+    $meta->load(*STDIN);
+} else {
+    $meta = Config::Properties->new(
+        file => $META_FILE,
+    );
+}
+
+my $metadata = $meta->splitToTree;
+
+for my $i (1 .. @AUDIO_FILES) {
+    my $mp3 = MP3::Tag->new($AUDIO_FILES[$i - 1]);
+
+    # first clear the tags if asked
+    if ($CLEAR) {
+        warn "clearing first";
+        $mp3->delete_tag($_) foreach qw{ID3v1 ID3v2};
+    }
+
+    my $track_key = sprintf "TRACK%02d", $i;
+    my $track = $metadata->{$track_key};
+    #TODO: for reissues, what should the year/date be tagged as?
+    my ($year) = ($metadata->{ORIGINALDATE} || $metadata->{DATE} || '' =~ /^(\d{4})/);
+    $mp3->title_set($track->{TITLE});
+    $mp3->artist_set($track->{ARTIST} || $metadata->{ALBUMARTIST});
+    $mp3->album_set($track->{ALBUM}  || $metadata->{ALBUM});
+    $mp3->year_set($year) if $year;
+    $mp3->track_set($i);
+    $mp3->select_id3v2_frame_by_descr('TPE2', $metadata->{ALBUMARTIST}) if $metadata->{ALBUMARTIST};
+    $mp3->update_tags;
+    printf "    Apply to %s\n", $AUDIO_FILES[$i - 1];
+
+    #TODO: full version of a make-string-filename-safe function
+    my $sort_filename = lc $track->{ARTISTSORT};
+    for ($sort_filename) {
+        s/&/and/g;
+        s/\W/-/g;
+        s/--/-/g;
+    }
+    print "Artist sort filename would be: " . $sort_filename . "\n";
+}
Index: trunk/mbz
===================================================================
--- trunk/mbz	(revision 7)
+++ trunk/mbz	(revision 8)
@@ -38,5 +38,5 @@
 
 if ($GET_RELEASE_ID) {
-    print "$$info{RELEASE_MBID}\n";
+    print "$$info{MUSICBRAINZ_ALBUMID}\n";
 } else {
     for my $key (sort keys %{ $info }) {
