public static async Task <string[]> DownloadPackageAsync(IEnumerable <UpdateData> updates, DirectoryInfo downloadDirectory, DownloadProgress progress, string msaToken = "") { List <ApplicationFile> appfiles = new(); List <ApplicationFile> appdepfiles = new(); foreach (var updateData in updates) { foreach (var file in updateData.Xml.Files.File) { if (file.FileName.EndsWith(".cab", StringComparison.InvariantCultureIgnoreCase)) { continue; } var filename = updateData.AppxMetadata.ContentPackageId + "." + file.FileName.Split(".")[file.FileName.Count(x => x == '.')]; if (string.IsNullOrEmpty(updateData.AppxMetadata.ContentPackageId)) { filename = file.FileName; } var datetime = DateTime.Parse(file.Modified); if (!appfiles.Any(x => x.Filename == filename)) { ApplicationFile appfile = new() { UpdateID = updateData.Xml.UpdateIdentity.UpdateID, RevisionNumber = updateData.Xml.UpdateIdentity.RevisionNumber, Token = msaToken, Digest = file.Digest, Filename = filename, UpdateData = updateData, Modified = datetime, CTAC = updateData.CTAC, Size = file.Size }; List <string> descs = new(); if (updateData != null && updateData.AppxMetadata != null && updateData.AppxMetadata.ContentTargetPlatforms != null) { foreach (var plat in updateData.AppxMetadata.ContentTargetPlatforms) { var max = GetFriendlyVersionFromULong((ulong)plat.PlatformMaxVersionTested); var min = GetFriendlyVersionFromULong((ulong)plat.PlatformMinVersion); var target = GetFriendlyPlatformNameFromLong(plat.PlatformTarget); var desc = $"{target} - Minimum: {min} Maximum: {max}"; descs.Add(desc); } } appfile.Targets = descs.ToArray(); if (updateData.Xml.ExtendedProperties.IsAppxFramework == "true") { appdepfiles.Add(appfile); } else { appfiles.Add(appfile); } } } } appfiles.Sort((x, y) => x.Modified.CompareTo(y.Modified)); List <FileExchangeV3FileDownloadInformation> files = new(); foreach (var update in updates) { files.AddRange(await FE3Handler.GetFileUrls(update, msaToken)); } List <UUPFile> fileList = appfiles.Where(app => !app.Targets.Any(t => t.Contains("Xbox"))).Select(boundApp => { return(new UUPFile( files.First(x => x.Digest == boundApp.Digest), boundApp.Filename, long.Parse(boundApp.Size), boundApp.Digest, "sha1")); }).ToList(); using var helperDl = new HttpDownloader(downloadDirectory.FullName); return(await helperDl.DownloadAsync(fileList, progress).ConfigureAwait(false) ? fileList.Select(f => f.FileName).ToArray() : null); }
public static async Task <string[]> DownloadPackageAsync(string[] categoryIds, CTAC ctac, DirectoryInfo downloadDirectory, DownloadProgress progress, string msaToken = "") { var updates = await FE3Handler.GetUpdates(categoryIds, ctac, msaToken, FileExchangeV3UpdateFilter.Application); return(await DownloadPackageAsync(updates, downloadDirectory, progress, msaToken)); }