class BibSync::Actions::FetchFromArXiv

Constants

SliceSize

Public Class Methods

new(options) click to toggle source
# File lib/bibsync/actions/fetch_from_arxiv.rb, line 9
def initialize(options)
  raise 'Option --fetch is required' unless @fetch = options[:fetch]
  raise 'Option --dir is required' unless @dir = options[:dir]
end

Public Instance Methods

run() click to toggle source
# File lib/bibsync/actions/fetch_from_arxiv.rb, line 14
def run
  arxivs = []
  urls = []

  @fetch.each do |url|
    if url =~ /\A(\d+\.\d+)(v\d+)?\Z/
      arxivs << $1
    elsif url =~ %r{\Ahttp://arxiv.org/abs/(\d+\.\d+)(v\d+)?\Z}
      arxivs << $1
    else
      urls << url
    end
  end

  unless urls.empty?
    notice 'Starting browser for non-arXiv urls'
    urls.each do |url|
      info "Opening #{url}"
      `xdg-open #{Shellwords.escape url}`
    end
  end

  unless arxivs.empty?
    notice 'Downloading from arXiv'
    arxivs.each_slice(SliceSize) do |ids|
      begin
        xml = fetch_xml('http://export.arxiv.org/api/query', id_list: ids.join(','), max_results: SliceSize)
        xml.each_element('//entry/id') do |id|
          id = id.text.gsub('http://arxiv.org/abs/', '')
          info 'arXiv download', key: id
          arxiv_download(@dir, id)
        end
      rescue => ex
        error('arXiv query failed', ex: ex)
      end
    end
  end
end