Transkrypcja YouTube w Ruby: Net::HTTP i Zero Gems

Odruch Ruby to bundle add something przed napisaniem linii kodu. Opór tego przez pięć minut: pobieranie transkrypcji YouTube w Ruby potrzebuje nic spoza biblioteki standardowej, ponieważ API to jedno HTTPS GET zwracające JSON, a net/http plus json siedzi w każdej instalacji Ruby od zawsze. Na koniec tego postu będziesz mieć skrypt, który przyjmuje każdy adres URL YouTube i wydrukuje tytuł wideo i transkrypcję, z instrukcją case obejmującą każdy błąd API zwraca — i pusty Gemfile.
Tak, interfejs Net::HTTP jest tak nieręczny, jak jego reputacja. To wciąż tylko dwadzieścia linii.
Skrypt
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
Parametr url jest tolerancyjny — pełne adresy URL, youtu.be krótkie linki, shorts, lub gołe 11-znakowe id wszystkie działają. Dodaj maxChars: 20000 do encode_www_form, jeśli transkrypcja zmierza do promptu LLM i wolisz nie płacić za trzygodzinny podcast warte tokenów; 150000 to domyślna i maksymalna.
Jeśli Twoja baza kodu ma już Faraday lub httparty, dobrze, używaj ich — żądanie to te same trzy składniki: punkt końcowy, łańcuch zapytania i jeden nagłówek. Mówiąc o którym, req["Authorization"] = "Bearer #{key}" działa identycznie do x-api-key, jeśli tokeny nośnika lepiej pasują do Twojej konfiguracji.
Klucz w jednym poleceniu
curl https://youtube2text.org/api/demo-key
To zwraca {"success":true,"apiKey":"yt_..."} bez konta, bez e-maila, nic. Haczyk: to jeden wspólny klucz dla wszystkich anonimowych użytkowników, ograniczony do 5 filmów na miesiąc na IP. Świetnie do weryfikacji działania skryptu, źle do czegokolwiek, co wdrażasz.
Czym naprawdę jest transkrypcja
Warte bycia czystookiejącej tutaj: tekst pochodzi z pasów napisów YouTube. Ręcznie przesłane napisy czytają pięknie; autogenerowane czasami zniekształcają żargon i nazwy produktów, i nie ma nic, co każdy API może zrobić na temat tego upstream. Ścieżki angielskie są preferowane, z rezerwą do pierwszego dostępnego języka. I film z wyłączonymi napisami zwraca TRANSCRIPT_UNAVAILABLE — gałąź case powyżej traktuje to jako pominięcie, nie ponowną próbę, ponieważ ponowna próba wideo, które nie ma napisów, to pacjentny sposób na osiągnięcie nic.
Gdzie Rubyists idą z tym
Wzorzec, który widzę najbardziej, to przetwarzanie wsadowe: pętla nad id wideo kanału, pobierz każdą transkrypcję, podaj do czegoś dalej. Studenci zamieniają filmy wykładów w notatki badawcze; jeśli downstream to Claude, bezpłatne transkrypcje w Claude spacer łączy dwa bez niestandardowego kleju. Ten sam punkt końcowy z PHP jest prawie identyczną linię — porównanie tutaj, jeśli Twój zespół uruchamia oba.
Gdy wspólny klucz demo wyschnie, zaloguj się za pomocą Google na youtube2text.org/app/keys — brak telefonu, brak karty. Otrzymujesz własny bezpłatny klucz na 5 filmów na miesiąc, z płatnymi poziomami od 5,99 USD za 50 do 19,99 USD bez limitu. Skrypt się nie zmienia; ENV["YT2TEXT_KEY"] to.