00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
00049 self.albuminfos = {}
00050
00051
00052 self.AlbumLabels={}
00053
00054
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"))
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
00073 self.rtRating = clWidgets.Rating()
00074 self.put(self.rtRating, 350, y)
00075 self.rtRating.show()
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
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
00107
00108
00109 txt = _("Showing album infos for '%s'") % data1['name']
00110
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
00133
00134 genre = albuminfos['id3genre']
00135
00136
00137
00138
00139
00140 releasedate = albuminfos['public_date']
00141 lengths = albuminfos['lengths']
00142
00143
00144 review_note = albuminfos['review_note']
00145
00146
00147 name = albuminfos['name']
00148 artist_id = albuminfos['artist_id']
00149 artist_name = tracks[0].artist_name
00150 album_id = albuminfos['id']
00151
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
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
00206
00207
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
00220 threads = {}
00221 counter = 0
00222
00223 albums_dic = {}
00224
00225 num = self.pyjama.settings.get_value("PYJAMA", "similar_albums", 5)
00226
00227
00228
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
00238 albums = self.pyjama.db.multiple_albuminfos(ret)
00239 if albums is not None and albums != []:
00240
00241 for album in albums:
00242
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
00249
00250
00251
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
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
00299
00300 self.arrange_albumdetail()
00301 self.show()
00302
00303
00304
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
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
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
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
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
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
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:
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