Storyboard: offer to show the person speaking instead of a voice over the listener

This commit is contained in:
gator 2026-09-20 17:32:09 +00:00
parent 9d9d1e3fdc
commit 8a30838e29

View file

@ -341,6 +341,26 @@
// A CHAPTER IS FILMED IN PARTS of about 25 shots that share one cast and the
// same rooms. This says where each part has got to, and joins them.
// A VOICE OVER SOMEBODY LISTENING. In a phone call the audience wants to see
// whoever is talking. One press re-frames those shots onto the speaker.
function heardNotSeen() {
return (PKG.shots || []).filter(function (sh) {
var l = (sh.audio || []).filter(function (a) { return String(a.text || "").trim(); });
return l.length === 1 && !l[0].lip_sync && l[0].character_id
&& String(l[0].character_id) !== String(PKG.narrator || "")
&& String(l[0].text).trim().split(/\s+/).length > 3;
});
}
function speakerNoticeHtml(draft) {
var st = PKG.show_speaker || {};
if (st.state === "working") return '<div class="guide" style="margin-bottom:12px"><p class="cont">Re-framing those shots onto the person speaking&hellip; this takes a minute or two.</p></div>';
var n = heardNotSeen();
if (!n.length) return "";
return '<div class="guide" style="margin-bottom:12px"><h4>' + n.length + (n.length === 1 ? ' shot plays' : ' shots play') + ' a voice over somebody listening</h4>'
+ '<p class="cont">Shots ' + n.map(function (x) { return esc(x.id); }).join(", ") + '. In a conversation people expect to see whoever is talking. This rewrites those pictures to show the speaker, in the place where they are. Every word stays as it is. The pictures will need drawing again.</p>'
+ '<button type="button" class="btn primary" data-showspeakers="' + esc(draft.id) + '">Show the person speaking instead</button></div>';
}
function partsHtml(draft) {
var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); });
var n = (PKG.shots || []).length;
@ -957,7 +977,7 @@
DRAFTNOW = draft;
return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '<div class="bar">' + barHtml(meta) + '</div>'
+ '<div id="reelhost">' + reelHtml() + '</div>'
+ spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body;
+ spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + speakerNoticeHtml(draft) + castHtml + propsHtml() + body;
}
// THINGS THAT MUST STAY THE SAME. A face is held steady by a reference
@ -1600,6 +1620,11 @@
}
return;
}
if ((el = hit("data-showspeakers"))) {
r = await act("show_speakers", { draft_id: el.getAttribute("data-showspeakers") });
if (r) { showMsg("msg", "Re-framing " + (r.shots || []).length + " shots onto the person speaking. The words do not change.", "ok"); await refresh(); }
return;
}
if ((el = hit("data-splitparts"))) {
el.disabled = true;
r = await act("split_parts", { run_id: runId, draft_id: el.getAttribute("data-splitparts") });