Refactor TracklistPdf to take release alone

This commit is contained in:
Claudio Ortolina
2026-04-23 07:48:53 +01:00
parent 8631b97b4d
commit 0d1f580379
3 changed files with 81 additions and 94 deletions
+12 -14
View File
@@ -1,6 +1,6 @@
defmodule MusicLibrary.Records.TracklistPdf do
@moduledoc """
Generates 120mm x 120mm PDF tracklists from record and release data via Typst.
Generates 120mm x 120mm PDF tracklists from release data via Typst.
"""
alias MusicBrainz.Release
@@ -21,23 +21,21 @@ defmodule MusicLibrary.Records.TracklistPdf do
# including the header area consumed by artist name and album title.
@capacities %{8 => 35, 7 => 38, 6 => 45, 5 => 53}
@spec generate(MusicLibrary.Records.Record.t(), Release.t()) ::
{:ok, binary()} | {:error, term()}
def generate(record, release) do
markup = build_markup(record, release.media)
@spec generate(Release.t()) :: {:ok, binary()} | {:error, term()}
def generate(release) do
markup = build_markup(release, release.media)
Typst.render_to_pdf(markup)
end
@spec generate_medium(MusicLibrary.Records.Record.t(), Release.t(), integer()) ::
{:ok, binary()} | {:error, term()}
def generate_medium(record, release, medium_number) do
@spec generate_medium(Release.t(), integer()) :: {:ok, binary()} | {:error, term()}
def generate_medium(release, medium_number) do
case Release.get_medium(release, medium_number) do
nil -> {:error, :medium_not_found}
medium -> generate(record, %{release | media: [medium]})
medium -> generate(%{release | media: [medium]})
end
end
defp build_markup(record, media) do
defp build_markup(release, media) do
media_count = length(media)
track_count = Enum.sum(Enum.map(media, &length(&1.tracks)))
header_count = if media_count > 1, do: media_count, else: 0
@@ -54,9 +52,9 @@ defmodule MusicLibrary.Records.TracklistPdf do
#place(top + center, scope: "parent", float: true)[
#align(center)[
#text(size: 10pt, weight: "bold")[#{Format.escape(artist_names(record))}]
#text(size: 10pt, weight: "bold")[#{Format.escape(artist_names(release))}]
#linebreak()
#text(size: 9pt, style: "italic")[#{Format.escape(record.title)}]
#text(size: 9pt, style: "italic")[#{Format.escape(release.title)}]
]
#v(3mm)
]
@@ -138,8 +136,8 @@ defmodule MusicLibrary.Records.TracklistPdf do
Map.fetch!(@capacities, font_size) * columns
end
defp artist_names(record) do
Enum.map_join(record.artists, fn artist ->
defp artist_names(release) do
Enum.map_join(release.artists, fn artist ->
artist.name <> (artist.joinphrase || "")
end)
end
+2 -2
View File
@@ -620,7 +620,7 @@ defmodule MusicLibraryWeb.Components.Release do
release = socket.assigns.release_with_tracks.result
record = socket.assigns.record
case TracklistPdf.generate(record, release) do
case TracklistPdf.generate(release) do
{:ok, pdf_binary} ->
filename = "#{record.title} - Tracklist.pdf"
@@ -654,7 +654,7 @@ defmodule MusicLibraryWeb.Components.Release do
record = socket.assigns.record
{number, ""} = Integer.parse(number)
case TracklistPdf.generate_medium(record, release, number) do
case TracklistPdf.generate_medium(release, number) do
{:ok, pdf_binary} ->
filename = "#{record.title} - Disc #{number} - Tracklist.pdf"