def screencap(self): t0 = time.perf_counter() if self.compress == 0: s = self.device_session_factory().exec_stream(self.command) header = recvexactly(s, 12) w, h, f = struct.unpack_from('III', header, 0) datalen = w * h * 4 data = recvall(s, datalen + 4, True) s.close() # data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608) assert (f == 1) result = _screencap_to_image((w, h, data[:datalen + 4]), self.screenshot_rotate) else: s = self.device_session_factory().exec_stream(self.command + self.compress_suffix) data = recvall(s, 8388608, True) data = self.decompress(data) w, h, f = struct.unpack_from('III', data, 0) datalen = w * h * 4 s.close() # data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608) assert (f == 1) result = _screencap_to_image((w, h, data[12:datalen + 12 + 4]), self.screenshot_rotate) t = time.perf_counter() - t0 logger.debug('screencap: %.3fms', t * 1000) return result
def screencap(self): s = self.device_session_factory().exec_stream('screencap -p') data = recvall(s, 4194304, True) img = Image.open(BytesIO(data)) if self.screenshot_rotate != 0: img = img.rotate(self.screenshot_rotate) return img
def screencap(self): s = self.device_session_factory().exec_stream('screencap|gzip -1') data = recvall(s, 4194304) s.close() data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608) w, h, f = struct.unpack_from('III', data, 0) assert (f == 1) return _screencap_to_image((w, h, data[12:]), self.screenshot_rotate)
def exec(self, cmd): """run command in device, returns stdout content after the command exits""" if len(cmd) == 0: raise ValueError('no command specified for blocking exec') sock = self.exec_stream(cmd) data = recvall(sock) sock.close() return data
def shell(self, cmd): """run command in device, returns pty output after the command exits""" if len(cmd) == 0: raise ValueError('no command specified for blocking shell') sock = self.shell_stream(cmd) data = recvall(sock) sock.close() return data
def screencap(self): """returns (width, height, pixels) pixels in RGBA/RGBX format""" s = self.device_session_factory().exec_stream('screencap|gzip -1') data = recvall(s, 4194304) s.close() data = zlib.decompress(data, zlib.MAX_WBITS | 16, 8388608) w, h, f = struct.unpack_from('III', data, 0) assert (f == 1) return (w, h, data[12:])
def screencap(self): future = self.rch.register_cookie() with future: control_sock = self.device_session_factory().exec_stream( '(echo -n %s; screencap) | nc %s %d' % (future.cookie.decode(), self.loopback, self.rch.port)) with control_sock, future.get() as conn: data = recvall(conn, 8388608, True) w, h, f = struct.unpack_from('III', data, 0) assert (f == 1) return _screencap_to_image((w, h, data[12:]), self.screenshot_rotate)
def _reverse_connection_screencap(self): """returns (width, height, pixels) pixels in RGBA/RGBX format""" future = self.rch.register_cookie() with future: control_sock = self.device_session_factory().exec_stream( '(echo -n %s; screencap) | nc %s %d' % (future.cookie.decode(), self.loopback, self.rch.port)) with control_sock: with future.get() as conn: data = recvall(conn, 8388608, True) w, h, f = struct.unpack_from('III', data, 0) assert (f == 1) return (w, h, data[12:].tobytes())
def screencap(self): from PIL import Image as PILImage, ImageCms s = self.device_session_factory().exec_stream(self.command) data = recvall(s, 4194304, True) img = PILImage.open(BytesIO(data)) if self.screenshot_rotate != 0: img = img.rotate(self.screenshot_rotate) if icc := img.info.get('icc_profile', ''): iccio = BytesIO(icc) src_profile = ImageCms.ImageCmsProfile(iccio) from imgreco.cms import srgb_profile ImageCms.profileToProfile(img, src_profile, srgb_profile, ImageCms.INTENT_RELATIVE_COLORIMETRIC, inPlace=True)
def _test_reverse_connection(self, loopbacks): for addr in loopbacks: logger.debug('testing loopback address %s', addr) future = self.rch.register_cookie() with future: cmd = 'echo -n %sOKAY | nc -w 1 %s %d' % ( future.cookie.decode(), addr, self.rch.port) logger.debug(cmd) control_sock = self.device_session_factory().exec_stream(cmd) with control_sock: conn = future.get(2) if conn is not None: data = recvall(conn) conn.close() if data == b'OKAY': self.loopback = addr logger.debug('found loopback address %s', addr) return True return False
def screencap_png(self): """returns PNG bytes""" s = self.device_session_factory().exec_stream('screencap -p') data = recvall(s, 4194304) return data