CD maybe mostly working?
This commit is contained in:
parent
532fc4ec23
commit
2860a1405c
71
src/cd.py
71
src/cd.py
|
@ -23,7 +23,7 @@ def read(device, status):
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
)
|
)
|
||||||
discid = p.stdout
|
discid = p.stdout.strip()
|
||||||
status["discid"] = discid
|
status["discid"] = discid
|
||||||
|
|
||||||
# Look it up in cddb
|
# Look it up in cddb
|
||||||
|
@ -47,13 +47,14 @@ def read(device, status):
|
||||||
now = time.strftime("%Y-%m-%dT%H%M%S")
|
now = time.strftime("%Y-%m-%dT%H%M%S")
|
||||||
num_tracks = int(discid.split()[1])
|
num_tracks = int(discid.split()[1])
|
||||||
status["title"] = "Unknown CD - %s" % now
|
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):
|
def rip(device, status, directory):
|
||||||
# cdparanoia reports completion in samples
|
# cdparanoia reports completion in samples
|
||||||
# use discid duration to figure out total number of samples
|
# use discid duration to figure out total number of samples
|
||||||
duration = int(status["discid"].split()[-1]) * SECOND # disc duration in seconds
|
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
|
total_samples = duration * (75 / SECOND) * 1176 # 75 sectors per second, 1176 samples per sector
|
||||||
|
status["total_samples"] = total_samples
|
||||||
|
|
||||||
track_num = 1
|
track_num = 1
|
||||||
for track_name in status["tracks"]:
|
for track_name in status["tracks"]:
|
||||||
|
@ -80,49 +81,73 @@ def rip(device, status, directory):
|
||||||
track_num += 1
|
track_num += 1
|
||||||
|
|
||||||
def encode(status, directory):
|
def encode(status, directory):
|
||||||
# Encode the tracks
|
|
||||||
track_num = 1
|
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"]:
|
for track_name in status["tracks"]:
|
||||||
|
logging.debug("Encoding track %d (%s)" % (track_num, track_name))
|
||||||
|
duration = durations[track_num-1]
|
||||||
argv = [
|
argv = [
|
||||||
"lame",
|
"lame",
|
||||||
|
"--brief",
|
||||||
|
"--nohist",
|
||||||
|
"--disptime", "1",
|
||||||
"--preset", "standard",
|
"--preset", "standard",
|
||||||
"-tl", status["title"],
|
"--tl", status["title"],
|
||||||
"--tn", "%d/%d" % (track_num, len(status["tracks"])),
|
"--tn", "%d/%d" % (track_num, len(status["tracks"])),
|
||||||
]
|
]
|
||||||
if status["artist"]:
|
if status.get("artist"):
|
||||||
argv.extend(["-ta", status["artist"]])
|
argv.extend(["--ta", status["artist"]])
|
||||||
if status["genre"]:
|
if status.get("genre"):
|
||||||
argv.extend(["-tg", status["genre"]])
|
argv.extend(["--tg", status["genre"]])
|
||||||
if status["year"]:
|
if status.get("year"):
|
||||||
argv.extend(["-ty", status["year"]])
|
argv.extend(["--ty", status["year"]])
|
||||||
if track_name:
|
if track_name:
|
||||||
argv.extend(["-tt", track_name])
|
argv.extend(["--tt", track_name])
|
||||||
outfn = "%d - %s.mp3" % (track_num, track_name)
|
outfn = "%02d - %s.mp3" % (track_num, track_name)
|
||||||
else:
|
else:
|
||||||
outfn = "%d.mp3" % track_num
|
outfn = "%02d.mp3" % track_num
|
||||||
argv.append("track%02d.cdda.wav" % track_num)
|
argv.append("track%02d.cdda.wav" % track_num)
|
||||||
argv.append(outfn)
|
argv.append(outfn)
|
||||||
p = subprocess.Popen(
|
p = subprocess.Popen(
|
||||||
argv,
|
argv,
|
||||||
cwd = directory,
|
cwd = directory,
|
||||||
stdin = subprocess.PIPE,
|
stderr = subprocess.PIPE,
|
||||||
encoding = "utf-8",
|
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
|
track_num += 1
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import pprint
|
import pprint
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
if len(sys.argv) > 1:
|
||||||
status = {}
|
directory = sys.argv[1]
|
||||||
read("/dev/sr0", status)
|
fn = os.path.join(directory, "status.json")
|
||||||
pprint.pprint(status)
|
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"])
|
directory = os.path.join(".", status["title"])
|
||||||
os.makedirs(directory, exist_ok=True)
|
os.makedirs(directory, exist_ok=True)
|
||||||
rip("/dev/sr0", status, directory)
|
rip("/dev/sr0", status, directory)
|
||||||
pprint.pprint(status)
|
pprint.pprint(status)
|
||||||
|
|
||||||
encode(status, directory)
|
encode(status, directory)
|
||||||
pprint.pprint(status)
|
pprint.pprint(status)
|
||||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue