Skip to main content

src/rocksky@song.erl

-module(rocksky@song).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rocksky/song.gleam").
-export([get_song/1, get_song_by_mbid/1, get_song_by_isrc/1, get_song_by_spotify_id/1, with_mbid/2, with_isrc/2, with_spotify_id/2, get_songs/0, get_song_recent_listeners/1, match_song/2, new_song/4, song_with_duration_ms/2, song_with_mb_id/2, song_with_isrc/2, song_with_album_art/2, song_with_track_number/2, song_with_release_date/2, song_with_year/2, song_with_disc_number/2, song_with_lyrics/2, create/1]).
-export_type([new_song/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(" `app.rocksky.song.*` — fetch and create song records.\n").

-type new_song() :: {new_song,
        binary(),
        binary(),
        binary(),
        binary(),
        gleam@option:option(integer()),
        gleam@option:option(binary()),
        gleam@option:option(binary()),
        gleam@option:option(binary()),
        gleam@option:option(integer()),
        gleam@option:option(binary()),
        gleam@option:option(integer()),
        gleam@option:option(integer()),
        gleam@option:option(binary())}.

-file("src/rocksky/song.gleam", 12).
?DOC(
    " `app.rocksky.song.getSong` — fetch a song by AT-URI. Combine with\n"
    " `with_mbid`, `with_isrc`, or `with_spotify_id` instead of (or in addition\n"
    " to) the URI; the server matches on any provided field.\n"
).
-spec get_song(binary()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
get_song(Uri) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.getSong"/utf8>>,
        rocksky@decoders:song()
    ),
    rocksky:param(_pipe, <<"uri"/utf8>>, Uri).

-file("src/rocksky/song.gleam", 18).
?DOC(" Variant of `get_song` keyed by MusicBrainz ID instead of URI.\n").
-spec get_song_by_mbid(binary()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
get_song_by_mbid(Mbid) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.getSong"/utf8>>,
        rocksky@decoders:song()
    ),
    rocksky:param(_pipe, <<"mbid"/utf8>>, Mbid).

-file("src/rocksky/song.gleam", 24).
?DOC(" Variant of `get_song` keyed by ISRC.\n").
-spec get_song_by_isrc(binary()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
get_song_by_isrc(Isrc) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.getSong"/utf8>>,
        rocksky@decoders:song()
    ),
    rocksky:param(_pipe, <<"isrc"/utf8>>, Isrc).

-file("src/rocksky/song.gleam", 30).
?DOC(" Variant of `get_song` keyed by Spotify track ID.\n").
-spec get_song_by_spotify_id(binary()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
get_song_by_spotify_id(Spotify_id) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.getSong"/utf8>>,
        rocksky@decoders:song()
    ),
    rocksky:param(_pipe, <<"spotifyId"/utf8>>, Spotify_id).

-file("src/rocksky/song.gleam", 35).
-spec with_mbid(rocksky:request(IAB), binary()) -> rocksky:request(IAB).
with_mbid(Req, Mbid) ->
    rocksky:param(Req, <<"mbid"/utf8>>, Mbid).

-file("src/rocksky/song.gleam", 39).
-spec with_isrc(rocksky:request(IAE), binary()) -> rocksky:request(IAE).
with_isrc(Req, Isrc) ->
    rocksky:param(Req, <<"isrc"/utf8>>, Isrc).

-file("src/rocksky/song.gleam", 43).
-spec with_spotify_id(rocksky:request(IAH), binary()) -> rocksky:request(IAH).
with_spotify_id(Req, Id) ->
    rocksky:param(Req, <<"spotifyId"/utf8>>, Id).

-file("src/rocksky/song.gleam", 50).
?DOC(
    " `app.rocksky.song.getSongs` — paginated songs catalogue. Refine with\n"
    " `rocksky.limit`, `rocksky.offset`, `rocksky.genre`, `with_mbid`,\n"
    " `with_isrc`, `with_spotify_id`.\n"
).
-spec get_songs() -> rocksky:request(list(rocksky@generated@types:song_view_basic())).
get_songs() ->
    rocksky:'query'(
        <<"app.rocksky.song.getSongs"/utf8>>,
        rocksky@decoders:unwrap(<<"songs"/utf8>>, rocksky@decoders:song())
    ).

-file("src/rocksky/song.gleam", 58).
?DOC(" `app.rocksky.song.getSongRecentListeners` — recent listeners of a song.\n").
-spec get_song_recent_listeners(binary()) -> rocksky:request(list(rocksky@generated@types:song_recent_listener_view())).
get_song_recent_listeners(Uri) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.getSongRecentListeners"/utf8>>,
        rocksky@decoders:unwrap(
            <<"listeners"/utf8>>,
            rocksky@decoders:listener()
        )
    ),
    rocksky:param(_pipe, <<"uri"/utf8>>, Uri).

-file("src/rocksky/song.gleam", 68).
?DOC(
    " `app.rocksky.song.matchSong` — find an existing song record matching the\n"
    " given metadata.\n"
).
-spec match_song(binary(), binary()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
match_song(Title, Artist) ->
    _pipe = rocksky:'query'(
        <<"app.rocksky.song.matchSong"/utf8>>,
        rocksky@decoders:song()
    ),
    _pipe@1 = rocksky:param(_pipe, <<"title"/utf8>>, Title),
    rocksky:param(_pipe@1, <<"artist"/utf8>>, Artist).

-file("src/rocksky/song.gleam", 98).
-spec new_song(binary(), binary(), binary(), binary()) -> new_song().
new_song(Title, Artist, Album_artist, Album) ->
    {new_song,
        Title,
        Artist,
        Album_artist,
        Album,
        none,
        none,
        none,
        none,
        none,
        none,
        none,
        none,
        none}.

-file("src/rocksky/song.gleam", 121).
-spec song_with_duration_ms(new_song(), integer()) -> new_song().
song_with_duration_ms(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        {some, V},
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 125).
-spec song_with_mb_id(new_song(), binary()) -> new_song().
song_with_mb_id(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        {some, V},
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 129).
-spec song_with_isrc(new_song(), binary()) -> new_song().
song_with_isrc(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        {some, V},
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 133).
-spec song_with_album_art(new_song(), binary()) -> new_song().
song_with_album_art(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        {some, V},
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 137).
-spec song_with_track_number(new_song(), integer()) -> new_song().
song_with_track_number(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        {some, V},
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 141).
-spec song_with_release_date(new_song(), binary()) -> new_song().
song_with_release_date(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        {some, V},
        erlang:element(12, S),
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 145).
-spec song_with_year(new_song(), integer()) -> new_song().
song_with_year(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        {some, V},
        erlang:element(13, S),
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 149).
-spec song_with_disc_number(new_song(), integer()) -> new_song().
song_with_disc_number(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        {some, V},
        erlang:element(14, S)}.

-file("src/rocksky/song.gleam", 153).
-spec song_with_lyrics(new_song(), binary()) -> new_song().
song_with_lyrics(S, V) ->
    {new_song,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S),
        erlang:element(7, S),
        erlang:element(8, S),
        erlang:element(9, S),
        erlang:element(10, S),
        erlang:element(11, S),
        erlang:element(12, S),
        erlang:element(13, S),
        {some, V}}.

-file("src/rocksky/song.gleam", 183).
-spec add_opt_string(
    list({binary(), gleam@json:json()}),
    binary(),
    gleam@option:option(binary())
) -> list({binary(), gleam@json:json()}).
add_opt_string(Fields, Key, Value) ->
    case Value of
        {some, V} ->
            [{Key, gleam@json:string(V)} | Fields];

        none ->
            Fields
    end.

-file("src/rocksky/song.gleam", 194).
-spec add_opt_int(
    list({binary(), gleam@json:json()}),
    binary(),
    gleam@option:option(integer())
) -> list({binary(), gleam@json:json()}).
add_opt_int(Fields, Key, Value) ->
    case Value of
        {some, V} ->
            [{Key, gleam@json:int(V)} | Fields];

        none ->
            Fields
    end.

-file("src/rocksky/song.gleam", 163).
-spec new_song_to_json(new_song()) -> gleam@json:json().
new_song_to_json(S) ->
    gleam@json:object(
        begin
            _pipe = [{<<"title"/utf8>>, gleam@json:string(erlang:element(2, S))},
                {<<"artist"/utf8>>, gleam@json:string(erlang:element(3, S))},
                {<<"albumArtist"/utf8>>,
                    gleam@json:string(erlang:element(4, S))},
                {<<"album"/utf8>>, gleam@json:string(erlang:element(5, S))}],
            _pipe@1 = add_opt_int(
                _pipe,
                <<"duration"/utf8>>,
                erlang:element(6, S)
            ),
            _pipe@2 = add_opt_string(
                _pipe@1,
                <<"mbId"/utf8>>,
                erlang:element(7, S)
            ),
            _pipe@3 = add_opt_string(
                _pipe@2,
                <<"isrc"/utf8>>,
                erlang:element(8, S)
            ),
            _pipe@4 = add_opt_string(
                _pipe@3,
                <<"albumArt"/utf8>>,
                erlang:element(9, S)
            ),
            _pipe@5 = add_opt_int(
                _pipe@4,
                <<"trackNumber"/utf8>>,
                erlang:element(10, S)
            ),
            _pipe@6 = add_opt_string(
                _pipe@5,
                <<"releaseDate"/utf8>>,
                erlang:element(11, S)
            ),
            _pipe@7 = add_opt_int(
                _pipe@6,
                <<"year"/utf8>>,
                erlang:element(12, S)
            ),
            _pipe@8 = add_opt_int(
                _pipe@7,
                <<"discNumber"/utf8>>,
                erlang:element(13, S)
            ),
            add_opt_string(_pipe@8, <<"lyrics"/utf8>>, erlang:element(14, S))
        end
    ).

-file("src/rocksky/song.gleam", 158).
?DOC(" Convert a `NewSong` into a `Request(Song)` ready for `rocksky.send`.\n").
-spec create(new_song()) -> rocksky:request(rocksky@generated@types:song_view_basic()).
create(S) ->
    _pipe = rocksky:procedure(
        <<"app.rocksky.song.createSong"/utf8>>,
        rocksky@decoders:song()
    ),
    rocksky:body(_pipe, new_song_to_json(S)).