import argparse from glob import glob import os.path as OSPATH import requests from bs4 import BeautifulSoup from subprocess import call import os, shutil STEAM_COLLECTION_URL = "https://steamcommunity.com/sharedfiles/filedetails/?id=2620032135" MAPS = "../maps" DOWNLOAD_LINE = "{client.exe} +login {client.login} +workshop_download_item {_map.app_id} {_map.map_id} +quit" class SteamClient: exe = "../steam/steamcmd.exe" login = "anonymous" class BspSrc: java = "javaw" jar = "../bspsrc/bspsrc.jar" class Tf2Map: app_id = 440 map_id = 0 def __init__(self, url, name) -> None: self.map_id = int(url.split("?id=")[1]) self.url = url self.name = name.replace("|", " ").replace("\\", " ").replace("/"," ") def __str__(self): return f'{self.name} | {self.url}' def __repr__(self) -> str: return self.__str__() @property def downloaded(self): os.chdir(os.path.dirname(__file__)) r = f"../maps/{self.name}/*.bsp" r = r.replace("[","*").replace("]","*") print(f"Watch bsp in {r}") return glob(r) @property def sourced(self): os.chdir(os.path.dirname(__file__)) r = f"../maps/{self.name}/*.vmf" r = r.replace("[","*").replace("]","*") print(f"Watch vmf in {r}") return glob(r) def decompiler(self): os.chdir(os.path.dirname(__file__)) cmd = "{amongus.java} -jar {amongus.jar} \"{0}\"".format(self.downloaded[0], amongus = BspSrc()) print(cmd) for source in self.sourced: os.remove(source) call(cmd) shutil.move(self.sourced[0], self.sourced[0].replace("_d.vmf", ".vmf")) return self.sourced def readme(self): with open(os.path.dirname(self.downloaded[0]) + "/README", "w", encoding="utf8") as readme: readme.write(self.url) class CollectionMap: pass class CollectionParser: response = None def __init__(self, url): self.response = requests.get(url).text self.soup = BeautifulSoup(self.response, "html.parser") def foundMaps(self, skip_downloaded = True) -> list[CollectionMap]: _list = [] all = 0 download = 0 for collect in self.soup.findAll('div', class_='collectionItem'): url = collect.find("div", class_="workshopItem").find("a")['href'] name = collect.find("div", class_="collectionItemDetails").find("div", class_="workshopItemTitle").text _item = Tf2Map(url, name) if _item.downloaded and skip_downloaded: print(f"{name} already downloaded") else: _list.append(_item) download += 1 all += 1 print(f"Всего карт будет загружено: {download}, всего найдено {all}") return _list class MapDownloader: def process(self, _map: Tf2Map): self.download(_map) self.move(_map) _map.decompiler() _map.readme() def download(self, _map): os.chdir(os.path.dirname(__file__)) cmd = DOWNLOAD_LINE.format(client = SteamClient(), _map = _map) self.call(cmd) def move(self, _map): os.chdir(os.path.dirname(__file__)) os.chdir("../maps") os.mkdir(_map.name) if not OSPATH.exists(_map.name) else None shutil.move(glob(f"../steam/steamapps/workshop/content/{_map.app_id}/{_map.map_id}/*.bsp")[0], _map.name) if glob(f"../steam/steamapps/workshop/content/{_map.app_id}/{_map.map_id}/*.bsp") else None def call(self, cmd): print(cmd) call(cmd) if __name__ == "__main__": for _map in CollectionParser(STEAM_COLLECTION_URL).foundMaps(): MapDownloader().process(_map)