115 lines
4.5 KiB
Python
115 lines
4.5 KiB
Python
# -*- Mode: Python -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
|
|
import os
|
|
import sys
|
|
import musicbrainzngs
|
|
import whipper
|
|
from whipper.command import cd, offset, drive, image, accurip, mblookup
|
|
from whipper.command.basecommand import BaseCommand
|
|
from whipper.common import common, config
|
|
from whipper.extern.task import task
|
|
from whipper.program.utils import eject_device
|
|
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def main():
|
|
server = config.Config().get_musicbrainz_server()
|
|
https_enabled = server['scheme'] == 'https'
|
|
try:
|
|
musicbrainzngs.set_hostname(server['netloc'], https_enabled)
|
|
# Parameter 'use_https' is missing in versions of musicbrainzngs < 0.7
|
|
except TypeError:
|
|
logger.warning("Parameter 'use_https' is missing in versions of "
|
|
"musicbrainzngs < 0.7. This means whipper will only "
|
|
"be able to communicate with the configured "
|
|
"MusicBrainz server ('%s') over plain HTTP. If a "
|
|
"custom server which speaks HTTPS only has been "
|
|
"declared, a suitable version of the "
|
|
"musicbrainzngs module will be needed "
|
|
"to make it work in whipper.", server['netloc'])
|
|
musicbrainzngs.set_hostname(server['netloc'])
|
|
|
|
try:
|
|
cmd = Whipper(sys.argv[1:], 'whipper', None)
|
|
ret = cmd.do()
|
|
except SystemError as e:
|
|
logger.critical("SystemError: %s", e)
|
|
if (isinstance(e, common.EjectError) and
|
|
cmd.options.eject in ('failure', 'always')):
|
|
# XXX: Pylint, instance of 'SystemError' has no 'device' member
|
|
eject_device(e.device)
|
|
return 255
|
|
except RuntimeError as e:
|
|
print(e)
|
|
return 1
|
|
except KeyboardInterrupt:
|
|
return 2
|
|
except ImportError:
|
|
raise
|
|
except task.TaskException as e:
|
|
if isinstance(e.exception, ImportError):
|
|
raise ImportError(e.exception)
|
|
elif isinstance(e.exception, common.MissingDependencyException):
|
|
logger.critical('missing dependency "%s"', e.exception.dependency)
|
|
return 255
|
|
|
|
if isinstance(e.exception, common.EmptyError):
|
|
logger.debug("EmptyError: %s", e.exception)
|
|
logger.critical('could not create encoded file')
|
|
return 255
|
|
|
|
# in python3 we can instead do `raise e.exception` as that would show
|
|
# the exception's original context
|
|
logger.critical(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.\n\n"
|
|
"whipper gives you a tree of subcommands to work with.\n"
|
|
"You can get help on subcommands by using the -h option "
|
|
"to the subcommand.\n")
|
|
no_add_help = True
|
|
subcommands = {
|
|
'accurip': accurip.AccuRip,
|
|
'cd': cd.CD,
|
|
'drive': drive.Drive,
|
|
'offset': offset.Offset,
|
|
'image': image.Image,
|
|
'mblookup': mblookup.MBLookup
|
|
}
|
|
|
|
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")
|
|
self.parser.add_argument('-e', '--eject',
|
|
action="store", dest="eject",
|
|
default="success",
|
|
choices=('never', 'failure',
|
|
'success', 'always'),
|
|
help="when to eject disc (default: success)"),
|
|
self.parser.add_argument('-c', '--drive-auto-close', action="store",
|
|
dest="drive_auto_close", default=True,
|
|
help="whether to auto close the drive's "
|
|
"tray before reading a CD (default: True)")
|
|
|
|
def handle_arguments(self):
|
|
if self.options.help:
|
|
self.parser.print_help()
|
|
sys.exit(0)
|
|
if self.options.version:
|
|
print("whipper %s" % whipper.__version__)
|
|
sys.exit(0)
|