# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
try:
from setupdevhelpers import *
except:
from bs4 import BeautifulSoup
import json
import waptguihelper
import re
def update_package():
# Declaring local variables
package_updated = False
proxies = get_proxies()
if not proxies:
proxies = get_proxies_from_wapt_console()
store_url = control.sources
if not store_url:
store_id = waptguihelper.input_dialog(
"Choice of app", "Enter the windows store app id (foundable in package url: https://apps.microsoft.com/store/apps)", store_url
).split("/")[-1]
else:
store_id = store_url.split("/")[-1]
url_ms = "https://apps.microsoft.com/store/detail/%s" % store_id
control.sources = url_ms
package_prefix = control.package.split("-")[0]
# check setup.py incase the package name doesnt match the installer file
with open("setup.py", "r") as f:
for line in f.readlines():
if line.startswith("appx_package"):
store_package_name = line.split("=")[1].split('"')[1]
break
# Getting info from adguard api
res = requests.post(
"https://store.rg-adguard.net/api/GetFiles",
"type=ProductId&url=%s&ring=RP&lang=fr-FR" % store_id,
headers={"content-type": "application/x-www-form-urlencoded"},
proxies=proxies,
)
all_files = []
all_files_dict = {}
page = BeautifulSoup.BeautifulSoup(res.content, features="html.parser")
for bs_search in page.find_all("a"):
if not "BlockMap" in bs_search.text and not "eappxbundle" in bs_search.text and not "emsixbundle" in bs_search.text:
version = bs_search.text.split("_")[1]
bin_name = bs_search.text.replace("~", "_")
download_url = bs_search["href"]
pkg_splitted = re.split(r".\d+.", bin_name)[0]
if store_package_name == "":
package_name = package_prefix + "-" + pkg_splitted.split("_")[0].replace(".", "-").lower()
else:
package_name = control.package
all_files.append({"version": version, "bin_name": bin_name, "package_name": package_name})
all_files_dict[bin_name] = {"version": version, "bin_name": bin_name, "download_url": download_url, "package_name": package_name}
if "template-microsoft-store" in control.package:
selected = waptguihelper.grid_dialog(
"Please select the proper file",
json.dumps(all_files),
waptguihelper.GRT_SELECTED,
'{"columns":[{"propertyname":"version","datatype":"String","required":false,"readonly":false,"width":130},{"propertyname":"bin_name","datatype":"String","required":false,"readonly":false,"width":500},{"propertyname":"package_name","datatype":"String","required":false,"readonly":false,"width":250}]}',
)
else:
selected = [a for a in all_files if (control.architecture in a["bin_name"] or control.architecture == "all")]
if len(selected) != 1:
higer_version = "0"
for a in all_files:
if (
Version(higer_version) < Version(a["version"])
and control.package == a["package_name"]
and a["version"].split(".")[1] < "2200" # ignore 2022 version which is for windows 11
):
higer_version = a["version"]
selected = [a for a in all_files if higer_version == a["version"] and store_package_name in a["bin_name"]]
for bin_selected in selected:
latest_bin = bin_selected["bin_name"]
version = all_files_dict[latest_bin]["version"]
download_url = all_files_dict[latest_bin]["download_url"]
package_name = all_files_dict[latest_bin]["package_name"]
if download_url.split("/")[2].endswith("microsoft.com"):
if not isfile(latest_bin):
print("Downloading: %s" % latest_bin)
wget(download_url, latest_bin, proxies=proxies)
else:
print("Binary file version corresponds to online version")
else:
print("ERROR: The retrieved url will not download from microsoft's servers")
# Adding dependencies
for dependency in list(set(d["package_name"] for d in all_files)):
if dependency not in control.depends and package_name != dependency:
control.add_depends(dependency)
# Filling categories
if control.categories == "Template":
categories = waptguihelper.grid_dialog(
"Select %s categories" % package_name,
[
"Internet",
"Utilities",
"Messaging",
"Security",
"System and network",
"Media",
"Development",
"Office",
"Drivers",
"Education",
"Configuration",
"CAD",
"Template",
"Dependencies",
"Extensions",
],
waptguihelper.GRT_SELECTED,
)
control.categories = ",".join([a["unknown"] for a in categories])
# Specifying arch
if "arm" in latest_bin:
control.architecture = "arm"
elif "arm64" in latest_bin:
control.architecture = "arm64"
elif "x64" in latest_bin:
control.architecture = "x64"
elif "x86" in latest_bin:
control.architecture = "x86"
else:
control.architecture = "all"
# Updating pkg infos once
if "tis-template-microsoft-store" in control.package:
control.package = waptguihelper.input_dialog(control.package, "You can redefine the package name", package_name)
control.name = waptguihelper.input_dialog(
control.package, "You can redefine the name for the self-service", control.package.split("-", 1)[1].replace("-", " ").title()
)
# Removing template files
remove_file("WAPT\\changelog.txt")
remove_file("WAPT\\icon.png")
# Warn end-user that depencies are required
missing_depends = []
for d in control.depends.split(","):
if not WAPT.is_available(d) and d != "":
missing_depends.append(d)
if missing_depends:
waptguihelper.message_dialog(
control.package,
'The following packages are not found in your repo, you must import them or use "tis-template-microsoft-store-dependency" to create them with the same Store ID as this package\n\n%s'
% "\n".join(a for a in missing_depends),
)
# Filling description
control.description = waptguihelper.input_dialog("Description", "Please fill the description", control.description)
control.save_control_to_wapt()
# Changing setup.py appx_package variable
new_lines = []
with open("setup.py", "r") as f:
for line in f.readlines():
if line.startswith("appx_package"):
line = 'appx_package = "%s"\n' % latest_bin.split("_")[0]
new_lines.append(line)
with open("setup.py", "w") as f:
f.writelines(new_lines)
# Changing version of the package
if Version(version) > Version(control.get_software_version()):
print("Software version updated (from: %s to: %s)" % (control.get_software_version(), Version(version)))
package_updated = True
else:
print("Software version up-to-date (%s)" % Version(version))
control.set_software_version(version)
control.save_control_to_wapt()
# Deleting outdated binaries
remove_outdated_binaries(version, ["appxbundle", "msixbundle", "appx", "msix"])
# Validating or not update-package-sources
return package_updated