def do(self): prog = program.Program(config.Config()) runner = task.SyncRunner() for arg in self.options.cuefile: arg = arg.decode('utf-8') cueImage = image.Image(arg) cueImage.setup(runner) # FIXME: this feels like we're poking at internals. prog.cuePath = arg prog.result = result.RipResult() for track in cueImage.table.tracks: tr = result.TrackResult() tr.number = track.number prog.result.tracks.append(tr) verified = False try: verified = prog.verifyImage(runner, cueImage.table) except accurip.EntryNotFound: print('AccurateRip entry not found') accurip.print_report(prog.result) if not verified: sys.exit(1)
def testVerify(self): path = os.path.join(os.path.dirname(__file__), 'dBAR-020-002e5023-029d8e49-040eaa14.bin') data = open(path, "rb").read() responses = accurip.getAccurateRipResponses(data) # these crc's were calculated from an actual rip checksums = [ 1644890007, 2945205445, 3983436658, 1528082495, 1203704270, 1163423644, 3649097244, 100524219, 1583356174, 373652058, 1842579359, 2850056507, 1329730252, 2526965856, 2525886806, 209743350, 3184062337, 2099956663, 2943874164, 2321637196 ] prog = program.Program(config.Config()) prog.result = result.RipResult() # fill it with empty trackresults for i, c in enumerate(checksums): r = result.TrackResult() r.number = i + 1 prog.result.tracks.append(r) prog._verifyImageWithChecksums(responses, checksums) # now check if the results were filled in properly tr = prog.result.getTrackResult(1) self.assertEquals(tr.accurip, False) self.assertEquals(tr.ARDBMaxConfidence, 0) self.assertEquals(tr.ARDBCRC, 0) self.assertEquals(tr.ARDBCRC, 0) tr = prog.result.getTrackResult(2) self.assertEquals(tr.accurip, True) self.assertEquals(tr.ARDBMaxConfidence, 2) self.assertEquals(tr.ARDBCRC, checksums[2 - 1]) tr = prog.result.getTrackResult(10) self.assertEquals(tr.accurip, False) self.assertEquals(tr.ARDBMaxConfidence, 2) # we know track 10 was ripped wrong self.assertNotEquals(tr.ARDBCRC, checksums[10 - 1]) res = prog.getAccurateRipResults() self.assertEquals( res[1 - 1], "Track 1: rip NOT accurate (not found) " "[620b0797], DB [notfound]") self.assertEquals( res[2 - 1], "Track 2: rip accurate (max confidence 2) " "[af8c44c5], DB [af8c44c5]") self.assertEquals( res[10 - 1], "Track 10: rip NOT accurate (max confidence 2) " "[16457a5a], DB [eb6e55b4]")
def do(self): prog = program.Program(config.Config()) runner = task.SyncRunner() cache = accurip.AccuCache() for arg in self.options.cuefile: arg = arg.decode('utf-8') cueImage = image.Image(arg) cueImage.setup(runner) url = cueImage.table.getAccurateRipURL() responses = cache.retrieve(url) # FIXME: this feels like we're poking at internals. prog.cuePath = arg prog.result = result.RipResult() for track in cueImage.table.tracks: tr = result.TrackResult() tr.number = track.number prog.result.tracks.append(tr) prog.verifyImage(runner, responses) print "\n".join(prog.getAccurateRipResults()) + "\n"
def _ripIfNotRipped(number): logger.debug('ripIfNotRipped for track %d', number) # we can have a previous result trackResult = self.program.result.getTrackResult(number) if not trackResult: trackResult = result.TrackResult() self.program.result.tracks.append(trackResult) else: logger.debug('ripIfNotRipped have trackresult, path %r', trackResult.filename) path = self.program.getPath(self.program.outdir, self.options.track_template, self.mbdiscid, self.program.metadata, track_number=number) + '.flac' logger.debug('ripIfNotRipped: path %r', path) trackResult.number = number assert isinstance(path, str), "%r is not str" % path trackResult.filename = path if number > 0: trackResult.pregap = self.itable.tracks[number - 1].getPregap() trackResult.pre_emphasis = ( self.itable.tracks[number - 1].pre_emphasis ) # FIXME: optionally allow overriding reripping if os.path.exists(path): if path != trackResult.filename: # the path is different (different name/template ?) # but we can copy it logger.debug('previous result %r, expected %r', trackResult.filename, path) logger.info('verifying track %d of %d: %s', number, len(self.itable.tracks), os.path.basename(path)) if not self.program.verifyTrack(self.runner, trackResult): logger.warning('verification failed, reripping...') os.unlink(path) if not os.path.exists(path): logger.debug('path %r does not exist, ripping...', path) # we reset durations for test and copy here trackResult.testduration = 0.0 trackResult.copyduration = 0.0 extra = "" tries = 1 while tries <= self.options.max_retries: if tries > 1: extra = " (try %d)" % tries logger.info('ripping track %d of %d%s: %s', number, len(self.itable.tracks), extra, os.path.basename(path)) logger.debug('ripIfNotRipped: track %d, try %d', number, tries) tag_list = self.program.getTagList(number, self.mbdiscid) # An HTOA can't have an ISRC value if (number > 0 and self.itable.tracks[number - 1].isrc is not None): tag_list['ISRC'] = self.itable.tracks[number - 1].isrc try: self.program.ripTrack(self.runner, trackResult, offset=int(self.options.offset), device=self.device, taglist=tag_list, overread=self.options.overread, what='track %d of %d%s' % ( number, len(self.itable.tracks), extra), coverArtPath=self.coverArtPath) break # FIXME: catching too general exception (Exception) except Exception as e: logger.debug('got exception %r on try %d', e, tries) tries += 1 if tries > self.options.max_retries: tries -= 1 logger.critical('giving up on track %d after %d times', number, tries) if self.options.keep_going: logger.warning("track %d failed to rip.", number) logger.debug("adding %s to skipped_tracks", trackResult) self.skipped_tracks.append(trackResult) logger.debug("skipped_tracks = %s", self.skipped_tracks) trackResult.skipped = True else: raise RuntimeError("track can't be ripped. " "Rip attempts number is equal " "to %d", self.options.max_retries) if trackResult in self.skipped_tracks: print("Skipping CRC comparison for track %d " "due to rip failure" % number) else: if trackResult.testcrc == trackResult.copycrc: logger.info('CRCs match for track %d', number) else: raise RuntimeError( "CRCs did not match for track %d" % number ) print('Peak level: %.6f' % (trackResult.peak / 32768.0)) print('Rip quality: {:.2%}'.format(trackResult.quality)) # overlay this rip onto the Table if number == 0: # HTOA goes on index 0 of track 1 # ignore silence in PREGAP if trackResult.peak == SILENT: logger.debug('HTOA peak %r is equal to the SILENT ' 'threshold, disregarding', trackResult.peak) self.itable.setFile(1, 0, None, self.itable.getTrackStart(1), number) logger.debug('unlinking %r', trackResult.filename) os.unlink(trackResult.filename) trackResult.filename = None logger.info('HTOA discarded, contains digital silence') else: self.itable.setFile(1, 0, trackResult.filename, self.itable.getTrackStart(1), number) else: self.itable.setFile(number, 1, trackResult.filename, self.itable.getTrackLength(number), number)
def _ripIfNotRipped(number): logger.debug('ripIfNotRipped for track %d' % number) # we can have a previous result trackResult = self.program.result.getTrackResult(number) if not trackResult: trackResult = result.TrackResult() self.program.result.tracks.append(trackResult) else: logger.debug('ripIfNotRipped have trackresult, path %r' % trackResult.filename) path = self.program.getPath(self.program.outdir, self.options.track_template, self.mbdiscid, self.program.metadata, track_number=number) + '.flac' logger.debug('ripIfNotRipped: path %r' % path) trackResult.number = number assert type(path) is unicode, "%r is not unicode" % path trackResult.filename = path if number > 0: trackResult.pregap = self.itable.tracks[number - 1].getPregap() trackResult.pre_emphasis = ( self.itable.tracks[number - 1].pre_emphasis ) # FIXME: optionally allow overriding reripping if os.path.exists(path): if path != trackResult.filename: # the path is different (different name/template ?) # but we can copy it logger.debug('previous result %r, expected %r' % ( trackResult.filename, path)) sys.stdout.write('Verifying track %d of %d: %s\n' % ( number, len(self.itable.tracks), os.path.basename(path).encode('utf-8'))) if not self.program.verifyTrack(self.runner, trackResult): sys.stdout.write('Verification failed, reripping...\n') os.unlink(path) if not os.path.exists(path): logger.debug('path %r does not exist, ripping...' % path) tries = 0 # we reset durations for test and copy here trackResult.testduration = 0.0 trackResult.copyduration = 0.0 extra = "" while tries < MAX_TRIES: tries += 1 if tries > 1: extra = " (try %d)" % tries sys.stdout.write('Ripping track %d of %d%s: %s\n' % ( number, len(self.itable.tracks), extra, os.path.basename(path).encode('utf-8'))) try: logger.debug('ripIfNotRipped: track %d, try %d', number, tries) self.program.ripTrack(self.runner, trackResult, offset=int(self.options.offset), device=self.device, taglist=self.program.getTagList( number), overread=self.options.overread, what='track %d of %d%s' % ( number, len(self.itable.tracks), extra)) break except Exception as e: logger.debug('Got exception %r on try %d', e, tries) if tries == MAX_TRIES: logger.critical('Giving up on track %d after %d times' % ( number, tries)) raise RuntimeError( "track can't be ripped. " "Rip attempts number is equal to 'MAX_TRIES'") if trackResult.testcrc == trackResult.copycrc: sys.stdout.write('CRCs match for track %d\n' % number) else: raise RuntimeError( "CRCs did not match for track %d\n" % number ) sys.stdout.write( 'Peak level: {:.2%} \n'.format(trackResult.peak)) sys.stdout.write( 'Rip quality: {:.2%}\n'.format(trackResult.quality)) # overlay this rip onto the Table if number == 0: # HTOA goes on index 0 of track 1 # ignore silence in PREGAP if trackResult.peak <= SILENT: logger.debug( 'HTOA peak %r is below SILENT ' 'threshold, disregarding', trackResult.peak) self.itable.setFile(1, 0, None, self.ittoc.getTrackStart(1), number) logger.debug('Unlinking %r', trackResult.filename) os.unlink(trackResult.filename) trackResult.filename = None sys.stdout.write( 'HTOA discarded, contains digital silence\n') else: self.itable.setFile(1, 0, trackResult.filename, self.ittoc.getTrackStart(1), number) else: self.itable.setFile(number, 1, trackResult.filename, self.ittoc.getTrackLength(number), number) self.program.saveRipResult()
def ripIfNotRipped(number): logger.debug('ripIfNotRipped for track %d' % number) # we can have a previous result trackResult = self.program.result.getTrackResult(number) if not trackResult: trackResult = result.TrackResult() self.program.result.tracks.append(trackResult) else: logger.debug('ripIfNotRipped have trackresult, path %r' % trackResult.filename) path = self.program.getPath(self.program.outdir, self.options.track_template, self.mbdiscid, number, disambiguate=disambiguate) \ + '.' + 'flac' logger.debug('ripIfNotRipped: path %r' % path) trackResult.number = number assert type(path) is unicode, "%r is not unicode" % path trackResult.filename = path if number > 0: trackResult.pregap = self.itable.tracks[number - 1].getPregap() trackResult.pre_emphasis = (self.itable.tracks[number - 1].pre_emphasis) # FIXME: optionally allow overriding reripping if os.path.exists(path): if path != trackResult.filename: # the path is different (different name/template ?) # but we can copy it logger.debug('previous result %r, expected %r' % (trackResult.filename, path)) sys.stdout.write('Verifying track %d of %d: %s\n' % (number, len(self.itable.tracks), os.path.basename(path).encode('utf-8'))) if not self.program.verifyTrack(self.runner, trackResult): sys.stdout.write('Verification failed, reripping...\n') os.unlink(path) if not os.path.exists(path): logger.debug('path %r does not exist, ripping...' % path) tries = 0 # we reset durations for test and copy here trackResult.testduration = 0.0 trackResult.copyduration = 0.0 extra = "" while tries < MAX_TRIES: tries += 1 if tries > 1: extra = " (try %d)" % tries sys.stdout.write('Ripping track %d of %d%s: %s\n' % (number, len(self.itable.tracks), extra, os.path.basename(path).encode('utf-8'))) try: logger.debug('ripIfNotRipped: track %d, try %d', number, tries) self.program.ripTrack( self.runner, trackResult, offset=int(self.options.offset), device=self.device, taglist=self.program.getTagList(number), overread=self.options.overread, what='track %d of %d%s' % (number, len(self.itable.tracks), extra)) break except Exception, e: logger.debug('Got exception %r on try %d', e, tries) if tries == MAX_TRIES: logger.critical('Giving up on track %d after %d times' % (number, tries)) raise RuntimeError( "track can't be ripped. " "Rip attempts number is equal to 'MAX_TRIES'") if trackResult.testcrc == trackResult.copycrc: sys.stdout.write('Checksums match for track %d\n' % number) else: sys.stdout.write( 'ERROR: checksums did not match for track %d\n' % number) raise sys.stdout.write('Peak level: {:.2%} \n'.format( trackResult.peak)) sys.stdout.write('Rip quality: {:.2%}\n'.format( trackResult.quality))