Packages

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

Current section

Files

Jump to
rockbox src rockbox@playback.erl
Raw

src/rockbox@playback.erl

-module(rockbox@playback).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rockbox/playback.gleam").
-export([raw_status/1, status/1, current_track/1, next_track/1, file_position/1, play/3, pause/1, resume/1, next/1, previous/1, seek/2, stop/1, flush_and_reload/1, play_track/2, play_options/0, with_shuffle/2, with_position/2, play_album/3, play_artist/3, play_playlist/3, play_directory/4, play_liked_tracks/2, play_all_tracks/2]).
-export_type([play_options/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(
" Transport controls and \"play this thing\" shortcuts.\n"
"\n"
" ```gleam\n"
" import rockbox\n"
" import rockbox/playback\n"
"\n"
" let client = rockbox.connect(rockbox.new())\n"
"\n"
" let _ = playback.play_track(client, \"/Music/Miles Davis/Kind of Blue/01.flac\")\n"
" let _ = playback.pause(client)\n"
" let _ = playback.next(client)\n"
" ```\n"
).
-opaque play_options() :: {play_options,
gleam@option:option(boolean()),
gleam@option:option(integer())}.
-file("src/rockbox/playback.gleam", 37).
?DOC(" Raw numeric playback status as the firmware reports it.\n").
-spec raw_status(rockbox:client()) -> {ok, integer()} |
{error, rockbox@error:error()}.
raw_status(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"status"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_int/1},
fun(Status) -> gleam@dynamic@decode:success(Status) end
)
end,
rockbox:'query'(
Client,
<<"query PlaybackStatus { status }"/utf8>>,
gleam@json:object([]),
Decoder
).
-file("src/rockbox/playback.gleam", 46).
?DOC(" Typed playback status (`Stopped`, `Playing`, `Paused`, …).\n").
-spec status(rockbox:client()) -> {ok, rockbox@types:playback_status()} |
{error, rockbox@error:error()}.
status(Client) ->
case raw_status(Client) of
{ok, Value} ->
{ok, rockbox@types:playback_status_from_int(Value)};
{error, Err} ->
{error, Err}
end.
-file("src/rockbox/playback.gleam", 55).
?DOC(
" The track currently loaded for playback (may not be playing). Returns\n"
" `Ok(None)` if no track is queued.\n"
).
-spec current_track(rockbox:client()) -> {ok,
gleam@option:option(rockbox@types:track())} |
{error, rockbox@error:error()}.
current_track(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"currentTrack"/utf8>>,
gleam@dynamic@decode:optional(rockbox@types:track_decoder()),
fun(Track) -> gleam@dynamic@decode:success(Track) end
)
end,
Q = <<"
fragment TrackFields on Track {
id title artist album genre disc trackString yearString
composer comment albumArtist grouping
discnum tracknum layer year bitrate frequency
filesize length elapsed path
albumId artistId genreId albumArt
}
"/utf8,
"
query CurrentTrack { currentTrack { ...TrackFields } }
"/utf8>>,
rockbox:'query'(Client, Q, gleam@json:object([]), Decoder).
-file("src/rockbox/playback.gleam", 71).
?DOC(
" The track that will play after the current one finishes. `Ok(None)` if the\n"
" queue ends with the current track.\n"
).
-spec next_track(rockbox:client()) -> {ok,
gleam@option:option(rockbox@types:track())} |
{error, rockbox@error:error()}.
next_track(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"nextTrack"/utf8>>,
gleam@dynamic@decode:optional(rockbox@types:track_decoder()),
fun(Track) -> gleam@dynamic@decode:success(Track) end
)
end,
Q = <<"
fragment TrackFields on Track {
id title artist album genre disc trackString yearString
composer comment albumArtist grouping
discnum tracknum layer year bitrate frequency
filesize length elapsed path
albumId artistId genreId albumArt
}
"/utf8,
"
query NextTrack { nextTrack { ...TrackFields } }
"/utf8>>,
rockbox:'query'(Client, Q, gleam@json:object([]), Decoder).
-file("src/rockbox/playback.gleam", 86).
?DOC(" Position of the audio file the codec is currently reading from, in bytes.\n").
-spec file_position(rockbox:client()) -> {ok, integer()} |
{error, rockbox@error:error()}.
file_position(Client) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"getFilePosition"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_int/1},
fun(Pos) -> gleam@dynamic@decode:success(Pos) end
)
end,
rockbox:'query'(
Client,
<<"query FilePosition { getFilePosition }"/utf8>>,
gleam@json:object([]),
Decoder
).
-file("src/rockbox/playback.gleam", 105).
?DOC(
" Start playback at `elapsed` ms with the codec offset set to `offset` bytes.\n"
" Pass `0, 0` to start from the beginning.\n"
).
-spec play(rockbox:client(), integer(), integer()) -> {ok, nil} |
{error, rockbox@error:error()}.
play(Client, Elapsed, Offset) ->
rockbox:execute(
Client,
<<"mutation Play($elapsed: Long!, $offset: Long!) { play(elapsed: $elapsed, offset: $offset) }"/utf8>>,
gleam@json:object(
[{<<"elapsed"/utf8>>, gleam@json:int(Elapsed)},
{<<"offset"/utf8>>, gleam@json:int(Offset)}]
)
).
-file("src/rockbox/playback.gleam", 117).
?DOC(" Pause playback.\n").
-spec pause(rockbox:client()) -> {ok, nil} | {error, rockbox@error:error()}.
pause(Client) ->
rockbox:execute(
Client,
<<"mutation Pause { pause }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 122).
?DOC(" Resume playback after a pause.\n").
-spec resume(rockbox:client()) -> {ok, nil} | {error, rockbox@error:error()}.
resume(Client) ->
rockbox:execute(
Client,
<<"mutation Resume { resume }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 127).
?DOC(" Skip to the next track in the queue.\n").
-spec next(rockbox:client()) -> {ok, nil} | {error, rockbox@error:error()}.
next(Client) ->
rockbox:execute(
Client,
<<"mutation Next { next }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 132).
?DOC(" Go back to the previous track.\n").
-spec previous(rockbox:client()) -> {ok, nil} | {error, rockbox@error:error()}.
previous(Client) ->
rockbox:execute(
Client,
<<"mutation Previous { previous }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 137).
?DOC(" Seek the current track to an absolute position in milliseconds.\n").
-spec seek(rockbox:client(), integer()) -> {ok, nil} |
{error, rockbox@error:error()}.
seek(Client, Position_ms) ->
rockbox:execute(
Client,
<<"mutation Seek($newTime: Int!) { fastForwardRewind(newTime: $newTime) }"/utf8>>,
gleam@json:object([{<<"newTime"/utf8>>, gleam@json:int(Position_ms)}])
).
-file("src/rockbox/playback.gleam", 146).
?DOC(" Stop playback and tear down the audio engine.\n").
-spec stop(rockbox:client()) -> {ok, nil} | {error, rockbox@error:error()}.
stop(Client) ->
rockbox:execute(
Client,
<<"mutation Stop { hardStop }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 151).
?DOC(" Flush the codec buffer and reload the queue from disk.\n").
-spec flush_and_reload(rockbox:client()) -> {ok, nil} |
{error, rockbox@error:error()}.
flush_and_reload(Client) ->
rockbox:execute(
Client,
<<"mutation FlushReload { flushAndReloadTracks }"/utf8>>,
gleam@json:object([])
).
-file("src/rockbox/playback.gleam", 164).
?DOC(" Play a single file by absolute path.\n").
-spec play_track(rockbox:client(), binary()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_track(Client, Path) ->
rockbox:execute(
Client,
<<"mutation PlayTrack($path: String!) { playTrack(path: $path) }"/utf8>>,
gleam@json:object([{<<"path"/utf8>>, gleam@json:string(Path)}])
).
-file("src/rockbox/playback.gleam", 189).
?DOC(" Default play options — no shuffle, append at the end.\n").
-spec play_options() -> play_options().
play_options() ->
{play_options, none, none}.
-file("src/rockbox/playback.gleam", 194).
?DOC(" Toggle shuffle for the resulting queue.\n").
-spec with_shuffle(play_options(), boolean()) -> play_options().
with_shuffle(Opts, Value) ->
{play_options, {some, Value}, erlang:element(3, Opts)}.
-file("src/rockbox/playback.gleam", 199).
?DOC(" Set the queue position to start playback at.\n").
-spec with_position(play_options(), integer()) -> play_options().
with_position(Opts, Value) ->
{play_options, erlang:element(2, Opts), {some, Value}}.
-file("src/rockbox/playback.gleam", 203).
-spec play_options_pairs(play_options()) -> list({binary(),
gleam@option:option(gleam@json:json())}).
play_options_pairs(Opts) ->
[{<<"shuffle"/utf8>>,
gleam@option:map(erlang:element(2, Opts), fun gleam@json:bool/1)},
{<<"position"/utf8>>,
gleam@option:map(erlang:element(3, Opts), fun gleam@json:int/1)}].
-file("src/rockbox/playback.gleam", 213).
?DOC(" Replace the queue with every track on an album and start playing.\n").
-spec play_album(rockbox:client(), binary(), play_options()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_album(Client, Album_id, Options) ->
Vars = rockbox@internal@transport:variables(
[{<<"albumId"/utf8>>, {some, gleam@json:string(Album_id)}} |
play_options_pairs(Options)]
),
rockbox:execute(
Client,
<<"mutation PlayAlbum($albumId: String!, $shuffle: Boolean, $position: Int) {
playAlbum(albumId: $albumId, shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).
-file("src/rockbox/playback.gleam", 233).
?DOC(" Replace the queue with every track an artist has and start playing.\n").
-spec play_artist(rockbox:client(), binary(), play_options()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_artist(Client, Artist_id, Options) ->
Vars = rockbox@internal@transport:variables(
[{<<"artistId"/utf8>>, {some, gleam@json:string(Artist_id)}} |
play_options_pairs(Options)]
),
rockbox:execute(
Client,
<<"mutation PlayArtist($artistId: String!, $shuffle: Boolean, $position: Int) {
playArtistTracks(artistId: $artistId, shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).
-file("src/rockbox/playback.gleam", 253).
?DOC(" Play a saved playlist by ID.\n").
-spec play_playlist(rockbox:client(), binary(), play_options()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_playlist(Client, Playlist_id, Options) ->
Vars = rockbox@internal@transport:variables(
[{<<"playlistId"/utf8>>, {some, gleam@json:string(Playlist_id)}} |
play_options_pairs(Options)]
),
rockbox:execute(
Client,
<<"mutation PlayPlaylist($playlistId: String!, $shuffle: Boolean, $position: Int) {
playPlaylist(playlistId: $playlistId, shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).
-file("src/rockbox/playback.gleam", 273).
?DOC(" Queue and play every audio file in a directory.\n").
-spec play_directory(rockbox:client(), binary(), boolean(), play_options()) -> {ok,
nil} |
{error, rockbox@error:error()}.
play_directory(Client, Path, Recurse, Options) ->
Vars = rockbox@internal@transport:variables(
[{<<"path"/utf8>>, {some, gleam@json:string(Path)}},
{<<"recurse"/utf8>>, {some, gleam@json:bool(Recurse)}} |
play_options_pairs(Options)]
),
rockbox:execute(
Client,
<<"mutation PlayDirectory($path: String!, $recurse: Boolean, $shuffle: Boolean, $position: Int) {
playDirectory(path: $path, recurse: $recurse, shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).
-file("src/rockbox/playback.gleam", 295).
?DOC(" Play every liked track.\n").
-spec play_liked_tracks(rockbox:client(), play_options()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_liked_tracks(Client, Options) ->
Vars = rockbox@internal@transport:variables(play_options_pairs(Options)),
rockbox:execute(
Client,
<<"mutation PlayLikedTracks($shuffle: Boolean, $position: Int) {
playLikedTracks(shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).
-file("src/rockbox/playback.gleam", 310).
?DOC(" Play the entire library.\n").
-spec play_all_tracks(rockbox:client(), play_options()) -> {ok, nil} |
{error, rockbox@error:error()}.
play_all_tracks(Client, Options) ->
Vars = rockbox@internal@transport:variables(play_options_pairs(Options)),
rockbox:execute(
Client,
<<"mutation PlayAllTracks($shuffle: Boolean, $position: Int) {
playAllTracks(shuffle: $shuffle, position: $position)
}"/utf8>>,
Vars
).