Fix crashes when handling non-ASCII characters in directory names and in track titles. In two places filenames were inadvertantly left as, or converted to, a plain non-unicode byte string. This caused decode errors when we tried to concatenate them with Unicode strings, and python attempted to automatically encode them as ASCII. In album_dir.py, the input path was left as a plain byte string, rather than being decoded as UTF-8. In rename.py the safe_filename() function was inadvertantly converting unicode input strings to plain byte strings in output, due to passing the input through a non-unicode format string.
Update the cddb API to return an empty list when no matches are found, rather than raising a NoMatchesError. NoMatchesError is still raised if query() returns result IDs, but one or more of the IDs cannot be found when read() is called.
The log files record where any warnings or errors occurred when ripping each track.
Cap the index generated for the progress bar, to prevent an IndexError if cdparanoia reports an error or warning before the start of the track, or after the end of the track.
Implement our own code to close the tray if necessary and wait for the device to become ready. The kernel's built-in handling of this on open() will close the tray, but fails if the drive doesn't become immediately ready afterwards. Also add an --eject flag to archive.py to cause it to eject the disc after archiving.
Fix some cases where unicode strings were printed to stdout or passed through execv() without first encoding to UTF-8, which would throw an exception on non-ASCII characters, since Python's default encoding is ASCII. Also fix some directory listing code to attempt to decode paths as UTF-8, so they can be correctly compared against unicode strings.
When looking for possible track numbers in the file name, don't treat the "3" in the ".mp3" extension as possibly meaning track number 3. Also fix a bug generating an error message for the exception if we can't narrow the files down to 1 track number per file.
Previously only the flac and wav files were renamed.
This script recreates the wav directory from the flac files, if the wav files were deleted to save space.
Replace '/' characters with '\'.
The --resume flag causes archive.py to restart and resume ripping the tracks from a previously failed/aborted archiving operation. It doesn't resume metadata ripping, so it currently only works when archiving failed in the middle of ripping the track contents.
Update the encode_flac.py script to also tag the newly created files, so tag_flac.py doesn't need to be run separately.
Perform the metadata merge step at the end of archive.py, to reduce the number of separate scripts users must run.
Move the code out of the merge_metadata.py script so it can be accessed by other modules.
Begin moving more of the ripping steps into archive.py, so fewer scripts have to be run manually. The --only option causes archive.py to only fetch data off the CD, and exit before downloading metadata from online sources.
Fix the STATUS_* character definitions. STATUS_WARNING wasn't defined, and STATUS_JITTER and STATUS_ERROR were never used. Also fix a bug in a call to printSuppressedWarnings().
For now this script just uses lame's built-in ID3 tagging support. I don't have a separate script for re-tagging mp3 files yet.
After extracting possible numbers from the track names, process them one at a time, eliminating already chosen numbers from the possibilities for other tracks. This allows better detection when some track names contain multiple numbers that look like possible track numbers.
Previously the code crashed when it couldn't find an icedax file for a data track.
Increment the track number after every field. This way fields that occur completely in the middle of a pack are handled correctly. Previously the code incorrectly recorded these fields with the same track number as the previous field.
This allows us to more easily detect uncorrected errors, and fail if we weren't able to accurately rip the track.
The write offset tends to be updated in bursts, so isn't ideal to use for a progress indicator. This changes the code to use the maximum read offset for progress.
This class can parse cdparanoia's status output, to detect progress, as well as warnings and uncorrected errors.
This allows output from long-running commands to be processed when it is received, rather than having to wait for the command to exit before the output is available.