From ece877086f0cc9b8e6f876b773c8cfb963a41cc3 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sat, 26 Apr 2025 13:57:43 +0100 Subject: [PATCH] Store artist infos --- lib/music_brainz/artist.ex | 5 ++- lib/music_library/artists.ex | 16 ++++++- lib/music_library/records/artist_info.ex | 44 +++++++++++++++++++ .../20250426120843_create_artist_infos.exs | 16 +++++++ 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 lib/music_library/records/artist_info.ex create mode 100644 priv/repo/migrations/20250426120843_create_artist_infos.exs diff --git a/lib/music_brainz/artist.ex b/lib/music_brainz/artist.ex index 084d7873..2f2805d4 100644 --- a/lib/music_brainz/artist.ex +++ b/lib/music_brainz/artist.ex @@ -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 diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index 1471e2b7..165f4e37 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -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, diff --git a/lib/music_library/records/artist_info.ex b/lib/music_library/records/artist_info.ex new file mode 100644 index 00000000..9fa52fd1 --- /dev/null +++ b/lib/music_library/records/artist_info.ex @@ -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 diff --git a/priv/repo/migrations/20250426120843_create_artist_infos.exs b/priv/repo/migrations/20250426120843_create_artist_infos.exs new file mode 100644 index 00000000..ccf046c4 --- /dev/null +++ b/priv/repo/migrations/20250426120843_create_artist_infos.exs @@ -0,0 +1,16 @@ +defmodule MusicLibrary.Repo.Migrations.CreateArtistInfos do + use Ecto.Migration + + def change do + create table(:artist_infos, primary_key: false) do + add :id, :binary_id, primary_key: true + add :musicbrainz_data, :map + add :discogs_data, :map + add :image_data, :blob + add :image_data_hash, :string + add :image_data_width, :integer + + timestamps(type: :utc_datetime) + end + end +end