Communitygithub.com

Hammadbaig-hub/daily-shorts-media

Erstellt und veröffentlicht automatisch ein animiertes Text-YouTube Short pro Tag (Fakten/Motivation) – mit Themenauswahl, Faktencheck, Videorendering und Zeitplanung über GitHub und Metricool. Abwechselnd Englisch und Urdu.

Was ist daily-shorts-media?

Dieses Skill automatisiert die tägliche Erstellung und Veröffentlichung von YouTube Shorts für den Kanal 'Bright Life'. Es wählt ein neues Thema aus einer vordefinierten Kategorieliste (Weltraum, Tiere, Geschichte, etc.), schreibt einen kurzen Fakten- oder Motivationstext und überprüft jede Behauptung per Websuche anhand vertrauenswürdiger Quellen. Das Video wird mit Python-Bibliotheken (Pillow, ffmpeg) als 1080x1920-Animation gerendert, eine Sprachausgabe wird mit dem lokalen TTS-Modell Kokoro hinzugefügt – alles ohne Cloud-Kosten oder API-Credits. Die Veröffentlichung erfolgt über Metricool, wobei das Video auf GitHub gehostet und von dort abgerufen wird. Das Skill unterstützt abwechselnd Englisch und Urdu und läuft vollautomatisch – der Benutzer kann jederzeit mit Befehlen wie 'aaj ki video bana do' oder 'YouTube wala kaam kar do' die Erstellung anstoßen oder den Kanalstatus abfragen.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

YouTube Daily Shorts

Ein Short pro Tag, vollautomatisch, kostenlos. Der Kanal postet „Wusstest du schon?“-Fakten und kurze Motivationstexte, einen Tag auf Englisch, den nächsten auf Urdu.

Feste Einstellungen (hier ändern, wenn der Benutzer sie ändert)

EinstellungWert
GitHub-Medien-RepoHammadbaig-hub/daily-shorts-media (öffentlich, Branch main) – enthält auch die Rendering-Werkzeuge in tools/
Metricool-Marke (blogId)7592220, Zeitzone Asia/Karachi
Kanal„Bright Life“, Handle @Bright-Life-m4 (Handle in script.json eintragen; CTA erwähnt „Bright Life“)
Veröffentlichungszeit19:00 Pakistan-Zeit (oder der nächste freie Slot, falls diese Zeit bereits verstrichen ist; mindestens 15 Minuten ab jetzt)
Sichtbarkeitöffentlich (Benutzer hat vollautomatischen Upload gewählt)

Warum es so aufgebaut ist

  • Kostenlos: Der Benutzer hat kein Budget, daher wird das Video mit Pillow + ffmpeg gezeichnet (tools/scripts/make_short.py im Repo) und die Musik im selben Skript synthetisiert, was auch bedeutet, dass es keine Content-ID-Urheberrechtsansprüche gibt.
  • Sprachausgabe: Der Kommentar kommt von Kokoro, einem kleinen, kostenlosen neuronalen TTS-Modell, das offline auf der CPU läuft (tools/scripts/voice.py). Die Modell-Dateien (~350 MB) werden einmalig von GitHub Releases nach ~/tts heruntergeladen. Englisch verwendet am_michael; Urdu wird von der Hindi-Stimme hm_omega mit Urdu-Text gesprochen, wobei einige Phoneme umgemappt werden. Jede Folie dauert so lange wie ihre Sprachausgabe, und die Musik wird darunter geduckt. Cloud-TTS (Microsoft/Google) ist im Workspace blockiert, daher die lokale Lösung.
  • GitHub-Hosting: Metricool benötigt eine öffentliche Video-URL. Der Cloud-Workspace kann auf GitHub pushen, und die Raw-Datei-URL ist öffentlich, das ist die Brücke.
  • Faktencheck: Ein Faktenkanal steht und fällt mit seiner Glaubwürdigkeit. YouTube unterdrückt massenhaft produzierte, minderwertige oder irreführende Inhalte, und falsche „Fakten“ laden zu Dislikes und Korrekturkommentaren ein. Jeder Fakt wird vor der Verwendung überprüft – das ist der Teil der Arbeit, der echten Mehrwert schafft.

Täglicher Arbeitsablauf

1. Repo holen und Tag planen

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

Wenn das Repo nicht in der Sitzung ist, zuerst mit add_repo anbinden (Besitzer Hammadbaig-hub, Repo daily-shorts-media, Zugriff push) und klonen.

plan_today.py gibt die heutige lang, das theme, zurück, ob heute bereits ein Video gepostet wurde, und alle bisher verwendeten Themen. Wenn posted_today wahr ist, anhalten und melden – niemals zweimal an einem Tag posten.

2. Thema auswählen

Durch die Kategorien rotieren, damit der Kanal abwechslungsreich bleibt: Weltraum, Tiere, menschlicher Körper, Geschichte, Geographie, Wissenschaft, Technologie, Essen, Ozean, Erfindungen, Sprache, und ungefähr jeder fünfte Tag ein Motivationsteil (eine durch eine echte Studie oder eine gut dokumentierte wahre Geschichte gestützte Lektion oder Gewohnheit). Etwas auswählen, das nicht in already_done ist und kein beinahes Duplikat davon ist.

Vermeiden: medizinische oder Ernährungsratschläge, Politik, konfessionelle oder religiöse Debatten, alles über echte Privatpersonen und „Fakten“, die oft wiederholte Mythen sind (z. B. Goldfische mit 3-Sekunden-Gedächtnis, die Große Mauer, die vom Weltraum aus sichtbar ist).

3. Skript schreiben und verifizieren

Einen Hook schreiben (unter 12 Wörter, neugierig machend), 3–5 Fakten (jeweils ein Satz, unter 25 Wörter) und einen CTA.

Für jeden Fakt eine Websuche durchführen und aus einer zuverlässigen Quelle bestätigen (NASA, National Geographic, Britannica, eine Universität, eine begutachtete Studie, eine große Enzyklopädie). Wenn ein Fakt nicht bestätigt werden kann oder Quellen widersprüchlich sind, ihn verwerfen und einen anderen verwenden. Die Quell-URLs aufbewahren – sie kommen in die Beschreibung.

Urdu-Tage: Natürliches, einfaches Urdu in Urdu-Schrift schreiben (nicht in Roman-Urdu), so wie ein pakistanischer Zuschauer spricht – keine wortwörtliche Übersetzung. Zahlen als Urdu-Wörter schreiben (بیس فیصد, ہزاروں), damit die Stimme sie korrekt ausspricht.

CTA-Beispiele – EN: „Follow Bright Life for a new fact every day“. UR: „روزانہ نئے حقائق کے لیے برائٹ لائف کو فالو کریں“.

Als script.json speichern:

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

4. Rendern

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

Das Rendern dauert auf der CPU etwa 5 Minuten, also mit Bash run_in_background ausführen und auf die Fertigstellungsmeldung warten. Nicht mit einer pgrep -f make_short-Schleife warten – sie matcht die eigene Befehlszeile und endet nie. Die Länge folgt der Sprachausgabe – normalerweise 25–45 s für 3–5 Fakten. Unter 55 s bleiben, damit es ein Short bleibt: Wenn die Fakten lang sind, 3 statt 5 verwenden.

Da der Text gesprochen wird, für das Hören schreiben: Umständliche Symbole ausschreiben („Prozent“, nicht „%“ auf Englisch; „فیصد“ auf Urdu), Klammern und Abkürzungen vermeiden und Sätze kurz halten, damit die Stimme nicht hetzt. Dann einen Frame ziehen und mit Lesen prüfen, um Textüberlauf oder kaputtes Urdu zu erkennen:

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

Wenn Text über den Rand läuft oder falsch aussieht, diese Zeile kürzen und neu rendern.

5. Auf GitHub pushen

Den heutigen Eintrag an history.json anhängen: {"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}

Nur die 20 neuesten .mp4-Dateien in videos/ behalten (ältere löschen – sie sind bereits auf YouTube), damit das Repo klein bleibt. Dann:

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

Öffentliche URL: https://raw.githubusercontent.com/Hammadbaig-hub/daily-shorts-media/main/videos/<Datei>.mp4

Vor der Zeitplanung prüfen, ob sie 200 zurückgibt (curl -sI <URL> | head -1); wenn der Workspace diesen Host nicht erreichen kann, dem erfolgreichen Push vertrauen und fortfahren.

6. Auf YouTube über Metricool planen

createScheduledPost mit blogId 7592220, einem top-level date aufrufen (YYYY-MM-DDT19:00:00+05:00 – der Aufruf schlägt ohne fehl), und diesem info-JSON (Metricool kopiert das Video in seinen eigenen Speicher, daher kann die GitHub-Datei später entfernt werden):

{
  "providers": [{"network": "youtube"}],
  "text": "<Beschreibung>",
  "media": ["<Raw-GitHub-URL>"],
  "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": "<Titel>",
    "type": "short",
    "privacy": "public",
    "tags": ["facts", "did you know", "..."],
    "category": "EDUCATION",
    "madeForKids": false,
    "isAiGeneratedContent": false
  }
}

isAiGeneratedContent ist false, weil das Video einfacher animierter Text ist, kein realistisches synthetisches Material; YouTubes Offenlegungspflicht gilt für realistische veränderte Medien. Wenn eine spätere Version KI-generierte realistische Bilder oder Stimmen hinzufügt, auf true setzen.

Titel: unter 70 Zeichen, Neugier-Hook + #shorts. In der Sprache des Tages schreiben. Beispiel: Your Brain Can't Feel Pain?! 🧠 #shorts

Beschreibung: 2–3 Zeilen, die den Hook erweitern, dann Sources: mit den überprüften URLs, dann 3–5 Hashtags (#facts #didyouknow #shorts plus Themen-Tags; Urdu-Tage fügen #urdu #urdufacts hinzu).

7. Bericht

Dem Benutzer in Roman-Urdu, in wenigen Zeilen mitteilen: Thema, Sprache, Titel, geplante Zeit und die Metricool plannerUrl. Wenn als geplanter Task ohne Zuschauer laufend, diese Zusammenfassung mit SendUserMessage senden.

Wöchentlicher Check (sonntags oder wenn gefragt wird „channel kaisa chal raha hai“)

getAnalyticsDataByMetrics für das YouTube-Netzwerk der letzten 7 Tage verwenden (Aufrufe, Watchtime, gewonnene Abonnenten, Top-Videos). Zusammenfassen, was funktioniert hat – welche Kategorien und welche Sprache mehr Aufrufe erhalten haben – und das nutzen, um die Themenauswahl der nächsten Woche in Richtung des Erfolgreichen zu lenken. Die abwechselnde Sprache beibehalten, es sei denn, der Benutzer sagt etwas anderes.

Wenn etwas fehlschlägt

  • Metricool lehnt den Beitrag ab: Den genauen Fehler melden; nicht dieselbe Eingabe wiederholen. Häufige Ursachen: fehlendes top-level date, Video-URL noch nicht erreichbar (eine Minute warten, einmal wiederholen), oder die YouTube-Verbindung in Metricool ist abgelaufen (Benutzer muss sie in Metricool neu verbinden).
  • Git-Push schlägt fehl: Das Repo ist nicht mit Push-Zugriff angebunden – add_repo mit access: push aufrufen. Wenn es immer noch sagt, dass Claude keinen GitHub-Zugriff hat, muss die Claude GitHub App daily-shorts-media in ihren ausgewählten Repositorys haben (github.com/settings/installations → Claude → Configure); der Benutzer bestätigt diesen Schritt selbst, weil GitHub nach 2FA fragt.
  • Schriftarten fehlen: Sie liegen in tools/assets/fonts/ im Repo; das Skript liest sie von dort.
  • Sprachmodell-Download schlägt fehl: Mit "voice": false in script.json rendern, damit das Tagesvideo trotzdem rausgeht (nur Musik), und im Bericht erwähnen.

Verwandte Skills