Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2024
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.10 KB | Source Code | 0 0
  1. import requests
  2. import json
  3. import os
  4. import wget
  5. import zipfile
  6. import sys, io
  7. # import re
  8. from urllib.parse import urlparse, urlencode, parse_qsl
  9. from bs4 import BeautifulSoup as bs
  10. #######################
  11. ENCODING_STR = "utf-8"
  12.  
  13. sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=ENCODING_STR)
  14.  
  15. os.system("cls")
  16.  
  17.  
  18. def separator(_chr: str, _count: int):
  19.     print(f"{_chr * _count}")
  20.  
  21.  
  22. HOME_URL = "https://mods.vintagestory.at/"
  23. ###### API's ######
  24. MAIN_API = "http://mods.vintagestory.at/api"
  25. MOD_API = f"{MAIN_API}/mod/"
  26. """
  27. CHANGELOG_API = f"{MAIN_API}/changelogs/"  # eg: http://mods.vintagestory.at/api/changelogs/4405  <--  [assetid]=4405
  28. TAGS_API = f"{MAIN_API}/tags"
  29. SEARCH_MOD_API = f"{MAIN_API}/mods?"
  30.  
  31. SEARCH_PARAMS_QUERY = {
  32.    "tagids[]": "",
  33.    "gameversion": "",
  34.    "gameversions[]": "",
  35.    "author": "",
  36.    "text": "",
  37.    "orderby": "",
  38.    "orderdirection": "",
  39. }
  40.  
  41. SEARCH_PARAMS_QUERY["tagids[]"] = "7"
  42. SEARCH_PARAMS_QUERY["gameversion"] = "239"
  43. SEARCH_PARAMS_QUERY["gameversions[]"] = ""
  44. SEARCH_PARAMS_QUERY["author"] = ""
  45. SEARCH_PARAMS_QUERY["text"] = ""
  46. SEARCH_PARAMS_QUERY["orderby"] = "lastreleased"
  47.    # Order by, one of: 'asset.created', 'lastreleased', 'downloads', 'follows', 'comments', 'trendingpoints' (default: asset.created)
  48. SEARCH_PARAMS_QUERY["orderdirection"] = ""
  49.    # Order direction, one of: 'desc', 'asc' (default: desc)
  50.  
  51.  
  52. sorted_params_dict = {}
  53.  
  54. for item in SEARCH_PARAMS_QUERY.items():
  55.    if item[1] == "":
  56.        print("empty")
  57.    else:
  58.        sorted_params_dict.update(dict({item[0]: item[1]}))
  59.        print(sorted_params_dict)
  60.  
  61. urls_parsed = urlparse(SEARCH_MOD_API)
  62. query = dict(parse_qsl(urls_parsed.query))
  63. query.update(sorted_params_dict)
  64. new_url = urls_parsed._replace(query=urlencode(query, safe="[]")).geturl()
  65. print(new_url)
  66. mods_sres = requests.get(new_url, timeout=60)
  67. print(json.dumps(mods_sres.json(), indent=2))
  68. """
  69.  
  70. #########################
  71.  
  72. curr_path = os.path.dirname(os.path.abspath(__file__))
  73. if not os.path.isfile(".\\modsdir.txt"):
  74.     f = open(".\\modsdir.txt", "w+", encoding=ENCODING_STR)
  75.     mods_dir = input("What is your mod directory?")
  76.     f.write(mods_dir)
  77.     # f.close
  78.  
  79. f = open(".\\modsdir.txt", "r", encoding=ENCODING_STR)
  80.  
  81. if f.read() == "":
  82.     f.close()
  83.     f = open(".\\modsdir.txt", "w", encoding=ENCODING_STR)
  84.     mods_dir = input("What is your mod directory?")
  85.     f.write(mods_dir)
  86.     f.close()
  87.  
  88. f.close()
  89.  
  90. f = open(".\\modsdir.txt", "r", encoding=ENCODING_STR)
  91. modpath = f.read()
  92. f.close()
  93.  
  94. PATH_OUT = ".\\output"
  95. if not os.path.isdir(PATH_OUT):
  96.     os.mkdir(PATH_OUT)
  97.     print("Creating output directory")
  98.  
  99. modlist = os.listdir(modpath)
  100.  
  101. mod_info_list = []
  102.  
  103. print("Mods in your folder: \n")
  104. for mod in modlist:
  105.     # Get modinfo.json data inside local mod-zipfile
  106.     if mod.endswith(".zip"):
  107.         get_zip = zipfile.ZipFile(os.path.join(modpath, mod), mode="r")
  108.         with get_zip.open("modinfo.json", mode="r") as mod_info:
  109.             mod_info_content = mod_info.read().decode(ENCODING_STR)
  110.             # print(mod_info_content)
  111.             try:
  112.                 mod_info_json = json.loads(mod_info_content)
  113.                 if "name" in mod_info_json:
  114.                     mod_info_list.append(mod_info_json)
  115.                     print(mod_info_json["name"])
  116.                 else:
  117.                     print("Key 'name' was not found in mod_info_json")
  118.             except json.decoder.JSONDecodeError as e:
  119.                 print(f"Error parsing JSON for {mod}: {e}")
  120. separator("_", 50)
  121. print("\nChecking for updates...\n")
  122.  
  123. new_changes = []
  124. for mod in mod_info_list:
  125.     API_REQ = f"{MOD_API}{str(mod['modid'])}"
  126.     # Get new mod info data from database to check version
  127.     if "modid" in mod:
  128.         try:
  129.             mod_res = requests.get(
  130.                 API_REQ, headers={"Accept": "application/json"}, timeout=60
  131.             )
  132.  
  133.             res_modinfo = mod_res.json()["mod"]
  134.             asset_id = res_modinfo["assetid"]
  135.             releases = res_modinfo["releases"][0]
  136.             if releases["modversion"] != mod["version"]:
  137.                 separator("_", 50)
  138.                 separator("#", 50)
  139.  
  140.                 print(f"\n{mod['name']} has a newer version!")
  141.                 new_changes.append("x")
  142.                 try:
  143.                     # Pull data from HTML at the mod website for changelog. API don't serve specifics in it for that as it seems for now.
  144.                     MOD_URL = f"{HOME_URL}{str(mod['modid'])}"
  145.                     mod_changelog_res = requests.get(MOD_URL, timeout=60)
  146.  
  147.                     CHLOG_NAME = "changelogtext"
  148.                     # regex = r""
  149.                     # for m in CHLOG_NAME:
  150.                     #    regex = regex + r"[\_\-\.'\!\s]*" + m
  151.                     # regex = regex + r"[\_\-\.'\!\s]*"
  152.  
  153.                     # html_chname = mod_changelog_res.text.strip(" _-.'!")  # useless!?
  154.                     url_chname = bs(mod_changelog_res.text, features="html.parser")
  155.                     # print(url_chname)
  156.                     # search in html for '<div class="changelogtext">' tags.
  157.                     res_chname = url_chname.find_all(
  158.                         "div",
  159.                         class_=CHLOG_NAME,
  160.                     )
  161.  
  162.                     chlog_text = ""
  163.                     if len(res_chname) < 1:
  164.                         print("no changelog found")
  165.                     else:
  166.                         chlog_text = res_chname[0].get_text()
  167.                         """
  168.                            Get first '<div class="changelogtext">' where latest changlog text is ans extract it.
  169.                            ex:
  170.                            <div class="changelogtext" style="display:none;">
  171.                                <strong>v1.7.4</strong><br>
  172.                                <h3>Changelog</h3>
  173.                                <ul>
  174.                                    <li>Fix Japanese translation - thanks @RikeiR.</li>
  175.                                    <li>Fix issue when unable to place carried block</li>
  176.                                </ul>
  177.                            </div>
  178.                        """
  179.                     ####################
  180.                     print(
  181.                         f"Current version= {mod['version']} >>> new version= {releases['modversion']}"
  182.                     )
  183.                     chlogvStr = f"{CHLOG_NAME} v{releases['modversion']}:"
  184.                     separator("-", len(chlogvStr))
  185.  
  186.                     print(f"ChangeLog v{releases['modversion']}:")
  187.                     for lines in chlog_text.splitlines():
  188.                         if f"v{releases['modversion']}" not in lines:
  189.                             print(f"\t{lines}")
  190.                     separator("-", len(chlogvStr))
  191.  
  192.                 except IndexError as e:
  193.                     print("IndexError:", e)
  194.                 except requests.exceptions.Timeout as e:
  195.                     print("WEB_HTML: requests.exceptions.Timeout:", e)
  196.                 #################################
  197.                 print("\nDownloading from:")
  198.  
  199.                 file_id = releases["fileid"]
  200.                 downlink = f"{HOME_URL}download?fileid={str(file_id)}"
  201.                 print(downlink)
  202.                 repl_str = f"{PATH_OUT}/"
  203.                 response = wget.download(downlink, out=PATH_OUT).replace(repl_str, "")
  204.  
  205.                 print(f"\nDone! Check output folder for file: {response}\n")
  206.                 #################################
  207.                 separator("#", 50)
  208.  
  209.                 separator("_", 50)
  210.             else:
  211.                 print(mod["name"] + " is the latest!")
  212.         except KeyError as e:
  213.             print(e)
  214.         except TypeError as e:
  215.             print(e)
  216.         except IndexError as e:
  217.             print("IndexError:", e)
  218.         except requests.exceptions.Timeout as e:
  219.             print("MOD: requests.exceptions.Timeout:", e)
  220.     else:
  221.         print(f"modid key does not exist for mod: {mod['name']}")
  222. separator("_", 50)
  223.  
  224. if len(new_changes) == 0:
  225.     print("Everything is up to date!")
  226.  
  227. input("\n\nDownload complete, press Enter to exit!")
  228.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement