Siapa sih yang nggak pengen video YouTube-nya cepat tersedia dengan subtitle yang akurat? Apalagi kalau subtitle tersebut di‑generate otomatis, kamu bisa menghemat jam‑jam editing manual. Di artikel ini, tutorial mengupload subtitle otomatis ke YouTube lewat GitHub akan dijabarkan langkah demi langkah, mulai dari persiapan hingga deployment. Kita bakal pakai GitHub Actions sebagai otak otomatisasinya, jadi setelah semua diset, proses upload subtitle bakal jalan sendiri setiap kali ada file baru di repository.

Gak perlu jadi developer senior atau ahli API, cukup ikuti panduan ini dengan santai. Kita juga bakal bahas cara menyimpan kunci API YouTube secara aman di GitHub Secrets, serta tips debugging yang sering terlewat. Oh iya, kalau kamu penasaran gimana cara pakai GitHub Copilot untuk skrip streaming YouTube, ada linknya di dalam artikel. Yuk, langsung saja ke pembahasan utama!

Selain itu, bagi yang ingin mengintegrasikan notifikasi Slack atau menghubungkan analitik YouTube, ada artikel terkait yang bisa kamu baca setelah selesai. Semua bahan yang kamu butuhkan ada di bawah, jadi siapkan kopi, laptop, dan semangat belajar!

1. Persiapan Lingkungan dan Alat yang Diperlukan

Sebelum masuk ke kode, pastikan kamu sudah menyiapkan beberapa hal berikut:

  • Akount Google dengan akses ke YouTube Data API – Kita butuh API key atau OAuth client untuk mengirim subtitle.
  • Repository GitHub – Tempat menyimpan script Python, file subtitle (misalnya .srt), dan workflow file.
  • GitHub Actions Runner – Tidak perlu instal apa‑apa, GitHub sudah menyediakan runner berbasis Linux/Ubuntu.
  • Python 3.9+ dan library google-api-python-client – Akan dipasang otomatis di workflow.
  • Pengetahuan dasar tentang YAML – Karena workflow GitHub Actions ditulis dalam format YAML.

Jika kamu belum mengaktifkan YouTube Data API, kunjungi Google Cloud Console, buat proyek baru, aktifkan “YouTube Data API v3”, lalu buat OAuth 2.0 Client ID (pilih tipe “Desktop app” atau “Web application” tergantung kebutuhan). Simpan client_id dan client_secret untuk nanti dimasukkan ke GitHub Secrets.

2. Membuat Repository di GitHub

Langkah pertama di GitHub cukup simpel. Buat repository baru, beri nama yang mudah diingat, misalnya yt-subtitle‑auto‑upload. Pastikan repository bersifat private kalau kamu tidak ingin orang lain melihat kunci API.

2.1. Menambahkan GitHub Secrets

Masuk ke Settings → Secrets and variables → Actions → New repository secret. Tambahkan secret berikut:

  • YT_CLIENT_ID – Isi dengan client ID dari Google Cloud.
  • YT_CLIENT_SECRET – Isi dengan client secret.
  • YT_REFRESH_TOKEN – Token refresh yang didapatkan lewat proses OAuth (bisa di‑generate sekali dengan script Python kecil, lihat bagian berikut).
  • YT_CHANNEL_ID – ID channel YouTube tempat video berada (opsional, tapi membantu bila ada banyak channel).

Dengan menyimpan kredensial di Secrets, kamu menjaga keamanan data sensitif dan menghindari kebocoran ke publik.

3. Menyiapkan File Subtitle

File subtitle biasanya berformat .srt atau .vtt. Pastikan nama file mengikuti pola yang mudah dipetakan ke video, misalnya video123.srt di mana “video123” adalah ID video YouTube. Simpan file subtitle di folder subtitles/ dalam repository.

3.1. Meng‑generate Subtitle Secara Otomatis

Kalau kamu belum punya subtitle, kamu bisa pakai layanan AI seperti Whisper, atau layanan cloud speech‑to‑text. Simpan skrip yang meng‑convert audio video menjadi .srt ke dalam folder scripts/. Contoh sederhana:

import whisper, os

model = whisper.load_model("base")
audio_path = "input.mp4"
result = model.transcribe(audio_path)

with open("subtitles/video123.srt", "w") as f:
    f.write(result["text"])

Script di atas hanya contoh; kamu bisa menyesuaikan dengan kebutuhan. Setelah subtitle terbentuk, commit ke repository dan biarkan workflow men‑handle sisanya.

4. Membuat GitHub Actions Workflow

Workflow adalah otak otomatisasi. Buat file .github/workflows/upload_subtitle.yml dengan isi seperti di bawah ini:

name: Upload YouTube Subtitle

on:
  push:
    paths:
      - 'subtitles/**/*.srt'
      - 'scripts/upload_subtitle.py'

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.9'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib

      - name: Run upload script
        env:
          YT_CLIENT_ID: ${{ secrets.YT_CLIENT_ID }}
          YT_CLIENT_SECRET: ${{ secrets.YT_CLIENT_SECRET }}
          YT_REFRESH_TOKEN: ${{ secrets.YT_REFRESH_TOKEN }}
          YT_CHANNEL_ID: ${{ secrets.YT_CHANNEL_ID }}
        run: python scripts/upload_subtitle.py

Penjelasan singkat tiap langkah:

  • on: push – Workflow akan terpicu setiap ada perubahan pada folder subtitles/ atau script upload.
  • checkout – Mengambil kode sumber ke runner.
  • setup‑python – Menyiapkan lingkungan Python.
  • install dependencies – Memasang library Google API.
  • run upload script – Menjalankan script Python yang akan berkomunikasi dengan YouTube API.

4.1. Menulis Script Upload Subtitle

Buat file scripts/upload_subtitle.py dengan kode berikut. Penjelasan tiap blok ada di komentar.

import os
import glob
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# Ambil kredensial dari environment variable
creds = Credentials(
    None,
    refresh_token=os.getenv('YT_REFRESH_TOKEN'),
    client_id=os.getenv('YT_CLIENT_ID'),
    client_secret=os.getenv('YT_CLIENT_SECRET'),
    token_uri='https://oauth2.googleapis.com/token'
)

def upload_caption(video_id, caption_path, language='en'):
    try:
        youtube = build('youtube', 'v3', credentials=creds)

        # Baca file subtitle
        with open(caption_path, 'rb') as f:
            subtitle_content = f.read()

        # Request upload caption
        request = youtube.captions().insert(
            part='snippet',
            body={
                'snippet': {
                    'videoId': video_id,
                    'language': language,
                    'name': os.path.basename(caption_path),
                    'isDraft': False
                }
            },
            media_body=subtitle_content
        )
        response = request.execute()
        print(f'Success upload caption for video {video_id}: {response["id"]}')
    except HttpError as e:
        print(f'Error uploading caption: {e}')

def main():
    # Cari semua file .srt di folder subtitles
    subtitle_files = glob.glob('subtitles/**/*.srt', recursive=True)

    for path in subtitle_files:
        # Asumsikan nama file adalah videoID.srt
        filename = os.path.basename(path)
        video_id, _ = os.path.splitext(filename)

        print(f'Processing {filename} for video {video_id}')
        upload_caption(video_id, path)

if __name__ == '__main__':
    main()

Script ini melakukan tiga hal utama:

  1. Membaca semua file .srt di folder subtitles/.
  2. Mengasumsikan nama file adalah ID video YouTube (misalnya abc123XYZ.srt).
  3. Mengirim subtitle ke YouTube lewat API captions().insert.

Jika kamu memakai nama file yang berbeda, tinggal ubah logika parsing di fungsi main(). Untuk penjelasan lebih detail tentang captions().insert, cek dokumentasi resmi YouTube API.

5. Menghubungkan YouTube API dan Menghasilkan Refresh Token

Langkah selanjutnya adalah menghasilkan refresh token yang akan dipakai oleh script di atas. Berikut cara singkatnya:

  1. Buat file scripts/get_refresh_token.py dengan kode berikut:
import os
import google_auth_oauthlib.flow

scopes = ['https://www.googleapis.com/auth/youtube.force-ssl']

flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_config(
    {
        "installed": {
            "client_id": os.getenv('YT_CLIENT_ID'),
            "client_secret": os.getenv('YT_CLIENT_SECRET'),
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token"
        }
    },
    scopes=scopes
)

credentials = flow.run_local_server(port=0)
print('Refresh token:', credentials.refresh_token)

Jalankan script secara lokal (bukan di GitHub Actions) dengan men‑set environment variable YT_CLIENT_ID dan YT_CLIENT_SECRET. Browser akan terbuka, login dengan akun Google yang memiliki hak meng‑upload subtitle, lalu izinkan akses. Setelah selesai, script akan menampilkan refresh token yang selanjutnya kamu simpan sebagai secret YT_REFRESH_TOKEN di repository.

5.1. Tips Keamanan

Jangan pernah menaruh client_secret atau refresh_token di dalam kode yang di‑commit. Selalu gunakan GitHub Secrets. Kalau penasaran cara mengamankan kunci API lebih lanjut, baca artikel Rahasia Terungkap! Cara Mengamankan Kunci API YouTube di GitHub Secrets Tanpa Ribet yang sudah kami siapkan.

6. Menguji Workflow Secara Lokal dan di GitHub

Setelah semua file siap, lakukan commit pertama:

git add .
git commit -m "Setup initial workflow for auto‑upload subtitles"
git push origin main

GitHub akan otomatis menjalankan workflow karena ada perubahan pada folder subtitles/ (meskipun masih kosong). Buka tab Actions** di repositorymu, pilih run terbaru, dan periksa lognya. Jika ada error “Invalid Credentials”, pastikan semua secret sudah ter‑set dengan benar.

Untuk menguji secara lokal sebelum push, kamu dapat meniru environment runner dengan Docker. Berikut contoh singkat:

docker run --rm -v "$(pwd)":/work -w /work python:3.9-slim bash -c "
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
export YT_CLIENT_ID=xxxx
export YT_CLIENT_SECRET=xxxx
export YT_REFRESH_TOKEN=xxxx
python scripts/upload_subtitle.py
"

Jika hasilnya “Success upload caption for video …”, berarti semuanya sudah ter‑konfigurasi dengan baik.

7. Menambahkan Fitur Tambahan (Opsional)

Setelah workflow dasar berfungsi, kamu bisa menambahkan beberapa fitur yang membuat proses lebih “smart”.

7.1. Notifikasi Slack

Gunakan Cara Cerdas Atur Notifikasi Slack Saat Streaming YouTube lewat GitHub untuk mengirim pesan ke kanal Slack setiap kali subtitle berhasil di‑upload. Tambahkan secret SLACK_WEBHOOK_URL dan langkah berikut di workflow:

- name: Send Slack notification
  if: success()
  uses: rtCamp/action-slack-notify@v2
  env:
    SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
    SLACK_MESSAGE: "Subtitle berhasil di‑upload untuk video ${{ env.VIDEO_ID }}"

7.2. Penjadwalan Periodik

Jika kamu ingin memeriksa folder subtitles/ setiap hari, ubah trigger menjadi schedule:

on:
  schedule:
    - cron: '0 2 * * *'   # Jalankan tiap pukul 02:00 UTC
  push:
    paths:
      - 'subtitles/**/*.srt'

7.3. Integrasi dengan YouTube Analytics Dashboard

Setelah subtitle ter‑upload, kamu dapat menambahkan data ke dashboard analitik YouTube agar melihat dampak peningkatan watch‑time. Baca Kenapa Dashboard Analitik YouTube Penting? untuk insight lebih dalam.

8. Penanganan Error yang Umum Terjadi

Walaupun alur ini teruji, kadang ada error yang muncul:

  • 403 – Quota Exceeded: Pastikan kuota API YouTube belum habis. Jika sering, ajukan peningkatan kuota lewat Google Cloud Console.
  • 400 – Invalid Video ID: Periksa kembali penamaan file subtitle. ID video harus persis seperti yang ada di URL YouTube.
  • 401 – Invalid Credentials: Refresh token mungkin sudah kedaluwarsa. Jalankan kembali script get_refresh_token.py untuk memperbarui.

Untuk debugging lebih detail, tambahkan flag --log-level=DEBUG pada perintah Python atau gunakan set -x di workflow.

9. Deploy dan Skalabilitas

Setelah workflow stabil, kamu bisa meng‑fork repository ini ke semua channel YouTube yang kamu kelola. Hanya ubah secret YT_CHANNEL_ID atau YT_REFRESH_TOKEN sesuai kanal masing‑masing. Karena semua proses terjadi di GitHub Actions, tidak ada server tambahan yang perlu dikelola.

Jika ingin meng‑integrasikan ke CI/CD lain, kamu bisa mengekspor workflow menjadi reusable sub‑workflow dan memanggilnya dari berbagai repositori.

Itulah seluruh rangkaian tutorial mengupload subtitle otomatis ke YouTube lewat GitHub. Dengan sedikit konfigurasi, kamu sudah menyiapkan sistem yang dapat terus‑menerus men‑update subtitle tanpa campur tangan manual. Selamat mencoba, dan semoga channel‑mu semakin ramah bagi penonton dari berbagai bahasa!