@ -39,6 +39,12 @@ class FetchLinkCardService < BaseService
def process_url
def process_url
@card || = PreviewCard . new ( url : @url )
@card || = PreviewCard . new ( url : @url )
attempt_oembed || attempt_opengraph
end
def html
return @html if defined? ( @html )
Request . new ( :get , @url ) . perform do | res |
Request . new ( :get , @url ) . perform do | res |
if res . code == 200 && res . mime_type == 'text/html'
if res . code == 200 && res . mime_type == 'text/html'
@html = res . body_with_limit
@html = res . body_with_limit
@ -48,10 +54,6 @@ class FetchLinkCardService < BaseService
@html_charset = nil
@html_charset = nil
end
end
end
end
return if @html . nil?
attempt_oembed || attempt_opengraph
end
end
def attach_card
def attach_card
@ -88,12 +90,17 @@ class FetchLinkCardService < BaseService
end
end
def attempt_oembed
def attempt_oembed
service = FetchOEmbedService . new
service = FetchOEmbedService . new
embed = service . call ( @url , html : @html )
url_domain = Addressable :: URI . parse ( @url ) . normalized_host
url = Addressable :: URI . parse ( service . endpoint_url )
cached_endpoint = Rails . cache . read ( " oembed_endpoint: #{ url_domain } " )
embed = service . call ( @url , cached_endpoint : cached_endpoint ) unless cached_endpoint . nil?
embed || = service . call ( @url , html : html ) unless html . nil?
return false if embed . nil?
return false if embed . nil?
url = Addressable :: URI . parse ( service . endpoint_url )
@card . type = embed [ :type ]
@card . type = embed [ :type ]
@card . title = embed [ :title ] || ''
@card . title = embed [ :title ] || ''
@card . author_name = embed [ :author_name ] || ''
@card . author_name = embed [ :author_name ] || ''
@ -127,6 +134,8 @@ class FetchLinkCardService < BaseService
end
end
def attempt_opengraph
def attempt_opengraph
return if html . nil?
detector = CharlockHolmes :: EncodingDetector . new
detector = CharlockHolmes :: EncodingDetector . new
detector . strip_tags = true
detector . strip_tags = true