Files
discourse/lib/inline_oneboxer.rb
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

78 lines
1.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2017-07-19 15:08:54 -04:00
class InlineOneboxer
2018-01-30 08:39:41 +11:00
MIN_TITLE_LENGTH = 2
2017-07-21 15:29:04 -04:00
def initialize(urls, opts = nil)
2017-07-19 15:08:54 -04:00
@urls = urls
2017-07-21 15:29:04 -04:00
@opts = opts || {}
2017-07-19 15:08:54 -04:00
end
def process
2017-07-21 15:29:04 -04:00
@urls.map { |url| InlineOneboxer.lookup(url, @opts) }.compact
2017-07-19 15:08:54 -04:00
end
def self.invalidate(url)
2019-11-27 12:35:14 +11:00
Discourse.cache.delete(cache_key(url))
2017-07-19 15:08:54 -04:00
end
def self.cache_lookup(url)
2019-11-27 12:35:14 +11:00
Discourse.cache.read(cache_key(url))
2017-07-19 15:08:54 -04:00
end
2017-07-21 15:29:04 -04:00
def self.lookup(url, opts = nil)
opts ||= {}
opts = opts.with_indifferent_access
2017-07-21 15:29:04 -04:00
unless opts[:skip_cache] || opts[:invalidate]
2017-07-21 15:29:04 -04:00
cached = cache_lookup(url)
return cached if cached.present?
end
2017-07-19 15:08:54 -04:00
2018-03-28 16:20:08 +08:00
return unless url
2017-07-19 15:08:54 -04:00
if route = Discourse.route_for(url)
if route[:controller] == "topics"
if topic = Oneboxer.local_topic(url, route, opts)
opts[:skip_cache] = true
return onebox_for(url, topic.title, opts)
end
2017-07-21 15:29:04 -04:00
end
end
always_allow = SiteSetting.enable_inline_onebox_on_all_domains
domains = SiteSetting.allowed_inline_onebox_domains&.split('|') unless always_allow
if always_allow || domains
2018-03-28 16:20:08 +08:00
uri = begin
URI(url)
rescue URI::Error
2018-03-28 16:20:08 +08:00
end
2017-07-21 15:29:04 -04:00
if uri.present? &&
uri.hostname.present? &&
(always_allow || domains.include?(uri.hostname))
2017-07-21 15:29:04 -04:00
title = RetrieveTitle.crawl(url)
2018-01-30 08:39:41 +11:00
title = nil if title && title.length < MIN_TITLE_LENGTH
2017-07-21 15:29:04 -04:00
return onebox_for(url, title, opts)
2017-07-19 15:08:54 -04:00
end
end
nil
end
private
2017-07-21 15:29:04 -04:00
def self.onebox_for(url, title, opts)
onebox = { url: url, title: title && Emoji.gsub_emoji_to_unicode(title) }
Discourse.cache.write(cache_key(url), onebox, expires_in: 1.day) if !opts[:skip_cache]
2018-06-07 13:28:18 +08:00
onebox
end
2017-07-19 15:08:54 -04:00
def self.cache_key(url)
"inline_onebox:#{url}"
end
end