# @name Spotify
# @desc Interpret - Titel via Home Assistant
# @version 1.9
# @config ha_url text "hxxp://192.168.200.12:8123" default="hxxp://homeassistant.local:8123"
# @config entity text "media_player.spotify_thomas" default="media_player.ENTITY"
# @config token text "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJiNzcxYmEzOWI4ZTk0NDQ3ODhhZGQ3YmZiYWI4MTkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxk" maxlen=512 help="HA profile -> Security -> create token"
# @config every number "Refresh" default=15 min=5 max=120 unit=s
# @config speed number "Scroll %" default=70 min=30 max=150 unit=%
# @config ic text "Icon ID" default="18207"
class Spotify
var url, state_opts, media_opts, scroll_opts
var label, active, ticks, in_flight, color, ic
def init()
var ha = store.get("ha_url")
var entity = store.get("entity")
self.url = ha + "/api/states/" + entity
var hdrs = {"Authorization": "Bearer " + store.get("token")}
self.state_opts = {"headers": hdrs, "find": "\"state\":", "keep": 48}
self.media_opts = {"headers": hdrs, "find": "\"media_title\"", "keep": 256}
self.scroll_opts = {
"speed": store.get("speed"),
"holdMs": 1000,
"entry": "offscreen"
}
self.ic = store.get("ic")
self.label = store.get("label")
self.active = store.get("active") == true
self.ticks = 0
self.in_flight = false
self.color = settings.get("textColor")
if self.color == nil
self.color = 0xFFFFFF
end
end
def on_state(body, status)
if body == nil
self.in_flight = false
log("Spotify: keine Antwort (status " + str(status) + ")")
return
end
var sm = re.search("\"state\"\\s*:\\s*\"([^\"]+)\"", body)
if sm == nil
self.in_flight = false
return
end
var st = sm[1]
# Entity-State: playing | paused | idle | …
if st == "playing" || st == "buffering"
http.get(self.url, / b, s -> self.on_body(b, s), self.media_opts)
return
end
self.active = false
self.label = nil
self.in_flight = false
store.set("active", false)
store.set("label", "")
end
def on_body(body, status)
self.in_flight = false
if body == nil return end
var artist = nil
var title = nil
var tm = re.search("\"media_title\"\\s*:\\s*\"([^\"]*)\"", body)
if tm != nil
title = tm[1]
end
var am = re.search("\"media_artist\"\\s*:\\s*\"([^\"]*)\"", body)
if am != nil
artist = am[1]
end
var label = nil
if artist != nil && artist != "" && title != nil && title != ""
label = artist + " - " + title
elif title != nil && title != ""
label = title
elif artist != nil && artist != ""
label = artist
end
if label == nil
self.active = false
self.label = nil
store.set("active", false)
store.set("label", "")
return
end
self.active = true
self.label = label
store.set("active", true)
store.set("label", label)
end
def loop()
if self.ticks <= 0
self.ticks = store.get("every")
if !self.in_flight
self.in_flight = true
http.get(self.url, / b, st -> self.on_state(b, st), self.state_opts)
end
end
self.ticks -= 1
end
def should_show()
return self.active && self.label != nil && self.label != ""
end
def duration()
if self.label == nil || self.label == ""
return 7000
end
var sp = store.get("speed")
if sp == nil || sp < 1
sp = 70
end
var px_s = (21 * sp) / 100
if px_s < 1
px_s = 1
end
var travel = text_width(self.label) + width()
var ms = (travel * 1000) / px_s + 1500
if ms < 10000
ms = 10000
end
if ms > 60000
ms = 60000
end
return ms
end
def draw()
clear()
var x = 0
var w = width()
if icon(self.ic, 0, 0)
x = 9
w = width() - 9
end
scroll_text(x, 6, w, self.label, self.color, self.scroll_opts)
end
def on_button(btn)
if btn == "select"
self.ticks = 0
end
end
end
return Spotify()4 views