From a93490cf99c55917b43d7bdb4d6fd196dc0d223e Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Tue, 21 Nov 2023 02:37:34 +0100 Subject: [PATCH] Allow to filter products by Device ID using --device-id option This allows to easily filter only builds supporting x86_64. --- gibMacOS.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/gibMacOS.py b/gibMacOS.py index bcd38ef..fd395f7 100755 --- a/gibMacOS.py +++ b/gibMacOS.py @@ -224,7 +224,13 @@ class gibMacOS: name = re.search(r"(.+?)",dist_file).group(1) except: pass - return (build,version,name) + try: + # XXX: This is parsing a JavaScript array from the script part of the dist file. + device_ids = re.search(r"var supportedDeviceIDs\s*=\s*\[([^]]+)\];", dist_file)[1] + device_ids = set(i.lower() for i in re.findall(r"'([^',]+)'", device_ids)) + except: + device_ids = set() + return (build,version,name,device_ids) def get_dict_for_prods(self, prods, plist_dict = None): if plist_dict==self.catalog_data==None: @@ -262,8 +268,8 @@ class gibMacOS: prodd["packages"] = plist_dict.get("Products",{}).get(prod,{}).get("Packages",[]) # Get size prodd["size"] = self.d.get_size(sum([i["Size"] for i in prodd["packages"]])) - # Attempt to get the build/version info from the dist - prodd["build"],v,n = self.get_build_version(plist_dict.get("Products",{}).get(prod,{}).get("Distributions",{})) + # Attempt to get the build/version/name/device-ids info from the dist + prodd["build"],v,n,prodd["device_ids"] = self.get_build_version(plist_dict.get("Products",{}).get(prod,{}).get("Distributions",{})) prodd["title"] = smd.get("localization",{}).get("English",{}).get("title",n) print(" -->{}. {} ({}){}".format( str(len(prod_list)+1).rjust(3), @@ -527,10 +533,18 @@ class gibMacOS: return self.download_prod(self.mac_prods[menu-1], dmg) - def get_latest(self, dmg = False): + def get_latest(self, device_id = None, dmg = False): self.u.head("Downloading Latest") print("") - self.download_prod(sorted(self.mac_prods, key=lambda x:x['version'], reverse=True)[0], dmg) + prods = sorted(self.mac_prods, key=lambda x:x['version'], reverse=True) + if device_id: + prod = next(p for p in prods if device_id.lower() in p["device_ids"]) + if not prod: + print("No version found for Device ID '{}'".format(device_id)) + return + else: + prod = prods[0] + self.download_prod(prod, dmg) def get_for_product(self, prod, dmg = False): self.u.head("Downloading for {}".format(prod)) @@ -541,7 +555,7 @@ class gibMacOS: return print("{} not found".format(prod)) - def get_for_version(self, vers, build = None, dmg = False): + def get_for_version(self, vers, build = None, device_id = None, dmg = False): self.u.head("Downloading for {} {}".format(vers, build or "")) print("") # Map the versions to their names @@ -553,6 +567,8 @@ class gibMacOS: for p in sorted(self.mac_prods, key=lambda x:x['version'], reverse=True): if build and p["build"] != build: continue + if device_id and device_id.lower() not in p["device_ids"]: + continue pt = p["title"].lower() pv = p["version"].lower() # Need to compare verisons - n = name, v = version @@ -591,6 +607,7 @@ if __name__ == '__main__': parser.add_argument("-v", "--version", help="sets the version of macOS to target - eg '-v 10.14' or '-v Yosemite'") parser.add_argument("-b", "--build", help="sets the build of macOS to target - eg '22G120' (must be used together with --version)") parser.add_argument("-m", "--maxos", help="sets the max macOS version to consider when building the url - eg 10.14") + parser.add_argument("-D", "--device-id", help="use with --version or --latest to search for versions supporting the specified Device ID - eg VMM-x86_64 for any x86_64") parser.add_argument("-i", "--print-urls", help="only prints the download URLs, does not actually download them", action="store_true") args = parser.parse_args() @@ -622,13 +639,13 @@ if __name__ == '__main__': g.set_prods() if args.latest: - g.get_latest(args.dmg) + g.get_latest(device_id=args.device_id, dmg=args.dmg) exit() if args.product != None: g.get_for_product(args.product, args.dmg) exit() if args.version != None: - g.get_for_version(args.version, args.build, args.dmg) + g.get_for_version(args.version, args.build, device_id=args.device_id, dmg=args.dmg) exit() while True: