Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/modules/batch/batch_edit_title.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def batch_edit_title_update
private

def get_image_url(media_entry)
size = :small
size = :medium
imgs = Presenters::MediaFiles::MediaFile.new(media_entry, current_user)
.try(:previews).try(:[], :images)
img = imgs.try(:fetch, size, nil) || imgs.try(:values).try(:first)
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/modules/media_entries/media_shortcut.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def image

# Allowed resolutions
thumbnail = (resolution_param || 'large')
raise_404 unless ['maximum', 'x_large', 'large', 'medium'].include? thumbnail
raise_404 unless ['maximum', 'grand', 'x_large', 'large', 'medium'].include? thumbnail

# Find all preview images for resolution (videos have one for each minute, but there are also duplicates due to some issue)
previews = entry.media_file.previews.to_a
Expand Down
1 change: 1 addition & 0 deletions app/javascript/react/views/MediaEntry/Export.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ class MediaEntryExport extends React.Component {
Object.values(get.media_file.previews).forEach(preview =>
Object.values(preview).forEach(() => (hasPreviews = true))
)
console.log(get.media_file)

const hasOriginal = get.media_file.original_file_url
const hasNeither = !hasPreviews && !hasOriginal
Expand Down
5 changes: 3 additions & 2 deletions app/lib/embed_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ def get_iframe_size_for_audio_video(maxwidth: nil, ratio: nil)
end

def get_iframe_size_for_image(maxwidth: nil, maxheight: nil, media_size: nil)
# Assume a media size when the actual size is unknown (images uploaded with Madek v3 before 3.35.0)
media_size = media_size || Madek::Constants::THUMBNAILS[:x_large]
# Guess a media size when the actual size is unknown (images uploaded with Madek v3 before 3.35.0,
# about mid 2016 to early 2023): `x_large` width with landscape ratio => 1024 x 768.
media_size = media_size || { width: 1024, height: 768 }
ratio = media_size[:width].to_f / media_size[:height].to_f

# Width according to consumer-defined maxsize parameter, or default
Expand Down
7 changes: 2 additions & 5 deletions app/presenters/presenters/media_entries/media_entry_index.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ module MediaEntries
class MediaEntryIndex < Presenters::Shared::MediaResource::MediaResourceIndex

include Presenters::MediaEntries::Modules::MediaEntryCommon
include Presenters::MediaEntries::Modules::ImageUrlHelper

delegate_to_app_resource :subtitle

def image_url
size = :medium
imgs = self.media_file.try(:previews)
.try(:fetch, :images, nil)
img = imgs.try(:fetch, size, nil) || imgs.try(:values).try(:first)
img.url if img.present?
image_url_for_size(:medium)
end

def keywords_pretty
Expand Down
6 changes: 2 additions & 4 deletions app/presenters/presenters/media_entries/media_entry_show.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module MediaEntries
class MediaEntryShow < Presenters::Shared::AppResource

include Presenters::MediaEntries::Modules::MediaEntryCommon
include Presenters::MediaEntries::Modules::ImageUrlHelper
include Presenters::Shared::MediaResource::Modules::PrivacyStatus
include Presenters::Shared::MediaResource::Modules::EditSessions
include Presenters::Shared::MediaResource::Modules::SectionLabels
Expand Down Expand Up @@ -125,10 +126,7 @@ def header
end

def image_url
size = :large
imgs = self.media_file.try(:previews).try(:fetch, :images, nil)
img = imgs.try(:fetch, size, nil) || imgs.try(:values).try(:first)
img.url if img.present?
image_url_for_size(:large)
end

def relations_url
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
module Presenters
module MediaEntries
class MediaEntryTeaserForExplore < Presenters::Shared::AppResource
include Presenters::MediaEntries::Modules::ImageUrlHelper

def initialize(media_entry)
super(media_entry)
@user = nil
end

delegate_to_app_resource :title
Expand All @@ -12,14 +15,7 @@ def authors_pretty
end

def image_url
size = :large
imgs = \
if @app_resource.try(:media_file).present?
Presenters::MediaFiles::MediaFile.new(@app_resource, @user)
.try(:previews).try(:fetch, :images, nil)
end
img = imgs.try(:fetch, size, nil) || imgs.try(:values).try(:first)
img.url if img.present?
image_url_for_size(:large)
end

def url
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
module Presenters
module MediaEntries
class MediaEntryTeaserForLogin < Presenters::Shared::AppResource
include Presenters::MediaEntries::Modules::ImageUrlHelper

def initialize(media_entry)
super(media_entry)
@user = nil
end

def image_url
return @_image_url unless @_image_url.nil?
size = :large
imgs = \
if @app_resource.try(:media_file).present?
Presenters::MediaFiles::MediaFile.new(@app_resource, @user)
.try(:previews).try(:fetch, :images, nil)
end
img = imgs.try(:fetch, size, nil) || imgs.try(:values).try(:first)
@_image_url = img.try(:url).try(:presence)
@_image_url
@_image_url = image_url_for_size(:large)
end

def url
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module Presenters
module MediaEntries
module Modules
module ImageUrlHelper
# Gets image URL for a specific size with fallback to next larger available size
def image_url_for_size(size)
return nil unless @app_resource.try(:media_file).present?

# Get the cached preview hash from MediaFile presenter
imgs = Presenters::MediaFiles::MediaFile.new(@app_resource, @user)
.try(:previews).try(:fetch, :images, nil)

return nil if imgs.blank?

# Try to get the wanted size first
img = imgs.fetch(size, nil)
return img.url if img.present?

# Fallback: find next larger size (sizes are ordered largest to smallest)
sizes = Madek::Constants::THUMBNAILS.keys
wanted_index = sizes.index(size)
return nil unless wanted_index

# Search backward in the array (toward larger sizes)
(wanted_index - 1).downto(0) do |i|
larger_size = sizes[i]
img = imgs.fetch(larger_size, nil)
return img.url if img.present?
end

nil
end
end
end
end
end
7 changes: 0 additions & 7 deletions app/presenters/presenters/media_files/media_file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,6 @@ def get_image_preview(previews, size)
# find by size class
images = previews.select { |p| p.thumbnail == size.to_s }
.sort_by { |p| -p.created_at.to_i }.presence
# OR newest, smallest previews that are AT LEAST the wanted size
images ||= previews
.select { |p| wanted_height && p.height && p.height >= wanted_height }
.sort_by { |p| [p.height, -p.created_at.to_i] }.presence
# OR if that doesnt exist, get the LARGEST there are
images ||= previews
.sort_by { |p| [-p.height.to_i, -p.created_at.to_i] }.presence
# select first or apply 30% rule for videos
image = get_first_or_30_percent(images) if images
end
Expand Down
29 changes: 25 additions & 4 deletions cider-ci/generators/plain_features.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1914,6 +1914,27 @@
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_siblings_spec.rb:121"
RSPEC_TEST: "./spec/features/media_entry/media_entry_siblings_spec.rb[1:2:1]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:1:10]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:10]"
description: 'Resource: MediaEntry Action: create (upload/import) Only preview sizes
below `grand` are generated for a 1280x960 image'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:162"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:10]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:1:11]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:11]"
description: 'Resource: MediaEntry Action: create (upload/import) Only `medium`
and `maximum` are generated for a 620x464 image'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:188"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:11]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:1:12]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:12]"
description: 'Resource: MediaEntry Action: create (upload/import) File metadata
is extracted and mapped via IoMappings to MetaData'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:214"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:12]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:1:1]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:1]"
description: 'Resource: MediaEntry Action: create (upload/import) upload and publish
Expand Down Expand Up @@ -1972,8 +1993,8 @@
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:8]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:1:9]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:9]"
description: 'Resource: MediaEntry Action: create (upload/import) File metadata
is extracted and mapped via IoMappings to MetaData'
description: 'Resource: MediaEntry Action: create (upload/import) All preview sizes
are generated for a 1600x1200 image'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:141"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:1:9]"
Expand All @@ -1982,14 +2003,14 @@
description: 'Resource: MediaEntry Copying meta datum from another media entry when
user has no relation with media entry the user is not allowed to make a copy'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:201"
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:275"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:2:1:1]"
"./spec/features/media_entry/media_entry_upload_spec.rb[1:2:2:1]":
name: "./spec/features/media_entry/media_entry_upload_spec.rb[1:2:2:1]"
description: 'Resource: MediaEntry Copying meta datum from another media entry when
user is a responsible for media entry Display header with configuration options'
environment_variables:
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:211"
RSPEC_NAME: "./spec/features/media_entry/media_entry_upload_spec.rb:285"
RSPEC_TEST: "./spec/features/media_entry/media_entry_upload_spec.rb[1:2:2:1]"
"./spec/features/media_entry/permissions/close_and_cancel_spec.rb[1:1]":
name: "./spec/features/media_entry/permissions/close_and_cancel_spec.rb[1:1]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
expect(response.header['Content-Disposition']).to include('test-image-wide.tif.1535x1063.jpg')
end

example 'image.jpg?resolution=grand' do
get :image, params: { id: image_entry, format: 'jpg', resolution: 'grand' }
expect(response.header['Content-Disposition']).to include('test-image-wide.tif.1280x886.jpg')
end

example 'image.jpg?resolution=x_large' do
get :image, params: { id: image_entry, format: 'jpg', resolution: 'x_large' }
expect(response.header['Content-Disposition']).to include('test-image-wide.tif.1024x709.jpg')
Expand Down
82 changes: 78 additions & 4 deletions spec/features/media_entry/media_entry_upload_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,79 @@
.to eq settings.media_entry_default_license_id
end

scenario 'All preview sizes are generated for a 1600x1200 image',
browser: false do
visit new_media_entry_path
select_file_and_submit('images', 'sleepy_cat_1600.jpg')
media_entry = user.unpublished_media_entries.first
media_file = media_entry.media_file

expect(media_file.width).to be == 1600
expect(media_file.height).to be == 1200

thumbnails_dir = Madek::Constants::THUMBNAIL_STORAGE_DIR
.join(media_file.guid.first)

Madek::Constants::THUMBNAILS.keys.each do |thumb_size|
expect(File.exist?(thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")))
.to be(true), "expected preview size #{thumb_size} to exist"
end

expect(media_file.previews.size).to be == Madek::Constants::THUMBNAILS.size
end

scenario 'Only preview sizes below `grand` are generated for a 1280x960 image',
browser: false do
visit new_media_entry_path
select_file_and_submit('images', 'sleepy_cat_1280.jpg')
media_entry = user.unpublished_media_entries.first
media_file = media_entry.media_file

expect(media_file.width).to be == 1280
expect(media_file.height).to be == 960

thumbnails_dir = Madek::Constants::THUMBNAIL_STORAGE_DIR
.join(media_file.guid.first)

Madek::Constants::THUMBNAILS.keys.each do |thumb_size|
if thumb_size == :grand
expect(File.exist?(thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")))
.to be(false), "expected preview size #{thumb_size} not to exist"
else
expect(File.exist?(thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")))
.to be(true), "expected preview size #{thumb_size} to exist"
end
end

expect(media_file.previews.size).to be == Madek::Constants::THUMBNAILS.size - 1
end

scenario 'Only `medium` and `maximum` are generated for a 620x464 image',
browser: false do
visit new_media_entry_path
select_file_and_submit('images', 'grumpy_cat_620.jpg')
media_entry = user.unpublished_media_entries.first
media_file = media_entry.media_file

expect(media_file.width).to be == 620
expect(media_file.height).to be == 464

thumbnails_dir = Madek::Constants::THUMBNAIL_STORAGE_DIR
.join(media_file.guid.first)

Madek::Constants::THUMBNAILS.keys.each do |thumb_size|
if thumb_size != :maximum && thumb_size != :medium
expect(File.exist?(thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")))
.to be(false), "expected preview size #{thumb_size} not to exist"
else
expect(File.exist?(thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")))
.to be(true), "expected preview size #{thumb_size} to exist"
end
end

expect(media_file.previews.size).to be == 2
end

scenario 'File metadata is extracted and mapped via IoMappings to MetaData',
browser: false do

Expand Down Expand Up @@ -177,21 +250,22 @@

thumbnails_dir = Madek::Constants::THUMBNAIL_STORAGE_DIR \
.join(media_file.guid.first)
expected_presence_map = { maximum: true, grand: false, x_large: false, large: false, medium: true }
Madek::Constants::THUMBNAILS.keys.each do |thumb_size|
next if thumb_size == :maximum
expected_presence = expected_presence_map.fetch(thumb_size)
puts "#{thumb_size} #{expected_presence}"
expect(File.exist? \
thumbnails_dir.join("#{media_file.guid}_#{thumb_size}.jpg")) \
.to be true
.to be expected_presence
end
expect(media_file.previews.size).to be == Madek::Constants::THUMBNAILS.size
expect(media_file.previews.size).to be == 2

# meta data for media entry ##############################################

expect(media_entry.meta_data.find_by_meta_key_id('madek_core:title')).to be
expect(media_entry.meta_data.find_by_meta_key_id('madek_core:title').string).to eq('grumpy_cat_new.jpg')
expect(media_entry.meta_data.find_by_meta_key_id('media_object:creator')).to be
end

end

describe 'Copying meta datum from another media entry' do
Expand Down