Extract MusicBrainz main module
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
defmodule MusicBrainz do
|
||||||
|
def search_release_group(query, opts \\ []) do
|
||||||
|
limit = Keyword.get(opts, :limit, 20)
|
||||||
|
offset = Keyword.get(opts, :offset, 0)
|
||||||
|
|
||||||
|
music_brainz_config().api.search_release_group(
|
||||||
|
query,
|
||||||
|
[limit: limit, offset: offset],
|
||||||
|
music_brainz_config()
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_release_group(musicbrainz_id) do
|
||||||
|
music_brainz_config().api.get_release_group(musicbrainz_id, music_brainz_config())
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_releases(musicbrainz_id, opts) do
|
||||||
|
music_brainz_config().api.get_releases(musicbrainz_id, opts, music_brainz_config())
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_release(musicbrainz_id) do
|
||||||
|
music_brainz_config().api.get_release(musicbrainz_id, music_brainz_config())
|
||||||
|
end
|
||||||
|
|
||||||
|
def search_release_by_barcode(barcode) do
|
||||||
|
music_brainz_config().api.search_release_by_barcode(barcode, music_brainz_config())
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_cover_art(id_or_url) do
|
||||||
|
music_brainz_config().api.get_cover_art(id_or_url, music_brainz_config())
|
||||||
|
end
|
||||||
|
|
||||||
|
defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library)
|
||||||
|
end
|
||||||
@@ -117,21 +117,8 @@ defmodule MusicLibrary.Records do
|
|||||||
Repo.one(q)
|
Repo.one(q)
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def search_release_group(query, opts \\ []) do
|
|
||||||
limit = Keyword.get(opts, :limit, 20)
|
|
||||||
offset = Keyword.get(opts, :offset, 0)
|
|
||||||
|
|
||||||
music_brainz_config().api.search_release_group(
|
|
||||||
query,
|
|
||||||
[limit: limit, offset: offset],
|
|
||||||
music_brainz_config()
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def import_from_musicbrainz_release(musicbrainz_id, opts \\ []) do
|
def import_from_musicbrainz_release(musicbrainz_id, opts \\ []) do
|
||||||
case music_brainz_config().api.get_release(musicbrainz_id, music_brainz_config()) do
|
case MusicBrainz.get_release(musicbrainz_id) do
|
||||||
{:ok, release} ->
|
{:ok, release} ->
|
||||||
release_group_id = release["release-group"]["id"]
|
release_group_id = release["release-group"]["id"]
|
||||||
import_from_musicbrainz_release_group(release_group_id, opts)
|
import_from_musicbrainz_release_group(release_group_id, opts)
|
||||||
@@ -141,9 +128,8 @@ defmodule MusicLibrary.Records do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def search_release_by_barcode(barcode) do
|
def search_release_by_barcode(barcode) do
|
||||||
case music_brainz_config().api.search_release_by_barcode(barcode, music_brainz_config()) do
|
case MusicBrainz.search_release_by_barcode(barcode) do
|
||||||
{:ok, releases} ->
|
{:ok, releases} ->
|
||||||
{:ok,
|
{:ok,
|
||||||
Enum.map(releases, fn r -> MusicBrainz.ReleaseSearchResult.from_api_response(r) end)}
|
Enum.map(releases, fn r -> MusicBrainz.ReleaseSearchResult.from_api_response(r) end)}
|
||||||
@@ -153,12 +139,10 @@ defmodule MusicLibrary.Records do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def import_from_musicbrainz_release_group(musicbrainz_id, opts \\ []) do
|
def import_from_musicbrainz_release_group(musicbrainz_id, opts \\ []) do
|
||||||
with format = Keyword.get(opts, :format, "cd"),
|
with format = Keyword.get(opts, :format, "cd"),
|
||||||
purchased_at = Keyword.get(opts, :purchased_at),
|
purchased_at = Keyword.get(opts, :purchased_at),
|
||||||
{:ok, release_group} <-
|
{:ok, release_group} <- MusicBrainz.get_release_group(musicbrainz_id),
|
||||||
music_brainz_config().api.get_release_group(musicbrainz_id, music_brainz_config()),
|
|
||||||
{:ok, release_group_with_releases} <- merge_releases(musicbrainz_id, release_group),
|
{:ok, release_group_with_releases} <- merge_releases(musicbrainz_id, release_group),
|
||||||
{:ok, cover_data} <- get_cover_art_or_default(musicbrainz_id),
|
{:ok, cover_data} <- get_cover_art_or_default(musicbrainz_id),
|
||||||
record_attrs =
|
record_attrs =
|
||||||
@@ -196,24 +180,15 @@ defmodule MusicLibrary.Records do
|
|||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
defp get_cover_art_or_default(musicbrainz_id) do
|
defp get_cover_art_or_default(musicbrainz_id) do
|
||||||
case music_brainz_config().api.get_cover_art(
|
case MusicBrainz.get_cover_art({:musicbrainz_id, musicbrainz_id}) do
|
||||||
{:musicbrainz_id, musicbrainz_id},
|
|
||||||
music_brainz_config()
|
|
||||||
) do
|
|
||||||
{:error, :cover_not_available} -> {:ok, Cover.fallback_data()}
|
{:error, :cover_not_available} -> {:ok, Cover.fallback_data()}
|
||||||
{:ok, cover_data} -> Cover.resize(cover_data)
|
{:ok, cover_data} -> Cover.resize(cover_data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def refresh_cover(record) do
|
def refresh_cover(record) do
|
||||||
with {:ok, cover_data} <-
|
with {:ok, cover_data} <- MusicBrainz.get_cover_art({:url, record.cover_url}) do
|
||||||
music_brainz_config().api.get_cover_art(
|
|
||||||
{:url, record.cover_url},
|
|
||||||
music_brainz_config()
|
|
||||||
) do
|
|
||||||
{:ok, thumb_data} = Cover.resize(cover_data)
|
{:ok, thumb_data} = Cover.resize(cover_data)
|
||||||
|
|
||||||
record
|
record
|
||||||
@@ -230,13 +205,8 @@ defmodule MusicLibrary.Records do
|
|||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
def refresh_musicbrainz_data(record) do
|
def refresh_musicbrainz_data(record) do
|
||||||
with {:ok, data} <-
|
with {:ok, data} <- MusicBrainz.get_release_group(record.musicbrainz_id),
|
||||||
music_brainz_config().api.get_release_group(
|
|
||||||
record.musicbrainz_id,
|
|
||||||
music_brainz_config()
|
|
||||||
),
|
|
||||||
{:ok, data_with_releases} <- merge_releases(record.musicbrainz_id, data) do
|
{:ok, data_with_releases} <- merge_releases(record.musicbrainz_id, data) do
|
||||||
record
|
record
|
||||||
|> Record.add_musicbrainz_data(data_with_releases)
|
|> Record.add_musicbrainz_data(data_with_releases)
|
||||||
@@ -254,13 +224,11 @@ defmodule MusicLibrary.Records do
|
|||||||
do_stream_releases(musicbrainz_id, [], 0)
|
do_stream_releases(musicbrainz_id, [], 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: muve to music_brainz context
|
|
||||||
defp do_stream_releases(musicbrainz_id, releases, offset) do
|
defp do_stream_releases(musicbrainz_id, releases, offset) do
|
||||||
limit = 100
|
limit = 100
|
||||||
opts = [limit: limit, offset: offset]
|
opts = [limit: limit, offset: offset]
|
||||||
|
|
||||||
with {:ok, data} <-
|
with {:ok, data} <- MusicBrainz.get_releases(musicbrainz_id, opts) do
|
||||||
music_brainz_config().api.get_releases(musicbrainz_id, opts, music_brainz_config()) do
|
|
||||||
%{"releases" => new_releases} = data
|
%{"releases" => new_releases} = data
|
||||||
|
|
||||||
if Enum.count(new_releases) < limit do
|
if Enum.count(new_releases) < limit do
|
||||||
@@ -296,6 +264,4 @@ defmodule MusicLibrary.Records do
|
|||||||
def change_record(%Record{} = record, attrs \\ %{}) do
|
def change_record(%Record{} = record, attrs \\ %{}) do
|
||||||
Record.changeset(record, attrs)
|
Record.changeset(record, attrs)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library)
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -157,6 +157,6 @@ defmodule MusicLibraryWeb.RecordLive.ImportComponent do
|
|||||||
defp search(""), do: {:ok, []}
|
defp search(""), do: {:ok, []}
|
||||||
|
|
||||||
defp search(mb_query) do
|
defp search(mb_query) do
|
||||||
Records.search_release_group(mb_query, limit: 10)
|
MusicBrainz.search_release_group(mb_query, limit: 10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
defmodule MusicBrainzTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
alias MusicBrainz.APIBehaviourMock
|
||||||
|
import MusicLibrary.Fixtures.ReleaseGroup
|
||||||
|
import Mox
|
||||||
|
|
||||||
|
setup :verify_on_exit!
|
||||||
|
|
||||||
|
describe "search_release_group/2" do
|
||||||
|
test "it returns results with correct limit and offset" do
|
||||||
|
mock_results = release_group_search_results()
|
||||||
|
|
||||||
|
expect(APIBehaviourMock, :search_release_group, fn "Marillion",
|
||||||
|
[limit: 20, offset: 10],
|
||||||
|
_config ->
|
||||||
|
{:ok, mock_results}
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert {:ok, mock_results} ==
|
||||||
|
MusicBrainz.search_release_group("Marillion", limit: 20, offset: 10)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -182,21 +182,6 @@ defmodule MusicLibrary.RecordsTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "search_release_group/2" do
|
|
||||||
test "it returns results with correct limit and offset" do
|
|
||||||
mock_results = release_group_search_results()
|
|
||||||
|
|
||||||
expect(APIBehaviourMock, :search_release_group, fn "Marillion",
|
|
||||||
[limit: 20, offset: 10],
|
|
||||||
_config ->
|
|
||||||
{:ok, mock_results}
|
|
||||||
end)
|
|
||||||
|
|
||||||
assert {:ok, mock_results} ==
|
|
||||||
Records.search_release_group("Marillion", limit: 20, offset: 10)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "import_from_musicbrainz_release_group/2" do
|
describe "import_from_musicbrainz_release_group/2" do
|
||||||
test "it saves a record with its cover art" do
|
test "it saves a record with its cover art" do
|
||||||
current_time = DateTime.utc_now()
|
current_time = DateTime.utc_now()
|
||||||
|
|||||||
Reference in New Issue
Block a user