Index: channels/bookmarks.py ================================================================== --- channels/bookmarks.py +++ channels/bookmarks.py @@ -50,10 +50,11 @@ "history": [] } default = "favourite" fixed_size = [32,24] reserved_names = ["favourite", "radiotray", "scripts", "search", "timer", "history", "links", "themes"] #+ self.parent.features.keys() + category_plugins = {} # cache list, to determine if a PLS url is bookmarked urls = [] @@ -69,11 +70,10 @@ if len(self.categories) < 2 or type(self.categories[1]) is not list: self.categories.insert(1, []) self.categories[1] = cust_cats # but category sub-plugins might provide a hook - category_plugins = {} def update_streams(self, cat): if cat in self.category_plugins: return self.category_plugins[cat].update_streams(cat) or [] else: return self.streams.get(cat, []) Index: channels/links.py ================================================================== --- channels/links.py +++ channels/links.py @@ -1,5 +1,6 @@ +# encoding: utf-8 # api: streamtuner2 # title: Links to directory services # description: Static list of various music directory websites. # type: group # category: web @@ -13,11 +14,12 @@ # from config import * from channels import * -import copy +import ahttp +import copy, json, re # hooks into main.bookmarks class links (FeaturePlugin): @@ -26,20 +28,19 @@ streams = [ ] default = [ ("stream", "rad.io", "http://www.rad.io/"), ("stream", "RadioTower", "http://www.radiotower.com/"), ("stream", "8tracks", "http://8tracks.com/"), - ("stream", "TuneIn", "http://tunein.com/"), ("stream", "Jango", "http://www.jango.com/"), ("stream", "last.fm", "http://www.last.fm/"), ("stream", "StreamFinder", "http://www.streamfinder.com/"), + ("stream", "RadioTower", "http://radiotower.com/"), ("stream", "Rhapsody (US-only)", "http://www.rhapsody.com/"), ("stream", "Pirateradio Network", "http://www.pirateradionetwork.com/"), ("stream", "radio-locator", "http://www.radio-locator.com/"), ("stream", "Radio Station World", "http://radiostationworld.com/"), ("stream", "iHeart", "http://www.iheartradio.com/"), - ("stream", "MusicGOAL", "http://www.musicgoal.com/"), ("download", "Live Music Archive(.org)", "https://archive.org/details/etree"), ("download", "FMA, free music archive", "http://freemusicarchive.org/"), ("download", "Audiofarm", "http://audiofarm.org/"), ("stream", "SoundCloud", "https://soundcloud.com/"), ("download", "ccMixter", "http://dig.ccmixter.org/"), @@ -51,34 +52,31 @@ ("download", "ccTrax", "http://www.cctrax.com/"), ("list", "WP: Streaming music services", "http://en.wikipedia.org/wiki/Comparison_of_on-demand_streaming_music_services"), ("list", "WP: Music databases", "http://en.wikipedia.org/wiki/List_of_online_music_databases"), ("commercial", "Google Play Music", "https://play.google.com/about/music/"), ("commercial", "Deezer", "http://www.deezer.com/features/music.html"), - #("stream", "SurfMusik.de", "http://www.surfmusic.de/"), ] - + # prepare gui def init2(self, parent): if not parent: return + self.bookmarks = parent.bookmarks # prepare target category - bookmarks = parent.bookmarks - if not bookmarks.streams.get(self.module): - bookmarks.streams[self.module] = [] - bookmarks.add_category(self.module) - - # fill it up later - parent.hooks["init"].append(self.populate) + if not self.bookmarks.streams.get(self.module): + self.bookmarks.streams[self.module] = self.streams + self.bookmarks.add_category(self.module, self) - def populate(self, parent): + def update_streams(self, cat="links"): + #log.PROC("links.update_streams") # Collect links from channel plugins - for name,channel in parent.channels.items(): + for name,channel in self.parent.channels.items(): try: self.streams.append({ "favourite": 1, "genre": "channel", "title": channel.meta.get("title", channel.module), @@ -85,12 +83,13 @@ "homepage": channel.meta.get("url", ""), "format": "text/html", }) except Exception as e: log.ERR("links: adding entry failed:", e) - - # Add built-in link list + + # Add wiki or built-in link list + self.from_wiki() for row in self.default: (genre, title, homepage) = row self.streams.append({ "genre": genre, "title": title, @@ -97,9 +96,25 @@ "homepage": homepage, "type": "text/html", }) # add to bookmarks - parent.bookmarks.streams[self.module] = self.streams + return self.streams # redraw category # parent.bookmarks.reload_if_current(self.module) + + + # retrieve links from repository wiki page (via JSON API /json/wiki/get/…) + def from_wiki(self): + src = ahttp.get("https://fossil.include-once.org/streamtuner2/json/wiki/get/links", timeout=2) + if not src: + return + wiki = json.loads(src) + if not wiki or not wiki.get("payload"): + return + wiki = wiki["payload"]["content"] + pairs = re.findall("(?:(\w+)\s*\|\s*)?\[([\w\s(&,;!:#+\-)]+)\]\((http[^)\s]+)\)", wiki) + if not pairs: + return + self.default = [(cat if cat else "site", title, url) for cat,title,url in pairs] +