From defa7f2aeca647de69c19485679703004a6290b3 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Sat, 8 Aug 2020 13:31:33 +0200 Subject: [PATCH] moved LyricsWindow to playlist code --- bin/mpdevil.py | 208 ++++++++++++++++++++++++------------------------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/bin/mpdevil.py b/bin/mpdevil.py index c5198d1..06609ff 100644 --- a/bin/mpdevil.py +++ b/bin/mpdevil.py @@ -1148,110 +1148,6 @@ class SearchWindow(Gtk.Box): def on_open_clicked(self, *args): self.client.wrapped_call("files_to_playlist", self.songs_view.get_files(), False) -class LyricsWindow(Gtk.Overlay): - def __init__(self, client, settings): - Gtk.Overlay.__init__(self) - - # adding vars - self.settings=settings - self.client=client - - # widgets - self.text_view=Gtk.TextView() - self.text_view.set_editable(False) - self.text_view.set_left_margin(5) - self.text_view.set_bottom_margin(5) - self.text_view.set_cursor_visible(False) - self.text_view.set_wrap_mode(Gtk.WrapMode.WORD) - self.text_view.set_justification(Gtk.Justification.CENTER) - self.text_buffer=self.text_view.get_buffer() - - # scroll - self.scroll=Gtk.ScrolledWindow() - self.scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self.scroll.add(self.text_view) - - # frame - frame=FocusFrame() - frame.set_widget(self.text_view) - style_context=frame.get_style_context() - provider=Gtk.CssProvider() - css=b"""* {border: 0px; background-color: @theme_base_color; opacity: 0.9;}""" - provider.load_from_data(css) - style_context.add_provider(provider, 800) - - # close button - close_button=Gtk.ToggleButton(image=Gtk.Image.new_from_icon_name("window-close-symbolic", Gtk.IconSize.BUTTON)) - close_button.set_margin_top(6) - close_button.set_margin_end(6) - style_context=close_button.get_style_context() - style_context.add_class("circular") - - close_button.set_halign(2) - close_button.set_valign(1) - - # connect - self.song_changed=self.client.emitter.connect("current_song_changed", self.refresh) - self.connect("destroy", self.remove_handlers) - close_button.connect("clicked", self.on_close_button_clicked) - - # packing - frame.add(self.scroll) - self.add(frame) - self.add_overlay(close_button) - - self.show_all() - self.refresh() - GLib.idle_add(self.text_view.grab_focus) # focus textview - - def remove_handlers(self, *args): - self.client.emitter.disconnect(self.song_changed) - - def display_lyrics(self, current_song): - GLib.idle_add(self.text_buffer.set_text, _("searching..."), -1) - try: - text=self.getLyrics(current_song["artist"], current_song["title"]) - except: - text=_("lyrics not found") - GLib.idle_add(self.text_buffer.set_text, text, -1) - - def refresh(self, *args): - update_thread=threading.Thread(target=self.display_lyrics, kwargs={"current_song": ClientHelper.song_to_first_str_dict(self.client.wrapped_call("currentsong"))}, daemon=True) - update_thread.start() - - def getLyrics(self, singer, song): # partially copied from PyLyrics 1.1.0 - # Replace spaces with _ - singer=singer.replace(' ', '_') - song=song.replace(' ', '_') - r=requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song)) - s=BeautifulSoup(r.text) - # Get main lyrics holder - lyrics=s.find("div",{'class':'lyricbox'}) - if lyrics is None: - raise ValueError("Song or Singer does not exist or the API does not have Lyrics") - return None - # Remove Scripts - [s.extract() for s in lyrics('script')] - # Remove Comments - comments=lyrics.findAll(text=lambda text:isinstance(text, Comment)) - [comment.extract() for comment in comments] - # Remove span tag (Needed for instrumantal) - if not lyrics.span == None: - lyrics.span.extract() - # Remove unecessary tags - for tag in ['div','i','b','a']: - for match in lyrics.findAll(tag): - match.replaceWithChildren() - # Get output as a string and remove non unicode characters and replace
with newlines - output=str(lyrics).encode('utf-8', errors='replace')[22:-6:].decode("utf-8").replace('\n','').replace('
','\n') - try: - return output - except: - return output.encode('utf-8') - - def on_close_button_clicked(self, *args): - self.destroy() - class SongsView(Gtk.TreeView): def __init__(self, client, store, file_column_id): Gtk.TreeView.__init__(self) @@ -1979,6 +1875,110 @@ class Browser(Gtk.Paned): # playlist and cover # ###################### +class LyricsWindow(Gtk.Overlay): + def __init__(self, client, settings): + Gtk.Overlay.__init__(self) + + # adding vars + self.settings=settings + self.client=client + + # widgets + self.text_view=Gtk.TextView() + self.text_view.set_editable(False) + self.text_view.set_left_margin(5) + self.text_view.set_bottom_margin(5) + self.text_view.set_cursor_visible(False) + self.text_view.set_wrap_mode(Gtk.WrapMode.WORD) + self.text_view.set_justification(Gtk.Justification.CENTER) + self.text_buffer=self.text_view.get_buffer() + + # scroll + self.scroll=Gtk.ScrolledWindow() + self.scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self.scroll.add(self.text_view) + + # frame + frame=FocusFrame() + frame.set_widget(self.text_view) + style_context=frame.get_style_context() + provider=Gtk.CssProvider() + css=b"""* {border: 0px; background-color: @theme_base_color; opacity: 0.9;}""" + provider.load_from_data(css) + style_context.add_provider(provider, 800) + + # close button + close_button=Gtk.ToggleButton(image=Gtk.Image.new_from_icon_name("window-close-symbolic", Gtk.IconSize.BUTTON)) + close_button.set_margin_top(6) + close_button.set_margin_end(6) + style_context=close_button.get_style_context() + style_context.add_class("circular") + + close_button.set_halign(2) + close_button.set_valign(1) + + # connect + self.song_changed=self.client.emitter.connect("current_song_changed", self.refresh) + self.connect("destroy", self.remove_handlers) + close_button.connect("clicked", self.on_close_button_clicked) + + # packing + frame.add(self.scroll) + self.add(frame) + self.add_overlay(close_button) + + self.show_all() + self.refresh() + GLib.idle_add(self.text_view.grab_focus) # focus textview + + def remove_handlers(self, *args): + self.client.emitter.disconnect(self.song_changed) + + def display_lyrics(self, current_song): + GLib.idle_add(self.text_buffer.set_text, _("searching..."), -1) + try: + text=self.getLyrics(current_song["artist"], current_song["title"]) + except: + text=_("lyrics not found") + GLib.idle_add(self.text_buffer.set_text, text, -1) + + def refresh(self, *args): + update_thread=threading.Thread(target=self.display_lyrics, kwargs={"current_song": ClientHelper.song_to_first_str_dict(self.client.wrapped_call("currentsong"))}, daemon=True) + update_thread.start() + + def getLyrics(self, singer, song): # partially copied from PyLyrics 1.1.0 + # Replace spaces with _ + singer=singer.replace(' ', '_') + song=song.replace(' ', '_') + r=requests.get('http://lyrics.wikia.com/{0}:{1}'.format(singer,song)) + s=BeautifulSoup(r.text) + # Get main lyrics holder + lyrics=s.find("div",{'class':'lyricbox'}) + if lyrics is None: + raise ValueError("Song or Singer does not exist or the API does not have Lyrics") + return None + # Remove Scripts + [s.extract() for s in lyrics('script')] + # Remove Comments + comments=lyrics.findAll(text=lambda text:isinstance(text, Comment)) + [comment.extract() for comment in comments] + # Remove span tag (Needed for instrumantal) + if not lyrics.span == None: + lyrics.span.extract() + # Remove unecessary tags + for tag in ['div','i','b','a']: + for match in lyrics.findAll(tag): + match.replaceWithChildren() + # Get output as a string and remove non unicode characters and replace
with newlines + output=str(lyrics).encode('utf-8', errors='replace')[22:-6:].decode("utf-8").replace('\n','').replace('
','\n') + try: + return output + except: + return output.encode('utf-8') + + def on_close_button_clicked(self, *args): + self.destroy() + class AudioType(Gtk.Label): def __init__(self, client): Gtk.Label.__init__(self)