Favicon Microgem
This fetches all known favicons for a url. It will return an array of hashes with a href
, x
and y
.
If the size is unknown it will return 0 for x
and y
GEM::Specification.new do |gem| | |
gem.name = gem.summary = 'favicon' | |
gem.version = '1.0.0' | |
gem.files = ['favicon.rb'] | |
gem.require_path = '.' | |
gem.authors = ['Tim Peters'] | |
gem.add_dependency 'nokogiri', '~> 1.6.7' | |
gem.add_dependency 'httparty', '~> 0.13.7' | |
end |
require 'nokogiri' | |
require 'httparty' | |
module Favicon | |
class Fetcher | |
include HTTParty | |
follow_redirects true | |
end | |
def self.get(url) | |
uri = Addressable::URI.heuristic_parse(url) | |
html = Fetcher.get(uri.to_s).body | |
doc = Nokogiri::HTML html | |
[ | |
favicons = parse_icons(doc), | |
parse_shortcut_icons(doc), | |
fallback_icon(uri) | |
].flatten.sort { |y, x| x[:x] <=> y[:x] } | |
end | |
def self.parse_icons(doc) | |
doc.css('link[rel=icon]').map do |element| | |
{ | |
href: element.attr('href'), | |
x: element.attr('sizes').split('x')[0].to_i, | |
y: element.attr('sizes').split('x')[1].to_i | |
} | |
end | |
end | |
def self.parse_shortcut_icons(doc) | |
doc.css('link[rel="shortcut icon"]').map do |element| | |
{ | |
href: element.attr('href'), | |
x: 16, | |
y: 16 | |
} | |
end | |
end | |
def self.fallback_icon(uri) | |
{ | |
href: uri.join('favicon.ico').to_s, | |
x: 0, | |
y: 0, | |
} | |
end | |
end |