lib/sptfy/player.ex

defmodule Sptfy.Player do
  @moduledoc """
  https://developer.spotify.com/documentation/web-api/reference-beta/#category-player
  """

  use Sptfy.Client

  alias Sptfy.Object.{CurrentlyPlaying, Device, Playback, PlayHistory, UserQueue}

  get "/v1/me/player",
    as: :get_playback,
    query: [:market, :additional_types],
    mapping: {:single, module: Playback}

  put "/v1/me/player",
    as: :transfer_playback,
    query: [],
    body: [{:device_ids, required: true}, :play],
    mapping: :ok

  get "/v1/me/player/devices",
    as: :get_devices,
    query: [],
    mapping: {:list, module: Device, key: "devices"}

  get "/v1/me/player/currently-playing",
    as: :get_currently_playing,
    query: [:market, :additional_types],
    mapping: {:single, module: CurrentlyPlaying}

  put "/v1/me/player/play",
    as: :play,
    query: [:device_id],
    body: [:context_uri, :uris, :offset, :position_ms],
    mapping: :ok

  put "/v1/me/player/pause",
    as: :pause,
    query: [:device_id],
    body: [],
    mapping: :ok

  post "/v1/me/player/next",
    as: :skip_to_next,
    query: [:device_id],
    body: [],
    mapping: :ok

  post "/v1/me/player/previous",
    as: :skip_to_prev,
    query: [:device_id],
    body: [],
    mapping: :ok

  put "/v1/me/player/seek",
    as: :seek,
    query: [{:position_ms, required: true}, :device_id],
    body: [],
    mapping: :ok

  put "/v1/me/player/repeat",
    as: :set_repeat,
    query: [{:state, required: true}, :device_id],
    body: [],
    mapping: :ok

  put "/v1/me/player/volume",
    as: :set_volume,
    query: [{:volume_percent, required: true}, :device_id],
    body: [],
    mapping: :ok

  put "/v1/me/player/shuffle",
    as: :set_shuffle,
    query: [{:state, required: true}, :device_id],
    body: [],
    mapping: :ok

  get "/v1/me/player/recently-played",
    as: :get_recently_played,
    query: [:limit, :before, :after],
    mapping: {:cursor_paging, module: PlayHistory}

  get "/v1/me/player/queue",
    as: :get_user_queue,
    query: [],
    mapping: {:single, module: UserQueue}

  post "/v1/me/player/queue",
    as: :enqueue,
    query: [{:uri, required: true}, :device_id],
    body: [],
    mapping: :ok
end