Ruby での YouTube トランスクリプト: Net::HTTP とゼロ Gems

Rubyの反射はbundle add somethingです。5行のコードを書く前に。5分間それを抵抗する: Rubyでコードを書く前にYouTubeトランスクリプトを取得することは、標準ライブラリの外側に何も必要ないということです。APIは1つのHTTPS GETでJSONを返し、net/httpとjsonがすべてのRubyインストール以来座っているからです。このポストの終わりまでに、任意のYouTube URLを取得してビデオタイトルとトランスクリプトを印字するスクリプト、API が返すすべてのエラーをカバーするcaseステートメント―そして空の Gemfile があります。
はい、Net::HTTPのインターフェースはその評判と同じくらい不器用です。それでも20行だけです。
スクリプト
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
urlパラメータは許容度があります―フルウォッチURL、youtu.be短いリンク、ショーツ、または裸の11文字ビデオIDはすべて機能します。encode_www_formにmaxChars: 20000を追加します。トランスクリプトが LLM プロンプトに向かっており、3時間のポッドキャストのトークンを支払いたくない場合。150000はデフォルトと最大値です。
コードベースに既に Faraday または httparty がある場合、問題なく使用してください―リクエストは同じ3つの材料です: エンドポイント、クエリ文字列、1つのヘッダー。それでは、req["Authorization"] = "Bearer #{key}"はx-api-keyと同じに機能します。ベアラートークンがセットアップに適切に合う場合。
1つのコマンドのキー
curl https://youtube2text.org/api/demo-key
それは{"success":true,"apiKey":"yt_..."}をアカウント、メール、何もなく返します。キャッチ: すべての匿名ユーザーの1つの共有キー、月5ビデオあたりIPに制限。スクリプトが機能することを確認するのは素晴らしい、何かデプロイするために間違っています。
トランスクリプトが実際に何であるか
ここで明確に目を広げる価値があります: テキストはYouTubeの字幕トラックから来ます。手動でアップロードされた字幕は美しく読む; 自動生成されたものは時々専門用語と製品名を歪め、上流でAPIができることは何もありません。英語トラックを優先し、最初に利用可能な言語にフォールバック。そして字幕が無効なビデオがTRANSCRIPT_UNAVAILABLEを返します―上記のcaseブランチはそれをスキップとして扱い、再試行ではなく。字幕がないビデオを再試行することは、何も達成するための非常に患者的な方法だからです。
Rubyistsがこれを取るところ
私が見る最も一般的なパターンはバッチ処理です: チャネルのビデオIDをループし、各トランスクリプトを取得し、下流に何かを養う。学生は講演ビデオを研究ノートに変える。下流がClaudeの場合、Claude で無料トランスクリプトチュートリアルはカスタムグルーなしで2つを接続します。PHPから同じエンドポイントはほぼ1行ずつ同じです―比較はここにチームが両方を実行する場合。
共有デモキーが乾いたら、youtube2text.org/app/keysでGoogleサインインしてください―電話なし、カードなし。月5ビデオで$5.99から50から無制限まで$19.99の有料ティアで、独自の無料キーを取得します。スクリプトは変わりません。ENV["YT2TEXT_KEY"]はそうです。