feat: acervo Brasiliana Fotográfica coletado e mural 3D no ar

Captura integral do acervo da Brasiliana Fotográfica (Biblioteca Nacional)
para s3://brasiliana: 13.060 itens, 12.985 com imagem de preservação, 13.059
com miniatura derivada, 2.137 cópias legadas e 636 posts do blog. 41.444
objetos no ledger.

Os 75 itens sem preservação estão em errors.md: a página do item responde
200, mas a origem serve o bitstream com HTTP 500. Nenhum fica fora do mural,
porque todos têm thumbnail.

Não versionado, por viver no bucket ou ser reconstruível: catálogo,
posts .jsonl, atlas .webp, sqlite de estado e logs. Credenciais ficam de
fora pelo .gitignore.
This commit is contained in:
rodado
2026-09-13 20:17:02 +02:00
commit 290c4cc21d
690 changed files with 81187 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
> **Arquivado em 2026-09-10 — superado.** Prompt de handoff original da Fase
> 1. Cumpriu seu papel (a Fase 1 terminou, catálogo saiu). Boa parte do
> conteúdo abaixo (trilha A via servidor, "não mexa na aba do Brave") não
> vale mais — ver `tasks/PLANO.md` pro estado e runbook atuais. Mantido só
> como registro histórico.
Retomando o projeto Brasiliana → S3. Leia primeiro `tasks/PLANO.md` (estado, achados, runbook) e depois `README.md` se precisar de mais detalhe técnico.
> Nota (2026-09-10): reorganização de pastas — `baixador.py`, `subidor.py`, `coletor.js`, `baixador-navegador.js`, `catalogo.jsonl` e `.s3env` agora moram em `pipeline/`. Os comandos deste arquivo ainda usam os nomes antigos sem prefixo; rode-os de dentro de `pipeline/` (`cd pipeline` primeiro) ou ajuste os caminhos. `tasks/PLANO.md` já está com os caminhos corrigidos — prefira aquele runbook.
Contexto rápido: a Fase 1 (coletor.js, metadados) está rodando numa aba do Chrome controlada por outra sessão de Claude (Cowork, na nuvem) — não mexa nela, ela é independente. Ela vai exportar `brasiliana-catalogo.jsonl` para `~/Downloads` sozinha quando terminar (ETA ~15-16h a partir de ~10:31 de 2026-09-09, checar se já não terminou antes de você ler isso).
Seu trabalho é tocar as Fases 2-4 assim que o catálogo existir — você tem rede real (SSH, S3), a sessão na nuvem não tem.
1. Verifique se `~/Downloads/brasiliana-catalogo.jsonl` (ou algo com esse padrão de nome) já existe. Se não, esse é o bloqueador: espere ou me avise para eu checar o progresso da fase 1.
2. Fase 2 (trilha A, servidor Finlândia):
```bash
scp baixador.py catalogo.jsonl finland:/root/brasiliana/
ssh finland
set -a; . /root/.s3env; set +a
cd /root/brasiliana
python3 baixador.py --catalogo catalogo.jsonl --pular-legado
python3 baixador.py --status
```
As credenciais reais (AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY) para preencher `.s3env` estão em `/Users/polux/Projetos/tocador/.env`. Na Finlândia já deve haver `/root/.s3env` configurado — confirme antes de reescrever.
3. Fase 3 (trilha B, nomes com encoding — precisa do navegador):
- Cole `baixador-navegador.js` no console da MESMA aba do coletor (a aba já tem o catálogo em memória/IndexedDB da fase 1). `BAIXA.quantos()` para saber quantos, `BAIXA.iniciar()` para começar — os arquivos caem em `~/Downloads`.
- Em paralelo, no terminal local:
```bash
set -a; . .s3env; set +a
python3 subidor.py --vigiar --catalogo catalogo.jsonl
```
4. Fase 4 (cópias legadas do objdigital, só alcançável localmente):
```bash
set -a; . .s3env; set +a
python3 baixador.py --catalogo catalogo.jsonl --somente-legado
```
5. Ao final: gere `MANIFEST.md` (o que é, como foi coletado, quando) e confirme no bucket que a contagem de itens/checksums bate com os 13.036 esperados (ou o número real que saiu da fase 1, que pode ser ligeiramente diferente).
Regras não-negociáveis (do PLANO.md): SHA-256 de cada arquivo, e URL de origem + data/hora UTC de captura em cada `metadata.json`. `dc.rights` e a instituição de origem são preservados por item.
Se algo travar (disco cheio — aborta abaixo de 2GB livres na Finlândia —, erro de rede, item corrompido), pare, registre o que aconteceu em `tasks/PLANO.md` e me avise em vez de insistir.
+15
View File
@@ -0,0 +1,15 @@
# TODO concluído — 2026-09-10
Itens já fechados, tirados do `tasks/TODO.md` ativo pra não poluir. Ver
`tasks/PLANO.md` pros achados permanentes (Cloudflare bloqueando bitstream,
multi-bitstream, padrão de sequência de thumbnail etc.) — isso aqui é só o
histórico de execução.
- [x] **Re-exportar `brasiliana-catalogo.jsonl`** — feito às 10:46, 13.058 itens, 119 com `all_preservation_urls` confirmados no arquivo.
- [x] Reiniciar `subidor.py` com o catálogo atualizado (PID 3171) — confirmado processando.
- [x] **Fase 4 (legado objdigital)**: não era bloqueio Cloudflare — o domínio só responde em HTTPS (HTTP puro tem a porta resetada). Corrigido em `baixador.py` (força https no `legacy_url`). Rodando local (PID 14570, sem navegador, curl direto funciona) — 2.707 itens com `legacy_url`.
- [x] **34 itens que falharam no reparo multi-bitstream**: 33/34 corrigidos com reparo v3 (nome real do arquivo via `<img src>` da miniatura, tira o `.jpg` duplicado, busca por `/bitstream/handle/PREFIX/h/{nome real}` — necessário porque esses itens não tinham `<a href sequence=>` no wrapper e a sequência não era contígua a partir de 1). Extras disparados (`BAIXA_EXTRA`, 63 imagens novas). Catálogo re-exportado (152 itens com `all_preservation_urls` confirmados) e `subidor.py` reiniciado.
- **1 exceção sem conserto**: handle `20.500.12156.1/7523` ("Vista Aérea de Cabo Frio") — `HTTP 500` do próprio servidor da BN ao buscar os bitstreams, não é problema de nome/padrão. Provável arquivo corrompido/quebrado do lado deles. Documentado no MANIFEST final como exceção conhecida.
- **Total: 152/154 itens sem imagem original corrigidos** (152 + o falso-positivo `.../1` + o `7523` = 154).
- [x] **Reorganização de pastas** (feita por outra sessão em paralelo): scripts/estado → `pipeline/`, visualizações → `web/`, `exemplo-item/` → `examples/`, `censo.py` → `archive/`. `subidor.py` morreu no meio da troca (não estava com FD aberto que sobrevivesse ao rename como o `baixador.py` teve) — reiniciado do novo caminho (PID 28923), backlog de ~2.963 arquivos em `~/Downloads` escoou normalmente depois.
- [x] **Atualizar `PLANO.md`** com os achados desta sessão (2.6-2.9): Cloudflare bloqueia bitstream via curl também, estratégia virou "tudo via navegador", multi-bitstream (115 itens), padrão de sequência do thumbnail, objdigital só em HTTPS.