Skip to content

Instantly share code, notes, and snippets.

@sapslaj
Last active August 29, 2015 14:17
Show Gist options
  • Select an option

  • Save sapslaj/52a6cfa44beea5aac79f to your computer and use it in GitHub Desktop.

Select an option

Save sapslaj/52a6cfa44beea5aac79f to your computer and use it in GitHub Desktop.
Download all Railscasts episodes
require 'httparty'
require 'nokogiri'
require 'json'
require 'pry'
class Downloader
def initialize(episode)
system("wget #{episode.direct_link}")
end
end
class Episode
include HTTParty
base_uri 'http://railscasts.com/episodes/'
attr_reader :revised
attr_reader :slug
attr_reader :metadata
def self.find(episode_number)
full_url = self.get("http://railscasts.com/episodes/#{episode_number}").request.last_uri.to_s
slug = full_url.scan(/episodes\/(.*)/).last.last
Episode.new(slug)
end
def initialize(episode_slug)
@slug = episode_slug
episode_as_json = JSON.parse(HTTParty.get("http://railscasts.com/episodes/#{@slug}.json").body)
@metadata = episode_as_json
self
end
def has_revised?
metadata["revised"]
end
def is_pro?
metadata["pro"]
end
def revised
return nil unless has_revised?
episode_page = Nokogiri::HTML(self.class.get(slug).body)
link = episode_page.xpath("//strong/a").first
revised_slug = link.attributes['href'].value
Episode.find(revised_slug)
end
def download
Downloader.new(self)
end
def direct_link
doc = ::Nokogiri::HTML(self.class.get("http://railscasts.com/episodes/#{slug}").body)
doc.xpath("//ul[@class='downloads horizontal']/li/a").each do |link|
value = link.attributes['href'].value
return value if value.include? 'mp4'
end
end
end
(1..417).each do |episode_number|
begin
episode = Episode.find(episode_number)
puts "Getting episode #{episode_number}"
episode.download
if episode.has_revised?
revised = episode.revised
puts "Getting revised episode"
revised.download unless revised.is_pro?
end
rescue
next
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment