module Preview class ThumbnailFetcher class GenerationFailed < StandardError; end def self.fetch(raw_url) uri, = UrlSafety.validate(raw_url) known_url = KnownSiteExtractor.thumbnail_url(uri) return fetch_image(known_url) if known_url page = HttpFetcher.fetch(uri.to_s) metadata = HtmlMetadataExtractor.extract(page) raise GenerationFailed, 'サムネール画像が見つかりませんでした.' if metadata[:image_url].blank? fetch_image(metadata[:image_url]) end def self.title(raw_url) uri, = UrlSafety.validate(raw_url) HtmlMetadataExtractor.extract(HttpFetcher.fetch(uri.to_s))[:title] end def self.fetch_image(url) response = HttpFetcher.fetch(url) unless response.content_type.downcase.start_with?('image/') raise GenerationFailed, 'サムネール画像が見つかりませんでした.' end response.body rescue HttpFetcher::FetchTimeout raise rescue HttpFetcher::FetchFailed raise GenerationFailed, 'サムネール画像を取得できませんでした.' end private_class_method :fetch_image end end