def test_enable(self): enable_errorhook(True) enable_errorhook(False) try: raise Exception except Exception: errorhook()
def __invoke(self, librarian, event, *args): args = list(args) if args and args[0]: if isinstance(args[0], dict): args[0] = SongWrapper(args[0]) elif isinstance(args[0], (set, list)): args[0] = ListWrapper(args[0]) for plugin in list(self.__plugins.values()): method_name = 'plugin_on_' + event.replace('-', '_') handler = getattr(plugin, method_name, None) def overridden(obj, name): return name in type(obj).__dict__ if overridden(plugin, method_name): try: handler(*args) except Exception: print_e("Error during %s on %s" % (method_name, type(plugin))) errorhook() if event not in ["removed", "changed"] and args: from quodlibet import app songs = args[0] if not isinstance(songs, (set, list)): songs = [songs] songs = filter(None, songs) check_wrapper_changed(librarian, app.window, songs)
def Menu(self, library, songs): songs = ListWrapper(songs) attrs = [ 'plugin_song', 'plugin_songs', 'plugin_album', 'plugin_albums' ] if len(songs) == 1: attrs.append('plugin_single_song') last = (songs and songs[-1]) or None for song in songs: if song.album_key != last.album_key: break last = song else: attrs.append('plugin_single_album') items = [] kinds = self.__plugins kinds.sort(key=lambda plugin: plugin.PLUGIN_ID) for Kind in kinds: usable = any(callable(getattr(Kind, s)) for s in attrs) if usable: try: items.append(Kind(songs, library)) except: print_e( "Couldn't initialise song plugin %s. Stack trace:" % Kind) errorhook() items = [i for i in items if i.initialized] if items: menu = Gtk.Menu() for item in items: try: menu.append(item) args = (library, songs) if item.get_submenu(): for subitem in item.get_submenu().get_children(): subitem.connect('activate', self.__on_activate, item, *args) else: item.connect('activate', self.__on_activate, item, *args) except: errorhook() item.destroy() menu.append(SeparatorMenuItem()) prefs = Gtk.MenuItem(label=_("Configure Plugins…")) prefs.connect("activate", lambda _: PluginWindow().show()) menu.append(prefs) else: menu = None return menu
def Menu(self, library, songs): songs = ListWrapper(songs) attrs = ['plugin_song', 'plugin_songs', 'plugin_album', 'plugin_albums'] if len(songs) == 1: attrs.append('plugin_single_song') last = (songs and songs[-1]) or None for song in songs: if song.album_key != last.album_key: break last = song else: attrs.append('plugin_single_album') items = [] kinds = self.__plugins kinds.sort(key=lambda plugin: plugin.PLUGIN_ID) for Kind in kinds: usable = any(callable(getattr(Kind, s)) for s in attrs) if usable: try: items.append(Kind(songs, library)) except: print_e("Couldn't initialise song plugin %s. Stack trace:" % Kind) errorhook() items = [i for i in items if i.initialized] if items: menu = Gtk.Menu() for item in items: try: menu.append(item) args = (library, songs) if item.get_submenu(): for subitem in item.get_submenu().get_children(): subitem.connect( 'activate', self.__on_activate, item, *args) else: item.connect( 'activate', self.__on_activate, item, *args) except: errorhook() item.destroy() menu.append(SeparatorMenuItem()) prefs = Gtk.MenuItem(label=_("Configure Plugins…")) prefs.connect("activate", lambda _: PluginWindow().show()) menu.append(prefs) else: menu = None return menu
def _save_to_file(self, song, text): lyricname = song.lyric_filename try: os.makedirs(os.path.dirname(lyricname), exist_ok=True) except EnvironmentError: errorhook() try: with open(lyricname, "w") as f: f.write(text) print_d("Saved lyrics to file (%s)" % lyricname) except EnvironmentError: errorhook()
def _save_to_file(self, song, text): lyricname = song.lyric_filename try: os.makedirs(os.path.dirname(lyricname), exist_ok=True) except EnvironmentError: errorhook() try: with open(lyricname, "wb") as f: f.write(text.encode("utf-8")) print_d("Saved lyrics to file (%s)" % lyricname) except EnvironmentError: errorhook()
def _save_to_file(self, song, text): lyric_fn = song.lyric_filename if not lyric_fn: print_w("No lyrics file to save to, ignoring.") return try: os.makedirs(os.path.dirname(lyric_fn), exist_ok=True) except EnvironmentError: errorhook() try: with open(lyric_fn, "wb") as f: f.write(text.encode("utf-8")) print_d(f"Saved lyrics to file {lyric_fn!r}") except EnvironmentError: errorhook()
def handle(self, plugin_id, library, parent, songs): """Start a song menu plugin directly without a menu""" parent = get_top_parent(parent) for plugin in self.__plugins: if plugin.PLUGIN_ID == plugin_id: songs = ListWrapper(songs) try: plugin = plugin(songs, library) except Exception: errorhook() else: self.__handle(plugin, plugin, library, songs, parent) return
def __refresh_plugins(self, handler, vbox, expander): instances = [] for Kind in handler.plugins: try: f = Kind() except: errorhook() continue else: instances.append(f) instances.sort() for child in vbox.get_children(): child.destroy() del self.__plugins[:] for f in instances: try: vbox.pack_start(f, True, True, 0) except: errorhook() f.destroy() continue try: f.connect('preview', lambda *x: self.emit('preview')) except: try: f.connect('changed', lambda *x: self.emit('changed')) except: errorhook() continue self.__plugins.append(f) vbox.show_all() # Don't display the expander if there aren't any plugins. if not self.__plugins: expander.set_expanded(False) expander.hide() else: expander.show()
def queue_run(): try: self.queue.run() except Exception: errorhook()
def __handle(self, item, plugin, library, songs, parent): if len(songs) == 0: return try: if len(songs) == 1 and callable(plugin.plugin_single_song): try: ret = plugin.plugin_single_song(songs[0]) except Exception: errorhook() else: if ret: return if callable(plugin.plugin_song): total = len(songs) if total > plugin.MAX_INVOCATIONS: if not self._confirm_multiple_songs( parent, plugin.PLUGIN_NAME, total): return try: ret = map(plugin.plugin_song, songs) except Exception: errorhook() else: if any(ret): return if callable(plugin.plugin_songs): try: ret = plugin.plugin_songs(songs) except Exception: errorhook() else: if ret: return if plugin.handles_albums: albums = self.__get_albums(songs) total = len(albums) if total > plugin.MAX_INVOCATIONS: if not self._confirm_multiple_albums( parent, plugin.PLUGIN_NAME, total): return if callable(plugin.plugin_single_album) and len(albums) == 1: try: ret = plugin.plugin_single_album(albums[0]) except Exception: errorhook() else: if ret: return if callable(plugin.plugin_album): try: ret = map(plugin.plugin_album, albums) except Exception: errorhook() else: if any(ret): return if callable(plugin.plugin_albums): try: ret = plugin.plugin_albums(albums) except Exception: errorhook() else: if ret: return finally: check_wrapper_changed(library, parent, filter(None, songs))