add Moss result to db
This commit is contained in:
@@ -120,6 +120,20 @@ class VideoRepository:
|
||||
FOREIGN KEY (share_id) REFERENCES dub_shares(share_id) ON DELETE CASCADE,
|
||||
UNIQUE (share_id, sentence_index)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS moss_segments (
|
||||
video_hash TEXT NOT NULL,
|
||||
segment_index INTEGER NOT NULL,
|
||||
start_seconds REAL NOT NULL,
|
||||
end_seconds REAL NOT NULL,
|
||||
start_ms INTEGER NOT NULL,
|
||||
end_ms INTEGER NOT NULL,
|
||||
text TEXT NOT NULL,
|
||||
speaker TEXT,
|
||||
words_json TEXT,
|
||||
PRIMARY KEY (video_hash, segment_index),
|
||||
FOREIGN KEY (video_hash) REFERENCES videos(video_hash) ON DELETE CASCADE
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@@ -247,12 +261,17 @@ class VideoRepository:
|
||||
document: SentenceBoundaryDocument,
|
||||
transcription: Optional[str],
|
||||
ready: bool = True,
|
||||
moss_segments: Optional[List[Dict[str, Any]]] = None,
|
||||
) -> None:
|
||||
with self._connect() as connection:
|
||||
connection.execute(
|
||||
"DELETE FROM sentences WHERE video_hash = ?",
|
||||
(document.video_hash,),
|
||||
)
|
||||
connection.execute(
|
||||
"DELETE FROM moss_segments WHERE video_hash = ?",
|
||||
(document.video_hash,),
|
||||
)
|
||||
connection.executemany(
|
||||
"""
|
||||
INSERT INTO sentences (
|
||||
@@ -288,6 +307,19 @@ class VideoRepository:
|
||||
document.video_hash,
|
||||
),
|
||||
)
|
||||
if moss_segments:
|
||||
connection.executemany(
|
||||
"""
|
||||
INSERT INTO moss_segments (
|
||||
video_hash, segment_index, start_seconds, end_seconds,
|
||||
start_ms, end_ms, text, speaker, words_json
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
[
|
||||
_moss_segment_row(document.video_hash, index, segment)
|
||||
for index, segment in enumerate(moss_segments)
|
||||
],
|
||||
)
|
||||
|
||||
def mark_oss_uploaded(self, video_hash: str, remote_url: str) -> None:
|
||||
with self._connect() as connection:
|
||||
@@ -327,6 +359,32 @@ class VideoRepository:
|
||||
).fetchone()
|
||||
return dict(row) if row else None
|
||||
|
||||
def get_moss_segments(self, video_hash: str) -> List[Dict[str, Any]]:
|
||||
with self._connect() as connection:
|
||||
rows = connection.execute(
|
||||
"""
|
||||
SELECT * FROM moss_segments
|
||||
WHERE video_hash = ?
|
||||
ORDER BY segment_index
|
||||
""",
|
||||
(normalize_video_hash(video_hash),),
|
||||
).fetchall()
|
||||
segments = []
|
||||
for row in rows:
|
||||
item = dict(row)
|
||||
raw_words = item.pop("words_json", None)
|
||||
words = None
|
||||
if raw_words:
|
||||
try:
|
||||
parsed = json.loads(raw_words)
|
||||
except json.JSONDecodeError:
|
||||
parsed = None
|
||||
if isinstance(parsed, list):
|
||||
words = parsed
|
||||
item["words"] = words
|
||||
segments.append(item)
|
||||
return segments
|
||||
|
||||
def get_document(self, video_hash: str) -> Optional[SentenceBoundaryDocument]:
|
||||
video = self.get_video(video_hash)
|
||||
if video is None or video["duration_ms"] is None:
|
||||
@@ -1221,3 +1279,22 @@ def _is_cjk_char(char: str) -> bool:
|
||||
or 0xF900 <= code <= 0xFAFF
|
||||
or 0x20000 <= code <= 0x2CEAF
|
||||
)
|
||||
|
||||
|
||||
def _moss_segment_row(video_hash: str, index: int, segment: Dict[str, Any]) -> tuple:
|
||||
start_seconds = float(segment["start_seconds"])
|
||||
end_seconds = float(segment["end_seconds"])
|
||||
words = segment.get("words")
|
||||
words_json = json.dumps(words, ensure_ascii=False) if words else None
|
||||
speaker = segment.get("speaker")
|
||||
return (
|
||||
video_hash,
|
||||
index,
|
||||
start_seconds,
|
||||
end_seconds,
|
||||
int(round(start_seconds * 1000)),
|
||||
int(round(end_seconds * 1000)),
|
||||
str(segment.get("text") or "").strip(),
|
||||
str(speaker) if speaker is not None else None,
|
||||
words_json,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user