mtg-card-image-downloader/Program.cs

134 lines
3.3 KiB
C#

// See https://aka.ms/new-console-template for more information
using System.Text.Json;
using Models;
if (args.Length >= 1)
{
if (!File.Exists(args[0]))
{
throw new ArgumentException("The full path to the Scryfall All Cards JSON file must be passed.");
}
var allCards = new List<Card>();
using (FileStream? fileStream = new(args[0], FileMode.Open))
{
IAsyncEnumerable<Card?> cards = System.Text.Json.JsonSerializer.DeserializeAsyncEnumerable<Card?>(fileStream);
await foreach(Card? card in cards)
{
if (card != null) {
allCards.Add(card);
}
//Console.WriteLine($"{card?.Name} - {card?.SetName}");
}
}
Console.WriteLine($"Total Cards: {allCards.Count}");
var allSets = allCards.Select(c => new { c.Set, c.SetName, c.ReleasedAt }).Distinct().OrderBy(c => c.ReleasedAt);
Console.WriteLine($"Total Sets: {allSets.Count()}");
// Optionally list all sets.
if (args.Any(a => a == "sets")) {
foreach (var set in allSets) {
Console.WriteLine($"{set.Set} = {set.SetName} ({set.ReleasedAt})");
}
}
var interestedSets = new List<string>() {
"lea",
"leb",
"2ed",
"arn",
"atq",
"3ed",
"leg",
"drk",
"phpr",
"fem",
"4ed",
"ice",
"chr",
"pmei",
"o90p",
"hml",
"ptc",
"all",
"mir",
"vis",
"5ed",
"por",
"wth",
"wc97",
"tmp",
"sth",
"exo",
"p02",
"ugl",
"tugl",
"wc98",
"usg",
"ath",
"ulg",
"6ed",
"ptk",
"uds",
"s99",
"wc99",
"mmq",
"brb",
"nem",
"pcy",
"wc00"
};
var interestedCards = allCards.Where(c => interestedSets.Contains(c.Set) && c.Lang == "en").ToList();
Console.WriteLine($"Interested Cards: {interestedCards.Count}");
if (args.Any(a => a == "save")) {
File.WriteAllText($"cards.json", JsonSerializer.Serialize(interestedCards));
Console.WriteLine("File saved.");
}
if (args.Any(a => a.StartsWith("images"))) {
var sets = args.First(a => a.StartsWith("images")).Split(":").Skip(1);
if (sets.Any()) {
using var httpClient = new HttpClient();
foreach (var set in sets) {
var setCards = interestedCards.Where(c => c.Set == set).ToList();
if (setCards.Count == 0) {
continue;
}
Console.WriteLine($"Downloading images from set {set}. {setCards.Count} to download.");
var setImagesPath = Path.Combine("images", set);
Directory.CreateDirectory(setImagesPath);
Console.WriteLine();
foreach (var setCard in setCards) {
Console.Write("\r" + new string(' ', Console.WindowWidth - 1) + "\r");
Console.Write(setCard.Name);
if (!string.IsNullOrWhiteSpace(setCard.ImageUris?.Normal)) {
using var stream = httpClient.GetStreamAsync(setCard.ImageUris?.Normal);
using var fileStream = new FileStream(Path.Combine(setImagesPath, $"{setCard.Id}.jpg"), FileMode.Create);
stream.Result.CopyTo(fileStream);
// Add a short delay between image downloads.
Thread.Sleep(2000);
}
}
Console.WriteLine();
Console.WriteLine($"Card images saved: {setCards.Count}");
}
}
}
var randomCard = interestedCards[new Random().Next(interestedCards.Count)];
Console.WriteLine($"{randomCard.Name} - {randomCard.SetName}");
Console.WriteLine($"{randomCard.ImageUris?.Png} - {randomCard.ImageUris?.Normal}");
} else {
throw new ArgumentException("The full path to the Scryfall All Cards JSON file must be passed.");
}