mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-23 20:18:00 +01:00
Finish thumbnailer, integrate hider
This commit is contained in:
parent
4c97791a7b
commit
20cc6cb908
3 changed files with 68 additions and 68 deletions
|
@ -1,54 +0,0 @@
|
|||
defmodule Philomena.Images.Hider do
|
||||
@moduledoc """
|
||||
Hiding logic for images.
|
||||
"""
|
||||
|
||||
alias Philomena.Images.Image
|
||||
|
||||
# sobelow_skip ["Traversal.FileModule"]
|
||||
def hide_thumbnails(image, key) do
|
||||
source = image_thumb_dir(image)
|
||||
target = image_thumb_dir(image, key)
|
||||
|
||||
File.rm_rf(target)
|
||||
File.rename(source, target)
|
||||
end
|
||||
|
||||
# sobelow_skip ["Traversal.FileModule"]
|
||||
def unhide_thumbnails(image, key) do
|
||||
source = image_thumb_dir(image, key)
|
||||
target = image_thumb_dir(image)
|
||||
|
||||
File.rm_rf(target)
|
||||
File.rename(source, target)
|
||||
end
|
||||
|
||||
# sobelow_skip ["Traversal.FileModule"]
|
||||
def destroy_thumbnails(image) do
|
||||
hidden = image_thumb_dir(image, image.hidden_image_key)
|
||||
normal = image_thumb_dir(image)
|
||||
|
||||
File.rm_rf(hidden)
|
||||
File.rm_rf(normal)
|
||||
end
|
||||
|
||||
def purge_cache(files) do
|
||||
{_out, 0} = System.cmd("purge-cache", [Jason.encode!(%{files: files})])
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
# fixme: these are copied from the thumbnailer
|
||||
defp image_thumb_dir(%Image{created_at: created_at, id: id}),
|
||||
do: Path.join([image_thumbnail_root(), time_identifier(created_at), to_string(id)])
|
||||
|
||||
defp image_thumb_dir(%Image{created_at: created_at, id: id}, key),
|
||||
do:
|
||||
Path.join([image_thumbnail_root(), time_identifier(created_at), to_string(id) <> "-" <> key])
|
||||
|
||||
defp time_identifier(time),
|
||||
do: Enum.join([time.year, time.month, time.day], "/")
|
||||
|
||||
defp image_thumbnail_root,
|
||||
do: Application.get_env(:philomena, :image_file_root) <> "/thumbs"
|
||||
end
|
|
@ -22,6 +22,8 @@ defmodule Philomena.Images.Thumbnailer do
|
|||
tall: {1024, 4096}
|
||||
]
|
||||
|
||||
@acl [acl: :public_read]
|
||||
|
||||
def thumbnail_versions do
|
||||
@versions
|
||||
end
|
||||
|
@ -34,6 +36,34 @@ defmodule Philomena.Images.Thumbnailer do
|
|||
end)
|
||||
end
|
||||
|
||||
def hide_thumbnails(image, key) do
|
||||
moved_files = Processors.versions(image.image_mime_type, generated_sizes(image))
|
||||
|
||||
source_prefix = visible_image_thumb_prefix(image)
|
||||
target_prefix = hidden_image_thumb_prefix(image, key)
|
||||
|
||||
bulk_rename(moved_files, source_prefix, target_prefix)
|
||||
end
|
||||
|
||||
def unhide_thumbnails(image, key) do
|
||||
moved_files = Processors.versions(image.image_mime_type, generated_sizes(image))
|
||||
|
||||
source_prefix = hidden_image_thumb_prefix(image, key)
|
||||
target_prefix = visible_image_thumb_prefix(image)
|
||||
|
||||
bulk_rename(moved_files, source_prefix, target_prefix)
|
||||
end
|
||||
|
||||
def destroy_thumbnails(image) do
|
||||
affected_files = Processors.versions(image.image_mime_type, generated_sizes(image))
|
||||
|
||||
hidden_prefix = hidden_image_thumb_prefix(image, image.hidden_image_key)
|
||||
visible_prefix = visible_image_thumb_prefix(image)
|
||||
|
||||
bulk_delete(affected_files, hidden_prefix)
|
||||
bulk_delete(affected_files, visible_prefix)
|
||||
end
|
||||
|
||||
def generate_thumbnails(image_id) do
|
||||
image = Repo.get!(Image, image_id)
|
||||
file = download_image_file(image)
|
||||
|
@ -82,7 +112,7 @@ defmodule Philomena.Images.Thumbnailer do
|
|||
end
|
||||
|
||||
defp download_image_file(image) do
|
||||
tempfile = Briefly.create!(extname: "." <> image.image_format)
|
||||
tempfile = Briefly.create!(extname: ".#{image.image_format}")
|
||||
path = Path.join(image_thumb_prefix(image), "full.#{image.image_format}")
|
||||
|
||||
ExAws.request!(S3.download_file(bucket(), path, tempfile))
|
||||
|
@ -95,19 +125,43 @@ defmodule Philomena.Images.Thumbnailer do
|
|||
|
||||
file
|
||||
|> S3.Upload.stream_file()
|
||||
|> S3.upload(bucket(), path, acl: :public_read)
|
||||
|> S3.upload(bucket(), path, @acl)
|
||||
|> ExAws.request!()
|
||||
end
|
||||
|
||||
defp image_thumb_prefix(%Image{
|
||||
created_at: created_at,
|
||||
id: id,
|
||||
hidden_from_users: true,
|
||||
hidden_image_key: key
|
||||
}),
|
||||
do: Path.join([image_file_root(), time_identifier(created_at), "#{id}-#{key}"])
|
||||
def bulk_rename(file_names, source_prefix, target_prefix) do
|
||||
Enum.map(file_names, fn name ->
|
||||
source = Path.join(source_prefix, name)
|
||||
target = Path.join(target_prefix, name)
|
||||
|
||||
defp image_thumb_prefix(%Image{created_at: created_at, id: id}),
|
||||
ExAws.request!(S3.put_object_copy(bucket(), target, bucket(), source, @acl))
|
||||
ExAws.request!(S3.delete_object(bucket(), source))
|
||||
end)
|
||||
end
|
||||
|
||||
def bulk_delete(file_names, prefix) do
|
||||
Enum.map(file_names, fn name ->
|
||||
target = Path.join(prefix, name)
|
||||
|
||||
ExAws.request!(S3.delete_object(bucket(), target))
|
||||
end)
|
||||
end
|
||||
|
||||
# This method wraps the following two for code that doesn't care
|
||||
# and just wants the files (most code should take this path)
|
||||
|
||||
defp image_thumb_prefix(%{hidden_from_users: true} = image),
|
||||
do: hidden_image_thumb_prefix(image, image.hidden_image_key)
|
||||
|
||||
defp image_thumb_prefix(image),
|
||||
do: visible_image_thumb_prefix(image)
|
||||
|
||||
# These methods handle the actual distinction between the two
|
||||
|
||||
defp hidden_image_thumb_prefix(%Image{created_at: created_at, id: id}, key),
|
||||
do: Path.join([image_file_root(), time_identifier(created_at), "#{id}-#{key}"])
|
||||
|
||||
defp visible_image_thumb_prefix(%Image{created_at: created_at, id: id}),
|
||||
do: Path.join([image_file_root(), time_identifier(created_at), to_string(id)])
|
||||
|
||||
defp time_identifier(time),
|
||||
|
|
|
@ -41,12 +41,12 @@ defmodule Philomena.Processors do
|
|||
def processor(_content_type), do: nil
|
||||
|
||||
@doc """
|
||||
Takes an analyzer and version list and generates a list of versions to be
|
||||
Takes a MIME type and version list and generates a list of versions to be
|
||||
generated (e.g., ["thumb.png"]). List contents differ based on file type.
|
||||
"""
|
||||
@spec versions(map(), keyword) :: [String.t()]
|
||||
def versions(analysis, valid_sizes) do
|
||||
processor(analysis.mime_type).versions(valid_sizes)
|
||||
@spec versions(String.t(), keyword) :: [String.t()]
|
||||
def versions(mime_type, valid_sizes) do
|
||||
processor(mime_type).versions(valid_sizes)
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
|
Loading…
Reference in a new issue