HomeBlogTranscribePlansAPI Keys

LangChain YouTube Transkriptionsladdare som överleveru produktion

LangChain-pipeline som förvandlar en YouTube-video till Document-objekt och en sammanfattningskedja

Varje LangChain YouTube transkriptions-tutorial visar samma tre rader: YoutubeLoader.from_youtube_url(), ladda, klart. Sedan distribuerar du till en molnbox och det tyst returnerar ingenting. Nedan är en laddare som returnerar rätta Document-objekt från ett hosted API i stället — ungefär 20 rader, plus en sammanfattningskedja för att bevisa att det fungerar ända igenom.

Varför den inbyggda YoutubeLoader dör på servrar

YoutubeLoader anropar inte ett officiellt API. Den skrapar Youtubes interna bildtextslutpunkter från vilken maskin som helst din kod kör på. Från en bostad IP som mestadels fungerar. Från en AWS, GCP eller Hetzner IP blir den blockerad eller serverad tomma svar, för YouTube behandlar datacenter-trafik som bottrafik. Jag skrev upp detaljerna i varför YouTube-transkriptionsskrapning bryter på moln-IP:ar — kortversionen är att misslyckandet är miljömässigt, så det passerar varje lokalt test och dör exakt där det spelar roll.

youtube2text.org gör hämtningen på sin sida och ger dig JSON, vilket förvandlar din laddare till ett enkelt HTTP-anrop.

Laddaren

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,
        },
    )

API:t returnerar videoId, title, pubDate, content, contentSize och en truncated-flagga. Transkriptiontext går till page_content, allt annat till metadata — exakt den form nedströmkedjor och vektorbutiker förväntar sig.

Ingen nyckel ännu? Ta den delade demo-nyckeln:

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

Den är begränsad till 5 videor per månad per IP, vilket räcker för att testa laddaren.

En sammanfattningskedja

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 stoppar hela transkriptionen i en prompt, vilket fungerar för att maxChars begränsar nyttolasten till 150 000 tecken som standard. För långt långt långt podcaster på små-kontext-modeller, skicka en lägre maxChars till laddaren eller växla till ett map-reduce-mönster.

Vad du bör hantera i verklig kod

Två fel lägen är värda att fånga explicit. En video med bildtexter inaktiverad returnerar HTTP 404 med felkoden TRANSCRIPT_UNAVAILABLE — ingen omprövning eller biblioteksväxel fixar det, texten existerar helt enkelt inte. Och RATE_LIMIT_EXCEEDED (429) inkluderar retryAfterSeconds i felens JSON, så läs den och backa av i stället för att hamra:

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

En ärlig begränsning: content är vanlig text utan tidsstämplar. Det är bra för sammanfattning och hämtning, men om du behöver "hoppa till 12:34" djuplänkar, måste du nöja dig med videonivåattribut via videoId i metadata.

Vart du går härifrån

Samma Document-objekt sänker direkt in i en vektorbutik — jag går igenom hela pipelinen i RAG över en hel YouTube-kanal. Om din stack är LlamaIndex i stället för LangChain, är motsvarande inställning bara så kort.

När demo-nyckeln på 5 videor slutar räcka till, få din egen nyckel — gratis nivå inkluderad, betalda planer från $5,99 för 50 videor per månad.