Files
mfe9/pyvidplayer2/subtitles.py
Rich e446f9cce4 .
2023-12-07 15:22:21 +00:00

69 lines
2.2 KiB
Python

import pygame
import pysubs2
class Subtitles:
def __init__(self, path: str, colour="white", highlight=(0, 0, 0, 128), font=pygame.font.SysFont("arial", 30), encoding="utf-8", offset=50) -> None:
self.path = path
self.encoding = encoding
self._subs = iter(pysubs2.load(path, encoding=encoding))
self.start = 0
self.end = 0
self.text = ""
self.surf = pygame.Surface((0, 0))
self.offset = offset
self.colour = colour
self.highlight = highlight
self.font = font
def __str__(self) -> str:
return f"<Subtitles(path={self.path})>"
def _to_surf(self, text: str) -> pygame.Surface:
h = self.font.render(" ", True, "black").get_height()
lines = text.strip().split("\n")
surfs = [self.font.render(line, True, self.colour) for line in lines]
surface = pygame.Surface((max([s.get_width() for s in surfs]), len(surfs) * h), pygame.SRCALPHA)
surface.fill(self.highlight)
for i, surf in enumerate(surfs):
surface.blit(surf, (surface.get_width() / 2 - surf.get_width() / 2, i * h))
return surface
def _get_next(self) -> bool:
try:
s = next(self._subs)
except StopIteration:
self.start = 0
self.end = 0
self.text = ""
self.surf = pygame.Surface((0, 0))
return False
else:
self.start = s.start / 1000
self.end = s.end / 1000
self.text = s.plaintext
self.surf = self._to_surf(self.text)
return True
def _seek(self, time: float) -> None:
self._subs = iter(pysubs2.load(self.path, encoding=self.encoding))
while not (self.start <= time <= self.end):
if not self._get_next():
break
def _write_subs(self, surf: pygame.Surface) -> None:
surf.blit(self.surf, (surf.get_width() / 2 - self.surf.get_width() / 2, surf.get_height() - self.surf.get_height() - self.offset))
def set_font(self, font: pygame.font.SysFont) -> None:
self.font = font
def get_font(self) -> pygame.font.SysFont:
return self.font