public bool CreateShortcut(FsPath exePath, FsPath iconPath, FsPath shortcutPath) { bool useBackup = false; FsPath backupPath = FsPath.None; if (shortcutPath.IsFile()) { backupPath = shortcutPath.WithName(_ => _ + ".bak"); useBackup = !backupPath.IsFile(); if (useBackup) { shortcutPath.MoveFileTo(backupPath); } else { shortcutPath.DeleteFile(); } } bool success = run($"\"{_script}\" \"{shortcutPath}\" \"{exePath}\" \"{iconPath}\""); if (!success && useBackup) { backupPath.MoveFileTo(shortcutPath); } return(success); }
public async Task DownloadGathererImages(string setCodesStr, bool nonToken, bool token) { var clients = new List <ImageDownloaderBase>(2) { // new GathererClient(), new ScryfallClient(), }; var setCodes = setCodesStr?.Split(',').ToHashSet(StringComparer.OrdinalIgnoreCase); var repo = new CardRepository(new CardFormatter(), () => null) { FilterSetCode = setCode => setCodes?.Contains(setCode) != false, }; repo.LoadFile(); repo.Load(); foreach (Set set in repo.SetsByCode.Values) { if (setCodes?.Contains(set.Code) == false) { continue; } foreach ((bool isToken, FsPath typeSubdir, _) in getIsToken(nonToken, token)) { var cards = set.List(isToken); if (cards.Count == 0) { continue; } var missingCardsByClient = clients.ToDictionary(_ => _, _ => 0); FsPath setSubdir = new FsPath(set.Code + (Str.Equals(set.Code, "con") ? " escape" : string.Empty)); FsPath downloadRootDir = DevPaths.MtgContentDir.Join(_createZoom ? OriginalSubdir : PreProcessedSubdir); FsPath rootDirZoom = DevPaths.MtgContentDir.Join(PreProcessedSubdir); FsPath setDirectory = downloadRootDir.Join(typeSubdir, setSubdir); FsPath setDirectoryZoom = rootDirZoom.Join(typeSubdir, setSubdir); FsPath setDirectoryPng = setDirectory.Concat(".png"); bool dirExisted = setDirectoryPng.IsDirectory(); if (!dirExisted) { setDirectoryPng.CreateDirectory(); } foreach (var card in cards) { FsPath targetFile = setDirectoryPng.Join(card.ImageName + ".png"); FsPath processedFile = setDirectory.Join(card.ImageName + ".jpg"); FsPath processedFileZoom = setDirectoryZoom.Join(card.ImageName + ".jpg"); if (targetFile.IsFile() || processedFile.IsFile() && processedFileZoom.IsFile()) { continue; } if (targetFile.Basename(extension: false).EndsWith("1")) { var unnumbered = targetFile.WithName(_ => _.Replace("1.png", ".png")); if (unnumbered.IsFile()) { unnumbered.MoveFileTo(targetFile); continue; } } foreach (ImageDownloaderBase client in clients) { int attempts = 5; for (int i = 0; i < attempts; i++) { var cancellation = new CancellationTokenSource(); var time = DateTime.UtcNow; var downloadTask = client.DownloadCardImage(card, targetFile, cancellation.Token); var waitTask = Task.Delay(TimeSpan.FromSeconds(5), cancellation.Token); await Task.WhenAny(downloadTask, waitTask); cancellation.Cancel(); var elapsed = DateTime.UtcNow - time; var delta = TimeSpan.FromSeconds(0.5) - elapsed; if (delta.TotalSeconds > 0) { await Task.Delay(delta); } if (targetFile.IsFile()) { break; } } if (targetFile.IsFile()) { break; } missingCardsByClient[client]++; } } if (!dirExisted && !setDirectoryPng.EnumerateFiles().Any()) { setDirectoryPng.DeleteDirectory(); } } } }