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

⌈⌋ branch:  streamtuner2


Check-in [af5ae3f5be]

Overview
Comment:ListStore row editing callback unified via lambda-funcs as signal handlers. Recording hook adapted to pass actual MIME type. Python3 try/except for json file writing (still breaks due to gzip handler being optional).
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: af5ae3f5befe7538a863a667e1a5080d8149d132
User & Date: mario on 2014-05-27 12:37:55
Other Links: manifest | tags
Context
2014-05-27
15:06
Update default configuration, rename internet_radio_org_uk to just internet_radio module check-in: 99d4249ef4 user: mario tags: trunk
12:37
ListStore row editing callback unified via lambda-funcs as signal handlers. Recording hook adapted to pass actual MIME type. Python3 try/except for json file writing (still breaks due to gzip handler being optional). check-in: af5ae3f5be user: mario tags: trunk
00:44
conf.record{} array is back, settings dialog now shows a separate editable table; default options prepared for `youtube-dl` video downloading. Action module now more orderly tries alternative media/* placeholders. check-in: 199c0ad425 user: mario tags: trunk
Changes

Modified channels/history.py from [e7c8df9075] to [5834376e37].

71
72
73
74
75
76
77
78
79
80
        # limit number of entries
        max = int(conf.history)
        while max > 0 and  len(hist) > max:
            hist.pop()

        # update store
        self.bm.save()
        if self.bm.current == "history":
           self.bm.load("history")








|
|

71
72
73
74
75
76
77
78
79
80
        # limit number of entries
        max = int(conf.history)
        while max > 0 and  len(hist) > max:
            hist.pop()

        # update store
        self.bm.save()
        #if self.bm.current == "history":
        #   self.bm.load("history")

Modified config.py from [1b0bc1277f] to [1418a05152].

147
148
149
150
151
152
153

154


155
156
157
158
159
160
161
                f = gzip.open(file+".gz", "w")
                if os.path.exists(file):
                    os.unlink(file)
            else:
                f = open(file, "w")
            # encode
            data = json.dumps(data, indent=(4 if nice else None))

            f.write(data.encode("utf-8"))


            f.close()


        # retrieve data from config file            
        def load(self, name):
            name = name + ".json"
            file = self.dir + "/" + name







>
|
>
>







147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
                f = gzip.open(file+".gz", "w")
                if os.path.exists(file):
                    os.unlink(file)
            else:
                f = open(file, "w")
            # encode
            data = json.dumps(data, indent=(4 if nice else None))
            try:
                f.write(data.encode("utf-8"))
            except TypeError as e:
                f.write(data)  # Python3 sometimes wants to write strings rather than bytes
            f.close()


        # retrieve data from config file            
        def load(self, name):
            name = name + ".json"
            file = self.dir + "/" + name

Modified gtk2.xml from [325cdc9c7f] to [d03e67e7ef].

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
                              <object class="GtkScrolledWindow" id="scrolledwindow4">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="hscrollbar_policy">automatic</property>
                                <property name="vscrollbar_policy">automatic</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_player">
                                    <property name="width_request">0</property>
                                    <property name="height_request">200</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_play</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>
                                    <property name="search_column">0</property>
                                    <property name="level_indentation">8</property>
                                    <property name="enable_grid_lines">both</property>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
                                            <signal name="edited" handler="config_player_edited" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
                                            <signal name="edited" handler="config_player_edited_2" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label15">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">Use &lt;a href="http://fossil.include-once.org/streamtuner2/wiki?name=player"&gt;placeholders&lt;/a&gt; such as &lt;b&gt;%pls&lt;/b&gt; for Shoutcast playlists,
or pass &lt;b&gt;%m3u&lt;/b&gt; for players that expect mp3 playlist files,
and &lt;b&gt;%srv&lt;/b&gt; to use direct streaming URLs.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">5</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record3">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">3</property>
                              </packing>
                            </child>



                            <child>
                              <object class="GtkLabel" id="label_record1">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="label" translatable="yes">&lt;b&gt;Recording&lt;/b&gt; applications.</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">4</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkScrolledWindow" id="scrolledwindow5">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="hscrollbar_policy">automatic</property>
                                <property name="vscrollbar_policy">automatic</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_record">
                                    <property name="width_request">0</property>
                                    <property name="height_request">100</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_record</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>
                                    <property name="search_column">0</property>
                                    <property name="level_indentation">8</property>
                                    <property name="enable_grid_lines">both</property>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_record_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_record_type">
                                            <signal name="edited" handler="config_record_edited" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_record_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_record_app">
                                            <signal name="edited" handler="config_record_edited_2" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">5</property>
                              </packing>
                            </child>



















                            <child>
                              <object class="GtkLabel" id="label_record2">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">You usually want to run recording applications in a
terminal window, as they're commandline tools.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">15</property>
                                <property name="position">6</property>
                              </packing>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                </child>
                <child type="tab">







|


















|















|


















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<









|


>
>
>















<
<
<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>














<
|


<
<
<
<
<
<







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
                              <object class="GtkScrolledWindow" id="scrolledwindow4">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="hscrollbar_policy">automatic</property>
                                <property name="vscrollbar_policy">automatic</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_player">
                                    <property name="width_request">540</property>
                                    <property name="height_request">200</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_play</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>
                                    <property name="search_column">0</property>
                                    <property name="level_indentation">8</property>
                                    <property name="enable_grid_lines">both</property>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
                                            <signal name="edited" handler="config_play_list_edit_col0" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
                                            <signal name="edited" handler="config_play_list_edit_col1" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <child>



















                              <object class="GtkLabel" id="label_record3">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record1">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="label" translatable="yes">&lt;b&gt;Recording&lt;/b&gt; applications.</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">4</property>
                              </packing>
                            </child>
                            <child>






                              <object class="GtkTreeView" id="tv_config_record">
                                <property name="width_request">540</property>
                                <property name="height_request">100</property>
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="border_width">5</property>
                                <property name="model">config_record</property>
                                <property name="headers_clickable">False</property>
                                <property name="rules_hint">True</property>
                                <property name="search_column">0</property>
                                <property name="level_indentation">8</property>
                                <property name="enable_grid_lines">both</property>
                                <child>
                                  <object class="GtkTreeViewColumn" id="tvc_config_record_type">
                                    <property name="spacing">10</property>
                                    <property name="min_width">125</property>
                                    <property name="title" translatable="yes">Format</property>
                                    <property name="sort_indicator">True</property>
                                    <child>
                                      <object class="GtkCellRendererText" id="tvcr_config_record_type">
                                        <signal name="edited" handler="config_record_list_edit_col0" swapped="no"/>
                                      </object>
                                      <attributes>
                                        <attribute name="editable">2</attribute>
                                        <attribute name="text">0</attribute>
                                      </attributes>
                                    </child>
                                  </object>
                                </child>
                                <child>
                                  <object class="GtkTreeViewColumn" id="tvc_config_record_app">
                                    <property name="spacing">10</property>
                                    <property name="min_width">300</property>
                                    <property name="title" translatable="yes">Application</property>
                                    <child>
                                      <object class="GtkCellRendererText" id="tvcr_config_record_app">
                                        <signal name="edited" handler="config_record_list_edit_col1" swapped="no"/>
                                      </object>
                                      <attributes>
                                        <attribute name="editable">2</attribute>
                                        <attribute name="text">1</attribute>
                                      </attributes>


                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">5</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label15">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">Use &lt;a href="http://fossil.include-once.org/streamtuner2/wiki?name=player"&gt;placeholders&lt;/a&gt; such as &lt;b&gt;%pls&lt;/b&gt; for Shoutcast playlists,
or pass &lt;b&gt;%m3u&lt;/b&gt; for players that expect mp3 playlist files,
and &lt;b&gt;%srv&lt;/b&gt; to use direct streaming URLs.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">5</property>
                                <property name="position">6</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record2">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">You usually want to run recording applications in a
terminal window, as they're commandline tools.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>

                                <property name="position">7</property>
                              </packing>
                            </child>






                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                </child>
                <child type="tab">
1854
1855
1856
1857
1858
1859
1860







































































































































1861
1862
1863
1864
1865
1866
1867
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>







































































































































                <child>
                  <object class="GtkCheckButton" id="search_channel_all">
                    <property name="label" translatable="yes">all channels</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">False</property>
                    <property name="active">True</property>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <object class="GtkCheckButton" id="search_channel_all">
                    <property name="label" translatable="yes">all channels</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">False</property>
                    <property name="active">True</property>
2211
2212
2213
2214
2215
2216
2217



2218
2219
2220
2221
2222
2223
2224
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">station homepage</property>
        <property name="use_underline">True</property>
        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
      </object>
    </child>
  </object>



  <object class="GtkDialog" id="timer_dialog">
    <property name="can_focus">False</property>
    <property name="border_width">5</property>
    <property name="type_hint">normal</property>
    <signal name="delete-event" handler="true" swapped="no"/>
    <child internal-child="vbox">
      <object class="GtkVBox" id="dialog-vbox2">







>
>
>







2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">station homepage</property>
        <property name="use_underline">True</property>
        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
      </object>
    </child>
  </object>
  <object class="GtkTextBuffer" id="textbuffer1">
    <property name="text" translatable="yes">record,1</property>
  </object>
  <object class="GtkDialog" id="timer_dialog">
    <property name="can_focus">False</property>
    <property name="border_width">5</property>
    <property name="type_hint">normal</property>
    <signal name="delete-event" handler="true" swapped="no"/>
    <child internal-child="vbox">
      <object class="GtkVBox" id="dialog-vbox2">
2520
2521
2522
2523
2524
2525
2526






















































2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544









2545
2546
2547
2548
2549
2550
2551
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>






















































            <child>
              <object class="GtkEntry" id="timer_value">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="invisible_char">●</property>
                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
                <property name="primary_icon_activatable">False</property>
                <property name="secondary_icon_activatable">False</property>
                <property name="primary_icon_sensitive">True</property>
                <property name="secondary_icon_sensitive">True</property>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="right_attach">2</property>
                <property name="top_attach">1</property>
                <property name="bottom_attach">2</property>
              </packing>
            </child>









            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


















>
>
>
>
>
>
>
>
>







2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <object class="GtkEntry" id="timer_value">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="invisible_char">●</property>
                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
                <property name="primary_icon_activatable">False</property>
                <property name="secondary_icon_activatable">False</property>
                <property name="primary_icon_sensitive">True</property>
                <property name="secondary_icon_sensitive">True</property>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="right_attach">2</property>
                <property name="top_attach">1</property>
                <property name="bottom_attach">2</property>
              </packing>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
3054
3055
3056
3057
3058
3059
3060
3061
3062

3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074

3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
                            <property name="can_focus">False</property>
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>
                                <accelerator key="F8" signal="activate"/>
                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>

                                <signal name="activate" handler="bookmark" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F2" signal="activate"/>

                                <signal name="activate" handler="save_as" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="F3" signal="activate"/>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>







<

>










<

>










|

|







3243
3244
3245
3246
3247
3248
3249

3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261

3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
                            <property name="can_focus">False</property>
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>

                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F8" signal="activate"/>
                                <signal name="activate" handler="bookmark" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>

                                <accelerator key="F2" signal="activate"/>
                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <signal name="activate" handler="save_as" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="F3" signal="activate"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
3153
3154
3155
3156
3157
3158
3159
3160
3161

3162
3163
3164
3165
3166
3167
3168
                            <child>
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="Delete" signal="activate"/>

                                <signal name="activate" handler="delete_entry" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>







<

>







3342
3343
3344
3345
3346
3347
3348

3349
3350
3351
3352
3353
3354
3355
3356
3357
                            <child>
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>

                                <accelerator key="Delete" signal="activate"/>
                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <signal name="activate" handler="delete_entry" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>

Modified gtk3.xml from [ef399438fb] to [eafd4c36a0].

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
                            </child>
                            <child>
                              <object class="GtkScrolledWindow" id="scrolledwindow4">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_player">
                                    <property name="width_request">0</property>
                                    <property name="height_request">200</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_play</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>







|







77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
                            </child>
                            <child>
                              <object class="GtkScrolledWindow" id="scrolledwindow4">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_player">
                                    <property name="width_request">540</property>
                                    <property name="height_request">200</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_play</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>
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
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
                                            <signal name="edited" handler="config_player_edited" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
                                            <signal name="edited" handler="config_player_edited_2" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label15">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">Use &lt;a href="http://fossil.include-once.org/streamtuner2/wiki?name=player"&gt;placeholders&lt;/a&gt; such as &lt;b&gt;%pls&lt;/b&gt; for Shoutcast playlists,
or pass &lt;b&gt;%m3u&lt;/b&gt; for players that expect mp3 playlist files,
and &lt;b&gt;%srv&lt;/b&gt; to use direct streaming URLs.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">5</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record3">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">3</property>
                              </packing>
                            </child>



                            <child>
                              <object class="GtkLabel" id="label_record1">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="label" translatable="yes">&lt;b&gt;Recording&lt;/b&gt; applications.</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">4</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkScrolledWindow" id="scrolledwindow5">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <child>
                                  <object class="GtkTreeView" id="tv_config_record">
                                    <property name="width_request">0</property>
                                    <property name="height_request">100</property>
                                    <property name="visible">True</property>
                                    <property name="can_focus">True</property>
                                    <property name="border_width">5</property>
                                    <property name="model">config_record</property>
                                    <property name="headers_clickable">False</property>
                                    <property name="rules_hint">True</property>
                                    <property name="search_column">0</property>
                                    <property name="level_indentation">8</property>
                                    <property name="enable_grid_lines">both</property>
                                    <child internal-child="selection">
                                      <object class="GtkTreeSelection" id="treeview-selection2"/>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_record_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_record_type">
                                            <signal name="edited" handler="config_record_edited" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_record_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_record_app">
                                            <signal name="edited" handler="config_record_edited_2" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">5</property>
                              </packing>
                            </child>



















                            <child>
                              <object class="GtkLabel" id="label_record2">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">You usually want to run recording applications in a
terminal window, as they're commandline tools.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">15</property>
                                <property name="position">6</property>
                              </packing>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                </child>
                <child type="tab">







|















|


















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<









|


>
>
>















<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>














<
|


<
<
<
<
<
<







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
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
                                        <property name="spacing">10</property>
                                        <property name="min_width">125</property>
                                        <property name="title" translatable="yes">Format</property>
                                        <property name="sort_indicator">True</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
                                            <signal name="edited" handler="config_play_list_edit_col0" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">0</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                    <child>
                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
                                        <property name="spacing">10</property>
                                        <property name="min_width">300</property>
                                        <property name="title" translatable="yes">Application</property>
                                        <child>
                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
                                            <signal name="edited" handler="config_play_list_edit_col1" swapped="no"/>
                                          </object>
                                          <attributes>
                                            <attribute name="editable">2</attribute>
                                            <attribute name="text">1</attribute>
                                          </attributes>
                                        </child>
                                      </object>
                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">1</property>
                              </packing>
                            </child>
                            <child>



















                              <object class="GtkLabel" id="label_record3">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">2</property>
                              </packing>
                            </child>
                            <child>
                              <placeholder/>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record1">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="xalign">0</property>
                                <property name="label" translatable="yes">&lt;b&gt;Recording&lt;/b&gt; applications.</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">4</property>
                              </packing>
                            </child>
                            <child>




                              <object class="GtkTreeView" id="tv_config_record">
                                <property name="width_request">540</property>
                                <property name="height_request">100</property>
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="border_width">5</property>
                                <property name="model">config_record</property>
                                <property name="headers_clickable">False</property>
                                <property name="rules_hint">True</property>
                                <property name="search_column">0</property>
                                <property name="level_indentation">8</property>
                                <property name="enable_grid_lines">both</property>
                                <child internal-child="selection">
                                  <object class="GtkTreeSelection" id="treeview-selection2"/>
                                </child>
                                <child>
                                  <object class="GtkTreeViewColumn" id="tvc_config_record_type">
                                    <property name="spacing">10</property>
                                    <property name="min_width">125</property>
                                    <property name="title" translatable="yes">Format</property>
                                    <property name="sort_indicator">True</property>
                                    <child>
                                      <object class="GtkCellRendererText" id="tvcr_config_record_type">
                                        <signal name="edited" handler="config_record_list_edit_col0" swapped="no"/>
                                      </object>
                                      <attributes>
                                        <attribute name="editable">2</attribute>
                                        <attribute name="text">0</attribute>
                                      </attributes>
                                    </child>
                                  </object>
                                </child>
                                <child>
                                  <object class="GtkTreeViewColumn" id="tvc_config_record_app">
                                    <property name="spacing">10</property>
                                    <property name="min_width">300</property>
                                    <property name="title" translatable="yes">Application</property>
                                    <child>
                                      <object class="GtkCellRendererText" id="tvcr_config_record_app">
                                        <signal name="edited" handler="config_record_list_edit_col1" swapped="no"/>
                                      </object>
                                      <attributes>
                                        <attribute name="editable">2</attribute>
                                        <attribute name="text">1</attribute>
                                      </attributes>


                                    </child>
                                  </object>
                                </child>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="position">5</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label15">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">Use &lt;a href="http://fossil.include-once.org/streamtuner2/wiki?name=player"&gt;placeholders&lt;/a&gt; such as &lt;b&gt;%pls&lt;/b&gt; for Shoutcast playlists,
or pass &lt;b&gt;%m3u&lt;/b&gt; for players that expect mp3 playlist files,
and &lt;b&gt;%srv&lt;/b&gt; to use direct streaming URLs.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>
                                <property name="padding">5</property>
                                <property name="position">6</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label_record2">
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="xalign">0.019999999552965164</property>
                                <property name="yalign">0.49000000953674316</property>
                                <property name="label" translatable="yes">You usually want to run recording applications in a
terminal window, as they're commandline tools.</property>
                                <property name="use_markup">True</property>
                                <property name="wrap">True</property>
                              </object>
                              <packing>
                                <property name="expand">True</property>
                                <property name="fill">True</property>

                                <property name="position">7</property>
                              </packing>
                            </child>






                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                </child>
                <child type="tab">
1886
1887
1888
1889
1890
1891
1892







































































































































1893
1894
1895
1896
1897
1898
1899
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>







































































































































                <child>
                  <object class="GtkCheckButton" id="search_channel_all">
                    <property name="label" translatable="yes">all channels</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">False</property>
                    <property name="xalign">0.5</property>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <object class="GtkCheckButton" id="search_channel_all">
                    <property name="label" translatable="yes">all channels</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">False</property>
                    <property name="xalign">0.5</property>
2248
2249
2250
2251
2252
2253
2254



2255
2256
2257
2258
2259
2260
2261
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">station homepage</property>
        <property name="use_underline">True</property>
        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
      </object>
    </child>
  </object>



  <object class="GtkDialog" id="timer_dialog">
    <property name="can_focus">False</property>
    <property name="border_width">5</property>
    <property name="type_hint">normal</property>
    <signal name="delete-event" handler="true" swapped="no"/>
    <child internal-child="vbox">
      <object class="GtkBox" id="dialog-vbox2">







>
>
>







2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">station homepage</property>
        <property name="use_underline">True</property>
        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
      </object>
    </child>
  </object>
  <object class="GtkTextBuffer" id="textbuffer1">
    <property name="text" translatable="yes">record,1</property>
  </object>
  <object class="GtkDialog" id="timer_dialog">
    <property name="can_focus">False</property>
    <property name="border_width">5</property>
    <property name="type_hint">normal</property>
    <signal name="delete-event" handler="true" swapped="no"/>
    <child internal-child="vbox">
      <object class="GtkBox" id="dialog-vbox2">
2575
2576
2577
2578
2579
2580
2581






















































2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597









2598
2599
2600
2601
2602
2603
2604
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>






















































            <child>
              <object class="GtkEntry" id="timer_value">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="invisible_char">●</property>
                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
                <property name="primary_icon_activatable">False</property>
                <property name="secondary_icon_activatable">False</property>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="right_attach">2</property>
                <property name="top_attach">1</property>
                <property name="bottom_attach">2</property>
              </packing>
            </child>









            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
















>
>
>
>
>
>
>
>
>







2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <object class="GtkEntry" id="timer_value">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="invisible_char">●</property>
                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
                <property name="primary_icon_activatable">False</property>
                <property name="secondary_icon_activatable">False</property>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="right_attach">2</property>
                <property name="top_attach">1</property>
                <property name="bottom_attach">2</property>
              </packing>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
              <placeholder/>
            </child>
            <child>
3090
3091
3092
3093
3094
3095
3096
3097
3098

3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110

3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>
                                <signal name="activate" handler="bookmark" swapped="no"/>
                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F8" signal="activate"/>

                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="save_as" swapped="no"/>
                                <accelerator key="F2" signal="activate"/>
                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>

                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                                <accelerator key="F3" signal="activate"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">Extensions</property>







<

>










<

>










|

|







3281
3282
3283
3284
3285
3286
3287

3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299

3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>
                                <signal name="activate" handler="bookmark" swapped="no"/>

                                <accelerator key="F8" signal="activate"/>
                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="save_as" swapped="no"/>

                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F2" signal="activate"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="F3" signal="activate"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">Extensions</property>
3189
3190
3191
3192
3193
3194
3195
3196
3197

3198
3199
3200
3201
3202
3203
3204
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="delete_entry" swapped="no"/>
                                <accelerator key="Delete" signal="activate"/>
                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>

                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>







<

>







3380
3381
3382
3383
3384
3385
3386

3387
3388
3389
3390
3391
3392
3393
3394
3395
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <signal name="activate" handler="delete_entry" swapped="no"/>

                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="Delete" signal="activate"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>

Modified st2.py from [6c5e20937c] to [7f404124e6].

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
# encoding: UTF-8
# api: python
# type: application
# title: streamtuner2
# description: directory browser for internet radio / audio streams
# depends: pygtk | pygi, threading, pyquery, kronos, requests
# version: 2.1.1
# author: mario salzer
# license: public domain
# url: http://freshmeat.net/projects/streamtuner2
# config: <env name="http_proxy" value="" description="proxy for HTTP access" />  <env name="XDG_CONFIG_HOME" description="relocates user .config subdirectory" />
# category: multimedia





|







1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
# encoding: UTF-8
# api: python
# type: application
# title: streamtuner2
# description: Directory browser for internet radio / audio streams
# depends: pygtk | pygi, threading, pyquery, kronos, requests
# version: 2.1.1
# author: mario salzer
# license: public domain
# url: http://freshmeat.net/projects/streamtuner2
# config: <env name="http_proxy" value="" description="proxy for HTTP access" />  <env name="XDG_CONFIG_HOME" description="relocates user .config subdirectory" />
# category: multimedia
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import ahttp
import action  # needs workaround... (action.main=main)
import channels
from channels import *
import favicon


__version__ = "2.1.0"


# this represents the main window
# and also contains most application behaviour
main = None
class StreamTunerTwo(gtk.Builder):








|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import ahttp
import action  # needs workaround... (action.main=main)
import channels
from channels import *
import favicon


__version__ = "2.1.1"


# this represents the main window
# and also contains most application behaviour
main = None
class StreamTunerTwo(gtk.Builder):

184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
                "menu_toolbar_size_small": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_SMALL_TOOLBAR)),
                "menu_toolbar_size_medium": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DND)),
                "menu_toolbar_size_large": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DIALOG)),
                # else
                "menu_properties": config_dialog.open,
                "config_cancel": config_dialog.hide,
                "config_save": config_dialog.save,
                "config_player_edited": config_dialog.edited_player_row,
                "config_player_edited_2": config_dialog.edited_player_row_2,
                "config_record_edited": config_dialog.edited_record_row,
                "config_record_edited_2": config_dialog.edited_record_row_2,
                "update_categories": self.update_categories,
                "update_favicons": self.update_favicons,
                "app_state": self.app_state,
                "bookmark": self.bookmark,
                "save_as": self.save_as,
                "menu_about": lambda w: AboutStreamtuner2(),
                "menu_help": action.action.help,
                "menu_onlineforum": lambda w: action.browser("http://sourceforge.net/projects/streamtuner2/forums/forum/1173108"),







|
|
|
|
<







184
185
186
187
188
189
190
191
192
193
194

195
196
197
198
199
200
201
                "menu_toolbar_size_small": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_SMALL_TOOLBAR)),
                "menu_toolbar_size_medium": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DND)),
                "menu_toolbar_size_large": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DIALOG)),
                # else
                "menu_properties": config_dialog.open,
                "config_cancel": config_dialog.hide,
                "config_save": config_dialog.save,
                "config_play_list_edit_col0": lambda w,path,txt: (config_dialog.list_edit(self.config_play, path, 0, txt)),
                "config_play_list_edit_col1": lambda w,path,txt: (config_dialog.list_edit(self.config_play, path, 1, txt)),
                "config_record_list_edit_col0": lambda w,path,txt: (config_dialog.list_edit(self.config_record, path, 0, txt)),
                "config_record_list_edit_col1": lambda w,path,txt: (config_dialog.list_edit(self.config_record, path, 1, txt)),

                "update_favicons": self.update_favicons,
                "app_state": self.app_state,
                "bookmark": self.bookmark,
                "save_as": self.save_as,
                "menu_about": lambda w: AboutStreamtuner2(),
                "menu_help": action.action.help,
                "menu_onlineforum": lambda w: action.browser("http://sourceforge.net/projects/streamtuner2/forums/forum/1173108"),
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
                self.channel().play(row)
                [hook(row) for hook in self.hooks["play"]]


        # streamripper
        def on_record_clicked(self, widget):
            row = self.row()
            action.record(row.get("url"), "audio/mpeg", "url/direct", row=row)


        # browse stream
        def on_homepage_stream_clicked(self, widget):
            url = self.selected("homepage")             
            action.browser(url)








|







306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
                self.channel().play(row)
                [hook(row) for hook in self.hooks["play"]]


        # streamripper
        def on_record_clicked(self, widget):
            row = self.row()
            action.record(row.get("url"), row.get("format", "audio/mpeg"), "url/direct", row=row)


        # browse stream
        def on_homepage_stream_clicked(self, widget):
            url = self.selected("homepage")             
            action.browser(url)

794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
                        config[key] = {}
                        for row in w:
                            if row[0] and row[1]:
                                config[key][row[0]] = row[1]
                __print__(dbg.CONF, "config save", prefix+key, val)

        
        # Gtk callback to update ListStore when entries get edited
        def edited_player_row(self, cell, path, new_text, user_data=None, column=0):
            main.config_play[path][column] = new_text
        def edited_player_row_2(self, cell, path, new_text, user_data=None):
            self.edited_player_row(cell, path, new_text, column=1)
        def edited_record_row(self, cell, path, new_text, user_data=None, column=0):
            main.config_record[path][column] = new_text
        def edited_record_row_2(self, cell, path, new_text, user_data=None):
            self.edited_record_row(cell, path, new_text, column=1)


        # list of Gtk themes in dropdown
        def combobox_theme(self):
            # find themes
            themedirs = (conf.share+"/themes", conf.dir+"/themes", "/usr/share/themes")
            themes = ["no theme"]







|
|
|
|
|
<
<
<
<







793
794
795
796
797
798
799
800
801
802
803
804




805
806
807
808
809
810
811
                        config[key] = {}
                        for row in w:
                            if row[0] and row[1]:
                                config[key][row[0]] = row[1]
                __print__(dbg.CONF, "config save", prefix+key, val)

        
        # Generic Gtk callback to update ListStore when entries get edited
        def list_edit(self, liststore, path, column, new_text):
            liststore[path][column] = new_text
            # The signal_connect() dict actually prepares individual lambda functions
            # to bind the correct ListStore and column id.






        # list of Gtk themes in dropdown
        def combobox_theme(self):
            # find themes
            themedirs = (conf.share+"/themes", conf.dir+"/themes", "/usr/share/themes")
            themes = ["no theme"]