Skip to content

Instantly share code, notes, and snippets.

@rye
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rye/6c93434862bc3cfe82c0 to your computer and use it in GitHub Desktop.
Save rye/6c93434862bc3cfe82c0 to your computer and use it in GitHub Desktop.
require "net/http"
require "pry"
# Parameters for episode looping.
#
# Note that 404 seems to be reserved for whining.
MIN_EPISODE_NUMBER = 001
MAX_EPISODE_NUMBER = 417
FORMAT = ".ogv"
(MIN_EPISODE_NUMBER..MAX_EPISODE_NUMBER).each do |episode_number|
puts ">> Now on episode #{episode_number}"
print " >> Sending request..."
# RailsCasts server will handle redirects.
#
# So if we just knock on the route, providing it only the number, it'll
# give us a redirect.
uri = URI.parse("http://railscasts.com/episodes/#{episode_number}")
# Create a request, spoof user-agent to make people think we're s00p3r
# l33t with our curly awesomeness.
request = Net::HTTP::Get.new(uri.to_s, {"User-Agent" => "curl/7.37.0"})
response = Net::HTTP.start(uri.host, uri.port) do |http|
http.request(request)
end
print " #{response.code}!\n"
prefetch_hash = response.to_hash
response_location = response["location"]
puts " >> Have location #{response_location}, parsing..."
match = response_location.match(/(\d+)\-(.+)$/)
episode_number = "%03d" % [match[1]]
episode_title_safe = match[2]
puts " #{episode_number} <=> #{episode_title_safe}"
puts " >> Generating media url..."
media_url = "http://media.railscasts.com/assets/episodes/videos/#{episode_number}-#{episode_title_safe}#{FORMAT}"
puts ""
puts ">> Downloading video from #{media_url}..."
media_uri = URI.parse(media_url)
media_request = Net::HTTP::Get.new(media_uri.to_s, {"User-Agent" => "curl/7.37.0"})
media_response = Net::HTTP.start(media_uri.host, media_uri.port) do |http|
http.request(media_request)
end
puts " >> Done! Writing..."
open("#{episode_number}-#{episode_title_safe}#{FORMAT}", "wb") do |io|
io.write media_response.body
end
puts ">> DONE!", "", "", ""
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment