Fix trim bar handles not visible
Bug from screenshot: trim bar visible but red handles not showing. Causes: 1. video_duration in job is None for old jobs (was not saved on initial processing). Without it, fallback was endInit+60 which placed handles off-screen. 2. videoDuration was const, couldn't be updated when video metadata loads. 3. Handle offset was 9px but handles are now 24px wide (need 12px offset). Fixes: - Backend /api/transcript: fallback to last segment end time if video_duration missing in job - Frontend: videoDuration is let, updated on loadedmetadata - Handle offset 9px → 12px for 24px wide handles - Re-render trim after metadata loads to pick up actual video.duration
This commit is contained in:
parent
446769b68f
commit
a3550a444a
@ -1262,11 +1262,15 @@ async def get_transcript(job_id: str, user: str = Depends(check_auth)):
|
|||||||
analysis = json.loads(analysis_path.read_text())
|
analysis = json.loads(analysis_path.read_text())
|
||||||
transcript = analysis.get("transcript", {})
|
transcript = analysis.get("transcript", {})
|
||||||
clip_range = analysis.get("clip_range", {})
|
clip_range = analysis.get("clip_range", {})
|
||||||
|
# video_duration: probaj iz analysis, sicer iz zadnjega segmenta, sicer 0
|
||||||
|
video_dur = analysis.get("video_duration") or job.get("video_duration") or 0
|
||||||
|
if not video_dur and transcript.get("segments"):
|
||||||
|
video_dur = max((s.get("end", 0) for s in transcript["segments"]), default=0)
|
||||||
return {
|
return {
|
||||||
"segments": transcript.get("segments", []),
|
"segments": transcript.get("segments", []),
|
||||||
"language": transcript.get("language", "?"),
|
"language": transcript.get("language", "?"),
|
||||||
"clip_range": clip_range,
|
"clip_range": clip_range,
|
||||||
"video_duration": job.get("video_duration", 0),
|
"video_duration": video_dur,
|
||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(500, f"Napaka pri branju: {e}")
|
raise HTTPException(500, f"Napaka pri branju: {e}")
|
||||||
|
|||||||
@ -1011,7 +1011,7 @@
|
|||||||
|
|
||||||
const startInit = data.clip_range?.start || 0;
|
const startInit = data.clip_range?.start || 0;
|
||||||
const endInit = data.clip_range?.end || (startInit + 30);
|
const endInit = data.clip_range?.end || (startInit + 30);
|
||||||
const videoDuration = data.video_duration || endInit + 60;
|
let videoDuration = data.video_duration || endInit + 60;
|
||||||
const segments = data.segments || [];
|
const segments = data.segments || [];
|
||||||
|
|
||||||
const overlay = document.createElement("div");
|
const overlay = document.createElement("div");
|
||||||
@ -1127,8 +1127,9 @@
|
|||||||
const rPct = pctOf(trimEnd);
|
const rPct = pctOf(trimEnd);
|
||||||
trimRegion.style.left = lPct + '%';
|
trimRegion.style.left = lPct + '%';
|
||||||
trimRegion.style.right = (100 - rPct) + '%';
|
trimRegion.style.right = (100 - rPct) + '%';
|
||||||
handleL.style.left = `calc(${lPct}% - 9px)`;
|
// Handle 24px width → offset 12px
|
||||||
handleR.style.left = `calc(${rPct}% - 9px)`;
|
handleL.style.left = `calc(${lPct}% - 12px)`;
|
||||||
|
handleR.style.left = `calc(${rPct}% - 12px)`;
|
||||||
startVal.textContent = formatTime(trimStart);
|
startVal.textContent = formatTime(trimStart);
|
||||||
endVal.textContent = formatTime(trimEnd);
|
endVal.textContent = formatTime(trimEnd);
|
||||||
durVal.textContent = (trimEnd - trimStart).toFixed(1) + "s";
|
durVal.textContent = (trimEnd - trimStart).toFixed(1) + "s";
|
||||||
@ -1187,16 +1188,20 @@
|
|||||||
if (video) video.currentTime = t;
|
if (video) video.currentTime = t;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update playhead during playback
|
// Update playhead during playback + re-render če videoDuration manjkalo
|
||||||
if (video) {
|
if (video) {
|
||||||
video.addEventListener("timeupdate", renderPlayhead);
|
video.addEventListener("timeupdate", renderPlayhead);
|
||||||
video.addEventListener("loadedmetadata", () => {
|
video.addEventListener("loadedmetadata", () => {
|
||||||
// Če videoDuration ni bilo podanih, vzemi iz videa
|
// Če videoDuration ni bilo podanih iz API, vzemi iz video elementa
|
||||||
if (!data.video_duration && video.duration) {
|
if ((!videoDuration || videoDuration < 1) && video.duration) {
|
||||||
// Recalculate render
|
videoDuration = video.duration;
|
||||||
renderTrim();
|
|
||||||
renderPlayhead();
|
|
||||||
}
|
}
|
||||||
|
// Refresh end label
|
||||||
|
const endLabel = document.getElementById("trim-end-label");
|
||||||
|
if (endLabel) endLabel.textContent = formatTime(videoDuration);
|
||||||
|
// Re-render handles z pravilnim videoDuration
|
||||||
|
renderTrim();
|
||||||
|
renderPlayhead();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user