Sha256: 3c31675062bb8c2cb84b2d798f1f89d70fd9561d79126b65e7465295f91bc2fc

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

require "cgi"
require "securerandom"

module Miteru
  class Kit
    VALID_EXTENSIONS = Miteru.configuration.valid_extensions
    VALID_MIME_TYPES = Miteru.configuration.valid_mime_types

    attr_reader :url

    attr_reader :status
    attr_reader :content_length
    attr_reader :mime_type

    def initialize(url)
      @url = url

      @content_length = nil
      @mime_type = nil
      @status = nil
    end

    def valid?;
      # make a HEAD request for the validation
      before_validation

      valid_ext? && reachable? && valid_mime_type? && valid_content_length?
    end

    def extname
      return ".tar.gz" if url.end_with?("tar.gz")

      File.extname(url)
    end

    def basename
      File.basename(url)
    end

    def filename
      CGI.unescape basename
    end

    def download_filepath
      "#{base_dir}/#{download_filename}"
    end

    def filesize
      return nil unless File.exist?(download_filepath)

      File.size download_filepath
    end

    def filename_with_size
      return filename unless filesize

      "#{filename}(#{filesize / 1024}KB)"
    end

    private

    def id
      @id ||= SecureRandom.hex(10)
    end

    def hostname
      URI(url).hostname
    end

    def download_filename
      "#{hostname}_#{filename}_#{id}#{extname}"
    end

    def base_dir
      @base_dir ||= Miteru.configuration.download_to
    end

    def valid_ext?
      VALID_EXTENSIONS.include? extname
    end

    def before_validation
      res = HTTPClient.head(url)
      @content_length = res.content_length
      @mime_type = res.content_type.mime_type.to_s
      @status = res.status
    rescue StandardError
      # do nothing
    end

    def reachable?
      status&.success?
    end

    def valid_mime_type?
      VALID_MIME_TYPES.include? mime_type
    end

    def valid_content_length?
      content_length.to_i > 0
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
miteru-0.14.7 lib/miteru/kit.rb
miteru-0.14.6 lib/miteru/kit.rb