Store artist infos
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
defmodule MusicBrainz.Artist do
|
defmodule MusicBrainz.Artist do
|
||||||
@enforce_keys [:id, :name, :sort_name]
|
@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
|
def from_api_response(r) do
|
||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
@@ -8,7 +8,8 @@ defmodule MusicBrainz.Artist do
|
|||||||
name: r["name"],
|
name: r["name"],
|
||||||
sort_name: r["sort-name"],
|
sort_name: r["sort-name"],
|
||||||
country: r["country"],
|
country: r["country"],
|
||||||
relations: parse_relations(r["relations"])
|
relations: parse_relations(r["relations"]),
|
||||||
|
musicbrainz_data: r
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ defmodule MusicLibrary.Artists do
|
|||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
alias MusicLibrary.Repo
|
alias MusicLibrary.Repo
|
||||||
|
|
||||||
alias MusicLibrary.Records.{ArtistRecord, Record}
|
alias MusicLibrary.Records.{ArtistInfo, ArtistRecord, Record}
|
||||||
|
|
||||||
def get_artist!(musicbrainz_id) do
|
def get_artist!(musicbrainz_id) do
|
||||||
q =
|
q =
|
||||||
@@ -44,6 +44,20 @@ defmodule MusicLibrary.Artists do
|
|||||||
q |> Repo.all()
|
q |> Repo.all()
|
||||||
end
|
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
|
defp get_collected_artist_ids do
|
||||||
q =
|
q =
|
||||||
from ar in ArtistRecord,
|
from ar in ArtistRecord,
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user