HomeBlogTranscribePlansAPI Keys

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

C#-konsolisovellus, joka deserialisoi YouTube-transkription System.Text.Json:lla

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.