import struct, urllib.request, zlib UA={'User-Agent':'steam-frame-compat-scan/1.0'} def rng(url, start, end=None): h=dict(UA); h['Range']=f'bytes={start}-' if end is None else f'bytes={start}-{end}' with urllib.request.urlopen(urllib.request.Request(url,headers=h),timeout=60) as r: return r.read() def tail(url, n): h=dict(UA); h['Range']=f'bytes=-{n}' with urllib.request.urlopen(urllib.request.Request(url,headers=h),timeout=60) as r: return r.read() def list_names(url, size): t=tail(url, min(size, 65557)) i=t.rfind(b'PK\x05\x06') if i<0: raise ValueError('no EOCD') cd_size, cd_off = struct.unpack('=base else rng(url, cd_off, cd_off+cd_size-1) names=[]; p=0; entries={} while p+46<=len(cd) and cd[p:p+4]==b'PK\x01\x02': comp,=struct.unpack('