HomeBlogTranscribePlansAPI Keys

Transkrip YouTube di Golang: net/http dan Tiga Structs

Program Go mendekode respons YouTube transcript API ke dalam structs

Berikut adalah seluruh program. Penjelasan sesudahnya.

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"time"
)

type Transcript struct {
	VideoID     string `json:"videoId"`
	Title       string `json:"title"`
	PubDate     string `json:"pubDate"`
	Content     string `json:"content"`
	ContentSize int    `json:"contentSize"`
	Truncated   bool   `json:"truncated"`
}

type APIError struct {
	Code              string `json:"code"`
	Message           string `json:"message"`
	Status            int    `json:"status"`
	RetryAfterSeconds int    `json:"retryAfterSeconds"`
}

type envelope struct {
	Result *Transcript `json:"result"`
	Error  *APIError   `json:"error"`
}

func main() {
	q := url.Values{}
	q.Set("url", "https://www.youtube.com/watch?v=dQw4w9WgXcQ")

	req, err := http.NewRequest(http.MethodGet,
		"https://youtube2text.org/api/transcribe?"+q.Encode(), nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	req.Header.Set("x-api-key", os.Getenv("YT2TEXT_KEY"))

	client := &http.Client{Timeout: 60 * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	var env envelope
	if err := json.NewDecoder(resp.Body).Decode(&env); err != nil {
		fmt.Fprintln(os.Stderr, "decode:", err)
		os.Exit(1)
	}

	if env.Error != nil {
		fmt.Fprintf(os.Stderr, "%s: %s\n", env.Error.Code, env.Error.Message)
		os.Exit(1)
	}

	fmt.Println(env.Result.Title)
	fmt.Printf("%d chars, truncated=%v\n",
		env.Result.ContentSize, env.Result.Truncated)
}

go run main.go, selesai. Tidak ada modul pihak ketiga, yang merupakan cara mendapatkan transkrip YouTube di Golang seharusnya terlihat — API adalah HTTPS biasa yang mengembalikan JSON, jadi net/http dan encoding/json mencakup semuanya. Tidak ada perpustakaan Go resmi untuk ini, dan saya akan berpendapat bahwa itu adalah fitur.

Trik amplop

Respons sukses menempatkan data di bawah result; kegagalan menempatkan objek terstruktur di bawah error. Mendekode keduanya ke dalam satu struct dengan dua bidang pointer berarti satu panggilan Decode menangani setiap respons — pointer mana pun yang bukan nol adalah jawaban Anda. Tidak ada membaca ulang badan, tidak ada mencium Content-Type, dan env.Error.Status cocok dengan status HTTP jika Anda ingin periksa ulang.

Kode layak pernyataan switch

APIError.Code stabil, jadi cabang padanya daripada pada string pesan:

switch env.Error.Code {
case "RATE_LIMIT_EXCEEDED":
	wait := time.Duration(env.Error.RetryAfterSeconds) * time.Second
	time.Sleep(wait) // then retry the request
case "TRANSCRIPT_UNAVAILABLE":
	// video exists but has no caption track — skip permanently
case "VIDEO_NOT_FOUND", "INVALID_URL":
	// bad input; log and move on
default:
	// UNAUTHORIZED, VALIDATION_ERROR, YOUTUBE_ERROR
}

TRANSCRIPT_UNAVAILABLE adalah yang orang-orang salah menangani. Transkrip berasal dari trek caption YouTube — manual atau auto-generated, Bahasa Inggris disukai, bahasa pertama tersedia jika sebaliknya. Jika video memiliki caption dimatikan, tidak ada transkrip untuk diambil, dan mencoba ulang dengan backoff eksponensial tidak akan membuat caption tumbuh. Perlakukan sebagai lompatan permanen dalam pekerjaan batch, atau antrian worker Anda penuh dengan zombie.

Parameter dan kunci

Dua parameter query total. url mengambil bentuk URL YouTube apa pun atau id 11 karakter bare. maxChars membatasi panjang output (150000 adalah default dan maks) — berguna ketika transkrip memberi makan LLM dan Anda membayar per token, yang merupakan sebagian besar kasus penggunaan Go yang saya dengar, biasanya RAG di atas seluruh channel.

Untuk kunci tanpa signup apa pun, curl https://youtube2text.org/api/demo-key mengembalikan satu yang berfungsi — dibagikan di semua pengguna anonim pada 5 video per bulan per IP, jadi hanya untuk mencoba hal-hal. Jika Anda menimbang ini terhadap shelling out ke yt-dlp untuk file subtitle, saya menulis perbandingan yt-dlp subtitles vs API; dan jika bagian dari tumpukan Anda adalah Node, panggilan yang sama di JavaScript bahkan lebih pendek.

Untuk penggunaan nyata, masuk dengan Google di youtube2text.org/app/keys — tanpa kartu, tanpa telepon, tingkat gratis 5 video sebulan, tingkat berbayar dari $5,99 untuk 50 hingga $19,99 unlimited. Kode Go di atas tidak berubah; hanya env var yang berubah.