0
0
Fork 0

Add semi-support for Video/Image objects in ActivityPub (#5848)

* Add semi-support for Video/Image objects in ActivityPub

Video and Image objects will create corresponding status records
with manually crafted text contents (title + URL)

* Extract html-url-finding logic into JsonLdHelper

* Fallback to id when url missing, extract supported object types
This commit is contained in:
Eugen Rochko 2017-11-30 04:06:20 +01:00 committed by GitHub
parent 85e97ecab6
commit 4c6b5dbe96
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 103 additions and 26 deletions

View file

@ -1,6 +1,9 @@
# frozen_string_literal: true
class ActivityPub::Activity::Create < ActivityPub::Activity
SUPPORTED_TYPES = %w(Article Note).freeze
CONVERTED_TYPES = %w(Image Video).freeze
def perform
return if delete_arrived_first?(object_uri) || unsupported_object_type?
@ -41,7 +44,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
url: object_url || @object['id'],
account: @account,
text: text_from_content || '',
language: language_from_content,
language: detected_language,
spoiler_text: @object['summary'] || '',
created_at: @options[:override_timestamps] ? nil : @object['published'],
reply: @object['inReplyTo'].present?,
@ -165,40 +168,62 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def text_from_content
return Formatter.instance.linkify([text_from_name, object_url || @object['id']].join(' ')) if converted_object_type?
if @object['content'].present?
@object['content']
elsif language_map?
elsif content_language_map?
@object['contentMap'].values.first
end
end
def language_from_content
return LanguageDetector.instance.detect(text_from_content, @account) unless language_map?
@object['contentMap'].keys.first
def text_from_name
if @object['name'].present?
@object['name']
elsif name_language_map?
@object['nameMap'].values.first
end
end
def detected_language
if content_language_map?
@object['contentMap'].keys.first
elsif name_language_map?
@object['nameMap'].keys.first
elsif supported_object_type?
LanguageDetector.instance.detect(text_from_content, @account)
end
end
def object_url
return if @object['url'].blank?
value = first_of_value(@object['url'])
return value if value.is_a?(String)
value['href']
url_to_href(@object['url'], 'text/html')
end
def language_map?
def content_language_map?
@object['contentMap'].is_a?(Hash) && !@object['contentMap'].empty?
end
def name_language_map?
@object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty?
end
def unsupported_object_type?
@object.is_a?(String) || !%w(Article Note).include?(@object['type'])
@object.is_a?(String) || !(supported_object_type? || converted_object_type?)
end
def unsupported_media_type?(mime_type)
mime_type.present? && !(MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES).include?(mime_type)
end
def supported_object_type?
SUPPORTED_TYPES.include?(@object['type'])
end
def converted_object_type?
CONVERTED_TYPES.include?(@object['type'])
end
def skip_download?
return @skip_download if defined?(@skip_download)
@skip_download ||= DomainBlock.find_by(domain: @account.domain)&.reject_media?