Add cache for OEmbed endpoints to avoid extra HTTP requests (#12403)
* add youtube oembed endpoint * add check for oembed endpoint * change unless for a more readable if * clear blank lines * endpoint via https * Fix string literal in condition * use cache for endpoints * use cache for endpoints * clean up and adding check * clean up and remove redundant return * add html check * add false to return * use double quotes * use double quotes * Clean up
This commit is contained in:
		
					parent
					
						
							
								5a2c0707f1
							
						
					
				
			
			
				commit
				
					
						d14e74eff5
					
				
			
		
					 3 changed files with 64 additions and 8 deletions
				
			
		|  | @ -39,6 +39,12 @@ class FetchLinkCardService < BaseService | |||
|   def process_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| | ||||
|       if res.code == 200 && res.mime_type == 'text/html' | ||||
|         @html = res.body_with_limit | ||||
|  | @ -48,10 +54,6 @@ class FetchLinkCardService < BaseService | |||
|         @html_charset = nil | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     return if @html.nil? | ||||
| 
 | ||||
|     attempt_oembed || attempt_opengraph | ||||
|   end | ||||
| 
 | ||||
|   def attach_card | ||||
|  | @ -88,12 +90,17 @@ class FetchLinkCardService < BaseService | |||
|   end | ||||
| 
 | ||||
|   def attempt_oembed | ||||
|     service = FetchOEmbedService.new | ||||
|     embed   = service.call(@url, html: @html) | ||||
|     url     = Addressable::URI.parse(service.endpoint_url) | ||||
|     service         = FetchOEmbedService.new | ||||
|     url_domain      = Addressable::URI.parse(@url).normalized_host | ||||
|     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? | ||||
| 
 | ||||
|     url = Addressable::URI.parse(service.endpoint_url) | ||||
| 
 | ||||
|     @card.type          = embed[:type] | ||||
|     @card.title         = embed[:title]         || '' | ||||
|     @card.author_name   = embed[:author_name]   || '' | ||||
|  | @ -127,6 +134,8 @@ class FetchLinkCardService < BaseService | |||
|   end | ||||
| 
 | ||||
|   def attempt_opengraph | ||||
|     return if html.nil? | ||||
| 
 | ||||
|     detector = CharlockHolmes::EncodingDetector.new | ||||
|     detector.strip_tags = true | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue