add chinese subtitles
This commit is contained in:
@@ -56,6 +56,7 @@ class VideoRepository:
|
||||
end_ms INTEGER NOT NULL,
|
||||
text TEXT,
|
||||
language TEXT,
|
||||
zh_text TEXT,
|
||||
reference_speech_duration_ms INTEGER,
|
||||
PRIMARY KEY (video_hash, sentence_index),
|
||||
FOREIGN KEY (video_hash) REFERENCES videos(video_hash) ON DELETE CASCADE
|
||||
@@ -193,6 +194,14 @@ class VideoRepository:
|
||||
if "remote_url" not in video_columns:
|
||||
connection.execute("ALTER TABLE videos ADD COLUMN remote_url TEXT")
|
||||
|
||||
with self._connect() as connection:
|
||||
sentence_columns = {
|
||||
row["name"]
|
||||
for row in connection.execute("PRAGMA table_info(sentences)")
|
||||
}
|
||||
if "zh_text" not in sentence_columns:
|
||||
connection.execute("ALTER TABLE sentences ADD COLUMN zh_text TEXT")
|
||||
|
||||
def upsert_upload(
|
||||
self,
|
||||
*,
|
||||
@@ -431,17 +440,7 @@ class VideoRepository:
|
||||
video_hash=video["video_hash"],
|
||||
duration_ms=video["duration_ms"],
|
||||
algorithm_version=video["algorithm_version"] or "unknown",
|
||||
sentences=[
|
||||
SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
for row in rows
|
||||
],
|
||||
sentences=[_sentence_from_row(row) for row in rows],
|
||||
)
|
||||
|
||||
def update_sentence_text(
|
||||
@@ -462,6 +461,10 @@ class VideoRepository:
|
||||
)
|
||||
if cursor.rowcount == 0:
|
||||
return None
|
||||
connection.execute(
|
||||
"UPDATE sentences SET zh_text = NULL WHERE video_hash = ?",
|
||||
(normalized_hash,),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE videos SET updated_at = ? WHERE video_hash = ?",
|
||||
(utc_now(), normalized_hash),
|
||||
@@ -470,14 +473,7 @@ class VideoRepository:
|
||||
"SELECT * FROM sentences WHERE video_hash = ? AND sentence_index = ?",
|
||||
(normalized_hash, sentence_index),
|
||||
).fetchone()
|
||||
return SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
return _sentence_from_row(row)
|
||||
|
||||
def get_sentence(
|
||||
self,
|
||||
@@ -495,14 +491,7 @@ class VideoRepository:
|
||||
).fetchone()
|
||||
if row is None:
|
||||
return None
|
||||
return SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
return _sentence_from_row(row)
|
||||
|
||||
def replace_sentence(
|
||||
self,
|
||||
@@ -614,6 +603,10 @@ class VideoRepository:
|
||||
replacement.reference_speech_duration_ms,
|
||||
),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE sentences SET zh_text = NULL WHERE video_hash = ?",
|
||||
(normalized_hash,),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE videos SET updated_at = ? WHERE video_hash = ?",
|
||||
(utc_now(), normalized_hash),
|
||||
@@ -627,17 +620,7 @@ class VideoRepository:
|
||||
(normalized_hash, sentence_index, sentence_index + len(rows)),
|
||||
).fetchall()
|
||||
|
||||
return [
|
||||
SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
for row in result_rows
|
||||
]
|
||||
return [_sentence_from_row(row) for row in result_rows]
|
||||
|
||||
|
||||
def merge_with_next_sentence(
|
||||
@@ -727,6 +710,10 @@ class VideoRepository:
|
||||
(old_index - 1, normalized_hash, old_index),
|
||||
)
|
||||
|
||||
connection.execute(
|
||||
"UPDATE sentences SET zh_text = NULL WHERE video_hash = ?",
|
||||
(normalized_hash,),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE videos SET updated_at = ? WHERE video_hash = ?",
|
||||
(utc_now(), normalized_hash),
|
||||
@@ -739,14 +726,7 @@ class VideoRepository:
|
||||
(normalized_hash, sentence_index),
|
||||
).fetchone()
|
||||
|
||||
return SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
return _sentence_from_row(row)
|
||||
|
||||
def adjust_sentence_boundary(
|
||||
self,
|
||||
@@ -851,17 +831,36 @@ class VideoRepository:
|
||||
(normalized_hash, *updated_indexes),
|
||||
).fetchall()
|
||||
|
||||
return [
|
||||
SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
return [_sentence_from_row(row) for row in result_rows]
|
||||
|
||||
def clear_sentence_translations(self, video_hash: str) -> None:
|
||||
with self._connect() as connection:
|
||||
connection.execute(
|
||||
"UPDATE sentences SET zh_text = NULL WHERE video_hash = ?",
|
||||
(normalize_video_hash(video_hash),),
|
||||
)
|
||||
for row in result_rows
|
||||
]
|
||||
|
||||
def save_sentence_translations(
|
||||
self,
|
||||
video_hash: str,
|
||||
translations: Dict[int, str],
|
||||
) -> Optional[SentenceBoundaryDocument]:
|
||||
normalized_hash = normalize_video_hash(video_hash)
|
||||
with self._connect() as connection:
|
||||
for index, zh_text in translations.items():
|
||||
connection.execute(
|
||||
"""
|
||||
UPDATE sentences
|
||||
SET zh_text = ?
|
||||
WHERE video_hash = ? AND sentence_index = ?
|
||||
""",
|
||||
(zh_text.strip(), normalized_hash, index),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE videos SET updated_at = ? WHERE video_hash = ?",
|
||||
(utc_now(), normalized_hash),
|
||||
)
|
||||
return self.get_document(normalized_hash)
|
||||
|
||||
def create_dub_share(
|
||||
self,
|
||||
@@ -1278,6 +1277,21 @@ class VideoRepository:
|
||||
return video
|
||||
|
||||
|
||||
|
||||
def _sentence_from_row(row: sqlite3.Row) -> SentenceBoundary:
|
||||
keys = set(row.keys())
|
||||
zh_text = row["zh_text"] if "zh_text" in keys else None
|
||||
return SentenceBoundary(
|
||||
index=row["sentence_index"],
|
||||
start_ms=row["start_ms"],
|
||||
end_ms=row["end_ms"],
|
||||
text=row["text"],
|
||||
language=row["language"],
|
||||
zh_text=zh_text,
|
||||
reference_speech_duration_ms=row["reference_speech_duration_ms"],
|
||||
)
|
||||
|
||||
|
||||
def _join_adjacent_sentence_text(
|
||||
left: str,
|
||||
right: str,
|
||||
|
||||
Reference in New Issue
Block a user