1
0
Fork 0

Try to get title from file metadata

This commit is contained in:
Casey 2023-10-17 18:26:18 +03:00
parent 5fc6b26428
commit 5b261e82c2
Signed by: hkc
GPG Key ID: F0F6CFE11CDB0960
2 changed files with 12 additions and 3 deletions

View File

@ -24,6 +24,7 @@ local function bytes2time(b)
return string.format("%dm, %ds", math.floor(s / 60), s % 60) return string.format("%dm, %ds", math.floor(s / 60), s % 60)
end end
term.clear()
local screen_w, screen_h = term.getSize() local screen_w, screen_h = term.getSize()
parallel.waitForAll( parallel.waitForAll(
@ -56,6 +57,7 @@ function()
drive.play() drive.play()
end end
elseif ev == "term_resize" then elseif ev == "term_resize" then
term.clear()
screen_w, screen_h = term.getSize() screen_w, screen_h = term.getSize()
elseif ev == "tape_present" then elseif ev == "tape_present" then
table_of_contents = {} table_of_contents = {}

View File

@ -7,9 +7,11 @@ from sys import argv
from pathlib import Path from pathlib import Path
from os.path import splitext from os.path import splitext
from math import ceil from math import ceil
from re import search
DFPWM_ENCODER_EXECUTABLE = "aucmp" DFPWM_ENCODER_EXECUTABLE = "aucmp"
FFMPEG_EXECUTABLE = "ffmpeg" FFMPEG_EXECUTABLE = "ffmpeg"
FFPROBE_EXECUTABLE = "ffprobe"
DFPWM_SAMPLE_RATE = 6000 DFPWM_SAMPLE_RATE = 6000
@ -22,6 +24,7 @@ with TemporaryDirectory(prefix="tapedrive") as tmpdir_str:
tmpdir = Path(tmpdir_str) tmpdir = Path(tmpdir_str)
filelist: list[Path] = [] filelist: list[Path] = []
titles: list[bytes] = []
for i, name in enumerate(input_folder.rglob("*.mp3")): for i, name in enumerate(input_folder.rglob("*.mp3")):
if i >= 48: if i >= 48:
print(f"more than 48 tracks, skipping {name}") print(f"more than 48 tracks, skipping {name}")
@ -29,16 +32,20 @@ with TemporaryDirectory(prefix="tapedrive") as tmpdir_str:
encoded_file = tmpdir / (splitext(name.name)[0] + ".dfpwm") encoded_file = tmpdir / (splitext(name.name)[0] + ".dfpwm")
filelist.append(encoded_file) filelist.append(encoded_file)
with encoded_file.open("wb") as fout: with encoded_file.open("wb") as fout:
with Popen([ FFPROBE_EXECUTABLE, name ], stderr=PIPE) as ffprobe:
metadata: str = ffprobe.stderr.read().decode() # type: ignore
if (match := search(r"title\s+: (.*)", metadata)):
titles.append(match.groups()[0].encode("ascii", errors="ignore"))
else:
titles.append(splitext(name.name)[0].encode("ascii", errors="ignore"))
with Popen([ DFPWM_ENCODER_EXECUTABLE ], stdout=fout, stdin=PIPE) as dfpwm: with Popen([ DFPWM_ENCODER_EXECUTABLE ], stdout=fout, stdin=PIPE) as dfpwm:
with Popen([ FFMPEG_EXECUTABLE, "-i", name, "-f", "s8", "-ac", "1", with Popen([ FFMPEG_EXECUTABLE, "-i", name, "-f", "s8", "-ac", "1",
"-ar", "48k", "-" ], stdout=dfpwm.stdin) as ffmpeg: "-ar", "48k", "-" ], stdout=dfpwm.stdin) as ffmpeg:
ffmpeg.wait() ffmpeg.wait()
offset: int = 6000 offset: int = 6000
titles: list[bytes] = []
positions: list[tuple[int, int]] = [] positions: list[tuple[int, int]] = []
for file in filelist: for file in filelist:
titles.append(file.name.removesuffix(".dfpwm").encode("ascii", errors="replace"))
size = ceil(file.stat().st_size / DFPWM_SAMPLE_RATE) * DFPWM_SAMPLE_RATE size = ceil(file.stat().st_size / DFPWM_SAMPLE_RATE) * DFPWM_SAMPLE_RATE
positions.append((offset, size)) positions.append((offset, size))
offset += size offset += size
@ -50,7 +57,7 @@ with TemporaryDirectory(prefix="tapedrive") as tmpdir_str:
name = (titles[i] if i < len(titles) else b"")[:117] name = (titles[i] if i < len(titles) else b"")[:117]
pos = positions[i] if i < len(titles) else (0, 0) pos = positions[i] if i < len(titles) else (0, 0)
if i < len(titles): if i < len(titles):
print(f"{i:2d} {pos[0]} + {pos[1]}") print(f"{i:2d} {pos[0]} + {pos[1]} {name}")
written_bytes += fout.write(pos[0].to_bytes(4, "big")) written_bytes += fout.write(pos[0].to_bytes(4, "big"))
written_bytes += fout.write(pos[1].to_bytes(4, "big")) written_bytes += fout.write(pos[1].to_bytes(4, "big"))
written_bytes += fout.write(name) written_bytes += fout.write(name)