private static async Task <List <string> > DownloadArtifactZip(RunInfo runInfo, string zipFileName, string saveAsDir = default, Action <int> reportProgressAction = default) { try { var simuApi = new PollinationSDK.Api.RunsApi(); var url = simuApi.DownloadRunArtifact(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, zipFileName).ToString(); var dir = string.IsNullOrEmpty(saveAsDir) ? GenTempFolder() : saveAsDir; var simuID = runInfo.RunID.Substring(0, 8); dir = Path.Combine(dir, simuID); // downloaded folder return(await Download(url, dir, reportProgressAction)); } catch (Exception) { throw; } }
/// <summary> /// Download all assets (input/output) with one call /// </summary> /// <param name="runInfo"></param> /// <param name="saveAsDir"></param> /// <returns></returns> private static List <Task <string> > DownloadAssets(RunInfo runInfo, IEnumerable <RunAssetBase> assets, string saveAsDir, Action <string> reportProgressAction, System.Threading.CancellationToken cancelToken = default) { var tasks = new List <Task <string> >(); if (assets == null || !assets.Any()) { return(tasks); } var api = new PollinationSDK.Api.RunsApi(); var inputDir = Path.Combine(saveAsDir, "inputs"); var outputDir = Path.Combine(saveAsDir, "outputs"); var total = assets.Count(); var completed = 0; foreach (var asset in assets) { try { if (asset.IsPathAsset() && !asset.IsSaved()) { var assetName = asset.Name; var isInputAsset = asset is RunInputAsset; var dir = isInputAsset ? inputDir : outputDir; dir = Path.Combine(dir, assetName); Action <int> individualProgress = (percent) => { reportProgressAction?.Invoke($"{assetName}: {percent}%"); }; Action overAllProgress = () => { completed++; reportProgressAction?.Invoke($"OVERALL: {completed}/{total}"); }; var task = Task.Run(async() => { var url = string.Empty; if (isInputAsset) { url = api.DownloadRunArtifact(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, path: asset.RelativePath).ToString(); } else { url = api.GetRunOutput(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, assetName).ToString(); } Helper.Logger.Information($"DownloadAssets: downloading {assetName} from \n -{url}\n"); var t = Helper.DownloadUrlAsync(url, dir, individualProgress, overAllProgress, cancelToken); await t.ConfigureAwait(false); var path = t.Result; Helper.Logger.Information($"DownloadAssets: saved {assetName} to {path}"); return(path); }); tasks.Add(task); } else { tasks.Add(Task.Run(() => asset.LocalPath)); completed++; } } catch (Exception e) { //canceled by user if (e is OperationCanceledException) { return(null); } throw new ArgumentException($"Failed to download asset {asset.Name}.\n -{e.Message}"); } } return(tasks); }