diff --git a/morituri/common/program.py b/morituri/common/program.py index d340fdd9..e2e4d2cd 100644 --- a/morituri/common/program.py +++ b/morituri/common/program.py @@ -151,7 +151,7 @@ def function(r, t): assert toc.hasTOC() return toc - def getTable(self, runner, cddbdiscid, mbdiscid, device): + def getTable(self, runner, cddbdiscid, mbdiscid, device, offset): """ Retrieve the Table either from the cache or the drive. @@ -159,21 +159,31 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device): """ tcache = cache.TableCache() ptable = tcache.get(cddbdiscid, mbdiscid) + itable = None + tdict = {} - if not ptable.object: - self.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache, ' + # Ingore old cache, since we do not know what offset it used. + if type(ptable.object) is dict: + tdict = ptable.object + + if offset in tdict: + itable = tdict[offset] + + if not itable: + self.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache for offset %s, ' 'reading table' % ( - cddbdiscid, mbdiscid)) + cddbdiscid, mbdiscid, offset)) t = cdrdao.ReadTableTask(device=device) runner.run(t) - ptable.persist(t.table) - self.debug('getTable: read table %r' % t.table) + itable = t.table + tdict[offset] = itable + ptable.persist(tdict) + self.debug('getTable: read table %r' % itable) else: - self.debug('getTable: cddbdiscid %s, mbdiscid %s in cache' % ( - cddbdiscid, mbdiscid)) - ptable.object.unpickled() - self.debug('getTable: loaded table %r' % ptable.object) - itable = ptable.object + self.debug('getTable: cddbdiscid %s, mbdiscid %s in cache for offset %s' % ( + cddbdiscid, mbdiscid, offset)) + self.debug('getTable: loaded table %r' % itable) + assert itable.hasTOC() self.result.table = itable @@ -182,8 +192,6 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device): itable.getMusicBrainzDiscId()) return itable - # FIXME: the cache should be model/offset specific - def getRipResult(self, cddbdiscid): """ Retrieve the persistable RipResult either from our cache (from a diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py index eaf5da41..a0b55d87 100644 --- a/morituri/rip/cd.py +++ b/morituri/rip/cd.py @@ -108,7 +108,7 @@ def do(self, args): self.itable = self.program.getTable(self.runner, self.ittoc.getCDDBDiscId(), - self.ittoc.getMusicBrainzDiscId(), self.device) + self.ittoc.getMusicBrainzDiscId(), self.device, self.options.offset) assert self.itable.getCDDBDiscId() == self.ittoc.getCDDBDiscId(), \ "full table's id %s differs from toc id %s" % (