Store artist infos

This commit is contained in:
Claudio Ortolina
2025-04-26 13:57:43 +01:00
parent a5c261d9ad
commit ece877086f
4 changed files with 78 additions and 3 deletions
+3 -2
View File
@@ -1,6 +1,6 @@
defmodule MusicBrainz.Artist do
@enforce_keys [:id, :name, :sort_name]
defstruct [:id, :name, :sort_name, :country, :relations]
defstruct [:id, :name, :sort_name, :country, :relations, :musicbrainz_data]
def from_api_response(r) do
%__MODULE__{
@@ -8,7 +8,8 @@ defmodule MusicBrainz.Artist do
name: r["name"],
sort_name: r["sort-name"],
country: r["country"],
relations: parse_relations(r["relations"])
relations: parse_relations(r["relations"]),
musicbrainz_data: r
}
end
+15 -1
View File
@@ -2,7 +2,7 @@ defmodule MusicLibrary.Artists do
import Ecto.Query, warn: false
alias MusicLibrary.Repo
alias MusicLibrary.Records.{ArtistRecord, Record}
alias MusicLibrary.Records.{ArtistInfo, ArtistRecord, Record}
def get_artist!(musicbrainz_id) do
q =
@@ -44,6 +44,20 @@ defmodule MusicLibrary.Artists do
q |> Repo.all()
end
def fetch_artist_info(artist_id) do
with {:ok, musicbrainz_artist} <- MusicBrainz.get_artist(artist_id),
discogs_id = MusicBrainz.Artist.get_discogs_id(musicbrainz_artist),
{:ok, discogs_artist} <- Discogs.get_artist(discogs_id) do
%ArtistInfo{}
|> ArtistInfo.changeset(%{
id: musicbrainz_artist.id,
musicbrainz_data: musicbrainz_artist.musicbrainz_data,
discogs_data: discogs_artist
})
|> Repo.insert(on_conflict: {:replace, [:musicbrainz_data, :discogs_data]})
end
end
defp get_collected_artist_ids do
q =
from ar in ArtistRecord,
+44
View File
@@ -0,0 +1,44 @@
defmodule MusicLibrary.Records.ArtistInfo do
use Ecto.Schema
import Ecto.Changeset
alias MusicLibrary.Records.Cover
@primary_key {:id, :binary_id, autogenerate: true}
schema "artist_infos" do
field :musicbrainz_data, :map, default: %{}
field :discogs_data, :map, default: %{}
field :image_data, :binary
field :image_data_hash, :string
field :image_data_width, :integer
timestamps(type: :utc_datetime)
end
def changeset(artist_info, attrs) do
artist_info
|> cast(attrs, [
:id,
:musicbrainz_data,
:discogs_data,
:image_data,
:image_data_width
])
|> validate_required([:musicbrainz_data, :discogs_data])
|> generate_image_hash()
end
def generate_image_hash(%__MODULE__{image_data: image_data} = artist_info) do
change(artist_info, image_data_hash: Cover.hash(image_data))
end
def generate_image_hash(changeset) do
case get_change(changeset, :image_data) do
nil ->
changeset
image_data ->
put_change(changeset, :image_data_hash, Cover.hash(image_data))
end
end
end