def extract_first_alphabetically(stream): from calibre.libunzip import sort_key names_ = sorted([ x for x in names(stream) if os.path.splitext(x)[1][1:].lower() in { 'png', 'jpg', 'jpeg', 'gif', 'webp'}], key=sort_key) return extract_member(stream, name=names_[0], match=None)
def extract_member( path_or_stream, match=re.compile(r'\.(jpg|jpeg|gif|png)\s*$', re.I), name=None): from unrardll import extract_member if iswindows and name is not None: name = name.replace(os.sep, '/') def is_match(header): fname = header['filename'] if iswindows: fname = fname.replace(os.sep, '/') return (name is not None and fname == name) or \ (match is not None and match.search(fname) is not None) with StreamAsPath(path_or_stream) as path: name, data = extract_member(path, is_match) if name is not None: return name, data
def do_test(stream): c = comment(stream) if c != b'some comment\n': raise ValueError('Comment not read: %r != %r' % (c, b'some comment\n')) if set(names(stream)) != { '1/sub-one', 'one.txt', '2/sub-two.txt', '诶比屁.txt', 'Füße.txt', 'uncompressed', 'max-compressed'}: raise ValueError('Name list does not match') with TemporaryDirectory('test-unrar') as tdir: extract(stream, tdir) for name in tdata: if name not in '1 2 symlink'.split(): with open(os.path.join(tdir, name), 'rb') as s: if s.read() != tdata[name]: raise ValueError('Did not extract %s properly' % name) for name in tdata: if name not in '1 2 symlink'.split(): d = extract_member(stream, name=name) if d is None or d[1] != tdata[name]: raise ValueError( 'Failed to extract %s %r != %r' % (name, d, tdata[name]))
def extract_cover_image(stream): from calibre.libunzip import sort_key, name_ok for name in sorted(names(stream), key=sort_key): if name_ok(name): return extract_member(stream, name=name, match=None)
def test_extract_member(self): self.ae( extract_member(simple_rar, lambda h: h['filename'] == 'one.txt', verify_data=True), ('one.txt', sr_data['one.txt'])) self.ae(extract_member(simple_rar, lambda h: False), (None, None))