134 lines
3.3 KiB
C#
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.");
|
|
}
|