39 行
1.1 KiB
Ruby
39 行
1.1 KiB
Ruby
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
|