tis-windows-media-player-uwp

11.2301.27.0-30
Media Player is designed to listening and watching your multimedia content
1618 downloads
Download
See build result See VirusTotal scan
tis-windows-media-player-uwp icon
  • package : tis-windows-media-player-uwp
  • name : Windows Media Player UWP
  • version : 11.2301.27.0-30
  • categories : Media
  • maintainer : WAPT Team,Tranquil IT,Jimmy PELÉ,Pierre COSSON
  • installed_size :
  • editor :
  • licence :
  • signature_date : 2023-03-08T10:24:16.495797
  • size : 114.43 Mo
  • locale : all
  • target_os : windows
  • impacted_process :
  • architecture : all
package           : tis-windows-media-player-uwp
version           : 11.2301.27.0-30
architecture      : all
section           : base
priority          : optional
name              : Windows Media Player UWP
categories        : Media
maintainer        : WAPT Team,Tranquil IT,Jimmy PELÉ,Pierre COSSON
description       : Media Player is designed to listening and watching your multimedia content
depends           : 
conflicts         : 
maturity          : PROD
locale            : all
target_os         : windows
min_wapt_version  : 2.2
sources           : https://apps.microsoft.com/store/detail/9WZDNCRFJ3PT
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      : 99f170fc-8bf2-4abb-9821-fa264945ca06
valid_from        : 
valid_until       : 
forced_install_on : 
changelog         : 
min_os_version    : 10.0.22000
max_os_version    : 
icon_sha256sum    : d5271fbe8602049817c4893be778de2e9fad698abcc78768069dcfde51230196
signer            : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature         : AtMkSCDCE3tyc7sfNxHhccUi1Pf4+maecqWSJJmGCn9aoaRGqgIpLKmKIBpu//1r98rJYsOS6n97UOmST2JAEPkvnEUQMxxQkCd5Je9pZrHwaKZfl07lcOpBsGYtfXKy5YFyFClwRfqCoE3mIGVh4rTSOgECqRF3GT53nO/8a8hxlBCvNt+lPBElxnTW1fhUrKpOgk4VrG6nf635BBjrh+M7zgHQQ3fwJeVd92iCZR7o6UwuFiiiB/vzl4SGIH0bnGAID7O5b9d6a9fYbOlzFL88mc2ic3kpWGc7m6SmRa/+ptFZbBoUsYH7g8IYDv4zipn/YXvr6v84UrPEFJ8Ebg==
signature_date    : 2023-03-08T10:24:16.495797
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
# -*- coding: utf-8 -*-
from setuphelpers import *

# Windows Media Player = Version 11
# Groove Music = Version 2019

appx_package = "Microsoft.ZuneMusic"
appx_dir = makepath(programfiles, "WindowsAppsInstallers")
windows_min_os_version = WindowsVersions.Windows10v20H2  # You should consult the control.sources URL to get this information
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)):
        remove_file(appx_file)

    # Placing bins for session-setup installs
    if isdir(appx_bins_dir):
        remove_tree(appx_bins_dir)
    mkdirs(appx_dir)
    print(f"Creating: {appx_bins_dir}")
    shutil.move(bins_dir, appx_bins_dir)
    if control.architecture == "all":
        for f in glob.glob(appx_bins_dir + "/*"):
            fname = f.split(os.sep)[-1]
            if not get_host_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}_*"))[0]
    dependencies_pathes = ",".join([f'"{a}"' for a in glob.glob(makepath(appx_bins_dir, "*")) if not appx_package in a])

    # Installing the UWP application in the user environment
    appx_version = get_powershell_str("Get-AppxPackage -Name %s" % appx_package, "Version")
    if not appx_version or Version(appx_version) < Version(control.get_software_version()) or force:
        print("Installing: %s" % bin_path.split("\\")[-1])
        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, 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)
    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'
# -*- coding: utf-8 -*-
from setuphelpers import *
import requests

try:
    from setupdevhelpers import *
except:
    from bs4 import BeautifulSoup
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]
    store_id = store_id.split("?")[0]
    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]

    # 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 = []
    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(".", " ")
            if "arm64" in bin_name:
                package_arch = "arm64"
            elif "arm" in bin_name:
                package_arch = "arm"
            elif "x64" in bin_name:
                package_arch = "x64"
            elif "x86" in bin_name:
                package_arch = "x86"
            else:
                package_arch = "all"
            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)

    # Downloading files
    for dependency in all_files:
        latest_bin = dependency["bin_name"]
        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()
    import sys
    sys.path.append(basedir)
    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])

    # Keep app files
    uwp_app_dict = make_uwp_app_dict()
    newer_version = "0"
    for uwp_app in uwp_app_dict:
        if uwp_app_dict[uwp_app]["Name"] != store_package_name and uwp_app_dict[uwp_app]["Version"].startswith("2019"):
            continue
        if Version(newer_version) < Version(uwp_app_dict[uwp_app]["Version"]) and Version(control.min_os_version, 3) == Version(
            uwp_app_dict[uwp_app]["MinVersion"], 3
        ):
            newer_version = uwp_app_dict[uwp_app]["Version"]
            newer_uwp_app = uwp_app

    version = newer_version

    # Placing binaries in a dir ["appxbundle", "msixbundle", "appx", "msix]
    bins_dir = control.package.split("-", 1)[1]
    mkdirs(bins_dir)
    shutil.move(newer_uwp_app, bins_dir)
    for l in [glob.glob(a["Name"] + "_*") for a in uwp_app_dict[newer_uwp_app]["Dependencies"]]:
        for f in l:
            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)

    # No dependencies since it will be contained
    control.depends = ""
    control.save_control_to_wapt()

    # Asking pkg infos if needed
    ask_control_categories()
    control.architecture = package_arch
    ask_control_package(package_name, "template-microsoft-store", remove_base_files=True)
    ask_control_name(software_name, "Template Microsoft Store")
    ask_control_description("update_package")

    # 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()

    # Validating or not update-package-sources
    return package_updated


def make_uwp_app_dict():
    import xmltodict

    ms_app_db = {}
    for ms_app_file in glob.glob("*.appxbundle") + glob.glob("*.msixbundle") + glob.glob("*.appx") + glob.glob("*.msix"):
        manifest = unzip(ms_app_file, ".", "AppxManifest.xml", False)
        bundle_manifest = unzip(ms_app_file, ".", "AppxMetadata\AppxBundleManifest.xml", False)
        if not manifest:
            if bundle_manifest:
                with open(bundle_manifest[0]) as xml_file:
                    data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")
                ms_app_info = {"Name": data_dict["Bundle"]["Identity"]["Name"], "Version": data_dict["Bundle"]["Identity"]["Version"]}

                dependencies = []
                for app_pkg in data_dict["Bundle"]["Packages"]["Package"]:
                    if app_pkg["Type"] == "application":
                        dependency_info = {
                            "FileName": app_pkg["FileName"],
                            "Version": app_pkg["Version"],
                            "Architecture": app_pkg["Architecture"],
                            "MinVersion": app_pkg["b4:Dependencies"]["b4:TargetDeviceFamily"]["MinVersion"],
                            "MaxVersionTested": app_pkg["b4:Dependencies"]["b4:TargetDeviceFamily"]["MaxVersionTested"],
                        }
                        dependencies.append(dependency_info)
                        ms_app_info.update({"MinVersion": dependency_info["MinVersion"], "MaxVersionTested": dependency_info["MaxVersionTested"]})

                for dependency in 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]) as xml_file:
                        dependency_data_dict = xmltodict.parse(xml_file.read(), attr_prefix="")

                sub_dependencies = []
                for sub_app_pkg in dependency_data_dict["Package"]["Dependencies"]["PackageDependency"]:
                    sub_dependency_info = {
                        "Name": sub_app_pkg["Name"],
                        "MinVersion": sub_app_pkg["MinVersion"],
                    }
                    sub_dependencies.append(sub_dependency_info)

                ms_app_info["Dependencies"] = sub_dependencies
                ms_app_db[ms_app_file] = ms_app_info
            else:
                error("nothing to parse")
        else:
            pass
        for xml_file in glob.glob("AppxManifest.xml") + glob.glob("AppxBundleManifest.xml"):
            remove_file(xml_file)

    return ms_app_db


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.description)
        control.save_control_to_wapt()
    if blank_str is not None and blank_str in control.description:
        control.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
675e1416ff4db880643b35d9ebdd7729efc094c698ce4ab459aca1d227e933fb : setup.py
9bfde6cfcc530ef073ab4bc9c4817575f63be1251dd75aaa58cb89299697a569 : windows-media-player-uwp/Microsoft.VCLibs.140.00.UWPDesktop_14.0.30704.0_x64__8wekyb3d8bbwe.appx
980eb9250f7743dbaf88bedca92d3f881915f19ae20148e40413455bd52e5e00 : windows-media-player-uwp/Microsoft.ZuneMusic_11.2301.27.0_neutral___8wekyb3d8bbwe.msixbundle
47de27af62a9a31d123a522c4a74056b8a10d15307de9ebead0adf684f3df45d : windows-media-player-uwp/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_arm64__8wekyb3d8bbwe.appx
b33c87d60a9c868ec239b7e6a62575151628f29f45e4307ef4a17298dc185008 : windows-media-player-uwp/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_arm64__8wekyb3d8bbwe.appx
a22283167bec10b89653d2a62e737b81d914945d5cc67af671948e9742f9ce06 : windows-media-player-uwp/Microsoft.UI.Xaml.2.8_8.2212.15002.0_x64__8wekyb3d8bbwe.appx
1ec4e926f17b8557c76b4dd0bd06af229ab0d096e719fa6631d1fab8334fd9a5 : windows-media-player-uwp/Microsoft.VCLibs.140.00.UWPDesktop_14.0.30704.0_arm64__8wekyb3d8bbwe.appx
009f7db134c6061fe8f260e075374a28abbbc44e6cf23de107f93ec8b8c59816 : windows-media-player-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_x64__8wekyb3d8bbwe.appx
e4c5dff287b59e27eb9da6ccd02ed1c76d3f6001eceb0f20e71eebd507b3aad2 : windows-media-player-uwp/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x86__8wekyb3d8bbwe.appx
397b610554d67abaddfdc287ced6a9bf1ada4d4c9ddf53e01c6a061bed2860ef : windows-media-player-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_x86__8wekyb3d8bbwe.appx
7ccf4ef1815d479570fdcf4e462bd7d80f1bc9ae3c39c93220fdb40cc0ebaca9 : windows-media-player-uwp/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_arm__8wekyb3d8bbwe.appx
f3259c5f122069cf6475389476cc8ea40fd40d6ec1f383369832e0b403f73b33 : windows-media-player-uwp/Microsoft.UI.Xaml.2.8_8.2212.15002.0_x86__8wekyb3d8bbwe.appx
ec7e811dca0cb511c69859c65aa1d94ccd5cc3cab3ec7f9d6bab95abb03149a8 : windows-media-player-uwp/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x86__8wekyb3d8bbwe.appx
27fae660d8c609e020703bb463b6601e62811dc75db19975bcb7d68d959b527d : windows-media-player-uwp/Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe.appx
7c723c2625e6cc2151b9519af7a6fa57c377759085b9935dbc7a76658dfae08d : windows-media-player-uwp/Microsoft.UI.Xaml.2.8_8.2212.15002.0_arm64__8wekyb3d8bbwe.appx
de15e9dd85690edb900dc2b331ad7d394d129420e63326f5746d27320e7233ca : windows-media-player-uwp/Microsoft.UI.Xaml.2.8_8.2212.15002.0_arm__8wekyb3d8bbwe.appx
a9e511ff763091b098a932761288c44871dab527f4a429087245295a551d0540 : windows-media-player-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_arm__8wekyb3d8bbwe.appx
e88497eed19c1207acca2bf85a81e4c52899e8c7350030b57298ee0282c69c9b : windows-media-player-uwp/Microsoft.VCLibs.140.00.UWPDesktop_14.0.30704.0_arm__8wekyb3d8bbwe.appx
c195047f4af9c3ff3d92c40e55a901cf7cfa08a679b8ca2543bb104bab2f7ff1 : windows-media-player-uwp/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe.appx
4ab54162efffe26e605c5ec6170de76d72d8f78983c7fc84427630b951402973 : windows-media-player-uwp/Microsoft.VCLibs.140.00_14.0.30704.0_arm64__8wekyb3d8bbwe.appx
3195db914bea1534ee73582cd483c548a929aed2799d305b3bbf7411ba7a6c7d : windows-media-player-uwp/Microsoft.VCLibs.140.00.UWPDesktop_14.0.30704.0_x86__8wekyb3d8bbwe.appx
bdf9c70e4966a4f7ce00ca7fc5179962239514be879f2aa3c1794076b7ff9bc6 : windows-media-player-uwp/Microsoft.NET.Native.Framework.2.2_2.2.29512.0_arm__8wekyb3d8bbwe.appx
e4fcea1071077b1ba3cfff29b7983e882b2de123671462c07b5775f357a6a45e : update_package.py
d5271fbe8602049817c4893be778de2e9fad698abcc78768069dcfde51230196 : WAPT/icon.png
a5a97261381e1d0ad46ee15916abec9c2631d0201f5cc50ceb0197a165a0bbbf : WAPT/certificate.crt
578a76d3737a2c01d93156df140189e8e3dab03ba5e8c02746bc515a7200fd0a : xmltodict.py
3de45d769dabb726a608d838056a0a89afdde7fdbd1df8d8152858968a63e99d : luti.json
9ef7a5db58271c2a0f0f653b80fee7d38a67fedd92889f1bf877a522756e8ff2 : WAPT/control