accuraterip-checksum: convert to python C extension
* calculate v1 and v2 checksums at once * let libsndfile handle both WAV and FLAC Signed-off-by: Andreas Oberritter <obi@saftware.de>
This commit is contained in:
@@ -190,12 +190,7 @@ CD in the AccurateRip database."""
|
||||
track, offset)
|
||||
runner.run(t)
|
||||
|
||||
v1 = arc.accuraterip_checksum(
|
||||
path, track, len(table.tracks), wave=True, v2=False
|
||||
)
|
||||
v2 = arc.accuraterip_checksum(
|
||||
path, track, len(table.tracks), wave=True, v2=True
|
||||
)
|
||||
v1, v2 = arc.accuraterip_checksum(path, track, len(table.tracks))
|
||||
|
||||
os.unlink(path)
|
||||
return "%08x" % v1, "%08x" % v2
|
||||
|
||||
@@ -110,19 +110,14 @@ def calculate_checksums(track_paths):
|
||||
logger.debug('checksumming %d tracks', track_count)
|
||||
# This is done sequentially because it is very fast.
|
||||
for i, path in enumerate(track_paths):
|
||||
v1_sum = accuraterip_checksum(
|
||||
path, i+1, track_count, wave=True, v2=False
|
||||
)
|
||||
if not v1_sum:
|
||||
v1_sum, v2_sum = accuraterip_checksum(path, i+1, track_count)
|
||||
if v1_sum is None:
|
||||
logger.error('could not calculate AccurateRip v1 checksum '
|
||||
'for track %d %r', i + 1, path)
|
||||
v1_checksums.append(None)
|
||||
else:
|
||||
v1_checksums.append("%08x" % v1_sum)
|
||||
v2_sum = accuraterip_checksum(
|
||||
path, i+1, track_count, wave=True, v2=True
|
||||
)
|
||||
if not v2_sum:
|
||||
if v2_sum is None:
|
||||
logger.error('could not calculate AccurateRip v2 checksum '
|
||||
'for track %d %r', i + 1, path)
|
||||
v2_checksums.append(None)
|
||||
|
||||
@@ -1,54 +1,5 @@
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
ARB = 'accuraterip-checksum'
|
||||
FLAC = 'flac'
|
||||
import accuraterip
|
||||
|
||||
|
||||
def _execute(cmd, **redirects):
|
||||
logger.debug('executing %r', cmd)
|
||||
return Popen(cmd, **redirects)
|
||||
|
||||
|
||||
def accuraterip_checksum(f, track_number, total_tracks, wave=False, v2=False):
|
||||
v = '--accuraterip-v1'
|
||||
if v2:
|
||||
v = '--accuraterip-v2'
|
||||
|
||||
track_number, total_tracks = str(track_number), str(total_tracks)
|
||||
|
||||
if wave:
|
||||
cmd = [ARB, v, f, track_number, total_tracks]
|
||||
redirects = dict(stdout=PIPE, stderr=PIPE)
|
||||
else:
|
||||
flac = _execute([FLAC, '-cds', f], stdout=PIPE)
|
||||
cmd = [ARB, v, '/dev/stdin', track_number, total_tracks]
|
||||
redirects = dict(stdin=flac.stdout, stdout=PIPE, stderr=PIPE)
|
||||
arc = _execute(cmd, **redirects)
|
||||
|
||||
if not wave:
|
||||
flac.stdout.close()
|
||||
|
||||
out, _ = arc.communicate()
|
||||
|
||||
if not wave:
|
||||
flac.wait()
|
||||
if flac.returncode != 0:
|
||||
logger.warning('ARC calculation failed: flac '
|
||||
'return code is non zero: %r', flac.returncode)
|
||||
return None
|
||||
|
||||
if arc.returncode != 0:
|
||||
logger.warning('ARC calculation failed: '
|
||||
'arc return code is non zero: %r', arc.returncode)
|
||||
return None
|
||||
|
||||
try:
|
||||
checksum = int('0x%s' % out.strip(), base=16)
|
||||
logger.debug('returned %r', checksum)
|
||||
return checksum
|
||||
except ValueError:
|
||||
logger.warning('ARC output is not usable')
|
||||
return None
|
||||
def accuraterip_checksum(f, track_number, total_tracks):
|
||||
return accuraterip.compute(f.encode('utf-8'), track_number, total_tracks)
|
||||
|
||||
Reference in New Issue
Block a user