Siapa sih yang tidak pernah mengeluhkan proses upload video ke YouTube yang harus dilakukan secara manual, terutama bila video berjumlah banyak atau harus dipublikasikan tepat waktu? Nah, script Python untuk mengupload video ke YouTube via GitHub Actions hadir sebagai solusi yang membuat hidupmu jauh lebih ringan. Dengan memanfaatkan kekuatan CI/CD dari GitHub, kamu bisa menyiapkan workflow yang secara otomatis mengunggah video setiap kali ada perubahan di repository—tanpa perlu membuka browser lagi.
Di artikel ini, kita bakal mengupas tuntas mulai dari persiapan akun Google Cloud, instalasi library Python, penulisan script upload, hingga menyiapkan file YAML untuk GitHub Actions. Semua dibahas dengan gaya santai, langkah demi langkah, supaya kamu yang baru belajar sekalipun bisa mengikuti tanpa kebingungan. Siapkan secangkir kopi, buka editor favoritmu, dan mari kita mulai petualangan otomasi upload video ke YouTube!
Jika kamu penasaran bagaimana workflow ini bekerja secara keseluruhan, cek juga artikel Cara Otomatis Memublikasikan Video YouTube lewat GitHub CI/CD – Langkah Praktis yang Bikin Hidup Lebih Ringan! untuk gambaran umum sebelum masuk ke detail script Python.
Prasyarat: Apa yang Harus Disiapkan Sebelum Mulai?
Sebelum menulis script, ada beberapa hal yang harus kamu siapkan dulu. Tidak usah panik, semuanya cukup mudah dan gratis.
- Akun Google – diperlukan untuk mengakses YouTube Data API.
- Proyek di Google Cloud Console – di sinilah kamu akan mengaktifkan API dan membuat kredensial OAuth 2.0.
- Repository di GitHub – tempat kamu menyimpan script Python dan file workflow.
- Python 3.8+ – pastikan environment lokal kamu sudah terinstall.
- GitHub Actions Runner – otomatis tersedia di GitHub, tapi kamu perlu menyiapkan secret untuk token API.
Menyiapkan Google Cloud Project dan API Key
1. Buka Google Cloud Console dan buat proyek baru.
2. Masuk ke APIs & Services > Library, cari “YouTube Data API v3”, lalu aktifkan.
3. Pergi ke Credentials, pilih “Create OAuth client ID”. Pilih tipe “Desktop app” (karena kita akan menggunakan flow OAuth di script).
4. Simpan client_id dan client_secret ke dalam file client_secret.json. File ini nantinya akan di‑encrypt sebagai secret di GitHub.
Membuat Repository GitHub dan Menambahkan Secret
Setelah repo selesai dibuat, masuk ke Settings > Secrets > Actions. Tambahkan dua secret:
YOUTUBE_CLIENT_SECRET– isi dengan konten lengkap fileclient_secret.json(bisa di‑paste langsung).YOUTUBE_REFRESH_TOKEN– token refresh yang akan kamu dapatkan setelah proses otorisasi pertama (akan dijelaskan di bagian script).
Menulis Script Python untuk Upload Video
Berikut contoh script Python yang cukup ringkas namun powerful. Simpan file ini dengan nama upload_youtube.py di root repository.
import os
import json
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
# Membaca client secret dari secret GitHub
CLIENT_SECRET = json.loads(os.getenv('YOUTUBE_CLIENT_SECRET'))
SCOPES = ["https://www.googleapis.com/auth/youtube.upload"]
def get_authenticated_service():
# Membuat flow OAuth menggunakan client secret
flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_config(
{
"installed": {
"client_id": CLIENT_SECRET["installed"]["client_id"],
"client_secret": CLIENT_SECRET["installed"]["client_secret"],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"redirect_uris": ["urn:ietf:wg:oauth:2.0:oob"]
}
},
SCOPES,
)
# Menggunakan refresh token yang disimpan sebagai secret
credentials = flow.credentials
credentials.refresh_token = os.getenv('YOUTUBE_REFRESH_TOKEN')
credentials.token_uri = "https://oauth2.googleapis.com/token"
credentials.client_id = CLIENT_SECRET["installed"]["client_id"]
credentials.client_secret = CLIENT_SECRET["installed"]["client_secret"]
credentials.refresh(google.auth.transport.requests.Request())
return googleapiclient.discovery.build("youtube", "v3", credentials=credentials)
def upload_video(file_path, title, description, tags=None, category_id="22", privacy_status="private"):
youtube = get_authenticated_service()
body = {
"snippet": {
"title": title,
"description": description,
"tags": tags or [],
"categoryId": category_id
},
"status": {
"privacyStatus": privacy_status
}
}
# MediaFileUpload menangani upload file besar secara chunk
media = googleapiclient.http.MediaFileUpload(file_path, chunksize=-1, resumable=True, mimetype="video/*")
request = youtube.videos().insert(part="snippet,status", body=body, media_body=media)
response = None
while response is None:
status, response = request.next_chunk()
if status:
print(f"Upload {int(status.progress() * 100)}% selesai...")
print("Video berhasil diupload! Video ID:", response["id"])
if __name__ == "__main__":
# Contoh penggunaan: ubah variabel di bawah sesuai kebutuhan
video_path = "videos/sample.mp4"
video_title = "Demo Upload via GitHub Actions"
video_desc = "Video ini diupload otomatis menggunakan script Python dan GitHub Actions."
video_tags = ["automation", "github actions", "python", "youtube api"]
upload_video(video_path, video_title, video_desc, video_tags)
Catatan penting:
- Pastikan file video yang akan diupload berada di folder
videos/dalam repo. - Anda dapat mengubah
privacy_statusmenjadipublicatauunlistedsesuai kebutuhan. - Jika ingin menambahkan thumbnail, cukup panggil
youtube.thumbnails().setsetelah upload selesai.
Mendapatkan Refresh Token untuk Pertama Kalinya
Karena GitHub Actions berjalan di environment non‑interactive, kita harus menghasilkan refresh token secara manual satu kali di mesin lokal:
- Jalankan script dengan menambahkan flag
--noauth_local_webserverpada flow (atau gunakan contoh script di dokumentasi Google). - Ikuti link yang diberikan, izinkan aplikasi, dan salin kode otorisasi yang muncul.
- Script akan menyimpan refresh token ke file
refresh_token.txt. Salin nilai token tersebut ke secretYOUTUBE_REFRESH_TOKENdi GitHub.
Setelah token disimpan sebagai secret, setiap run GitHub Actions dapat menggunakan token itu untuk memperbaharui akses tanpa intervensi manusia.
Membuat Workflow GitHub Actions
File workflow berada di .github/workflows/upload.yml. Berikut contoh yang sudah teruji:
name: Upload Video to YouTube
on:
push:
paths:
- 'videos/**' # Trigger hanya saat ada perubahan di folder videos
workflow_dispatch: # Memungkinkan manual trigger lewat UI GitHub
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install google-auth google-auth-oauthlib google-api-python-client
- name: Export secret client JSON
run: echo "${{ secrets.YOUTUBE_CLIENT_SECRET }}" > client_secret.json
- name: Upload video
env:
YOUTUBE_CLIENT_SECRET: ${{ secrets.YOUTUBE_CLIENT_SECRET }}
YOUTUBE_REFRESH_TOKEN: ${{ secrets.YOUTUBE_REFRESH_TOKEN }}
run: |
python upload_youtube.py
Beberapa poin penting yang patut dicermati:
- Trigger diatur supaya workflow hanya berjalan ketika ada file video baru atau perubahan di folder
videos/. Ini menghindari run tak perlu. - Jika kamu ingin menambahkan parameter dinamis (misalnya judul video di‑generate dari commit message), gunakan
github.event.head_commit.messagedalam script atau sebagai env variable. - Workflow di atas menggunakan
ubuntu-latest. Jika kamu lebih suka Windows atau macOS, tinggal ganti sajaruns-on.
Tips Debugging dan Logging
GitHub Actions menyimpan log setiap step. Untuk mempermudah troubleshooting, kamu bisa menambahkan set -x pada script bash atau menambahkan print() di dalam script Python. Contoh tambahan pada step “Upload video”:
run: |
set -x
python -u upload_youtube.py 2>&1 | tee upload_log.txt
File upload_log.txt akan terlihat di log runner, membantu melacak error API atau masalah kredensial.
Keamanan: Menjaga Kredensial Tetap Aman
Jangan pernah menaruh client_secret.json atau token di dalam kode sumber. Selalu gunakan GitHub Secrets seperti yang sudah dijelaskan. Selain itu, perhatikan hal‑hal berikut:
- Rotate token secara periodik – jika ada indikasi token bocor, buat token baru dan update secret.
- Batasi scope API – gunakan hanya
https://www.googleapis.com/auth/youtube.uploadjika tidak perlu mengedit video yang sudah ada. - Audit log GitHub – periksa siapa saja yang memiliki akses ke repository dan secrets.
Menangani Batas Kuota API
YouTube API memiliki kuota harian (biasanya 10.000 unit). Upload video menggunakan 1600 unit per video. Pastikan kamu tidak melampaui batas dengan menambahkan kontrol di workflow, misalnya hanya mengupload satu video per hari atau menggunakan if conditional untuk memeriksa kuota via endpoint youtube.quota.
Pengembangan Lanjutan: Ide-ide Integrasi Lain
Setelah workflow dasar berjalan, kamu bisa bereksperimen dengan beberapa integrasi tambahan untuk meningkatkan produktivitas:
- Generasi thumbnail otomatis dengan
ffmpegdan mengunggahnya lewat API setelah video selesai. - Penambahan subtitle menggunakan file
.srtyang di‑generate oleh layanan speech‑to‑text. - Posting ke media sosial (Twitter, Discord) secara otomatis setelah video berhasil diupload, menggunakan webhook.
- Integrasi dengan OBS Studio untuk meng‑export rekaman langsung ke folder
videos/dan memicu upload secara real‑time. Lihat juga artikel Rahasia Integrasi OBS Studio dengan GitHub untuk Streaming YouTube yang Lebih Mudah dan Profesional! untuk inspirasi.
Contoh Workflow Lanjutan dengan Thumbnail & Notifikasi
Berikut contoh penambahan step yang menghasilkan thumbnail via ffmpeg dan mengirim notifikasi ke Discord:
- name: Generate thumbnail
run: |
sudo apt-get install -y ffmpeg
ffmpeg -i videos/sample.mp4 -ss 00:00:05 -vframes 1 thumbnail.png
- name: Upload thumbnail
env:
YOUTUBE_CLIENT_SECRET: ${{ secrets.YOUTUBE_CLIENT_SECRET }}
YOUTUBE_REFRESH_TOKEN: ${{ secrets.YOUTUBE_REFRESH_TOKEN }}
run: |
python upload_thumbnail.py # script terpisah untuk thumbnail
- name: Send Discord notification
uses: appleboy/discord-action@v1
with:
webhook_id: ${{ secrets.DISCORD_WEBHOOK_ID }}
webhook_token: ${{ secrets.DISCORD_WEBHOOK_TOKEN }}
message: "Video baru berhasil diupload! 🎉"
Dengan menambahkan langkah‑langkah seperti di atas, pipeline kamu tidak hanya mengupload video, tapi juga menyelesaikan seluruh proses publikasi secara otomatis.
Jika kamu ingin melihat contoh workflow lengkap yang sudah dipakai orang lain, kunjungi Contoh Workflow GitHub Actions untuk Streaming YouTube – Panduan Praktis dan Lengkap!. Di sana ada banyak variasi yang bisa kamu adaptasi ke kebutuhanmu.
Intinya, kombinasi Python, YouTube Data API, dan GitHub Actions membuka peluang otomatisasi yang tak terbatas. Kamu tidak perlu lagi menghabiskan waktu berjam‑jam menunggu upload selesai; cukup commit video ke repo, dan semua proses selanjutnya berjalan di belakang layar.
Selamat mencoba! Semoga workflow ini membantu kamu menghemat waktu, meningkatkan konsistensi publikasi, dan memberi ruang lebih untuk berkreasi dengan konten. Jangan lupa untuk selalu memantau log, memperbarui kredensial, dan menyesuaikan konfigurasi sesuai kebutuhan proyekmu.
