feat(dl): Try find SSAv4 fonts in System OS fonts folder

Currently only Windows is supported. Feel free to make a pull request to add Linux or mac OS support.
This commit is contained in:
rlaphoenix 2024-03-25 06:47:20 +00:00
parent eeab8a4f39
commit 45ccc129ce
2 changed files with 32 additions and 1 deletions

View File

@ -50,7 +50,7 @@ from devine.core.titles import Movie, Song, Title_T
from devine.core.titles.episode import Episode from devine.core.titles.episode import Episode
from devine.core.tracks import Audio, Subtitle, Tracks, Video from devine.core.tracks import Audio, Subtitle, Tracks, Video
from devine.core.tracks.attachment import Attachment from devine.core.tracks.attachment import Attachment
from devine.core.utilities import get_binary_path, is_close_match, time_elapsed_since from devine.core.utilities import get_binary_path, get_system_fonts, is_close_match, time_elapsed_since
from devine.core.utils.click_types import LANGUAGE_RANGE, QUALITY_LIST, SEASON_RANGE, ContextData, MultipleChoice from devine.core.utils.click_types import LANGUAGE_RANGE, QUALITY_LIST, SEASON_RANGE, ContextData, MultipleChoice
from devine.core.utils.collections import merge_dict from devine.core.utils.collections import merge_dict
from devine.core.utils.subprocess import ffprobe from devine.core.utils.subprocess import ffprobe
@ -607,13 +607,23 @@ class dl:
font_names.append(line.removesuffix("Style: ").split(",")[1]) font_names.append(line.removesuffix("Style: ").split(",")[1])
font_count = 0 font_count = 0
system_fonts = get_system_fonts()
for font_name in set(font_names): for font_name in set(font_names):
family_dir = Path(config.directories.fonts, font_name) family_dir = Path(config.directories.fonts, font_name)
fonts_from_system = [
file
for name, file in system_fonts.items()
if name.startswith(font_name)
]
if family_dir.exists(): if family_dir.exists():
fonts = family_dir.glob("*.*tf") fonts = family_dir.glob("*.*tf")
for font in fonts: for font in fonts:
title.tracks.add(Attachment(font, f"{font_name} ({font.stem})")) title.tracks.add(Attachment(font, f"{font_name} ({font.stem})"))
font_count += 1 font_count += 1
elif fonts_from_system:
for font in fonts_from_system:
title.tracks.add(Attachment(font, f"{font_name} ({font.stem})"))
font_count += 1
else: else:
self.log.warning(f"Subtitle uses font [text2]{font_name}[/] but it could not be found...") self.log.warning(f"Subtitle uses font [text2]{font_name}[/] but it could not be found...")

View File

@ -277,6 +277,27 @@ def get_extension(value: Union[str, Path, ParseResult]) -> Optional[str]:
return ext return ext
def get_system_fonts() -> dict[str, Path]:
if sys.platform == "win32":
import winreg
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as reg:
key = winreg.OpenKey(
reg,
r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts",
0,
winreg.KEY_READ
)
total_fonts = winreg.QueryInfoKey(key)[1]
return {
name.replace(" (TrueType)", ""): Path(r"C:\Windows\Fonts", filename)
for n in range(0, total_fonts)
for name, filename, _ in [winreg.EnumValue(key, n)]
}
else:
# TODO: Get System Fonts for Linux and mac OS
return {}
class FPS(ast.NodeVisitor): class FPS(ast.NodeVisitor):
def visit_BinOp(self, node: ast.BinOp) -> float: def visit_BinOp(self, node: ast.BinOp) -> float:
if isinstance(node.op, ast.Div): if isinstance(node.op, ast.Div):