# @name Last.fm # @desc Total scrobble count of a Last.fm profile # @author Hank_the_Tank / Codex # @version 1.5 # @config user text "Profile name" default="YOUR_USERNAME" maxlen=32 # @config api_key text "API key" default="YOUR_API_KEY" maxlen=64 help="Create one at last.fm/api/account/create" # @config icon text "Icon ID" default="11667" maxlen=16 help="LaMetric icon ID; leave empty for the built-in fallback" # @config every number "Refresh" default=15 min=1 max=60 unit=min # @config tint color "Colour" default=#D51007 # @config speed slider "Gradient speed" default=40 min=0 max=100 unit=% class LastFM var url,user,key,ic,tint,pal,gspeed,period var count,label,full,err var ticks,busy def init() self.user=store.get("user") self.key=store.get("api_key") self.ic=store.get("icon") self.tint=store.get("tint") self.pal=[self.tint,0xFFFFFF,self.tint] # red-white-red, built once self.gspeed=store.get("speed")/100.0 # 0..1 passes per second self.url="https://ws.audioscrobbler.com/2.0/?method=user.getinfo&user="+ self.user+"&api_key="+self.key+"&format=json" self.period=store.get("every")*60 self.count=store.get("who")==self.user ? store.get("n") : nil self.label=self.count==nil ? nil : self.human(self.count) self.full=self.count==nil ? nil : str(self.count) self.err=self.key=="YOUR_API_KEY" || self.key=="" self.ticks=self.err ? self.period : 15 self.busy=false end def human(n) if n<1000 return str(n) end var d=1000 var suf="K" if n>=1000000000 d=1000000000 suf="B" elif n>=1000000 d=1000000 suf="M" end var v=n/(d+0.0) if v>=10 return str(round(v))+suf end var t=round(v*10) return str(int(t/10))+"."+str(t%10)+suf end def on_body(body,status) self.busy=false if status!=200 || body==nil self.err=true return end var m=re.search("(\\d+)",body) if m==nil self.err=true return end var n=num(m[1]) if n==nil return end self.err=false if n==self.count return end self.count=n self.full=str(n) self.label=self.human(n) store.set("n",n) store.set("who",self.user) end def loop() if self.ticks<=0 if !self.busy self.ticks=self.period self.busy=true http.get(self.url,/ b,st -> self.on_body(b,st), {'find':"\"playcount\":",'keep':32}) end end self.ticks-=1 end def draw() clear() if self.ic=="" || !icon(self.ic,0,0) text(1,6,"L",0xD51007) end if self.label!=nil var avail=width()-9 var s=self.full var w=text_ink_width(s) if w>avail s=self.label w=text_ink_width(s) end ramp_text(9+(avail-w)/2,6,s,self.pal,0,self.gspeed) return end var s=self.err ? "?" : "..." var w=text_ink_width(s) text(9+(width()-9-w)/2,6,s,self.err ? 0xCC7722 : 0x555555) end end return LastFM()