Communitygithub.com

Hammadbaig-hub/daily-shorts-media

Crea y publica automáticamente un YouTube Short diario de texto animado sobre datos curiosos o motivación, alternando entre inglés y urdu, sin coste alguno.

¿Qué es daily-shorts-media?

Este skill automatiza la creación y publicación diaria de un YouTube Short de 1080x1920 píxeles con texto animado y narración generada por IA gratuita, sin utilizar créditos de servicios de IA de pago. Está diseñado para el canal 'Bright Life' (@Bright-Life-m4) y utiliza GitHub para alojar los videos, Metricool para programarlos en YouTube, y herramientas como Pillow, ffmpeg y Kokoro (TTS offline) para la producción. El flujo de trabajo incluye la selección de un tema novedoso (evitando repeticiones y temas sensibles), la verificación de cada dato mediante búsqueda web, la generación del video, la subida a GitHub y la programación en YouTube a las 19:00 hora de Pakistán. Soporta los lenguajes inglés y urdu en días alternos, y proporciona un informe al usuario en urdu romanizado. Además, incluye una verificación semanal de rendimiento usando las analíticas de Metricool para ajustar la selección de temas futuros.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

YouTube Shorts Diarios

Un Short por día, completamente automático, sin coste alguno. El canal publica datos curiosos estilo "¿Sabías que...?" y piezas cortas de motivación, un día en inglés y al siguiente en urdu.

Configuración fija (cámbiala aquí si el usuario la modifica)

ConfiguraciónValor
Repositorio de medios en GitHubHammadbaig-hub/daily-shorts-media (público, rama main) — también contiene las herramientas de renderizado en tools/
Marca en Metricool (blogId)7592220, zona horaria Asia/Karachi
Canal"Bright Life", handle @Bright-Life-m4 (pon el handle en script.json; la CTA menciona "Bright Life")
Hora de publicación19:00 hora de Pakistán (o el siguiente espacio libre si ya pasó; al menos 15 minutos desde ahora)
Privacidadpúblico (el usuario eligió subida automática completa)

Por qué está construido así

  • Gratuito: el usuario no tiene presupuesto, así que el video se dibuja con Pillow + ffmpeg (tools/scripts/make_short.py en el repositorio) y la música se sintetiza en el mismo script, lo que también evita reclamaciones de derechos de autor de Content ID.
  • Locución: la narración proviene de Kokoro, un pequeño modelo de TTS neuronal gratuito que se ejecuta sin conexión en la CPU (tools/scripts/voice.py). Sus archivos de modelo de ~350 MB se descargan una vez desde los lanzamientos de GitHub en ~/tts. El inglés usa am_michael; el urdu lo pronuncia la voz hindi hm_omega a partir de texto en escritura urdu, con algunos fonemas reasignados. Cada diapositiva dura lo que su narración, y la música se atenúa debajo. El TTS en la nube (Microsoft/Google) está bloqueado desde el espacio de trabajo, por eso es offline.
  • Alojamiento en GitHub: Metricool necesita una URL de video pública. El espacio de trabajo en la nube puede hacer push a GitHub, y la URL del archivo raw es pública, por lo que ese es el puente.
  • Verificación de datos: un canal de datos curiosos vive o muere por su precisión. YouTube también suprime contenido producido en masa, de bajo valor o engañoso, y un "dato" incorrecto invita a dislikes y comentarios de corrección. Cada dato se verifica antes de usarlo — esta es la parte del trabajo que aporta valor real.

Flujo de trabajo diario

1. Obtener el repositorio y planificar el día

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

Si el repositorio no está en la sesión, primero adjúntalo con add_repo (propietario Hammadbaig-hub, repositorio daily-shorts-media, acceso push) y clónalo.

plan_today.py devuelve el lang, theme de hoy, si ya se publicó un video hoy y todos los temas usados hasta ahora. Si posted_today es verdadero, detente e infórmalo — nunca publiques dos veces en un día.

2. Elegir un tema

Rota entre categorías para que el canal se mantenga variado: espacio, animales, cuerpo humano, historia, geografía, ciencia, tecnología, comida, océano, inventos, idiomas y aproximadamente un día de cada cinco una pieza de motivación (una lección o hábito respaldado por un estudio real, o una historia real bien documentada). Elige algo que no esté en already_done y que no sea casi un duplicado.

Mantente alejado de: consejos médicos o dietéticos, política, debates sectarios o religiosos, cualquier cosa sobre personas reales privadas y "datos" que sean mitos comúnmente repetidos (por ejemplo, la memoria de 3 segundos del pez dorado, la Gran Muralla visible desde el espacio).

3. Escribir el guion y verificarlo

Escribe un gancho (menos de 12 palabras, que despierte curiosidad), 3–5 datos (cada uno una oración, menos de 25 palabras) y una CTA.

Para cada dato, ejecuta una Búsqueda Web y confírmalo desde una fuente confiable (NASA, National Geographic, Britannica, una universidad, un estudio revisado por pares, una enciclopedia importante). Si un dato no se puede confirmar, o las fuentes discrepan, descártalo y usa otro. Guarda las URL de las fuentes — van en la descripción.

Días en urdu: escribe urdu natural y simple en escritura urdu (no urdu romanizado), como hablaría un espectador paquistaní — no una traducción palabra por palabra. Escribe los números como palabras en urdu (بیس فیصد, ہزاروں) para que la voz los pronuncie correctamente.

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

Guarda 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/<fecha>-<slug>.mp4 > render.log 2>&1

El renderizado toma unos 5 minutos en CPU, así que ejecútalo con Bash run_in_background y espera el aviso de finalización. No esperes con un bucle pgrep -f make_short — coincide con su propia línea de comandos y nunca termina. La duración sigue la narración — normalmente 25–45 s para 3–5 datos. Mantenlo por debajo de 55 s para que siga siendo un Short: si los datos son largos, usa 3 en lugar de 5.

Como el texto se habla, escríbelo para ser escuchado: escribe los símbolos extraños ("por ciento", no "%" en inglés; "فیصد" en urdu), evita corchetes y abreviaturas, y mantén las oraciones cortas para que la voz no se apresure. Luego toma un fotograma y míralo con Read para detectar desbordamiento de texto o urdu roto:

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

Si el texto se sale del borde o se ve mal, acorta esa línea y vuelve a renderizar.

5. Hacer push a GitHub

Añade la entrada de hoy a history.json: {"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}

Mantén solo los 20 archivos .mp4 más recientes en videos/ (elimina los más antiguos — ya están en YouTube) para que el repositorio se mantenga pequeño. Luego:

cd daily-shorts-media && git add -A && git commit -qm "Short <fecha>: <tema>" && git push -q

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

Verifica que devuelve 200 antes de programar (curl -sI <url> | head -1); si el espacio de trabajo no puede alcanzar ese host, confía en el push exitoso y continúa.

6. Programar en YouTube a través de Metricool

Llama a createScheduledPost con blogId 7592220, una date de nivel superior (YYYY-MM-DDT19:00:00+05:00 — la llamada falla sin ella), y este JSON info (Metricool copia el video en su propio almacenamiento, por lo que el archivo de GitHub se puede eliminar después):

{
  "providers": [{"network": "youtube"}],
  "text": "<descripción>",
  "media": ["<URL raw de 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 es falso porque el video es texto animado simple, no material sintético realista; la divulgación de YouTube está destinada a medios alterados realistas. Si una versión posterior agrega imágenes realistas o voces generadas por IA, configúralo como verdadero.

Título: menos de 70 caracteres, gancho de curiosidad + #shorts. Escríbelo en el idioma del día. Ejemplo: Your Brain Can't Feel Pain?! 🧠 #shorts

Descripción: 2–3 líneas expandiendo el gancho, luego Sources: con las URL que verificaste, luego 3–5 hashtags (#facts #didyouknow #shorts más etiquetas del tema; los días en urdu añaden #urdu #urdufacts).

7. Informar

Informa al usuario en urdu romanizado, en unas pocas líneas: tema, idioma, título, hora programada y el plannerUrl de Metricool. Si se ejecuta como una tarea programada sin nadie mirando, envía ese resumen con SendUserMessage.

Verificación semanal (domingos, o cuando pregunte "channel kaisa chal raha hai")

Usa getAnalyticsDataByMetrics para la red de YouTube de los últimos 7 días (vistas, tiempo de visualización, suscriptores ganados, videos principales). Resume lo que funcionó — qué categorías y qué idioma obtuvieron más vistas — y úsalo para inclinar las elecciones de temas de la próxima semana hacia lo que funciona bien. Mantén la alternancia de idiomas a menos que el usuario diga lo contrario.

Cuando algo falla

  • Metricool rechaza la publicación: informa el error exacto; no reintentes la misma entrada. Causas comunes: falta la date de nivel superior, la URL del video aún no es accesible (espera un minuto, reintenta una vez), o la conexión de YouTube en Metricool expiró (el usuario debe reconectarla en Metricool).
  • El push a Git falla: el repositorio no está adjunto con acceso de push — llama a add_repo con access: push. Si todavía dice que Claude no tiene acceso a GitHub, la aplicación de GitHub de Claude debe tener daily-shorts-media en sus repositorios seleccionados (github.com/settings/installations → Claude → Configurar); el usuario confirma ese paso él mismo porque GitHub solicita 2FA.
  • Faltan fuentes: viven en tools/assets/fonts/ en el repositorio; el script las lee desde allí.
  • Falla la descarga del modelo de voz: renderiza con "voice": false en script.json para que el video del día salga igual (solo música), y menciónalo en el informe.

Skills relacionados