public async Task <bool> Download(ImageDownloadProgress task, CancellationToken token) { var client = new YandexDiskClientWrapper(_client, task.ImageSource.YandexKey, _syncOutput); string remotePath = task.ImageSource.GetYandexDiskPath(task.QualityGroup, task.Dir.Subdir); bool success = await client.DownloadAndExtract(remotePath, task.TargetDirectory, task.Dir.Subdir.Concat(".7z"), token); if (success) { ProgressChanged?.Invoke(task); } return(success); }
public async Task Download(string storageUrl, FsPath targetDirectory, string name, CancellationToken token, bool silent = false, int?timeoutSec = null) { if (_process != null) { throw new InvalidOperationException("Download is already running. Use another instance to start new download."); } _silent = silent; await _syncSelfDownload.WaitAsync(token); try { if (!MegadlExePath.IsFile()) { var webClient = new YandexDiskClientWrapper(new YandexDiskClient(), _yandexKey); // alternatively download from https://yadi.sk/d/f1HuKUg7xW2FUQ/tools?w=1 await webClient.DownloadAndExtract(_megatoolsUrl, AppDir.Update, new FsPath("megatools.7z"), token); } } finally { _syncSelfDownload.Release(); } DownloadedCount = 0; string arguments; targetDirectory.CreateDirectory(); if (targetDirectory.Value.Contains(' ')) { arguments = $@"--path=""{targetDirectory}"" --print-names {storageUrl}"; } else { arguments = $@"--path={targetDirectory} --print-names {storageUrl}"; } _process = new Process { StartInfo = new ProcessStartInfo(MegadlExePath.Value, arguments) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }, EnableRaisingEvents = true }; _process.OutputDataReceived += downloadOutputReceived; _process.ErrorDataReceived += downloadErrorReceived; if (!_silent) { Console.WriteLine("Downloading {0} from {1} to {2}", name, storageUrl, targetDirectory); } AppDomain.CurrentDomain.ProcessExit += processExit; _process.Start(); _process.BeginOutputReadLine(); _process.BeginErrorReadLine(); if (timeoutSec.HasValue) { _process.WaitForExit(timeoutSec.Value * 1000); } else { _process.WaitForExit(); } Abort(); }