From 26590ed1e4f4a5005d93f74e05ffde73d4525fc3 Mon Sep 17 00:00:00 2001 From: "E. A. Graham Jr." <10370165+EAGrahamJr@users.noreply.github.com> Date: Sat, 15 Jun 2024 10:58:23 -0700 Subject: [PATCH] RTFM: get spotify player correct --- src/main/kotlin/crackers/hassk/HAssKClient.kt | 45 ++++++++++++++----- version.properties | 6 +-- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/crackers/hassk/HAssKClient.kt b/src/main/kotlin/crackers/hassk/HAssKClient.kt index 80fdcec..15f7a3e 100644 --- a/src/main/kotlin/crackers/hassk/HAssKClient.kt +++ b/src/main/kotlin/crackers/hassk/HAssKClient.kt @@ -18,6 +18,7 @@ package crackers.hassk import org.json.JSONArray import org.json.JSONObject +import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.IOException import java.net.URI @@ -49,6 +50,13 @@ object Constants { const val off = false } +/** + * Media things + */ +object MediaConstants { + const val SPOTIFY = "Spotify" +} + /** * A very simple [HomeAssistant](https://www.home-assistant.io/) REST API client with minimal functionality. * @@ -60,12 +68,12 @@ object Constants { * @param haPort the port (default sto `8123` * @property serverUri the location for the API on HA */ -open class HAssKClient(val token: String, haServer: String, haPort: Int = 8123) { - val serverUri = "http://$haServer:$haPort/api" - protected val client = HttpClient.newBuilder() +open class HAssKClient(private val token: String, haServer: String, haPort: Int = 8123) { + protected val serverUri = "http://$haServer:$haPort/api" + protected val client: HttpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .build() - protected val logger = LoggerFactory.getLogger(javaClass.simpleName) + protected val logger: Logger = LoggerFactory.getLogger(javaClass.simpleName) /** * Set up generic service call that uses the entity ID as the payload. @@ -220,8 +228,13 @@ open class HAssKClient(val token: String, haServer: String, haPort: Int = 8123) /** * Create an entity in the "media_player" domain ( do **not** prefix with "media_player.") + * + * Specialized players are also initialized here (e.g. Spotify) */ - fun media(name: String) = MediaPlayer(name) + fun media(name: String) = when { + name.equals(MediaConstants.SPOTIFY, true) -> SpotifyPlayer(name) + else -> MediaPlayer(name) + } /** * Create an entity in the "sensor" domain (do **not** prefix with "sensor.") @@ -287,11 +300,15 @@ open class HAssKClient(val token: String, haServer: String, haPort: Int = 8123) override val entityId = "$domain.$name" } - class MediaPlayer(val name: String) : Entity { - override val domain = "media_player" + open class MediaPlayer(name: String) : Entity { + final override val domain = "media_player" override val entityId = "$domain.$name" } + class SpotifyPlayer(name: String) : MediaPlayer(name) { + var currentPlayer: String = "None" + } + fun MediaPlayer.pause(): List { val response = callService(entityId, domain, "media_pause") return JSONArray(response).map { parseState(it as JSONObject) } @@ -302,6 +319,15 @@ open class HAssKClient(val token: String, haServer: String, haPort: Int = 8123) return JSONArray(response).map { parseState(it as JSONObject) } } + fun SpotifyPlayer.play(player: String? = null): List { + if (player != null) currentPlayer = player + if (currentPlayer == "None") throw IllegalStateException("Current player must be set before invoking play") + + callService(entityId, domain, "select_source", mapOf("source" to currentPlayer)) + val response = callService(entityId, domain, "media_play") + return JSONArray(response).map { parseState(it as JSONObject) } + } + fun MediaPlayer.stop(): List { val response = callService(entityId, domain, "media_stop") return JSONArray(response).map { parseState(it as JSONObject) } @@ -329,9 +355,4 @@ open class HAssKClient(val token: String, haServer: String, haPort: Int = 8123) operator fun MediaPlayer.unaryPlus() = volumeUp() operator fun MediaPlayer.unaryMinus() = volumeDown() - - infix fun MediaPlayer.selectSource(name: String): List { - val response = callService(entityId, domain, "play_media", mapOf("source" to name)) - return JSONArray(response).map { parseState(it as JSONObject) } - } } diff --git a/version.properties b/version.properties index 0bd0478..9635223 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ #Generated by the Semver Plugin for Gradle -#Sun Dec 17 12:03:32 PST 2023 +#Tue Jun 11 16:00:29 PDT 2024 version.buildmeta= version.major=0 version.minor=0 -version.patch=4 +version.patch=5 version.prerelease= -version.semver=0.0.4 +version.semver=0.0.5