Sha256: 21dc9da3fe9703c08c390be006f008777fdd3c03a5da48a52432fbbe25575698

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 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 = Nyaa::Utils.safe_path(path)
      self.retries     = retries
      self.response    = request
      self.filename    = name_from_disposition

      @fail = nil
    end

    def save
      unless @fail
        path = self.destination + '/' + filename;
        File.open("#{self.destination}/#{filename}", 'w') do |f|
          f.write(self.response.read)
        end
        return path;
      end
      return nil;
    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

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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