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

⌈⌋ ⎇ branch:  streamtuner2


Check-in [9057171155]

Overview
Comment:Use `ui_xml` instead of local filename. (Read via pkgutil.get_data, so should work independently of installation path.) Add logo/banner from `logo.py` → `logo.png`.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 905717115588ba632609a5c568dec878e331c2c6
User & Date: mario on 2015-03-31 16:19:26
Other Links: manifest | tags
Context
2015-03-31
16:21
Remove @title and @module getters, add notebook channel menu_label (unstyled variant of tab_label). Support reading `png:` descriptor field instead of literal .png files along plugins. check-in: b2d68b4b77 user: mario tags: trunk
16:19
Use `ui_xml` instead of local filename. (Read via pkgutil.get_data, so should work independently of installation path.) Add logo/banner from `logo.py` → `logo.png`. check-in: 9057171155 user: mario tags: trunk
16:17
Added pixbuf() creation method (from base64 stringified PNG to gdk.Pixbuf) check-in: 7b1ee3b5a6 user: mario tags: trunk
Changes

Added logo.py version [33142539e4].





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
# type: binary
# api: gtk
# title: streamtuner2 logo
# description: encoded PNG
#
# Allows to be packaged within PYZ archive.

png = """
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
"""

Modified st2.py from [a25ff9d0d3] to [1a108a0e92].

1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
#
# encoding: UTF-8
# api: python
# type: application
# title: streamtuner2
# description: Directory browser for internet radio, audio and video streams
# version: 2.1.5

# author: Mario Salzer <mario@include-once.org>
# license: Public Domain
# url: http://freshcode.club/projects/streamtuner2
# config:  
#   { type: env, name: http_proxy, description: proxy for HTTP access }
#   { type: env, name: XDG_CONFIG_HOME, description: relocates user .config subdirectory }
# category: sound
# depends: pygtk | gi, threading, requests, pyquery, lxml
# id: streamtuner2
# pack: *.py, gtk*.xml, st2.py=/usr/bin/streamtuner2, channels/__init__.py, bundle/*.py,
#   streamtuner2.desktop=/usr/share/applications/, README=/usr/share/doc/streamtuner2/,
#   NEWS.gz=/usr/share/doc/streamtuner2/changelog.gz, help/streamtuner2.1=/usr/share/man/man1/,
#   help/*page=/usr/share/doc/streamtuner2/help/, help/img/*=/usr/share/doc/streamtuner2/help/img/,
#   streamtuner2.png, logo.png=/usr/share/pixmaps/streamtuner2.png,
# architecture: all
#
# Streamtuner2 is a GUI for browsing internet radio directories, music
# collections, and video services - grouped by genres or categories.
# It utilizes installed audio players, and streamripper for recording.
#
# It's an independent rewrite of streamtuner1. Being written in Python,
# can be more easily extended and fixed. The mix of JSON APIs, regex
# or PyQuery extraction makes list generation simpler and more robust.
#
# Primarily radio stations are displayed, some channels however are music
# collections. Commercial and sign-up services are not an objective.








>


















|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python
#
# encoding: UTF-8
# api: python
# type: application
# title: streamtuner2
# description: Directory browser for internet radio, audio and video streams
# version: 2.1.5
# state: beta
# author: Mario Salzer <mario@include-once.org>
# license: Public Domain
# url: http://freshcode.club/projects/streamtuner2
# config:  
#   { type: env, name: http_proxy, description: proxy for HTTP access }
#   { type: env, name: XDG_CONFIG_HOME, description: relocates user .config subdirectory }
# category: sound
# depends: pygtk | gi, threading, requests, pyquery, lxml
# id: streamtuner2
# pack: *.py, gtk*.xml, st2.py=/usr/bin/streamtuner2, channels/__init__.py, bundle/*.py,
#   streamtuner2.desktop=/usr/share/applications/, README=/usr/share/doc/streamtuner2/,
#   NEWS.gz=/usr/share/doc/streamtuner2/changelog.gz, help/streamtuner2.1=/usr/share/man/man1/,
#   help/*page=/usr/share/doc/streamtuner2/help/, help/img/*=/usr/share/doc/streamtuner2/help/img/,
#   streamtuner2.png, logo.png=/usr/share/pixmaps/streamtuner2.png,
# architecture: all
#
# Streamtuner2 is a GUI for browsing internet radio directories, music
# collections, and video services - grouped by genres or categories.
# It runs your preferred audio player, and streamripper for recording.
#
# It's an independent rewrite of streamtuner1. Being written in Python,
# can be more easily extended and fixed. The mix of JSON APIs, regex
# or PyQuery extraction makes list generation simpler and more robust.
#
# Primarily radio stations are displayed, some channels however are music
# collections. Commercial and sign-up services are not an objective.
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
from threading import Thread

# add library path
sys.path.insert(0, "/usr/share/streamtuner2")   # pre-defined directory for modules
sys.path.insert(0, ".")   # development module path

# gtk modules
from uikit import pygtk, gtk, gobject, ui_file, uikit, gui_startup, AboutStreamtuner2

# custom modules
from config import *   # initializes itself, so all conf.vars are available right away
import ahttp
import action

import favicon
import channels
import channels.bookmarks
import channels.configwin
import channels.streamedit
import channels.search








|





>







47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from threading import Thread

# add library path
sys.path.insert(0, "/usr/share/streamtuner2")   # pre-defined directory for modules
sys.path.insert(0, ".")   # development module path

# gtk modules
from uikit import pygtk, gtk, gobject, uikit, ui_xml, gui_startup, AboutStreamtuner2

# custom modules
from config import *   # initializes itself, so all conf.vars are available right away
import ahttp
import action
import logo
import favicon
import channels
import channels.bookmarks
import channels.configwin
import channels.streamedit
import channels.search

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    channel_names = ["bookmarks"]    # order of channel notebook tabs
    current_channel = "bookmarks"    # currently selected channel name (as index in self.channels{})


    # constructor
    def __init__(self):
        
        # gtkrc stylesheet
        self.load_theme(), gui_startup(1/20.0)

        # instantiate gtk/glade widgets in current object
        gtk.Builder.__init__(self)
        gtk.Builder.add_from_file(self, conf.find_in_dirs([".", conf.share], ui_file)), gui_startup(2/20.0)
        # manual gtk operations
        self.extensionsCTM.set_submenu(self.extensions)  # duplicates Station>Extension menu into stream context menu


        # initialize built-in plugins
        self.channels = {
          "bookmarks": channels.bookmarks.bookmarks(parent=self),   # this the remaining built-in channel
        }
        # dialogs that are connected to main
        self.features = {
          "search": channels.search.search(self),
          "configwin": channels.configwin.configwin(self),
          "streamedit": channels.streamedit.streamedit(self),
        }
        gui_startup(3/20.0)
        # append other channel modules and plugins
        self.load_plugin_channels()


        # load application state (widget sizes, selections, etc.)
        try:
            winlayout = conf.load("window")







|
|
<
<
|
|
<
|
>











|







90
91
92
93
94
95
96
97
98


99
100

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    channel_names = ["bookmarks"]    # order of channel notebook tabs
    current_channel = "bookmarks"    # currently selected channel name (as index in self.channels{})


    # constructor
    def __init__(self):
        
        # Load stylesheet, instantiate GtkBuilder in self, menu and logo hooks
        gui_startup(0/20.0), self.load_theme()


        gui_startup(1/20.0), gtk.Builder.__init__(self)
        gui_startup(1/20.0), gtk.Builder.add_from_string(self, ui_xml)

        gui_startup(3/20.0), self.extensionsCTM.set_submenu(self.extensions)  # duplicates Station>Extension menu into stream context menu
        self.img_logo.set_from_pixbuf(uikit.pixbuf(logo.png))

        # initialize built-in plugins
        self.channels = {
          "bookmarks": channels.bookmarks.bookmarks(parent=self),   # this the remaining built-in channel
        }
        # dialogs that are connected to main
        self.features = {
          "search": channels.search.search(self),
          "configwin": channels.configwin.configwin(self),
          "streamedit": channels.streamedit.streamedit(self),
        }
        gui_startup(4/20.0)
        # append other channel modules and plugins
        self.load_plugin_channels()


        # load application state (widget sizes, selections, etc.)
        try:
            winlayout = conf.load("window")
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
        gui_startup(18/20.0)
        self.current_channel = self.current_channel_gtk()
        try: self.channel().first_show()
        except: __print__(dbg.INIT, "main.__init__: current_channel.first_show() initialization error")

  
        # bind gtk/glade event names to functions
        gui_startup(19/20.0)
        self.connect_signals(dict({
            "gtk_main_quit" : self.gtk_main_quit,                # close window
            # treeviews / notebook
            "on_stream_row_activated" : self.on_play_clicked,    # double click in a streams list
            "on_category_clicked": self.on_category_clicked,     # new selection in category list
            "on_notebook_channels_switch_page": self.channel_switch,   # channel notebook tab changed
            "station_context_menu": lambda tv,ev: self.station_context_menu(tv,ev),







|







138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
        gui_startup(18/20.0)
        self.current_channel = self.current_channel_gtk()
        try: self.channel().first_show()
        except: __print__(dbg.INIT, "main.__init__: current_channel.first_show() initialization error")

  
        # bind gtk/glade event names to functions
        gui_startup(19.75/20.0)
        self.connect_signals(dict({
            "gtk_main_quit" : self.gtk_main_quit,                # close window
            # treeviews / notebook
            "on_stream_row_activated" : self.on_play_clicked,    # double click in a streams list
            "on_category_clicked": self.on_category_clicked,     # new selection in category list
            "on_notebook_channels_switch_page": self.channel_switch,   # channel notebook tab changed
            "station_context_menu": lambda tv,ev: self.station_context_menu(tv,ev),
202
203
204
205
206
207
208
209
210

211
212
213
214
215
216
217
            "streamedit_open": self.streamedit.open,
            "streamedit_save": self.streamedit.save,
            "streamedit_new": self.streamedit.new,
            "streamedit_cancel": self.streamedit.cancel,
        }, **self.add_signals))
        
        # actually display main window
        gui_startup(98.9/100.0)
        self.win_streamtuner2.show()

        

    #-- Shortcut for glade.get_widget()
    # Allows access to widgets as direct attributes instead of using .get_widget()
    # Also looks in self.channels[] for the named channel plugins
    def __getattr__(self, name):
        if (name in self.channels):







<

>







202
203
204
205
206
207
208

209
210
211
212
213
214
215
216
217
            "streamedit_open": self.streamedit.open,
            "streamedit_save": self.streamedit.save,
            "streamedit_new": self.streamedit.new,
            "streamedit_cancel": self.streamedit.cancel,
        }, **self.add_signals))
        
        # actually display main window

        self.win_streamtuner2.show()
        gui_startup(1.0)
        

    #-- Shortcut for glade.get_widget()
    # Allows access to widgets as direct attributes instead of using .get_widget()
    # Also looks in self.channels[] for the named channel plugins
    def __getattr__(self, name):
        if (name in self.channels):
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416

    # load plugins from /usr/share/streamtuner2/channels/
    def load_plugin_channels(self):

        # initialize plugin modules (pre-ordered)
        ls = channels.module_list()
        for module in ls:
            gui_startup(2/10.0 + 7/10.0 * float(ls.index(module))/len(ls), "loading module "+module)
                            
            # skip module if disabled
            if conf.plugins.get(module, 1) == False:
                __print__(dbg.STAT, "disabled plugin:", module)
                continue
            # or if it's a built-in (already imported)
            elif module in self.features or module in self.channels:







|







402
403
404
405
406
407
408
409
410
411
412
413
414
415
416

    # load plugins from /usr/share/streamtuner2/channels/
    def load_plugin_channels(self):

        # initialize plugin modules (pre-ordered)
        ls = channels.module_list()
        for module in ls:
            gui_startup(4/20.0 + 13.5/20.0 * float(ls.index(module))/len(ls), "loading module "+module)
                            
            # skip module if disabled
            if conf.plugins.get(module, 1) == False:
                __print__(dbg.STAT, "disabled plugin:", module)
                continue
            # or if it's a built-in (already imported)
            elif module in self.features or module in self.channels:
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536




#-- run main
if __name__ == "__main__":


    # graphical
    if len(sys.argv) < 2 or "--gtk3" in sys.argv:

        # prepare for threading in Gtk+ callbacks
        gobject.threads_init()
        gui_startup(1/100.0)

        # prepare main window
        main = StreamTunerTwo()

        # module coupling
        action.main = main      # action (play/record) module needs a reference to main window for gtk interaction and some URL/URI callbacks
        action = action.action  # shorter name
        ahttp.feedback = main.status  # http module gives status feedbacks too

        # first invocation
        if (conf.get("firstrun")):
            main.configwin.open(None)
            del conf.firstrun

        # run
        gui_startup(100/100.0)
        gtk.main()
        __print__(dbg.PROC, r" gtk_main_quit ")
        
    # invoke command-line interface
    else:
        import cli
        cli.StreamTunerCLI()









<





<















<









498
499
500
501
502
503
504

505
506
507
508
509

510
511
512
513
514
515
516
517
518
519
520
521
522
523
524

525
526
527
528
529
530
531
532
533




#-- run main
if __name__ == "__main__":


    # graphical
    if len(sys.argv) < 2 or "--gtk3" in sys.argv:

        # prepare for threading in Gtk+ callbacks
        gobject.threads_init()


        # prepare main window
        main = StreamTunerTwo()

        # module coupling
        action.main = main      # action (play/record) module needs a reference to main window for gtk interaction and some URL/URI callbacks
        action = action.action  # shorter name
        ahttp.feedback = main.status  # http module gives status feedbacks too

        # first invocation
        if (conf.get("firstrun")):
            main.configwin.open(None)
            del conf.firstrun

        # run

        gtk.main()
        __print__(dbg.PROC, r" gtk_main_quit ")
        
    # invoke command-line interface
    else:
        import cli
        cli.StreamTunerCLI()