From 2860a1405cccd857ce2fdde93c5ce319f4f112c0 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Thu, 25 Aug 2022 10:17:25 -0600 Subject: [PATCH] CD maybe mostly working? --- src/cd.py | 71 +++++++++++++++++++++++++++++++++++----------------- src/state.py | 25 ++++++++++++++++++ 2 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 src/state.py diff --git a/src/cd.py b/src/cd.py index d5f1ec5..5158f27 100644 --- a/src/cd.py +++ b/src/cd.py @@ -23,7 +23,7 @@ def read(device, status): encoding="utf-8", capture_output=True, ) - discid = p.stdout + discid = p.stdout.strip() status["discid"] = discid # Look it up in cddb @@ -47,13 +47,14 @@ def read(device, status): now = time.strftime("%Y-%m-%dT%H%M%S") num_tracks = int(discid.split()[1]) status["title"] = "Unknown CD - %s" % now - status["tracks"] = [""] * num_tracks + status["tracks"] = ["Track %02d" % i for i in range(num_tracks)] def rip(device, status, directory): # cdparanoia reports completion in samples # use discid duration to figure out total number of samples duration = int(status["discid"].split()[-1]) * SECOND # disc duration in seconds total_samples = duration * (75 / SECOND) * 1176 # 75 sectors per second, 1176 samples per sector + status["total_samples"] = total_samples track_num = 1 for track_name in status["tracks"]: @@ -80,49 +81,73 @@ def rip(device, status, directory): track_num += 1 def encode(status, directory): - # Encode the tracks track_num = 1 + durations = [int(d) for d in status["discid"].split()[2:-1]] + total_duration = sum(durations) + encoded_duration = 0 for track_name in status["tracks"]: + logging.debug("Encoding track %d (%s)" % (track_num, track_name)) + duration = durations[track_num-1] argv = [ "lame", + "--brief", + "--nohist", + "--disptime", "1", "--preset", "standard", - "-tl", status["title"], + "--tl", status["title"], "--tn", "%d/%d" % (track_num, len(status["tracks"])), ] - if status["artist"]: - argv.extend(["-ta", status["artist"]]) - if status["genre"]: - argv.extend(["-tg", status["genre"]]) - if status["year"]: - argv.extend(["-ty", status["year"]]) + if status.get("artist"): + argv.extend(["--ta", status["artist"]]) + if status.get("genre"): + argv.extend(["--tg", status["genre"]]) + if status.get("year"): + argv.extend(["--ty", status["year"]]) if track_name: - argv.extend(["-tt", track_name]) - outfn = "%d - %s.mp3" % (track_num, track_name) + argv.extend(["--tt", track_name]) + outfn = "%02d - %s.mp3" % (track_num, track_name) else: - outfn = "%d.mp3" % track_num + outfn = "%02d.mp3" % track_num argv.append("track%02d.cdda.wav" % track_num) argv.append(outfn) p = subprocess.Popen( argv, cwd = directory, - stdin = subprocess.PIPE, + stderr = subprocess.PIPE, encoding = "utf-8", ) - p.communicate(input=track_name) + for line in p.stderr: + line = line.strip() + if "%)" in line: + p = line.split("(")[1] + p = p.split("%")[0] + pct = int(p) / 100 + status["complete"] = (encoded_duration + (duration * pct)) / total_duration + print(status["complete"]) + + encoded_duration += duration track_num += 1 if __name__ == "__main__": import pprint + import sys + import json - logging.basicConfig(level=logging.DEBUG) - status = {} - read("/dev/sr0", status) - pprint.pprint(status) + if len(sys.argv) > 1: + directory = sys.argv[1] + fn = os.path.join(directory, "status.json") + f = open(fn) + status = json.load(f) + else: + logging.basicConfig(level=logging.DEBUG) + status = {} + read("/dev/sr0", status) + pprint.pprint(status) - directory = os.path.join(".", status["title"]) - os.makedirs(directory, exist_ok=True) - rip("/dev/sr0", status, directory) - pprint.pprint(status) + directory = os.path.join(".", status["title"]) + os.makedirs(directory, exist_ok=True) + rip("/dev/sr0", status, directory) + pprint.pprint(status) encode(status, directory) pprint.pprint(status) diff --git a/src/state.py b/src/state.py new file mode 100644 index 0000000..66b5b1a --- /dev/null +++ b/src/state.py @@ -0,0 +1,25 @@ +#! /usr/bin/python3 + +import json + +class State(dict): + def __init__(self, path): + super().__init__() + self.path = path + self.read() + + def read(self): + try: + f = open(self.path) + except FileNotFoundError: + return + obj = json.load(f) + f.close() + + for k in obj: + self[k] = obj[k] + + def write(self): + f = open(self.path, "w") + json.dump(self, f) + f.close()