Index: trunk/lib/MusicBrainz.pm
===================================================================
--- trunk/lib/MusicBrainz.pm	(revision 41)
+++ trunk/lib/MusicBrainz.pm	(revision 43)
@@ -32,4 +32,32 @@
 }
 
+sub interactive_select_release {
+    my ($xpath, $release_count, $discid, @releases) = @_;
+    my $base = 'http://musicbrainz.org/release/';
+
+    my $i = 1;
+    # present the user with an interactive menu to pick/confirm 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;
+    }
+
+    my $selection = 0;
+
+    while ($selection < 1 || $selection > $release_count) {
+        print STDERR "Select a release (1-$release_count): ";
+        $selection = <STDIN>;
+        chomp $selection;
+        return if $selection =~ /^q/i;
+    }
+
+    return $releases[$selection - 1];
+}
+
 sub select_release {
     my ($xpath, $params) = @_;
@@ -41,34 +69,16 @@
         # try to pick the release automatically by the barcode
         my @releases = $xpath->findnodes("//release[barcode='$barcode']");
-        die "Found no releases with discid $discid and barcode $barcode\n" unless @releases;
-        die "Found more than one release with discid $discid and barcode $barcode\n" if @releases > 1;
+        if (@releases > 1) {
+            warn "Found more than one release with discid $discid and barcode $barcode\n";
+            return interactive_select_release($xpath, scalar @releases, $discid, @releases);
+        } elsif (!@releases) {
+            warn "Found no releases with discid $discid and barcode $barcode\n";
+            return;
+        }
         return $releases[0];
     } else {
         my $release_count = $xpath->findvalue('count(//release)');
         my @releases = $xpath->findnodes('//release');
-        my $base = 'http://musicbrainz.org/release/';
-
-        my $i = 1;
-        # present the user with an interactive menu to pick/confirm 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;
-        }
-
-        my $selection = 0;
-
-        while ($selection < 1 || $selection > $release_count) {
-            print STDERR "Select a release (1-$release_count): ";
-            $selection = <STDIN>;
-            chomp $selection;
-            return if $selection =~ /^q/i;
-        }
-
-        return $releases[$selection - 1];
+        return interactive_select_release($xpath, $release_count, $discid, @releases);
     }
 }
