Class: OEmbed::Provider

Inherits:
Object
  • Object
show all
Includes:
HttpHelper
Defined in:
lib/oembed/provider.rb

Overview

An OEmbed::Provider has information about an individual oEmbed enpoint.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(endpoint, format = OEmbed::Formatter.default) ⇒ Provider

Construct a new OEmbed::Provider instance, pointing at a specific oEmbed endpoint.

The endpoint should be a String representing the http URI of the Provider's oEmbed endpoint. The endpoint String may also contain a format portion. In actual requests to this Provider, this string will be replaced with a String representing the request format (e.g. “json”).

If give, the format should be the name of the default format for all request to this Provider (e.g. 'json'). Defaults to OEmbed::Formatter.default

For example:

# If requests should be sent to:
# "http://my.service.com/oembed?format=#{OEmbed::Formatter.default}"
@provider = OEmbed::Provider.new("http://my.service.com/oembed")

# If requests should be sent to:
# "http://my.service.com/oembed.xml"
@xml_provider = OEmbed::Provider.new("http://my.service.com/oembed.{format}", :xml)

Raises:

  • (ArgumentError)


50
51
52
53
54
55
56
57
# File 'lib/oembed/provider.rb', line 50

def initialize(endpoint, format = OEmbed::Formatter.default)
  endpoint_uri = URI.parse(endpoint.gsub(/[\{\}]/,'')) rescue nil
  raise ArgumentError, "The given endpoint isn't a valid http(s) URI: #{endpoint.to_s}" unless endpoint_uri.is_a?(URI::HTTP)

  @endpoint = endpoint
  @urls = []
  @format = format
end

Instance Attribute Details

#endpointObject

The String that is the http URI of the Provider's oEmbed endpoint. This URL may also contain a {format} portion. In actual requests to this Provider, this string will be replaced with a string representing the request format (e.g. “json”).



13
14
15
# File 'lib/oembed/provider.rb', line 13

def endpoint
  @endpoint
end

#formatObject

The name of the default format for all request to this Provider (e.g. 'json').



16
17
18
# File 'lib/oembed/provider.rb', line 16

def format
  @format
end

#nameObject

Deprecated.

Note: This accessor currently isn't used anywhere in the codebase.

The human-readable name of the Provider.



24
25
26
# File 'lib/oembed/provider.rb', line 24

def name
  @name
end

#urlObject

Deprecated.

Note: Added in a fork of the gem, a while back. I really would like

to get rid of it, though. –Marcos



28
29
30
# File 'lib/oembed/provider.rb', line 28

def url
  @url
end

#urlsObject

An Array of all URL schemes supported by this Provider.



19
20
21
# File 'lib/oembed/provider.rb', line 19

def urls
  @urls
end

Instance Method Details

#<<(url) ⇒ Object

Adds the given url scheme to this Provider instance. The url scheme can be either a String, containing wildcards specified with an asterisk, (see oembed.com/#section2.1 for details), or a Regexp.

For example:

@provider << "http://my.service.com/video/*"
@provider << "http://*.service.com/photo/*/slideshow"
@provider << %r{^http://my.service.com/((help)|(faq))/\d+[#\?].*}


68
69
70
71
72
73
74
75
76
# File 'lib/oembed/provider.rb', line 68

def <<(url)
  if !url.is_a?(Regexp)
    full, scheme, domain, path = *url.match(%r{([^:]*)://?([^/?]*)(.*)})
    domain = Regexp.escape(domain).gsub("\\*", "(.*?)").gsub("(.*?)\\.", "([^\\.]+\\.)?")
    path = Regexp.escape(path).gsub("\\*", "(.*?)")
    url = Regexp.new("^#{Regexp.escape(scheme)}://#{domain}#{path}")
  end
  @urls << url
end

#build(url, query = {}) ⇒ Object

Deprecated.

Note: This method will be made private in the future.

Raises:



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/oembed/provider.rb', line 100

def build(url, query = {})
  raise OEmbed::NotFound, url unless include?(url)

  query = query.merge({:url => ::CGI.escape(url)})
  query.delete(:timeout)
  query.delete(:max_redirects)

  # TODO: move this code exclusively into the get method, once build is private.
  this_format = (query[:format] ||= @format.to_s).to_s

  endpoint = @endpoint.clone

  if endpoint.include?("{format}")
    endpoint["{format}"] = this_format
    query.delete(:format)
  end

  base = endpoint.include?('?') ? '&' : '?'
  query = base + query.inject("") do |memo, (key, value)|
    "#{key}=#{value}&#{memo}"
  end.chop

  URI.parse(endpoint + query).instance_eval do
    @format = this_format
    def format
      @format
    end
    self
  end
end

#get(url, query = {}) ⇒ Object

Send a request to the Provider endpoint to get information about the given url and return the appropriate OEmbed::Response.

The query parameter should be a Hash of values which will be sent as query parameters in this request to the Provider endpoint. The following special cases apply to the query Hash:

:timeout

specifies the timeout (in seconds) for the http request.

:format

overrides this Provider's default request format.

:url

will be ignored, replaced by the url param.

:max_redirects

the number of times this request will follow 3XX redirects before throwing an error. Default: 4



88
89
90
91
# File 'lib/oembed/provider.rb', line 88

def get(url, query = {})
  query[:format] ||= @format
  OEmbed::Response.create_for(raw(url, query), self, url, query[:format].to_s)
end

#include?(url) ⇒ Boolean

Determine whether the given url is supported by this Provider by matching against the Provider's URL schemes.

Returns:

  • (Boolean)


95
96
97
# File 'lib/oembed/provider.rb', line 95

def include?(url)
  @urls.empty? || !!@urls.detect{ |u| u =~ url }
end

#raw(url, query = {}) ⇒ Object

Deprecated.

Note: This method will be made private in the future.



132
133
134
135
136
137
138
# File 'lib/oembed/provider.rb', line 132

def raw(url, query = {})
  uri = build(url, query)
  http_get(uri, query)
rescue OEmbed::UnknownFormat
  # raise with format to be backward compatible
  raise OEmbed::UnknownFormat, format
end