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()