Use release instead of year

This commit is contained in:
Claudio Ortolina
2024-10-02 14:22:22 +01:00
parent 97b04ba8a2
commit 024d95da7c
13 changed files with 44 additions and 42 deletions
+2 -13
View File
@@ -4,7 +4,7 @@ defmodule MusicLibrary.Records do
alias MusicLibrary.Records.{MusicBrainz, Record}
@fields [:id, :type, :format, :title, :year, :genres, :musicbrainz_id, :image_data_hash]
@fields [:id, :type, :format, :title, :release, :genres, :musicbrainz_id, :image_data_hash]
def list_records(opts \\ []) do
limit = Keyword.get(opts, :limit, 20)
@@ -104,7 +104,7 @@ defmodule MusicLibrary.Records do
"musicbrainz_id" => musicbrainz_id,
"title" => release_group["title"],
"artists" => artists_attrs,
"year" => parse_year(release_group["first-release-date"]),
"release" => release_group["first-release-date"],
"type" => parse_subtype(release_group["primary-type"]),
"format" => format,
"genres" => Enum.map(release_group["genres"], fn g -> g["name"] end),
@@ -113,17 +113,6 @@ defmodule MusicLibrary.Records do
}
end
defp parse_year(iso_date) when is_binary(iso_date) do
case Date.from_iso8601(iso_date) do
{:ok, date} ->
date.year
_error ->
{year, _rest} = Integer.parse(iso_date)
{:ok, year}
end
end
defp parse_subtype("Album"), do: :album
defp parse_subtype("EP"), do: :ep
defp parse_subtype("Live"), do: :live
+1 -10
View File
@@ -173,7 +173,7 @@ defmodule MusicLibrary.Records.MusicBrainz do
rg["artist-credit"]
|> Enum.map(fn ac -> ac["artist"]["name"] end)
|> Enum.join(", "),
year: parse_year(rg["first-release-date"])
release: rg["first-release-date"]
}
end)}
end
@@ -231,15 +231,6 @@ defmodule MusicLibrary.Records.MusicBrainz do
end
end
defp parse_year(nil), do: ""
defp parse_year(iso_date) do
case Date.from_iso8601(iso_date) do
{:ok, date} -> date.year
_error -> nil
end
end
defp parse_subtype("Album"), do: :album
defp parse_subtype("EP"), do: :ep
defp parse_subtype("Live"), do: :live
+3 -2
View File
@@ -16,6 +16,7 @@ defmodule MusicLibrary.Records.Record do
field :year, :integer
field :musicbrainz_id, Ecto.UUID
field :genres, {:array, :string}
field :release, :string
embeds_many :artists, Artist do
field :name, :string
@@ -35,14 +36,14 @@ defmodule MusicLibrary.Records.Record do
:format,
:title,
:musicbrainz_id,
:year,
:release,
:genres,
:image_url,
:image_data
])
|> cast_embed(:artists, with: &artist_changeset/2)
|> generate_image_data_hash()
|> validate_required([:type, :title, :musicbrainz_id, :year, :genres])
|> validate_required([:type, :title, :musicbrainz_id, :release, :genres])
end
@doc false
@@ -33,7 +33,7 @@ defmodule MusicLibraryWeb.RecordLive.FormComponent do
prompt="Choose a value"
options={Ecto.Enum.values(MusicLibrary.Records.Record, :type)}
/>
<.input field={@form[:year]} type="number" label="Year" />
<.input field={@form[:release]} type="text" label="Release" />
<div>
<.label for={@uploads.image_data.ref}>
Cover art
@@ -41,7 +41,7 @@ defmodule MusicLibraryWeb.RecordLive.ImportComponent do
<%= @release_group.title %>
<span class="mt-1 text-xs leading-5 text-gray-500">
<%= @release_group.year %>
<%= @release_group.release %>
</span>
</p>
<p class="mt-1 truncate text-xs leading-5 text-gray-500"><%= @release_group.artists %></p>
@@ -38,7 +38,7 @@
<:col :let={{_id, record}} label="Record">
<p class="text-sm max-sm:text-xs"><%= Enum.map(record.artists, fn a -> a.name end) %></p>
<p class="text-base font-semibold text-wrap max-sm:text-xs"><%= record.title %></p>
<p class="text-sm max-sm:text-xs"><%= record.year %></p>
<p class="text-sm max-sm:text-xs"><%= record.release %></p>
</:col>
<:action :let={{_id, record}}>
<div class="sr-only">
@@ -34,7 +34,7 @@
<code><%= @record.musicbrainz_id %></code>
</a>
</:item>
<:item title="Year"><%= @record.year %></:item>
<:item title="Release"><%= @record.release %></:item>
<:item title="Genres">
<span
:for={genre <- @record.genres}
+1 -1
View File
@@ -1,3 +1,3 @@
defmodule Obsidian.Entry do
defstruct [:type, :musicbrainz_id, :title, :year, :image_url, :genres]
defstruct [:type, :musicbrainz_id, :title, :release, :image_url, :genres]
end
+4 -8
View File
@@ -8,7 +8,7 @@ defmodule Obsidian.Parser do
type: parse_subtype(meta["subType"]),
musicbrainz_id: meta["id"],
title: meta["title"],
year: meta["year"] |> maybe_parse_year(),
release: meta["year"] |> parse_release(),
image_url: meta["image"],
genres: meta["genres"]
}}
@@ -41,11 +41,7 @@ defmodule Obsidian.Parser do
defp parse_subtype("Single"), do: :single
defp parse_subtype(_), do: :other
defp maybe_parse_year(nil), do: nil
defp maybe_parse_year(year) when is_integer(year), do: year
defp maybe_parse_year(year) when is_binary(year) do
{integer, _remainder} = Integer.parse(year, 10)
integer
end
defp parse_release(nil), do: nil
defp parse_release(year) when is_integer(year), do: Integer.to_string(year)
defp parse_release(year) when is_binary(year), do: year
end
@@ -0,0 +1,25 @@
defmodule MusicLibrary.Repo.Migrations.AddReleaseToRecords do
use Ecto.Migration
import Ecto.Query
def up do
alter table(:records) do
add :release, :string
end
flush()
query =
from(r in MusicLibrary.Records.Record,
update: [set: [release: r.year]]
)
MusicLibrary.Repo.update_all(query, [])
end
def down do
alter table(:records) do
remove :release
end
end
end
@@ -33,7 +33,7 @@ defmodule MusicLibraryWeb.RecordLiveTest do
for record <- present do
assert html =~ escape(record.title)
assert html =~ to_string(record.year)
assert html =~ to_string(record.release)
for artist <- record.artists do
assert html =~ escape(artist["name"])
+2 -2
View File
@@ -14,7 +14,7 @@ defmodule Obsidian.ParserTest do
type: :album,
musicbrainz_id: "20790e26-98e4-3ad3-a67f-b674758b942d",
title: "Marbles",
year: 2004,
release: "2004",
image_url:
"https://coverartarchive.org/release-group/20790e26-98e4-3ad3-a67f-b674758b942d/front",
genres: [
@@ -41,7 +41,7 @@ defmodule Obsidian.ParserTest do
musicbrainz_id: "950092d6-45f6-4269-87da-99a9ff2fcc52",
title: "Guardians of the Galaxy: Awesome Mix, Vol. 1",
type: :album,
year: 2014
release: "2014"
}}
end
end
+1 -1
View File
@@ -44,7 +44,7 @@ defmodule MusicLibrary.RecordsFixtures do
title: Enum.random(@titles),
type: :album,
format: :cd,
year: Enum.random(1969..2024)
release: Enum.random(1969..2024) |> Integer.to_string()
})
|> MusicLibrary.Records.create_record()