StorageManager: remove Post-specific code.

Refactor StorageManager to remove all image URL generation code. Instead
the image URL generation code lives in MediaAsset.

Now StorageManager is only concerned with how to read and write files to
remote storage backends like S3 or SFTP, not with how image URLs should
be generated. This way the file storage code isn't tightly coupled to
posts, so it can be used to store any kind of file, not just images
belonging to posts.
This commit is contained in:
evazion
2021-10-26 19:11:37 -05:00
parent afe5095ee6
commit 082544ab03
7 changed files with 33 additions and 172 deletions

View File

@@ -38,7 +38,9 @@ class MediaAsset < ApplicationRecord
end
def open_file
storage_service.open(file_path)
file = storage_service.open(file_path)
frame_data = media_asset.pixiv_ugoira_frame_data&.data if media_asset.is_ugoira?
MediaFile.open(file, frame_data: frame_data)
end
def convert_file(media_file)

View File

@@ -74,36 +74,47 @@ class Post < ApplicationRecord
module FileMethods
extend ActiveSupport::Concern
def storage_manager
Danbooru.config.storage_manager
def seo_tags
presenter.humanized_essential_tag_string.gsub(/[^a-z0-9]+/, "_").gsub(/(?:^_+)|(?:_+$)/, "").gsub(/_{2,}/, "_")
end
def file(type = :original)
storage_manager.open_file(self, type)
media_asset.variant(type).open_file
end
def tagged_file_url(tagged_filenames: !CurrentUser.user.disable_tagged_filenames?)
storage_manager.file_url(self, :original, tagged_filenames: tagged_filenames)
slug = seo_tags if tagged_filenames
media_asset.variant(:original).file_url(slug)
end
def tagged_large_file_url(tagged_filenames: !CurrentUser.user.disable_tagged_filenames?)
storage_manager.file_url(self, :large, tagged_filenames: tagged_filenames)
slug = seo_tags if tagged_filenames
if media_asset.has_variant?(:sample)
media_asset.variant(:sample).file_url(slug)
else
media_asset.variant(:original).file_url(slug)
end
end
def file_url
storage_manager.file_url(self, :original)
media_asset.variant(:original).file_url
end
def large_file_url
storage_manager.file_url(self, :large)
if media_asset.has_variant?(:sample)
media_asset.variant(:sample).file_url
else
media_asset.variant(:original).file_url
end
end
def preview_file_url
storage_manager.file_url(self, :preview)
media_asset.variant(:preview).file_url
end
def crop_file_url
storage_manager.file_url(self, :crop)
media_asset.variant(:crop).file_url
end
def open_graph_image_url
@@ -1162,7 +1173,7 @@ class Post < ApplicationRecord
ModAction.log("<@#{user.name}> regenerated IQDB for post ##{id}", :post_regenerate_iqdb, user)
else
media_file = MediaFile.open(file, frame_data: pixiv_ugoira_frame_data&.data.to_a)
media_file = media_asset.variant(:original).open_file
media_asset.distribute_files!(media_file)
update!(