#!/usr/bin/python # # Copyright 2008 Joshua Honeycutt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk from commands import getstatusoutput from subprocess import * import webbrowser import LyricWiki_client soap = LyricWiki_client.LyricWikiBindingSOAP("http://lyricwiki.org/server.php") song = LyricWiki_client.getSongRequest() class lyricwiki_toy: artist = u'' title = u'' lw_url = u'' lyrics = u'' def get_song(self, set_artist, set_title): """Fetches song from lyricwiki (resets vars to what lyricwiki thinks is right)""" song.Artist = set_artist song.Song = set_title result = soap.getSong(song) self.artist = result.Return.Artist self.title = result.Return.Song self.lyrics = result.Return.Lyrics self.lw_url = result.Return.Url def put_song(): """Modifies or adds song lyrics""" return def delete_event(self, widget, event, data=None): return False def destroy(self, widget, data=None): gtk.main_quit() def refresh(self, widget): if getstatusoutput("which rhythmbox-client")[0] == 0: song_string = Popen(["rhythmbox-client", "--no-start", "--print-playing-format", "%ta---%tt"], stdout=PIPE).communicate()[0].rstrip() song_string = song_string.split("---") if song_string[0] != "Not playing" and song_string[0] != "": current_artist = song_string[0] current_title = song_string[1] self.get_song(current_artist, current_title) self.artist_entry.set_text(self.artist) self.title_entry.set_text(self.title) self.textbuffer.set_text(self.lyrics) start = self.textbuffer.get_iter_at_line(0) self.textview.scroll_to_iter(start, 0, False) else: rb_dialog = gtk.Dialog("LyricWiki Toy", self.window, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT|gtk.DIALOG_NO_SEPARATOR) button = rb_dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_DELETE_EVENT) label = gtk.Label('rhythmbox-client was not found.') label.set_use_markup(True) rb_dialog.vbox.pack_start(label, True, True, 0) label.show() rb_dialog.run() rb_dialog.destroy() def new_song(self, widget): self.get_song(self.artist_entry.get_text(), self.title_entry.get_text()) self.textbuffer.set_text(self.lyrics) self.artist_entry.set_text(self.artist) self.title_entry.set_text(self.title) start = self.textbuffer.get_iter_at_line(0) self.textview.scroll_to_iter(start, 0, False) def clear_entry(self, widget, entry): entry.set_text("") return def url_open(self, widget): webbrowser.open(self.lw_url) return def save(): #self.soap.checkSongExists(): move this to external function #if it does give dialog to update lyrics #else give dialog to add new lyrics return def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.window.set_border_width(3) self.window.set_default_size(350,500) self.window.set_resizable(True) self.window.set_title("LyricWiki Toy") # Artist Entry Row artist_label = gtk.Label("Artist:") artist_label.set_alignment(0.0, 0.5) clear_artist = gtk.Button ("", None, True) clear_artist_image = gtk.Image() clear_artist_image.set_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) clear_artist.set_image(clear_artist_image) clear_artist.set_tooltip_text("Clear Artist field") self.artist_entry = gtk.Entry() self.artist_entry.connect("activate", self.new_song) clear_artist.connect("clicked", self.clear_entry, self.artist_entry) # Song Title Entry Row title_label = gtk.Label("Title:") title_label.set_alignment(0.0, 0.5) clear_title = gtk.Button ("", None, True) clear_title_image = gtk.Image() clear_title_image.set_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) clear_title.set_image(clear_title_image) clear_title.set_tooltip_text("Clear Title field") self.title_entry = gtk.Entry() self.title_entry.connect("activate", self.new_song) clear_title.connect("clicked", self.clear_entry, self.title_entry) # Entries Table table = gtk.Table(2, 3, False) table.set_row_spacings(3) table.set_col_spacings(12) table.attach(artist_label, 0, 1, 0, 1, gtk.FILL|gtk.SHRINK, gtk.SHRINK) table.attach(self.artist_entry, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, gtk.SHRINK) table.attach(clear_artist, 2, 3, 0, 1, gtk.FILL|gtk.SHRINK, gtk.SHRINK) table.attach(title_label, 0, 1, 1, 2, gtk.FILL|gtk.SHRINK, gtk.SHRINK) table.attach(self.title_entry, 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.SHRINK) table.attach(clear_title, 2, 3, 1, 2, gtk.FILL|gtk.SHRINK, gtk.SHRINK) # Lyrics Holder sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) self.textbuffer = gtk.TextBuffer(table=None) self.textview = gtk.TextView(buffer=self.textbuffer) self.textview.set_editable(True) self.textview.set_wrap_mode(gtk.WRAP_WORD) self.textview.set_left_margin(6) self.textview.set_justification(gtk.JUSTIFY_LEFT) sw.add(self.textview) # Bottom Buttons lw_page = gtk.Button("Lyrics Page", None, True) lw_page_image = gtk.Image() lw_page_image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_BUTTON) lw_page.set_image(lw_page_image) lw_page.connect("clicked", self.url_open) #self.save = gtk.Button("Save to LyricWiki", None, True) refresh = gtk.Button("Current Song", None, True) refresh_image = gtk.Image() refresh_image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_BUTTON) refresh.set_image(refresh_image) refresh.connect("clicked", self.refresh) edit_box = gtk.HBox(False, 3) #edit_box.pack_start(self.save, True, True, 3) edit_box.pack_start(lw_page, True, True, 3) edit_box.pack_start(refresh, True, True, 3) # Pack main window and display vbox = gtk.VBox(False, 6) vbox.pack_start(table, False, False, 3) vbox.pack_start(sw, True, True, 0) vbox.pack_start(edit_box, False, False, 3) self.window.add(vbox) self.window.show_all() self.refresh(self) def main(self): gtk.main() if __name__ == "__main__": lyricwiki_toy().main()