HomeBlogTranscribePlansAPI Keys

LangChain YouTube Transcript Loader som overlever produksjon

LangChain-rørledning som gjør en YouTube-video til Document-objekter og en oppsummerings-kjede

Hvert LangChain YouTube transkripsjon opplæring viser de samme tre linjene: YoutubeLoader.from_youtube_url(), last, ferdig. Så deployer du til en skyeboks og det returnerer stille ingenting. Nedenfor er en loader som returnerer riktige Document-objekter fra en hostet API i stedet — omtrent 20 linjer, pluss en oppsummerings-kjede for å bevise det fungerer end til end.

Hvorfor den innebygde YoutubeLoader dør på servere

YoutubeLoader kaller ingen offisiell API. Den skrapers YouTubes interne undertekst-endepunkter fra hvilken maskin koden din kjører på. Fra en bolig-IP det fungerer for det meste. Fra en AWS, GCP, eller Hetzner-IP får den blokkert eller serveres tomme responser, fordi YouTube behandler datasenter-trafikk som bot-trafikk. Jeg skrev opp detaljene i hvorfor YouTube transkripsjon-skraping bryter på sky-IP-er — kort versjon er at feilen er miljøbasert, så den passerer hver lokal test og dør nøyaktig der det betyr noe.

youtube2text.org gjør hentingen på sin side og gir deg JSON, som gjør loaderen din til et vanlig HTTP-kall.

Loaderen

import requests
from langchain_core.documents import Document

API_KEY = "yt_your_key_here"

def load_youtube_transcript(url: str, max_chars: int = 150000) -> Document:
    resp = requests.get(
        "https://youtube2text.org/api/transcribe",
        params={"url": url, "maxChars": max_chars},
        headers={"x-api-key": API_KEY},
        timeout=90,
    )
    resp.raise_for_status()
    r = resp.json()["result"]
    return Document(
        page_content=r["content"],
        metadata={
            "videoId": r["videoId"],
            "title": r["title"],
            "pubDate": r["pubDate"],
            "source": url,
        },
    )

APIen returnerer videoId, title, pubDate, content, contentSize og et truncated-flagg. Transkripsjon-tekst går inn i page_content, alt annet inn i metadata — nøyaktig formen nedstrøms-kjeder og vektor-butikker forventer.

Ingen nøkkel ennå? Grabb den delte demo-nøkkelen:

curl https://youtube2text.org/api/demo-key

Den er begrenset til 5 videoer per måned per IP, noe som er nok til å teste loaderen.

En oppsummerings-kjede

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain

llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template(
    "Summarize this video transcript in five bullet points:\n\n{context}"
)
chain = create_stuff_documents_chain(llm, prompt)

doc = load_youtube_transcript("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
print(chain.invoke({"context": [doc]}))

create_stuff_documents_chain fyller hele transkripsjonen inn i en prompt, som fungerer fordi maxChars begrenser ytelsen til 150 000 tegn som standard. For timer-lange podcasts på små-kontekst-modeller, pass en lavere maxChars til loaderen eller bytt til et map-reduce-mønster.

Hva skal man håndtere i faktisk kode

To feilmodus er verdt å fange eksplisitt. En video med tekst deaktivert returnerer HTTP 404 med feilkode TRANSCRIPT_UNAVAILABLE — ingen retry eller bibliotek-bytte reparerer det, teksten finnes rett og slett ikke. Og RATE_LIMIT_EXCEEDED (429) inkluderer retryAfterSeconds i feil-JSON, så les det og back av i stedet for å hamre:

if resp.status_code == 429:
    wait = resp.json()["error"].get("retryAfterSeconds", 60)

En ærlig begrensning: content er vanlig tekst uten tidsstempel. Det er OK for oppsummering og hentning, men hvis du trenger "hopp til 12:34" dype lenker, må du være fornøyd med video-nivå attribusjon via videoId i metadata.

Hvor skal man gå herfra

De samme Document-objektene faller rett inn i en vektor-butikk — jeg gjennomgår hele rørledningen i RAG over en hel YouTube-kanal. Hvis stakken din er LlamaIndex i stedet for LangChain, ekvivalent oppsett er like kort.

Når demo-nøkkelen sin 5 videoer slutter å være nok, få din egen nøkkel — gratis nivå inkludert, betalte planer fra $5.99 for 50 videoer per måned.