/// <summary> /// Asynchronously downloads a resource. Resource version must be specified. /// </summary> /// <param name="resourceId">Hash of the resource to download</param> /// <param name="resourceType">Resource type</param> /// <param name="payloadType">Payload type</param> /// <param name="variantType">Variant type</param> /// <param name="version">Version string</param> /// <param name="client">Client used for downloading</param> /// <param name="progress">Optional progress report callback</param> /// <returns>Task for downloading the specified resource</returns> public static async Task <DownloadResults> DownloadResourceAsync(string resourceId, ResourceType resourceType, PayloadType payloadType, VariantType variantType, string version, IHttpClientProvider client, IProgress <ProgressEventArgs> progress = null) { var resourceTypeName = GetResourceTypeName(resourceType); var payloadTypeName = GetPayloadTypeName(payloadType); var variantTypeName = GetVariantTypeName(variantType); var itemName = $"{ resourceId }.{ resourceTypeName}.v{version}.{payloadTypeName}.v0.{variantTypeName}"; var address = $"http://sansar-asset-production.s3-us-west-2.amazonaws.com/{itemName}"; progress?.Report(new ProgressEventArgs { BytesDownloaded = 0, CurrentResourceIndex = 0, Resource = address, Status = ProgressStatus.Idling, TotalBytes = 1, TotalResources = 1 }); var progressMiddleman = new Progress <ProgressEventArgs>(args => { progress?.Report(new ProgressEventArgs { BytesDownloaded = args.BytesDownloaded, TotalBytes = args.TotalResources, Resource = args.Resource, Status = args.Status, CurrentResourceIndex = 0, TotalResources = 1 }); }); return(new DownloadResults { Name = itemName, Version = version, Bytes = await client.GetByteArrayAsync(address, progressMiddleman).ConfigureAwait(false) }); }
/// <summary> /// Asynchronously downloads a resource. Attempts to find the latest resource version. /// </summary> /// <param name="resourceId">Hash of the resource to download</param> /// <param name="resourceType">Resource type</param> /// <param name="payloadType">Payload type</param> /// <param name="variantType">Variant type</param> /// <param name="client">Client used for downloading</param> /// <param name="progress">Optional progress report callback</param> /// <returns>Task for downloading the specified resource</returns> public static async Task <DownloadResults> DownloadResourceAsync(string resourceId, ResourceType resourceType, PayloadType payloadType, VariantType variantType, IHttpClientProvider client, IProgress <ProgressEventArgs> progress = null) { Exception lastException = null; var resourceTypeName = GetResourceTypeName(resourceType); var versions = AssetVersions.GetResourceVersions(resourceType); var payloadTypeName = GetPayloadTypeName(payloadType); var variantTypeName = GetVariantTypeName(variantType); var currentResourceIndex = 0; var totalResources = versions.Count; foreach (string version in versions) { progress?.Report(new ProgressEventArgs { BytesDownloaded = 0, CurrentResourceIndex = currentResourceIndex, Resource = version, Status = ProgressStatus.Idling, TotalBytes = 1, TotalResources = totalResources }); var progressMiddleman = new Progress <ProgressEventArgs>(args => { progress?.Report(new ProgressEventArgs { BytesDownloaded = args.BytesDownloaded, TotalBytes = args.TotalBytes, Resource = args.Resource, Status = args.Status, // ReSharper disable once AccessToModifiedClosure CurrentResourceIndex = currentResourceIndex, TotalResources = totalResources }); }); try { var itemName = $"{ resourceId }.{ resourceTypeName}.v{version.ToLower()}.{payloadTypeName}.v0.{variantTypeName}"; var address = $"http://sansar-asset-production.s3-us-west-2.amazonaws.com/{itemName}"; var bytes = await client.GetByteArrayAsync(address, progressMiddleman).ConfigureAwait(false); return(new DownloadResults { Name = itemName, Version = version, Bytes = bytes }); } catch (Exception ex) { lastException = ex; progress?.Report(new ProgressEventArgs { BytesDownloaded = 0, CurrentResourceIndex = currentResourceIndex, Resource = version, Status = ProgressStatus.Error, TotalBytes = 1, TotalResources = totalResources }); } ++currentResourceIndex; } if (lastException != null) { throw lastException; } return(null); }