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ón | Valor |
|---|---|
| Repositorio de medios en GitHub | Hammadbaig-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ón | 19:00 hora de Pakistán (o el siguiente espacio libre si ya pasó; al menos 15 minutos desde ahora) |
| Privacidad | pú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.pyen 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 usaam_michael; el urdu lo pronuncia la voz hindihm_omegaa 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
datede 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_repoconaccess: push. Si todavía dice que Claude no tiene acceso a GitHub, la aplicación de GitHub de Claude debe tenerdaily-shorts-mediaen 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": falseen script.json para que el video del día salga igual (solo música), y menciónalo en el informe.