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 parse(cls, selector): with contextlib.closing(StringIO()) as result: if type(selector) == dict: for k, v in selector.items(): result.write('%s:(%s)' % (to_utf8(k), cls.parse(v))) elif type(selector) in (list, tuple): result.write(','.join(map(cls.parse, selector))) else: result.write(to_utf8(selector)) return result.getvalue()
def test_config(): config_str = ''' [Section1] foo=boy bar : I'm a %(foo)s [Section2] baz=%(new)s value ''' config = DictionaryConfig() with StringIO(config_str) as sio: config.readfp(sio) assert 'boy' == config['Section1']['foo'] assert "I'm a boy" == config['Section1']['bar'] config['Section2']['new'] = 'some' assert 'some' == config['Section2']['new'] assert 'some value' == config['Section2']['baz'] del config['Section2']['baz'] assert ['new'] == config['Section2'].keys()
def send_audio_stream(self, track_id, filesize, wave_header, range_l): '''chunked transfer of audio data from spotty binary''' log_msg("start transfer for track %s - range: %s" % (track_id, range_l), xbmc.LOGDEBUG) spotty_bin = None try: # Initialize some loop vars max_buffer_size = 1024000 output_buffer = StringIO() bytes_written = 0 has_frames = True # Write wave header output_buffer.write(wave_header) bytes_written = output_buffer.tell() if not range_l: yield wave_header output_buffer.truncate(0) # get pcm data from spotty stdout and append to our buffer args = ["-n", "temp", "--single-track", track_id] spotty_bin = self.__spotty.run_spotty(args) # ignore the first x bytes to match the range request if range_l: spotty_bin.stdout.read(range_l - bytes_written) # Loop as long as there's something to output frame = spotty_bin.stdout.read(max_buffer_size) while has_frames: if cherrypy.response.timed_out: log_msg("response timeout !", xbmc.LOGDEBUG) break try: if not frame or len(frame) < max_buffer_size: has_frames = False output_buffer.write(frame) bytes_written += len(frame) frame = spotty_bin.stdout.read(max_buffer_size) except Exception as exc: log_exception(__name__, exc) has_frames = False finally: # Check if the current buffer needs to be flushed if not has_frames or output_buffer.tell() > max_buffer_size: yield output_buffer.getvalue() output_buffer.truncate(0) # Add some silence padding until the end is reached (if needed) while bytes_written < filesize: if bytes_written + max_buffer_size < filesize: # The buffer size fits into the file size yield '\0' * max_buffer_size bytes_written += max_buffer_size else: # Does not fit, just generate the remaining bytes yield '\0' * (filesize - bytes_written) memory_buffer.write(frame) bytes_written = filesize except Exception as exc: log_msg(__name__, exc) finally: # make sure spotty always gets terminated if spotty_bin: spotty_bin.terminate() log_msg("FINISH transfer for track %s - range %s" % (track_id, range_l), xbmc.LOGDEBUG)