Index: channels/radiotray.py ================================================================== --- channels/radiotray.py +++ channels/radiotray.py @@ -1,9 +1,9 @@ # api: dbus # title: RadioTray hook -# description: Allows to bookmark stations to RadioTray -# version: 0.4 +# description: Allows to bookmark stations to RadioTray/NG +# version: 0.5 # type: feature # category: bookmarks # depends: deb:python-dbus, deb:streamtuner2, deb:python-xdg # config: # { name: radiotray_map, type: select, value: "group", select: 'root|group|asis|play', description: 'Map genres to default RadioTray groups, or just "root".' } @@ -33,11 +33,12 @@ from config import * from channels import * from uikit import uikit import re import dbus -from xdg.BaseDirectory import xdg_data_home +import json +from xdg.BaseDirectory import xdg_data_home, xdg_config_home from xml.etree import ElementTree # not a channel plugin, just a category in bookmarks, and a context menu class radiotray (object): @@ -48,10 +49,11 @@ # bookmarks cat parent = None bm = None # radiotray config file / bookmarks rt_xml = "%s/%s/%s" % (xdg_data_home, "radiotray", "bookmarks.xml") + rtng_json = "%s/%s/%s" % (xdg_config_home, "radiotray-ng", "bookmarks.json") # DBUS connector def radiotray(self): return dbus.Interface( @@ -59,10 +61,18 @@ "net.sourceforge.radiotray", "/net/sourceforge/radiotray" ), "net.sourceforge.radiotray" ) + def radiotray_ng(self): + return dbus.Interface( + dbus.SessionBus().get_object( + "com.github.radiotray_ng", + "/com/github/radiotray_ng" + ), + "com.github.radiotray_ng" + ) # hook up to main tab def __init__(self, parent): @@ -75,16 +85,29 @@ self.bm.add_category("radiotray", plugin=self); self.bm.category_plugins["radiotray"] = self #.update_streams(cat="radiotray") self.bm.reload_if_current(self.module) # add context menu - uikit.add_menu([parent.streammenu, parent.streamactions], "Keep in RadioTray", self.share, insert=4) + uikit.add_menu([parent.streammenu, parent.streamactions], "Add in RadioTray/NG", self.share, insert=4) # load RadioTray bookmarks def update_streams(self, cat): r = [] + # RT-NG + try: + for group in json.load(open(self.rtng_json, "r")): + genre = group["group"] + for ls in group["stations"]: + r.append({ + "genre": genre, + "title": ls["name"], + "url": ls["url"] + }) + except Exception as e: + log.ERR("Extracting from radiotray-ng bookmarks.json failed:", e) + # RT XML try: for group in ElementTree.parse(self.rt_xml).findall(".//group"): for bookmark in group.findall("bookmark"): r.append({ "genre": group.attrib["name"], @@ -91,25 +114,30 @@ "title": bookmark.attrib["name"], "url": bookmark.attrib["url"], "playing": "", }) except Exception as e: - log.DATA("Extracting from radiotray bookmarks.xml failed:", e) + log.ERR("Extracting from radiotray bookmarks.xml failed:", e) return r # send to def share(self, *w): row = self.parent.row() if row: - # RadioTray doesn't have an addRadio method yet, so just fall back to play the stream URL + group = self.map_group(row.get("genre")) + log.PROC("mapping genre '%s' to RT group '%s'" % (row["genre"], group)) + # Radiotray-NG try: - group = self.map_group(row.get("genre")) - log.PROC("mapping genre '%s' to RT group '%s'" % (row["genre"], group)) - self.radiotray().addRadio(row["title"], row["url"], group) + self.radiotray_ng().add_radio(row["title"], row["url"], group) except: - self.radiotray().playUrl(row["url"]) + log.ERR("rtng dbus inactive") + # RadioTray doesn't have an addRadio method yet, so just fall back to play the stream URL + try: + self.radiotray().addRadio(row["title"], row["url"], group) + except: + self.radiotray().playUrl(row["url"]) pass # match genre to RT groups def map_group(self, genre): if not genre or not len(genre) or conf.radiotray_map == "root": @@ -118,20 +146,21 @@ return genre # if RadioTray itself can map arbitrary genres to its folders if conf.radiotray_map == "play": raise NotImplementedError("just call .playUrl()") map = { "Jazz": "jazz|fusion|swing", - "Pop / Rock": "top|pop|rock|metal", "Latin": "latin|flamenco|tango|salsa|samba", + "Classic Rock": "classic rock", "Classical": "classic|baroque|opera|symphony|piano|violin", + "Pop / Rock": "top|pop|rock|metal", "Oldies": "20s|50s|60s|70s|oldie", "Chill": "chill|easy|listening", - "Techno / Electronic": "techno|electro|dance|house|beat|dubstep|progressive|trance", "Country": "country|bluegrass|western", + "Techno / Electronic": "techno|electro|dance|house|beat|dubstep|progressive|trance", "Community": "community|talk|sports|spoken|educational", } #for str in (genre,title): for cat,rx in map.items(): if re.search(rx, genre, re.I): return cat return "root"