catstodon/app/helpers/media_component_helper.rb

77 lines
2.5 KiB
Ruby
Raw Normal View History

2023-04-26 18:21:32 +02:00
# frozen_string_literal: true
module MediaComponentHelper
2024-10-31 16:12:08 +01:00
def render_video_component(status, **)
2023-04-26 18:21:32 +02:00
video = status.ordered_media_attachments.first
meta = video.file.meta || {}
component_params = {
sensitive: sensitive_viewer?(status, current_account),
src: full_asset_url(video.file.url(:original)),
preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)),
alt: video.description,
blurhash: video.blurhash,
frameRate: meta.dig('original', 'frame_rate'),
inline: true,
aspectRatio: "#{meta.dig('original', 'width')} / #{meta.dig('original', 'height')}",
2023-04-26 18:21:32 +02:00
media: [
serialize_media_attachment(video),
].as_json,
2024-10-31 16:12:08 +01:00
}.merge(**)
2023-04-26 18:21:32 +02:00
react_component :video, component_params do
render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
2024-10-31 16:12:08 +01:00
def render_audio_component(status, **)
2023-04-26 18:21:32 +02:00
audio = status.ordered_media_attachments.first
meta = audio.file.meta || {}
component_params = {
src: full_asset_url(audio.file.url(:original)),
poster: full_asset_url(audio.thumbnail.present? ? audio.thumbnail.url : status.account.avatar_static_url),
alt: audio.description,
backgroundColor: meta.dig('colors', 'background'),
foregroundColor: meta.dig('colors', 'foreground'),
accentColor: meta.dig('colors', 'accent'),
duration: meta.dig('original', 'duration'),
2024-10-31 16:12:08 +01:00
}.merge(**)
2023-04-26 18:21:32 +02:00
react_component :audio, component_params do
render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
2024-10-31 16:12:08 +01:00
def render_media_gallery_component(status, **)
2023-04-26 18:21:32 +02:00
component_params = {
sensitive: sensitive_viewer?(status, current_account),
autoplay: prefers_autoplay?,
media: status.ordered_media_attachments.map { |a| serialize_media_attachment(a).as_json },
2024-10-31 16:12:08 +01:00
}.merge(**)
2023-04-26 18:21:32 +02:00
react_component :media_gallery, component_params do
render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
end
end
private
def serialize_media_attachment(attachment)
ActiveModelSerializers::SerializableResource.new(
attachment,
serializer: REST::MediaAttachmentSerializer
)
end
def sensitive_viewer?(status, account)
if !account.nil? && account.id == status.account_id
status.sensitive
else
status.account.sensitized? || status.sensitive
end
end
end