add merging sentences action

This commit is contained in:
2026-09-04 09:09:34 +08:00
parent a38679d4a0
commit ff1341e191
6 changed files with 287 additions and 4 deletions

View File

@@ -277,6 +277,102 @@ def test_admin_can_split_sentence_and_reindexes_following_sentences(tmp_path):
assert [item.index for item in document.sentences] == [0, 1, 2, 3]
def test_admin_can_merge_adjacent_sentences_and_reindexes_following_sentences(tmp_path):
settings = replace(Settings.from_env(), data_dir=tmp_path / "data")
settings.ensure_directories()
repository = VideoRepository(settings.database_path)
repository.upsert_upload(
video_hash=VIDEO_HASH,
title="Manual merge lesson",
filename="lesson.mp4",
stored_filename=f"{VIDEO_HASH}.mp4",
content_type="video/mp4",
size_bytes=5,
language="en",
)
repository.save_processing_result(
SentenceBoundaryDocument(
video_hash=VIDEO_HASH,
duration_ms=12000,
algorithm_version="test",
sentences=[
SentenceBoundary(
index=0,
start_ms=0,
end_ms=2000,
text="Before.",
language="en",
reference_speech_duration_ms=1800,
),
SentenceBoundary(
index=1,
start_ms=2000,
end_ms=5000,
text="First part",
language="en",
reference_speech_duration_ms=2800,
),
SentenceBoundary(
index=2,
start_ms=5000,
end_ms=9000,
text="second part",
language="en",
reference_speech_duration_ms=3600,
),
SentenceBoundary(
index=3,
start_ms=9000,
end_ms=12000,
text="Next sentence.",
language="en",
reference_speech_duration_ms=2800,
),
],
),
None,
)
class UnavailableTranscriber:
available = False
client = TestClient(
create_app(
BoundaryStore(tmp_path / "boundaries.json"),
settings=settings,
repository=repository,
transcriber=UnavailableTranscriber(),
)
)
response = client.put(
f"/api/v1/admin/videos/{VIDEO_HASH}/sentences/1/merge",
)
assert response.status_code == 200
merged = response.json()
assert merged["index"] == 1
assert merged["text"] == "First part second part"
assert merged["start_ms"] == 2000
assert merged["end_ms"] == 9000
assert merged["reference_speech_duration_ms"] == 6400
document = repository.get_document(VIDEO_HASH)
assert [item.text for item in document.sentences] == [
"Before.",
"First part second part",
"Next sentence.",
]
assert [item.index for item in document.sentences] == [0, 1, 2]
assert [item.start_ms for item in document.sentences] == [0, 2000, 9000]
assert [item.end_ms for item in document.sentences] == [2000, 9000, 12000]
last_response = client.put(
f"/api/v1/admin/videos/{VIDEO_HASH}/sentences/2/merge",
)
assert last_response.status_code == 400
assert last_response.json()["detail"] == "No next sentence to merge with."
def test_admin_boundary_adjustment_updates_linked_next_start(tmp_path):
settings = replace(Settings.from_env(), data_dir=tmp_path / "data")
settings.ensure_directories()