YouTube Transkriptio C#:ssä HttpClient:illa ja Record:eilla

dotnet run -komennosta tulostettuun transkriptioon kului noin kaksi sekuntia koneellani, ja suurin osa siitä oli verkon kierroksen matka. Tässä viestissä ei esiinny yhtään NuGet-paketteja — YouTube-transkription hankkiminen C#:ssä on yksi GET-pyyntö ja HttpClient sekä System.Text.Json ovat olleet laatikoissa vuosia. Lopussa sinulla on valmis konsolisovellus, jossa on tietuetyypit vastaukselle, asynkroninen Main ja virheenkäsittely, joka lukee API:n strukturoidun virheen objektin sen sijaan, että arvailtaisiin tilakoodeista.
Kolme tietuetta
API palauttaa {"result": {...}} onnistuessa ja {"error": {...}} epäonnistuessa, joten mallinne verhon suoraan:
public record Transcript(
string VideoId,
string Title,
string PubDate,
string Content,
int ContentSize,
bool Truncated);
public record ApiError(
string Code,
string Message,
int Status,
int? RetryAfterSeconds);
public record Envelope(Transcript? Result, ApiError? Error);
Yksi Deserialize<Envelope>-kutsu käsittelee jokaisen vastauksen. Kumpi tahansa ominaisuus, joka ei ole nolla, on vastauksesi. RetryAfterSeconds on nullable, koska vain nopeusrajoitus-virheet kantavat sen.
Ohjelma
Kohdistuu .NET 8:aan, toimii sellaisenaan 6:lla ja 7:llä:
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public static class Program
{
private static readonly HttpClient Http = new();
private static readonly JsonSerializerOptions Json =
new(JsonSerializerDefaults.Web);
public static async Task Main(string[] args)
{
var videoUrl = args.Length > 0
? args[0]
: "https://www.youtube.com/watch?v=dQw4w9WgXcQ";
var request = new HttpRequestMessage(HttpMethod.Get,
"https://youtube2text.org/api/transcribe" +
$"?url={Uri.EscapeDataString(videoUrl)}&maxChars=40000");
request.Headers.Add("x-api-key",
Environment.GetEnvironmentVariable("YT2TEXT_KEY"));
var response = await Http.SendAsync(request);
var envelope = JsonSerializer.Deserialize<Envelope>(
await response.Content.ReadAsStringAsync(), Json);
if (envelope?.Error is { } err)
{
Console.Error.WriteLine($"{err.Code}: {err.Message}");
if (err.RetryAfterSeconds is int wait)
Console.Error.WriteLine($"Retry after {wait}s");
Environment.Exit(1);
}
var t = envelope!.Result!;
Console.WriteLine($"{t.Title} ({t.ContentSize} chars, truncated: {t.Truncated})");
Console.WriteLine(t.Content[..Math.Min(t.Content.Length, 400)]);
}
}
JsonSerializerDefaults.Web kartoittaa API:n camelCase-kentät PascalCase-tietueen ominaisuuksiksi, joten ei ole yhtään [JsonPropertyName]-attribuuttia näkyvissä. url-parametri hyväksyy jokaisen YouTube URL -muodon sekä paljaiden 11-merkkisten tunnisteita, ja otsikko voi olla Authorization: Bearer yt_... x-api-key:n sijaan, jos se sopii middleware-sovelmukseen paremmin.
Siitä maxChars=40000
maxChars kattaa transkription pituuden; 150000 on sekä oletus että kova katto. Jos videon kuvatekstit kulkevat korkosi jälkeen, Truncated tulee takaisin true ja saat ensimmäisen N-merkin — joten tarkista lippu ennen kuin oletetaan olevan täydellinen teksti. Asetan 40000:n esimerkissä, koska nämä transkriptiot päätyvät yleensä LLM-kehotteeseen, ja neljän merkin tunniste-säännöllä se on 10k-tunnisteen budjetti. Jos mallikutsut menevät OpenAI Responses API:n kautta, on tapa ohittaa HTTP-putki kokonaan MCP-palvelimen kautta OpenAI:lla; Anthropic-vastine on kohdassa transkriptioiden käyttö Claude API:n kanssa.
Virhekoodit, joilla haarautetaan
ApiError.Code on vakaa merkkijono: UNAUTHORIZED (401), VALIDATION_ERROR ja INVALID_URL (400), VIDEO_NOT_FOUND ja TRANSCRIPT_UNAVAILABLE (404), RATE_LIMIT_EXCEEDED (429), YOUTUBE_ERROR (500). Yksi, joka yllättää ihmisiä, on TRANSCRIPT_UNAVAILABLE: transkriptiot tulevat YouTuben kuvateksti-raiteista, ja videota, jonka omistaja poisti kuvatekstit, ei ole palautettavaa — mikään uudelleenyritys-käytäntö ei korjaa sitä. Kuvioksi sovita koodille, käsittele sitä pysyvänä ohituksena.
Nolla-rekisteröinnin test-avainta varten, GET https://youtube2text.org/api/demo-key — se on jaettu ja rajoitettu 5 videoon kuukaudessa per IP, joten se on vain kokeille. Jos Go on myös pinoossasi, sama kutsu Golangin kanssa käyttää identtistä verhoa.
Täydellinen kone-luettava viite — jokainen parametri, jokainen virhe, valmis liitettäväksi järjestelmän kehötteeseen — on youtube2text.org/api.md.