Added primitive playlist viewer (allows for deleting playlists)
[jamaendo] / jamaui / showplaylist.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 import cgi
26 try:
27     import hildon
28 except:
29     import helldon as hildon
30 import jamaendo
31 from player import Playlist
32 from playerwindow import open_playerwindow
33 from settings import settings
34 from postoffice import postoffice
35 import util
36 import logging
37 import thread
38 import gobject
39 from albumlist import TrackList
40 from fetcher import Fetcher
41
42 import webbrowser
43
44 log = logging.getLogger(__name__)
45
46 class ShowPlaylist(hildon.StackableWindow):
47     def __init__(self, plname, playlist):
48         hildon.StackableWindow.__init__(self)
49         self.set_title(plname)
50         self.playlist_name = plname
51         self.playlist = playlist
52         self.fetcher = None
53
54         self.connect('destroy', self.on_destroy)
55
56         top_hbox = gtk.HBox()
57         vbox1 = gtk.VBox()
58         self.cover = gtk.Image()
59         tmp = util.find_resource('album.png')
60         if tmp:
61             self.cover.set_from_file(tmp)
62
63         vbox2 = gtk.VBox()
64         self.trackarea = hildon.PannableArea()
65         self.tracks = TrackList(numbers=True)
66         self.tracks.connect('row-activated', self.row_activated)
67         self.tracklist = []
68
69         top_hbox.pack_start(vbox1, False)
70         top_hbox.pack_start(vbox2, True)
71         vbox1.pack_start(self.cover, True)
72         vbox2.pack_start(self.trackarea, True)
73         self.trackarea.add(self.tracks)
74
75         self.add(top_hbox)
76
77         postoffice.connect('album-cover', self, self.on_album_cover)
78         if len(self.playlist) > 0:
79             postoffice.notify('request-album-cover', int(self.playlist[0].album_id), 300)
80
81         self.create_menu()
82         self.start_track_fetcher()
83
84     def create_menu(self):
85         def on_player(*args):
86             from playerwindow import open_playerwindow
87             open_playerwindow()
88         self.menu = hildon.AppMenu()
89         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
90         player.set_label("Open player")
91         player.connect("clicked", on_player)
92         self.menu.append(player)
93         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
94         player.set_label("Delete playlist")
95         player.connect("clicked", self.on_delete_pl)
96         self.menu.append(player)
97         self.menu.show_all()
98         self.set_app_menu(self.menu)
99
100     def on_destroy(self, wnd):
101         postoffice.disconnect('album-cover', self)
102         if self.fetcher:
103             self.fetcher.stop()
104             self.fetcher = None
105
106     def start_track_fetcher(self):
107         if self.fetcher:
108             self.fetcher.stop()
109             self.fetcher = None
110         self.fetcher = Fetcher(lambda: self.playlist, self,
111                                on_item = self.on_track_result,
112                                on_ok = self.on_track_complete,
113                                on_fail = self.on_track_complete)
114         self.fetcher.start()
115
116     def on_track_result(self, wnd, item):
117         if wnd is self:
118             self.tracklist.append(item)
119             self.tracks.add_track(item)
120
121     def on_track_complete(self, wnd, error=None):
122         if wnd is self:
123             self.fetcher.stop()
124             self.fetcher = None
125
126     def on_delete_pl(self, btn):
127         note = hildon.hildon_note_new_confirmation(self, "Do you want to delete '%s' ?" % (self.playlist_name))
128         response = note.run()
129         note.destroy()
130         print response
131         if response == gtk.RESPONSE_OK:
132             settings.delete_playlist(self.playlist_name)
133             settings.save()
134             self.destroy()
135
136     def on_album_cover(self, albumid, size, cover):
137         if size == 300:
138             self.cover.set_from_file(cover)
139
140     def on_play(self, btn):
141         self.open_item(self.album)
142
143     def row_activated(self, treeview, path, view_column):
144         # TODO: wait for all tracks to load
145         _id = self.tracks.get_track_id(path)
146         pl = Playlist(self.playlist)
147         pl.jump_to(_id)
148         wnd = open_playerwindow()
149         wnd.show_all()
150         wnd.play_tracks(pl)
151
152     def open_item(self, item):
153         if isinstance(item, jamaendo.Album):
154             tracks = jamaendo.get_tracks(item.ID)
155             if tracks:
156                 wnd = open_playerwindow()
157                 wnd.play_tracks(tracks)
158         elif isinstance(item, jamaendo.Artist):
159             from showartist import ShowArtist
160             wnd = ShowArtist(item)
161             wnd.show_all()
162         elif isinstance(item, jamaendo.Track):
163             wnd = open_playerwindow()
164             wnd.play_tracks([item])