-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)).