import re from api_fetcher import APIFetcher class VersionFinder: def __init__(self) -> None: pass class TemplateGenerator: """模板创建类 Args: 从网页获取的url数组 Returns: 模板数组, 版本区域由{0}替代 """ def __init__(self, urls: list) -> list[str]: self.linux_link = [] self.windows_link = "" self.mac_link = [] for i in urls: if re.search("(deb|rpm)", i) is not None: self.linux_link.append(i) elif re.search("exe", i) is not None: if self.windows_link != "": continue self.windows_link = i elif re.search("dmg", i) is not None: self.mac_link.append(i) def linux(self): arch = ["arm64", "amd64"] url_template = [] for url in self.linux_link: # print(url) version = re.search( r"(?P(?<=[_/])((?:[0-9]{1,2}(?:\.)?){1,3})(?=[_/])).*(?P(?<=\.)[a-z]{3,4}$)", url, ).group("pkg", "version") self.linux_version = version[1] if version[0] == "rpm": url_template.append(re.sub(version[1], "{0}", url)) else: template = re.sub("amd64", "{0}", url) url_template += [ re.sub(version[1], "{0}", template.format(i)) for i in arch ] return url_template def windows(self): self.windows_version = re.search( r"(?P([0-9]{1,2}(\.)?){3,4}(?=\.|_|\/))", self.windows_link ).group("version") return re.sub(self.windows_version, "{0}", self.windows_link) def mac(self): versions = {} url_template = [] for url in self.mac_link: version = re.search( r"(?P(?<=[_])((?:[0-9]{1,2}(?:\.)?){1,3})(?=[_\.]))", url, ).group("version") if re.search("arm", url): versions["arm"] = version url_template.append(re.sub(version, "{0}", url)) else: versions["amd"] = version url_template.append(re.sub(version, "{0}", url)) self.mac_version = versions return url_template def __version_compear(a: str, b: str): a_split = a.split(".") b_split = b.split(".") flag = False if len(a) == len(b): length = len(a_split) for i in range(length): if a_split[i] > b_split[i]: flag = True if flag: return a else: return b else: print("The two version numbers have different lengths.") return a def version_setter(self, api_version): self.linux_version = self.__version_compear( self.linux_version, api_version.linux_version() ) self.windows_version = self.__version_compear( self.windows_version, api_version.windows_version() ) self.mac_version = self.__version_compear( self.mac_version, api_version.mac_version() ) def run(self, urls: list): tg = self.TemplateGenerator(urls) linux_template = tg.linux() windows_template = tg.windows() mac_template = tg.mac() self.linux_version = tg.linux_version self.windows_version = tg.windows_version self.mac_version = tg.mac_version api = APIFetcher() api.run() self.version_setter(api) def append_json(self): pass if __name__ == "__main__": # import doctest # doctest.testmod() urls = [ "https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.19.0.18.exe", "https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_6.9.10.1.exe", "https://issuepcdn.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_4.11.0.dmg", "https://issuepcdn.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_4.11.0_arm64.dmg", "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk-4.11.5.x86_64.rpm", "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk_4.11.5_amd64.deb", ] vf = VersionFinder() vf.run(urls) print(vf.linux_version) pass