# @name RSS Reader # @desc Powiadamia o nowym tytule z kanału RSS (Headless) # @author strusic # @headless true # @version 2.4 # @config url text "Adres RSS" default="https://www.rmf24.pl/fakty/feed" # @config icon text "Ikona" default="85" # @config speed number "Prędkość scroll" default=100 min=50 max=200 step=10 # @config repeat number "Ilość powtórzeń" default=2 min=1 max=5 # @config sound text "Dźwięk" default="notification2" # @config every number "Interwał (min)" default=15 min=1 max=60 unit=min class RSSReader var url, icon_name, sound_name, period, speed, repeat var title var ticks, in_flight def init() self.url = store.get("url") self.icon_name = store.get("icon") self.sound_name = store.get("sound") self.speed = store.get("speed") self.repeat = store.get("repeat") self.period = store.get("every") * 60 self.title = store.get("title") if self.title == nil self.title = "" end self.ticks = 0 self.in_flight = false log("RSSReader zainicjalizowany dla: " + str(self.url)) end def on_body(body, status) self.in_flight = false if body == nil log("RSSReader: Błąd pobierania danych, status: " + str(status)) return end var m = re.search("(.*?)", body) if m == nil log("RSSReader: Nie znaleziono znacznika title") return end var raw_title = m[1] # Oczyszczanie z tagów CDATA, jeśli występują var cdata_m = re.search("", raw_title) if cdata_m != nil raw_title = cdata_m[1] end # Bezpieczna zamiana cudzysłowów na apostrofy znak po znaku var clean_title = "" var i = 0 while i < size(raw_title) var c = raw_title[i..i] if c == "\"" clean_title += "'" else clean_title += c end i += 1 end raw_title = clean_title if raw_title != self.title log("RSSReader: Nowy tytuł! Wyzwalam powiadomienie.") self.title = raw_title store.set("title", raw_title) var spec = { "text": self.title, "icon": self.icon_name, "repeat": self.repeat, "scroll": { "speed": self.speed, "holdMs": 1500 } } if self.sound_name != "" spec["sound"] = self.sound_name end notify(spec) else log("RSSReader: Tytuł bez zmian - czekam na kolejny cykl.") end end def loop() if self.ticks <= 0 self.ticks = self.period if !self.in_flight self.in_flight = true http.get(self.url, / b, st -> self.on_body(b, st), {'find': "", 'keep': 512}) end end self.ticks -= 1 end end return RSSReader()