Internet radio browser GUI for music/video streams from various directory services.

⌈⌋ ⎇ branch:  streamtuner2


Check-in [a05da9d33d]

Overview
Comment:Changed plugin config: options default registration to use full .meta[] now instead of just config[] list. Thus plugins can be enabled/disabled right away based on priority: field. (On first startup all channels will show up however.)
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: a05da9d33d38c2761e73caf60c98777477ea6b85
User & Date: mario on 2015-04-02 15:28:34
Other Links: manifest | tags
Context
2015-04-02
15:29
Adapted uikit.hbox to allow left or right column to be expanded/filled. check-in: f3f635ba8d user: mario tags: trunk
15:28
Changed plugin config: options default registration to use full .meta[] now instead of just config[] list. Thus plugins can be enabled/disabled right away based on priority: field. (On first startup all channels will show up however.) check-in: a05da9d33d user: mario tags: trunk
15:27
Fix config defaults registration. check-in: b49c38af77 user: mario tags: trunk
Changes

Modified channels/__init__.py from [3382badfa2] to [2254b1cf48].

113
114
115
116
117
118
119
120

121
122
123
124
125
126
127
113
114
115
116
117
118
119

120
121
122
123
124
125
126
127







-
+







        self.gtk_cat = None
        self.module = self.__class__.__name__
        self.meta = plugin_meta(src = inspect.getcomments(inspect.getmodule(self)))
        self.config = self.meta.get("config", [])
        self.title = self.meta.get("title", self.module)

        # add default options values to config.conf.* dict
        conf.add_plugin_defaults(self.meta["config"], self.module)
        conf.add_plugin_defaults(self.meta, self.module)

        # only if streamtuner2 is run in graphical mode        
        if (parent):
            self.cache()
            self.gui(parent)
        pass
        

Modified config.py from [ec183e5649] to [d4c58ff389].

120
121
122
123
124
125
126
127

128
129

130
131
132
133
134
135
136

137
138
139
140
141
142
143
144
120
121
122
123
124
125
126

127
128
129
130
131
132
133
134
135
136

137

138
139
140
141
142
143
144







-
+


+






-
+
-







        self.google_homepage = 0
        self.windows = platform.system()=="Windows"
        self.pyquery = 1
        self.debug = 0

        
    # each plugin has a .config dict list, we add defaults here
    def add_plugin_defaults(self, config, module=""):
    def add_plugin_defaults(self, meta, module=""):
    
        # options
        config = meta.get("config", [])
        for opt in config:
            if ("name" in opt) and ("value" in opt) and (opt["name"] not in vars(self)):
                self.__dict__[opt["name"]] = opt["value"]

        # plugin state
        if module and module not in conf.plugins:
             conf.plugins[module] = 1
             conf.plugins[module] = meta.get("priority") in ("core", "builtin", "default", "standard")
             #@TODO: use meta["priority"] in ("core", "builtin", "default") etc.

    
        
    # http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
    def xdg(self, path="/streamtuner2"):
        home = os.environ.get("HOME", self.tmp)
        config = os.environ.get("XDG_CONFIG_HOME", os.environ.get("APPDATA", home+"/.config"))

Modified st2.py from [098afe2087] to [f737d4ecc1].

291
292
293
294
295
296
297
298
299



300
301
302
303
304

305

306
307
308
309
310
311
312
291
292
293
294
295
296
297


298
299
300
301
302
303
304
305
306

307
308
309
310
311
312
313
314







-
-
+
+
+





+
-
+







    # Recording: invoke streamripper for current stream URL
    def on_record_clicked(self, widget):
        row = self.row()
        self.action.record(row.get("url"), row.get("format", "audio/mpeg"), "url/direct", row=row)

    # Open stream homepage in web browser
    def on_homepage_stream_clicked(self, widget):
        url = self.selected("homepage")             
        self.action.browser(url)
        url = self.selected("homepage")
        if url and len(url): self.action.browser(url)
        else: self.status("No homepage URL present.")

    # Browse to channel homepage (double click on notebook tab)
    def on_homepage_channel_clicked(self, widget, event=2):
        if event == 2 or event.type == gtk.gdk._2BUTTON_PRESS:
            __print__(dbg.UI, "dblclick")
            url = self.channel().meta.get("url", "https://duckduckgo.com/?q=" + self.channel().module)
            self.action.browser(self.channel().homepage)            
            self.action.browser(self.channel().url)

    # Reload stream list in current channel-category
    def on_reload_clicked(self, widget=None, reload=1):
        __print__(dbg.UI, "reload", reload, self.current_channel, self.channels[self.current_channel], self.channel().current)
        category = self.channel().current
        self.thread(
            lambda: (  self.channel().load(category,reload), reload and self.bookmarks.heuristic_update(self.current_channel,category)  )