Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions pycaption/srt.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
BaseReader, BaseWriter, Caption, CaptionList, CaptionNode, CaptionSet,
merge_caption_list,
)
from .exceptions import CaptionReadNoCaptions
from .exceptions import CaptionReadNoCaptions, CaptionReadSyntaxError
from .geometry import HorizontalAlignmentEnum


Expand All @@ -21,6 +21,8 @@ def detect(self, content):
"""
content = self._decode_content(content)
lines = content.splitlines()
if len(lines) < 2:
return False
if lines[0].isdigit() and "-->" in lines[1]:
return True
else:
Expand Down Expand Up @@ -48,8 +50,17 @@ def read(self, content, lang="en-US"):
end_line = self._find_text_line(start_line, lines)

timing = lines[start_line + 1].split("-->")
start = self._srttomicro(timing[0].strip(" \r\n"))
end = self._srttomicro(timing[1].strip(" \r\n"))
if len(timing) != 2:
raise CaptionReadSyntaxError(
f"Invalid timing line: {lines[start_line + 1]!r}"
)
try:
start = self._srttomicro(timing[0].strip(" \r\n"))
end = self._srttomicro(timing[1].strip(" \r\n"))
except (IndexError, ValueError):
raise CaptionReadSyntaxError(
f"Invalid timestamp in: {lines[start_line + 1]!r}"
)

nodes = []

Expand Down
17 changes: 17 additions & 0 deletions tests/test_srt.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import pytest

from pycaption import CaptionReadNoCaptions, SRTReader
from pycaption.exceptions import CaptionReadSyntaxError
from tests.mixins import ReaderTestingMixIn


Expand Down Expand Up @@ -51,6 +52,22 @@ def test_empty_file(self, sample_srt_empty):
self.reader.read(sample_srt_empty)
assert exc_info.value.args[0] == "empty caption file"

def test_detection_of_single_line_content(self):
# Content with fewer than two lines used to raise IndexError from
# lines[1]; detection should just return False.
assert self.reader.detect("1") is False
assert self.reader.detect("") is False

def test_malformed_timing_raises_read_error(self):
# A timing line missing or with an unparsable timestamp used to raise a
# bare IndexError/ValueError; it should be a CaptionReadSyntaxError.
for content in (
"1\n00:00:01,000 -->\nHi",
"1\n00:00:01,000 --> xx:yy\nHi",
):
with pytest.raises(CaptionReadSyntaxError):
self.reader.read(content)

def test_extra_empty_line(self, sample_srt_blank_lines):
captions = self.reader.read(sample_srt_blank_lines)
paragraphs = captions.get_captions("en-US")
Expand Down