"""Search bounded decompressed prefixes of original unsigned local assets."""
import concurrent.futures
import json
import re
import zlib
from pathlib import Path
root=Path(r'D:/SteamLibrary/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/Win64')
pattern=re.compile(rb'galaxy.?map|visualisation|visualization|map.?colou?r|star.?class.?colou?r',re.I)
out=Path('artifacts/galaxy-query-research/palette-resources')
out.mkdir(exist_ok=True)
def scan(directory):
count=0;found=[]
for path in directory.iterdir():
if not path.is_file():continue
with path.open('rb') as stream:
header=stream.read(2)
if header[0:1]!=b'\x78' or len(header)!=2 or ((header[0]<<8)|header[1])%31:continue
data=header+stream.read(65534)
count+=1
try:prefix=zlib.decompressobj().decompress(data,32768)
except zlib.error:continue
if not pattern.search(prefix.replace(b'\0',b'')):continue
strings=[m.group().decode('ascii') for m in re.finditer(rb'[ -~]{4,}',prefix)]
matched=[value for value in strings if pattern.search(value.encode())]
found.append(dict(path=str(path),bytes=path.stat().st_size,prefixBytes=len(prefix),matched=matched,strings=strings[:24]))
(out/(path.name+'.prefix')).write_bytes(prefix)
return count,found
rows=[];count=0
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool:
for observed,found in pool.map(scan,sorted(path for path in root.iterdir() if path.is_dir())):
count+=observed;rows.extend(found)
(out/'zlib-inventory.json').write_text(json.dumps(dict(scope='Read-only first32KiB original zlib asset prefixes',count=count,resources=rows),indent=2),encoding='utf-8')
print(f'zlib={count} matched={len(rows)}',flush=True)
"""Search bounded decompressed prefixes of original unsigned local assets."""
import concurrent.futures
import json
import re
import zlib
from pathlib import Path
root=Path(r'D:/SteamLibrary/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/Win64')
pattern=re.compile(rb'galaxy.?map|visualisation|visualization|map.?colou?r|star.?class.?colou?r',re.I)
out=Path('artifacts/galaxy-query-research/palette-resources')
out.mkdir(exist_ok=True)
def scan(directory):
count=0;found=[]
for path in directory.iterdir():
if not path.is_file():continue
with path.open('rb') as stream:
header=stream.read(2)
if header[0:1]!=b'\x78' or len(header)!=2 or ((header[0]<<8)|header[1])%31:continue
data=header+stream.read(65534)
count+=1
try:prefix=zlib.decompressobj().decompress(data,32768)
except zlib.error:continue
if not pattern.search(prefix.replace(b'\0',b'')):continue
strings=[m.group().decode('ascii') for m in re.finditer(rb'[ -~]{4,}',prefix)]
matched=[value for value in strings if pattern.search(value.encode())]
found.append(dict(path=str(path),bytes=path.stat().st_size,prefixBytes=len(prefix),matched=matched,strings=strings[:24]))
(out/(path.name+'.prefix')).write_bytes(prefix)
return count,found
rows=[];count=0
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool:
for observed,found in pool.map(scan,sorted(path for path in root.iterdir() if path.is_dir())):
count+=observed;rows.extend(found)
(out/'zlib-inventory.json').write_text(json.dumps(dict(scope='Read-only first32KiB original zlib asset prefixes',count=count,resources=rows),indent=2),encoding='utf-8')
print(f'zlib={count} matched={len(rows)}',flush=True)