Beispiel #1
0
    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)
Beispiel #2
0
    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]")
Beispiel #3
0
    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"
Beispiel #4
0
        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)
Beispiel #5
0
        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()
Beispiel #6
0
        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))