3 # This file is part of Jamaendo.
4 # Copyright (c) 2010 Kristoffer Gronlund
6 # Jamaendo is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # Jamaendo is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with Jamaendo. If not, see <http://www.gnu.org/licenses/>.
19 # Player code heavily based on http://thpinfo.com/2008/panucci/:
20 # A resuming media player for Podcasts and Audiobooks
21 # Copyright (c) 2008-05-26 Thomas Perl <thpinfo.com>
22 # (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html)
24 # Jamaendo jamendo.com API wrapper licensed under the New BSD License;
25 # see module for details.
33 from settings import settings
37 gobject.threads_init()
39 log = logging.getLogger(__name__)
46 if util.platform == 'maemo':
47 log.critical('Using GTK widgets, install "python2.5-hildon" '
48 'for this to work properly.')
50 log.critical('This ui only works in maemo')
53 from dbus.mainloop.glib import DBusGMainLoop
55 DBusGMainLoop(set_as_default=True)
59 from postoffice import postoffice
60 from playerwindow import open_playerwindow
61 from search import SearchWindow
62 from featured import FeaturedWindow
63 from radios import RadiosWindow
64 from favorites import FavoritesWindow
66 class PlaylistsWindow(hildon.StackableWindow):
68 hildon.StackableWindow.__init__(self)
69 self.set_title("Playlists")
71 label = gtk.Label("Playlists")
72 vbox = gtk.VBox(False, 0)
73 vbox.pack_start(label, True, True, 0)
82 def create_window(self):
83 log.debug("Creating main window...")
84 self.app = hildon.Program()
85 self.window = hildon.StackableWindow()
86 self.app.add_window(self.window)
88 self.window.set_title("jamaendo")
90 self.window.connect("destroy", self.destroy)
92 self.CONFDIR = os.path.expanduser('~/MyDocs/.jamaendo')
93 jamaendo.set_cache_dir(self.CONFDIR)
94 settings.set_filename(os.path.join(self.CONFDIR, 'ui_settings'))
97 postoffice.connect('request-album-cover', self, self.on_request_cover)
98 log.debug("Created main window.")
100 def save_settings(self):
103 def create_menu(self):
104 self.menu = hildon.AppMenu()
106 #search = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
107 #search.set_label("Search")
108 #search.connect("clicked", self.on_search)
109 #self.menu.append(search)
111 player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
112 player.set_label("Open player")
113 player.connect("clicked", self.on_player)
114 self.menu.append(player)
116 player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
117 player.set_label("Favorites")
118 player.connect("clicked", self.on_favorites)
119 self.menu.append(player)
121 #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
122 #player.set_label("Playlists")
123 #player.connect("clicked", self.on_playlists)
124 #self.menu.append(player)
126 player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
127 player.set_label("Settings")
128 player.connect("clicked", self.on_settings)
129 self.menu.append(player)
132 # Don't use localdb ATM
133 #refresh = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
134 #refresh.set_label("Refresh")
135 #refresh.connect("clicked", self.on_refresh)
136 #self.menu.append(refresh)
138 menu_about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
139 menu_about.set_label("About")
140 menu_about.connect("clicked", self.show_about, self.window)
141 self.menu.append(menu_about)
142 gtk.about_dialog_set_url_hook(self.open_link, None)
145 self.window.set_app_menu(self.menu)
148 def setup_widgets(self):
149 bgimg = util.find_resource('bg.png')
151 background, mask = gtk.gdk.pixbuf_new_from_file(bgimg).render_pixmap_and_mask()
152 self.window.realize()
153 self.window.window.set_back_pixmap(background, False)
155 bbox = gtk.HButtonBox()
156 alignment = gtk.Alignment(xalign=0.2, yalign=0.925, xscale=1.0)
158 bbox.set_property('layout-style', gtk.BUTTONBOX_SPREAD)
160 self.window.add(alignment)
162 self.add_mainscreen_button("Featured", "Most listened to", self.on_featured)
163 self.add_mainscreen_button("Radios", "The best in free music", self.on_radios)
164 self.add_mainscreen_button("Search", "Search for artists/albums", self.on_search)
166 self.window.show_all()
168 def add_mainscreen_button(self, title, subtitle, callback):
169 btn = hildon.Button(gtk.HILDON_SIZE_THUMB_HEIGHT,
170 hildon.BUTTON_ARRANGEMENT_VERTICAL)
171 btn.set_text(title, subtitle)
172 btn.set_property('width-request', 225)
173 btn.connect('clicked', callback)
176 def on_request_cover(self, albumid, size):
177 jamaendo.get_album_cover_async(self.got_album_cover, int(albumid), size)
179 def got_album_cover(self, albumid, size, cover):
180 postoffice.notify('album-cover', albumid, size, cover)
182 #def add_featured_button(self):
183 # self.featured_sel = hildon.TouchSelector(text=True)
184 # self.featured_sel.append_text("Albums of the week")
185 # self.featured_sel.append_text("Tracks of the week")
186 # self.featured_sel.append_text("New releases")
187 # btn = hildon.PickerButton(gtk.HILDON_SIZE_THUMB_HEIGHT,
188 # hildon.BUTTON_ARRANGEMENT_VERTICAL)
189 # btn.set_text("Featured", "Most listened to")
190 # btn.set_property('width-request', 225)
191 # btn.set_selector(self.featured_sel)
192 # self.featured_btn = btn
195 def destroy(self, widget):
196 postoffice.disconnect('request-album-cover', self)
200 def show_about(self, w, win):
201 dialog = gtk.AboutDialog()
202 dialog.set_program_name("jamaendo")
203 dialog.set_website("http://jamaendo.garage.maemo.org/")
204 dialog.set_website_label("http://jamaendo.garage.maemo.org/")
205 dialog.set_version(VERSION)
206 dialog.set_license("""Copyright (c) 2010, Kristoffer Gronlund
209 Redistribution and use in source and binary forms, with or without
210 modification, are permitted provided that the following conditions are met:
211 * Redistributions of source code must retain the above copyright
212 notice, this list of conditions and the following disclaimer.
213 * Redistributions in binary form must reproduce the above copyright
214 notice, this list of conditions and the following disclaimer in the
215 documentation and/or other materials provided with the distribution.
216 * Neither the name of Jamaendo nor the
217 names of its contributors may be used to endorse or promote products
218 derived from this software without specific prior written permission.
220 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
221 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
222 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
223 DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
224 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
225 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
226 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
227 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
229 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
231 dialog.set_authors(("Kristoffer Gronlund <kristoffer.gronlund@purplescout.se>",
232 "Based on Panucci, written by Thomas Perl <thpinfo.com>"))
233 dialog.set_comments("""Jamaendo plays music from the music catalog of JAMENDO.
235 JAMENDO is an online platform that distributes musical works under Creative Commons licenses.""")
236 gtk.about_dialog_set_email_hook(self.open_link, dialog)
237 gtk.about_dialog_set_url_hook(self.open_link, dialog)
238 dialog.connect( 'response', lambda dlg, response: dlg.destroy())
239 for parent in dialog.vbox.get_children():
240 for child in parent.get_children():
241 if isinstance(child, gtk.Label):
242 child.set_selectable(False)
243 child.set_alignment(0.0, 0.5)
247 def open_link(self, d, url, data):
248 #print "url: %s" % (url)
250 webbrowser.open_new(url)
253 #def on_refresh(self, button):
254 # dialog = RefreshDialog()
259 def on_featured(self, button):
260 dialog = hildon.PickerDialog(self.window)
261 sel = hildon.TouchSelector(text=True)
262 for feature, _ in FeaturedWindow.features:
263 sel.append_text(feature)
264 dialog.set_selector(sel)
265 dialog.set_title("Featured")
266 if dialog.run() == gtk.RESPONSE_OK:
267 txt = sel.get_current_text()
268 self.featuredwnd = FeaturedWindow(txt)
269 self.featuredwnd.show_all()
272 def on_radios(self, button):
273 self.radioswnd = RadiosWindow()
274 self.radioswnd.show_all()
276 def on_search(self, button):
277 self.searchwnd = SearchWindow()
278 self.searchwnd.show_all()
280 def on_playlists(self, button):
281 self.playlistswnd = PlaylistsWindow()
282 self.playlistswnd.show_all()
284 def on_settings(self, button):
285 dialog = gtk.Dialog()
286 dialog.set_title("Settings")
287 dialog.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK )
289 tbl = gtk.Table(1, 2)
290 tbl.attach(gtk.Label("Username:"), 0, 1, 0, 1)
291 entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
292 entry.set_placeholder("jamendo.com username")
294 entry.set_text(settings.user)
295 tbl.attach(entry, 1, 2, 0, 1)
296 vbox.pack_start(tbl, True, True, 2)
298 result = dialog.run()
299 val = entry.get_text()
302 if val and result == gtk.RESPONSE_OK:
303 #print "new user name:", val
308 def on_favorites(self, button):
309 self.favoriteswnd = FavoritesWindow()
310 self.favoriteswnd.show_all()
312 def on_player(self, button):
316 def on_search(self, button):
318 self.searchbar.show()
320 self.searchstore = gtk.ListStore(gobject.TYPE_STRING)
321 iter = self.searchstore.append()
322 self.searchstore.set(iter, 0, "Test1")
323 iter = self.searchstore.append()
324 self.searchstore.set(iter, 0, "Test2")
325 self.searchbar = hildon.FindToolbar("Search", self.searchstore, 0)
326 self.searchbar.set_active(0)
327 self.window.add_toolbar(self.searchbar)
328 self.searchbar.show()
332 ossohelper.application_init('org.jamaendo', '0.1')
336 self.window.show_all()
338 ossohelper.application_exit()
340 if __name__=="__main__":