From 97533416f7ae33a7db7e05e008b2ffe7e960350c Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 31 Dec 2024 11:57:56 +0000 Subject: [PATCH] Support arbitrary resizing in cover controller --- lib/music_library/records/cover.ex | 4 +-- .../controllers/cover_controller.ex | 30 ++++++++++++++++++ .../controllers/cover_controller_test.exs | 15 +++++++++ .../fixtures/marillion-marbles-thumb.jpg | Bin 0 -> 25495 bytes test/support/fixtures/records_fixtures.ex | 2 ++ 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/support/fixtures/marillion-marbles-thumb.jpg diff --git a/lib/music_library/records/cover.ex b/lib/music_library/records/cover.ex index b79e4d38..aa715f0f 100644 --- a/lib/music_library/records/cover.ex +++ b/lib/music_library/records/cover.ex @@ -1,8 +1,8 @@ defmodule MusicLibrary.Records.Cover do @size 600 - def resize(cover_data) do - {:ok, thumb} = Vix.Vips.Operation.thumbnail_buffer(cover_data, @size) + def resize(cover_data, size \\ @size) do + {:ok, thumb} = Vix.Vips.Operation.thumbnail_buffer(cover_data, size) Vix.Vips.Image.write_to_buffer(thumb, ".jpg") end diff --git a/lib/music_library_web/controllers/cover_controller.ex b/lib/music_library_web/controllers/cover_controller.ex index 1b6c3a82..df8c4eef 100644 --- a/lib/music_library_web/controllers/cover_controller.ex +++ b/lib/music_library_web/controllers/cover_controller.ex @@ -2,6 +2,36 @@ defmodule MusicLibraryWeb.CoverController do use MusicLibraryWeb, :controller alias MusicLibrary.Records + alias MusicLibrary.Records.Cover + + def show(conn, %{"record_id" => record_id, "size" => size}) do + case Records.get_cover(record_id) do + nil -> + conn + |> put_status(:not_found) + |> text("Not found") + + %{cover_data: cover_data} -> + {:ok, thumb_data} = Cover.resize(cover_data, String.to_integer(size)) + hash = :crypto.hash(:sha256, thumb_data) |> Base.encode16() + + case get_req_header(conn, "if-none-match") do + [^hash] -> + conn + # 24 hours + |> put_resp_header("cache-control", "public, max-age=86400") + |> send_resp(304, "") + + _ -> + conn + |> put_resp_content_type("image/jpeg", "utf-8") + # 24 hours + |> put_resp_header("cache-control", "public, max-age=86400") + |> put_resp_header("etag", hash) + |> send_resp(200, thumb_data) + end + end + end def show(conn, %{"record_id" => record_id}) do case Records.get_cover(record_id) do diff --git a/test/music_library_web/controllers/cover_controller_test.exs b/test/music_library_web/controllers/cover_controller_test.exs index 52126195..16e99de4 100644 --- a/test/music_library_web/controllers/cover_controller_test.exs +++ b/test/music_library_web/controllers/cover_controller_test.exs @@ -2,6 +2,7 @@ defmodule MusicLibraryWeb.CoverControllerTest do use MusicLibraryWeb.ConnCase import MusicLibrary.RecordsFixtures + alias MusicLibrary.Records.Cover defp create_record(_) do %{record: record_fixture()} @@ -55,5 +56,19 @@ defmodule MusicLibraryWeb.CoverControllerTest do assert conn.resp_body == <<>> end + + test "accepts a size attribute for resizing", %{conn: conn, record: record} do + conn = get(conn, ~p"/covers/#{record.id}?size=480") + + thumb = File.read!(marbles_thumb_fixture()) + hash = Cover.hash(thumb) + + assert conn.status == 200 + assert get_resp_header(conn, "content-type") == ["image/jpeg; charset=utf-8"] + assert get_resp_header(conn, "cache-control") == ["public, max-age=86400"] + assert get_resp_header(conn, "etag") == [hash] + + assert conn.resp_body == thumb + end end end diff --git a/test/support/fixtures/marillion-marbles-thumb.jpg b/test/support/fixtures/marillion-marbles-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be85b9198fa776dfde2463ed47343065c81a135a GIT binary patch literal 25495 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 literal 0 HcmV?d00001 diff --git a/test/support/fixtures/records_fixtures.ex b/test/support/fixtures/records_fixtures.ex index fcfb7606..48959edd 100644 --- a/test/support/fixtures/records_fixtures.ex +++ b/test/support/fixtures/records_fixtures.ex @@ -43,9 +43,11 @@ defmodule MusicLibrary.RecordsFixtures do ] # While it would be great to have this random, it's ok to use one single image @marbles_cover_data_path "#{__DIR__}/marillion-marbles.jpg" + @marbles_thumb_data_path "#{__DIR__}/marillion-marbles-thumb.jpg" @raven_cover_data_path "#{__DIR__}/steven-wilson-raven.jpg" def marbles_cover_fixture, do: @marbles_cover_data_path + def marbles_thumb_fixture, do: @marbles_thumb_data_path def raven_cover_fixture, do: @raven_cover_data_path def record_fixture(attrs \\ %{}) do