fix video label

This commit is contained in:
zaiun xu
2026-04-10 10:30:01 +08:00
parent e1b514836e
commit 09736f9e15
20 changed files with 518 additions and 268 deletions

View File

@@ -8,10 +8,15 @@ from typing import Dict, Set
from loguru import logger
from app.db import add_watch_processed, load_watch_processed, save_measure_snapshot
from app.db import (
add_watch_processed,
load_watch_processed,
measure_snapshot_deliverable,
save_measure_snapshot,
)
from app.services import measure as measure_svc
from app.settings import Settings
from app.state import MeasureSnapshot, app_state
from app.state import app_state
from app.watch_idle import IdleWatchWarnState, idle_warn_interval_sec, maybe_warn_idle_watch
_MEASURE_IDLE_WARN_INTERVAL_SEC = idle_warn_interval_sec(
@@ -54,7 +59,13 @@ async def _run_measure_and_state(
app_state.measure_status = "running"
try:
snap = await asyncio.to_thread(measure_svc.run_full_measure, svo, settings)
save_measure_snapshot(settings, snap, source_path=key)
if measure_snapshot_deliverable(snap):
save_measure_snapshot(settings, snap, source_path=key)
else:
logger.warning(
"[measure-watch] no deliverable measure rows for {}, skip SQLite",
svo.name,
)
app_state.measure_status = "idle"
processed.add(key)
if settings.measure_watch_use_state_file:
@@ -62,20 +73,19 @@ async def _run_measure_and_state(
r0 = snap.result[0] if snap.result else {}
w = r0.get("weight", "")
logger.info("[measure-watch] done: {} weight={!r}", svo.name, w)
except (RuntimeError, FileNotFoundError) as e:
# FishMeasure 常见失败:无点云、缺 JSON 等,避免整段 traceback 刷屏
logger.warning("[measure-watch] measure failed for {}: {}", svo.name, e)
app_state.measure_status = "idle"
processed.add(key)
if settings.measure_watch_use_state_file:
add_watch_processed(settings, key, "measure")
except Exception as e:
save_measure_snapshot(
settings,
MeasureSnapshot(
result=[],
video_left="",
video_right="",
error=str(e),
),
source_path=key,
)
app_state.measure_status = "error"
logger.exception("[measure-watch] error on {}: {}", svo, e)
raise
app_state.measure_status = "idle"
processed.add(key)
if settings.measure_watch_use_state_file:
add_watch_processed(settings, key, "measure")
async def watch_tick(
@@ -109,12 +119,9 @@ async def watch_tick(
stability[key] = (size, cnt + 1)
_, cnt = stability[key]
if cnt >= settings.measure_watch_stable_polls:
try:
await _run_measure_and_state(svo, settings, processed, state_file)
stability.pop(key, None)
did = True
except Exception:
stability[key] = (size, 1)
await _run_measure_and_state(svo, settings, processed, state_file)
stability.pop(key, None)
did = True
for k in list(stability.keys()):
if k not in seen_keys:
del stability[k]