def open(self): method = self.args.get("method", "GET") timeout = self.session.options.get("http-timeout") res = self.session.http.request(method=method, stream=True, exception=StreamError, timeout=timeout, **self.args) def fix_stream(): """ Replace the first 3 bytes of the stream with b'FLV' :return: stream iterator """ content_iter = res.iter_content(8192) data = next(content_iter) yield b'FLV' + data[3:] for chunk in content_iter: yield chunk fd = StreamIOIterWrapper(fix_stream()) if self.buffered: fd = StreamIOThreadWrapper(self.session, fd, timeout=timeout) return fd
def write(self, chunk, res, chunk_size=8192): try: fd = StreamIOIterWrapper(res.iter_content(chunk_size)) for data in self.concater.iter_chunks(fd=fd, skip_header=True): self.reader.buffer.write(data) if self.closed: return self.logger.debug("Download of chunk {0}/{1}/{2} complete", chunk.recording, chunk.quality, chunk.sequence) except IOError as err: self.logger.error("Failed to read chunk {0}/{1}/{2}: {3}", chunk.recording, chunk.quality, chunk.sequence, err)
def test_iter(self): def generator(): yield b"1" * 8192 yield b"2" * 4096 yield b"3" * 2048 fd = StreamIOIterWrapper(generator()) self.assertEqual(fd.read(4096), b"1" * 4096) self.assertEqual(fd.read(2048), b"1" * 2048) self.assertEqual(fd.read(2048), b"1" * 2048) self.assertEqual(fd.read(1), b"2") self.assertEqual(fd.read(4095), b"2" * 4095) self.assertEqual(fd.read(1536), b"3" * 1536) self.assertEqual(fd.read(), b"3" * 512)