diff --git a/ChangeLog b/ChangeLog index af2fad3..d944022 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-05-04 Thomas Vander Stichele + + * morituri/program/cdrdao.py: + Convert ReadTableTask to a CDRDAOTask subclass. + * examples/ARcalibrate.py: + * morituri/program/cdparanoia.py: + Adapt. + 2009-05-04 Thomas Vander Stichele * morituri/program/cdrdao.py: diff --git a/examples/ARcalibrate.py b/examples/ARcalibrate.py index 2844e6d..24baa2a 100644 --- a/examples/ARcalibrate.py +++ b/examples/ARcalibrate.py @@ -63,8 +63,9 @@ def arcs(runner, function, table, track, offset): track, offset)) os.close(fd) - track = table.tracks[track - 1] - t = cdparanoia.ReadTrackTask(path, table, track.start, track.end, offset) + table.getTrackLength + t = cdparanoia.ReadTrackTask(path, table, table.getTrackStart(track), + table.getTrackEnd(track), offset) t.description = 'Ripping with offset %d' % offset function(runner, t) @@ -72,7 +73,7 @@ def arcs(runner, function, table, track, offset): trackCount=len(table.tracks)) function(runner, t) - # os.unlink(path) + os.unlink(path) return "%08x" % t.checksum def main(argv): diff --git a/morituri/program/cdparanoia.py b/morituri/program/cdparanoia.py index b00b8a6..da6f4cc 100644 --- a/morituri/program/cdparanoia.py +++ b/morituri/program/cdparanoia.py @@ -101,12 +101,12 @@ class ReadTrackTask(task.Task): stopOffset = self._stop for i, t in enumerate(self._table.tracks): - if t.start <= self._start: + if self._table.getTrackStart(i + 1) <= self._start: startTrack = i + 1 - startOffset = self._start - t.start - if t.end <= self._stop: + startOffset = self._start - self._table.getTrackStart(i + 1) + if self._table.getTrackEnd(i + 1) <= self._stop: stopTrack = i + 1 - stopOffset = self._stop - t.start + stopOffset = self._stop - self._table.getTrackStart(i + 1) self.debug('Ripping from %d to %d (inclusive)', self._start, self._stop) self.debug('Starting at track %d, offset %d', startTrack, startOffset) diff --git a/morituri/program/cdrdao.py b/morituri/program/cdrdao.py index 2c093c4..b2985b7 100644 --- a/morituri/program/cdrdao.py +++ b/morituri/program/cdrdao.py @@ -238,7 +238,7 @@ class ReadTOCTask(CDRDAOTask): """ I am a task that reads all indexes of a CD. - @ivar toc: the .toc object + @ivar toc: the .toc file object @type toc: L{toc.TOC} """ @@ -258,124 +258,33 @@ class ReadTOCTask(CDRDAOTask): self.parser.read(bytes) def done(self): + # FIXME: instead of reading only a TOC, output a complete IndexTable + # by merging the TOC info. self.toc = toc.TOC(self._toc) self.toc.parse() os.unlink(self._toc) -class ReadTableTask(task.Task): +class ReadTableTask(CDRDAOTask): """ I am a task that reads the TOC of a CD, without pregaps. """ description = "Reading TOC..." - + table = None def __init__(self): - self._buffer = "" # accumulate characters - self._lines = [] # accumulate lines - self._errors = [] # accumulate error lines - self._state = 'START' - self._frames = None # number of frames - self._starts = [] # start of each track, in frames - self._track = None # which track are we analyzing? - self._toc = None # path to temporary .toc file - self._table = table.Table() + CDRDAOTask.__init__(self) + self.parser = OutputParser(self) - self.toc = None # result - - def start(self, runner): - task.Task.start(self, runner) - - # FIXME: create a temporary file instead (fd, self._toc) = tempfile.mkstemp(suffix='.morituri') os.close(fd) os.unlink(self._toc) - bufsize = 1024 - self._popen = asyncsub.Popen(["cdrdao", "read-toc", "--fast-toc", - self._toc], - bufsize=bufsize, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, close_fds=True) + self.options = ['read-toc', '--fast-toc', self._toc] - self.runner.schedule(1.0, self._read, runner) + def readbytes(self, bytes): + self.parser.read(bytes) - def _read(self, runner): - ret = self._popen.recv_err() - self.log(ret) - if not ret: - # could be finished now - self.runner.schedule(1.0, self._poll, runner) - return - - self._buffer += ret - - # parse buffer into lines if possible, and parse them - if "\n" in self._buffer: - lines = self._buffer.split('\n') - if lines[-1] != "\n": - # last line didn't end yet - self._buffer = lines[-1] - del lines[-1] - else: - self._buffer = "" - for line in lines: - self.log('Parsing %s', line) - if line.startswith('ERROR:'): - self._errors.append(line) - - self._parse(lines) - self._lines.extend(lines) - - self.runner.schedule(1.0, self._read, runner) - - def _poll(self, runner): - if self._popen.poll() is None: - self.runner.schedule(1.0, self._poll, runner) - return - - self._done() - - def _done(self): - self.setProgress(1.0) - if self._popen.returncode != 0: - if self._errors: - print "\n".join(self._errors) - else: - print 'ERROR: exit code %r' % self._popen.returncode - else: - self.table = self._table - os.unlink(self._toc) - - self.stop() - return - - def _parse(self, lines): - for line in lines: - methodName = "_parse_" + self._state - getattr(self, methodName)(line) - - def _parse_START(self, line): - if line.startswith('Track'): - self.debug('Found possible track line') - if line == "Track Mode Flags Start Length": - self.debug('Found track line, moving to TRACK state') - self._state = 'TRACK' - - def _parse_TRACK(self, line): - if line.startswith('---'): - return - - m = _TRACK_RE.search(line) - if m: - self._tracks = int(m.group('track')) - start = int(m.group('start')) - self._starts.append(start) - mode = m.group('mode') - length = int(m.group('length')) - self.debug('Found track %d', self._tracks) - track = table.Track(self._tracks, start, start + length - 1, - mode == "AUDIO") - self.debug('Track %d, start offset %d, length %d', - self._tracks, start, length) - self._table.tracks.append(track) + def done(self): + os.unlink(self._toc) + self.table = self.parser.toc