class WWDCDownloader

Constants

BASE_URI

Attributes

dl_dir[RW]
downloaded_files[RW]
min_date[RW]
proxy_uri[RW]

Public Class Methods

new(dl_dir, min_date) click to toggle source
# File lib/wwdcdownloader.rb, line 30
def initialize(dl_dir, min_date)
  self.dl_dir = dl_dir
  self.min_date = min_date
  self.downloaded_files = []
  self.proxy_uri = nil

  if ENV['http_proxy'] || ENV['HTTP_PROXY']
    uri = (ENV['http_proxy']) ? ENV['http_proxy'] : ENV['HTTP_PROXY']
    self.proxy_uri = URI.parse(uri)
  end
end
run!(*args) click to toggle source
# File lib/wwdcdownloader.rb, line 182
def self.run!(*args)
  puts "WWDC 2018 Session Material Downloader"
  puts "by Johannes Fahrenkrug, @jfahrenkrug, springenwerk.com"
  puts "See you next year!"
  puts
  puts "Usage: wwdcdownloader [<target-dir>]"
  puts

  dl_dir = if args.size == 1
    args.last
  else
    'wwdc2018-assets'
  end

  w = WWDCDownloader.new(dl_dir, '2018-06-01')
  w.load
  return 0
end

Public Instance Methods

download_file(url, filename, dest_dir, duplicates_ok = true) click to toggle source
# File lib/wwdcdownloader.rb, line 92
def download_file(url, filename, dest_dir, duplicates_ok = true)
  did_download = false
  outfilename = dest_dir + "/" + filename
  if duplicates_ok or (!File.exists?(outfilename) and !self.downloaded_files.include?(url))
    # remember what we downloaded
    self.downloaded_files << url

    puts "  Downloading #{url}"
    begin
      self.read_url(url) do |downloaded_file|
        open(outfilename, 'wb') do |file|
          file.write(downloaded_file)
        end
        did_download = true
      end
    rescue Exception => e
      puts "  Download failed #{e}"
    end
  elsif !duplicates_ok
    puts "  Already downloaded this file, skipping."
  end

  did_download
end
download_sample_code_from_book_json(book_json_url, code_base_url, dest_dir, duplicates_ok) click to toggle source
# File lib/wwdcdownloader.rb, line 75
def download_sample_code_from_book_json(book_json_url, code_base_url, dest_dir, duplicates_ok)
  did_download = false
  self.read_url(book_json_url) do |book_json|
    if book_json[0,1] == '<'
      puts " Sorry, this samplecode apparently isn't available yet: #{code_base_url}/book.json"
    else
      book_res = JSON.parse(book_json)
      filename = book_res["sampleCode"]
      url = "#{code_base_url}/#{filename}"

      did_download = download_file(url, filename, dest_dir, duplicates_ok)
    end
  end

  did_download
end
load() click to toggle source
# File lib/wwdcdownloader.rb, line 117
def load
  mkdir(dl_dir)

  # get the sessions JSON
  self.read_url(BASE_URI) do |body|
    res = JSON.parse(body)

    sessions = res['contents']
    resources = res['resources']

    if sessions.size > 0
      sessions.each do |session|
        if session['type'] == 'Session' && session['eventId'] == 'wwdc2018'
          title = session['title']
          session_id = session['id'].gsub('wwdc2018-', '')
          puts "Session #{session_id} '#{title}'..."

          if session['related'] && session['related']['resources']
            # Iterate over the resources
            related_resource_ids = session['related']['resources']
            did_download = false

            # get the files
            dirname = "#{dl_dir}/#{session_id}-#{title.gsub(/\/|&|!/, '')}"
            puts "  Creating #{dirname}"
            did_create_dir = mkdir(dirname)

            resources.each do |resource|
              if resource['resource_type'] == 'samplecode' && related_resource_ids.include?(resource['id'])
                puts "  Found related resource #{resource['url']}"

                # Zip file? download right away
                if resource['url'] =~ /(\w+\.zip)$/
                  uri = URI.parse(resource['url'])
                  filename = File.basename(uri.path)

                  if download_file(resource['url'], filename, dirname, true)
                    did_download = true
                  end
                # Sample code landing page?
                else
                  # Sanitize URL
                  url = resource['url'].split('/Introduction/Intro.html')[0]

                  if download_sample_code_from_book_json("#{url}/book.json", url, dirname, false)
                    did_download = true
                  end
                end
              end
            end

            if !did_download and did_create_dir
              Dir.delete(dirname)
            end
          end
        end
      end
    else
      print "No sessions :(.\n"
    end
  end

  puts "Done."
end
mkdir(dir) click to toggle source

Creates the given directory if it doesn't exist already.

# File lib/wwdcdownloader.rb, line 43
def mkdir(dir)
  if File.directory?(dir)
    false
  else
    Dir.mkdir dir
    true
  end
end
read_url(url) { |body| ... } click to toggle source
# File lib/wwdcdownloader.rb, line 52
def read_url(url)
  uri = URI.parse(url)

  http = nil

  if self.proxy_uri
    http = Net::HTTP.new(uri.host, uri.port, self.proxy_uri.host, self.proxy_uri.port, self.proxy_uri.user, self.proxy_uri.password)
  else
    http = Net::HTTP.new(uri.host, uri.port)
  end

  http.use_ssl = true

  http.start do |http|
   request = Net::HTTP::Get.new(uri.request_uri)
   response = http.request(request)

   if response.code == '200'
     yield(response.body)
   end
 end
end