Transkrip YouTube di Ruby: Net::HTTP dan Zero Gems

Refleks Ruby adalah bundle add something sebelum menulis garis kode. Tahan selama lima menit: mengambil transkrip YouTube di Ruby tidak membutuhkan apa pun di luar perpustakaan standar, karena API adalah satu GET HTTPS yang mengembalikan JSON, dan net/http plus json telah duduk di setiap instalasi Ruby selamanya. Di akhir posting ini Anda akan memiliki skrip yang mengambil URL YouTube apa pun dan mencetak judul video dan transkrip, dengan pernyataan case mencakup setiap kesalahan yang dikembalikan API — dan Gemfile kosong.
Ya, antarmuka Net::HTTP secemar reputasinya. Masih hanya dua puluh baris.
Skrip
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
Parameter url memaafkan — URL watch penuh, tautan pendek youtu.be, shorts, atau id video 11 karakter bare semuanya bekerja. Tambahkan maxChars: 20000 ke encode_www_form jika transkrip menuju ke prompt LLM dan Anda lebih suka tidak membayar untuk token podcast tiga jam; 150000 adalah default dan maksimum.
Jika codebase Anda sudah memiliki Faraday atau httparty, baik, gunakan — permintaannya adalah tiga bahan yang sama: endpoint, string query, dan satu header. Berbicara tentang yang mana, req["Authorization"] = "Bearer #{key}" bekerja identik dengan x-api-key jika token pembawa cocok dengan setup Anda lebih baik.
Kunci dalam satu perintah
curl https://youtube2text.org/api/demo-key
Itu mengembalikan {"success":true,"apiKey":"yt_..."} tanpa akun, tanpa email, tidak ada. Tangkapannya: ini satu kunci bersama untuk semua pengguna anonim, terbatas pada 5 video per bulan per IP. Bagus untuk memverifikasi skrip bekerja, salah untuk apa pun yang akan Anda penyebarkan.
Apa transkrip sebenarnya
Patut jelas di sini: teks berasal dari trek caption YouTube. Caption yang diunggah secara manual dibaca indah; yang auto-generated kadang-kadang mangles jargon dan nama produk, dan tidak ada API yang dapat lakukan tentang upstream itu. Trek Bahasa Inggris disukai, dengan fallback ke bahasa pertama tersedia. Dan video dengan caption dinonaktifkan mengembalikan TRANSCRIPT_UNAVAILABLE — cabang case di atas memperlakukannya sebagai lompatan, bukan retry, karena mencoba ulang video yang tidak memiliki caption adalah cara yang sangat sabar untuk mencapai tidak ada.
Di mana Rubyists membawanya
Pola yang saya lihat paling banyak adalah pemrosesan batch: loop melalui id video channel, ambil setiap transkrip, beri makan mereka ke sesuatu di hilir. Siswa mengubah video kuliah menjadi catatan studi; jika hilir adalah Claude, transkrip gratis di Claude walkthrough menghubungkan dua tanpa lem kustom. Endpoint yang sama dari PHP adalah hampir baris-untuk-baris identik — perbandingan di sini jika tim Anda menjalankan keduanya.
Ketika kunci demo bersama habis, masuk dengan Google di youtube2text.org/app/keys — tidak ada telepon, tidak ada kartu. Anda mendapat kunci gratis Anda sendiri pada 5 video per bulan, dengan tingkat berbayar dari $5,99 untuk 50 hingga $19,99 unlimited. Skrip tidak berubah; ENV["YT2TEXT_KEY"] lakukan.