Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- import json
- import os
- import wget
- import zipfile
- import sys, io
- # import re
- from urllib.parse import urlparse, urlencode, parse_qsl
- from bs4 import BeautifulSoup as bs
- #######################
- ENCODING_STR = "utf-8"
- sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=ENCODING_STR)
- os.system("cls")
- def separator(_chr: str, _count: int):
- print(f"{_chr * _count}")
- HOME_URL = "https://mods.vintagestory.at/"
- ###### API's ######
- MAIN_API = "http://mods.vintagestory.at/api"
- MOD_API = f"{MAIN_API}/mod/"
- """
- CHANGELOG_API = f"{MAIN_API}/changelogs/" # eg: http://mods.vintagestory.at/api/changelogs/4405 <-- [assetid]=4405
- TAGS_API = f"{MAIN_API}/tags"
- SEARCH_MOD_API = f"{MAIN_API}/mods?"
- SEARCH_PARAMS_QUERY = {
- "tagids[]": "",
- "gameversion": "",
- "gameversions[]": "",
- "author": "",
- "text": "",
- "orderby": "",
- "orderdirection": "",
- }
- SEARCH_PARAMS_QUERY["tagids[]"] = "7"
- SEARCH_PARAMS_QUERY["gameversion"] = "239"
- SEARCH_PARAMS_QUERY["gameversions[]"] = ""
- SEARCH_PARAMS_QUERY["author"] = ""
- SEARCH_PARAMS_QUERY["text"] = ""
- SEARCH_PARAMS_QUERY["orderby"] = "lastreleased"
- # Order by, one of: 'asset.created', 'lastreleased', 'downloads', 'follows', 'comments', 'trendingpoints' (default: asset.created)
- SEARCH_PARAMS_QUERY["orderdirection"] = ""
- # Order direction, one of: 'desc', 'asc' (default: desc)
- sorted_params_dict = {}
- for item in SEARCH_PARAMS_QUERY.items():
- if item[1] == "":
- print("empty")
- else:
- sorted_params_dict.update(dict({item[0]: item[1]}))
- print(sorted_params_dict)
- urls_parsed = urlparse(SEARCH_MOD_API)
- query = dict(parse_qsl(urls_parsed.query))
- query.update(sorted_params_dict)
- new_url = urls_parsed._replace(query=urlencode(query, safe="[]")).geturl()
- print(new_url)
- mods_sres = requests.get(new_url, timeout=60)
- print(json.dumps(mods_sres.json(), indent=2))
- """
- #########################
- curr_path = os.path.dirname(os.path.abspath(__file__))
- if not os.path.isfile(".\\modsdir.txt"):
- f = open(".\\modsdir.txt", "w+", encoding=ENCODING_STR)
- mods_dir = input("What is your mod directory?")
- f.write(mods_dir)
- # f.close
- f = open(".\\modsdir.txt", "r", encoding=ENCODING_STR)
- if f.read() == "":
- f.close()
- f = open(".\\modsdir.txt", "w", encoding=ENCODING_STR)
- mods_dir = input("What is your mod directory?")
- f.write(mods_dir)
- f.close()
- f.close()
- f = open(".\\modsdir.txt", "r", encoding=ENCODING_STR)
- modpath = f.read()
- f.close()
- PATH_OUT = ".\\output"
- if not os.path.isdir(PATH_OUT):
- os.mkdir(PATH_OUT)
- print("Creating output directory")
- modlist = os.listdir(modpath)
- mod_info_list = []
- print("Mods in your folder: \n")
- for mod in modlist:
- # Get modinfo.json data inside local mod-zipfile
- if mod.endswith(".zip"):
- get_zip = zipfile.ZipFile(os.path.join(modpath, mod), mode="r")
- with get_zip.open("modinfo.json", mode="r") as mod_info:
- mod_info_content = mod_info.read().decode(ENCODING_STR)
- # print(mod_info_content)
- try:
- mod_info_json = json.loads(mod_info_content)
- if "name" in mod_info_json:
- mod_info_list.append(mod_info_json)
- print(mod_info_json["name"])
- else:
- print("Key 'name' was not found in mod_info_json")
- except json.decoder.JSONDecodeError as e:
- print(f"Error parsing JSON for {mod}: {e}")
- separator("_", 50)
- print("\nChecking for updates...\n")
- new_changes = []
- for mod in mod_info_list:
- API_REQ = f"{MOD_API}{str(mod['modid'])}"
- # Get new mod info data from database to check version
- if "modid" in mod:
- try:
- mod_res = requests.get(
- API_REQ, headers={"Accept": "application/json"}, timeout=60
- )
- res_modinfo = mod_res.json()["mod"]
- asset_id = res_modinfo["assetid"]
- releases = res_modinfo["releases"][0]
- if releases["modversion"] != mod["version"]:
- separator("_", 50)
- separator("#", 50)
- print(f"\n{mod['name']} has a newer version!")
- new_changes.append("x")
- try:
- # Pull data from HTML at the mod website for changelog. API don't serve specifics in it for that as it seems for now.
- MOD_URL = f"{HOME_URL}{str(mod['modid'])}"
- mod_changelog_res = requests.get(MOD_URL, timeout=60)
- CHLOG_NAME = "changelogtext"
- # regex = r""
- # for m in CHLOG_NAME:
- # regex = regex + r"[\_\-\.'\!\s]*" + m
- # regex = regex + r"[\_\-\.'\!\s]*"
- # html_chname = mod_changelog_res.text.strip(" _-.'!") # useless!?
- url_chname = bs(mod_changelog_res.text, features="html.parser")
- # print(url_chname)
- # search in html for '<div class="changelogtext">' tags.
- res_chname = url_chname.find_all(
- "div",
- class_=CHLOG_NAME,
- )
- chlog_text = ""
- if len(res_chname) < 1:
- print("no changelog found")
- else:
- chlog_text = res_chname[0].get_text()
- """
- Get first '<div class="changelogtext">' where latest changlog text is ans extract it.
- ex:
- <div class="changelogtext" style="display:none;">
- <strong>v1.7.4</strong><br>
- <h3>Changelog</h3>
- <ul>
- <li>Fix Japanese translation - thanks @RikeiR.</li>
- <li>Fix issue when unable to place carried block</li>
- </ul>
- </div>
- """
- ####################
- print(
- f"Current version= {mod['version']} >>> new version= {releases['modversion']}"
- )
- chlogvStr = f"{CHLOG_NAME} v{releases['modversion']}:"
- separator("-", len(chlogvStr))
- print(f"ChangeLog v{releases['modversion']}:")
- for lines in chlog_text.splitlines():
- if f"v{releases['modversion']}" not in lines:
- print(f"\t{lines}")
- separator("-", len(chlogvStr))
- except IndexError as e:
- print("IndexError:", e)
- except requests.exceptions.Timeout as e:
- print("WEB_HTML: requests.exceptions.Timeout:", e)
- #################################
- print("\nDownloading from:")
- file_id = releases["fileid"]
- downlink = f"{HOME_URL}download?fileid={str(file_id)}"
- print(downlink)
- repl_str = f"{PATH_OUT}/"
- response = wget.download(downlink, out=PATH_OUT).replace(repl_str, "")
- print(f"\nDone! Check output folder for file: {response}\n")
- #################################
- separator("#", 50)
- separator("_", 50)
- else:
- print(mod["name"] + " is the latest!")
- except KeyError as e:
- print(e)
- except TypeError as e:
- print(e)
- except IndexError as e:
- print("IndexError:", e)
- except requests.exceptions.Timeout as e:
- print("MOD: requests.exceptions.Timeout:", e)
- else:
- print(f"modid key does not exist for mod: {mod['name']}")
- separator("_", 50)
- if len(new_changes) == 0:
- print("Everything is up to date!")
- input("\n\nDownload complete, press Enter to exit!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement