# TODO — notas técnicas (Brasiliana → S3) > Só o que está **aberto**. O que foi concluído, com os achados e o histórico > das sessões, está em [`tasks/done/`](done/); a última versão completa deste > arquivo, com os achados 2.15–2.28 e 3.1–3.5 citados abaixo, é > [`done/TODO-2026-09-30.md`](done/TODO-2026-09-30.md). Plano, estado e > descrição NOBRADE: [`PLANO.md`](PLANO.md). Scripts e estado em `pipeline/`. ## Pendente Movido para [`tasks.md`](tasks.md), a lista única de tarefas abertas do projeto. ## Notas técnicas úteis pra retomar - Downloads automáticos do Chrome exigem permissão manual em `chrome://settings/content/automaticDownloads` (site adicionado: `https://brasilianafotografica.bn.gov.br`) — já concedida, vale pra novos scripts também, não só o original. - `BRAS`, `BAIXA`, `BAIXA_THUMB`, `BAIXA_EXTRA` — todos no `window` da mesma aba, mesmo IndexedDB (`bras`). Todos sobrevivem a fechar/reabrir a aba (dado fica salvo), mas o *loop* para e precisa recolar o script certo pra retomar. - **Regerar as miniaturas derivadas** (tudo reconstruível, nada precisa ser guardado): no finland, `apt install libvips-tools parallel` + s5cmd; pra cada chave de `itens/*/preservacao/*`, `s5cmd cat` num tmp e `vipsthumbnail "$TMP" --size 256 --output "$OUT[Q=80,strip]"`, com `parallel -j 10`. ~640 thumbs/min, tráfego intra-Hetzner (bucket é `hel1`, o finland também) — não passa pelo link de casa. O que ainda está só em `~/Downloads` sai mais barato derivado localmente com `magick`: mandar os 71 GB pro finland custaria os mesmos dias do upload pendente. - **Cuidado ao parsear `s5cmd ls`**: nomes de arquivo do acervo têm espaço **duplo** (`48094 Álbum 311 - ...jpg`). `awk '{$1="";$2="";$3=""; print}' recolapsa esses espaços e produz chaves que não existem — 31 downloads falharam assim antes de eu perceber. Use `sed -E 's|^[0-9/]+ +[0-9:]+ +[0-9]+ ||'`, que preserva o resto literal. - **`sqlite3` desta máquina tem `.sqliterc` forçando modo box**: qualquer script que leia a saída precisa de `sqlite3 -init /dev/null -noheader -separator $'\t'`, senão vem borda de tabela no lugar dos dados (me custou um diff inteiro de falso positivo). - **`until ! pgrep -f X; do sleep; done` nunca termina**: a linha de comando do próprio loop contém `X`, então o `pgrep -f` se acha e a condição nunca vira falsa. Um loop desses ficou girando horas depois do trabalho acabar (12/09, morto à mão). Esperar por PID (`while kill -0 $PID`) ou usar `pgrep -f '[t]humb-local'` para o padrão não casar consigo mesmo. - **Parar processo lançado em background: SIGTERM, não SIGINT.** Processo iniciado com `&` num shell não interativo herda o SIGINT ignorado (o `subidor.py` ficou 60 s vivo depois do `kill -INT`). Com SIGTERM, o `aws s3 cp` filho termina órfão, o que é inofensivo: sem linha no ledger e sem apagar o local, o próximo uploader sobe de novo a mesma chave. - **Upload de casa: 69 Mbps** (`networkQuality -s`, 12/09); download 312 Mbps. - **Assinaturas aceitas como imagem** (`subidor-paralelo.py`): JPEG `FFD8`, PNG, TIFF `II*\0`/`MM\0*`, GIF, JP2, BMP `BM`, WebP. Content-Type sai do conteúdo, não da extensão (TIFF chega com nome `.jpg`). - **`vipsthumbnail --output` é relativo à pasta do arquivo de entrada**, não ao diretório corrente: `vipsthumbnail tmp/x.img --output out/y.webp` tenta gravar em `tmp/out/y.webp` e falha. Usar caminho absoluto na saída. (Custou uma miniatura "refeita" que não foi refeita, em 13/09.) - Scripts-fonte em `pipeline/`: `coletor.js` / `coletor-resume.js` (metadados), `baixador-navegador.js` (preservação, todos os itens), `baixador-thumb.js` (miniaturas), `baixador-extras.js` (2a+ imagem de itens multi-bitstream), `reparo-multibitstream.js` (enumera bitstreams reais de um item).