feat: sidebar for media now shows thumbnails
This commit is contained in:
@@ -42,6 +42,10 @@ defmodule BDS.Desktop.Router do
|
||||
|> Plug.Conn.send_resp(200, BDS.Desktop.ShellController.projects_json())
|
||||
end
|
||||
|
||||
get "/api/media-thumbnail/:media_id" do
|
||||
BDS.Desktop.ShellController.media_thumbnail(conn, media_id, conn.params)
|
||||
end
|
||||
|
||||
post "/api/sidebar" do
|
||||
{:ok, body, conn} = Plug.Conn.read_body(conn)
|
||||
payload = if body == "", do: %{}, else: Jason.decode!(body)
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
defmodule BDS.Desktop.ShellController do
|
||||
@moduledoc false
|
||||
|
||||
alias BDS.Media
|
||||
alias BDS.Media.Media, as: MediaRecord
|
||||
alias BDS.Projects
|
||||
alias BDS.Repo
|
||||
alias BDS.UI.Sidebar
|
||||
|
||||
def index_html do
|
||||
@@ -50,6 +54,18 @@ defmodule BDS.Desktop.ShellController do
|
||||
end
|
||||
end
|
||||
|
||||
def media_thumbnail(conn, media_id, params \\ %{}) when is_binary(media_id) do
|
||||
case active_media_thumbnail(media_id, Map.get(params, "size") || 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 ->
|
||||
Plug.Conn.send_resp(conn, 404, "not found")
|
||||
end
|
||||
end
|
||||
|
||||
def sidebar_json(payload) when is_map(payload) do
|
||||
view = Map.get(payload, "view") || Map.get(payload, :view)
|
||||
filters = Map.get(payload, "filters") || Map.get(payload, :filters) || %{}
|
||||
@@ -187,6 +203,43 @@ defmodule BDS.Desktop.ShellController do
|
||||
defp present?(value) when is_binary(value), do: String.trim(value) != ""
|
||||
defp present?(_value), do: false
|
||||
|
||||
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
|
||||
|
||||
defp blank_to_nil(value) when is_binary(value) do
|
||||
trimmed = String.trim(value)
|
||||
if trimmed == "", do: nil, else: trimmed
|
||||
|
||||
Reference in New Issue
Block a user