Simon Bruder
21ffb24003
This also switches from the hacky vendor.sh script to managing the dependencies with nix.
64 lines
1.4 KiB
Python
64 lines
1.4 KiB
Python
from subprocess import run
|
|
import csv
|
|
import json
|
|
import time
|
|
|
|
ACRONYM = "sch"
|
|
|
|
FORMATS = {
|
|
"opus": ["-b:a", "48k"],
|
|
"m4a": [
|
|
"-b:a",
|
|
"48k",
|
|
"-f",
|
|
"ipod",
|
|
"-profile:a",
|
|
"aac_he",
|
|
"-disposition:v:0",
|
|
"attached_pic",
|
|
],
|
|
"oga": ["-b:a", "64k", "-c:a", "libvorbis"],
|
|
"mp3": ["-b:a", "72k", "-map", "0:0", "-map", "1:0"],
|
|
}
|
|
|
|
|
|
def path_to_episode(name, format):
|
|
if format in ["original", "txt", "md"]:
|
|
base = "content"
|
|
else:
|
|
base = "static/episodes"
|
|
|
|
if format == "original":
|
|
format = "opus"
|
|
|
|
return f"{base}/{name}.{format}"
|
|
|
|
|
|
def get_chapters(episode):
|
|
with open(path_to_episode(episode, "txt")) as f:
|
|
chapter_reader = csv.reader(f, delimiter="\t")
|
|
for chapter in chapter_reader:
|
|
yield {"start": float(chapter[0]), "title": chapter[2]}
|
|
|
|
|
|
def get_episode_info(name, format):
|
|
path = path_to_episode(name, format)
|
|
return json.loads(
|
|
run(
|
|
[
|
|
"ffprobe",
|
|
"-loglevel",
|
|
"error",
|
|
"-show_format",
|
|
"-print_format",
|
|
"json",
|
|
path,
|
|
],
|
|
capture_output=True,
|
|
).stdout
|
|
)["format"]
|
|
|
|
|
|
def sexagesimal(ts):
|
|
return time.strftime("%H:%M:%S", time.gmtime(ts)) + str(round(ts % 1, 3))[1:]
|