Refactor Records.Cover to Assets.Image

This commit is contained in:
Claudio Ortolina
2025-09-20 07:42:38 +03:00
parent c5d856fdd8
commit 90b3fa1fdc
8 changed files with 20 additions and 23 deletions
@@ -1,7 +1,7 @@
defmodule MusicLibrary.Records.Cover do defmodule MusicLibrary.Assets.Image do
alias Vix.Vips.{Image, Operation} alias Vix.Vips.{Image, Operation}
fallback_path = Application.app_dir(:music_library, ["priv", "cover-not-found.jpg"]) fallback_path = Application.app_dir(:music_library, ["priv", "image-not-found.jpg"])
fallback_data = File.read!(fallback_path) fallback_data = File.read!(fallback_path)
@external_resource fallback_path @external_resource fallback_path
+5 -5
View File
@@ -7,7 +7,7 @@ defmodule MusicLibrary.Records do
alias MusicLibrary.Artists alias MusicLibrary.Artists
alias MusicLibrary.Assets alias MusicLibrary.Assets
alias MusicLibrary.Records.{ArtistRecord, Cover, Record, SearchParser} alias MusicLibrary.Records.{ArtistRecord, Record, SearchParser}
alias MusicLibrary.{BackgroundRepo, Repo, Worker} alias MusicLibrary.{BackgroundRepo, Repo, Worker}
def essential_fields do def essential_fields do
@@ -228,8 +228,8 @@ defmodule MusicLibrary.Records do
defp get_cover_art_or_default(musicbrainz_id) do defp get_cover_art_or_default(musicbrainz_id) do
case MusicBrainz.get_cover_art({:musicbrainz_id, musicbrainz_id}) do case MusicBrainz.get_cover_art({:musicbrainz_id, musicbrainz_id}) do
{:error, :cover_not_available} -> {:ok, Cover.fallback_data()} {:error, :cover_not_available} -> {:ok, Assets.Image.fallback_data()}
{:ok, cover_data} -> Cover.resize(cover_data) {:ok, cover_data} -> Assets.Image.resize(cover_data)
end end
end end
@@ -259,7 +259,7 @@ defmodule MusicLibrary.Records do
def refresh_cover(record) do def refresh_cover(record) do
with {:ok, cover_data} <- MusicBrainz.get_cover_art({:url, record.cover_url}), with {:ok, cover_data} <- MusicBrainz.get_cover_art({:url, record.cover_url}),
{:ok, thumb_data} <- Cover.resize(cover_data), {:ok, thumb_data} <- Assets.Image.resize(cover_data),
{:ok, asset} <- Assets.store_image(%{content: thumb_data, format: "image/jpeg"}) do {:ok, asset} <- Assets.store_image(%{content: thumb_data, format: "image/jpeg"}) do
record record
|> Record.set_cover_hash(asset.hash) |> Record.set_cover_hash(asset.hash)
@@ -286,7 +286,7 @@ defmodule MusicLibrary.Records do
end end
def resize_cover(record) do def resize_cover(record) do
with {:ok, thumb_data} <- Cover.resize(record.cover_data), with {:ok, thumb_data} <- Assets.Image.resize(record.cover_data),
{:ok, asset} <- Assets.store_image(%{content: thumb_data, format: "image/jpeg"}) do {:ok, asset} <- Assets.store_image(%{content: thumb_data, format: "image/jpeg"}) do
record record
|> Record.set_cover_hash(asset.hash) |> Record.set_cover_hash(asset.hash)
@@ -2,8 +2,7 @@ defmodule MusicLibraryWeb.AssetController do
use MusicLibraryWeb, :controller use MusicLibraryWeb, :controller
alias MusicLibrary.Assets alias MusicLibrary.Assets
alias MusicLibrary.Assets.{Cache, Transform} alias MusicLibrary.Assets.{Cache, Image, Transform}
alias MusicLibrary.Records.Cover
# 1 year in seconds # 1 year in seconds
@cache_duration 60 * 60 * 24 * 365 @cache_duration 60 * 60 * 24 * 365
@@ -31,10 +30,10 @@ defmodule MusicLibraryWeb.AssetController do
image_data = image_data =
if transform.width do if transform.width do
# TODO: find a way to cache computation, or pre-compute thumb and store it # TODO: find a way to cache computation, or pre-compute thumb and store it
{:ok, data} = Cover.resize(asset.content, transform.width, format) {:ok, data} = Image.resize(asset.content, transform.width, format)
data data
else else
{:ok, data} = Cover.convert(asset.content, asset.format, format) {:ok, data} = Image.convert(asset.content, asset.format, format)
data data
end end
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

@@ -1,15 +1,13 @@
defmodule MusicLibrary.Records.CoverTest do defmodule MusicLibrary.Assets.ImageTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
import MusicLibrary.Fixtures.Records alias MusicLibrary.Assets.Image
alias MusicLibrary.Records.Cover
describe "resize/1" do describe "resize/1" do
test "it resizes to the desired size" do test "it resizes to the desired size" do
# Use the cached cover data which is much faster than reading from disk # Use the cached cover data which is much faster than reading from disk
cover_data = marbles_cover_data() cover_data = Image.fallback_data()
{:ok, resized_cover} = Cover.resize(cover_data) {:ok, resized_cover} = Image.resize(cover_data)
assert cover_data !== resized_cover assert cover_data !== resized_cover
end end
end end
+2 -2
View File
@@ -7,7 +7,7 @@ defmodule MusicLibrary.RecordsTest do
alias MusicLibrary.Assets alias MusicLibrary.Assets
alias MusicLibrary.Records alias MusicLibrary.Records
alias MusicLibrary.Records.{Cover, SearchIndex} alias MusicLibrary.Records.SearchIndex
defp create_records(_) do defp create_records(_) do
records = [ records = [
@@ -336,7 +336,7 @@ defmodule MusicLibrary.RecordsTest do
assert updated_record.cover_hash == assert updated_record.cover_hash ==
"6E0D25D1FD1019D771D7EB3F777E2C7C1B06A73A92E56A584D674D86DD8AF441" "6E0D25D1FD1019D771D7EB3F777E2C7C1B06A73A92E56A584D674D86DD8AF441"
{:ok, expected_content} = Cover.resize(raven_cover_data()) {:ok, expected_content} = Assets.Image.resize(raven_cover_data())
assert Assets.get(updated_record.cover_hash).content == expected_content assert Assets.get(updated_record.cover_hash).content == expected_content
end end
@@ -8,8 +8,8 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
alias MusicBrainz.ReleaseGroupSearchResult alias MusicBrainz.ReleaseGroupSearchResult
alias MusicLibrary.Assets alias MusicLibrary.Assets
alias MusicLibrary.Assets.Transform alias MusicLibrary.Assets.{Image, Transform}
alias MusicLibrary.Records.{Cover, Record} alias MusicLibrary.Records.Record
# make it a multiple of 4 for easier calculations # make it a multiple of 4 for easier calculations
@default_records_page_size 8 @default_records_page_size 8
@@ -317,7 +317,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
assert record.cover_hash == assert record.cover_hash ==
"E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960" "E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960"
{:ok, resized_cover_data} = Cover.resize(cover_data) {:ok, resized_cover_data} = Image.resize(cover_data)
assets = Assets.get(record.cover_hash) assets = Assets.get(record.cover_hash)
@@ -425,7 +425,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
"E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960" "E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960"
asset = Assets.get(record.cover_hash) asset = Assets.get(record.cover_hash)
{:ok, resized_cover_data} = Cover.resize(cover_data) {:ok, resized_cover_data} = Image.resize(cover_data)
assert asset.content == resized_cover_data assert asset.content == resized_cover_data