# @name Spotify # @desc Interpret - Titel via Home Assistant # @version 1.9 # @config ha_url text "HA URL" default="http://homeassistant.local:8123" # @config entity text "Entity" default="media_player.ENTITY" # @config token text "HA Token" 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()