def run(self): self.state = 'reading' self.emit('reading') self.on_open.set(True) last_progress = None for chunk in self.response.iter_content(self.chunk_size): self.buffer.extend(chunk) self.emit('received', len(chunk), __suppress=True) log.log(logging.TRACE, '[%s] [%s] Received chunk - len(chunk): %s', self.track.uri, self.stream_num, len(chunk)) last_progress = log_progress(self, '[%s] Reading' % self.stream_num, len(self.buffer), last_progress) self.on_reading.wait() self.state = 'buffered' self.emit('buffered')
def run(self): self.state = 'reading' self.emit('reading') self.on_open.set(True) last_progress = None for chunk in self.response.iter_content(self.chunk_size): self.buffer.extend(chunk) self.emit('received', len(chunk), __suppress=True) log.log( logging.TRACE, '[%s] [%s] Received chunk - len(chunk): %s', self.track.uri, self.stream_num, len(chunk) ) last_progress = log_progress(self, '[%s] Reading' % self.stream_num, len(self.buffer), last_progress) self.on_reading.wait() self.state = 'buffered' self.emit('buffered')
def iter(self, c_range): """ :type c_range: plugin.range.ContentRange """ with self.request_lock: num = self.request_seq self.request_seq += 1 position = 0 end = self.content_range.end + 1 last_progress = None ev_received = Event() @self.on(['received', 'buffered']) def on_received(*args): ev_received.set() if c_range: position = c_range.start - self.content_range.start end = (c_range.end - self.content_range.start) + 1 log.info( '[%s] [%s:%s] Streaming - c_range: %s, position: %s, end: %s', self.track.uri, self.stream_num, num, c_range, position, end) while position < self.content_length: chunk_size = end - position # Clamp to maximum `chunk_size` if chunk_size > self.chunk_size: chunk_size = self.chunk_size # Check if range has reached the end if not chunk_size: log.debug('[%s] [%s:%s] Range complete', self.track.uri, self.stream_num, num) break chunk = self.buffer[position:position + chunk_size] if chunk: log.log(logging.TRACE, '[%s] [%s:%s] Sending chunk - len(buffer[%s:%s]): %s', self.track.uri, self.stream_num, num, position, position + chunk_size, len(chunk)) last_progress = log_progress(self, '[%s:%s] Streaming' % (self.stream_num, num), position, last_progress, length=end) position += len(chunk) yield str(chunk) elif self.state != 'buffered': log.log(logging.TRACE, '[%s] [%s:%s] Waiting for buffer', self.track.uri, self.stream_num, num) ev_received.clear() ev_received.wait() else: log.debug('[%s] [%s:%s] Buffer doesn\'t contain range [%s:%s]', self.track.uri, self.stream_num, num, position, position + chunk_size) break self.off('received', on_received)\ .off('buffered', on_received) log.info('[%s] [%s:%s] Complete', self.track.uri, self.stream_num, num)
def iter(self, c_range): """ :type c_range: plugin.range.ContentRange """ with self.request_lock: num = self.request_seq self.request_seq += 1 position = 0 end = self.content_range.end + 1 last_progress = None ev_received = Event() @self.on(['received', 'buffered']) def on_received(*args): ev_received.set() if c_range: position = c_range.start - self.content_range.start end = (c_range.end - self.content_range.start) + 1 log.info( '[%s] [%s:%s] Streaming - c_range: %s, position: %s, end: %s', self.track.uri, self.stream_num, num, c_range, position, end ) while position < self.content_length: chunk_size = end - position # Clamp to maximum `chunk_size` if chunk_size > self.chunk_size: chunk_size = self.chunk_size # Check if range has reached the end if not chunk_size: log.debug( '[%s] [%s:%s] Range complete', self.track.uri, self.stream_num, num ) break chunk = self.buffer[position:position + chunk_size] if chunk: log.log( logging.TRACE, '[%s] [%s:%s] Sending chunk - len(buffer[%s:%s]): %s', self.track.uri, self.stream_num, num, position, position + chunk_size, len(chunk) ) last_progress = log_progress( self, '[%s:%s] Streaming' % (self.stream_num, num), position, last_progress, length=end ) position += len(chunk) yield str(chunk) elif self.state != 'buffered': log.log( logging.TRACE, '[%s] [%s:%s] Waiting for buffer', self.track.uri, self.stream_num, num ) ev_received.clear() ev_received.wait() else: log.debug( '[%s] [%s:%s] Buffer doesn\'t contain range [%s:%s]', self.track.uri, self.stream_num, num, position, position + chunk_size ) break self.off('received', on_received)\ .off('buffered', on_received) log.info( '[%s] [%s:%s] Complete', self.track.uri, self.stream_num, num )