+} elsif ($command =~ m/calcid/) {
+# Calculate MusicBrainz ID from disc offsets; see
+# http://musicbrainz.org/doc/DiscIDCalculation
+
+ my ($first, $last, $leadin, $leadout, @offsets) = @discinfo;
+
+ my $s = Digest::SHA->new(1);
+ $s->add(sprintf "%02X", int($first));
+ $s->add(sprintf "%02X", int($last));
+
+ my @a;
+ for (my $i = 0; $i < 100; $i++) {
+ $a[$i] = 0;
+ }
+ my $i = 0;
+ foreach my $o ($leadout, @offsets) {
+ $a[$i++] = int($o) + int($leadin);
+ }
+ for (my $i = 0; $i < 100; $i++) {
+ $s->add(sprintf "%08X", $a[$i]);
+ }
+
+ my $id = $s->b64digest;
+ # CPAN Digest modules do not pad their Base64 output, so we have to do it.
+ while (length($id) % 4) {
+ $id .= '=';
+ }
+
+ $id =~ tr#+#.#;
+ $id =~ tr#/#_#;
+ $id =~ tr#=#-#;
+
+ print $id;