Que fait youtube-publish ?
Téléchargeur via l'API Data v3 de YouTube sans dépendance SDK (simple fetch, téléchargement fractionné reprenable). Conçu pour les lots : privé par défaut, un registre sha256 pour éviter les doublons lors des ré-exécutions, vérification des métadonnées, dry-run et gestion du quota.
Configuration unique (l'utilisateur fait ceci, pas l'agent)
- Google Cloud Console : créez un projet, activez YouTube Data API v3, créez un ID client OAuth de type Application de bureau.
- Fournissez le client aux scripts sans le versionner :
export YOUTUBE_CLIENT_ID=... YOUTUBE_CLIENT_SECRET=...(ou conservez le JSON téléchargé en dehors du dépôt et passez--client-secrets). - Autorisez la chaîne une fois :
Ouvre la page de consentement, capture la redirection sur 127.0.0.1 (PKCE + vérification d'état), stocke le token de rafraîchissement avec les droits 600. Le token n'est jamais affiché.node scripts/auth.mjs --token-file .youtube-token.json
Flux de travail
# 1. dry-run : valide les métadonnées, hache les fichiers, affiche le plan d'upload/skip et le coût en quota
node scripts/upload.mjs --jobs jobs.json --dry-run
# 2. upload (privé par défaut)
node scripts/upload.mjs --jobs jobs.json --token-file .youtube-token.json
# fichier unique
node scripts/upload.mjs --file publish/short.mp4 --title "Comment j'ai automatisé mes montages" --tags shorts,automatisation --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" }
]
Les chemins file relatifs sont résolus par rapport au dossier du fichier jobs.
Règles
- Ne téléchargez que les fichiers ayant passé
render-qcet approuvés par l'utilisateur. - La confidentialité par défaut est
private.publicest refusé sauf si l'utilisateur l'a explicitement demandé et que vous passez--allow-public. Les vidéos programmées (publishAt) doivent êtreprivate; YouTube les rend publiques à ce moment-là. - Toujours faire un
--dry-rund'abord et montrer le plan à l'utilisateur. - Ne jamais afficher, journaliser ou versionner les tokens, secrets clients, fichiers
.env*ou le registre. Le.gitignoredu dépôt couvre*token*.json,*credentials*.json,*client_secret*.json,.env*et*ledger*.json. - Le registre (
.youtube-upload-ledger.json) est la source de vérité pour ce qui a été publié. Il est sauvegardé après chaque upload. Ne le supprimez pas pour « réessayer » ; utilisez--force-duplicateuniquement si l'utilisateur veut vraiment une deuxième copie. - Quota : un projet obtient 10 000 unités/jour par défaut et un upload coûte historiquement 1 600 unités (environ 6 uploads/jour).
--max-uploads(par défaut 6) arrête une exécution avant d'épuiser le quota ;--units-per-uploadajuste l'estimation si Google modifie le coût. En cas dequotaExceeded, l'exécution s'arrête et les jobs restants peuvent être relancés le lendemain (le registre ignore ceux déjà faits). - Titres : pas de placeholders (TODO, untitled,
{{...}}), maximum 100 caractères, pas de<ou>. Tags : maximum 500 caractères au total. La vérification applique cela. - Les projets API non vérifiés peuvent forcer les uploads en privé jusqu'à ce que Google audite l'application ; informez l'utilisateur si chaque upload revient privé.
Vérification
Chaque résultat a un videoId (ouvrez https://youtu.be/<id> tant qu'il est encore privé) ou une raison skipped. node scripts/upload.mjs --check-auth teste les identifiants sans télécharger.