def play(self): row = self.row() if row and "url" in row: # playlist and audio type audioformat = row.get("format", self.audioformat) listformat = row.get("listformat", self.listformat) # invoke audio player action.play(row, audioformat, listformat) elif row.get("homepage") and row.get("format") == "text/html": action.browser(row["homepage"]) else: self.status("No station selected for playing.") return row
def play(self): row = self.row() rx_sound = re.compile("""(http://[^"<>]+[.](mp3|ogg|m3u|pls|ram))""") html = ahttp.get(row["homepage"]) # look up ANY audio url for uu in rx_sound.findall(html): log.DATA(uu) (url, fmt) = uu row["url"] = url action.play(row, mime_fmt(fmt), "srv") return # or just open webpage action.browser(row["homepage"])
def __init__(self): # Load stylesheet, instantiate GtkBuilder in self, menu and logo hooks gui_startup(1/20.0), gtk.Builder.__init__(self) gui_startup(1/20.0), gtk.Builder.add_from_string(self, ui_xml) gui_startup(3/20.0), self.logo_scale(1.0) # initialize built-in plugins self.channels = { "bookmarks": channels.bookmarks.bookmarks(parent=self), # this the remaining built-in channel } # dialogs that are connected to main self.features = { "search": channels.search.search(self), "configwin": channels.configwin.configwin(self), "streamedit": channels.streamedit.streamedit(self), } gui_startup(4/20.0) # early module coupling action.main = self # action (play/record) module needs a reference to main window for gtk interaction and some URL/URI callbacks ahttp.feedback = self.status # http module gives status feedbacks too # load plugins self.load_plugin_channels() # restore app/widget states self.init_app_state() # and late plugin initializations [callback(self) for callback in self.hooks["init"]] # display current open channel/notebook tab gui_startup(18/20.0) self.current_channel = self.current_channel_gtk() try: self.channel().first_show() except Exception as e: log.INIT("main.__init__: current_channel.first_show() initialization error:", e) # bind gtk/glade event names to functions gui_startup(19.75/20.0) self.connect_signals({ "gtk_main_quit" : self.gtk_main_quit, # close window # treeviews / notebook "on_stream_row_activated" : self.on_play_clicked, # double click in a streams list "on_category_clicked": self.on_category_clicked, # new selection in category list "on_notebook_channels_switch_page": self.channel_switch, # channel notebook tab changed "station_context_menu": lambda tv,ev: self.station_context_menu(tv,ev), # toolbar "on_play_clicked" : self.on_play_clicked, "on_record_clicked": self.on_record_clicked, "on_homepage_stream_clicked": self.on_homepage_stream_clicked, "on_reload_clicked": self.on_reload_clicked, "on_homepage_channel_clicked" : self.on_homepage_channel_clicked, "double_click_channel_tab": self.on_homepage_channel_clicked, # menu "menu_toolbar_standard": lambda w: (self.toolbar.unset_style(), self.toolbar.unset_icon_size()), "menu_toolbar_style_icons": lambda w: (self.toolbar.set_style(gtk.TOOLBAR_ICONS)), "menu_toolbar_style_both": lambda w: (self.toolbar.set_style(gtk.TOOLBAR_BOTH)), "menu_toolbar_size_small": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_SMALL_TOOLBAR), self.logo_scale(0.40)), "menu_toolbar_size_medium": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DND), self.logo_scale(0.75)), "menu_toolbar_size_large": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DIALOG), self.logo_scale(1.0)), "menu_notebook_pos_top": lambda w: self.notebook_channels.set_tab_pos(2), "menu_notebook_pos_left": lambda w: self.notebook_channels.set_tab_pos(0), "menu_notebook_pos_right": lambda w: self.notebook_channels.set_tab_pos(1), "menu_notebook_pos_bottom": lambda w: self.notebook_channels.set_tab_pos(3), # win_config "menu_properties": self.configwin.open, "config_cancel": self.configwin.hide, "config_save": self.configwin.save, "config_play_list_edit_col0": (uikit.liststore_edit, (self.config_play, 0)), "config_play_list_edit_col1": (uikit.liststore_edit, (self.config_play, 1)), "config_record_list_edit_col0": (uikit.liststore_edit, (self.config_record, 0)), "config_record_list_edit_col1": (uikit.liststore_edit, (self.config_record, 1)), # else "update_categories": self.update_categories, "update_favicons": self.update_favicons, "app_state": self.save_app_state, "bookmark": self.bookmark, "save_as": self.save_as, "menu_about": lambda w: AboutStreamtuner2(self), "menu_help": action.help, "menu_onlineforum": lambda w: action.browser("http://sourceforge.net/projects/streamtuner2/forums/forum/1173108"), "menu_fossilwiki": lambda w: action.browser("http://fossil.include-once.org/streamtuner2/"), "menu_projhomepage": lambda w: action.browser("http://milki.include-once.org/streamtuner2/"), # "menu_bugreport": lambda w: BugReport(), "menu_copy": self.menu_copy, "delete_entry": self.delete_entry, # search dialog "quicksearch_set": self.search.quicksearch_set, "search_open": self.search.menu_search, "search_go": self.search.cache_search, "search_srv": lambda *w: self.thread(lambda: self.search.server_search(None)), "search_cancel": self.search.cancel, "true": lambda w,*args: True, # win_streamedit "streamedit_open": self.streamedit.open, "streamedit_save": self.streamedit.save, "streamedit_new": self.streamedit.new, "streamedit_cancel": self.streamedit.cancel, }) # actually display main window if conf.window_title: self.update_title() self.win_streamtuner2.show_all() gui_startup(100.0)
def on_homepage_channel_clicked(self, widget, event=2): if event == 2 or event.type == gtk.gdk._2BUTTON_PRESS: log.UI("dblclick") url = self.channel().meta.get("url", "https://duckduckgo.com/?q=" + self.channel().module) action.browser(url)
def on_homepage_stream_clicked(self, widget): url = self.selected("homepage") if url and len(url): action.browser(url) else: self.status("No homepage URL present.")