def slave_enter_media_view(self): loggy.debug('gui.slave_enter_media_view') #TODO: check slave_window is a hbox self.slave_view = GTK_media_view(self.sb) self.slave_windows[0].pack_start(self.slave_view, True, True,0) self.slave_windows[0].show_all() self.builder.connect_signals(self)
def setvol(self, vol): loggy.debug('player.setvol') self.vol = vol #self.set_property('vol', vol) #vol = float(vol)/100 #self.player.set_property('volume', vol) return True
def delete_pos(self, start, end=None): loggy.debug('playlist.delete_pos |{0}|{1}'.format(start, end)) if end is not None: output = self.playlist[start:end] del self.playlist[start:end] else: output = self.playlist[start:start] del self.playlist[start] return output
def setvol(self, vol): loggy.debug('player.setvol: ' + str(vol)) if (vol>100): vol = 100 if (vol<0): vol = 0 vol = int(round(vol)) if (vol != self.vol): self.vol = vol self.playbin.set_property('volume', float(self.vol)/100) self.emit('volume-changed') return True
def master_tree_cursor_changed(self, widget): #TODO: set position in all trees loggy.debug('gui.master_tree_cursor_changed') (model, iterat) = widget.get_selection().get_selected() #print self.slave_windows[0].get_children() try: self.slave_view.destroy() except: None if iter: self.main_tree_modes[model.get_value(iterat,0)]['open_func']()
def on_play_state_change(self, player): #TODO: - make player only emit one signal for each event #state = self.sb.player.getstate() loggy.debug('gui.on_play_state_change ' + self.sb.player.state) if (self.sb.player.state == 'play'): for playbutton in self.widgets['play_buttons']: playbutton.set_label(Gtk.STOCK_MEDIA_PAUSE) elif (self.sb.player.state == 'pause' or self.sb.player.state == 'stop'): for playbutton in self.widgets['play_buttons']: playbutton.set_label(Gtk.STOCK_MEDIA_PLAY) else: loggy.warn('gui.on_play_state_change got unknown state: ' + self.sb.player.state)
def addid(self, arg): match = re.search('(.*)\s+(\d+)$', arg) #TODO: implement mpdserver.addid - does not remove pos if match: pos = int(match.group(2)) uri = match.group(1).strip('\s\'\"') else: uri = arg.strip('\s\'\"') pos = None loggy.debug('mpdserver.addid {0}:{1}'.format(uri,pos)) songid = self.sb.playlist.add_uri(uri, pos) if songid is not False: return'OK\n' raise Exception('could not add file - not located in db')
def add_uri(self, uri, pos=None): loggy.debug('playlist.add_uri '+str(uri)+str(pos)) songid = self.sb.sbdb.get_uri_db_info(uri) if songid: songid = songid['songid'] if pos is not None: self.add_songid(songid, pos) else: self.add_songid(songid) return songid else: loggy.warn('could not add uri {0} to playlist - not in db') return False
def playlist_monitor_changed(self, monitor, file1, file2, event): #print ("Changed:",monitor, file1, file2, event) if event == Gio.FileMonitorEvent.CREATED or event == Gio.FileMonitorEvent.CHANGED: print ( 'file created/changed '+file1.get_path()) if file1.get_path().lower().endswith('.m3u'): self.read_playlist_from_giofile(file1) elif event == Gio.FileMonitorEvent.CHANGES_DONE_HINT: True # ignore for now elif event == Gio.FileMonitorEvent.DELETED: print ('file deleted' + file1.get_path()) self.sb.player.emit('deleted-playlist', file1.get_path()) if file1.get_path() in self.playlists.keys(): del self.playlists[file1.get_path()] else: loggy.debug('File Monitor released unimplemented event'+str(monitor)+str(file1)+str(file2)+str(event))
def is_listview(self, widget): loggy.debug('gui.GTK_media_view.is_listview') self.treeview = widget widget.connect('row-activated', self.treeview_activated) widget.set_model(self.list_store) # init treeview widget.tv_columns = {} for i, name in enumerate(self.sb.sbdb.keys): # go through all keys if name in self.keystoshowdict: #check if column is to display widget.tv_columns[name] = Gtk.TreeViewColumn(name) widget.insert_column(widget.tv_columns[name], self.keystoshowdict[name]) # inserts column in order from keystoshow widget.tv_columns[name].cell = Gtk.CellRendererText() widget.tv_columns[name].pack_start(widget.tv_columns[name].cell, True) widget.tv_columns[name].add_attribute(widget.tv_columns[name].cell, 'text', i) widget.tv_columns[name].set_resizable(True) #widget.tv_columns[name].set_clickable(True) widget.tv_columns[name].connect('clicked', self.tv_clicked, i) #widget.tv_columns[name].set_sort_indicator(True) widget.columns_autosize()
def add_songid(self, songid, pos=None): loggy.debug('playlist.add_songid |{0}|{1}'.format(songid, pos)) if pos is not None: self.playlist.insert(pos, songid) else: self.playlist.append(songid)
def on_playbutton_click(self, widget): loggy.debug('gui.on_playbutton_click') widget.set_relief(Gtk.ReliefStyle.NONE) self.sb.player.playpause()
def on_button3_clicked(self, button): loggy.debug('GTK_media_view.on_button3_clicked') self.sb.sbdb.update_db() True
def tv_clicked(self, widget, i): loggy.debug('gui.GTK_media_view.tv_clicked') widget.set_sort_column_id(i)
def treeview_activated(self, treeview, path, view_column): loggy.debug('gui.GTK_media_view.treeview_activated') (model, iterat) = treeview.get_selection().get_selected() if iterat: self.sb.playlist.load_uri(self.list_store.get_value(iterat,len(self.sb.sbdb.keys)-2)) self.sb.playlist.playlist = [self.list_store.get_value(iterat,len(self.sb.sbdb.keys)-2)]
def slave_enter_now_playing_view(self): self.slave_view = GTK_now_playing(self.sb) self.slave_windows[0].pack_start(self.slave_view, True, True,0) self.slave_windows[0].show_all() self.builder.connect_signals(self) loggy.debug('gui.slave_enter_now_playing_view')
def is_slave_area(self, widget): loggy.debug('gui.is_slave_area') self.slave_windows.append(widget) #TODO: allow multiple separate master/slave combos
def set(self, value): value = bool(value) if self.toggle != value: self.toggle = value loggy.debug('playlist.set {0}'.format(value)) self.emit('changed', value)
def is_video_out(self, widget): loggy.debug('is_video_out') self.player.vidout['xid'] = widget.window.xid
def handler(self, conn, *args): '''Asynchronous connection handler. Processes each line from the socket.''' buff = conn.recv(65536) #TODO: handle if more on conn to recieve than 4096 if not len(buff): loggy.log( "mpdserver Connection closed - no input." ) return False elif len(buff)>60000: loggy.warn('mpdserver Connection buff full, data may be lost' . buff) #loggy.log('MPD Server got:' +buff) while '\n' in buff: (line, buff) = buff.split("\n", 1) output = '' if not len(line): loggy.log( "mpdserver Connection closed - no input." ) return False else: arg = line.strip().split(' ', 1) #strips whitespace from right and left, then splits first word off as command command = arg[0].lower() # prevents case sensitivity #TODO: reimplement using a dict? if (len(arg)>1): # if there are arguments to the command args = arg[1].strip() else: args = '' #Tries to recognise command #Playback control func = None loggy.debug('mpdserver got {0} {1}'.format(command, args)) # Makes sure command is not internal function if command in self.list_of_commands: #loggy.warn('mpdserver attempt to access internals {0}'.format(command)) #Searches for command in current class try: func = getattr(self, command) except Exception as detail: output = 'ACK 50@1 {{{0}}} Command not recognised\n'.format (command) loggy.warn('mpdserver: {0}'.format(output)) self.queueing = False self.ok_queueing = False else: #Executes command try: output = func(args) except Exception as detail: output = 'ACK 50@1 {{{0}}} {1} {2} {3}\n'.format(command, detail, str(type(detail)), traceback.format_exc().replace('\n', '|')) loggy.warn('mpdserver: {0}'.format(output)) self.queueing = False self.ok_queueing = False else: # not in list_of_commands output = 'ACK 50@1 {{{0}}} Command not in command list\n'.format (command) loggy.debug('mpdserver {0} not in command list'.format(command)) #Handles output - with respect to list queueing if not output: output = 'ACK 1@1 {{{0}}} Command returned no output - not implemented yet\n'.format(command) loggy.warn('mpdserver: {0}'.format(output)) elif output.startswith('ACK'): self.queueing = False self.ok_queueing = False output = self.queue + output self.queue = '' if self.ok_queueing: #if output[-3:-1] == 'OK': #output = output[:-3] + 'list_OK\n' output = output.replace("OK", "list_OK") self.queue += output output = '' elif self.queueing: self.queue += output output = '' #send output if (output != None): loggy.debug( 'MPD Server sending: {0}'.format( output) ) conn.send(output) return True
def playpause(self): loggy.debug('player.playpause') if self.player.get_state()[1] == gst.STATE_PLAYING: self.player.set_state(gst.STATE_PAUSED) else: self.player.set_state(gst.STATE_PLAYING)
def playpause(self): loggy.debug('player.playpause') if self.player.get_state()[1] == Gst.State.PLAYING: self.pause() else: self.play()
def on_playbutton_click(self, widget): loggy.debug('gui.on_playbutton_click') self.player.playpause()
def on_button3_clicked(self): loggy.debug('GTK_media_view.on_button3_clicked')
def slave_enter_now_playing_view(self): loggy.debug('gui.slave_enter_now_playing_view')
def getvol(self): #vol = round(self.playbin.get_property('volume')*100) loggy.debug('player.getvol: ' + str(self.vol)) return self.vol
def on_async_done(self, player): loggy.debug('gui.on_async_done') self.on_update_tags()
def is_video_out(self, widget): loggy.debug('is_video_out') self.sb.player.vidout['xid'] = widget.get_property('window').get_xid() # don't forget to import GdkX11! self.sb.player.videosink.set_xwindow_id(self.sb.player.vidout['xid'])
def playpause(self): loggy.debug('player.playpause') if self.player.get_state(1)[1] == Gst.State.PLAYING: #?need to add timeout to get state? self.player.set_state(Gst.State.PAUSED) else: self.player.set_state(Gst.State.PLAYING)