Communitygithub.com

Hammadbaig-hub/daily-shorts-media

Cria e publica automaticamente um YouTube Short diário com fatos animados e motivação — sem custos, alternando entre inglês e urdu.

O que é daily-shorts-media?

Este skill automatiza completamente a criação e publicação de um YouTube Short por dia, com foco em fatos interessantes e mensagens motivacionais, sem nenhum custo financeiro. Ele roda em um workspace na nuvem, utilizando bibliotecas Python gratuitas como Pillow e ffmpeg para renderizar o vídeo e Kokoro (um modelo TTS offline) para a narração. O vídeo é hospedado no GitHub (repositório público) e agendado no YouTube através da API do Metricool. O skill verifica cada fato na web antes de usá-lo, garantindo precisão e evitando conteúdo de baixa qualidade. O idioma alterna entre inglês e urdu diariamente, e todo o fluxo — desde a seleção do tópico até a publicação — é automatizado. O usuário pode solicitar a execução com comandos simples como 'aaj ki video bana do' ou 'YouTube wala kaam kar do', e o skill também oferece relatórios semanais de desempenho do canal.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Hammadbaig-hub/daily-shorts-media/tree/HEAD/tools

Perguntar na sua IA favorita

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

Documentação

YouTube Daily Shorts

Um Short por dia, totalmente automático, custo zero. O canal publica fatos do tipo "Você sabia?" e pequenas mensagens motivacionais, um dia em inglês e o seguinte em urdu.

Configurações fixas (altere aqui se o usuário as modificar)

ConfiguraçãoValor
Repositório de mídia no GitHubHammadbaig-hub/daily-shorts-media (público, branch main) — também contém as ferramentas de renderização em tools/
Marca Metricool (blogId)7592220, fuso horário Asia/Karachi
Canal"Bright Life", identificador @Bright-Life-m4 (coloque o identificador em script.json; a CTA menciona "Bright Life")
Horário de publicação19:00 horário do Paquistão (ou o próximo slot livre se esse horário já tiver passado; pelo menos 15 minutos a partir de agora)
Privacidadepública (o usuário escolheu upload automático total)

Por que foi construído desta forma

  • Gratuito: o usuário não tem orçamento, então o vídeo é desenhado com Pillow + ffmpeg (tools/scripts/make_short.py no repositório) e a música é sintetizada no mesmo script, o que também significa que não há reivindicações de direitos autorais do Content ID.
  • Narração: a narração vem do Kokoro, um pequeno modelo TTS neural gratuito que roda offline na CPU (tools/scripts/voice.py). Seus arquivos de modelo de ~350 MB são baixados uma vez dos lançamentos do GitHub para ~/tts. O inglês usa am_michael; o urdu é falado pela voz hindi hm_omega a partir de texto em script urdu, com alguns fonemas remapeados. Cada slide dura o tempo de sua narração, e a música é abaixada por baixo. O TTS em nuvem (Microsoft/Google) está bloqueado do workspace, por isso é offline.
  • Hospedagem no GitHub: o Metricool precisa de uma URL pública de vídeo. O workspace na nuvem pode fazer push para o GitHub, e a URL do arquivo bruto é pública, então essa é a ponte.
  • Verificação de fatos: um canal de fatos vive ou morre pela precisão. O YouTube também suprime conteúdo produzido em massa, de baixo valor ou enganoso, e um "fato" errado atrai dislikes e comentários de correção. Cada fato é verificado antes de ser usado — esta é a parte do trabalho que agrega valor real.

Fluxo de trabalho diário

1. Obter o repositório e planejar o dia

cd ~ && (git -C daily-shorts-media pull -q || git clone https://github.com/Hammadbaig-hub/daily-shorts-media.git)
pip install -q --break-system-packages kokoro-onnx soundfile pillow numpy
python daily-shorts-media/tools/scripts/plan_today.py daily-shorts-media/history.json

Se o repositório não estiver na sessão, anexe-o primeiro com add_repo (proprietário Hammadbaig-hub, repositório daily-shorts-media, acesso push) e clone-o.

plan_today.py retorna o lang de hoje, theme, se um vídeo já foi postado hoje e todos os tópicos usados até agora. Se posted_today for verdadeiro, pare e relate isso — nunca poste duas vezes no mesmo dia.

2. Escolher um tópico

Alterne entre categorias para manter o canal variado: espaço, animais, corpo humano, história, geografia, ciência, tecnologia, comida, oceano, invenções, linguagem e, aproximadamente, um dia em cada cinco, uma peça motivacional (uma lição ou hábito apoiado por um estudo real, ou uma história real bem documentada). Escolha algo que não esteja em already_done e que não seja quase uma duplicata dele.

Fique longe de: conselhos médicos ou dietéticos, política, debates sectários ou religiosos, qualquer coisa sobre pessoas reais privadas e "fatos" que são mitos comumente repetidos (por exemplo, memória de 3 segundos do peixinho dourado, a Grande Muralha ser visível do espaço).

3. Escrever o roteiro e verificá-lo

Escreva um gancho (menos de 12 palavras, baseado em curiosidade), 3 a 5 fatos (cada um uma frase, com menos de 25 palavras) e uma CTA.

Para cada fato, execute uma WebSearch e confirme-o a partir de uma fonte confiável (NASA, National Geographic, Britannica, uma universidade, um estudo revisado por pares, uma enciclopédia importante). Se um fato não puder ser confirmado, ou as fontes discordarem, descarte-o e use outro. Mantenha as URLs das fontes — elas vão na descrição.

Dias em urdu: escreva urdu natural e simples em script urdu (não urdu romanizado), da forma que um espectador paquistanês fala — não uma tradução palavra por palavra. Escreva números como palavras em urdu (بیس فیصد, ہزاروں) para que a voz os pronuncie corretamente.

Exemplos de CTA — EN: "Follow Bright Life for a new fact every day". UR: "روزانہ نئے حقائق کے لیے برائٹ لائف کو فالو کریں".

Salve como script.json:

{"lang": "en", "hook": "...", "facts": ["...", "..."], "cta": "...",
 "handle": "@Bright-Life-m4", "theme": 2}

4. Renderizar

python daily-shorts-media/tools/scripts/make_short.py script.json daily-shorts-media/videos/<data>-<slug>.mp4 > render.log 2>&1

A renderização leva cerca de 5 minutos na CPU, então execute-a com run_in_background do Bash e aguarde o aviso de conclusão. Não espere com um loop pgrep -f make_short — ele corresponde à própria linha de comando e nunca termina. A duração segue a narração — geralmente 25 a 45 segundos para 3 a 5 fatos. Mantenha abaixo de 55 segundos para que continue sendo um Short: se os fatos forem longos, use 3 em vez de 5.

Como o texto é falado, escreva-o para ser ouvido: escreva símbolos estranhos por extenso ("percent", não "%" em inglês; "فیصد" em urdu), evite colchetes e abreviações, e mantenha as frases curtas para que a voz não se apresse. Em seguida, capture um quadro e observe-o com Read para detectar estouro de texto ou urdu quebrado:

ffmpeg -loglevel error -y -ss 5.5 -i <video> -frames:v 1 check.png

Se o texto sair da borda ou parecer errado, encurte essa linha e renderize novamente.

5. Enviar para o GitHub

Adicione a entrada de hoje ao history.json: {"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}

Mantenha apenas os 20 arquivos .mp4 mais recentes em videos/ (exclua os mais antigos — eles já estão no YouTube) para que o repositório permaneça pequeno. Então:

cd daily-shorts-media && git add -A && git commit -qm "Short <data>: <tópico>" && git push -q

URL pública: https://raw.githubusercontent.com/Hammadbaig-hub/daily-shorts-media/main/videos/<arquivo>.mp4

Verifique se retorna 200 antes de agendar (curl -sI <url> | head -1); se o workspace não conseguir acessar esse host, confie no push bem-sucedido e continue.

6. Agendar no YouTube através do Metricool

Chame createScheduledPost com blogId 7592220, um date de nível superior (YYYY-MM-DDT19:00:00+05:00 — a chamada falha sem ele), e este JSON info (o Metricool copia o vídeo para seu próprio armazenamento, então o arquivo do GitHub pode ser podado posteriormente):

{
  "providers": [{"network": "youtube"}],
  "text": "<descrição>",
  "media": ["<URL bruta do GitHub>"],
  "publicationDate": {"dateTime": "YYYY-MM-DDT19:00:00", "timezone": "Asia/Karachi"},
  "autoPublish": true,
  "draft": false,
  "descendants": [], "firstCommentText": "", "hasNotReadNotes": false,
  "mediaAltText": [], "shortener": false, "smartLinkData": {"ids": []},
  "youtubeData": {
    "title": "<título>",
    "type": "short",
    "privacy": "public",
    "tags": ["facts", "did you know", "..."],
    "category": "EDUCATION",
    "madeForKids": false,
    "isAiGeneratedContent": false
  }
}

isAiGeneratedContent é falso porque o vídeo é texto animado simples, não imagens sintéticas realistas; a divulgação do YouTube é destinada a mídia alterada realista. Se uma versão posterior adicionar imagens realistas geradas por IA ou vozes, defina-o como verdadeiro.

Título: menos de 70 caracteres, gancho de curiosidade + #shorts. Escreva-o no idioma do dia. Exemplo: Your Brain Can't Feel Pain?! 🧠 #shorts

Descrição: 2 a 3 linhas expandindo o gancho, depois Sources: com as URLs que você verificou, depois 3 a 5 hashtags (#facts #didyouknow #shorts mais tags do tópico; dias em urdu adicionam #urdu #urdufacts).

7. Relatar

Informe ao usuário em urdu romanizado, em algumas linhas: tópico, idioma, título, horário agendado e o plannerUrl do Metricool. Se estiver executando como uma tarefa agendada sem ninguém assistindo, envie esse resumo com SendUserMessage.

Verificação semanal (domingos, ou quando perguntado "channel kaisa chal raha hai")

Use getAnalyticsDataByMetrics para a rede do YouTube nos últimos 7 dias (visualizações, tempo de exibição, inscritos ganhos, principais vídeos). Resuma o que funcionou — quais categorias e qual idioma obtiveram mais visualizações — e use isso para direcionar as escolhas de tópicos da próxima semana para o que tem melhor desempenho. Mantenha a alternância de idiomas, a menos que o usuário diga o contrário.

Quando algo falha

  • Metricool rejeita a postagem: relate o erro exato; não tente novamente a mesma entrada. Causas comuns: falta de date de nível superior, URL do vídeo ainda não acessível (espere um minuto, tente novamente uma vez), ou a conexão do YouTube no Metricool expirou (o usuário deve reconectá-la no Metricool).
  • Git push falha: o repositório não está anexado com acesso de push — chame add_repo com access: push. Se ainda disser que Claude não tem acesso ao GitHub, o aplicativo GitHub do Claude deve ter daily-shorts-media em seus repositórios selecionados (github.com/settings/installations → Claude → Configurar); o usuário confirma essa etapa por conta própria porque o GitHub solicita 2FA.
  • Fontes ausentes: elas estão em tools/assets/fonts/ no repositório; o script as lê de lá.
  • Falha no download do modelo de voz: renderize com "voice": false em script.json para que o vídeo do dia ainda seja publicado (apenas música) e mencione isso no relatório.

Habilidades Relacionadas