diff --git a/admin.html b/admin.html
index 8b9265a..d3c7055 100644
--- a/admin.html
+++ b/admin.html
@@ -68,6 +68,11 @@ function shotHtml(s) {
+ '
' + esc(s.line || "") + '
'
+ '' + s.words + ' words'
+ (over ? ' (over 18)' : '') + ' · camera: ' + esc(s.camera || "—") + '
'
+ // A redub that failed falls back to Veo's own audio on purpose. That is
+ // the right behaviour, but it must not be silent.
+ + 'voice: ' + (s.voice_used
+ ? esc(s.voice_used) + ' (redubbed)'
+ : 'Veo original, not redubbed') + '
'
+ (s.plate_url ? '' : '')
+ (s.prompt_sent
? 'Exact prompt sent
' + esc(s.prompt_sent) + '
'
@@ -86,10 +91,15 @@ function projHtml(p) {
+ esc(p.status || "") + ' · ' + esc(when(p.created_at)) + ''
+ ''
+ '
billed ' + money(p.price_usd) + ' ·
cost ' + money(p.actual_cost_usd || p.cost_usd)
+ + (p.audio_cost_usd
+ ? '
(video ' + money(p.video_cost_usd)
+ + ' + voice ' + money(p.audio_cost_usd) + ', ' + (p.audio_chars || 0) + ' chars)'
+ : '')
+ ' ·
tokens ' + (p.script_tokens || 0)
+ ' ·
writes ' + (p.script_writes || 0)
+ ' ·
rewrites ' + (p.revisions || 0) + '
'
- + '
voice ' + esc(p.pet_voice_formula || "(none set)") + '
'
+ + '
voice ' + esc(p.voice_name ? p.voice_name + " — " : "")
+ + esc(p.pet_voice_formula || "(none set)") + '
'
+ '
scene ' + esc(p.scene || "(none)") + '
'
+ '
source ' + esc((p.source_url || "").slice(0, 70)) + ''
+ (p.film_note ? '
note ' + esc(p.film_note) + '' : '')