def track(self, track_id, duration, **kwargs): # Check sanity of the request self._check_request() # Calculate file size, and obtain the header duration = int(duration) wave_header, filesize = create_wave_header(duration) request_range = cherrypy.request.headers.get('Range', '') range_l = 0 range_r = filesize # headers if request_range and request_range != "bytes=0-": # partial request cherrypy.response.status = '206 Partial Content' cherrypy.response.headers['Content-Type'] = 'audio/x-wav' range = cherrypy.request.headers["Range"].split("bytes=")[1].split("-") range_l = int(range[0]) try: range_r = int(range[1]) except: range_r = filesize chunk = range_r - range_l cherrypy.response.headers['Accept-Ranges'] = 'bytes' cherrypy.response.headers['Content-Length'] = chunk cherrypy.response.headers['Content-Range'] = "bytes %s-%s/%s" % (range_l, range_r, filesize) else: # full file cherrypy.response.headers['Content-Type'] = 'audio/x-wav' cherrypy.response.headers['Accept-Ranges'] = 'bytes' cherrypy.response.headers['Content-Length'] = filesize # If method was GET, write the file content if cherrypy.request.method.upper() == 'GET': return self.send_audio_stream(track_id, filesize, wave_header, range_l)
def silence(self, duration, **kwargs): '''stream silence audio for the given duration, used by spotify connect player''' duration = float(duration) wave_header, filesize = create_wave_header(duration) output_buffer = BytesIO() output_buffer.write(wave_header) output_buffer.write(bytes('\0' * (filesize - output_buffer.tell()), 'utf-8')) return cherrypy.lib.static.serve_fileobj(output_buffer.read(), content_type="audio/wav", name="%s.wav" % duration, debug=True)
def silence(self, duration, **kwargs): '''stream silence audio for the given duration, used by spotify connect player''' duration = int(duration) wave_header, filesize = create_wave_header(duration) output_buffer = StringIO() output_buffer.write(wave_header) output_buffer.write('\0' * (filesize - output_buffer.tell())) return cherrypy.lib.static.serve_fileobj(output_buffer, content_type="audio/wav", name="%s.wav" % duration, filesize=output_buffer.tell())
def track(self, track_id, duration, **kwargs): # Check sanity of the request self._check_request() # Calculate file size, and obtain the header duration = int(float(duration)) wave_header, filesize = create_wave_header(duration) request_range = cherrypy.request.headers.get('Range', '') # response timeout must be at least the duration of the track: read/write loop # checks for timeout and stops pushing audio to player if it occurs cherrypy.response.timeout = int(math.ceil(duration * 1.5)) range_l = 0 range_r = filesize # headers if request_range and request_range != "bytes=0-": # partial request cherrypy.response.status = '206 Partial Content' cherrypy.response.headers['Content-Type'] = 'audio/x-wav' range = cherrypy.request.headers["Range"].split("bytes=")[1].split( "-") log_msg( "request header range: %s" % (cherrypy.request.headers['Range']), xbmc.LOGDEBUG) range_l = int(range[0]) try: range_r = int(range[1]) except: range_r = filesize cherrypy.response.headers['Accept-Ranges'] = 'bytes' cherrypy.response.headers['Content-Length'] = filesize cherrypy.response.headers['Content-Range'] = "bytes %s-%s/%s" % ( range_l, range_r, filesize) log_msg( "partial request range: %s, length: %s" % (cherrypy.response.headers['Content-Range'], cherrypy.response.headers['Content-Length']), xbmc.LOGDEBUG) else: # full file cherrypy.response.headers['Content-Type'] = 'audio/x-wav' cherrypy.response.headers['Accept-Ranges'] = 'bytes' cherrypy.response.headers['Content-Length'] = filesize log_msg("!! Full File. Size : %s " % (filesize), xbmc.LOGDEBUG) # If method was GET, write the file content if cherrypy.request.method.upper() == 'GET': return self.send_audio_stream(track_id, filesize, wave_header, range_l)