Sha256: 67dc3779ff0de86ffc97c224fd630c18c34f94e4b35606580d23820869040996

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

# -*- encoding : utf-8 -*-
module Nyaa
  class Downloader
    attr_accessor :target, :destination, :retries
    attr_accessor :response, :filename

    def initialize(url, path, retries = 3)
      self.target      = url
      self.destination = sane_dir(path)
      self.retries     = retries
      self.response    = request
      self.filename    = name_from_disposition

      @fail = nil
    end

    def save
      unless @fail
        File.open("#{self.destination}/#{filename}", 'w') do |f|
          f.write(self.response.read)
        end
      end
    end

    def failed?
      @fail
    end

    private

    def request
      begin
        response = open(self.target)
      rescue StandardError => e
        if retries > 0
          retries -= 1
          sleep = 1
          retry
        end
        @fail = true
      end
      @fail = false
      response
    end

    # Filename from Content Disposition Header Field
    # http://www.ietf.org/rfc/rfc2183.txt
    def name_from_disposition
      disp = self.response.meta['content-disposition']
      disp_filename = disp.split(/;\s+/).select { |v| v =~ /filename\s*=/ }[0]
      re = /([""'])(?:(?=(\\?))\2.)*?\1/
      if re.match(disp_filename)
        filename = re.match(disp_filename).to_s.gsub(/\A['"]+|['"]+\Z/, "")
      else
        nil
      end
    end

    def sane_dir(path)
      path = Dir.pwd if path.nil? || !File.writable?(path)
      FileUtils.mkdir_p path unless File.directory?(path)
      path
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nyaa-1.0.3 lib/nyaa/downloader.rb