lib/oembed/resolver.rb
module Oembed
class Resolver
class ProviderNotSupported < StandardError
end
def initialize(url)
@url = url
end
def embed_code
# Resolve the provider and fetch embed code using the provider.
provider.new(@url).embed_code
end
private
def provider
uri = URI.parse(@url)
klass =
providers.find do |provider_klass|
string_matches_any?(uri.host, provider_klass.domains) &&
string_matches_any?(uri.path, provider_klass.paths)
end
return klass if klass.present?
fallback_klass =
fallback_providers.find do |fallback_provider_klass|
string_matches_any?(uri.host, fallback_provider_klass.domains) &&
string_matches_any?(uri.path, fallback_provider_klass.paths)
end
return fallback_klass if fallback_klass.present?
raise ProviderNotSupported,
"The hostname '#{uri.host}' could not be resolved to any known provider."
end
def string_matches_any?(string, regexes)
regexes.any? { |regex| string.match?(regex) }
end
def providers
[
Oembed::YoutubeProvider,
Oembed::VimeoProvider,
Oembed::SlideshareProvider
]
end
def fallback_providers
[
Oembed::GoogleDocumentsFallbackProvider,
Oembed::GoogleSlidesFallbackProvider,
Oembed::GoogleSpreadsheetsFallbackProvider,
Oembed::GoogleFormsFallbackProvider,
Oembed::ScribehowFallbackProvider
]
end
end
end