- pipeline/deriva-acesso.py gera medio/ e grande/ da matriz no finland, em WebP sRGB, sem ampliar, com retomada - MANIFEST e CONARQ.md documentam matriz, derivada de navegação e de acesso (Res. CONARQ 31/2010) e os tamanhos da NARA 2004 - INDEX.md revisto; teste-upload.txt e falhas-500 antigos saem do bucket
81 lines
3.3 KiB
Python
81 lines
3.3 KiB
Python
"""Leva a descrição NOBRADE para o mural: grava no `meta` de cada peça do
|
|
web/atlas/atlas-map.json o código de referência, a data normalizada, a série
|
|
e o suporte, sem re-renderizar os atlas .webp.
|
|
|
|
python -m nobrade.mural (de dentro de pipeline/, depois de python -m nobrade)
|
|
|
|
Campos novos em meta (curtos: o mapa inteiro desce para o navegador):
|
|
ref código de referência (1.1) dt data na forma da NOBRADE (1.3)
|
|
ano ano inicial, para o histograma si índice em `series` do mapa (nível 3)
|
|
sup espécie e suporte (1.5) rep categoria de reprodução (4.2)
|
|
ai índice em `autoridades` (2.1, forma autorizada ISAAR(CPF))
|
|
dq 1 quando a data foi atribuída pelo arquivista (proc. 1.3.3.2)
|
|
No topo do mapa: `series`, `autoridades`, `instituicoes` (community → nome
|
|
autorizado), `colecao` (código e título do nível 1) e `grande` (há derivada
|
|
de 2.000 px para o zoom).
|
|
"""
|
|
|
|
import json
|
|
|
|
from .config import COLECAO_TITULO, GRANDE, INSTITUICOES, RAIZ, SAIDA, codigo
|
|
|
|
MAPA = RAIZ / 'web' / 'atlas' / 'atlas-map.json'
|
|
|
|
|
|
def ano(p: dict):
|
|
"""O ano que posiciona a peça no histograma — só quando a data é precisa o
|
|
bastante (até 30 anos). "[18--]" ou "[1880-1930?]" ficam na ficha, fora do filtro."""
|
|
i, f = p.get('inicio'), p.get('fim')
|
|
if i and f and f - i <= 30:
|
|
return i
|
|
return None
|
|
|
|
|
|
def main():
|
|
series, dossies = {}, {}
|
|
for linha in (SAIDA / 'unidades.jsonl').open(encoding='utf-8'):
|
|
u = json.loads(linha)
|
|
if u['nivel'] == 3:
|
|
series[u['id']] = u['1.2']['titulo']
|
|
elif u['nivel'] == 4:
|
|
dossies[u['handle']] = u
|
|
|
|
d = json.loads(MAPA.read_text(encoding='utf-8'))
|
|
titulos = sorted(set(series.values()), key=str.casefold)
|
|
idx = {t: i for i, t in enumerate(titulos)}
|
|
d['series'] = titulos
|
|
formas = sorted({p['forma'] for u in dossies.values() for p in u['2.1'] if p.get('id')}, key=str.casefold)
|
|
ai = {f: i for i, f in enumerate(formas)}
|
|
d['autoridades'] = formas
|
|
d['instituicoes'] = {k: v[1] for k, v in INSTITUICOES.items()}
|
|
d['colecao'] = {'codigo': codigo('BF'), 'titulo': COLECAO_TITULO}
|
|
d['grande'] = GRANDE # o visor só pede derivados/grande/ quando isto é verdade
|
|
feitos = 0
|
|
for h, e in d['map'].items():
|
|
u = dossies.get(h)
|
|
if not u:
|
|
continue
|
|
p = u['1.3']['producao']
|
|
dim = u['1.5']
|
|
sup = dim['especie'] + (f" {dim['cor']}" if dim.get('cor') else '') + (f", {dim['suporte']}" if dim.get('suporte') else '')
|
|
e['meta'].update({
|
|
'ref': u['1.1'], 'dt': p.get('forma'), 'ano': ano(p),
|
|
'si': idx[series[u['pai']]], 'sup': sup, 'rep': u['4.2']['categoria'],
|
|
})
|
|
aut = next((p['forma'] for p in u['2.1'] if p.get('id')), None)
|
|
if e['meta'].get('ano') is None:
|
|
e['meta'].pop('ano', None)
|
|
e['meta'].pop('ai', None)
|
|
e['meta'].pop('dq', None)
|
|
if aut:
|
|
e['meta']['ai'] = ai[aut]
|
|
if (p.get('notas') or [''])[0].startswith('data atribuída pelo arquivista'):
|
|
e['meta']['dq'] = 1
|
|
feitos += 1
|
|
MAPA.write_text(json.dumps(d, ensure_ascii=False, separators=(',', ':')), encoding='utf-8')
|
|
print(f'{feitos} de {len(d["map"])} peças com descrição NOBRADE; {len(titulos)} séries')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|