Sha256: f012a2c4c15d5b7036b66e7206785602385c086efed948942d67b55c85493f7b

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 KB

Contents

require "net/http"

module DNN

  class DNN_DownloadError < DNN_Error; end

  class Downloader
    def self.download(url, dir_path = nil)
      unless dir_path
        Dir.mkdir("#{__dir__}/downloads") unless Dir.exist?("#{__dir__}/downloads")
        dir_path = "#{__dir__}/downloads"
      end
      Downloader.new(url).download(dir_path)
    rescue => ex
      raise DNN_DownloadError.new(ex.message)
    end

    def initialize(url)
      @url = url
      *, @fqdn, @path = *url.match(%r`https?://(.+?)(/.+)`)
    end

    def download(dir_path)
      puts %`download "#{@url}"`
      buf = ""
      Net::HTTP.start(@fqdn) do |http|
        content_length = http.head(@path).content_length
        http.get(@path) do |body_segment|
          buf << body_segment
          log = "\r"
          40.times do |i|
            if i < buf.size * 40 / content_length
              log << "="
            elsif i == buf.size * 40 / content_length
              log << ">"
            else
              log << "_"
            end
          end
          log << "  #{buf.size}/#{content_length}"
          print log
        end
        puts ""
      end
      file_name = @path.match(%r`.+/(.+)`)[1]
      File.binwrite("#{dir_path}/#{file_name}", buf)
    end
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ruby-dnn-0.10.1 lib/dnn/downloader.rb
ruby-dnn-0.10.0 lib/dnn/downloader.rb