* morituri/program/cdrdao.py:
Convert ReadTableTask to a CDRDAOTask subclass. * examples/ARcalibrate.py: * morituri/program/cdparanoia.py: Adapt.
This commit is contained in:
@@ -1,3 +1,11 @@
|
||||
2009-05-04 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* morituri/program/cdrdao.py:
|
||||
Convert ReadTableTask to a CDRDAOTask subclass.
|
||||
* examples/ARcalibrate.py:
|
||||
* morituri/program/cdparanoia.py:
|
||||
Adapt.
|
||||
|
||||
2009-05-04 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* morituri/program/cdrdao.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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user