Add ass2mks
This commit is contained in:
parent
958b092ca4
commit
cf5df35d97
115
ass2mks.py
Executable file
115
ass2mks.py
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
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)
|
Loading…
Reference in a new issue