diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2017-04-27 14:42:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-27 14:42:22 +0200 |
commit | 88725d6ce85115ea3b0652007db5d40a1c069be3 (patch) | |
tree | 7a8965abda1cfc3b6c319ea19ee216755ac2f2df /app/lib/provider_discovery.rb | |
parent | be0a01145b5f303c5c506858146ccf6c6d5cee72 (diff) |
OEmbed support for PreviewCard (#2337)
* OEmbed support for PreviewCard * Improve ProviderDiscovery code failure treatment * Do not crawl links if there is a content warning, since those don't display a link card anyway * Reset db schema * Fresh migrate * Fix rubocop style issues Fix #1681 - return existing access token when applicable instead of creating new * Fix test * Extract http client to helper * Improve oembed controller
Diffstat (limited to 'app/lib/provider_discovery.rb')
-rw-r--r-- | app/lib/provider_discovery.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/app/lib/provider_discovery.rb b/app/lib/provider_discovery.rb new file mode 100644 index 000000000..761ddae0f --- /dev/null +++ b/app/lib/provider_discovery.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class ProviderDiscovery < OEmbed::ProviderDiscovery + include HttpHelper + + class << self + def discover_provider(url, options = {}) + res = http_client.get(url) + format = options[:format] + + raise OEmbed::NotFound, url if res.code != 200 || res.mime_type != 'text/html' + + html = Nokogiri::HTML(res.to_s) + + if format.nil? || format == :json + provider_endpoint ||= html.at_xpath('//link[@type="application/json+oembed"]')&.attribute('href')&.value + format ||= :json if provider_endpoint + end + + if format.nil? || format == :xml + provider_endpoint ||= html.at_xpath('//link[@type="application/xml+oembed"]')&.attribute('href')&.value + format ||= :xml if provider_endpoint + end + + begin + provider_endpoint = Addressable::URI.parse(provider_endpoint) + provider_endpoint.query = nil + provider_endpoint = provider_endpoint.to_s + rescue Addressable::URI::InvalidURIError + raise OEmbed::NotFound, url + end + + OEmbed::Provider.new(provider_endpoint, format || OEmbed::Formatter.default) + end + end +end |