Was macht youtube-publish?
YouTube Data API v3 Uploader ohne SDK-Abhängigkeit (reines fetch, wiederaufsetzbarer
Chunk-Upload). Entwickelt für Batches: standardmäßig privat, ein SHA256-Ledger, sodass
ein erneuter Durchlauf nie doppelt postet, Metadaten-Prüfung, Dry-Run und Quota-Bewusstsein.
Einmalige Einrichtung (der Benutzer führt dies aus, nicht der Agent)
- Google Cloud Console: Projekt erstellen, YouTube Data API v3 aktivieren, einen OAuth-Client-ID vom Typ Desktop-App erstellen.
- Client dem Skript bereitstellen, ohne es zu committen:
export YOUTUBE_CLIENT_ID=... YOUTUBE_CLIENT_SECRET=...(oder die heruntergeladene JSON außerhalb des Repos behalten und--client-secretsübergeben). - Kanal einmal autorisieren:
Öffnet die Zustimmungsseite, fängt die Weiterleitung auf 127.0.0.1 ab (PKCE + State- Prüfung), speichert das Refresh-Token mit Modus 600. Der Token wird niemals ausgegeben.node scripts/auth.mjs --token-file .youtube-token.json
Arbeitsablauf
# 1. Dry Run: prüft Metadaten, hasht Dateien, zeigt Überspringen/Hochladen-Plan und Quota-Kosten
node scripts/upload.mjs --jobs jobs.json --dry-run
# 2. Hochladen (standardmäßig privat)
node scripts/upload.mjs --jobs jobs.json --token-file .youtube-token.json
# einzelne Datei
node scripts/upload.mjs --file publish/short.mp4 --title "How I automated my edits" --tags shorts,automation --privacy unlisted
jobs.json:
[
{ "file": "publish/short-01.mp4", "title": "...", "description": "...", "tags": ["shorts"], "privacy": "private" },
{ "file": "publish/short-02.mp4", "title": "...", "privacy": "private", "publishAt": "2026-11-01T17:00:00Z" }
]
Relative file-Pfade werden relativ zum Ordner der Jobs-Datei aufgelöst.
Regeln
- Nur Dateien hochladen, die den
render-qcbestanden haben und vom Benutzer genehmigt wurden. - Standard-Datenschutz ist
private.publicwird verweigert, es sei denn, der Benutzer hat explizit danach gefragt und du übergibst--allow-public. Geplante Videos (publishAt) müssenprivatesein; YouTube schaltet sie zu diesem Zeitpunkt auf öffentlich um. - Immer zuerst
--dry-runund den Plan dem Benutzer anzeigen. - Niemals Tokens, Client-Secrets,
.env*-Dateien oder das Ledger ausgeben, protokollieren oder committen. Die.gitignoredes Repos deckt*token*.json,*credentials*.json,*client_secret*.json,.env*und*ledger*.jsonab. - Das Ledger (
.youtube-upload-ledger.json) ist die maßgebliche Quelle dafür, was gepostet wurde. Es wird nach jedem einzelnen Upload gespeichert. Lösche es nicht, um es „erneut zu versuchen“; verwende--force-duplicatenur, wenn der Benutzer wirklich eine zweite Kopie möchte. - Quota: Ein Projekt hat standardmäßig 10.000 Einheiten/Tag und ein Upload hat historisch 1.600 Einheiten gekostet (ca. 6 Uploads/Tag).
--max-uploads(Standard 6) stoppt einen Durchlauf, bevor die Quota aufgebraucht ist;--units-per-uploadpasst die Schätzung an, falls Google die Kosten ändert. BeiquotaExceededstoppt der Durchlauf und die verbleibenden Jobs können am nächsten Tag erneut ausgeführt werden (das Ledger überspringt die erledigten). - Titel: keine Platzhalter (TODO, untitled,
{{...}}), maximal 100 Zeichen, keine<oder>. Tags insgesamt maximal 500 Zeichen. Die Prüfung setzt dies durch. - Nicht verifizierte API-Projekte können Uploads bis zur Überprüfung der App durch Google auf privat erzwingen; informiere den Benutzer, wenn jeder Upload als privat zurückkommt.
Überprüfen
Jedes Ergebnis enthält eine videoId (öffne https://youtu.be/<id>, während es noch
privat ist) oder einen skipped-Grund. node scripts/upload.mjs --check-auth testet
Anmeldeinformationen, ohne hochzuladen.