From 937e6df7f7ba29c25655a050aa5b9753a6ef22a5 Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 27 Nov 2022 23:52:01 -0600 Subject: [PATCH] media assets: show sources on show page. Show sources on the media asset show page. An asset can have more than one source if the same file is uploaded from multiple sites. Only sources from known sites are shown. Sources from unknown sites aren't shown because they could potentially contain private information or identify the uploader in some way. Known issue: Twitter posts often show two sources, the direct image URL and the page URL. This is because someone uploaded the direct image URL first, and we're not able to tell that the image URL and the page URL are for the same tweet. --- app/javascript/src/styles/common/utilities.scss | 3 +++ app/models/media_asset.rb | 9 +++++++++ app/views/media_assets/show.html.erb | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/javascript/src/styles/common/utilities.scss b/app/javascript/src/styles/common/utilities.scss index 47ccd3079..49fa498e6 100644 --- a/app/javascript/src/styles/common/utilities.scss +++ b/app/javascript/src/styles/common/utilities.scss @@ -122,6 +122,9 @@ $spacer: 0.25rem; /* 4px */ .ml-4 { margin-left: 4 * $spacer; } +.mr-2 { margin-right: 2 * $spacer; } +.mr-4 { margin-right: 4 * $spacer; } + .p-0 { padding: 0; } .p-px { padding: 1px; } .p-0\.5 { padding: 0.5 * $spacer; } diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index c13387fd5..1bb44d37f 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -499,6 +499,15 @@ class MediaAsset < ApplicationRecord end end + def source_urls + urls = upload_media_assets.map { |uma| Source::URL.page_url(uma.source_url) || uma.page_url || uma.source_url } + urls += [post.normalized_source] if post&.normalized_source.present? + + urls.compact.select do |url| + url.match?(%r{\Ahttps?://}i) && Source::URL.parse(url).recognized? + end.uniq + end + def self.generate_file_key loop do key = SecureRandom.send(:choose, [*"0".."9", *"A".."Z", *"a".."z"], FILE_KEY_LENGTH) # base62 diff --git a/app/views/media_assets/show.html.erb b/app/views/media_assets/show.html.erb index 12bbb39fa..5b851bbb6 100644 --- a/app/views/media_assets/show.html.erb +++ b/app/views/media_assets/show.html.erb @@ -13,6 +13,12 @@ <% if policy(@media_asset).can_see_image? %> <% component.with_footer do %>
+ + <% @media_asset.source_urls.take(5).each do |url| %> + <%= external_link_to url, external_site_icon(Source::URL.site_name(url), class: "h-4"), title: url, class: "inline-block align-top" %> + <% end %> + + <%= link_to @media_asset.original.file_url do %> <%= number_to_human_size(@media_asset.file_size) %> .<%= @media_asset.file_ext %>, <%= @media_asset.image_width %>x<%= @media_asset.image_height %> @@ -50,7 +56,7 @@
- +
@@ -91,6 +97,13 @@ <% end %> + <% @media_asset.source_urls.each do |url| %> + + + + + <% end %> + <% @media_asset.metadata.group_by { |key, value| key.split(":").first }.sort.each do |group, pairs| %>
Metadata
Source<%= external_link_to url %>
<%= group.split(/[ _-]/).map(&:upcase_first).join(" ") %>