Some of the instructions have been rendered invalid during the conversion to logger statements... Also performed various stylistic fixes
55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
from subprocess import Popen, PIPE
|
|
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
ARB = 'accuraterip-checksum'
|
|
FLAC = 'flac'
|
|
|
|
|
|
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, err = 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
|