tis-spotify-uwp
1.210.760.0-32
Spotify UWP Client
3114 downloads
See build result See VirusTotal scan

Description
- package : tis-spotify-uwp
- name : Spotify UWP
- version : 1.210.760.0-32
- categories : Media
- maintainer : WAPT Team,Tranquil IT,Jimmy PELÉ,Pierre COSSON
- installed_size : 211780847
- editor : Spotify AB
- licence : Proprietary
- signature_date : 2023-05-02T16:18:39.999470
- size : 190.00 Mo
- locale : all
- target_os : windows
- impacted_process : Spotify
- architecture : all
- Homepage : https://www.spotify.com/download
- Conflicts :
control
package : tis-spotify-uwp
version : 1.210.760.0-32
architecture : all
section : base
priority : optional
name : Spotify UWP
categories : Media
maintainer : WAPT Team,Tranquil IT,Jimmy PELÉ,Pierre COSSON
description : Spotify UWP Client
depends :
conflicts : tis-spotify
maturity : PROD
locale : all
target_os : windows
min_wapt_version : 2.2
sources : https://apps.microsoft.com/store/detail/9NCBCSZSJRSB
installed_size : 211780847
impacted_process : Spotify
description_fr : Client Spotify UWP
description_pl : Klient Spotify UWP
description_de : Spotify UWP-Client
description_es : Cliente UWP de Spotify
description_pt : Spotify UWP Client
description_it : Client UWP di Spotify
description_nl : Spotify UWP client
description_ru : UWP-клиент Spotify
audit_schedule :
editor : Spotify AB
keywords : music
licence : Proprietary
homepage : https://www.spotify.com/download
package_uuid : 9e478fc2-8d80-4ff6-b674-e302612b8d7b
valid_from :
valid_until :
forced_install_on :
changelog :
min_os_version : 10.0.17763
max_os_version :
icon_sha256sum : 3591690ae12cf13f1a99a779093c96a3e137d21d83bce2699b19a31bb5c2fbf5
signer : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature : BGs1K/Ujon7H8zE7X+d9p3XzJChEoGqfjYIYRi0ZUwY2R3CpkdQIHqoLTUHW8h0uJ6mmJ1zmzB7wWfWoQ1ECa44ZitHl6WeDmyxvj5ek7JroodoHo3Yv3oq7Qvvbx9CKj52aY9popYRMWmiry0kOMLYQ1YTf8OnQeon9ph4zj3T4m5DG7XUZL9T9tGQNVehOicwcQRLw6LDqWOASaN7hXNJRkFugq9UGWI+VUAbQF1ojaGt2QEAaxnFeDXTO3e7KbwqbM6/Gp4D1oGVaM64u+qAr3JaqsWHbVwbwzOzN6VK/ya/c1uLa9XvJuuURXLSehYgwpSKLFm5AhmeGQob3gw==
signature_date : 2023-05-02T16:18:39.999470
signed_attributes : package,version,architecture,section,priority,name,categories,maintainer,description,depends,conflicts,maturity,locale,target_os,min_wapt_version,sources,installed_size,impacted_process,description_fr,description_pl,description_de,description_es,description_pt,description_it,description_nl,description_ru,audit_schedule,editor,keywords,licence,homepage,package_uuid,valid_from,valid_until,forced_install_on,changelog,min_os_version,max_os_version,icon_sha256sum,signer,signer_fingerprint,signature_date,signed_attributes
Setup.py
# -*- coding: utf-8 -*-
from setuphelpers import *
appx_package_name = "SpotifyAB.SpotifyMusic"
appx_dir = makepath(programfiles, "WindowsAppsInstallers")
allow_remove = True
def install():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
# Remove from old path
for appx_file in glob.glob(makepath(appx_dir, "%s_*" % appx_package_name)):
remove_file(appx_file)
# Placing bins for session-setup installs
if isdir(appx_bins_dir):
remove_tree(appx_bins_dir)
mkdirs(appx_bins_dir)
print(f"Creating: {appx_bins_dir}")
for f in glob.glob(bins_dir + "/*"):
filecopyto(f, appx_bins_dir)
for f in glob.glob(appx_bins_dir + "/*"):
if control.architecture == "all":
fname = f.split(os.sep)[-1]
if "x86" in glob.glob(makepath(appx_bins_dir, "%s_*" % appx_package_name))[0].split(os.sep)[-1]:
if not "x86" in fname and not "neutral" in fname:
remove_file(f)
else:
if not get_host_architecture() in fname and not "neutral" in fname:
remove_file(f)
else:
if not control.architecture in fname and not "neutral" in fname:
remove_file(f)
def session_setup():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
bin_path = glob.glob(makepath(appx_bins_dir, f"{appx_package_name}_*"))[0]
dependencies_pathes = ",".join([f'"{a}"' for a in glob.glob(makepath(appx_bins_dir, "*")) if not appx_package_name in a])
# Installing the UWP application in the user environment
appx_version = get_powershell_str("Get-AppxPackage -Name %s" % appx_package_name, "Version")
if not appx_version or Version(appx_version) < Version(control.get_software_version()) or force:
print("Installing: %s" % bin_path.split("\\")[-1])
killalltasks(control.get_impacted_process_list())
add_appx_cmd = f'Add-AppxPackage -Path "{bin_path}"'
if dependencies_pathes:
add_appx_cmd += f" -DependencyPath {dependencies_pathes}"
run_powershell(add_appx_cmd)
else:
print("%s is installed in correct version (%s)" % (appx_package_name, appx_version))
def uninstall():
# Declare local variables
bins_dir = control.package.split("-", 1)[1]
appx_bins_dir = makepath(appx_dir, bins_dir)
if allow_remove:
remove_appx(appx_package_name)
if isdir(appx_bins_dir):
print("Remove: %s" % (appx_bins_dir))
remove_tree(appx_bins_dir)
if dir_is_empty(appx_dir):
print("Remove: %s since it is empty" % (appx_dir))
remove_tree(appx_dir)
def get_host_architecture():
if isARM64():
return "arm64"
elif isARM():
return "arm"
elif is64():
return "x64"
elif is32():
return "x86"
update_package.py
# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
try:
from setupdevhelpers import *
except:
from bs4 import BeautifulSoup
import waptguihelper
import re
import json
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]
store_id = store_id.split("?")[0]
if store_id:
url_ms = "https://apps.microsoft.com/store/detail/%s" % store_id
control.sources = url_ms
control.save_control_to_wapt()
package_prefix = control.package.split("-")[0]
selected = None
# check setup.py incase the package name doesnt match the installer file
appx_package_name = ""
with open("setup.py", "r", encoding="utf8") as f:
for line in f.readlines():
if line.startswith("appx_package_name"):
appx_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 = []
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]
package_name = package_prefix + "-" + pkg_splitted.split("_")[0].replace(".", "-").lower()
software_name = bin_name.split("_")[0].replace("-", " ").replace(".", " ")
package_arch = get_uwp_filename_arch(bin_name, appx_package_name)
file_dict = {
"version": version,
"bin_name": bin_name,
"package_name": package_name,
"software_name": software_name,
"package_arch": package_arch,
"download_url": download_url,
}
all_files.append(file_dict)
if (
"template-microsoft-store" in control.package
or not appx_package_name
or not len([a for a in all_files if appx_package_name in a["bin_name"]]) != 0
):
if not all_files:
error("API returned an empty list, please try again")
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":420},{"propertyname":"package_name","datatype":"String","required":false,"readonly":false,"width":190},{"propertyname":"software_name","datatype":"String","required":false,"readonly":false,"width":172},{"propertyname":"package_arch","datatype":"String","required":false,"readonly":false,"width":88},{"propertyname":"download_url","datatype":"String","required":false,"readonly":false,"width":1472}]}',
)
appx_package_name = selected[0]["bin_name"].split("_")[0]
# Downloading files
for dependency in all_files:
latest_bin = dependency["bin_name"]
if latest_bin.split(".")[-1].lower().startswith("e"): # ignore encrypted uwp apps
continue
download_url = dependency["download_url"]
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 is present: %s" % latest_bin)
else:
error("ERROR: The retrieved URL will not download from microsoft's servers")
# Import xmltodict for make_uwp_app_dict()
if not isfile("xmltodict.py"):
pip_download_xmltodict = "waptpython -m pip download xmltodict -d %s" % basedir
if proxies:
pip_download_xmltodict += " --proxy %s" % proxies["http"]
run(pip_download_xmltodict)
unzip(glob.glob("*.whl")[0], ".", "xmltodict.py")
remove_file(glob.glob("*.whl")[0])
import sys
sys.path.append(basedir)
# Keep app files
uwp_app_dict = make_uwp_app_dict(appx_package_name)
newer_uwp_app = get_newer_uwp_app(uwp_app_dict)
version = newer_uwp_app["Version"]
# No dependencies since it will be contained
control.depends = ""
control.save_control_to_wapt()
# Applying or asking control information if needed
control.architecture = get_uwp_filename_arch(newer_uwp_app["FileName"], appx_package_name)
control.min_os_version = ".".join(newer_uwp_app["MinVersion"].split(".")[:3])
if not Version(newer_uwp_app["MaxVersionTested"], 3) <= Version("10.0.19041", 3): # Ignore end-of-life Windows versions
if (
Version(newer_uwp_app["MinVersion"], 3) < Version("10.0.22000", 3)
and Version(newer_uwp_app["MaxVersionTested"], 3) <= Version("10.0.22000", 3)
and not Version(newer_uwp_app["MinVersion"]) == Version(newer_uwp_app["MaxVersionTested"])
):
control.max_os_version = ".".join(newer_uwp_app["MaxVersionTested"].split(".")[:3])
else:
control.max_os_version = ""
ask_control_categories()
ask_control_package(
selected[0]["package_name"] if selected is not None else control.package,
"template-microsoft-store",
remove_base_files=True,
)
ask_control_name(selected[0]["software_name"] if selected is not None else control.name, "Template Microsoft Store")
ask_control_description("update_package")
# Changing setup.py appx_package_name variable
new_lines = []
with open("setup.py", "r", encoding="utf8") as f:
for line in f.readlines():
if line.startswith("appx_package_name"):
line = 'appx_package_name = "%s"\n' % appx_package_name
new_lines.append(line)
with open("setup.py", "w", encoding="utf8") as f:
f.writelines(new_lines)
# Get icon.png
icon_png = []
if "b4:Dependencies" in newer_uwp_app:
if newer_uwp_app["b4:Dependencies"]:
unzip(newer_uwp_app["FileName"], ".", newer_uwp_app["b4:Dependencies"][0]["FileName"], False)
icon_png = unzip(newer_uwp_app["b4:Dependencies"][0]["FileName"], ".", "*.targetsize-48.png", False)
if icon_png:
shutil.move(icon_png[0], "WAPT\\icon.png")
if not icon_png:
icon_png = unzip(newer_uwp_app["FileName"], ".", "*.targetsize-48.png", False)
if icon_png:
shutil.move(icon_png[0], "WAPT\\icon.png")
[remove_file(a) for a in glob.glob("*.png")]
# Placing binaries in a dir ["appxbundle", "msixbundle", "appx", "msix]
bins_dir = control.package.split("-", 1)[1]
if isdir(bins_dir):
remove_tree(bins_dir)
mkdirs(bins_dir)
if not isfile(makepath(bins_dir, newer_uwp_app["FileName"])):
shutil.move(newer_uwp_app["FileName"], bins_dir)
for l in [glob.glob(a["Name"] + "_*") for a in uwp_app_dict[newer_uwp_app["FileName"]]["Dependencies"]]:
for f in l:
if not isfile(makepath(bins_dir, f)):
shutil.move(f, bins_dir)
# Removing remaining files ["appxbundle", "msixbundle", "appx", "msix]
for f in glob.glob("*.appxbundle") + glob.glob("*.msixbundle") + glob.glob("*.appx") + glob.glob("*.msix"):
remove_file(f)
# 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()
# Validating or not update-package-sources
return package_updated
def get_newer_uwp_app(uwp_app_dict, tdf_list=["Windows.Universal", "Windows.Desktop"]):
newer_version = "0"
to_skip = True
for uwp_app in uwp_app_dict:
if not uwp_app_dict[uwp_app]["TargetDeviceFamily"]:
continue
for tdf in tdf_list:
for uwp_app_tdf in uwp_app_dict[uwp_app]["TargetDeviceFamily"]:
if tdf == uwp_app_tdf["Name"]:
to_skip = False
if to_skip:
continue
# # Place your specific conditions for actual application here
# if Version(uwp_app_dict[uwp_app]["Version"], 1) == Version("2019", 1):
# continue
if Version(newer_version) < Version(uwp_app_dict[uwp_app]["Version"]):
if control.max_os_version:
if not Version(uwp_app_dict[uwp_app]["MinVersion"], 3) < Version(control.max_os_version, 3):
continue
newer_uwp_app = uwp_app_dict[uwp_app]
newer_version = newer_uwp_app["Version"]
return newer_uwp_app
def make_uwp_app_dict(appx_package_name):
import xmltodict
ms_app_db = {}
# for ms_app_file in (
# glob.glob("*.appxbundle")
# + glob.glob("*.msixbundle")
# + glob.glob("*.appx")
# + glob.glob("*.msix")
# ):
for ms_app_file in (
glob.glob(f"{appx_package_name}*.appxbundle")
+ glob.glob(f"{appx_package_name}*.msixbundle")
+ glob.glob(f"{appx_package_name}*.appx")
+ glob.glob(f"{appx_package_name}*.msix")
):
data_dict = {}
before_dependencies = []
sub_dependencies = []
manifest = unzip(ms_app_file, ".", "AppxManifest.xml", False)
bundle_manifest = unzip(ms_app_file, ".", "AppxMetadata\\AppxBundleManifest.xml", False)
ms_app_info = {
"FileName": ms_app_file,
}
if not manifest:
if bundle_manifest:
with open(bundle_manifest[0], encoding="utf8") as xml_file:
data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
if type(data_dict["Bundle"]["Packages"]["Package"]) == dict:
data_dict["Bundle"]["Packages"]["Package"] = [dict(data_dict["Bundle"]["Packages"]["Package"])]
for app_pkg in list(data_dict["Bundle"]["Packages"]["Package"]):
if app_pkg["Type"] == "application":
before_dependency_info = {
"FileName": app_pkg["FileName"],
"Version": app_pkg["Version"],
"Architecture": app_pkg["Architecture"],
}
before_dependencies.append(before_dependency_info)
if before_dependencies:
for dependency in before_dependencies:
unzip(
ms_app_file,
".",
makepath(
dependency["FileName"],
),
False,
)
manifest = unzip(dependency["FileName"], ".", makepath("AppxManifest.xml"), False)
if isfile(dependency["FileName"]):
remove_file(dependency["FileName"])
with open(manifest[0], encoding="utf8") as xml_file:
dependency_data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
if "PackageDependency" in dependency_data_dict["Package"]["Dependencies"]:
sub_dependencies = list(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"])
if type(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]) == dict:
sub_dependencies = [dict(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"])]
if type(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]) == list:
sub_dependencies = dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]
if "TargetDeviceFamily" in dependency_data_dict["Package"]["Dependencies"]:
if not "TargetDeviceFamily" in ms_app_info:
if type(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]) == dict:
ms_app_info["TargetDeviceFamily"] = [dict(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"])]
if type(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]) == list:
ms_app_info["TargetDeviceFamily"] = dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]
else:
error("nothing to parse")
else:
manifest = unzip(ms_app_file, ".", makepath("AppxManifest.xml"), False)
with open(manifest[0], encoding="utf8") as xml_file:
dependency_data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
if "PackageDependency" in dependency_data_dict["Package"]["Dependencies"]:
sub_dependencies = list(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"])
if type(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]) == dict:
sub_dependencies = [dict(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"])]
if type(dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]) == list:
sub_dependencies = dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]
if "TargetDeviceFamily" in dependency_data_dict["Package"]["Dependencies"]:
if not "TargetDeviceFamily" in ms_app_info:
if type(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]) == dict:
ms_app_info["TargetDeviceFamily"] = [dict(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"])]
if type(dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]) == list:
ms_app_info["TargetDeviceFamily"] = dependency_data_dict["Package"]["Dependencies"]["TargetDeviceFamily"]
if not "TargetDeviceFamily" in ms_app_info:
ms_app_info.update({"TargetDeviceFamily": None})
else:
ms_app_info.update(
{
"MinVersion": ms_app_info["TargetDeviceFamily"][0]["MinVersion"],
"MaxVersionTested": ms_app_info["TargetDeviceFamily"][0]["MaxVersionTested"],
}
)
if data_dict:
ms_app_info.update(data_dict["Bundle"]["Identity"])
else:
ms_app_info.update(dependency_data_dict["Package"]["Identity"])
if "ProcessorArchitecture" in ms_app_info:
ms_app_info.update({"Architecture": ms_app_info["ProcessorArchitecture"]})
ms_app_info["b4:Dependencies"] = before_dependencies
ms_app_info["Dependencies"] = sub_dependencies
ms_app_db[ms_app_file] = ms_app_info
for xml_file in glob.glob("AppxManifest.xml") + glob.glob("AppxBundleManifest.xml"):
remove_file(xml_file)
return ms_app_db
def get_uwp_filename_arch(appx_filename, appx_package_name=None):
if not appx_package_name:
appx_package_name = None
if "arm64" in appx_filename:
return "arm64"
elif "arm" in appx_filename:
return "arm"
elif "x64" in appx_filename:
return "x64"
if appx_filename is not None and "x86" in appx_filename and (appx_package_name is None or not appx_package_name in appx_filename):
return "x86"
else:
return "all"
def ask_control_description(blank_str=None):
"""Requesting that the user supply package description for the control.description field
Args:
blank_str (str): The description will be cleared if it includes the specified string to avoid using the template description (default: do not clear description)
"""
if not control.description:
control.description = waptguihelper.input_dialog("Description", "Please fill the description", "")
control.save_control_to_wapt()
if blank_str is not None and blank_str in control.description:
control.description = waptguihelper.input_dialog("Description", "Please fill the description", "")
control.save_control_to_wapt()
return control.description
def ask_control_categories():
"""Requesting that the user supply package categories for the control.categories field if empty or Template is selected"""
if control.categories == "" or control.categories == "Template":
categories = waptguihelper.grid_dialog(
"Select package categories",
[
"Internet",
"Utilities",
"Messaging",
"Security",
"System and network",
"Media",
"Development",
"Office",
"Drivers",
"Education",
"Configuration",
"CAD",
"Template",
"Dependency",
"Extension",
],
waptguihelper.GRT_SELECTED,
)
if categories:
control.categories = ",".join([a["unknown"] for a in categories])
else:
control.categories = ""
control.save_control_to_wapt()
return control.categories
def ask_control_package(control_package=control.package, conditionnal_package_name=None, remove_base_files=False):
"""Requesting that the user provide a package name to be entered into the control.package field, and offering the possibility of removing the base files (icon.png and changelog.txt) for template package usage
Args:
control_package (str) : prefilled control_package (default: actual control_package)
conditionnal_package_name (str) : only ask when the control.package contains conditionnal_package_name (default: always ask for control_package)
remove_base_files (bool) : removes base files if parameter is True and conditionnal_package_name is provided (default: False)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.package:
control.package = waptguihelper.input_dialog(
control.package,
"You can redefine the package name",
control_package.replace(conditionnal_package_name, "") if conditionnal_package_name is not None else control_package,
)
control.save_control_to_wapt()
# Removing template files
if conditionnal_package_name in control.package and remove_base_files:
if isfile("WAPT\\changelog.txt"):
remove_file("WAPT\\changelog.txt")
if isfile("WAPT\\icon.png"):
remove_file("WAPT\\icon.png")
return control.package
def ask_control_name(control_name=control.name, conditionnal_package_name=None):
"""Requesting that the user provide a package name to be entered into control.name field
Args:
control_name (str) : prefilled control_name (default: control.name)
conditionnal_package_name (str) : only ask when the control.name contains conditionnal_package_name (default: always ask for control_name)
"""
if conditionnal_package_name is None or conditionnal_package_name in control.name:
control.name = waptguihelper.input_dialog(control.name, "You can redefine the name for the self-service", control_name)
control.save_control_to_wapt()
return control.name
eb9d16ccc919f47fb48777eafa5d23f61aafcd65290575e1f37fab8bf2556d02 : setup.py
611a476a4a62e5d8b8ef37ea8f15726015ee7d656da90f2d3205ba0ecc0bd9d2 : update_package.py
3591690ae12cf13f1a99a779093c96a3e137d21d83bce2699b19a31bb5c2fbf5 : WAPT/icon.png
a5a97261381e1d0ad46ee15916abec9c2631d0201f5cc50ceb0197a165a0bbbf : WAPT/certificate.crt
578a76d3737a2c01d93156df140189e8e3dab03ba5e8c02746bc515a7200fd0a : xmltodict.py
b060a8b29173a39a512b92b8fae764efa5ebadf7549228d98e620f22f70ef63b : luti.json
cee066b4c90bceac748ecc6406385bb6490c78e84554c586618c590bd5f7659a : spotify-uwp/Microsoft.WindowsAppRuntime.1.2_2000.802.31.0_arm64__8wekyb3d8bbwe.msix
009f7db134c6061fe8f260e075374a28abbbc44e6cf23de107f93ec8b8c59816 : spotify-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_x64__8wekyb3d8bbwe.appx
397b610554d67abaddfdc287ced6a9bf1ada4d4c9ddf53e01c6a061bed2860ef : spotify-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_x86__8wekyb3d8bbwe.appx
9ade564203b5f9fd06d5ed9488b475165b6e19bc8535f6c9ca59ec74dd23a4b6 : spotify-uwp/SpotifyAB.SpotifyMusic_1.210.760.0_x86__zpdnekdrzrea0.appx
a9e511ff763091b098a932761288c44871dab527f4a429087245295a551d0540 : spotify-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_arm__8wekyb3d8bbwe.appx
4ab54162efffe26e605c5ec6170de76d72d8f78983c7fc84427630b951402973 : spotify-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_arm64__8wekyb3d8bbwe.appx
28b8dcccb515bf6924c91b7e2446341271b498f5cbdfeaab8407d6e84649ffbc : spotify-uwp/Microsoft.WindowsAppRuntime.1.2_2000.802.31.0_x64__8wekyb3d8bbwe.msix
ea9ee564957f3940e6e0dd235b496f8211bae4e35a7514a1fed6d7521bf9a0e6 : spotify-uwp/Microsoft.WindowsAppRuntime.1.2_2000.802.31.0_x86__8wekyb3d8bbwe.msix
5aca6f4d552b4012e877adc4e6beb26e36b635afe28d9c3ca17d00e068782e47 : WAPT/control