Communitygithub.com

Michael-Steshenko/aoe-editor

Fluxo de trabalho completo de edição e publicação de vídeos de Age of Empires. Detecta e corta gravações de sessão em clipes de partidas individuais, extrai capítulos de transição de eras, mantém análises pós-jogo, descarta partidas com menos de 7 minutos, gera miniaturas autênticas do YouTube e gerencia agendamento de uploads.

O que é aoe-editor?

O AoE Editor é uma skill avançada para agentes de IA (como Claude Code, Cursor, Codex) que automatiza o processo completo de edição de vídeos de Age of Empires, desde a detecção e corte de gravações de sessões longas até a publicação no YouTube e geração de miniaturas personalizadas. Ela suporta plataformas Windows com PowerShell e requer ferramentas como FFmpeg e yutu. A skill extrai automaticamente cada partida de uma sessão gravada, aplica regras rigorosas de filtragem (como descartar partidas com menos de 7 minutos e marcar jogos desequilibrados para revisão), preserva os arquivos fonte renomeando-os com o sufixo ' - aoe-editor-done', e gera miniaturas autênticas no estilo YouTube que combinam exatamente com os nomes dos vídeos. Além disso, inspeciona dinamicamente filas de agendamento do YouTube, atribui vídeos a playlists de 1v1 e Jogos em Equipe, e utiliza a API nativa do Windows para evitar suspensão do sistema durante processamentos noturnos.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add Michael-Steshenko/aoe-editor-skill

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

AoE Editor

Use esta skill para processar longas gravações de sessões de jogo de Age of Empires (AoE) em clipes de partidas independentes e limpos, gerar miniaturas autênticas do YouTube e gerenciar uploads agendados para o YouTube.

Diretrizes Estritas de Segurança e Proteção

1. Preservação da Gravação Original e Marcação de Conclusão

[!IMPORTANT] NUNCA DELETE AS GRAVAÇÕES ORIGINAIS — MARQUE ARQUIVOS CONCLUÍDOS COM - aoe-editor-done Sob NENHUMA circunstância o agente deve deletar, remover ou sobrescrever os arquivos de gravação originais (ex.: em $env:USERPROFILE\Videos\).

  • Fonte Permanente Intocada Durante o Processamento: Mesmo após os clipes serem extraídos, revisados ou enviados para o YouTube, a filmagem original da sessão nunca deve ser deletada.
  • Renomeação Após Conclusão ( - aoe-editor-done): Assim que todas as partidas de uma gravação fonte terminarem de ser editadas, cortadas, verificadas e salvas na pasta de destino por data, o arquivo fonte DEVE ser renomeado adicionando - aoe-editor-done antes da extensão:
    • Exemplo (.mp4): 2026-10-27 20-35-29.mp4 -> 2026-10-27 20-35-29 - aoe-editor-done.mp4
    • Exemplo (qualquer extensão): <nome_arquivo>.<ext> -> <nome_arquivo> - aoe-editor-done.<ext>
    • Comando PowerShell:
      $item = Get-Item "<CaminhoFonte>"
      Rename-Item -Path $item.FullName -NewName "$($item.BaseName) - aoe-editor-done$($item.Extension)"
      
  • Pular Arquivos Já Concluídos: Ao escanear ou identificar gravações de sessão para processar, sempre ignore e pule qualquer arquivo que já contenha - aoe-editor-done antes da extensão.
  • Partidas Descartadas: Para partidas que são puladas ou descartadas (ex.: duração < 7 minutos), simplesmente pule a extração daquele segmento. Nunca corte, trunque ou delete nada do vídeo fonte.
  • Limpeza Temporária Apenas: Apenas arquivos temporários (como JPEGs de frames de amostra em uma pasta temporária/scratch) podem ser limpos. Nunca delete arquivos de vídeo fonte.

2. Proteção Estrita de Credenciais e Segurança

[!CAUTION] NUNCA LEIA ARQUIVOS DE CREDENCIAIS OU TOKENS Sob NENHUMA circunstância o agente deve ler, visualizar, exibir ou inspecionar o conteúdo de quaisquer arquivos de credenciais, segredos ou tokens.

  • Inspeção Zero: Especificamente, NUNCA leia, inspecione, cat, imprima ou produza nenhum arquivo dentro de $env:USERPROFILE\Videos\yt-uploader\ (como request.token, youtube.token.json, client_secrets.json ou quaisquer arquivos de credencial *.token / *.json).
  • Execução Apenas: Ao executar yutu, invoque-o apenas com variáveis de ambiente (YUTU_CREDENTIAL, YUTU_CACHE_TOKEN) e flags de linha de comando. Nunca inspecione ou produza os tokens ou segredos que ele lê.

3. Prevenção de Suspensão Durante Processamento Não Supervisionado (Keep-Awake Nativo)

Para permitir que o fluxo de trabalho seja executado completamente sem supervisão (detectando, cortando clipes, renderizando miniaturas ou enviando lotes para o YouTube) enquanto permite que o monitor do usuário desligue ou durma naturalmente:

  • Método Padrão (API Nativa do Windows - Tela Pode Dormir): Use SetThreadExecutionState do Windows com ES_CONTINUOUS | ES_SYSTEM_REQUIRED (0x80000001). Isso informa ao Windows que o processamento/envio em segundo plano está ativo, garantindo que CPU, disco e rede nunca durmam, enquanto permite que monitores desliguem ou durmam conforme as configurações normais de energia do Windows:
    $sig = '[DllImport("kernel32.dll", SetLastError=true)] public static extern int SetThreadExecutionState(int esFlags);'
    $power = Add-Type -MemberDefinition $sig -Name 'PowerHelper' -Namespace 'SystemSleep' -PassThru
    # Impede suspensão do sistema (permite que a tela durma)
    $power::SetThreadExecutionState([int]0x80000001)
    
  • Liberando o Bloqueio de Suspensão: Assim que todas as tarefas em lote ou uploads forem concluídos, redefina o estado de execução de volta ao modo contínuo padrão:
    $power::SetThreadExecutionState([int]0x80000000)
    
  • Alternativa (Caffeine): Caffeine está instalado em caffeine64.exe. Como o Caffeine simula entrada de teclado a cada 59s, ele impedirá a suspensão da tela, a menos que o monitor seja fisicamente desligado. Use o método nativo acima como padrão.
  • Durações/Usos Recomendados:
    • Mantenha ativo pela duração do trabalho em lote (especialmente uploads, que podem levar de 1 a 3 horas para 6 a 8 GB de vídeo) e libere imediatamente após a conclusão.

Estrutura de Pastas de Destino

Todos os jogos processados e miniaturas são salvos no diretório aoe dentro de uma subpasta formatada por data derivada do nome do arquivo de gravação:

$env:USERPROFILE\Videos\aoe\<DDMmmAA>\
  ├── Jogo 1 - <MinhaCiv> vs <CivOponente> (<Mapa> - <Resultado>).mp4
  ├── Jogo 1 - <MinhaCiv> vs <CivOponente> (<Mapa> - <Resultado>).png       # Miniatura correspondendo exatamente ao nome do vídeo
  ├── Jogo 3 - <MinhasCivsEquipe> vs <CivsOponentes> (<Mapa> - <Resultado>).mp4 # (ex.: Jogo 2 foi <7min descartado)
  ├── Jogo 3 - <MinhasCivsEquipe> vs <CivsOponentes> (<Mapa> - <Resultado>).png
  └── ...

Regra da Pasta de Data

  • A data é analisada a partir do nome do arquivo de vídeo: AAAA-MM-DD ...
    • Exemplo: 2026-10-27 20-35-29.mp4 -> 27Out26
    • Exemplo: 2026-10-29 19-46-42.mp4 -> 29Out26
    • Formato: <Dia><Mês de 3 letras><Ano de 2 dígitos> (ex.: 13Out26, 27Out26, 29Out26).

Filtragem de Jogos e Regras de Duração

  1. Jogos Curtos Abaixo de 7 Minutos (Descartar Automaticamente / Pular Exportação):

    • Qualquer partida com duração no jogo abaixo de 7 minutos (ex.: desistência precoce, desconexão, início falho) deve ser pulada da exportação (não extraída ou salva como clipe de saída). NÃO delete, trunque ou modifique qualquer parte do vídeo fonte original.
    • Preservação da Numeração Cronológica: Partidas descartadas ainda consomem seu número cronológico da sessão de gravação.
      • Exemplo: Se o Jogo 1 tem 18m, o Jogo 2 tem 2m (descartado) e o Jogo 3 tem 25m, os arquivos de saída resultantes serão Jogo 1 - ... seguido por Jogo 3 - .... O Jogo 2 é pulado na lista de arquivos para que os números reflitam com precisão a sequência original de partidas.
  2. Jogos Desequilibrados / Chatos (Cortar e Revisão do Usuário):

    • Se uma partida parecer fortemente desequilibrada ou chata (ex.: vantagem massiva e precoce, resistência/engajamentos mínimos, esmagamento não competitivo):
      • Corte e salve o jogo na pasta de data normalmente para que a filmagem local seja preservada.
      • Notifique o usuário: Informe o usuário com os detalhes do clipe, timestamp e por que pareceu desequilibrado/chato. Peça ao usuário para revisar o clipe antes de decidir se deve ser enfileirado para upload no YouTube.

Detecção de Jogos e Regras de Corte

  1. Ponto de Início do Clipe:

    • Comece bem quando a tela de carregamento transiciona para o início do jogo (centro da cidade e unidades iniciais aparecem).
  2. Ponto de Término do Clipe e Análise Pós-Jogo:

    • Manter Análise Pós-Jogo: Se o jogador revisar as telas de conquistas pós-jogo (Resumo, Militar, Economia, Tecnologia, Sociedade) ou assistir a uma análise de replay, mantenha isso no clipe do vídeo do jogo.
    • O clipe termina quando o jogador sai da tela pós-jogo/replay de volta ao menu principal ou fila.
  3. O Que Cortar:

    • Tempos de fila de matchmaking.
    • Telas de espera do lobby e contagem regressiva de seleção de civilizações.
    • Qualquer tempo ocioso, navegação na área de trabalho ou segmentos AFK (longe do teclado).

Convenções de Nomenclatura Estritas

1. Nomes de Arquivos Locais de Vídeo e Miniatura (.mp4 / .png)

Arquivos locais no disco são nomeados para rastreamento local, arquivamento e cronologia de partidas:

  • Número do Jogo: O índice cronológico da partida da sessão (Jogo 1, Jogo 2, etc.), preservando números pulados para partidas descartadas <7min.
  • Civilizações:
    • 1v1: Jogo <N> - <MinhaCiv> vs <CivOponente> (<Mapa> - <Resultado/Notas>).mp4
      • Exemplo: Jogo 1 - Etíopes vs Francos (Arábia - Vitória).mp4
    • Equipe: Jogo <N> - <MinhasCivsEquipe> vs <CivsOponentes> (<Mapa> - <Resultado/Notas>).mp4
      • Exemplo: Jogo 3 - Khmer e Francos vs Persas e Boêmios (Arena - Vitória).mp4
  • Nome do Arquivo de Miniatura: Deve corresponder ao nome do arquivo .mp4 caractere por caractere, trocando .mp4 por .png.

2. Títulos de Vídeo no YouTube (Enviados para o YouTube via -title / -metaJSON)

[!IMPORTANT] TÍTULOS DO YOUTUBE: SEM SPOILERS DE VITÓRIA/DERROTA E SEM NÚMEROS DE JOGOS Os títulos publicados no YouTube NUNCA devem estragar o resultado da partida e NUNCA devem incluir números de jogos da sessão:

  • NÃO inclua Vitória ou Derrota: Nunca estrague o resultado da partida para o público.
  • NÃO inclua Jogo 1, Jogo 2, etc.: Os espectadores no YouTube navegam por partidas independentes, não por índices brutos de sessão.
  • Sintaxe Padrão de Título do YouTube: <MinhasCivsEquipe> vs <CivsOponentes> AOE2 <FormatoPartida> <Mapa>
    • Formato 1v1: <MinhaCiv> vs <CivOponente> AOE2 1v1 <Mapa>
      • Exemplo: Khmer vs Boêmios AOE2 1v1 Arena
      • Exemplo: Dravidianos vs Tártaros AOE2 1v1 Deserto Arábico
      • Exemplo: Etíopes vs Francos AOE2 1v1 Deserto Arábico
    • Formato 2v2: <Civ1> & <Civ2> vs <Civ3> & <Civ4> AOE2 2v2 <Mapa>
      • Exemplo: Khmer & Francos vs Persas & Boêmios AOE2 2v2 Arena
      • Exemplo: Khmer & Bengali vs Malineses & Mongóis AOE2 2v2 Arena
    • Formato 3v3: <Civ1>, <Civ2> & <Civ3> vs <Civ4>, <Civ5> & <Civ6> AOE2 3v3 <Mapa>
      • Exemplo: Khmer, Boêmios & Godos vs Etíopes, Romanos & Celtas AOE2 3v3 Arena
    • Formato 4v4: <Civ1>, <Civ2>, <Civ3> & <Civ4> vs <Civ5>, <Civ6>, <Civ7> & <Civ8> AOE2 4v4 <Mapa>
      • Exemplo: Etíopes, Francos, Bretões & Maias vs Mongóis, Tártaros, Turcos & Persas AOE2 4v4 Floresta Negra

Diretrizes para Miniaturas Autênticas e Memes Dinâmicos (.png)

[!IMPORTANT] O NOME DO ARQUIVO DA MINIATURA DEVE CORRESPONDER AO NOME DO ARQUIVO DO VÍDEO O nome do arquivo da miniatura para cada vídeo deve corresponder exatamente ao nome do arquivo do vídeo (trocando a extensão para .png):

  • Vídeo: Jogo 1 - Etíopes vs Francos (Arábia - Vitória).mp4
  • Miniatura: Jogo 1 - Etíopes vs Francos (Arábia - Vitória).png
  • Vídeo: Jogo 3 - Khmer e Francos vs Persas e Boêmios (Arena - Vitória).mp4
  • Miniatura: Jogo 3 - Khmer e Francos vs Persas e Boêmios (Arena - Vitória).png

Evite clickbait enganoso ou tropos repetitivos de meme único. Baseie a miniatura no que realmente aconteceu, mantendo edições de meme variadas, orgânicas e adequadas à história da partida:

1. Estilo de Miniatura de Alto Impacto e Tipografia

Crie uma tipografia ousada e de alto contraste otimizada para legibilidade em feed móvel:

  • Texto Grande e Impactante: O tamanho da fonte deve ser grande e imediatamente legível em feeds móveis (fontsize=140 a 160 para 1440p, escalado para outras resoluções). Nunca use texto pequeno e de baixo contraste (<100).
  • Contornos Grossos e Sombras: Use uma borda preta grossa (borderw=8 a 12) e sombra (shadowx=4:shadowy=4:shadowcolor=black) para que o texto se destaque em qualquer fundo.
  • Estilo de Texto em Duas Cores e Multicolorido: Não use texto branco simples padrão. Use cores contrastantes e vibrantes entre palavras/linhas:
    • Palavra superior em Branco (#FFFFFF), Palavra inferior/principal em Dourado/Amarelo Vibrante (#FFD700 ou #FFE500) ou Laranja (#FF8C00).
    • Exemplos de layouts de duas cores:
      • "VAMOS ROUBAR" (Branco) / "UM OURO!" (Amarelo)
      • "POSTO" (Branco) / "VINGANÇA!" (Laranja)
      • "CASTELO" (Branco) / "DESTRUIDOR" (Amarelo)
      • "POR QUE FAZER" (Branco) / "ISSO?!" (Laranja)
      • "BOLA DE" (Branco) / "MORTE ESCORPIÃO" (Amarelo)
      • "CERCO CELTA" (Amarelo) / "IMPARÁVEL" (Branco)
  • Posicionamento de Texto Dinâmico e Flexível (Espaço Livre Estrito para o Assunto):
    • [!IMPORTANT] O TEXTO NUNCA DEVE COBRIR UNIDADES FOCAIS OU ASSUNTOS

    • A sobreposição de texto NUNCA deve cobrir, ocultar ou ficar sobre as unidades focais, edifícios ou evento tático mencionado no gancho (ex.: se o gancho diz "INVASÃO DE ELEFANTE DE CERCO", os elefantes de cerco devem permanecer 100% visíveis e desobstruídos pelo texto).
    • Coloque o texto estritamente onde NÃO cobre a ação (em espaço negativo aberto, névoa da guerra ou terreno vazio).
    • Verifique onde unidades e combates estão situados na tela e posicione dinamicamente o texto no centro-superior, superior-esquerdo, superior-direito ou centro-inferior para que a ação focal e as unidades do assunto permaneçam completamente desbloqueadas.

2. Seleção de Frame de Ação e Substanciação Visual-Textual

  • Frames de Base Ociosa Zero: NUNCA selecione um frame onde a câmera esteja recuada sobre fazendas domésticas pacíficas, centros da cidade ou filas econômicas enquanto a ação ocorre em outro lugar.
  • Combate Ativo e Ataque em Andamento (NUNCA Consequências Pós-Luta ou Ruínas Vazias):
    • O frame DEVE capturar combate vivo e ativo ou um ataque em andamento: unidades colidindo ativamente em combate corpo a corpo, disparando flechas, atirando projéteis de cerco, invadindo uma econômica ou atacando uma base/castelo inimigo.
    • NENHUMA Ruína Estática Vazia: NUNCA escolha um frame de muros quebrados ou edifícios danificados onde nenhuma unidade inimiga está ativamente atacando ou presente. Muros quebrados sem tropas ativas parecem abandonados, estáticos e desinteressantes.
    • NENHUMA Consequência Pós-Luta (Corpos no Chão): NUNCA escolha um frame tirado após a luta já ter terminado, mostrando apenas cadáveres/corpos mortos no chão com unidades restantes paradas. Capture a ação durante a luta, não depois.
  • NENHUM Vazamento de Resultado ou Spoiler de Pontuação:
    • A miniatura NUNCA deve revelar o resultado da partida:
      • NUNCA capture frames mostrando "Jogador X desistiu" no chat ou nomes de jogadores riscados na caixa de pontuação.
      • NENHUMA Disparidade de Pontuação / Vazamento de Base Dominada: NUNCA escolha um frame onde a caixa de pontuação no canto inferior direito exiba uma diferença massiva de pontos (ex.: jogador com 70–75% da pontuação do oponente) enquanto a base do jogador está em ruínas/sendo invadida. Isso vaza descaradamente uma derrota para o espectador e estraga a suspense. Mantenha a pontuação e o estado do tabuleiro ambíguos ou recortados/limpos.
    • Todos os frames de miniatura DEVEM ser capturados durante jogabilidade ativa, tensa e competitiva.
  • Qualidade da Expressão da Webcam e Protocolo de Inspeção de Corte (Crop):
    • Se a gravação apresentar uma sobreposição de webcam / face cam:
      • Inspeção Dedicada da Face Cam (Corte e Verifique em Escala 1:1): Nunca confie apenas em uma visão completa de 1440p para julgar expressões faciais. O agente DEVE cortar e inspecionar a região da webcam (crop=390:300:0:890 ou caixa equivalente) isoladamente em escala de pixel 1:1 antes de finalizar a miniatura.

Habilidades Relacionadas