From b6ae022a6aacc9f889b19fabad993b24729e4cdb Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 24 Sep 2024 09:21:13 +0100 Subject: [PATCH] Move obsidian-related imports under Obsidian --- lib/obsidian/entry.ex | 3 ++ .../records => obsidian}/parser.ex | 16 ++++--- priv/repo/seeds.exs | 10 +++-- .../records => obsidian}/parser_test.exs | 45 +++++-------------- test/support/fixtures/guardians.md | 21 +++++++++ 5 files changed, 52 insertions(+), 43 deletions(-) create mode 100644 lib/obsidian/entry.ex rename lib/{music_library/records => obsidian}/parser.ex (80%) rename test/{music_library/records => obsidian}/parser_test.exs (50%) create mode 100644 test/support/fixtures/guardians.md diff --git a/lib/obsidian/entry.ex b/lib/obsidian/entry.ex new file mode 100644 index 00000000..39cd0e9d --- /dev/null +++ b/lib/obsidian/entry.ex @@ -0,0 +1,3 @@ +defmodule Obsidian.Entry do + defstruct [:type, :musicbrainz_id, :title, :year, :image_url, :genres] +end diff --git a/lib/music_library/records/parser.ex b/lib/obsidian/parser.ex similarity index 80% rename from lib/music_library/records/parser.ex rename to lib/obsidian/parser.ex index ccddec77..43b734b5 100644 --- a/lib/music_library/records/parser.ex +++ b/lib/obsidian/parser.ex @@ -1,20 +1,22 @@ -defmodule MusicLibrary.Records.Parser do - def from_entry_contents(entry_contents) do - with {:ok, [meta]} <- parse_frontmatter(entry_contents) do +defmodule Obsidian.Parser do + alias Obsidian.Entry + + def from_file_contents(file_contents) do + with {:ok, [meta]} <- parse_frontmatter(file_contents) do {:ok, - %{ + %Entry{ type: parse_subtype(meta["subType"]), musicbrainz_id: meta["id"], title: meta["title"], year: meta["year"] |> maybe_parse_year(), - image: meta["image"], + image_url: meta["image"], genres: meta["genres"] }} end end - defp parse_frontmatter(entry_contents) do - case entry_contents do + defp parse_frontmatter(file_contents) do + case file_contents do "---\n" <> rest -> case String.split(rest, "\n---\n") do [frontmatter, _] -> diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 60276624..78eaabef 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -26,14 +26,18 @@ case System.argv() do case entry |> File.read!() - |> MusicLibrary.Records.Parser.from_entry_contents() do + |> Obsidian.Parser.from_file_contents() do {:ok, parsed_entry} -> - inserted_at = file_stat.ctime + inserted_at = + file_stat.ctime |> NaiveDateTime.from_erl!() |> DateTime.from_naive!("Etc/UTC") - updated_at = file_stat.mtime + + updated_at = + file_stat.mtime |> NaiveDateTime.from_erl!() |> DateTime.from_naive!("Etc/UTC") + data = parsed_entry |> Map.put(:inserted_at, inserted_at) diff --git a/test/music_library/records/parser_test.exs b/test/obsidian/parser_test.exs similarity index 50% rename from test/music_library/records/parser_test.exs rename to test/obsidian/parser_test.exs index 9c8e1d1c..98d01f93 100644 --- a/test/music_library/records/parser_test.exs +++ b/test/obsidian/parser_test.exs @@ -1,20 +1,21 @@ -defmodule MusicLibrary.Records.ParserTest do +defmodule Obsidian.ParserTest do use ExUnit.Case, async: true - alias MusicLibrary.Records.Parser + alias Obsidian.{Entry, Parser} - @obsidian_entry_path Path.expand("../../support/fixtures/marillion-marbles.md", __DIR__) + @marbles_entry_path Path.expand("../support/fixtures/marillion-marbles.md", __DIR__) + @guardians_entry_path Path.expand("../support/fixtures/guardians.md", __DIR__) test "parses the content of the Obsidian album entry" do - entry_contents = File.read!(@obsidian_entry_path) + entry_contents = File.read!(@marbles_entry_path) - assert Parser.from_entry_contents(entry_contents) == + assert Parser.from_file_contents(entry_contents) == {:ok, - %{ + %Entry{ type: :album, musicbrainz_id: "20790e26-98e4-3ad3-a67f-b674758b942d", title: "Marbles", year: 2004, - image: + image_url: "https://coverartarchive.org/release-group/20790e26-98e4-3ad3-a67f-b674758b942d/front", genres: [ "alternative rock", @@ -29,35 +30,13 @@ defmodule MusicLibrary.Records.ParserTest do end test "handles special characters in titles" do - entry_contents = """ - --- - type: "musicRelease" - subType: "Album" - title: "Guardians of the Galaxy: Awesome Mix, Vol. 1" - englishTitle: "Guardians of the Galaxy: Awesome Mix, Vol. 1" - year: "2014" - dataSource: "MusicBrainz API" - url: "https://musicbrainz.org/release-group/950092d6-45f6-4269-87da-99a9ff2fcc52" - id: "950092d6-45f6-4269-87da-99a9ff2fcc52" - genres: - - "classic rock" - - "pop" - - "pop rock" - - "rock" - artists: - - "Various Artists" - image: "https://coverartarchive.org/release-group/950092d6-45f6-4269-87da-99a9ff2fcc52/front" - rating: 9.6 - personalRating: 0 - tags: "mediaDB/music/Album" - --- - """ + entry_contents = File.read!(@guardians_entry_path) - assert Parser.from_entry_contents(entry_contents) == + assert Parser.from_file_contents(entry_contents) == {:ok, - %{ + %Entry{ genres: ["classic rock", "pop", "pop rock", "rock"], - image: + image_url: "https://coverartarchive.org/release-group/950092d6-45f6-4269-87da-99a9ff2fcc52/front", musicbrainz_id: "950092d6-45f6-4269-87da-99a9ff2fcc52", title: "Guardians of the Galaxy: Awesome Mix, Vol. 1", diff --git a/test/support/fixtures/guardians.md b/test/support/fixtures/guardians.md new file mode 100644 index 00000000..11b1857d --- /dev/null +++ b/test/support/fixtures/guardians.md @@ -0,0 +1,21 @@ +--- +type: "musicRelease" +subType: "Album" +title: "Guardians of the Galaxy: Awesome Mix, Vol. 1" +englishTitle: "Guardians of the Galaxy: Awesome Mix, Vol. 1" +year: "2014" +dataSource: "MusicBrainz API" +url: "https://musicbrainz.org/release-group/950092d6-45f6-4269-87da-99a9ff2fcc52" +id: "950092d6-45f6-4269-87da-99a9ff2fcc52" +genres: + - "classic rock" + - "pop" + - "pop rock" + - "rock" +artists: + - "Various Artists" +image: "https://coverartarchive.org/release-group/950092d6-45f6-4269-87da-99a9ff2fcc52/front" +rating: 9.6 +personalRating: 0 +tags: "mediaDB/music/Album" +---