Example #1
0
class OnlineMusicSource(rb.BrowserSource):
  def __init__(self):
    rb.BrowserSource.__init__(self)
    self.__activated=False
    self.onlineMusic=None
    self.__progressing=False
    
  def do_impl_delete_thyself(self):
    if self.onlineMusic:
      self.onlineMusic.deactivate()
    
    self.onlineMusic = None
    self.entry_type = None
    self.db = None
    self.shell = None
    
    rb.BrowserSource.do_impl_delete_thyself (self)
    
  def do_impl_activate(self):
    if not self.__activated:
      self.__activated=True
      self.shell=self.get_property('shell')
      self.db = self.shell.get_property('db')
      self.entry_type = self.get_property('entry-type')
      self.onlineMusic=GoogleMusic(self)
      self.onlineMusic.activate()
      
      #player=self.shell.get_player().get_property('player')
      #player.connect("eos",self.eos,self.shell.get_player())
      #player.connect("buffering",self.eos,self.shell.get_player())

      #player.connect("playing-song-changed",self.entry_activated)#playing_song_changed)
      #player.connect("playing-changed",self.playing_changed)
      #self.get_entry_view().connect("entry-activated",self.entry_activated)
    rb.BrowserSource.do_impl_activate (self)
    
  def do_impl_get_ui_actions(self):
    return ["ReloadMusic", "SwitchList"]
    
  def do_impl_get_status(self):
    if self.__progressing:
      return (_("Loading songs"), None, -1.0)
    else:
      return (_("Done"), None, 1.0)
  
#  def eos(self,player,stream_data,progress,shellplayer):
#    out = open('/home/longming/test/x.mp3', 'w')
#    out.write(str(stream_data))
#    out.close()
    
  def notify_progress(self,progressing):
    self.__progressing=progressing
    self.notify_status_changed()
Example #2
0
	def load_music(self):
		if self.onlineMusic:
			self.onlineMusic.deactivate()
		  
		self.onlineMusic = None
		self.onlineMusic=GoogleMusic(self, None)
		self.onlineMusic.start()
Example #3
0
	def add_music(self, btn, store):
		if self.onlineMusic:
			self.onlineMusic.deactivate()
		  
		songs = []
		store.foreach(self.model_foreach_fun, songs)
		if len(songs) == 0:
			return None
		
		self.onlineMusic = None
		self.onlineMusic=GoogleMusic(self.source, songs)
		self.onlineMusic.start()
		
		self.dialog.hide()
Example #4
0
  def do_impl_activate(self):
    if not self.__activated:
      self.__activated=True
      self.shell=self.get_property('shell')
      self.db = self.shell.get_property('db')
      self.entry_type = self.get_property('entry-type')
      self.onlineMusic=GoogleMusic(self)
      self.onlineMusic.activate()
      
      #player=self.shell.get_player().get_property('player')
      #player.connect("eos",self.eos,self.shell.get_player())
      #player.connect("buffering",self.eos,self.shell.get_player())

      #player.connect("playing-song-changed",self.entry_activated)#playing_song_changed)
      #player.connect("playing-changed",self.playing_changed)
      #self.get_entry_view().connect("entry-activated",self.entry_activated)
    rb.BrowserSource.do_impl_activate (self)
Example #5
0
class OnlineMusicSource(rb.BrowserSource):
	def __init__(self):
		rb.BrowserSource.__init__(self, name="onlineMusic")
		self.__activated=False
		self.onlineMusic=None
		self.__progressing=False
		self.__loadSong=False
		self.__loadCount=1
		self.__loadAll=1
	
	def do_impl_delete_thyself(self):
		if self.onlineMusic:
			self.onlineMusic.deactivate()
		
		self.onlineMusic = None
		self.entry_type = None
		self.db = None
		self.shell = None
	
		rb.BrowserSource.do_impl_delete_thyself (self)
	
	def do_impl_activate(self):
		if not self.__activated:
			self.__activated=True
			self.shell=self.get_property('shell')
			self.db = self.shell.get_property('db')
			self.entry_type = self.get_property('entry-type')
			#self.load_music()
			self.shell.get_player().connect('playing-song-changed', self.playing_entry_changed)
		rb.BrowserSource.do_impl_activate (self)
  
	def do_impl_deactivate(self):
		rb.BrowserSource.do_impl_deactivate (self)
	
	def do_impl_get_ui_actions(self):
		return ["SwitchList", "SearchMusic", "ShowLyrics"]
	
	def load_music(self):
		if self.onlineMusic:
			self.onlineMusic.deactivate()
		  
		self.onlineMusic = None
		self.onlineMusic=GoogleMusic(self, None)
		self.onlineMusic.start()
  
	def do_impl_get_status(self):
		if self.__progressing:
			return (_('Google music loading...'), "%d / %d" % (self.__loadCount, 
					  self.__loadAll), self.__loadCount/self.__loadAll)
		else:
			return (_("%s: %d songs, %d minutes") % (_('Google music'), 
					  self.get_song_count(),
					  int(math.ceil(self.props.query_model.get_duration() / 60))), 
					None, 1.0)
	  
	def get_song_count(self):
		count = 0
		for row in self.props.query_model:
			count += 1
		return count
	
	def notify_progress(self, progressing, loadCount, loadAll):
		self.__progressing=progressing
		self.__loadCount = loadCount
		self.__loadAll = loadAll
		self.notify_status_changed()
	
	def playing_entry_changed(self, sp, entry):
		if not entry or entry.get_entry_type() != self.db.entry_type_get_by_name("OnlineMusicType"):
			return

		# Retrieve corresponding feed for this entry
		comment = self.db.entry_get(entry, rhythmdb.PROP_COMMENT)
		image_url = comment.split('\n')[1].replace('image=', '')
		
		if image_url != '':
			gobject.idle_add(self.db.emit_entry_extra_metadata_notify, entry, "rb:coverArt-uri", str(image_url))
Example #6
0
class OnlineMusicSearchDialog (object):
	def __init__(self, source):
		self.search_entry = None
		self.search_btn = None
		self.source = source
		self.onlineMusic = None
		self.has_next = False
		self.count = 0
		self.dialog = self.initDialog()
		self.dialog.connect("delete_event", self.close_dialog)
	
	def get_dialog (self):
		return self.dialog
	
	def initDialog(self):
		dialog = gtk.Dialog(_("Online Music Search"),
						  None,
						  gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, None)
						  
		dialog.set_size_request(500, 600)
		
		vbox = dialog.get_content_area()
		vbox.pack_start(self.get_search_panel(), True)
		vbox.show_all()
		return dialog
	
	def get_search_panel(self):
		#The search result list
		columnNames = ['', _('Title'), _('Album'), _('Artist'), _('Time')]#, 'ID'
		liststore = gtk.ListStore(bool, str, str, str, str, str)
		self.search_tree = gtk.TreeView(liststore)
		self.search_tree.set_headers_clickable(True)
		self.search_tree.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_HORIZONTAL)
		
		tvcolumn = [None] * len(columnNames)
		for n in range(0, len(columnNames)):
			if columnNames[n] != '':
				cell = gtk.CellRendererText()
				tvcolumn[n] = gtk.TreeViewColumn(columnNames[n], cell)
				tvcolumn[n].add_attribute(cell, 'text', n)
				self.search_tree.append_column(tvcolumn[n])
			else:
				cell = gtk.CellRendererToggle()
				cell.set_property('activatable', True);
				cell.connect('toggled', self.select_row, self.search_tree, liststore)
				tvcolumn[n] = gtk.TreeViewColumn(columnNames[n], cell)
				tvcolumn[n].add_attribute(cell, 'active', n)
				self.search_tree.append_column(tvcolumn[n])
		
		tvcolumn[0].set_min_width(20)
		tvcolumn[2].set_min_width(120)
		tvcolumn[3].set_min_width(100)
		tvcolumn[4].set_min_width(40)
		tvcolumn[0].set_max_width(20)
		tvcolumn[1].set_max_width(180)
		tvcolumn[2].set_max_width(130)
		tvcolumn[3].set_max_width(100)
		tvcolumn[4].set_max_width(40)
		tvcolumn[1].set_expand(True)
		self.search_tree.set_reorderable(True)
		scrolled_window = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)
		scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		scrolled_window.add(self.search_tree)
		scrolled_window.set_size_request(490, 500)
	  
		vbox = gtk.VBox(spacing=5)
		
		self.search_entry = gtk.Entry(max=0)
		self.search_btn = gtk.Button(_("Search"))
		self.search_entry.connect("activate", self.search_music, liststore, True)
		self.search_btn.connect("clicked", self.search_music, liststore, True)
		hbox = gtk.HBox(spacing=5)
		hbox.pack_start(self.search_entry, True)
		hbox.pack_start(self.search_btn, False)
		vbox.pack_start(hbox, False)
		
		vbox.pack_start(scrolled_window, True)
		
		hbox = gtk.HBox(spacing=5)
		check_btn = gtk.CheckButton(_("Select/Clear All"))
		next_btn = gtk.Button(_("Next Page"))
		close_btn = gtk.Button(_("Close"))
		add_btn = gtk.Button(_("Add to List"))
		
		next_btn.set_property("width-request", 80)
		close_btn.set_property("width-request", 80)
		add_btn.set_property("width-request", 80)
	
		check_btn.connect("toggled", self.select_all_row, liststore)
		next_btn.connect("clicked", self.search_next, liststore)
		add_btn.connect("clicked", self.add_music, liststore)
		close_btn.connect("clicked", self.hide_dialog)
		
		hbox.pack_start(check_btn, False)
		hbox.pack_start(next_btn, False)
		hbox.pack_end(close_btn, False)
		hbox.pack_end(add_btn, False)
		vbox.pack_start(hbox, False)
		
		return vbox
  
	def select_row(self, renderer, path, treeview, store):
		model = treeview.get_model()
		selection = treeview.get_selection()
		iter = model.get_iter(path)
		select = model.get_value(iter, 0)
		store.set_value(iter, 0, not select)
	
	def search_music(self, btn, store, flag):
		search_key = self.search_entry.get_text().strip()
		if search_key == '':
			return None
		  
		xml_url="http://www.google.cn/music/search?cat=song&q=%s&start=%d&num=%d&cad=player&output=xml" % (search_key, self.count * 20, ONE_PAGE_SIZE)
		song_list = Analyze.getSongList(xml_url, False)
		if not song_list or len(song_list) == 0:
			msgBox = gtk.MessageDialog(parent=self.dialog, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_ERROR, 
					buttons=gtk.BUTTONS_CLOSE, message_format=_("No more song!"))
			msgBox.connect("response", lambda a, b: msgBox.hide())
			msgBox.run()
			return None
		  
		if flag:
			store.clear()
		iter = None
		#'', 'Title', 'Album', 'Artist', 'Time', 'ID'
		for song in song_list:
			title = song['name']
			album = song['album']
			artist = song['artist']
			time = song['duration']
			id = song['id']
			iter = store.append([False, title, album, artist, time, id])
		
		if not flag:
			self.search_tree.scroll_to_cell(store.get_path(iter))
		self.count += 1
		if len(song_list) < ONE_PAGE_SIZE:
			self.has_next = False
		else:
			self.has_next = True
	  
	def select_all_row(self, btn, store):
		store.foreach(self.model_foreach_select, btn.get_active())

	def model_foreach_select(self, model, path, iter, flag):
		model.set_value(iter, 0, flag)
	
	def search_next(self, btn, store):
		if self.has_next:
			self.search_music(btn, store, False)
	  
		else:
			msgBox = gtk.MessageDialog(parent=self.dialog, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_ERROR, 
					buttons=gtk.BUTTONS_CLOSE, message_format=_("No more song!"))
			msgBox.connect("response", lambda a, b: msgBox.hide())
			msgBox.run()
	
	def add_music(self, btn, store):
		if self.onlineMusic:
			self.onlineMusic.deactivate()
		  
		songs = []
		store.foreach(self.model_foreach_fun, songs)
		if len(songs) == 0:
			return None
		
		self.onlineMusic = None
		self.onlineMusic=GoogleMusic(self.source, songs)
		self.onlineMusic.start()
		
		self.dialog.hide()
  
	def model_foreach_fun(self, model, path, iter, songs):
		select = model.get_value(iter, 0)
		if select:
			title = model.get_value(iter, 1)
			album = model.get_value(iter, 2)
			artist = model.get_value(iter, 3)
			time = model.get_value(iter, 4)
			id = model.get_value(iter, 5)
			hash = hashlib.md5(Analyze.GOOGLE_PLAYER_KEY + id).hexdigest()
			url="http://www.google.cn/music/songstreaming?id=" + id + "&output=xml&sig=" + hash
		  
			durationf=float(time)
			duration=int(math.ceil(durationf))
			song={'name':title,
				'artist':artist,
				'album':album,
				'duration':duration,
				'url':url,
				'genre':None,
				'id':id}
			#print 'name:%s\nartist:%s\nalbum:%s\nduration:%d\nid:%s' % (title, artist, album, duration, id)
			songs.append(song)
	
	def hide_dialog(self, btn):
		self.dialog.hide()
  
	def close_dialog(self, widget, event):
		self.dialog.hide()
		return True