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: |
af5ae3f5befe7538a863a667e1a5080d |
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 | # limit number of entries max = int(conf.history) while max > 0 and len(hist) > max: hist.pop() # update store self.bm.save() | | | | 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 | 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)) | > | > > | 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 | <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"> | | | | < < < < < < < < < < < < < < < < < < < | > > > < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < > > > > > > > > > > > > > > > > > > > < | < < < < < < | 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"><b>Recording</b> 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 <a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">placeholders</a> such as <b>%pls</b> for Shoutcast playlists, or pass <b>%m3u</b> for players that expect mp3 playlist files, and <b>%srv</b> 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 | <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> | < > < > | | | 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 | <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> | < > | 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 | </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"> | | | 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 | <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"> | | | < < < < < < < < < < < < < < < < < < < | > > > < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < > > > > > > > > > > > > > > > > > > > < | < < < < < < | 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"><b>Recording</b> 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 <a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">placeholders</a> such as <b>%pls</b> for Shoutcast playlists, or pass <b>%m3u</b> for players that expect mp3 playlist files, and <b>%srv</b> 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 | <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"/> | < > < > | | | 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 | <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"/> | < > | 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 | #!/usr/bin/env python # encoding: UTF-8 # api: python # type: application # title: streamtuner2 | | | 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 | import ahttp import action # needs workaround... (action.main=main) import channels from channels import * import favicon | | | 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 | "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, | | | | | < | 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 | self.channel().play(row) [hook(row) for hook in self.hooks["play"]] # streamripper def on_record_clicked(self, widget): row = self.row() | | | 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 | 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) | | | | | | < < < < | 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"] |
︙ | ︙ |