Module: Cinnabar::Downloader

Defined in:
lib/cinnabar/net.rb,
lib/cinnabar/net.rb

Defined Under Namespace

Modules: StrExt, StrMixin, StrRefin

Constant Summary collapse

DEFAULT_DL_OPTS =
{
  out_dir: 'tmp', file_name: nil,
}.freeze

Class Method Summary collapse

Class Method Details

.build_headers(headers) ⇒ Hash

Returns:

  • (Hash)


48
49
50
51
52
53
# File 'lib/cinnabar/net.rb', line 48

def build_headers(headers)
  base_headers = {
    'User-Agent' => 'Mozilla/5.0 (Linux; aarch64 Wayland; rv:138.0) Gecko/20100101 Firefox/138.0',
  }
  base_headers.merge(headers || {}).transform_keys(&:to_s)
end

.determine_filename(file_name, parsed_url) ⇒ String

Returns:

  • (String)


56
57
58
59
60
61
62
# File 'lib/cinnabar/net.rb', line 56

def determine_filename(file_name, parsed_url)
  filename = file_name || File.basename(parsed_url.path || '')
  case filename.strip
    when '', '/' then 'index.html'
    else filename
  end
end

.download(url, opts = {}) ⇒ Integer

Examples:


url = 'https://docs.ruby-lang.org/en/3.4/OpenURI.html'
opts = { out_dir: "tmp", file_name: "doc.html" }
DL = Cinnabar::Downloader
DL.download(url, opts)

Parameters:

  • url (String)
  • opts (Hash) (defaults to: {})

    Options for customizing the download behavior. e.g., {out_dir: 'download', file_name: nil, headers: {'User-Agent' => "aria2/1.37.0"}}

Options Hash (opts):

  • :out_dir (String)

    Directory where the downloaded file will be saved.

  • :file_name (String, nil)

    Name of the output file. If nil, it will be inferred from the URL.

  • :headers (Hash{String => String})

    Optional HTTP headers to include in the request.

Returns:

  • (Integer)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/cinnabar/net.rb', line 31

def download(url, opts = {})
  opts = DEFAULT_DL_OPTS.merge(opts)
  out_dir, file_name, headers = opts.values_at(:out_dir, :file_name, :headers)
  out_dir = '.' if out_dir.nil?

  headers = build_headers(headers)
  parsed_url = Kernel.URI(url)
  final_file_name = determine_filename(file_name, parsed_url)
  file_path = setup_file_path(out_dir, final_file_name)

  Kernel.p file_path
  parsed_url
    .open(headers)
    .then { IO.copy_stream(_1, file_path.to_s) }
end

.setup_file_path(out_dir, file_name) ⇒ Pathname

Returns:

  • (Pathname)


65
66
67
68
69
# File 'lib/cinnabar/net.rb', line 65

def setup_file_path(out_dir, file_name)
  Kernel.Pathname(out_dir)
    .tap(&:mkpath)
    .join(file_name)
end