* 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
87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
# -*- Mode: Python -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
|
|
import os
|
|
import sys
|
|
import pkg_resources
|
|
import musicbrainzngs
|
|
|
|
from morituri.command import cd, offset, drive, image, accurip, debug
|
|
from morituri.command.basecommand import BaseCommand
|
|
from morituri.common import common, directory
|
|
from morituri.configure import configure
|
|
from morituri.extern.task import task
|
|
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def main():
|
|
# set user agent
|
|
musicbrainzngs.set_useragent("whipper", configure.version,
|
|
"https://github.com/JoeLametta/whipper")
|
|
# register plugins with pkg_resources
|
|
distributions, _ = pkg_resources.working_set.find_plugins(
|
|
pkg_resources.Environment([directory.data_path('plugins')])
|
|
)
|
|
map(pkg_resources.working_set.add, distributions)
|
|
try:
|
|
ret = Whipper(sys.argv[1:], os.path.basename(sys.argv[0]), None).do()
|
|
except SystemError, e:
|
|
sys.stderr.write('whipper: error: %s\n' % e.args)
|
|
return 255
|
|
except ImportError, e:
|
|
raise ImportError(e)
|
|
except task.TaskException, e:
|
|
if isinstance(e.exception, ImportError):
|
|
raise ImportError(e.exception)
|
|
elif isinstance(e.exception, common.MissingDependencyException):
|
|
sys.stderr.write('whipper: error: missing dependency "%s"\n' %
|
|
e.exception.dependency)
|
|
return 255
|
|
|
|
if isinstance(e.exception, common.EmptyError):
|
|
logger.debug("EmptyError: %r", str(e.exception))
|
|
sys.stderr.write('whipper: error: Could not create encoded file.\n')
|
|
return 255
|
|
|
|
# in python3 we can instead do `raise e.exception` as that would show
|
|
# the exception's original context
|
|
sys.stderr.write(e.exceptionMessage)
|
|
return 255
|
|
return ret if ret else 0
|
|
|
|
class Whipper(BaseCommand):
|
|
description = """whipper is a CD ripping utility focusing on accuracy over speed.
|
|
|
|
whipper gives you a tree of subcommands to work with.
|
|
You can get help on subcommands by using the -h option to the subcommand.
|
|
"""
|
|
no_add_help = True
|
|
subcommands = {
|
|
'accurip': accurip.AccuRip,
|
|
'cd': cd.CD,
|
|
'debug': debug.Debug,
|
|
'drive': drive.Drive,
|
|
'offset': offset.Offset,
|
|
'image': image.Image
|
|
}
|
|
|
|
def add_arguments(self):
|
|
self.parser.add_argument('-R', '--record',
|
|
action='store_true', dest='record',
|
|
help="record API requests for playback")
|
|
self.parser.add_argument('-v', '--version',
|
|
action="store_true", dest="version",
|
|
help="show version information")
|
|
self.parser.add_argument('-h', '--help',
|
|
action="store_true", dest="help",
|
|
help="show this help message and exit")
|
|
|
|
def handle_arguments(self):
|
|
if self.options.help:
|
|
self.parser.print_help()
|
|
sys.exit(0)
|
|
if self.options.version:
|
|
print "whipper %s" % configure.version
|
|
sys.exit(0)
|