We can now rip CDs without gstreamer.
This is not the most clean attempt, but I have tried to remove most of the
code that depends on gstreamer. I hope there is not a lot of code left that
depends on code that I have removed - I can at least rip a CD fully.
* 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
Strip bitrate tags too for comparison of dicts.
Add a way to show us the different keys between dicts.
* morituri/common/encode.py:
Debug different keys.
* morituri/common/program.py:
* morituri/image/table.py:
* morituri/rip/cd.py:
* morituri/test/test_common_common.py:
* morituri/test/test_image_toc.py:
Handle cases where disc_template and track_template are not in
the same directory.
Add shrinkPath to write shorter path names.
* morituri/test/test_common_common.py (added):
Add test.
* morituri/program/cdparanoia.py:
Catch ENAMETOOLONG and shrink path.
* morituri/common/program.py:
Update track result's filename if it was shrunk.
* morituri/rip/cd.py:
set the possibly shrunk path on the result.
Add release data for Bettie Serveert, Lamprey
* morituri/test/test_common_program.py:
Add a test for parsing and getting the whole duration.
* morituri/common/common.py:
Add a method to format time.
* morituri/common/program.py:
Add duration to tracks and release metadatas.
When there are multiple matches, look up the closest in duration.
Make sure that multiple matches closest in duration contain same
artist and title.
Complain about the other ones.
* morituri/image/table.py:
Add a method to calculate a duration from the table.
* morituri/test/test_image_table.py:
Add a test for it.
Add an EmptyError.
* morituri/common/checksum.py:
Set it when we don't get any frames.
* morituri/rip/main.py:
Catch it and stop ripping if this happens.
Style fixes.
* morituri/common/common.py:
Add functions to convert a gst.TagList to a dict and compare them.
* morituri/common/task.py:
Add setAndRaiseException which gives us an appropriate
exceptionMessage as if we raised where we called this new function.
add quoteParse function to quote properly for gst.parse_launch()
* morituri/common/checksum.py:
Fix single quote problem.
use self.setException()
* morituri/common/encode.py:
Fix single quote problem.
* morituri/image/image.py:
Fix single quote problem.
Reraise gst.QueryError.
* morituri/test/test_common_encode.py:
* morituri/test/test_common_encode.py (added):
Add tests for unicode/single/double quote.
* morituri/test/test_image_image.py:
* morituri/test/test_common_checksum.py:
Add tests for single/double quote.
* morituri/test/common.py:
add twisted-like failUnlessRaises to TestCase that returns
the exception, so we can check wrapped exceptions in TaskException.
Add a persisted cache so that we can store pickles on discs.
Automatically delete them if the class version is newer than
the object's.
* morituri/rip/cd.py:
Use it.