Transcription YouTube en Ruby : Net::HTTP et zéro gems

Le réflexe Ruby est bundle add quelque_chose avant d'écrire une ligne de code. Résistez-y pendant cinq minutes : récupérer une transcription YouTube en Ruby n'a besoin de rien en dehors de la bibliothèque standard, parce que l'API est un GET HTTPS retournant du JSON, et net/http plus json ont été assis dans chaque installation Ruby depuis toujours. À la fin de cet article, vous aurez un script qui prend n'importe quelle URL YouTube et imprime le titre vidéo et la transcription, avec une instruction case couvrant chaque erreur que l'API retourne — et un Gemfile vide.
Oui, l'interface de Net::HTTP est aussi maladroite que sa réputation. C'est toujours seulement vingt lignes.
Le script
require "net/http"
require "json"
require "uri"
uri = URI("https://youtube2text.org/api/transcribe")
uri.query = URI.encode_www_form(
url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
)
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("YT2TEXT_KEY")
res = Net::HTTP.start(uri.hostname, uri.port,
use_ssl: true, read_timeout: 60) do |http|
http.request(req)
end
data = JSON.parse(res.body)
if res.is_a?(Net::HTTPSuccess)
transcript = data["result"]
puts transcript["title"]
puts "#{transcript['contentSize']} chars, truncated: #{transcript['truncated']}"
puts transcript["content"][0, 400]
else
err = data["error"]
case err["code"]
when "RATE_LIMIT_EXCEEDED"
puts "Rate limited. Retry in #{err['retryAfterSeconds']}s."
when "TRANSCRIPT_UNAVAILABLE"
puts "No captions on this video. Skip it."
when "VIDEO_NOT_FOUND", "INVALID_URL"
puts "Bad video reference: #{err['message']}"
else
abort "#{err['code']}: #{err['message']}"
end
end
Le paramètre url est indulgent — les URL de lecture complètes, les liens courts youtu.be, les shorts, ou un identifiant vidéo nu de 11 caractères fonctionnent tous. Ajoutez maxChars: 20000 à encode_www_form si la transcription se dirige vers un prompt LLM et que vous préférez ne pas payer pour les jetons d'un podcast de trois heures ; 150000 est la valeur par défaut et le maximum.
Si votre codebase a déjà Faraday ou httparty, bien, utilisez-les — la requête est la même trois ingrédients : le point de terminaison, une chaîne de requête, et un en-tête. En parlant de cela, req["Authorization"] = "Bearer #{key}" fonctionne identiquement à x-api-key si les jetons bearer correspondent mieux à votre setup.
Une clé en une commande
curl https://youtube2text.org/api/demo-key
Cela retourne {"success":true,"apiKey":"yt_..."} sans compte, sans email, rien. L'attrapé : c'est une clé partagée pour tous les utilisateurs anonymes, limitée à 5 vidéos par mois par IP. Excellent pour vérifier que le script fonctionne, mauvais pour tout ce que vous déploieriez.
Ce que la transcription est réellement
Ça vaut la peine d'être clair-eyed ici : le texte provient des pistes de sous-titres de YouTube. Les sous-titres téléchargés manuellement lisent magnifiquement ; les auto-générés massacrent occasionnellement le jargon et les noms de produits, et il n'y a rien qu'aucune API ne puisse faire à ce sujet en amont. Les pistes anglaises sont préférées, avec repli à la première langue disponible. Et une vidéo avec sous-titres désactivés retourne TRANSCRIPT_UNAVAILABLE — la branche case ci-dessus la traite comme un skip, pas une nouvelle tentative, parce que réessayer une vidéo qui n'a pas de sous-titres est une très patient façon de ne rien accomplir.
Où les Rubyistes le prennent
Le motif que je vois le plus est le traitement par lot : boucler sur les identifiants vidéo d'un canal, récupérer chaque transcription, les alimenter en quelque chose en aval. Les étudiants transforment les vidéos de conférences en notes d'étude ; si la suite est Claude, la marche des transcriptions gratuites dans Claude connecte les deux sans colle personnalisée. Le même point de terminaison à partir de PHP est presque ligne-par-ligne identique — comparaison ici si votre équipe exécute les deux.
Quand la clé démo partagée s'épuise, connectez-vous avec Google sur youtube2text.org/app/keys — pas de téléphone, pas de carte. Vous obtenez votre propre clé gratuite à 5 vidéos par mois, avec les plans payants de $5.99 pour 50 jusqu'à $19.99 illimité. Le script ne change pas ; ENV["YT2TEXT_KEY"] change.