Ce projet fournit une CLI en Python pour uploader et programmer la publication de vidéos sur YouTube via l'API YouTube Data v3.
- Python 3.9+ (recommandé)
- Un projet dans Google Cloud Console avec l'API YouTube Data v3 activée
- Identifiants OAuth 2.0 de type "Application Desktop" (fichier
client_secret.json) - ffmpeg installé sur votre système (requis par
yt-dlpet la commandeenhancepour l'encodage/merge) - (Optionnel) Variable d'environnement
OPENAI_API_KEYsi vous utilisez la génération IA (ai-meta)
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
pip install -r re
8000
quirements.txt- Placez votre fichier
client_secret.jsondansconfig/client_secret.json(dossier ignoré par git). - Fallback automatique: si non trouvé dans
config/, le script tentera./client_secret.jsonà la racine du projet. - Le premier lancement ouvrira votre navigateur pour autoriser l'application.
- Le token sera stocké dans
config/token.json.
Fichier: config/video.example.yaml
# Chemins de fichiers
video_path: ./video.mp4
thumbnail_path: ./thumbnail.jpg # optionnel
# Métadonnées
title: "Mon titre automatisé"
description: |
Ma description détaillée sur plusieurs lignes.
tags: ["automation", "python"]
category_id: 22 # 22 = People & Blogs (par défaut)
# Statut et planification
privacy_status: private # private | public | unlisted
publish_at: "2025-08-31T12:00:00Z" # Optionnel (RFC3339/UTC). Requiert privacy_status=private.
# Enfants (optionnel)
made_for_kids: false
# Amélioration qualité (optionnel)
enhance:
enabled: true # si true, améliore automatiquement avant upload
quality: youtube # low | medium | high | youtube | max (sert de préréglage par défaut)
codec: h264 # h264 | hevc | vp9 | av1
hwaccel: auto # none | auto | videotoolbox (auto => videotoolbox sur macOS)
scale: 1080p # 720p|1080p|1440p|2160p|WIDTHxHEIGHT|1.5x|2x
fps: 30 # optionnel
denoise: true # hqdn3d
sharpen: true # unsharp
deinterlace: false # yadif
color_fix: true # léger contraste/saturation
crf: 18 # ignoré si bitrate défini (par défaut selon preset, sinon 18)
bitrate: null # ex: "6M". Si défini, ignore CRF
preset: slow # ultrafast…veryslow (par défaut selon preset, sinon medium)
reencode_audio: true
audio_bitrate: "192k"Avec un fichier de config:
python main.py upload --config config/video.example.yamlPré-amélioration (ffmpeg) avant upload : activez enhance.enabled: true dans la config (voir ci-dessus),
ou utilisez le flag --pre-enhance et des overrides en ligne de commande :
python main.py upload --config config/video.example.yaml --pre-enhance \
--enhance-scale 1080p \
--enhance-denoise --enhance-sharpen --enhance-color-fix \
--enhance-crf 18 --enhance-preset slow \
--enhance-reencode-audioOverrides disponibles (équivalent aux options de enhance) :
--enhance-qualitylow | medium | high | youtube | max--enhance-codech264 | hevc | vp9 | av1--enhance-hwaccelnone | auto | videotoolbox--enhance-scale720p | 1080p | 1440p | 2160p | WIDTHxHEIGHT | 1.5x | 2x--enhance-fpsNombre (ex : 30)--enhance-denoise--enhance-sharpen--enhance-deinterlace--enhance-color-fix--enhance-crfEntier 0-51 (par défaut: selon preset, sinon 18)--enhance-bitrate(ex : 6M) — si défini, ignore CRF--enhance-presetultrafast…veryslow (par défaut: selon preset, sinon medium)--enhance-reencode-audio--enhance-audio-bitrate(par défaut 192k)--enhance-outputpour le fichier de sortie (par défaut<video>.enhanced.mp4)
Sans fichier de config (arguments explicites):
python main.py upload \
--video ./video.mp4 \
--title "Titre" \
--description "Description" \
--tags automation python \
--category-id 22 \
--privacy private \
--publish-at "2025-08-31T12:00:00Z" \
--thumbnail ./thumbnail.jpgChemins OAuth personnalisés (optionnels):
python main.py upload --config config/video.example.yaml \
--client-secrets config/client_secret.json \
--token-file config/token.jsonNotes:
- Pour une planification, YouTube requiert généralement
privacy_status=privateau moment de l'upload avecpublish_atau format RFC3339 UTC (suffixeZ). - L'upload est repris automatiquement (resumable upload) et inclut un backoff exponentiel pour les erreurs temporaires.
Nécessite d'avoir OPENAI_API_KEY dans votre environnement. Exemple :
export OPENAI_API_KEY=sk-xxxx
python main.py ai-meta \
--topic "Automatiser YouTube avec Python" \
--target-keywords python automation api \
--language fr \
--tone informatif \
--model gpt-4o-mini \
--out-config config/video.yaml \
--video-path ./video.mp4 \
--printCette commande affiche un aperçu (titre, description, tags) et peut écrire directement ces champs dans un YAML (--out-config).
Télécharger une vidéo avec yt-dlp et convertir en mp4 (si possible) :
python main.py ingest "https://www.youtube.com/watch?v=XXXXXXXXX" \
--output-dir downloads \
--ext mp4La commande renvoie le chemin complet du fichier téléchargé.
Améliorer la qualité d'une vidéo (upscale, débruitage, netteté, désentrelacement, correction légère) via ffmpeg :
python main.py enhance \
--input ./input.mp4 \
--output outputs/enhanced.mp4 \
--quality youtube \
--codec h264 \
--hwaccel auto \
--denoise --sharpen --color-fix \
--reencode-audioOptions utiles :
--scale: 720p | 1080p | 1440p | 2160p | WIDTHxHEIGHT | 1.5x | 2x--fps: forcer la cadence (ex: 30)--denoise: réduction de bruit (hqdn3d)--sharpen: renforcer la netteté (unsharp)--deinterlace: désentrelacer (yadif)--color-fix: léger ajustement contraste/saturation--quality: préréglage global (low | medium | high | youtube | max)--codec: h264 | hevc | vp9 | av1--hwaccel: none | auto | videotoolbox (auto => videotoolbox sur macOS)--crf: qualité H.264 (0-51, plus bas = meilleure qualité, par défaut selon preset, sinon 18)--bitrate: fixe un débit vidéo (ex: 6M) au lieu d'un CRF--preset: préréglage x264 (ultrafast…veryslow; par défaut selon preset, sinon medium)--reencode-audioet--audio-bitrate: réencoder l'audio en AAC
Remarques codecs :
hevc(H.265) nécessitelibx265compilé avec ffmpeg. Ajout de-tag:v hvc1pour meilleure compatibilité mp4.vp9utiliselibvpx-vp9avec-row-mt 1et map de--presetvers-cpu-used.av1utiliselibaom-av1avec map de--presetvers-cpu-used(valeurs 0-8). Encodage beaucoup plus lent selon la qualité.
Accélération matérielle :
videotoolboxutilise les encodeurs matériels Apple (h264_videotoolbox,hevc_videotoolbox).- En mode matériel, la qualité est réglée via
-q:v(0-63). Nous effectuons un mapping approximatif depuis--crf. - L’option
autosélectionne automatiquementvideotoolboxsur macOS, sinon désactive l’accélération.
Préréglages de qualité :
low: CRF 23, preset fast, denoisemedium: 1080p, CRF 20, preset medium, denoise, sharpen, color-fixhigh: 1440p, CRF 18, preset slow, denoise, sharpen, color-fixyoutube: 1080p, CRF 20, preset slow, denoise, sharpen, color-fixmax: 2160p, CRF 17, preset slow, denoise, sharpen, color-fix
Exemple: exécuter tous les jours à 09:00.
0 9 * * * /usr/bin/python3 /chemin/vers/youtube-automation/main.py upload --config /chemin/vers/video.yaml- Ne commitez jamais
config/client_secret.jsonniconfig/token.json. - Les deux fichiers sont ignorés par
.gitignore.
- Authentification: supprimez
config/token.jsonet relancez pour refaire le flux OAuth si nécessaire. - Échecs d'upload: vérifiez le format/poids de la vidéo et vos quotas d'API.
OPENAI_API_KEYmanquant: la commandeai-metalèvera une erreur si la variable n'est pas définie.- ffmpeg manquant:
yt-dlpet la commandeenhancenécessitent ffmpeg pour convertir/merger. Installez-le via votre gestionnaire de paquets (macOS:brew install ffmpeg).
Ce projet est fourni tel quel, sans garantie. Utilisez-le conformément aux Conditions d'utilisation de YouTube et de Google Cloud.
Une image CI Docker et un service ci sont fournis pour lancer lint + tests unitaires + tests d'intégration sans polluer votre machine.
-
Construire l'image CI:
docker compose build ci
-
CI complet (lint + unit + integration):
docker compose run --rm ci
-
Lint uniquement:
docker compose run --rm ci bash -lc 'bash /app/scripts/ci.sh lint'
-
Tests unitaires uniquement:
docker compose run --rm ci bash -lc 'bash /app/scripts/ci.sh unit'
-
Tests d'intégration uniquement:
docker compose run --rm ci bash -lc 'bash /app/scripts/ci.sh integration'
Notes:
-
Le code hôte est monté dans le conteneur (
./:/app), les corrections pre-commit (black/ruff/flake8) s'appliquent à vos fichiers. -
Si certains tests d'intégration requièrent Ollama, démarrez le service
ollamaau préalable:docker compose up -d ollama