mirror of
https://github.com/osmarks/random-stuff
synced 2024-11-08 13:39:53 +00:00
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
|
#!/usr/bin/env python3
|
||
|
import subprocess
|
||
|
import tempfile
|
||
|
import os
|
||
|
import os.path
|
||
|
import collections
|
||
|
import json
|
||
|
import sys
|
||
|
|
||
|
ProcessedTrack = collections.namedtuple("ProcessedTrack", ["dfpwm_file", "artist", "track"])
|
||
|
|
||
|
def convert_wav_dfpwm(infile, outfile):
|
||
|
subprocess.run(["java", "-jar", "LionRay.jar", infile, outfile])
|
||
|
|
||
|
def convert_any_wav(infile, outfile):
|
||
|
subprocess.run(["ffmpeg", "-hide_banner", "-i", infile, "-ac", "1", outfile], stderr=subprocess.PIPE)
|
||
|
|
||
|
def process_file(filename):
|
||
|
parts = list(map(str.strip, os.path.splitext(os.path.basename(filename))[0].split("-")))
|
||
|
artist = parts[0]
|
||
|
track = parts[1]
|
||
|
wav_dest = tempfile.mktemp(".wav")
|
||
|
convert_any_wav(filename, wav_dest)
|
||
|
dfpwm_dest = tempfile.mktemp(".dfpwm")
|
||
|
convert_wav_dfpwm(wav_dest, dfpwm_dest)
|
||
|
os.remove(wav_dest)
|
||
|
return ProcessedTrack(dfpwm_dest, artist, track)
|
||
|
|
||
|
def read_binary(filename):
|
||
|
with open(filename, "rb") as f:
|
||
|
return f.read()
|
||
|
|
||
|
def process_dir(dirname):
|
||
|
tracks = []
|
||
|
for file in os.listdir(dirname):
|
||
|
tracks.append(process_file(os.path.join(dirname, file)))
|
||
|
tape_image = b""
|
||
|
tracks_meta = []
|
||
|
for track in tracks:
|
||
|
track_meta = {}
|
||
|
track_meta["start"] = len(tape_image) + 8193
|
||
|
data = read_binary(track.dfpwm_file)
|
||
|
os.remove(track.dfpwm_file)
|
||
|
track_meta["end"] = track_meta["start"] + len(data)
|
||
|
track_meta["artist"] = track.artist
|
||
|
track_meta["title"] = track.track
|
||
|
tape_image += data
|
||
|
tracks_meta.append(track_meta)
|
||
|
print(track.track, track.artist)
|
||
|
meta = json.dumps({ "tracks": tracks_meta }).encode("utf-8").ljust(8192, b"\0")
|
||
|
tape_image = meta + tape_image
|
||
|
with open("tape.bin", "wb") as f:
|
||
|
f.write(tape_image)
|
||
|
|
||
|
|
||
|
process_dir(sys.argv[1])
|