fix(C163): calibra link do vídeo do acervo ao t=608s da sessão

This commit is contained in:
Francisco Solla 2026-09-15 10:03:00 -03:00
parent bbd147fffb
commit 19c403f0dc
4 changed files with 13 additions and 11 deletions

View file

@ -180,10 +180,11 @@ cacheado em `data/relatorios-cidade/<base>.emendas.json` para replay.
(passagem que cita a cidade ou, se o nome não aparece nos trechos, a marcação
do acervo com o nº de municípios), mais **Vídeo** (YouTube no trecho da fala
— `youtubeExcerptStartSeconds` = época do trecho (`excerptTMs`) − início da
sessão, com folga de 20s no link; o `speechAt` da API é o horário do slot,
não o início real; fallback para o VOD da Câmara, que é o clipe do próprio
trecho) e **Transcrição** (PDF do Diário) quando existirem ·
`11. Notícias e imprensa` ·
sessão, calibrado contra o vídeo real: o da sessão de 13/03/2018 começa ~37s
depois do `eventStartAt`, então 645s viram `t=608s` (`YOUTUBE_VIDEO_OFFSET_SECONDS`);
o `speechAt` da API é o horário do slot, não o início real; fallback para o
VOD da Câmara, que é o clipe do próprio trecho) e **Transcrição** (PDF do
Diário) quando existirem · `11. Notícias e imprensa` ·
`12. Panorama regional` · `13. Abordagem sugerida (personas)` · `14. Fontes e
limites`.
- **Links clicáveis:** todo URL no PDF é um link (`<a href>`): células de

View file

@ -0,0 +1 @@
**C163 — calibração do link do vídeo: t=608s (2026-09-15):** verificação no vídeo real (`youtube.com/live/2cX_gKkJH7Q?t=608`) mostrou que a sessão de 13/03/2018 começa ~37s depois do `eventStartAt`; o trecho da Câmara (645s no relógio da sessão) toca em 608s. O builder trocou a folga genérica de 20s por `YOUTUBE_VIDEO_OFFSET_SECONDS = 37`, calibrado contra essa sessão, e o link da fala 641 ficou `youtube.com/watch?v=2cX_gKkJH7Q&t=608s`. Unit 3118/3118, `tsc`/eslint verdes; PDF regerado.

View file

@ -854,12 +854,12 @@ const buildTransportSection = ({ research }) =>
/**
* YouTube link starts at the Câmara excerpt of the speech (`excerptTMs` −
* session start): `speechAt` is the API slot clock, not when the deputy
* actually speaks (for speech 641 the previous speaker is still on at
* `speechAt`). A short lead-in keeps the link from starting already inside the
* speech when the session video drifts a few seconds.
* session start), calibrated by the live video: the 2018-03-13 session video
* starts ~37s after `eventStartAt`, so the excerpt at 645s plays at 608s
* (`youtube.com/live/2cX_gKkJH7Q?t=608`, checked in the browser). `speechAt` is
* the API slot clock, not when the deputy speaks.
*/
const YOUTUBE_LEAD_IN_SECONDS = 20
const YOUTUBE_VIDEO_OFFSET_SECONDS = 37
const withYoutubeTimestamp = (url, offsetSeconds) => {
if (!url) return null
@ -870,7 +870,7 @@ const withYoutubeTimestamp = (url, offsetSeconds) => {
const youtubeStartSeconds = (row) =>
Number.isFinite(row.youtubeExcerptStartSeconds)
? Math.max(0, Math.floor(row.youtubeExcerptStartSeconds) - YOUTUBE_LEAD_IN_SECONDS)
? Math.max(0, Math.floor(row.youtubeExcerptStartSeconds) - YOUTUBE_VIDEO_OFFSET_SECONDS)
: null
const buildSpeechesSection = ({ snapshot }) => {

View file

@ -445,7 +445,7 @@ describe('buildCityReport', () => {
expect(falas.columns!.find((column) => column.key === 'mention')!.width).toBe(27)
expect(rows[0].description).toBe('Resumo da fala')
expect(rows[0].mention).toContain('cita Feira de Santana')
expect(rows[0].video).toBe('https://youtube.test/video?t=625s')
expect(rows[0].video).toBe('https://youtube.test/video?t=608s')
expect(rows[0].transcript).toBe('https://camara.test/discurso')
expect(rows[1].description).toBe('Saúde indígena na Bahia')
expect(rows[1].mention).toContain('nome não localizado nos trechos')