Support getting artist bios from Wikipedia (experimental)

This commit is contained in:
Claudio Ortolina
2026-02-09 15:19:35 +00:00
parent f82e764c94
commit bcae291cff
23 changed files with 639 additions and 31 deletions
+26
View File
@@ -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)
+31
View File
@@ -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