Support getting artist bios from Wikipedia (experimental)
This commit is contained in:
@@ -134,6 +134,32 @@ defmodule MusicLibrary.Artists do
|
||||
enqueue_worker(Worker.ArtistRefreshDiscogsData, %{"id" => artist_info.id})
|
||||
end
|
||||
|
||||
def fetch_wikipedia_data(artist_id) do
|
||||
artist_info = get_artist_info!(artist_id)
|
||||
|
||||
if wikidata_id = ArtistInfo.wikidata_id(artist_info) do
|
||||
case Wikipedia.get_artist_summary(wikidata_id) do
|
||||
{:ok, summary} ->
|
||||
artist_info
|
||||
|> ArtistInfo.changeset(%{wikipedia_data: summary})
|
||||
|> Repo.update()
|
||||
|
||||
error ->
|
||||
error
|
||||
end
|
||||
else
|
||||
{:ok, artist_info}
|
||||
end
|
||||
end
|
||||
|
||||
def refresh_wikipedia_data(artist_id) do
|
||||
fetch_wikipedia_data(artist_id)
|
||||
end
|
||||
|
||||
def refresh_wikipedia_data_async(artist_info) do
|
||||
enqueue_worker(Worker.ArtistRefreshWikipediaData, %{"id" => artist_info.id})
|
||||
end
|
||||
|
||||
def create_artist_info(attrs) do
|
||||
%ArtistInfo{}
|
||||
|> ArtistInfo.changeset(attrs)
|
||||
|
||||
@@ -10,6 +10,7 @@ defmodule MusicLibrary.Artists.ArtistInfo do
|
||||
schema "artist_infos" do
|
||||
field :musicbrainz_data, :map, default: %{}
|
||||
field :discogs_data, :map, default: %{}
|
||||
field :wikipedia_data, :map, default: %{}
|
||||
field :image_data_hash, :string
|
||||
|
||||
has_one :note, Note, foreign_key: :musicbrainz_id
|
||||
@@ -23,6 +24,7 @@ defmodule MusicLibrary.Artists.ArtistInfo do
|
||||
:id,
|
||||
:musicbrainz_data,
|
||||
:discogs_data,
|
||||
:wikipedia_data,
|
||||
:image_data_hash
|
||||
])
|
||||
|> validate_required([:musicbrainz_data])
|
||||
@@ -82,4 +84,33 @@ defmodule MusicLibrary.Artists.ArtistInfo do
|
||||
_ -> nil
|
||||
end
|
||||
end
|
||||
|
||||
def wikidata_id(artist_info) do
|
||||
relations = get_in(artist_info.musicbrainz_data, ["relations"]) || []
|
||||
|
||||
Enum.find_value(relations, fn
|
||||
%{"type" => "wikidata", "url" => %{"resource" => "https://www.wikidata.org/wiki/" <> id}} ->
|
||||
id
|
||||
|
||||
_ ->
|
||||
nil
|
||||
end)
|
||||
end
|
||||
|
||||
def wikipedia_bio(artist_info) do
|
||||
get_in(artist_info.wikipedia_data, ["intro_html"]) ||
|
||||
get_in(artist_info.wikipedia_data, ["extract_html"])
|
||||
end
|
||||
|
||||
def wikipedia_summary(artist_info) do
|
||||
get_in(artist_info.wikipedia_data, ["extract"])
|
||||
end
|
||||
|
||||
def wikipedia_url(artist_info) do
|
||||
get_in(artist_info.wikipedia_data, ["content_urls", "desktop", "page"])
|
||||
end
|
||||
|
||||
def wikipedia_description(artist_info) do
|
||||
get_in(artist_info.wikipedia_data, ["description"])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
defmodule MusicLibrary.Worker.ArtistRefreshWikipediaData do
|
||||
use Oban.Worker, queue: :wikipedia, max_attempts: 3
|
||||
|
||||
@impl Oban.Worker
|
||||
def perform(%Oban.Job{args: %{"id" => artist_info_id}}) do
|
||||
result = MusicLibrary.Artists.refresh_wikipedia_data(artist_info_id)
|
||||
|
||||
Process.sleep(1_000)
|
||||
|
||||
result
|
||||
end
|
||||
end
|
||||
@@ -4,6 +4,7 @@ defmodule MusicLibrary.Worker.FetchArtistInfo do
|
||||
@impl Oban.Worker
|
||||
def perform(%Oban.Job{args: %{"id" => artist_id}}) do
|
||||
with {:ok, _artist_info} <- MusicLibrary.Artists.fetch_artist_info(artist_id),
|
||||
{:ok, _artist_info} <- MusicLibrary.Artists.fetch_wikipedia_data(artist_id),
|
||||
{:ok, _artist_info} <- MusicLibrary.Artists.fetch_image(artist_id) do
|
||||
:ok
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user