* introduce logcommand.Lager, Whipper(); use argparse for whipper image commands, stub logging
* update Lager docstring to mention config.Config()
* make incorrect subcommand and --version work on toplevel command
* migrate accurip show, expand Lager, do not attempt to return from Lager.__init__.
* migrate offset find, add Lager.error
* correct offset find drive symlink handling
* migrate drive
* change Lager.__init__(prog) to arg from kwarg
* but actually
* remove Whipper.usage
* add and use Lager.device_option() context manager
* help I married an axe murderer
* use unified options namespace for entire command tree
* migrate whipper cd without comprehensive config loading
* switch to logging module
- use logging instead of flog for non-extern modules
- use WHIPPER_DEBUG and WHIPPER_LOGFILE env variables
* convert self.log calls to logger.debug
* convert self.error calls to logger.error
* remove log.Loggable, use logger not logging
* Logging conversion continues
- Convert log.* calls to logger.*
- Remove morituri.common.log imports
* remove morituri.common.log from tests
* remove extern/flog, bare minimum Debug conversion
* update README for logging changes
* update soxi to use logging
* refactor Lager for more declarative subcommands
* Refactor Lager.device_option:
- inline into __init__
- throw IOError instead of Exception for missing drives
- remove CommandError checking in rip/main
* rename rip to whipper in rip.main
* convert rip.debug commands
* Rename logcommand.Lager to command.BaseCommand
- remove command.CommandError occurrences
- remove python-command external module
* remove submodules from README, update rclog formatter
* update minor ambiguity in readme for command invocation
* update version number to match setup.py
* remove gitmodules
* update version number in tests as well (boo)
* convert logger.error to logger.critical
* Change morituri.rip to morituri.command
- mv common.command to command.basecommand
- move TEMPLATES used only by rip.cd out of rip.common
- update entry point for command to command.main
* update basecommand documentation
* go pyflaking: import fixing
* replace self.stdout with sys.stdout
* remove BaseCommand.config, alphabetise imports
* convert self.stdXXX leftovers
* convert last getRootCommand to config.Config
* convert last getExceptionMessage's to str
* change musicbrainz useragent to whipper
add task argument to TaskRunner.schedule so we can get exceptions.
Add .schedule method to Task to pass self.
* morituri/common/checksum.py:
* morituri/common/encode.py:
* morituri/common/gstreamer.py:
* morituri/program/cdparanoia.py:
* morituri/program/cdrdao.py:
Adapt.
Add logCategory to CDRDAO tasks.
Remove errors from parser, set them publically on task.
Properly raise exceptions on data cd's with correct stack origin.
Parse version number.
* morituri/rip/cd.py:
Warn about cdrdao versions with a bug.
* morituri/test/test_program_cdrdao.py:
Test that we can parse the version.
Add asserts for comparing id's between the simple toc and
the full table.
Create the output directory before ripping the htoa.
Ignore data tracks for now.
Don't fail if we have no AccurateRip responses.
* morituri/image/table.py:
Add a session ivar to Track.
Factor in session leadin when calculating track length
of last track in a session.
add getMusicBrainzSubmitURL()
add _getSessionGap() because the session gap size is different
for session 2 and all following.
Use it in merge() to get offsets right.
Fix getAccurateRipURL by only using the audio tracks for the
'length in tracks' number
Temporarily disable writing out data tracks to a .cue file,
since it's not implemented yet.
Add canCue to see if we can write a .cue file from the given table,
and debug why not if not.
* morituri/program/cdrdao.py:
Rework to rip each session separately instead of using session 9.
This fixes session 9 read-toc missing the pregap.
Add a simple LineParser for handling output from disk-info.
Count tracks relatively for the session, because the output for
session 2 for track numbers picks up where session 1 left off.
Don't set leadout from TOC printing since for the same reason
session 2's leadout is absolute, not relative to start of session.
Add a DiscInfoTask.
Convert Table and Toc reading tasks to multitasks, first getting the
number of sessions, then reading table/toc for each session.
* morituri/test/test_image_table.py:
Fix up MusicBrainz disc id for my Ladyhawke disc.
Add AccurateRip URL verification, compared against EAC's.
* morituri/test/test_image_toc.py:
Use two separate session read-toc output files to verify
the case of Das Capital.
Verify musicbrainz URL.
read all sessions by reading session 9.
* morituri/image/toc.py:
Parse ZERO statements properly.
Also set absolute offsets when we know them from the .toc file.
Properly set audio flag on tracks.
FIXME: probably doesn't work if the .toc does not have lengths.
* morituri/image/table.py:
Add some debug to cddb disc id calculation.
Fix absolutize function, it was going one index too far.
raise ValueError when overriding .absolute with a wrong value.
* examples/readdisc.py:
Show CDDB disc id at the start.
Assert when toc and table have different disc id's (to be fixed)
* morituri/test/test_image_cue.py:
Update for having the table already with absolute values.
* morituri/test/test_image_toc.py:
Add Ladyhawke CDDB test, it has a data track.
Add logging.
Add methods to clear a table of files, and to absolutize indexes
as long as the source is the same file, and to set a File on a
given index, adjusting all following indexes that match the
duration, and check if the IndexTable has all information for a TOC.
* morituri/image/toc.py:
Add logging.
Use a counter for the source.
Fix up index offset calculation.
* morituri/program/cdrdao.py:
Use a real IndexTable as the result, instead of a TocFile.
* morituri/image/cue.py:
Use a real IndexTable to store tracks.
* morituri/test/test_image_toc.py:
The toc file now has a table which has the tracks.
Fix the tests to adjust for wrong index calculations.
* morituri/test/test_image_cue.py:
* morituri/test/test_image_image.py:
* morituri/image/image.py:
The cue file now has a table which has the tracks.
* morituri/test/test_image_table.py:
Add assertions to make sure when the table can serve as a TOC.
* examples/readdisc.py:
Adjust for changes. Fix up to include AccurateRip results.
First time we can do a complete normal rip including verifying
against AccurateRip results!