diff -Nru abcde-2.9.1/abcde abcde-2.9.2/abcde --- abcde-2.9.1/abcde 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/abcde 2018-08-02 15:08:29.000000000 +0000 @@ -11,7 +11,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -VERSION='2.9.1' +VERSION='2.9.2' usage () { @@ -463,9 +463,10 @@ if [ -n "$STARTTRACKNUMBER" ] ; then # Get the trackpadding from the current track, also trim whitespace for MacOSX CURRENTTRACKPADDING=$(echo -n "$UTRACKNUM" | wc -c | tr -d ' ') - TRACKNUM=$( printf %0."${CURRENTTRACKPADDING}"d $(("${UTRACKNUM}" + "${STARTTRACKNUMBER}" - "${FIRSTTRACK}"))) + REALTRACKNUM=$(expr $UTRACKNUM + 0) # Unpad + TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $((${REALTRACKNUM} + ${STARTTRACKNUMBER} - ${FIRSTTRACK}))) else - TRACKNUM="${UTRACKNUM}" + TRACKNUM=${UTRACKNUM} fi } @@ -566,7 +567,7 @@ REPLAYINDEX=0 for UTRACKNUM in $TRACKQUEUE do - CDDBTRACKNUM=$(expr "$UTRACKNUM" - 1) # Unpad + CDDBTRACKNUM=$(expr $UTRACKNUM - 1) # Unpad getcddbinfo TRACKNAME splitvarious TRACKFILE="$(mungetrackname "$TRACKNAME")" @@ -1878,7 +1879,6 @@ ## (some hardware players insist on CRLF endings) if [ "$DOSPLAYLIST" = "y" ]; then awk '{sub("\r$",""); printf "%s\r\n", $0}' "$OUTPUTDIR/$PLAYLISTFILE" > "${ABCDETEMPDIR}/PLAYLISTFILE.tmp" -# mv -f "${ABCDETEMPDIR}/PLAYLISTFILE.tmp" "$OUTPUTDIR/$PLAYLISTFILE" cat "${ABCDETEMPDIR}/PLAYLISTFILE.tmp" | sed 's/\//\\/' > "$OUTPUTDIR/$PLAYLISTFILE" fi echo "playlistcomplete" >> "${ABCDETEMPDIR}/status" @@ -1896,8 +1896,8 @@ val=$1 ret=0 while [ "$val" -gt 0 ] ; do - ret=$(( "$ret" + ( "$val" % 10) )) - val=$(( "$val" / 10 )) + ret=$(( $ret + ( $val % 10) )) + val=$(( $val / 10 )) done echo "$ret" } @@ -1905,14 +1905,14 @@ msf2lba () { OIFS="$IFS" IFS=":" - set -- "$1" + set -- $1 IFS="$OIFS" local first second third first=$(( $1 + 0 )) second=$(( $2 + 0 )) third=$(( $3 + 0 )) - echo $(( ((("$first" * 60) + "$second") * 75) + "$third" )) + echo $(( ((($first * 60) + $second) * 75) + $third )) } OFFSET=150 @@ -1923,26 +1923,30 @@ N=0 while read line ; do - set -- "$line" + set -- $line case "$1" in - TRACK) i=$(( i + 1 )) + TRACK) + i=$(( i + 1 )) ;; - INDEX) if [ "$2" -eq 1 ] ; then - LBA=$(msf2lba "$3") - START=$(( "$LBA" + "$PREGAP" + "$OFFSET" )) + INDEX) + if [ "$2" -eq 1 ] ; then + LBA=$(msf2lba $3) + START=$(( $LBA + $PREGAP + $OFFSET )) eval TRACK$i=$START - X=$(cddb_sum $(( "$START" / 75 )) ) - N=$(( "$N" + "$X" )) + X=$(cddb_sum $(( $START / 75 )) ) + N=$(( $N + $X )) fi ;; - PREGAP) PREGAP=$(msf2lba "$2") + PREGAP) + PREGAP=$(msf2lba $2) ;; - REM) case "$2" in + REM) + case "$2" in FLAC__lead-out) - LEADOUT=$(( "$4" / 588 )) + LEADOUT=$(( $4 / 588 )) ;; FLAC__lead-in) - LEADIN=$(( "$3" / 588 )) + LEADIN=$(( $3 / 588 )) ;; esac ;; @@ -1951,18 +1955,18 @@ done TRACKS=$i - LEADOUT=$(( "$LEADOUT" + "$LEADIN" )) + LEADOUT=$(( $LEADOUT + $LEADIN )) - LENGTH=$(( "$LEADOUT"/75 - "$TRACK1"/75 )) - CDDBDISCID=$(( ( "$N" % 255 ) * 2**24 | "$LENGTH" * 2**8 | "$TRACKS" )) - printf "%08x %i" "${CDDBDISCID}" "$TRACKS" + LENGTH=$(( $LEADOUT/75 - $TRACK1/75 )) + CDDBDISCID=$(( ( $N % 255 ) * 2**24 | $LENGTH * 2**8 | $TRACKS )) + printf %08x %i ${CDDBDISCID} $TRACKS j=1 - while [ $j -le "$TRACKS" ] ; do + while [ $j -le $TRACKS ] ; do eval echo -n "\" \$TRACK$j\"" j=$(( $j + 1)) done - echo " $(( $LEADOUT / 75 ))" + echo $(( $LEADOUT / 75 )) } # abcde.mkcue @@ -1997,7 +2001,7 @@ local i OFFSET LBA local CUEWAVFILE - if [ "$1" = --wholedisk ] ; then + if [ "$1" = "--wholedisk" ] ; then MODE=INDEX else MODE=PREGAP @@ -2018,19 +2022,19 @@ CUEWAVFILE="dummy.wav" fi - set -- "$CDDBTRACKINFO" + set -- $CDDBTRACKINFO - DISCID="$1" - TRACKS="$2" + DISCID=$1 + TRACKS=$2 shift 2 echo "REM DISCID $DISCID" echo FILE \""$CUEWAVFILE"\" WAVE - if [ "$1" -ne 150 ] && [ "$MODE" = "PREGAP" ] ; then - OFFSET="$1" + if [ $1 -ne 150 ] && [ $MODE = "PREGAP" ] ; then + OFFSET=$1 else - OFFSET="150" + OFFSET=150 fi i=1 @@ -2076,10 +2080,9 @@ OFFSETTIMES=( $(echo "$CUESHEET" | sed -n -e's/\ *INDEX 01\ \+//p' ) ) TRACKS=${#OFFSETTIMES[@]} unset OFFSETS - #echo "processing offsetimes ${OFFSETTIMES[@]}" + vecho "processing offsetimes ${OFFSETTIMES[@]}" for OFFSETTIME in ${OFFSETTIMES[@]}; do OFFSETS="$OFFSETS $(( 10#${OFFSETTIME:0:2} * 4500 + 10#${OFFSETTIME:3:2} * 75 + 10#${OFFSETTIME:6:2} ))" - #OFFSETS[${#OFFSETS[*]}]=$(( 10#${OFFSETTIME:0:2} * 4500 + 10#${OFFSETTIME:3:2} * 75 + 10#${OFFSETTIME:6:2} )) done LEADOUT=$(( $(echo "$CUESHEET" | grep lead-out | get_last) * 75 / 44100 )) @@ -2166,7 +2169,7 @@ TRACKNUMPADDING=2 fi - ABCDETEMPDIR="$WAVOUTPUTDIR/abcde.$(echo "$CDDBTRACKINFO" | cut -f1 -d' ')" + ABCDETEMPDIR="$WAVOUTPUTDIR/abcde.${CDDBDISCID}" if [ -z "$TRACKQUEUE" ]; then if [ ! "$STRIPDATATRACKS" = "n" ]; then case "$CDROMREADERSYNTAX" in @@ -2202,14 +2205,14 @@ fi echo -n "Grabbing entire CD - tracks: " if [ ! "$PADTRACKS" = "y" ] ; then - TRACKNUMPADDING=$(echo -n "$TRACKS" | wc -c | tr -d ' ') + TRACKNUMPADDING=$(echo -n $TRACKS | wc -c | tr -d ' ') fi TRACKS=$(printf "%0.${TRACKNUMPADDING}d" $TRACKS) - X=0 - while [ "$X" -ne "$TRACKS" ] + X=1 + while [ $X -le $TRACKS ] do - PT=$(printf "%0.${TRACKNUMPADDING}d" $(($X + 1))) + PT=$(printf "%0.${TRACKNUMPADDING}d" $X) TRACKQUEUE="$TRACKQUEUE $PT" X=$(($X + 1)) done @@ -2225,9 +2228,9 @@ TRACKNUMPADDING=$(echo -n "$LASTTRACK" | wc -c | tr -d ' ') fi # Now we normalize the trackqueue - for TRACK in $TRACKQUEUE ; do - TRACKNUM=$(printf "%0.${TRACKNUMPADDING}d" $(($TRACK + 0))) - PADTRACKQUEUE="$PADTRACKQUEUE $TRACKNUM" + for TRACK in $TRACKQUEUE; do + PADTRACKNUM=$(printf "%0.${TRACKNUMPADDING}d" $(expr ${TRACK} + 0 )) + PADTRACKQUEUE="$PADTRACKQUEUE $PADTRACKNUM" done TRACKQUEUE="$PADTRACKQUEUE" echo Grabbing tracks: "$TRACKQUEUE" @@ -2338,7 +2341,7 @@ else log warning "reading the CUE sheet is still considered experimental" log warning "and there was a problem with the CD reading. abcde will continue," - log warning "but consider reporting the problem to the abcde author" + log warning "but consider reporting the problem to the abcde authors" fi ;; esac @@ -2646,12 +2649,15 @@ echo "CD-Text" > "${SOURCE_WORKDIR}/datasource.${NUM_CDDB_MATCHES}" echo "none ${CDDBDISCID} ${ATITLE}" >> "${SOURCE_WORKDIR}/cddbquery.${NUM_CDDB_MATCHES}" - ( cd "${SOURCE_WORKDIR}" && rm -f audio_* audio.* ) - for file in ${SOURCE_WORKDIR}/cddbread.* ${SOURCE_WORKDIR}/cddbquery.* ${SOURCE_WORKDIR}/datasource.*; do - if [ -f "$file" ]; then - cp "$file" "${ABCDETEMPDIR}" - fi - done + ( + cd "${SOURCE_WORKDIR}" + rm -f audio_* audio.* + for file in cddbread.* cddbquery.* datasource.*; do + if [ -f "$file" ]; then + cp "$file" "${ABCDETEMPDIR}" + fi + done + ) echo "cdtext-readcomplete" >> "${ABCDETEMPDIR}/status" echo "cdtext-entries=1" >> "${ABCDETEMPDIR}/status" fi @@ -2689,10 +2695,10 @@ # The helper script will write disc matches out to # cddbread.*. Count how many we have NUM_RESPONSES=$(ls -1 "${SOURCE_WORKDIR}"/cddbread.* 2>/dev/null | wc -l) - if [ "$NUM_RESPONSES" -gt 0 ] ; then + if [ $NUM_RESPONSES -gt 0 ] ; then # One or more exact matches i=1 - while [ $i -le "$NUM_RESPONSES" ]; do + while [ $i -le $NUM_RESPONSES ]; do NUM_CDDB_MATCHES=$(($NUM_CDDB_MATCHES + 1)) i=$(($i + 1)) echo cddb-read-${NUM_CDDB_MATCHES}-complete >> "${ABCDETEMPDIR}/status" @@ -2863,11 +2869,14 @@ echo "cddb-read-${NUM_CDDB_MATCHES}-complete" >> "${ABCDETEMPDIR}/status" ;; esac - for file in ${SOURCE_WORKDIR}/cddbread.* ${SOURCE_WORKDIR}/cddbquery.* ${SOURCE_WORKDIR}/datasource.*; do - if [ -f "$file" ]; then - cp "$file" "${ABCDETEMPDIR}" - fi - done + ( + cd "${SOURCE_WORKDIR}" + for file in cddbread.* cddbquery.* datasource.*; do + if [ -f "$file" ]; then + cp "$file" "${ABCDETEMPDIR}" + fi + done + ) echo "cddb-readcomplete" >> "${ABCDETEMPDIR}/status" echo "cddb-entries=$NUM_RESPONSES" >> "${ABCDETEMPDIR}/status" fi @@ -3244,7 +3253,7 @@ # use glyrc if [ ! -s "${ABCDETEMPDIR}/$ALBUMARTFILE" ]; then vecho "trying to get cover with glyrc for $ARTISTFILE / $ALBUMFILE" >&2 - $GLYRC cover --artist "$ARTISTFILE" --album "$ALBUMFILE" --write "${ABCDETEMPDIR}/$ALBUMARTFILE" $GLYRCOPTS + env LC_ALL=C $GLYRC cover --artist "$ARTISTFILE" --album "$ALBUMFILE" --write "${ABCDETEMPDIR}/$ALBUMARTFILE" $GLYRCOPTS if [ $? -ne 0 ]; then vecho "could not download cover with glyrc" >&2 else @@ -3500,7 +3509,7 @@ # the user said # We need the first and last track for cdda2wav/icedax FIRSTTRACK=$2 - LASTTRACK=$(expr $3 + 0) + LASTTRACK=$(expr $3 + 0) # Unpad UTRACKNUM=$FIRSTTRACK case "$CDROMREADERSYNTAX" in flac) READTRACKNUMS="-" ;; diff -Nru abcde-2.9.1/abcde.1 abcde-2.9.2/abcde.1 --- abcde-2.9.1/abcde.1 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/abcde.1 2018-08-02 15:08:29.000000000 +0000 @@ -710,6 +710,12 @@ .BR mkcue (1), .BR vorbisgain (1), .BR mp3gain (1) + +.SH DATA FORMATS +The CDDB metadata format is used a lot by abcde, both for lookups and +internally. It's documented online at +http://ftp.freedb.org/pub/freedb/latest/DBFORMAT + .SH AUTHORS Robert Woodcock , Jesus Climent , diff -Nru abcde-2.9.1/abcde-musicbrainz-tool abcde-2.9.2/abcde-musicbrainz-tool --- abcde-2.9.1/abcde-musicbrainz-tool 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/abcde-musicbrainz-tool 2018-08-02 15:08:29.000000000 +0000 @@ -95,128 +95,208 @@ exit(0); } - my @releases = @{ $response->{'releases'} }; my $releasenum = $start; my @sums; - foreach my $release (@releases) { - my $a_artist = ""; - my $number_artists = @{ $release->{'artist-credit'}}; - if ($number_artists > 0) { - for (my $i = 0; $i < $number_artists; $i++) { - if ($i > 0) { - $a_artist = $a_artist . @{ $release->{'artist-credit'} }[$i-1]->{'joinphrase'}; - } - $a_artist = $a_artist . @{ $release->{'artist-credit'} }[$i]->{'name'}; - } - } - my $va = 0; - my $rel_year = ""; - if ($a_artist =~ /Various Artists/) { - $va = 1; - } - - if ($release->{'release-events'}) { - my @release_events = @{ $release->{'release-events'} }; - if (@release_events > 0) { - $rel_year = substr(@release_events[0]->{'date'},0,4); - } - } - $releasenum++; - open (OUT, "> $workdir/cddbread.$releasenum"); - binmode OUT, ":utf8"; - print OUT "# xmcd style database file\n"; - print OUT "#\n"; - print OUT "# Track frame offsets:\n"; - - my @offsets = @{ $response->{'offsets'}}; - foreach my $offset (@offsets) { - printf OUT "# %d\n", $offset; - } - - # Locate the media that contains a disc with the discid we requested - # initially. The API may return multiple media associated with the - # release, including media with different discids - my @mediums = grep { - my @disks = @{ $_->{'discs'} }; - grep { $_->{'id'} eq $discid } @disks; - } @{ $release->{'media'} }; - - if (not @mediums) { - # This release doesn't have a media with our requested dicsid - # Shouldn't happen (?), skip it - next; - } - - # Only consider the first medium - my $medium = @mediums[0]; - my @tracks = @{ $medium->{'tracks'} }; - - my $total_len = 0; - for (my $i = 0; $i < scalar(@tracks); $i++) { - my $track = $tracks[$i]; - $total_len += $track->{'length'}; - } - - print OUT "#\n"; - printf OUT "# Disc length: %d seconds\n", $total_len / 1000.0; - print OUT "#\n"; - print OUT "# Submitted via: XXXXXX\n"; - print OUT "#\n"; - print OUT "#blues,classical,country,data,folk,jazz,newage,reggae,rock,soundtrack,misc\n"; - print OUT "#CATEGORY=none\n"; - print OUT "DISCID=" . $discid . "\n"; - print OUT "DTITLE=" . $a_artist. " / " . $release->{'title'} . "\n"; - print OUT "DYEAR=" . $rel_year . "\n"; - print OUT "DGENRE=\n"; - - for (my $i = 0; $i < scalar(@tracks); $i++) { - my $track = $tracks[$i]; - my $t_name = $track->{'title'}; - my $number_artists = @{$track->{'recording'}->{'artist-credit'}}; - if ($va and $number_artists > 0) { - my $t_artist = ""; - for (my $j = 0; $j < $number_artists; $j++) { - if ($j > 0) { - $t_artist = $t_artist . @{$track->{'recording'}->{'artist-credit'}}[$j-1]->{'joinphrase'}; - } - $t_artist = $t_artist . @{$track->{'recording'}->{'artist-credit'}}[$j]->{'name'}; - } - printf OUT "TTITLE%d=%s / %s\n", $i, $t_artist, $t_name; - } else { - printf OUT "TTITLE%d=%s\n", $i, $t_name; - } - } - - print OUT "EXTD=\n"; - for (my $i = 0; $i < scalar(@tracks); $i++) { - printf OUT "EXTT%d=\n", $i; - } - print OUT "PLAYORDER=\n"; - print OUT ".\n"; - close OUT; - - # save release mbid - open (OUT, "> $workdir/mbid.$releasenum"); - print OUT $release->{'id'}; - close OUT; - - # save release asin - open (OUT, "> $workdir/asin.$releasenum"); - print OUT $release->{'asin'}; - close OUT; - - # Check to see that this entry is unique; generate a checksum - # and compare to any previous checksums - my $checksum = calc_sha1("$workdir/cddbread.$releasenum"); - foreach my $sum (@sums) { - if ($checksum eq $sum) { - unlink("$workdir/cddbread.$releasenum"); - $releasenum--; - last; - } - } - push (@sums, $checksum); + if ($response->{'releases'}) { + my @releases = @{ $response->{'releases'} }; + foreach my $release (@releases) { + my $a_artist = ""; + my $number_artists = @{ $release->{'artist-credit'}}; + if ($number_artists > 0) { + for (my $i = 0; $i < $number_artists; $i++) { + if ($i > 0) { + $a_artist = $a_artist . @{ $release->{'artist-credit'} }[$i-1]->{'joinphrase'}; + } + $a_artist = $a_artist . @{ $release->{'artist-credit'} }[$i]->{'name'}; + } + } + my $va = 0; + my $rel_year = ""; + if ($a_artist =~ /Various Artists/) { + $va = 1; + } + + if ($release->{'release-events'}) { + my @release_events = @{ $release->{'release-events'} }; + if (@release_events > 0) { + $rel_year = substr(@release_events[0]->{'date'},0,4); + } + } + $releasenum++; + open (OUT, "> $workdir/cddbread.$releasenum"); + binmode OUT, ":utf8"; + print OUT "# xmcd style database file\n"; + print OUT "#\n"; + print OUT "# Track frame offsets:\n"; + + my @offsets = @{ $response->{'offsets'}}; + foreach my $offset (@offsets) { + printf OUT "# %d\n", $offset; + } + + # Locate the media that contains a disc with the discid we requested + # initially. The API may return multiple media associated with the + # release, including media with different discids + my @mediums = grep { + my @disks = @{ $_->{'discs'} }; + grep { $_->{'id'} eq $discid } @disks; + } @{ $release->{'media'} }; + + if (not @mediums) { + # This release doesn't have a media with our requested dicsid + # Shouldn't happen (?), skip it + next; + } + + # Only consider the first medium + my $medium = @mediums[0]; + my @tracks = @{ $medium->{'tracks'} }; + + my $total_len = 0; + for (my $i = 0; $i < scalar(@tracks); $i++) { + my $track = $tracks[$i]; + $total_len += $track->{'length'}; + } + + print OUT "#\n"; + printf OUT "# Disc length: %d seconds\n", $total_len / 1000.0; + print OUT "#\n"; + print OUT "# Submitted via: XXXXXX\n"; + print OUT "#\n"; + print OUT "#blues,classical,country,data,folk,jazz,newage,reggae,rock,soundtrack,misc\n"; + print OUT "#CATEGORY=none\n"; + print OUT "DISCID=" . $discid . "\n"; + print OUT "DTITLE=" . $a_artist. " / " . $release->{'title'} . "\n"; + print OUT "DYEAR=" . $rel_year . "\n"; + print OUT "DGENRE=\n"; + + for (my $i = 0; $i < scalar(@tracks); $i++) { + my $track = $tracks[$i]; + my $t_name = $track->{'title'}; + my $number_artists = @{$track->{'recording'}->{'artist-credit'}}; + if ($va and $number_artists > 0) { + my $t_artist = ""; + for (my $j = 0; $j < $number_artists; $j++) { + if ($j > 0) { + $t_artist = $t_artist . @{$track->{'recording'}->{'artist-credit'}}[$j-1]->{'joinphrase'}; + } + $t_artist = $t_artist . @{$track->{'recording'}->{'artist-credit'}}[$j]->{'name'}; + } + printf OUT "TTITLE%d=%s / %s\n", $i, $t_artist, $t_name; + } else { + printf OUT "TTITLE%d=%s\n", $i, $t_name; + } + } + + print OUT "EXTD=\n"; + for (my $i = 0; $i < scalar(@tracks); $i++) { + printf OUT "EXTT%d=\n", $i; + } + print OUT "PLAYORDER=\n"; + print OUT ".\n"; + close OUT; + + # save release mbid + open (OUT, "> $workdir/mbid.$releasenum"); + print OUT $release->{'id'}; + close OUT; + + # save release asin + open (OUT, "> $workdir/asin.$releasenum"); + print OUT $release->{'asin'}; + close OUT; + + # Check to see that this entry is unique; generate a checksum + # and compare to any previous checksums + my $checksum = calc_sha1("$workdir/cddbread.$releasenum"); + foreach my $sum (@sums) { + if ($checksum eq $sum) { + unlink("$workdir/cddbread.$releasenum"); + $releasenum--; + last; + } + } + push (@sums, $checksum); + } + } else { + # No release events found - looks like we have a stub + # entry. We can parse it, but it's going to be very + # different. + print STDERR "MusicBrainz lookup only returned a stub, trying to cope\n"; + + my $va = 0; + my $a_artist = ""; + my $a_title = ""; + my $rel_year = ""; + + if ($response->{'artist'}) { + $a_artist = $response->{'artist'}; + } + if ($response->{'title'}) { + $a_title = $response->{'title'}; + } + if ($a_artist =~ /Various Artists/) { + $va = 1; + } + + $releasenum++; + open (OUT, "> $workdir/cddbread.$releasenum"); + binmode OUT, ":utf8"; + print OUT "# xmcd style database file\n"; + print OUT "#\n"; + print OUT "# Musicbrainz stub entry - check carefully!\n"; + print OUT "#\n"; + + my @tracks = @{ $response->{'tracks'} }; + + my $total_len = 0; + for (my $i = 0; $i < scalar(@tracks); $i++) { + my $track = $tracks[$i]; + $total_len += $track->{'length'}; + } + + printf OUT "# Disc length: %d seconds\n", $total_len / 1000.0; + print OUT "#\n"; + print OUT "# Submitted via: XXXXXX\n"; + print OUT "#\n"; + print OUT "#blues,classical,country,data,folk,jazz,newage,reggae,rock,soundtrack,misc\n"; + print OUT "#CATEGORY=none\n"; + print OUT "DISCID=" . $discid . "\n"; + print OUT "DTITLE=" . $a_artist. " / " . $a_title . "\n"; + print OUT "DYEAR=" . $rel_year . "\n"; + print OUT "DGENRE=\n"; + + for (my $i = 0; $i < scalar(@tracks); $i++) { + my $track = $tracks[$i]; + my $t_name = $track->{'title'}; + if ($va) { + my $t_artist = $track->{'artist'}; + printf OUT "TTITLE%d=%s / %s\n", $i, $t_artist, $t_name; + } else { + printf OUT "TTITLE%d=%s\n", $i, $t_name; + } + } + + print OUT "EXTD=\n"; + for (my $i = 0; $i < scalar(@tracks); $i++) { + printf OUT "EXTT%d=\n", $i; + } + print OUT "PLAYORDER=\n"; + print OUT ".\n"; + close OUT; + + # Check to see that this entry is unique; generate a checksum + # and compare to any previous checksums + my $checksum = calc_sha1("$workdir/cddbread.$releasenum"); + foreach my $sum (@sums) { + if ($checksum eq $sum) { + unlink("$workdir/cddbread.$releasenum"); + $releasenum--; + last; + } + } + push (@sums, $checksum); } } elsif ($command =~ m/calcid/) { # Calculate MusicBrainz ID from disc offsets; see diff -Nru abcde-2.9.1/changelog abcde-2.9.2/changelog --- abcde-2.9.1/changelog 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/changelog 2018-08-02 15:08:29.000000000 +0000 @@ -1,3 +1,17 @@ +abcde 2.9.2 + + * Fix up lookup code to deal with spaces etc. in directory names + * Cope with "stub" releases in Musicbrainz + * Always call glyrc with LC_ALL=C. Thanks to Andreas Vögele for the + report and the suggested fix. Closes Issue 83: + https://abcde.einval.com/bugzilla/show_bug.cgi?id=50 + * Add a link to the CDDB data format in the abcde man page. Closes + Issue 81: https://abcde.einval.com/bugzilla/show_bug.cgi?id=81 + * More fixups of track number padding. Thanks to John Straw for the + patch. + + -- Steve McIntyre <93sam@debian.org> Thu, 02 Aug 2018 23:07:12 +0800 + abcde 2.9.1 * Merged Debian packaging files updates diff -Nru abcde-2.9.1/debian/changelog abcde-2.9.2/debian/changelog --- abcde-2.9.1/debian/changelog 2018-03-09 23:25:03.000000000 +0000 +++ abcde-2.9.2/debian/changelog 2018-08-02 15:34:06.000000000 +0000 @@ -1,3 +1,20 @@ +abcde (2.9.2-1) unstable; urgency=medium + + * New upstream version with fixes since the 2.9.1 release: + + Fix up lookup code to deal with spaces etc. in directory names + + Cope with "stub" releases in Musicbrainz + + Always call glyrc with LC_ALL=C. Thanks to Andreas Vögele for the + report and the suggested fix. Closes Issue 83: + https://abcde.einval.com/bugzilla/show_bug.cgi?id=50 + + Add a link to the CDDB data format in the abcde man page. Closes + Issue 81: https://abcde.einval.com/bugzilla/show_bug.cgi?id=81 + + More fixups of track number padding. Thanks to John Straw for the + patch. + * Updates also fix various Debian bugs. Closes: #905124, #893892, #898046 + * Add a Depends on sensible-utils + + -- Steve McIntyre <93sam@debian.org> Thu, 02 Aug 2018 23:34:06 +0800 + abcde (2.9.1-1) unstable; urgency=medium * New upstream version with fixes since the 2.9 release: diff -Nru abcde-2.9.1/debian/control abcde-2.9.2/debian/control --- abcde-2.9.1/debian/control 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/debian/control 2018-08-02 15:34:06.000000000 +0000 @@ -10,7 +10,7 @@ Package: abcde Architecture: all -Depends: ${misc:Depends}, cd-discid, wget, cdparanoia | icedax, vorbis-tools (>= 1.0beta4-1) | lame | flac | speex | musepack-tools | opus-tools, libmusicbrainz-discid-perl, libwebservice-musicbrainz-perl (>= 1.0.4-1.1) +Depends: ${misc:Depends}, cd-discid, wget, cdparanoia | icedax, vorbis-tools (>= 1.0beta4-1) | lame | flac | speex | musepack-tools | opus-tools, libmusicbrainz-discid-perl, libwebservice-musicbrainz-perl (>= 1.0.4-1.1), sensible-utils Recommends: vorbis-tools, libdigest-sha-perl, bsd-mailx, glyrc, imagemagick Suggests: eject, distmp3, id3 (>= 0.12), id3v2, eyed3 (<< 0.7~), normalize-audio, vorbisgain, mkcue, mp3gain, atomicparsley diff -Nru abcde-2.9.1/README abcde-2.9.2/README --- abcde-2.9.1/README 2018-03-09 23:03:50.000000000 +0000 +++ abcde-2.9.2/README 2018-08-02 15:08:29.000000000 +0000 @@ -25,8 +25,14 @@ MAJOR CHANGES ============= +Changes in 2.9.2 +* More fixes to Musicbrainz code + +Changes in 2.9.1 +* Fixes in Musicbrainz code + Changes in 2.9 -* Allow for embedding of album art downloaded by the getalbumart fuction +* Allow for embedding of album art downloaded by the getalbumart fuction * Add support for another output encoding: Audio Interchange File Format (AIFF) * Reworked CD lookup code to fully support using all of CDDB, Musicbrainz and CD-Text