Vídeos de Mapas Geopolíticos (TikTok, Alemão)
O usuário é um criador de TikTok. Cada vídeo será construído completamente no código com HyperFrames (primeiro leia o skill hyperframes: contrato de renderização, check, snapshot, render).
Idioma: sempre alemão – roteiro, narração, legendas, rótulos, respostas ao usuário.
Fluxo (sem perguntas adicionais quando o usuário indicar um tema)
- Uma vez por container:
bash ~/.claude/skills/geo-karten-video/scripts/setup.sh(tiles, ícones, fontes, GSAP local, limites de fronteira, voz Piper. Rede: apenas npm, PyPI e GitHub estão abertos. Esri/NASA-GIBS/HuggingFace/jsdelivr estão bloqueados – por isso estes desvios.) - Projeto:
bash scripts/projekt.sh <slug>->/home/user/videos/<slug> - Roteiro (
skript.txt, uma linha = um beat/frase). Duração: 30 s ~ 65-70 palavras, 60-75 s ~ 150-170. Escreva números por extenso para a voz, exibição com{}:sechsundvierzig{46}. Abreviações por extenso (Lkw -> Laster). Fatos apenas se comprovados; valores estimados com "cerca de"/"aproximadamente" e conjuntivo em experimentos mentais. - Narração + tempos das palavras:
python3 scripts/voice.py skript.txt assets/audio --speed 1.05->voice.wav(48 kHz, -15 LUFS) +words.json. Se o usuário tiver uma gravação própria: usá-la (tempos das palavras então comnpx hyperframes transcribe --model small --language de, se os modelos estiverem acessíveis). - Mapa:
python3 scripts/map.py assets/map --bbox lon0,lon1,lat0,lat1 --laender DEU,... --staedte "Berlin:13.40,52.52;..."(regiões/estados:--admin1 "Bayern;Sachsen-Anhalt"). Imagem <= ~5000 px de lado. - Ícones:
python3 scripts/icons.py --suche "oil"epython3 scripts/icons.py assets/icons name=HEX ... - Construir cenas - modelo:
templates/beispiel-keiner-arbeitet/(index.html, karte.html, skript.txt). Legendas:python3 scripts/captions.py assets/audio/words.json compositions/untertitel.html --duration <s> npx hyperframes check --json->npx hyperframes snapshot --at ... -o snap(máx. ~6 pontos de tempo por chamada, senão o processo é encerrado) -> visualizar imagens -> corrigir.- Renderizar em segundo plano:
npx hyperframes render -o renders/<slug>.mp4 -q delivery -w 2 --quiet(run_in_background). Em seguida, verificar com ffprobe, verificar contato, enviar o arquivo ao usuário.
O Visual (analisado a partir de 3 vídeos de referência – construir exatamente assim)
Formato: 1080x1920, 30 qps, 30-75 s. Sem introdução, sem logotipo. O frame 0 já é o gancho (país colorido + figura/ícone).
Mapa = palco, um movimento de câmera contínuo. Imagem de satélite, mar em verde-escuro petróleo, terra em verde/bege natural.
Quase sem cortes bruscos: a câmera dá zoom/panorâmica entre os beats (0,8 s power2.inOut), com deriva lenta entre eles.
Câmera = um wrapper #k-cam (transform-origin 0 0), alvo via cam(px, py, scale) -> pixels do mapa no centro da tela (540, 900).
Tudo que está vinculado a locais (ícones, rótulos, países) fica DENTRO do wrapper da câmera em pixels do mapa.
Números grandes e rótulos "TAG 1" ficam no espaço da tela.
Países como caminho SVG: área semitransparente (fill-opacity ~0,66, textura de satélite transparece),
borda clara (~2,5 px), sombra projetada drop-shadow(0 10px 10px rgba(0,0,0,.45)). Cor animada via GSAP no CSS fill
(não attr, CSS sobrepõe o atributo). Cores fixas por país:
Alemanha #2f5bea (azul royal), Turquia/Rússia/Irã #e02424 (vermelho), Ucrânia #e5a82e (laranja-amarelo),
EUA #5aa9ff (azul claro), região de destaque #a8d82a (lima), partido/região-destaque #f2a41c (laranja).
Mudanças de cor contam a história (ex.: azul -> cinza -> vermelho em caso de queda).
Nomes dos países: Fonte cursiva Kalam 700, branca, inclinada (-8 a -14 graus), grande, com sombra, de preferência cortada.
Figuras/pessoas: PNG com fundo removido (do usuário, pois não há geração de imagem) ou figuras OpenMoji,
sempre com borda branca de adesivo + sombra (classe .st:
drop-shadow(3px 0 0 #fff) drop-shadow(-3px 0 0 #fff) drop-shadow(0 3px 0 #fff) drop-shadow(0 -3px 0 #fff) drop-shadow(5px 9px 7px rgba(0,0,0,.45))).
Elas ficam sobre seu país, aparecem (back.out(2.2), 0,45 s) e encolhem ao sair (0,22 s power3.in).
Ícones: Planos com contorno escuro grosso (OpenMoji): bomba de gasolina, barril de petróleo, dinheiro, explosão, navios, bandeiras, urna... Quantidades = muitos ícones pequenos espalhados pelas cidades, escalonados com 40-70 ms.
Números: Montserrat Black, branco, gigantesco (170-230 px), sombra dura, no topo da imagem (top ~240 px),
contagem crescente (1,0 s power2.out). Rótulos de data/dia com 96 px.
Legendas: UMA palavra por aparição, MAIÚSCULAS, Montserrat Black ~68 px, branca com sombra escura,
centralizada em y ~1400 (como na referência, terço inferior), pequeno pop por palavra. Gerada por captions.py.
Evidências: Screenshots de manchetes/documentos como "papéis" que voam inclinados; ocasionalmente foto B-Roll (2-3 s), depois de volta ao mapa.
Som: A narração é o relógio. SFX com moderação (assets/sfx): pop para adesivos importantes, whoosh para movimentos de câmera,
error para cruz/parada, impact-bass no ponto de virada. Música apenas se o usuário fornecer um arquivo (sem acesso a música aqui).
Dramaturgia
- Gancho 0-3 s: pergunta ou notícia urgente + rosto/país visível imediatamente.
- Contexto: número/data/fonte concreta.
- Escalada em etapas (Dia 1 / Dia 3 / Dia 7 ou evento -> reação -> consequência), a cada 1-3 s um novo elemento.
- Ponto de virada/desfecho (número vira, país muda de cor, shake + impact).
- Final: zoom out + pergunta aberta aos espectadores (comentários). Sem créditos finais.
Armadilhas Técnicas (medidas)
- GSAP incluído localmente (
assets/vendor/gsap.min.js), CDN está bloqueado. snapshotcom muitos pontos de tempo é encerrado -> em blocos de ~6.- Render com
-w 2(imagem grande do mapa + filtros consomem RAM). - A voz do Piper soa sintética (16 kHz) – oferecer ao usuário uma gravação própria ou arquivo do ElevenLabs;
então substituir
voice.wave recalcular os tempos das palavras. - Crédito da imagem pequeno no canto superior direito: "Imagem: NASA Blue Marble".
- O container é volátil: enviar vídeos prontos imediatamente ao usuário; skills/projetos só permanecem se enviados a um repositório Git.