Packages

Gleam SDK for Rockbox Zig — pipe-friendly client for the rockboxd GraphQL API

Current section

Files

Jump to
rockbox src rockbox@saved_playlists.erl
Raw

src/rockbox@saved_playlists.erl

-module(rockbox@saved_playlists).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rockbox/saved_playlists.gleam").
-export([new/1, with_description/2, with_image/2, with_folder/2, with_tracks/2, update/1, update_description/2, update_image/2, update_folder/2, list/2, get/2, track_ids/2, create/2, save/3, delete/2, add_tracks/3, remove_track/3, play/2, folders/1, create_folder/2, delete_folder/2]).
-export_type([create_input/0, update_input/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(
" Persisted playlists and their folders.\n"
"\n"
" Builders make optional fields ergonomic:\n"
"\n"
" ```gleam\n"
" let input =\n"
" saved_playlists.new(\"Workout Mix\")\n"
" |> saved_playlists.with_description(\"Tracks I run to\")\n"
" |> saved_playlists.with_tracks([\"track-id-1\", \"track-id-2\"])\n"
"\n"
" let assert Ok(playlist) = saved_playlists.create(client, input)\n"
" ```\n"
).
-opaque create_input() :: {create_input,
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(list(binary()))}.
-opaque update_input() :: {update_input,
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(binary())}.
-file("src/rockbox/saved_playlists.gleam", 37).
?DOC(" Start a new create-input with just a name.\n").
-spec new(binary()) -> create_input().
new(Name) ->
{create_input, Name, none, none, none, none}.
-file("src/rockbox/saved_playlists.gleam", 47).
-spec with_description(create_input(), binary()) -> create_input().
with_description(Input, Value) ->
{create_input,
erlang:element(2, Input),
{some, Value},
erlang:element(4, Input),
erlang:element(5, Input),
erlang:element(6, Input)}.
-file("src/rockbox/saved_playlists.gleam", 51).
-spec with_image(create_input(), binary()) -> create_input().
with_image(Input, Value) ->
{create_input,
erlang:element(2, Input),
erlang:element(3, Input),
{some, Value},
erlang:element(5, Input),
erlang:element(6, Input)}.
-file("src/rockbox/saved_playlists.gleam", 55).
-spec with_folder(create_input(), binary()) -> create_input().
with_folder(Input, Folder_id) ->
{create_input,
erlang:element(2, Input),
erlang:element(3, Input),
erlang:element(4, Input),
{some, Folder_id},
erlang:element(6, Input)}.
-file("src/rockbox/saved_playlists.gleam", 59).
-spec with_tracks(create_input(), list(binary())) -> create_input().
with_tracks(Input, Track_ids) ->
{create_input,
erlang:element(2, Input),
erlang:element(3, Input),
erlang:element(4, Input),
erlang:element(5, Input),
{some, Track_ids}}.
-file("src/rockbox/saved_playlists.gleam", 78).
?DOC(
" Build an update payload — `name` is required by the GraphQL schema even\n"
" when only changing other fields, so it lives in the constructor.\n"
).
-spec update(binary()) -> update_input().
update(Name) ->
{update_input, Name, none, none, none}.
-file("src/rockbox/saved_playlists.gleam", 82).
-spec update_description(update_input(), binary()) -> update_input().
update_description(Input, Value) ->
{update_input,
erlang:element(2, Input),
{some, Value},
erlang:element(4, Input),
erlang:element(5, Input)}.
-file("src/rockbox/saved_playlists.gleam", 86).
-spec update_image(update_input(), binary()) -> update_input().
update_image(Input, Value) ->
{update_input,
erlang:element(2, Input),
erlang:element(3, Input),
{some, Value},
erlang:element(5, Input)}.
-file("src/rockbox/saved_playlists.gleam", 90).
-spec update_folder(update_input(), binary()) -> update_input().
update_folder(Input, Folder_id) ->
{update_input,
erlang:element(2, Input),
erlang:element(3, Input),
erlang:element(4, Input),
{some, Folder_id}}.
-file("src/rockbox/saved_playlists.gleam", 99).
?DOC(" List all saved playlists, optionally scoped to a single folder.\n").
-spec list(rockbox:client(), gleam@option:option(binary())) -> {ok,
list(rockbox@types:saved_playlist())} |
{error, rockbox@error:error()}.
list(Client, Folder_id) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"savedPlaylists"/utf8>>,
gleam@dynamic@decode:list(rockbox@types:saved_playlist_decoder()),
fun(Playlists) -> gleam@dynamic@decode:success(Playlists) end
)
end,
Vars = rockbox@internal@transport:variables(
[{<<"folderId"/utf8>>,
gleam@option:map(Folder_id, fun gleam@json:string/1)}]
),
rockbox:'query'(
Client,
<<"query SavedPlaylists($folderId: String) {
savedPlaylists(folderId: $folderId) {
id name description image folderId trackCount createdAt updatedAt
}
}"/utf8>>,
Vars,
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 124).
-spec get(rockbox:client(), binary()) -> {ok,
gleam@option:option(rockbox@types:saved_playlist())} |
{error, rockbox@error:error()}.
get(Client, Id) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"savedPlaylist"/utf8>>,
gleam@dynamic@decode:optional(
rockbox@types:saved_playlist_decoder()
),
fun(Playlist) -> gleam@dynamic@decode:success(Playlist) end
)
end,
rockbox:'query'(
Client,
<<"query SavedPlaylist($id: String!) {
savedPlaylist(id: $id) {
id name description image folderId trackCount createdAt updatedAt
}
}"/utf8>>,
gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}]),
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 147).
-spec track_ids(rockbox:client(), binary()) -> {ok, list(binary())} |
{error, rockbox@error:error()}.
track_ids(Client, Playlist_id) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"savedPlaylistTrackIds"/utf8>>,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
fun(Ids) -> gleam@dynamic@decode:success(Ids) end
)
end,
rockbox:'query'(
Client,
<<"query SavedPlaylistTrackIds($playlistId: String!) {
savedPlaylistTrackIds(playlistId: $playlistId)
}"/utf8>>,
gleam@json:object(
[{<<"playlistId"/utf8>>, gleam@json:string(Playlist_id)}]
),
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 172).
-spec create(rockbox:client(), create_input()) -> {ok,
rockbox@types:saved_playlist()} |
{error, rockbox@error:error()}.
create(Client, Input) ->
Vars = rockbox@internal@transport:variables(
[{<<"name"/utf8>>, {some, gleam@json:string(erlang:element(2, Input))}},
{<<"description"/utf8>>,
gleam@option:map(
erlang:element(3, Input),
fun gleam@json:string/1
)},
{<<"image"/utf8>>,
gleam@option:map(
erlang:element(4, Input),
fun gleam@json:string/1
)},
{<<"folderId"/utf8>>,
gleam@option:map(
erlang:element(5, Input),
fun gleam@json:string/1
)},
{<<"trackIds"/utf8>>,
gleam@option:map(
erlang:element(6, Input),
fun(Ids) ->
gleam@json:array(Ids, fun gleam@json:string/1)
end
)}]
),
Decoder = begin
gleam@dynamic@decode:field(
<<"createSavedPlaylist"/utf8>>,
rockbox@types:saved_playlist_decoder(),
fun(Playlist) -> gleam@dynamic@decode:success(Playlist) end
)
end,
rockbox:'query'(
Client,
<<"mutation CreateSavedPlaylist(
$name: String!, $description: String, $image: String,
$folderId: String, $trackIds: [String!]
) {
createSavedPlaylist(
name: $name, description: $description, image: $image,
folderId: $folderId, trackIds: $trackIds
) {
id name description image folderId trackCount createdAt updatedAt
}
}"/utf8>>,
Vars,
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 212).
-spec save(rockbox:client(), binary(), update_input()) -> {ok, nil} |
{error, rockbox@error:error()}.
save(Client, Id, Input) ->
Vars = rockbox@internal@transport:variables(
[{<<"id"/utf8>>, {some, gleam@json:string(Id)}},
{<<"name"/utf8>>,
{some, gleam@json:string(erlang:element(2, Input))}},
{<<"description"/utf8>>,
gleam@option:map(
erlang:element(3, Input),
fun gleam@json:string/1
)},
{<<"image"/utf8>>,
gleam@option:map(
erlang:element(4, Input),
fun gleam@json:string/1
)},
{<<"folderId"/utf8>>,
gleam@option:map(
erlang:element(5, Input),
fun gleam@json:string/1
)}]
),
rockbox:execute(
Client,
<<"mutation UpdateSavedPlaylist(
$id: String!, $name: String!, $description: String, $image: String, $folderId: String
) {
updateSavedPlaylist(
id: $id, name: $name, description: $description, image: $image, folderId: $folderId
)
}"/utf8>>,
Vars
).
-file("src/rockbox/saved_playlists.gleam", 238).
-spec delete(rockbox:client(), binary()) -> {ok, nil} |
{error, rockbox@error:error()}.
delete(Client, Id) ->
rockbox:execute(
Client,
<<"mutation DeleteSavedPlaylist($id: String!) { deleteSavedPlaylist(id: $id) }"/utf8>>,
gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}])
).
-file("src/rockbox/saved_playlists.gleam", 246).
-spec add_tracks(rockbox:client(), binary(), list(binary())) -> {ok, nil} |
{error, rockbox@error:error()}.
add_tracks(Client, Playlist_id, Track_ids) ->
rockbox:execute(
Client,
<<"mutation AddTracksToSavedPlaylist($playlistId: String!, $trackIds: [String!]!) {
addTracksToSavedPlaylist(playlistId: $playlistId, trackIds: $trackIds)
}"/utf8>>,
gleam@json:object(
[{<<"playlistId"/utf8>>, gleam@json:string(Playlist_id)},
{<<"trackIds"/utf8>>,
gleam@json:array(Track_ids, fun gleam@json:string/1)}]
)
).
-file("src/rockbox/saved_playlists.gleam", 263).
-spec remove_track(rockbox:client(), binary(), binary()) -> {ok, nil} |
{error, rockbox@error:error()}.
remove_track(Client, Playlist_id, Track_id) ->
rockbox:execute(
Client,
<<"mutation RemoveTrackFromSavedPlaylist($playlistId: String!, $trackId: String!) {
removeTrackFromSavedPlaylist(playlistId: $playlistId, trackId: $trackId)
}"/utf8>>,
gleam@json:object(
[{<<"playlistId"/utf8>>, gleam@json:string(Playlist_id)},
{<<"trackId"/utf8>>, gleam@json:string(Track_id)}]
)
).
-file("src/rockbox/saved_playlists.gleam", 280).
-spec play(rockbox:client(), binary()) -> {ok, nil} |
{error, rockbox@error:error()}.
play(Client, Playlist_id) ->
rockbox:execute(
Client,
<<"mutation PlaySavedPlaylist($playlistId: String!) { playSavedPlaylist(playlistId: $playlistId) }"/utf8>>,
gleam@json:object(
[{<<"playlistId"/utf8>>, gleam@json:string(Playlist_id)}]
)
).
-file("src/rockbox/saved_playlists.gleam", 292).
-spec folders(rockbox:client()) -> {ok,
list(rockbox@types:saved_playlist_folder())} |
{error, rockbox@error:error()}.
folders(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"playlistFolders"/utf8>>,
gleam@dynamic@decode:list(
rockbox@types:saved_playlist_folder_decoder()
),
fun(Folders) -> gleam@dynamic@decode:success(Folders) end
)
end,
rockbox:'query'(
Client,
<<"query PlaylistFolders { playlistFolders { id name createdAt updatedAt } }"/utf8>>,
gleam@json:object([]),
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 308).
-spec create_folder(rockbox:client(), binary()) -> {ok,
rockbox@types:saved_playlist_folder()} |
{error, rockbox@error:error()}.
create_folder(Client, Name) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"createPlaylistFolder"/utf8>>,
rockbox@types:saved_playlist_folder_decoder(),
fun(Folder) -> gleam@dynamic@decode:success(Folder) end
)
end,
rockbox:'query'(
Client,
<<"mutation CreatePlaylistFolder($name: String!) {
createPlaylistFolder(name: $name) { id name createdAt updatedAt }
}"/utf8>>,
gleam@json:object([{<<"name"/utf8>>, gleam@json:string(Name)}]),
Decoder
).
-file("src/rockbox/saved_playlists.gleam", 329).
-spec delete_folder(rockbox:client(), binary()) -> {ok, nil} |
{error, rockbox@error:error()}.
delete_folder(Client, Id) ->
rockbox:execute(
Client,
<<"mutation DeletePlaylistFolder($id: String!) { deletePlaylistFolder(id: $id) }"/utf8>>,
gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}])
).