clAlbumLayout.py

00001 #!/usr/bin/env python
00002 # -*- coding: utf-8 -*-
00003 
00004 # ----------------------------------------------------------------------------
00005 # pyjama - python jamendo audioplayer
00006 # Copyright (c) 2008 Daniel Nögel
00007 #
00008 # This program is free software: you can redistribute it and/or modify
00009 # it under the terms of the GNU General Public License as published by
00010 # the Free Software Foundation, either version 3 of the License, or
00011 # (at your option) any later version.
00012 #
00013 # This program is distributed in the hope that it will be useful,
00014 # but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 # GNU General Public License for more details.
00017 # You should have received a copy of the GNU General Public License
00018 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
00019 # ----------------------------------------------------------------------------
00020 
00021 ######################################################################
00022 #                                                                    #
00023 #                     Some default Layouts                           #
00024 #                                                                    #
00025 ######################################################################    
00026 #
00027 # Album Layout - shows an album
00028 #
00029 
00030 import gtk
00031 import os
00032 import hashlib
00033 import urllib
00034 import time
00035 
00036 from modules import clWidgets
00037 from modules import functions
00038 from modules import clThreadedDownload
00039 
00040 class AlbumLayout(gtk.Layout):
00041 
00042     def __init__(self, pyjama):
00043         self.pyjama = pyjama
00044         
00045         gtk.Layout.__init__(self)
00046         self.set_size(700,200)
00047 
00048         # Holds similar albums
00049         self.albuminfos = {}
00050 
00051         # Labels shown in Album- View
00052         self.AlbumLabels={}
00053 
00054         # Labels on Album Widget
00055         y = 10
00056         xspace = 250
00057         yspace = 20
00058         self.AlbumInfos = ['name', 'artist_name', 'trackcount', 'lengths', 'genre', 'releasedate', 'review_note', 'url']
00059         self.AlbumCaptions = [_("Album's title"), _("Artist"), _("#Tracks"), _("Length"), _("Genre"), _("Releasedate"), _('Rating'), _('link')]
00060         for info in xrange(0, len(self.AlbumInfos)):
00061             if self.AlbumInfos[info] == "url":
00062                 self.AlbumLabels[self.AlbumInfos[info]] = clWidgets.MyLinkButton("", _("link")) #str(album['album_name'][:20])
00063                 self.put(self.AlbumLabels[self.AlbumInfos[info]], xspace, y)
00064                 self.AlbumLabels[self.AlbumInfos[info]].connect("clicked", self.on_zumAlbum_clicked)
00065                 self.AlbumLabels[self.AlbumInfos[info]].show()
00066             else:
00067                 self.AlbumLabels[self.AlbumInfos[info]] = gtk.Label("")
00068                 self.AlbumLabels[self.AlbumInfos[info]].set_single_line_mode(True)
00069                 self.put(self.AlbumLabels[self.AlbumInfos[info]], xspace, y)
00070                 self.AlbumLabels[self.AlbumInfos[info]].show()
00071             if self.AlbumInfos[info] == "review_note":
00072                 # USER WIDGET Rating
00073                 self.rtRating = clWidgets.Rating()
00074                 self.put(self.rtRating, 350, y)
00075                 self.rtRating.show() # for some reason this is not done by self.show_all()
00076             y+=yspace
00077 
00078         hb = gtk.HBox()
00079         self.put(hb, 20, 240)
00080         self.lblSimilar = gtk.Label()
00081         self.lblSimilar.set_markup(_("<b>Similar Albums:</b>\n<small>If loading takes to long, set 'similar albums' to 0.</small>"))
00082         hb.pack_start(self.lblSimilar, True, True)
00083         btn = clWidgets.StockButton(gtk.STOCK_PREFERENCES)
00084         btn.connect("pressed", self.pyjama.show_preferences, "Pyjama")
00085         btn.set_tooltip_text("Go to preferences page and set 'similar albums'")
00086         hb.pack_start(btn, False, True)
00087         hb.show_all()
00088 
00089         self.image_album = gtk.Image()
00090         self.put(self.image_album, 30, 10)
00091         self.image_album.show()
00092 
00093         # might be obsolet
00094         self.pyjama.window.setcolor(self)
00095         self.show()
00096 
00097         self.pyjama.Events.connect_event("scrolled_window_resized", self.ev_scrolled_window_resized)
00098 
00099     def on_zumAlbum_clicked(self, ev):
00100         url = self.AlbumLabels['url'].get_text()
00101         self.pyjama.Events.raise_event("open_url", url)
00102 
00103 
00104     def draw(self, data1, data2, data3, data4):
00105         #
00106         # Setting label
00107         #
00108 #        markup = self.pyjama.window.markuplbCaption.replace("TEXT", _("Show album infos for '%s'") % data1['name'])
00109         txt =  _("Showing album infos for '%s'") % data1['name']
00110 #        self.pyjama.window.lbCaption.set_markup(markup)
00111         self.pyjama.window.LayoutInfo.set_text(txt)
00112         self.pyjama.window.LayoutInfo.set_image("cd.png")
00113 
00114         self.toolbar = self.pyjama.layouts.toolbars['album']
00115 
00116         albuminfos = data1
00117 
00118         tracks = self.pyjama.db.albumtracks(albuminfos['id'])
00119         track_count = len(tracks)
00120 
00121         if track_count == 0:
00122             print ("Album not in database, yet.")
00123             print albuminfos['public_date']
00124             dia = clWidgets.MyDialog(_('Album non existant.'),
00125                               self.pyjama.window.get_toplevel(), gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), gtk.STOCK_DIALOG_WARNING, _('This album is not in the database.\nPerhaps Jamendo did not unloack that album, yet\n or you are using a old local database.'))
00126             dia.run()
00127             dia.destroy()
00128             self.pyjama.window.toolbar.on_bHistoryBack_clicked(None)
00129             return None
00130 
00131 
00132         #tags = albuminfos['id3genre']
00133 
00134         genre = albuminfos['id3genre']
00135         #desc = albuminfos['desc_str']
00136         #referrer_count = albuminfos['referrer_count']
00137             #playlisted_count = albuminfos['playlisted_count']
00138             #favourited_count = albuminfos['favourited_count']
00139         #lowfi_count = albuminfos['lowfi_count']
00140         releasedate = albuminfos['public_date']
00141         lengths = albuminfos['lengths']
00142             #license_id = albuminfos['license_id']
00143             #review_num = albuminfos['review_num']
00144         review_note = albuminfos['review_note']
00145             #review_num_week = albuminfos['review_num_week']
00146             #review_note_week = albuminfos['review_note_week']
00147         name = albuminfos['name']
00148         artist_id = albuminfos['artist_id']
00149         artist_name = tracks[0].artist_name
00150         album_id = albuminfos['id']
00151             #img = albuminfos['images'][0]['url']
00152         img = albuminfos['root_images'] + "1.200.jpg"
00153         url = self.pyjama.settings.get_value("URLs", "ALBUM_URL").replace("URL", "%s" % album_id)
00154         albuminfos['tracks'] = tracks
00155 
00156         self.pyjama.window.TVListFrame.get_label_widget().set_markup(_("Tracks of the album '<b>%s</b>'" % data1['name']))
00157 
00158         self.pyjama.window.tvList.clear()
00159         for track in tracks:
00160             results = [artist_name, name, track.numalbum,track.name, track.license, artist_id, album_id, track.id]
00161             self.pyjama.window.tvList.add_item(results)
00162 
00163 
00164         self.toolbar.lbAppendAlbum.tag = tracks #self.tracks = tracks
00165 
00166 
00167         md5hash = hashlib.md5(img).hexdigest()
00168         fh = os.path.join(self.pyjama.home, "images", md5hash)
00169         if not os.path.exists(fh):
00170             try:
00171                 urllib.urlretrieve(img, fh)
00172             except IOError:
00173                 print ("Could not load image")
00174                 return None
00175 
00176 
00177         self.image_album.clear()
00178         if img == "" or img == None:
00179             pixbuf = self.image_album.render_icon(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_DIALOG, detail=None)
00180             self.image_album.set_from_pixbuf(pixbuf)
00181         else:
00182             self.image_album.set_from_file(fh)
00183 
00184 
00185         content = [ name, functions.decode_htmlentities(artist_name), track_count, functions.sec2time(lengths), functions.id2genre(genre), releasedate, review_note, url ]
00186         x = 0
00187         infos = self.AlbumInfos
00188         namen = self.AlbumCaptions
00189         for x in xrange(0, len(infos)):
00190             if infos[x] == "review_note":
00191                 if self.pyjama.nocolor:
00192                     self.AlbumLabels[infos[x]].set_markup("<span><b>%s: </b></span>" % (namen[x]))
00193                 else:
00194                     self.AlbumLabels[infos[x]].set_markup("<span foreground=\"white\"><b>%s: </b></span>" % (namen[x]))
00195                 self.rtRating.set_rating(content[x])
00196             elif infos[x] == "url":
00197                     self.AlbumLabels[infos[x]].set_label(url)
00198             else:
00199                 if self.pyjama.nocolor:
00200                     self.AlbumLabels[infos[x]].set_markup("<span><b>%s: %s</b></span>" % (namen[x], content[x]))
00201                 else:
00202                     self.AlbumLabels[infos[x]].set_markup("<span foreground=\"white\"><b>%s: %s</b></span>" % (namen[x], content[x]))
00203 
00204 
00205         # NEW ATTRIBUTE 'FLAG' IN STOCKBUTTON
00206         # NEED TO USE THIS FOR OTHER BUTTONS
00207         # HERE, TOO!
00208         self.toolbar.sbGotoWeb.tag = url
00209         
00210         self.toolbar.lbMoreAlbumsFromThisArtist2.tag = artist_id
00211         self.toolbar.lbMoreAlbumsFromThisArtist2.set_tooltip_text(_("Showing informations and albums from '%s'") % artist_name)
00212         self.toolbar.sbDownloadAlbum.tag = album_id
00213 
00214         for albuminfo in self.albuminfos:
00215             self.albuminfos[albuminfo].destroy()
00216         
00217         self.albuminfos = {}
00218 
00219         ### Similar Album's ###
00220         threads = {}
00221         counter = 0
00222 
00223         albums_dic = {}
00224 
00225         num = self.pyjama.settings.get_value("PYJAMA", "similar_albums", 5)
00226 
00227         ## This hack prevents the jamendo class from aborting the query
00228         # with a "to fast" message - there should be a better solution
00229         self.pyjama.jamendo.last_query_hack()
00230         ret = self.pyjama.jamendo.get_similar_albums( album_id, num )
00231         if ret is not None and ret != [] and ret != -1 and num > 0:
00232             ALBUM_ID = 0
00233             ALBUM_NAME = 1
00234             ARTIST_ID = 2
00235             ARTIST_NAME=3
00236 
00237             # get infos fo the returnes albums:
00238             albums = self.pyjama.db.multiple_albuminfos(ret)
00239             if albums is not None and albums != []:
00240 
00241                 for album in albums:
00242                     #image = "http://imgjam.com/albums/%s/covers/1.100.jpg" % album[ALBUM_ID]
00243                     image = "http://api.jamendo.com/get2/image/album/redirect/?id=%s&imagesize=%i" % (album[ALBUM_ID], 100)
00244                     threads[counter] = clThreadedDownload.Download(self.pyjama, image, counter)
00245                     threads[counter].start()
00246                     albums_dic[counter] = {'arist_id':album[ARTIST_ID], 'album_id':album[ALBUM_ID], 'artist_name':album[ARTIST_NAME], 'album_name':album[ALBUM_NAME], 'album_image':image}
00247                     counter += 1
00248                 ## i added another loop
00249                 ## so that threaded download
00250                 ## won't collide with
00251                 ## creating the albuminfos
00252                 counter = 0
00253                 for album in albums:
00254                     self.albuminfos[counter] = clWidgets.AlbumInfo(self.pyjama, albums_dic[counter])
00255                     self.albuminfos[counter].show()
00256                     self.put(self.albuminfos[counter], 1, 1)
00257                     counter += 1
00258             self.lblSimilar.set_markup(_("<b>Similar Albums:</b>\n<small>If loading this page takes to long, please set 'similar albums' to 0 in configtool</small>"))
00259         elif ret == -1:
00260             print ("Some Problems with Jamendo")
00261         elif ret == []:
00262             self.lblSimilar.set_markup(_("<b>No similar albums found</b>"))
00263 
00264 
00265         self.arrange_albumdetail()
00266 #        self.set_size(self.pyjama.window.scrolledwindow_width-20,230)#350)#y+200
00267         self.pyjama.Events.raise_event("showing_album_page", albuminfos)
00268 
00269     def arrange_albumdetail(self):
00270         if self.albuminfos == {}: 
00271             self.set_size(700,200)
00272             return None
00273         width = self.pyjama.window.scrolledwindow_width
00274         hspace = 20
00275         vspacer = 20
00276         
00277         imgwidth = 150
00278         imgheight = 160
00279         starty = 250
00280         
00281         y = 0
00282         x = 0
00283         self.hide()
00284 
00285         for counter in self.albuminfos:
00286             if ((x+1) * imgwidth) + hspace*(x+1) >= width:
00287                 y += 1
00288                 x = 0
00289             self.move(self.albuminfos[counter], (imgwidth * x) + hspace*(x+1), (vspacer*(y+1) + (y * imgheight))+starty)
00290             x += 1
00291         height = (y+1) * (imgheight + vspacer) + starty
00292 
00293         self.set_size(width-20,height+vspacer)
00294         self.show()
00295 
00296     def ev_scrolled_window_resized(self):
00297         #
00298         # Rearrange layout
00299         #
00300         self.arrange_albumdetail()
00301         self.show()
00302 
00303     #
00304     # Actually this toolbar is just a hbox...
00305     #
00306     class ToolBar(gtk.HBox):
00307         def __init__(self, pyjama):
00308             gtk.HBox.__init__(self)
00309             self.pyjama = pyjama
00310             self.layout = self.pyjama.layouts.layouts['album']
00311 
00312             # ADD ALBUM TO PLAYLIST
00313             self.lbAppendAlbum = clWidgets.StockButton(gtk.STOCK_ADD, gtk.ICON_SIZE_DND)
00314             self.lbAppendAlbum.set_tooltip_text(_("Append this album on playlist"))
00315             self.lbAppendAlbum.show()
00316             self.pack_start(self.lbAppendAlbum, False, True, 2)
00317             self.lbAppendAlbum.connect("clicked", self.on_lbAppendAlbum_clicked)
00318             # GET MORE ALBUMS FROM THIS PLAYLIST
00319             self.lbMoreAlbumsFromThisArtist2 = clWidgets.ImageButton(os.path.join(functions.install_dir(), "images", "personal.png"), gtk.ICON_SIZE_DND )
00320             self.pack_start(self.lbMoreAlbumsFromThisArtist2, False, True, 2)
00321             self.lbMoreAlbumsFromThisArtist2.connect("clicked", self.on_lbMoreAlbumsFromThisArtist_clicked)
00322             self.lbMoreAlbumsFromThisArtist2.show()
00323 
00324 
00325             # DOWNLOAD ALBUM VIA TORRENT
00326             self.sbDownloadAlbum = clWidgets.StockButton(gtk.STOCK_GOTO_BOTTOM, gtk.ICON_SIZE_LARGE_TOOLBAR)
00327             self.sbDownloadAlbum.set_tooltip_text(_("Download Album as Torrent"))
00328             self.sbDownloadAlbum.set_size_request(50,50)
00329             self.sbDownloadAlbum.show()
00330             self.pack_end(self.sbDownloadAlbum, False, True, 2)
00331             self.sbDownloadAlbum.connect("clicked", self.on_sbDownloadAlbum_clicked)    
00332             # GO TO ALBUM'S PAGE ON JAMENDO
00333             self.sbGotoWeb = clWidgets.StockButton(gtk.STOCK_NETWORK, gtk.ICON_SIZE_LARGE_TOOLBAR)
00334             self.sbGotoWeb.set_tooltip_text(_("Goto to album's page on jamendo"))
00335             self.pack_end(self.sbGotoWeb, False, True, 2)
00336             self.sbGotoWeb.set_size_request(50,50)
00337             self.sbGotoWeb.show()
00338             self.sbGotoWeb.connect("clicked", self.on_sbGotoWeb_clicked)        
00339             # WRITE A REVIEW
00340             self.sbWriteReview = clWidgets.StockButton(gtk.STOCK_EDIT, gtk.ICON_SIZE_LARGE_TOOLBAR)
00341             self.sbWriteReview.set_tooltip_text(_("Write a review for this album"))
00342             self.sbWriteReview.set_size_request(50,50)
00343             self.sbWriteReview.show()
00344             self.pack_end(self.sbWriteReview, False, True, 2)
00345             self.sbWriteReview.connect("clicked", self.on_sbWriteReview_clicked)    
00346 
00347 
00348         def on_sbWriteReview_clicked(self, ev):
00349             self.pyjama.Events.raise_event("open_url", "http://www.jamendo.com/album/%s/writereview" % self.sbDownloadAlbum.tag)
00350 
00351         def on_lbMoreAlbumsFromThisArtist_clicked(self, ev):
00352             # query db for artist informations and more albums
00353             self.pyjama.start_pulsing(text = _("Requesting local database"))
00354             ret = self.pyjama.db.artistinfos(self.lbMoreAlbumsFromThisArtist2.tag, time.time())        
00355             self.pyjama.stop_pulsing()
00356             self.pyjama.layouts.show_layout("artist", ret, who_called = "on_lbMoreAlbumsFromThisArtist_clicked")
00357 
00358 
00359         def on_lbAppendAlbum_clicked(self, ev):
00360             tracks = self.lbAppendAlbum.tag
00361             for track in tracks: # for track in self.main.tracks:
00362                 track.uid = "%f%s" % (time.time(), track.id)
00363                 self.pyjama.add2playlist(track)
00364                 status = self.pyjama.player.status
00365                 if status == "Error" or status == "End" or status == None:
00366                     self.pyjama.window.on_bPlay_clicked(None)
00367 
00368         def on_sbGotoWeb_clicked(self, ev):
00369             self.pyjama.Events.raise_event("open_url",  self.sbGotoWeb.tag)
00370 
00371         def on_sbDownloadAlbum_clicked(self, ev):
00372             url = "http://api.jamendo.com/get2/bittorrent/file/redirect/?album_id=%s&type=archive&class=%s" % (self.sbDownloadAlbum.tag, self.pyjama.settings.get_value("JAMENDO", "FORMAT"))
00373             self.pyjama.Events.raise_event("open_url", url, force_default=True)        
00374 
00375 

Generated on Thu Jun 4 19:08:24 2009 for Pyjama by  doxygen 1.5.8