class WikiData

Public Class Methods

ids_from_pages(lang, titles) click to toggle source
# File lib/wikidata.rb, line 11
def self.ids_from_pages(lang, titles)
  client = MediawikiApi::Client.new "https://#{lang}.wikipedia.org/w/api.php"
  res = titles.compact.each_slice(50).map do |sliced|
    page_args = {
      prop:       'pageprops',
      ppprop:     'wikibase_item',
      redirects:  1,
      titles:     sliced.join('|'),
      token_type: false,
    }
    response = client.action :query, page_args
    redirected_from = Hash[(response.data['redirects'] || []).map { |h| [h['to'], h['from']] }]
    response.data['pages'].select { |_k, v| v.key? 'pageprops' }.map do |_k, v|
      [redirected_from[v['title']] || v['title'], v['pageprops']['wikibase_item']]
    end
  end
  results = Hash[res.flatten(1)]
  missing = titles - results.keys
  warn "Can't find Wikidata IDs for: #{missing.join(', ')} in #{lang}" if missing.any?
  results
end