def do_GET(self): MrcLogger.info('[GET] START') parsed_path = urlparse.urlparse(self.path) message_parts = [ 'CLIENT VALUES:', 'client_address=%s (%s)' % (self.client_address, self.address_string()), 'command=%s' % self.command, 'path=%s' % self.path, 'real path=%s' % parsed_path.path, 'query=%s' % parsed_path.query, 'request_version=%s' % self.request_version, '', 'SERVER VALUES:', 'server_version=%s' % self.server_version, 'sys_version=%s' % self.sys_version, 'protocol_version=%s' % self.protocol_version, '', 'HEADERS RECEIVED:', ] for name, value in sorted(self.headers.items()): message_parts.append('%s=%s' % (name, value.rstrip())) message_parts.append('') message = '\r\n'.join(message_parts) self.send_response(200) self.end_headers() self.wfile.write(message) MrcLogger.info('[GET] '+message) return
def do_POST(self): mc=MrcCommander() wholerfile='' for inputline in self.rfile: wholerfile+=inputline inputline = inputline.rstrip() mc.analyseReceivedLine(inputline) if mc.cmd: MrcLogger.info('QUERY: '+inputline) break if inputline=='': MrcLogger.error('QUERY: INVALID! No line in HTTPHandler\'s rfile could pass analysis!') MrcLogger.error(wholerfile) break MrcLogger.error('QUERY: '+inputline+' is not parseable') if mc.cmd and len(mc.cmd)!=0: mc.process() reply=mc.res if reply=='': reply='{"error":"empty reply"}' MrcLogger.info('REPLY: '+reply) self.send_response(200) self.send_header('Access-Control-Allow-Origin', 'http://'+MrcSettings.BASE_WEBSERVER_HOST) self.end_headers() self.wfile.write(reply) return
def analyseReceivedLine(self, inputline): self.cmd={} try: if inputline.startswith('{'): self.cmd = jsonpickle.decode(inputline) except Exception as e: MrcLogger.info('Exception caught! '+e.__str__())
def run(self): self.server = MrcThreadedHTTPServer(('', self.portnum), MrcHTTPHandler) sa=self.server.socket.getsockname() print ' ... HTTP server launched on '+str(sa[0])+' port '+str(sa[1])+' ...' MrcLogger.info(' ... HTTP server launched on '+str(sa[0])+' port '+str(sa[1])+' ...') self.server.serve_forever() print ' ... HTTP server stopped ...' MrcLogger.info(' ... HTTP server stopped ...')
def process(self): try: currentFile = MrcFile.MrcFile("", True, False) if self.query.fileid: currentFile = MrcFile.getFromFileCache(self.query.fileid) if not currentFile.path: MrcLogger.error("failed to get file from cache with file id " + self.query.fileid) self.reply.error = "failed to get file from cache with file id " + self.query.fileid return if not currentFile.isdir: self.reply.error = "not a music directory: " + currentFile.path return self.gatherMusicFiles(currentFile) if not self.files: self.reply.error = "no music file in: " + currentFile.path return MrcPlayer.instance().playFiles(self.files) except Exception as e: self.reply.error = e.__str__()
def processByFileId(self): try: pathToBrowse=MrcSettings.BASE_MUSIC_PATH if self.query.fileid: self.reply.currentFolder=MrcFile.getFromFileCache(self.query.fileid) pathToBrowse+=self.reply.currentFolder.path if not pathToBrowse: MrcLogger.error('failed to get file from cache with file id '+self.query.fileid) self.error='failed to get file from cache with file id '+self.query.fileid i=0 for f in os.listdir(pathToBrowse): i+=1 fpath=pathToBrowse+MrcSettings.OS_SEPARATOR+f fpath=fpath[len(MrcSettings.BASE_MUSIC_PATH):] if fpath.startswith(MrcSettings.OS_SEPARATOR): fpath=fpath[len(MrcSettings.OS_SEPARATOR):] if os.path.isdir(pathToBrowse+MrcSettings.OS_SEPARATOR+f): mf=MrcFile.MrcFile(fpath, True, False) mf.setFileId(self.query.fileid, i) mf.getDisplayName() self.reply.files.append(mf) MrcFile.addToFileCache(mf) else: ismusicfile=False for ext in MrcSettings.MUSIC_FILE_EXTENSIONS: if f.lower().endswith(ext): ismusicfile=True break if ismusicfile: mf=MrcFile.MrcFile(fpath, False, True) mf.setFileId(self.query.fileid, i) mf.getDisplayName() self.reply.files.append(mf) MrcFile.addToFileCache(mf) self.reply.files=sorted(self.reply.files, key=lambda mf:mf.getSortingName()) except Exception as e: self.reply.error=e.__str__()
def next(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.next called while wokenUp is False! Not going next...') return if not self.playlist.next(): return self.playCurrent() except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.next: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.next: '+e.__str__())
def playFiles(self, mrcfiles): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.playFiles called while wokenUp is False! Not playing...') return self.playlist.clean() self.playlist.addFileList(mrcfiles) self.playCurrent() except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.playFiles: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.playFiles: '+e.__str__())
def unpause(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.unpause called while wokenUp is False! Not unpausing...') return if self.pausing and not self.playing: pygame.mixer.music.unpause() self.playing=True self.pausing=False except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.unpause: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.unpause: '+e.__str__())
def goToSleep(self): try: with self.lock: print ' ... MrcPlayerInstance going to sleep ...' MrcLogger.info(' ... MrcPlayerInstance going to sleep ...') self.eventDequeuerThread.goToSleep() self.eventDequeuerThread.join() self.playlist.clean() pygame.mixer.quit() self.wokenUp=False except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.goToSleep: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.goToSleep: '+e.__str__())
def wakeUp(self): try: with self.lock: print ' ... MrcPlayerInstance waking up ...' MrcLogger.info(' ... MrcPlayerInstance waking up ...') pygame.init() pygame.mixer.init() self.eventDequeuerThread.start() pygame.mixer.music.set_endevent(pygame.USEREVENT) self.wokenUp=True except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.wakeUp: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.wakeUp: '+e.__str__())
def stop(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.stop called while wokenUp is False! Not stopping...') return if not ( self.playing or self.pausing ): return pygame.mixer.music.stop() self.playing=False self.pausing=False except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.stop: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.stop: '+e.__str__())
def setVolumeDown(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.setVolumeDown called while wokenUp is False! Not setting volume down...') return currentVolume = pygame.mixer.music.get_volume() if currentVolume > 0.05: pygame.mixer.music.set_volume(currentVolume-0.05) elif currentVolume != 0.0: pygame.mixer.music.set_volume(0.0) except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.setVolumeDown: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.setVolumeDown: '+e.__str__())
def getPlayList(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.getPlayList called while wokenUp is False! Not getting playlist...') return None, -1, False, 'Player not woken up, please try again later' files = [] for f in self.playlist.files: files.append(f) if files[len(files)-1].path.startswith(MrcSettings.BASE_MUSIC_PATH): files[len(files)-1].path=files[len(files)-1].path[len(MrcSettings.BASE_MUSIC_PATH):] return files, self.playlist.current, self.pausing, '' except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.getPlayList: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.getPlayList: '+e.__str__())
def playCurrent(self): try: with self.lock: if not self.wokenUp: MrcLogger.error('MrcPlayer.playCurrent called while wokenUp is False! Not playing...') return self.stop() curr=self.playlist.getCurrentFileName() if curr==None: return pygame.mixer.music.load(curr) pygame.mixer.music.play() self.playing=True self.pausing=False except pygame.error as e: MrcLogger.error('pygame.error caught in MrcPlayer.playCurrent: '+e.__str__()) except Exception as e: MrcLogger.error('Exception caught in MrcPlayer.playCurrent: '+e.__str__())
def addToFileCache(mf): if mf.fileid: MrcFileCache[mf.fileid]=mf else: MrcLogger.error('Tried to add file to cache with empty id: '+mf.filepath)
def interpret(userinput): userinput=userinput.strip() MrcLogger.info('userinput ['+userinput+']') if(userinput=='Q'): return False return True
def process(self): if 'command' not in self.cmd: MrcLogger.error('MrcCommander failed to parse incoming query: no "command" key!') return if self.cmd['command']=='Browse': if 'fileid' not in self.cmd: MrcLogger.error('MrcCommander failed to parse CmdBrowse incoming query: no "fileid" key!') return c=CmdBrowse(self.cmd['fileid']) c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='PlayFile': if 'fileid' not in self.cmd: MrcLogger.error('MrcCommander failed to parse CmdPlayFile incoming query: no "fileid" key!') return c=CmdPlayFile(self.cmd['fileid']) c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='PlayDir': if 'fileid' not in self.cmd: MrcLogger.error('MrcCommander failed to parse CmdPlayDir incoming query: no "fileid" key!') return c=CmdPlayDir(self.cmd['fileid']) c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='PlayList': c=CmdPlayList() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='Prev': c=CmdPrev() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='Next': c=CmdNext() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='Pause': c=CmdPause() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='Unpause': c=CmdUnpause() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='VolumeUp': c=CmdVolumeUp() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return if self.cmd['command']=='VolumeDown': c=CmdVolumeDown() c.process() self.res=jsonpickle.encode(c.reply, unpicklable=False) return
def interpret(userinput): userinput=userinput.strip() MrcLogger.info('userinput ['+userinput+']') if(userinput=='Q'): return False return True ################### ###### MAIN ####### ################### print print '---------- MusicRemoteControlServer ------------' print MrcLogger.info('---------- MusicRemoteControlServer ------------') if len(sys.argv)!=2: print 'ERROR: you need to specify a port number as first argument!!' MrcLogger.error('no first argument for specifying the port number : exiting...') usage() exit() portnum=0 try: portnum=int(sys.argv[1]) except ValueError: print 'ERROR: you need to specify a port number as first argument!!' MrcLogger.error('first argument failed to be parsed as a port number : exiting...') usage() exit()