62 lines
1.7 KiB
Elixir
62 lines
1.7 KiB
Elixir
defmodule BDS.Desktop.MediaController do
|
|
@moduledoc false
|
|
|
|
use Phoenix.Controller, formats: [:html]
|
|
|
|
alias BDS.Media
|
|
alias BDS.Media.Media, as: MediaRecord
|
|
alias BDS.Projects
|
|
alias BDS.Repo
|
|
|
|
def thumbnail(conn, %{"media_id" => media_id} = params) do
|
|
case active_media_thumbnail(media_id, Map.get(params, "size")) do
|
|
{:ok, content_type, path} ->
|
|
conn
|
|
|> Plug.Conn.put_resp_content_type(content_type)
|
|
|> Plug.Conn.send_file(200, path)
|
|
|
|
:error ->
|
|
send_resp(conn, 404, "not found")
|
|
end
|
|
end
|
|
|
|
defp active_media_thumbnail(media_id, size) do
|
|
with %{} = project <- Projects.get_active_project(),
|
|
%MediaRecord{} = media <- Repo.get(MediaRecord, media_id),
|
|
true <- media.project_id == project.id,
|
|
relative_path when is_binary(relative_path) <-
|
|
Media.thumbnail_paths(media)[thumbnail_size(size)],
|
|
absolute_path = Path.join(Projects.project_data_dir(project), relative_path),
|
|
true <- File.exists?(absolute_path) do
|
|
{:ok, thumbnail_content_type(relative_path), absolute_path}
|
|
else
|
|
_other -> :error
|
|
end
|
|
rescue
|
|
error in [Exqlite.Error, DBConnection.OwnershipError] ->
|
|
if match?(%Exqlite.Error{}, error) and
|
|
not String.contains?(Exception.message(error), "no such table") do
|
|
reraise error, __STACKTRACE__
|
|
end
|
|
|
|
:error
|
|
end
|
|
|
|
defp thumbnail_size(size) do
|
|
case to_string(size || "small") do
|
|
"medium" -> :medium
|
|
"large" -> :large
|
|
"ai" -> :ai
|
|
_other -> :small
|
|
end
|
|
end
|
|
|
|
defp thumbnail_content_type(path) do
|
|
case Path.extname(path) do
|
|
".jpg" -> "image/jpeg"
|
|
".jpeg" -> "image/jpeg"
|
|
_other -> "image/webp"
|
|
end
|
|
end
|
|
end
|