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}
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)
@external_resource fallback_path
+5 -5
View File
@@ -7,7 +7,7 @@ defmodule MusicLibrary.Records do
alias MusicLibrary.Artists
alias MusicLibrary.Assets
alias MusicLibrary.Records.{ArtistRecord, Cover, Record, SearchParser}
alias MusicLibrary.Records.{ArtistRecord, Record, SearchParser}
alias MusicLibrary.{BackgroundRepo, Repo, Worker}
def essential_fields do
@@ -228,8 +228,8 @@ defmodule MusicLibrary.Records do
defp get_cover_art_or_default(musicbrainz_id) do
case MusicBrainz.get_cover_art({:musicbrainz_id, musicbrainz_id}) do
{:error, :cover_not_available} -> {:ok, Cover.fallback_data()}
{:ok, cover_data} -> Cover.resize(cover_data)
{:error, :cover_not_available} -> {:ok, Assets.Image.fallback_data()}
{:ok, cover_data} -> Assets.Image.resize(cover_data)
end
end
@@ -259,7 +259,7 @@ defmodule MusicLibrary.Records do
def refresh_cover(record) do
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
record
|> Record.set_cover_hash(asset.hash)
@@ -286,7 +286,7 @@ defmodule MusicLibrary.Records do
end
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
record
|> Record.set_cover_hash(asset.hash)
@@ -2,8 +2,7 @@ defmodule MusicLibraryWeb.AssetController do
use MusicLibraryWeb, :controller
alias MusicLibrary.Assets
alias MusicLibrary.Assets.{Cache, Transform}
alias MusicLibrary.Records.Cover
alias MusicLibrary.Assets.{Cache, Image, Transform}
# 1 year in seconds
@cache_duration 60 * 60 * 24 * 365
@@ -31,10 +30,10 @@ defmodule MusicLibraryWeb.AssetController do
image_data =
if transform.width do
# 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
else
{:ok, data} = Cover.convert(asset.content, asset.format, format)
{:ok, data} = Image.convert(asset.content, asset.format, format)
data
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
import MusicLibrary.Fixtures.Records
alias MusicLibrary.Records.Cover
alias MusicLibrary.Assets.Image
describe "resize/1" do
test "it resizes to the desired size" do
# Use the cached cover data which is much faster than reading from disk
cover_data = marbles_cover_data()
{:ok, resized_cover} = Cover.resize(cover_data)
cover_data = Image.fallback_data()
{:ok, resized_cover} = Image.resize(cover_data)
assert cover_data !== resized_cover
end
end
+2 -2
View File
@@ -7,7 +7,7 @@ defmodule MusicLibrary.RecordsTest do
alias MusicLibrary.Assets
alias MusicLibrary.Records
alias MusicLibrary.Records.{Cover, SearchIndex}
alias MusicLibrary.Records.SearchIndex
defp create_records(_) do
records = [
@@ -336,7 +336,7 @@ defmodule MusicLibrary.RecordsTest do
assert updated_record.cover_hash ==
"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
end
@@ -8,8 +8,8 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
alias MusicBrainz.ReleaseGroupSearchResult
alias MusicLibrary.Assets
alias MusicLibrary.Assets.Transform
alias MusicLibrary.Records.{Cover, Record}
alias MusicLibrary.Assets.{Image, Transform}
alias MusicLibrary.Records.Record
# make it a multiple of 4 for easier calculations
@default_records_page_size 8
@@ -317,7 +317,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
assert record.cover_hash ==
"E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960"
{:ok, resized_cover_data} = Cover.resize(cover_data)
{:ok, resized_cover_data} = Image.resize(cover_data)
assets = Assets.get(record.cover_hash)
@@ -425,7 +425,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
"E7238C742E5B8711FC5BFF01A4A1F727D9E404A4D1420429A6B37ABFFC0B5960"
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