Skip to content

Commit caeeeac

Browse files
author
blueblots
committed
Fixed m3u and cue sheet generation
Added conditional to `program.write_m3u()` to ignore skipped tracks. Added skipped_tracks support to the `Program` and `image.ImageVerifyTask` classes to avoid crashing when a file for a skipped track doesn't exist. Added conditional to `accurip.calculate_checksums` to check if a path exists before trying to calculate checksums, this prevents `accuraterip-checksum.c` from emitting an error message (`sf_open failed!`) when a path doesn't exist (as when a track is skipped). Signed-off-by: blueblots <63152708+blueblots@users.noreply.github.com>
1 parent 82e1b24 commit caeeeac

4 files changed

Lines changed: 37 additions & 16 deletions

File tree

whipper/command/cd.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -487,18 +487,17 @@ def _ripIfNotRipped(number):
487487
if self.options.keep_going:
488488
logger.warning("track %d failed to rip.", number)
489489
logger.debug("adding %s to skipped_tracks",
490-
trackResult.filename)
491-
self.skipped_tracks.append(trackResult.filename)
490+
trackResult)
491+
self.skipped_tracks.append(trackResult)
492492
logger.debug("skipped_tracks = %s",
493493
self.skipped_tracks)
494494
trackResult.skipped = True
495-
logger.debug('trackResult.skipped = True')
496495
else:
497496
raise RuntimeError("track can't be ripped. "
498497
"Rip attempts number is equal "
499498
"to %d",
500499
self.options.max_retries)
501-
if trackResult.filename in self.skipped_tracks:
500+
if trackResult in self.skipped_tracks:
502501
print("Skipping CRC comparison for track %d "
503502
"due to rip failure" % number)
504503
else:
@@ -529,14 +528,9 @@ def _ripIfNotRipped(number):
529528
self.itable.setFile(1, 0, trackResult.filename,
530529
self.itable.getTrackStart(1), number)
531530
else:
532-
if trackResult.filename in self.skipped_tracks:
533-
logger.debug("track %d (%s) has been skipped; "
534-
"not adding to self.itable",
535-
number, trackResult.filename)
536-
else:
537-
self.itable.setFile(number, 1, trackResult.filename,
538-
self.itable.getTrackLength(number),
539-
number)
531+
self.itable.setFile(number, 1, trackResult.filename,
532+
self.itable.getTrackLength(number),
533+
number)
540534

541535
# check for hidden track one audio
542536
htoa = self.program.getHTOA()
@@ -571,6 +565,9 @@ def _ripIfNotRipped(number):
571565
logger.debug('writing m3u file for %r', discName)
572566
self.program.write_m3u(discName)
573567

568+
if len(self.skipped_tracks) > 0:
569+
self.program.skipped_tracks = self.skipped_tracks
570+
574571
try:
575572
self.program.verifyImage(self.runner, self.itable)
576573
except accurip.EntryNotFound:

whipper/common/accurip.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import struct
2323
import whipper
24+
import os
2425
from urllib.error import URLError, HTTPError
2526
from urllib.request import urlopen, Request
2627

@@ -111,7 +112,11 @@ def calculate_checksums(track_paths):
111112
logger.debug('checksumming %d tracks', track_count)
112113
# This is done sequentially because it is very fast.
113114
for i, path in enumerate(track_paths):
114-
v1_sum, v2_sum = accuraterip_checksum(path, i+1, track_count)
115+
if os.path.exists(path):
116+
v1_sum, v2_sum = accuraterip_checksum(path, i+1, track_count)
117+
else:
118+
logger.warning('Can\'t checksum %s; path doesn\'t exist', path)
119+
v1_sum, v2_sum = None, None
115120
if v1_sum is None:
116121
logger.error('could not calculate AccurateRip v1 checksum '
117122
'for track %d %r', i + 1, path)

whipper/common/program.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class Program:
5757
metadata = None
5858
outdir = None
5959
result = None
60+
skipped_tracks = None
6061

6162
def __init__(self, config, record=False):
6263
"""
@@ -612,7 +613,12 @@ def verifyImage(self, runner, table):
612613
"""
613614
cueImage = image.Image(self.cuePath)
614615
# assigns track lengths
615-
verifytask = image.ImageVerifyTask(cueImage)
616+
if self.skipped_tracks is not None:
617+
verifytask = image.ImageVerifyTask(cueImage,
618+
[os.path.basename(t.filename)
619+
for t in self.skipped_tracks])
620+
else:
621+
verifytask = image.ImageVerifyTask(cueImage)
616622
runner.run(verifytask)
617623
if verifytask.exception:
618624
logger.error(verifytask.exceptionMessage)
@@ -627,6 +633,7 @@ def verifyImage(self, runner, table):
627633
])
628634
if not (checksums and any(checksums['v1']) and any(checksums['v2'])):
629635
return False
636+
630637
return accurip.verify_result(self.result, responses, checksums)
631638

632639
def write_m3u(self, discname):
@@ -637,6 +644,8 @@ def write_m3u(self, discname):
637644
if not track.filename:
638645
# false positive htoa
639646
continue
647+
if track.skipped:
648+
continue
640649
if track.number == 0:
641650
length = (self.result.table.getTrackStart(1) /
642651
common.FRAMES_PER_SECOND)

whipper/image/image.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class ImageVerifyTask(task.MultiSeparateTask):
120120
description = "Checking tracks"
121121
lengths = None
122122

123-
def __init__(self, image):
123+
def __init__(self, image, skipped_tracks=[]):
124124
task.MultiSeparateTask.__init__(self)
125125

126126
self._image = image
@@ -147,7 +147,17 @@ def __init__(self, image):
147147
length = cue.getTrackLength(track)
148148

149149
if length == -1:
150-
path = image.getRealPath(index.path)
150+
try:
151+
path = image.getRealPath(index.path)
152+
except KeyError:
153+
logger.debug('Path not found; Checking '
154+
'if %s is a skipped track', index.path)
155+
if index.path in skipped_tracks:
156+
logger.warning('Missing file %s due to skipped track',
157+
index.path)
158+
continue
159+
else:
160+
raise
151161
assert isinstance(path, str), "%r is not str" % path
152162
logger.debug('schedule scan of audio length of %r', path)
153163
taskk = AudioLengthTask(path)

0 commit comments

Comments
 (0)