Updated website
[jamaendo] / jamaui / featured.py
1 #!/usr/bin/env python
2 #
3 # This file is part of Jamaendo.
4 # Copyright (c) 2010 Kristoffer Gronlund
5 #
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.
10 #
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.
15 #
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/>.
18 #
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)
23 #
24 import gtk
25 try:
26     import hildon
27 except:
28     import helldon as hildon
29 import jamaendo
30 from playerwindow import open_playerwindow
31 from showartist import ShowArtist
32 from showalbum import ShowAlbum
33 from albumlist import MusicList
34 from player import Playlist
35 from fetcher import Fetcher
36 import logging
37
38 log = logging.getLogger(__name__)
39
40 def _alist(l, match):
41     for key, value in l:
42         if key == match:
43             return value
44     return None
45
46 class FeaturedWindow(hildon.StackableWindow):
47     features = (
48         ("New releases",jamaendo.new_releases),
49         ("Top albums today", lambda: jamaendo.top_albums(order='ratingday_desc')),
50         ("Top tracks today", lambda: jamaendo.top_tracks(order='ratingday_desc')),
51         ("Albums of the week",jamaendo.albums_of_the_week),
52         ("Tracks of the week",jamaendo.tracks_of_the_week),
53         ("Top 50 tags", lambda: jamaendo.top_tags(count=50)),
54         ("Top 50 artists", lambda: jamaendo.top_artists(count=50)),
55         ("Top 50 albums", lambda: jamaendo.top_albums(count=50)),
56         ("Top 50 tracks", lambda: jamaendo.top_tracks(count=50)),
57         )
58
59     def __init__(self, feature):
60         hildon.StackableWindow.__init__(self)
61         self.set_title(feature)
62
63         self.fetcher = None
64         self.connect('destroy', self.on_destroy)
65         self.featurefn = _alist(self.features, feature)
66
67         # Results list
68         self.panarea = hildon.PannableArea()
69         self.musiclist = MusicList()
70         self.musiclist.connect('row-activated', self.row_activated)
71         self.panarea.add(self.musiclist)
72
73         self.idmap = {}
74         self.items = []
75
76         self.add(self.panarea)
77
78         self.create_menu()
79
80         self.start_feature_fetcher()
81
82     def start_feature_fetcher(self):
83         if self.fetcher:
84             self.fetcher.stop()
85             self.fetcher = None
86         self.fetcher = Fetcher(self.featurefn, self,
87                                on_item = self.on_feature_result,
88                                on_ok = self.on_feature_complete,
89                                on_fail = self.on_feature_complete)
90         self.fetcher.start()
91
92     def on_feature_result(self, wnd, item):
93         if wnd is self:
94             self.musiclist.add_items([item])
95             self.idmap[item.ID] = item
96             self.items.append(item)
97
98     def on_feature_complete(self, wnd, error=None):
99         if wnd is self:
100             self.fetcher.stop()
101             self.fetcher = None
102
103     def create_menu(self):
104         def on_player(*args):
105             from playerwindow import open_playerwindow
106             open_playerwindow()
107         self.menu = hildon.AppMenu()
108         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
109         player.set_label("Open player")
110         player.connect("clicked", on_player)
111         self.menu.append(player)
112         self.menu.show_all()
113         self.set_app_menu(self.menu)
114
115     def on_destroy(self, wnd):
116         if self.fetcher:
117             self.fetcher.stop()
118             self.fetcher = None
119
120     def row_activated(self, treeview, path, view_column):
121         _id = self.musiclist.get_item_id(path)
122         item = self.idmap[_id]
123         self.open_item(item)
124
125     def open_item(self, item):
126         if isinstance(item, jamaendo.Album):
127             wnd = ShowAlbum(item)
128             wnd.show_all()
129         elif isinstance(item, jamaendo.Artist):
130             wnd = ShowArtist(item)
131             wnd.show_all()
132         elif isinstance(item, jamaendo.Track):
133             playlist = Playlist(self.items)
134             playlist.jump_to(item.ID)
135             wnd = open_playerwindow()
136             wnd.play_tracks(playlist)
137         elif isinstance(item, jamaendo.Tag):
138             self.start_tag_fetcher(item.ID)
139
140     def start_tag_fetcher(self, item_id):
141         if self.fetcher:
142             self.fetcher.stop()
143             self.fetcher = None
144         self.fetcher = Fetcher(lambda: jamaendo.get_tag_tracks(item_id),
145                                self,
146                                on_item = self.on_tag_result,
147                                on_ok = self.on_tag_complete,
148                                on_fail = self.on_tag_complete)
149         self.fetcher.taglist = []
150         self.fetcher.start()
151
152     def on_tag_result(self, wnd, item):
153         if wnd is self and hasattr(self.fetcher, 'taglist'):
154             self.fetcher.taglist.append(item)
155
156     def on_tag_complete(self, wnd, error=None):
157         if wnd is self:
158             self.fetcher.stop()
159             if error is not None and hasattr(self.fetcher, 'taglist'):
160                 wnd = open_playerwindow()
161                 wnd.play_tracks(self.fetcher.taglist)
162             self.fetcher = None
163