scripts/ass2mks.py
Simon Bruder ecd7808dd1
Make scripts suitable for running on NixOS
Older scripts (that now have no real purpose) or ones that require
packages that are not in nixpkgs are not updated. They should either be
removed or fixed at a later date.
2020-08-25 23:52:58 +02:00

117 lines
3 KiB
Python
Executable file

#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3 ffmpeg-full
from subprocess import run
import mimetypes
import os.path
import re
import sys
def lavfi_escape(parameter):
return (
parameter.replace("'", "\\'")
.replace(":", "\:")
.replace("\\'", "\\\\\\'")
.replace("[", "\[")
.replace("]", "\]")
.replace(",", "\,")
)
infile = sys.argv[1]
try:
timeout = sys.argv[2]
except IndexError:
timeout = 1800
# the system default font
# if the font name does not include this but the resulting fqn does, it is treated as missing
default_font = "Roboto"
res = run(
[
"ffmpeg",
"-hide_banner",
"-t",
str(timeout),
"-f",
"lavfi",
"-i",
"nullsrc=16x16",
"-filter:v",
f"subtitles={lavfi_escape(infile)}",
"-f",
"null",
"-",
],
capture_output=True,
)
if res.returncode != 0:
print("ffmpeg failed")
print(f"stdout: {res.stdout.decode('utf-8')}")
print(f"stderr: {res.stderr.decode('utf-8')}")
sys.exit(1)
if res.stdout != b"":
print(f"Got Stdout: {res.stdout.decode('utf-8')}")
substitutions = []
fonts = []
for line in res.stderr.decode("utf-8").splitlines():
substitution = re.match(
"^\[Parsed_subtitles_0 @ 0x[0-9a-f]{12}\] Glyph .* not found, selecting one more font for \((.*), ([0-9]{1,3}), ([0-9]{1,3})\)",
line,
)
fontselect = re.match(
"^\[Parsed_subtitles_0 @ 0x[0-9a-f]{12}\] fontselect: \((.*), ([0-9]{1,3}), ([0-9]{1,3})\) -> (.*), ([0-9]*), (.*)",
line,
)
if substitution is not None:
substitutions.append(
(
substitution.group(1),
int(substitution.group(2)),
int(substitution.group(3)),
)
)
if fontselect is not None:
font = {
"name": fontselect.group(1),
"weight": int(fontselect.group(2)),
"italic": int(fontselect.group(3)),
"path": fontselect.group(4),
#'?': fontselect.group(5),
"fqn": fontselect.group(6),
}
if font["name"] == "":
continue
if (font["name"], font["weight"], font["italic"]) in substitutions:
print(
f"Font {font['name']} lacks glyph support which lead to the substitution by {font['fqn']}, not including substitution font"
)
continue
if default_font in font["fqn"] and not default_font in font["name"]:
print(
f"Font {font['name']} could not be found (based on {font['fqn']} looking like the default font)"
)
sys.exit(1)
fonts.append(font)
command = ["mkvmerge", "-q", "-o", f"{os.path.splitext(infile)[0]}.mks", infile]
for font in fonts:
command.extend(
[
"--attachment-mime-type",
mimetypes.guess_type(font["path"])[0],
"--attach-file",
font["path"],
]
)
run(command, check=True)