HomeBlogTranscribePlansAPI Keys

YouTube Transkriptio Golangissa: net/http ja kolme Struct:ia

Go-ohjelma, joka dekoodaa YouTube-transkription API-vastauksen rakenteiksi

Tässä on koko ohjelma. Selitys jälkeen.

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, tehty. Ei kolmannen osapuolen moduuleja, mikä on kuinka YouTube-transkription hankkimisen Golangissa tulisi näyttää — API on tavallinen HTTPS, joka palauttaa JSON:ia, joten net/http ja encoding/json kattavat kaiken. Tälle ei ole virallista Go-kirjastoa, ja väitän sen olevan ominaisuus.

Verhon temppu

Onnistumisen vastaukset laittavat tiedot result:in alle; epäonnistumiset laittavat strukturoidun objektin error:in alle. Molempien dekoodaaminen yhdeksi structuriksi, jossa on kaksi osoitinkenttää, tarkoittaa yhtä Decode-kutsua käsittelee jokaisen vastauksen — kumpi tahansa osoitin, joka ei ole nolla, on vastauksesi. Ei kehon uudelleenlukemista, ei Content-Type:n tuuletusta, ja env.Error.Status vastaa HTTP-statusta, jos haluat kaksois-tarkistaa.

Koodit, joilla on switch-lausunto

APIError.Code on vakaa, joten haaraudu siihen viesti-merkkijonojen sijaan:

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 on yksi, jonka ihmiset käsittelevät väärin. Transkriptiot tulevat YouTuben kuvateksti-raiteista — manuaalisesti tai automaattisesti luodut, englanti ensisijaisesti, ensimmäinen saatavilla oleva kieli muuten. Jos videolla on kuvatekstit poistettu, transkriptiota ei ole noudettavaksi, ja eksponentiaalisella takaisinvetolla ei kutsuta kuvatekstejä kasvamaan. Käsittele sitä pysyvänä ohituksena batch-töissä, tai työntekijä-jonosi täyttyyä zombeilla.

Parametrit ja avaimet

Kaksi kyselyparametria yhteensä. url hyväksyy minkä tahansa YouTube URL -muodon tai paljaita 11-merkkisiä tunnisteita. maxChars kattaa tuotoksen pituuden (150000 on oletusarvo ja maksimi) — hyödyllinen, kun transkriptio syöttää LLM:ään ja maksat tunnistetta kohti, mikä on useimmat Go-käyttötapaukset, joita kuulen, yleensä RAG koko kanavan yli.

Avainta ilman mitään rekisteröintiä varten, curl https://youtube2text.org/api/demo-key palauttaa toimivan — jaettu kaikkien anonyymien käyttäjien kesken 5 videolla kuukaudessa per IP, joten se on puhtaasti kokeille. Jos punnitset tätä vastaan yt-dlp:n kuoren liittäminen otsikko-tiedostoille, kirjoitin yt-dlp-otsikkojen vertailun API:iin; ja jos osa pinosta on Node, sama kutsu JavaScriptissä on vielä lyhyempi.

Todellista käyttöä varten, kirjaudu Googlella osoitteessa youtube2text.org/app/keys — ei korttia, ei puhelinta, ilmainen taso 5 videota kuukaudessa, maksulliset tasot 5,99 dollarista 50:lle rajoittamattomaan 19,99 dollariin. Go-koodi ei muutu edellä; vain ympäristömuuttuja muuttuu.