module Onebox::Engine::StandardEmbed

Public Class Methods

add_oembed_provider(regexp, endpoint) click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 14
def self.add_oembed_provider(regexp, endpoint)
  oembed_providers[regexp] = endpoint
end
add_opengraph_provider(regexp) click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 22
def self.add_opengraph_provider(regexp)
  opengraph_providers << regexp
end
oembed_providers() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 10
def self.oembed_providers
  @@oembed_providers ||= {}
end
opengraph_providers() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 18
def self.opengraph_providers
  @@opengraph_providers ||= []
end

Public Instance Methods

always_https?() click to toggle source
Calls superclass method
# File lib/onebox/engine/standard_embed.rb, line 34
def always_https?
  AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts) || super
end
raw() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 38
def raw
  return @raw if defined?(@raw)

  og = get_opengraph
  twitter = get_twitter
  oembed = get_oembed

  @raw = {}

  og.data.each do |k, v|
    next if k == "title_attr"
    v = og.send(k)
    @raw[k] ||= v unless v.nil?
  end

  twitter.each { |k, v| @raw[k] ||= v unless Onebox::Helpers::blank?(v) }

  oembed.data.each do |k, v|
    v = oembed.send(k)
    @raw[k] ||= v unless v.nil?
  end

  favicon = get_favicon
  @raw["favicon".to_sym] = favicon unless Onebox::Helpers::blank?(favicon)

  @raw
end

Protected Instance Methods

get_favicon() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 100
def get_favicon
  return nil unless html_doc

  favicon = html_doc.css('link[rel="shortcut icon"], link[rel="icon shortcut"], link[rel="shortcut"], link[rel="icon"]').first
  favicon = favicon.nil? ? nil : (favicon['href'].nil? ? nil : favicon['href'].strip)

  Onebox::Helpers::get_absolute_image_url(favicon, url)
end
get_json_response() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 109
def get_json_response
  oembed_url = get_oembed_url

  return "{}" if Onebox::Helpers.blank?(oembed_url)

  Onebox::Helpers.fetch_response(oembed_url) rescue "{}"
rescue Errno::ECONNREFUSED, Net::HTTPError, Net::HTTPFatalError, MultiJson::LoadError
  "{}"
end
get_oembed() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 77
def get_oembed
  @oembed ||= Onebox::Oembed.new(get_json_response)
end
get_oembed_url() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 119
def get_oembed_url
  oembed_url = nil

  StandardEmbed.oembed_providers.each do |regexp, endpoint|
    if url =~ regexp
      oembed_url = "#{endpoint}?url=#{url}"
      break
    end
  end

  if html_doc
    if Onebox::Helpers.blank?(oembed_url)
      application_json = html_doc.at("//link[@type='application/json+oembed']/@href")
      oembed_url = application_json.value if application_json
    end

    if Onebox::Helpers.blank?(oembed_url)
      text_json = html_doc.at("//link[@type='text/json+oembed']/@href")
      oembed_url ||= text_json.value if text_json
    end
  end

  oembed_url
end
get_opengraph() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 81
def get_opengraph
  @opengraph ||= ::Onebox::OpenGraph.new(html_doc)
end
get_twitter() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 85
def get_twitter
  return {} unless html_doc

  twitter = {}

  html_doc.css('meta').each do |m|
    if (m["property"] && m["property"][/^twitter:(.+)$/i]) || (m["name"] && m["name"][/^twitter:(.+)$/i])
      value = (m["content"] || m["value"]).to_s
      twitter[$1.tr('-:' , '_').to_sym] ||= value unless (Onebox::Helpers::blank?(value) || value == "0 minutes")
    end
  end

  twitter
end
html_doc() click to toggle source
# File lib/onebox/engine/standard_embed.rb, line 68
def html_doc
  return @html_doc if defined?(@html_doc)

  headers = nil
  headers = { 'Cookie' => options[:cookie] } if options[:cookie]

  @html_doc = Onebox::Helpers.fetch_html_doc(url, headers)
end