Use release instead of year
This commit is contained in:
@@ -4,7 +4,7 @@ defmodule MusicLibrary.Records do
|
|||||||
|
|
||||||
alias MusicLibrary.Records.{MusicBrainz, Record}
|
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
|
def list_records(opts \\ []) do
|
||||||
limit = Keyword.get(opts, :limit, 20)
|
limit = Keyword.get(opts, :limit, 20)
|
||||||
@@ -104,7 +104,7 @@ defmodule MusicLibrary.Records do
|
|||||||
"musicbrainz_id" => musicbrainz_id,
|
"musicbrainz_id" => musicbrainz_id,
|
||||||
"title" => release_group["title"],
|
"title" => release_group["title"],
|
||||||
"artists" => artists_attrs,
|
"artists" => artists_attrs,
|
||||||
"year" => parse_year(release_group["first-release-date"]),
|
"release" => release_group["first-release-date"],
|
||||||
"type" => parse_subtype(release_group["primary-type"]),
|
"type" => parse_subtype(release_group["primary-type"]),
|
||||||
"format" => format,
|
"format" => format,
|
||||||
"genres" => Enum.map(release_group["genres"], fn g -> g["name"] end),
|
"genres" => Enum.map(release_group["genres"], fn g -> g["name"] end),
|
||||||
@@ -113,17 +113,6 @@ defmodule MusicLibrary.Records do
|
|||||||
}
|
}
|
||||||
end
|
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("Album"), do: :album
|
||||||
defp parse_subtype("EP"), do: :ep
|
defp parse_subtype("EP"), do: :ep
|
||||||
defp parse_subtype("Live"), do: :live
|
defp parse_subtype("Live"), do: :live
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ defmodule MusicLibrary.Records.MusicBrainz do
|
|||||||
rg["artist-credit"]
|
rg["artist-credit"]
|
||||||
|> Enum.map(fn ac -> ac["artist"]["name"] end)
|
|> Enum.map(fn ac -> ac["artist"]["name"] end)
|
||||||
|> Enum.join(", "),
|
|> Enum.join(", "),
|
||||||
year: parse_year(rg["first-release-date"])
|
release: rg["first-release-date"]
|
||||||
}
|
}
|
||||||
end)}
|
end)}
|
||||||
end
|
end
|
||||||
@@ -231,15 +231,6 @@ defmodule MusicLibrary.Records.MusicBrainz do
|
|||||||
end
|
end
|
||||||
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("Album"), do: :album
|
||||||
defp parse_subtype("EP"), do: :ep
|
defp parse_subtype("EP"), do: :ep
|
||||||
defp parse_subtype("Live"), do: :live
|
defp parse_subtype("Live"), do: :live
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
field :year, :integer
|
field :year, :integer
|
||||||
field :musicbrainz_id, Ecto.UUID
|
field :musicbrainz_id, Ecto.UUID
|
||||||
field :genres, {:array, :string}
|
field :genres, {:array, :string}
|
||||||
|
field :release, :string
|
||||||
|
|
||||||
embeds_many :artists, Artist do
|
embeds_many :artists, Artist do
|
||||||
field :name, :string
|
field :name, :string
|
||||||
@@ -35,14 +36,14 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
:format,
|
:format,
|
||||||
:title,
|
:title,
|
||||||
:musicbrainz_id,
|
:musicbrainz_id,
|
||||||
:year,
|
:release,
|
||||||
:genres,
|
:genres,
|
||||||
:image_url,
|
:image_url,
|
||||||
:image_data
|
:image_data
|
||||||
])
|
])
|
||||||
|> cast_embed(:artists, with: &artist_changeset/2)
|
|> cast_embed(:artists, with: &artist_changeset/2)
|
||||||
|> generate_image_data_hash()
|
|> generate_image_data_hash()
|
||||||
|> validate_required([:type, :title, :musicbrainz_id, :year, :genres])
|
|> validate_required([:type, :title, :musicbrainz_id, :release, :genres])
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc false
|
@doc false
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ defmodule MusicLibraryWeb.RecordLive.FormComponent do
|
|||||||
prompt="Choose a value"
|
prompt="Choose a value"
|
||||||
options={Ecto.Enum.values(MusicLibrary.Records.Record, :type)}
|
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>
|
<div>
|
||||||
<.label for={@uploads.image_data.ref}>
|
<.label for={@uploads.image_data.ref}>
|
||||||
Cover art
|
Cover art
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ defmodule MusicLibraryWeb.RecordLive.ImportComponent do
|
|||||||
<%= @release_group.title %>
|
<%= @release_group.title %>
|
||||||
|
|
||||||
<span class="mt-1 text-xs leading-5 text-gray-500">
|
<span class="mt-1 text-xs leading-5 text-gray-500">
|
||||||
<%= @release_group.year %>
|
<%= @release_group.release %>
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="mt-1 truncate text-xs leading-5 text-gray-500"><%= @release_group.artists %></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">
|
<: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-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-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>
|
</:col>
|
||||||
<:action :let={{_id, record}}>
|
<:action :let={{_id, record}}>
|
||||||
<div class="sr-only">
|
<div class="sr-only">
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<code><%= @record.musicbrainz_id %></code>
|
<code><%= @record.musicbrainz_id %></code>
|
||||||
</a>
|
</a>
|
||||||
</:item>
|
</:item>
|
||||||
<:item title="Year"><%= @record.year %></:item>
|
<:item title="Release"><%= @record.release %></:item>
|
||||||
<:item title="Genres">
|
<:item title="Genres">
|
||||||
<span
|
<span
|
||||||
:for={genre <- @record.genres}
|
:for={genre <- @record.genres}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
defmodule Obsidian.Entry do
|
defmodule Obsidian.Entry do
|
||||||
defstruct [:type, :musicbrainz_id, :title, :year, :image_url, :genres]
|
defstruct [:type, :musicbrainz_id, :title, :release, :image_url, :genres]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ defmodule Obsidian.Parser do
|
|||||||
type: parse_subtype(meta["subType"]),
|
type: parse_subtype(meta["subType"]),
|
||||||
musicbrainz_id: meta["id"],
|
musicbrainz_id: meta["id"],
|
||||||
title: meta["title"],
|
title: meta["title"],
|
||||||
year: meta["year"] |> maybe_parse_year(),
|
release: meta["year"] |> parse_release(),
|
||||||
image_url: meta["image"],
|
image_url: meta["image"],
|
||||||
genres: meta["genres"]
|
genres: meta["genres"]
|
||||||
}}
|
}}
|
||||||
@@ -41,11 +41,7 @@ defmodule Obsidian.Parser do
|
|||||||
defp parse_subtype("Single"), do: :single
|
defp parse_subtype("Single"), do: :single
|
||||||
defp parse_subtype(_), do: :other
|
defp parse_subtype(_), do: :other
|
||||||
|
|
||||||
defp maybe_parse_year(nil), do: nil
|
defp parse_release(nil), do: nil
|
||||||
defp maybe_parse_year(year) when is_integer(year), do: year
|
defp parse_release(year) when is_integer(year), do: Integer.to_string(year)
|
||||||
|
defp parse_release(year) when is_binary(year), do: year
|
||||||
defp maybe_parse_year(year) when is_binary(year) do
|
|
||||||
{integer, _remainder} = Integer.parse(year, 10)
|
|
||||||
integer
|
|
||||||
end
|
|
||||||
end
|
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
|
for record <- present do
|
||||||
assert html =~ escape(record.title)
|
assert html =~ escape(record.title)
|
||||||
assert html =~ to_string(record.year)
|
assert html =~ to_string(record.release)
|
||||||
|
|
||||||
for artist <- record.artists do
|
for artist <- record.artists do
|
||||||
assert html =~ escape(artist["name"])
|
assert html =~ escape(artist["name"])
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ defmodule Obsidian.ParserTest do
|
|||||||
type: :album,
|
type: :album,
|
||||||
musicbrainz_id: "20790e26-98e4-3ad3-a67f-b674758b942d",
|
musicbrainz_id: "20790e26-98e4-3ad3-a67f-b674758b942d",
|
||||||
title: "Marbles",
|
title: "Marbles",
|
||||||
year: 2004,
|
release: "2004",
|
||||||
image_url:
|
image_url:
|
||||||
"https://coverartarchive.org/release-group/20790e26-98e4-3ad3-a67f-b674758b942d/front",
|
"https://coverartarchive.org/release-group/20790e26-98e4-3ad3-a67f-b674758b942d/front",
|
||||||
genres: [
|
genres: [
|
||||||
@@ -41,7 +41,7 @@ defmodule Obsidian.ParserTest do
|
|||||||
musicbrainz_id: "950092d6-45f6-4269-87da-99a9ff2fcc52",
|
musicbrainz_id: "950092d6-45f6-4269-87da-99a9ff2fcc52",
|
||||||
title: "Guardians of the Galaxy: Awesome Mix, Vol. 1",
|
title: "Guardians of the Galaxy: Awesome Mix, Vol. 1",
|
||||||
type: :album,
|
type: :album,
|
||||||
year: 2014
|
release: "2014"
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ defmodule MusicLibrary.RecordsFixtures do
|
|||||||
title: Enum.random(@titles),
|
title: Enum.random(@titles),
|
||||||
type: :album,
|
type: :album,
|
||||||
format: :cd,
|
format: :cd,
|
||||||
year: Enum.random(1969..2024)
|
release: Enum.random(1969..2024) |> Integer.to_string()
|
||||||
})
|
})
|
||||||
|> MusicLibrary.Records.create_record()
|
|> MusicLibrary.Records.create_record()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user