From 3f1ace2ce29934fbae29a500c8b846e366d6c834 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sat, 23 May 2009 18:14:31 +0000 Subject: [PATCH] * morituri/program/cdparanoia.py: * morituri/program/cdrdao.py: * morituri/rip/cd.py: * morituri/rip/offset.py: Add device argument to ripping/scanning tasks. --- ChangeLog | 8 ++++++++ morituri/program/cdparanoia.py | 24 +++++++++++++++--------- morituri/program/cdrdao.py | 32 ++++++++++++++++++++++---------- morituri/rip/cd.py | 26 +++++++++++++++++++++----- morituri/rip/offset.py | 2 +- 5 files changed, 67 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index db2878e..64c2c63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-05-23 Thomas Vander Stichele + + * morituri/program/cdparanoia.py: + * morituri/program/cdrdao.py: + * morituri/rip/cd.py: + * morituri/rip/offset.py: + Add device argument to ripping/scanning tasks. + 2009-05-23 Thomas Vander Stichele * morituri/common/accurip.py: diff --git a/morituri/program/cdparanoia.py b/morituri/program/cdparanoia.py index d21e414..100510f 100644 --- a/morituri/program/cdparanoia.py +++ b/morituri/program/cdparanoia.py @@ -83,7 +83,7 @@ class ReadTrackTask(task.Task): description = "Reading Track" - def __init__(self, path, table, start, stop, offset=0): + def __init__(self, path, table, start, stop, offset=0, device=None): """ Read the given track. @@ -97,6 +97,8 @@ class ReadTrackTask(task.Task): @type stop: int @param offset: read offset, in samples @type offset: int + @param device: the device to rip from + @type device: str """ self.path = path self._table = table @@ -104,6 +106,7 @@ class ReadTrackTask(task.Task): self._stop = stop self._offset = offset self._parser = ProgressParser() + self._device = device self._buffer = "" # accumulate characters self._errors = [] @@ -130,13 +133,14 @@ class ReadTrackTask(task.Task): self.debug('Stopping at track %d, offset %d', stopTrack, stopOffset) bufsize = 1024 - argv = ["cdparanoia", - "--sample-offset=%d" % self._offset, - "--stderr-progress", - "%d[%s]-%d[%s]" % ( + argv = ["cdparanoia", "--stderr-progress", + "--sample-offset=%d" % self._offset, ] + if self._device: + argv.extend(["--force-cdrom-device", self._device, ]) + argv.extend(["%d[%s]-%d[%s]" % ( startTrack, common.framesToHMSF(startOffset), stopTrack, common.framesToHMSF(stopOffset)), - self.path] + self.path]) self.debug('Running %s' % (" ".join(argv), )) self._popen = asyncsub.Popen(argv, bufsize=bufsize, @@ -224,7 +228,7 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): @ivar checksum: the checksum of the track. """ - def __init__(self, path, table, start, stop, offset=0): + def __init__(self, path, table, start, stop, offset=0, device=None): """ @param path: where to store the ripped track @type path: str @@ -236,6 +240,8 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): @type stop: int @param offset: read offset, in samples @type offset: int + @param device: the device to rip from + @type device: str """ self.path = path @@ -247,9 +253,9 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): self.tasks = [] self.tasks.append( - ReadTrackTask(tmppath, table, start, stop, offset)) + ReadTrackTask(tmppath, table, start, stop, offset, device)) self.tasks.append(checksum.CRC32Task(tmppath)) - t = ReadTrackTask(tmppath, table, start, stop, offset) + t = ReadTrackTask(tmppath, table, start, stop, offset, device) t.description = 'Verifying track...' self.tasks.append(t) self.tasks.append(checksum.CRC32Task(tmppath)) diff --git a/morituri/program/cdrdao.py b/morituri/program/cdrdao.py index ad5544b..aae36f3 100644 --- a/morituri/program/cdrdao.py +++ b/morituri/program/cdrdao.py @@ -198,10 +198,10 @@ class CDRDAOTask(task.Task): task.Task.start(self, runner) bufsize = 1024 - self._popen = asyncsub.Popen(["cdrdao"] + self.options, - bufsize=bufsize, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, close_fds=True) + self._popen = asyncsub.Popen(["cdrdao", ] + self.options, + bufsize=bufsize, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, close_fds=True) self.debug('Started cdrdao with pid %d and options %r', self._popen.pid, self.options) @@ -263,15 +263,21 @@ class ReadTableTask(CDRDAOTask): description = "Scanning indexes..." table = None - def __init__(self): + def __init__(self, device=None): + """ + @param device: the device to rip from + @type device: str + """ CDRDAOTask.__init__(self) self.parser = OutputParser(self) (fd, self._tocfilepath) = tempfile.mkstemp(suffix='.morituri') os.close(fd) os.unlink(self._tocfilepath) - self.options = ['read-toc', '--session', '9', - self._tocfilepath, ] + self.options = ['read-toc', ] + if device: + self.options.extend(['--device', device, ]) + self.options.extend(['--session', '9', self._tocfilepath, ]) def readbytes(self, bytes): self.parser.read(bytes) @@ -312,7 +318,11 @@ class ReadTOCTask(CDRDAOTask): description = "Reading TOC..." table = None - def __init__(self): + def __init__(self, device=None): + """ + @param device: the device to rip from + @type device: str + """ CDRDAOTask.__init__(self) self.parser = OutputParser(self) @@ -322,8 +332,10 @@ class ReadTOCTask(CDRDAOTask): # Reading a non-existent session gives you output for all sessions # 9 should be a safe number - self.options = ['read-toc', '--fast-toc', '--session', '9', - self._toc, ] + self.options = ['read-toc', '--fast-toc', ] + if device: + self.options.extend(['--device', device, ]) + self.options.extend(['--session', '9', self._toc, ]) def readbytes(self, bytes): self.parser.read(bytes) diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py index 3882329..56ef6d7 100644 --- a/morituri/rip/cd.py +++ b/morituri/rip/cd.py @@ -29,7 +29,7 @@ import shutil import gobject gobject.threads_init() -from morituri.common import logcommand, task, checksum, common, accurip +from morituri.common import logcommand, task, checksum, common, accurip, drive from morituri.image import image, cue, table from morituri.program import cdrdao, cdparanoia @@ -195,7 +195,7 @@ class Rip(logcommand.LogCommand): # first, read the normal TOC, which is fast ptoc = common.Persister(self.options.toc_pickle or None) if not ptoc.object: - t = cdrdao.ReadTOCTask() + t = cdrdao.ReadTOCTask(device=self.parentCommand.options.device) function(runner, t) ptoc.persist(t.table) ittoc = ptoc.object @@ -214,7 +214,7 @@ class Rip(logcommand.LogCommand): # now, read the complete index table, which is slower ptable = common.Persister(self.options.table_pickle or None) if not ptable.object: - t = cdrdao.ReadTableTask() + t = cdrdao.ReadTableTask(device=self.parentCommand.options.device) function(runner, t) ptable.persist(t.table) itable = ptable.object @@ -250,7 +250,8 @@ class Rip(logcommand.LogCommand): print 'Ripping track %d: %s' % (0, os.path.basename(htoapath)) t = cdparanoia.ReadVerifyTrackTask(htoapath, ittoc, start, stop - 1, - offset=int(self.options.offset)) + offset=int(self.options.offset), + device=self.parentCommand.options.device) function(runner, t) if t.checksum: print 'Checksums match for track %d' % 0 @@ -272,7 +273,8 @@ class Rip(logcommand.LogCommand): t = cdparanoia.ReadVerifyTrackTask(path, ittoc, ittoc.getTrackStart(i + 1), ittoc.getTrackEnd(i + 1), - offset=int(self.options.offset)) + offset=int(self.options.offset), + device=self.parentCommand.options.device) t.description = 'Reading Track %d' % (i + 1) function(runner, t) if t.checksum: @@ -385,3 +387,17 @@ class CD(logcommand.LogCommand): summary = "handle CD's" subCommandClasses = [Rip, ] + + def addOptions(self): + self.parser.add_option('-d', '--device', + action="store", dest="device", + help="CD-DA device") + + def handleOptions(self, options): + if not options.device: + drives = drive.getAllDevicePaths() + if not drives: + self.error('No CD-DA drives found!') + return 3 + + self.options.device = drives[0] diff --git a/morituri/rip/offset.py b/morituri/rip/offset.py index df4a2ef..f5cef91 100644 --- a/morituri/rip/offset.py +++ b/morituri/rip/offset.py @@ -78,7 +78,7 @@ CD in the AccurateRip database.""" try: handle = urllib2.urlopen(url) data = handle.read() - responses = image.getAccurateRipResponses(data) + responses = accurip.getAccurateRipResponses(data) except urllib2.HTTPError, e: if e.code == 404: print 'Album not found in AccurateRip database.'