YouTube Transkriptio Node.js:ssä: Natiivi haku, ei npm asennus

Et tarvitse pakettia tähän. YouTube-transkription hankkiminen Node.js:ssä on yksi HTTPS-kutsu, fetch on ollut globaali Node 18:sta lähtien ja pääte puhu tavallista JSON:ia. Kaikki tämän viestin sisältö ajaa tyhjässä hakemistossa ilman package.json — loppuun mennessä sinulla on transcribe()-funktio, joka palauttaa otsikon, julkaisupäivän ja täydellisen transkriptio-tekstin mille tahansa YouTube URL:lle, virheenkäsittelyn kanssa, joka ei arvaile.
npm-rekisteri on tusina transkriptio-kaavija, ja niillä on yhteinen kohtalo: ne hakevat YouTubesta palvelimesi IP:llä, ja YouTube estää datakeskuksen IP:t. Isännöity API sivuuttaa sen kokonaan.
Koko asia
const KEY = process.env.YT2TEXT_KEY;
async function transcribe(videoUrl, maxChars = 150000) {
const qs = new URLSearchParams({ url: videoUrl, maxChars: String(maxChars) });
const res = await fetch(`https://youtube2text.org/api/transcribe?${qs}`, {
headers: { "x-api-key": KEY },
});
const body = await res.json();
if (!res.ok) {
const err = new Error(`${body.error.code}: ${body.error.message}`);
err.code = body.error.code;
err.retryAfterSeconds = body.error.retryAfterSeconds;
throw err;
}
return body.result;
}
const t = await transcribe("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
console.log(`${t.title} — ${t.contentSize} chars`);
console.log(t.content.slice(0, 300));
Tallenna index.mjs (ylätason odotus haluaa ESM), aja node index.mjs. url-parametri ottaa minkä tahansa YouTube URL-muodon tai paljaiden 11-merkkisen video-tunnuksen ja maxChars kattaa transkriptio pituuden — 150000 on sekä oletusarvo että katto, joten lyhennä sitä, kun teksti menee LLM-kehotteeseen.
Ei vielä avainta? Hanki demo:
curl https://youtube2text.org/api/demo-key
Se palauttaa {"success":true,"apiKey":"yt_..."}. Varoitus siitä, että se on jaettu kaikilla anonyymillä käyttäjillä ja rajoitettu 5 videoon kuukaudessa per IP — rengas potkimisen avain, ei tuotanto.
Virheet ovat JSON, joten käsittele ne niin
Jokainen epäonnistuminen on vakaa code kenttä. Ne, joilla on haara arvoista:
try {
await transcribe("https://youtu.be/xxxxxxxxxxx");
} catch (err) {
switch (err.code) {
case "RATE_LIMIT_EXCEEDED":
console.log(`Back off for ${err.retryAfterSeconds}s, then retry`);
break;
case "TRANSCRIPT_UNAVAILABLE":
console.log("Video has no captions — nothing to fetch, skip it");
break;
case "VIDEO_NOT_FOUND":
case "INVALID_URL":
console.log("Bad input, fix the URL");
break;
default:
throw err; // UNAUTHORIZED, YOUTUBE_ERROR — genuinely unexpected
}
}
TRANSCRIPT_UNAVAILABLE on koko lähestymistavan rehellinen rajoitus: transkriptiot tulevat YouTuben omista kuvateksti-raiteista, manuaalisesti tai automaattisesti luodut, englanti ensisijaisesti varasuunnitelmalla mihin tahansa kieleen. Video, jolla kuvatekstit ovat poistettu käytöstä, palauttaa 404:n ja ei ole mitään uudelleen yritystä. Käsittele se normaalina tapauksena, ei poikkeuspolkua.
TypeScript, jos se on sinun asia
Vastaus muoto on vakaa, joten pari liitäntää saa sinulle täydellisen tyypin turvallisuuden ilman riippuvuuksia:
interface TranscriptResult {
videoId: string;
title: string;
pubDate: string;
content: string;
contentSize: number;
truncated: boolean;
}
interface ApiError {
code: string;
message: string;
status: number;
retryAfterSeconds?: number;
}
Tyyppi body kuten { result: TranscriptResult } | { error: ApiError } ja kaventaa res.ok:lla. Ei any, ei casting.
Mitä tämä liittyy
Useimmat ihmiset, jotka kutsuvat tätä Node:stä, ruokkivat transkriptioita kielimallille tai sisältöputkelle — puheiden muuttaminen luonnoksiksi on katettu YouTube-videon blogipostiksi, ja jos agenttiohjauskehyksesi puhu MCP:tä, voit ohittaa HTTP-kerroksen kokonaan MCP-palvelimella Claudelle ja Codex:ille. Sama pääte toimii identtisesti Pythonista, jos pino on sekoitettu — katso Python-versio.
Täydellinen parametri ja virhe viite elää youtube2text.org/api.md. Se on kirjoitettu koneelle luettavaksi, mikä sivuvaikutuksena tekee siitä armollisen lyhyt ihmisille myös.