Class: SimpleRSS::Discovery

Inherits:
Object
  • Object
show all
Defined in:
lib/simple-rss/discovery.rb

Constant Summary collapse

MEDIA_TYPES =
{
  "application/rss+xml" => :rss, "application/rdf+xml" => :rss,
  "application/atom+xml" => :atom, "application/feed+json" => :json_feed, "application/json" => :json_feed
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Discovery

Returns a new instance of Discovery.



15
16
17
18
19
20
21
22
23
24
# File 'lib/simple-rss/discovery.rb', line 15

def initialize(options)
  @options = { network_policy: :public }.merge(options)
  require "nokogiri"
  @parser = Object.const_get(:Nokogiri)
  unless @parser.const_defined?(:HTML5)
    raise SimpleRSS::DiscoveryDependencyError, "Discovery requires Nokogiri HTML5 support (available on CRuby)"
  end
rescue LoadError
  raise SimpleRSS::DiscoveryDependencyError, 'Install the optional "nokogiri" gem (>= 1.16, < 2) to use SimpleRSS.discover'
end

Instance Method Details

#discover(url) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/simple-rss/discovery.rb', line 27

def discover(url)
  raise SimpleRSS::PolicyError, "Expected a website URL string" unless url.is_a?(String)

  url = "https:#{url}" if url.start_with?("//")
  url = "https://#{url}" unless url.match?(/\A[a-z][a-z\d+.-]*:/i)
  response, uri = SimpleRSS::HTTPClient.new(@options).get(url)
  raise SimpleRSS::HTTPError, response.code.to_i unless response.is_a?(Net::HTTPSuccess)

  candidates(response.body.to_s, uri, response.content_type, response.type_params["charset"])
end