Improved Android downloader to use ScryFall APIs, fixed J22 dat file, updated card url links for J22 set.

This commit is contained in:
Vittorio Alfieri
2023-06-04 01:11:01 +02:00
parent 24c0684563
commit a78110759b
4 changed files with 1004 additions and 6 deletions

Binary file not shown.

View File

@@ -6,6 +6,10 @@ import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Node;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.Enumeration;
@@ -142,6 +146,125 @@ public class ImgDownloader {
return true;
}
public static JSONObject findCardJsonById(String multiverseId) {
try{
String apiUrl = "https://api.scryfall.com/cards/multiverse/" + multiverseId;
URL url = new URL(apiUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(response.toString());
return jsonObject;
} catch(Exception e){
return null;
}
}
public static String findCardImageUrl(JSONObject jsonObject, String primitiveCardName, String format){
Map<String, String> imageUris = new HashMap<String, String>();
if (jsonObject.get("image_uris") != null) {
JSONObject imageUrisObject = (JSONObject) jsonObject.get("image_uris");
if(imageUrisObject != null && jsonObject.get("name").equals(primitiveCardName))
imageUris = (HashMap) imageUrisObject;
} else if (jsonObject.get("card_faces") != null) {
JSONArray faces = (JSONArray) jsonObject.get("card_faces");
if(faces != null){
for (Object o : faces) {
JSONObject imageUrisObject = (JSONObject) o;
if(imageUrisObject != null && imageUrisObject.get("name").equals(primitiveCardName)){
if (imageUrisObject.get("image_uris") != null) {
imageUrisObject = (JSONObject) imageUrisObject.get("image_uris");
if(imageUrisObject != null)
imageUris = (HashMap) imageUrisObject;
}
}
}
}
} else {
System.err.println("Cannot retrieve image url for card: " + primitiveCardName);
return "";
}
String imageUrl = imageUris.get(format);
if(imageUrl.indexOf(".jpg") < imageUrl.length())
imageUrl = imageUrl.substring(0, imageUrl.indexOf(".jpg")+4);
return imageUrl;
}
public static String findTokenImageUrl(JSONObject jsonObject, String format){
String imageUrl = "";
try {
Document document = Jsoup.connect((String )jsonObject.get("scryfall_uri")).get();
if (document != null) {
Element printsTable = document.selectFirst("table.prints-table");
if (printsTable != null) {
Element tokenRow = null;
Elements rows = printsTable.select("tr");
for (Element row : rows) {
if (row.text().contains(" Token,") && !row.text().contains("Faces,")) {
tokenRow = row;
}
}
if (tokenRow != null) {
Element aElement = tokenRow.selectFirst("td > a");
if (aElement != null) {
String tokenName = aElement.text();
tokenName = tokenName.substring(0, tokenName.indexOf(" Token,"));
System.out.println("Token found: " + tokenName);
imageUrl = aElement.attr("data-card-image-front");
if(imageUrl.indexOf(".jpg") < imageUrl.length())
imageUrl = imageUrl.substring(0, imageUrl.indexOf(".jpg")+4);
}
}
}
}
} catch (IOException e) {
System.err.println("There was an error while retrieving token image...");
return null;
}
return imageUrl.replace("large", format);
}
public static String findTokenName(JSONObject jsonObject){
String tokenName = "";
try {
Document document = Jsoup.connect((String) jsonObject.get("scryfall_uri")).get();
if (document != null) {
Element printsTable = document.selectFirst("table.prints-table");
if (printsTable != null) {
Element tokenRow = null;
Elements rows = printsTable.select("tr");
for (Element row : rows) {
if (row.text().contains(" Token,") && !row.text().contains("Faces,")) {
tokenRow = row;
}
}
if (tokenRow != null) {
Element aElement = tokenRow.selectFirst("td > a");
if (aElement != null) {
tokenName = aElement.text();
tokenName = tokenName.substring(0, tokenName.indexOf(" Token,"));
System.out.println("Token found: " + tokenName);
}
}
}
}
} catch (IOException e) {
System.err.println("There was an error while retrieving the token image...");
return null;
}
return tokenName;
}
public static boolean fastDownloadCard(String set, String id, String name, String imgPath, String thumbPath, int ImgX, int ImgY, int ThumbX, int ThumbY, int Border, int BorderThumb) {
if (database == null)
return false;
@@ -3701,7 +3824,7 @@ public class ImgDownloader {
set.equals("UNH") || set.equals("XLN") || set.equals("SOI") || set.equals("SOK") ||
set.equals("BOK") || set.equals("CHK") || set.equals("ZNR") || set.equals("KHM") ||
set.equals("STX") || set.equals("MID") || set.equals("CC2") || set.equals("VOW") ||
set.equals("DBL") || set.equals("Y22") || set.equals("MOM"))
set.equals("DBL") || set.equals("Y22") || set.equals("MOM") || set.equals("NEO"))
rarity = "";
if(id != null && !rarity.equals("t") && (negativeId || id.equals("209162") || id.equals("209163") || id.equals("401721") ||
id.equals("401722") || id.equals("999902")))
@@ -3838,6 +3961,9 @@ public class ImgDownloader {
if (fastDownloadCard(set, id, mappa.get(id), imgPath.getAbsolutePath(), thumbPath.getAbsolutePath(), ImgX, ImgY, ThumbX, ThumbY, Border, BorderThumb))
continue;
String specialcardurl = getSpecialCardUrl(id, set);
JSONObject card = findCardJsonById(id);
if(specialcardurl.isEmpty() && card != null)
specialcardurl = findCardImageUrl(card, mappa.get(id), "large");
if (!specialcardurl.isEmpty()) {
URL url = new URL(specialcardurl);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
@@ -3942,10 +4068,126 @@ public class ImgDownloader {
res = mappa.get(id) + " - " + set + File.separator + "thumbnails" + File.separator + id + ".jpg\n" + res;
break;
}
if(card != null && hasToken(id)) {
String text = (String) card.get("oracle_text");
if (text != null && !text.isEmpty() && !text.trim().toLowerCase().contains("nontoken") && ((text.trim().toLowerCase().contains("create") && text.trim().toLowerCase().contains("creature token")) ||
(text.trim().toLowerCase().contains("put") && text.trim().toLowerCase().contains("token")))) {
System.out.println("The card: " + mappa.get(id) + " (" + id + ".jpg) can create a token, i will try to download that image too as " + id + "t.jpg");
String specialtokenurl = findTokenImageUrl(card, "large");
String nametoken = findTokenName(card);
URL urltoken = null;
if (!specialtokenurl.isEmpty())
urltoken = new URL(specialtokenurl);
HttpURLConnection httpcontoken = (HttpURLConnection) urltoken.openConnection();
if (httpcontoken == null) {
System.err.println("Error: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will not download it...");
res = nametoken + " - " + set + File.separator + id + "t.jpg\n" + res;
break;
}
httpcontoken.addRequestProperty("User-Agent", "Mozilla/4.76");
httpcontoken.setConnectTimeout(5000);
httpcontoken.setReadTimeout(5000);
httpcontoken.setAllowUserInteraction(false);
httpcontoken.setDoInput(true);
httpcontoken.setDoOutput(false);
InputStream intoken = null;
try {
intoken = new BufferedInputStream(httpcontoken.getInputStream());
} catch (IOException ex) {
System.out.println("Warning: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will retry 2 times more...");
try {
intoken = new BufferedInputStream(httpcontoken.getInputStream());
} catch (IOException ex2) {
System.out.println("Warning: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will retry 1 time more...");
try {
intoken = new BufferedInputStream(httpcontoken.getInputStream());
} catch (IOException ex3) {
System.err.println("Error: Problem downloading token: " + nametoken + " (" + id + "t.jpg), i will not retry anymore...");
res = nametoken + " - " + set + File.separator + id + "t.jpg\n" + res;
break;
}
}
}
ByteArrayOutputStream outtoken = new ByteArrayOutputStream();
byte[] buftoken = new byte[1024];
int ntoken = 0;
millis = System.currentTimeMillis();
timeout = false;
while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) {
outtoken.write(buftoken, 0, ntoken);
if (System.currentTimeMillis() - millis > 10000)
timeout = true;
}
if (timeout) {
System.out.println("Warning: Problem downloading token: " + id + "t.jpg from, i will retry 2 times more...");
buftoken = new byte[1024];
ntoken = 0;
millis = System.currentTimeMillis();
timeout = false;
while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) {
outtoken.write(buftoken, 0, ntoken);
if (System.currentTimeMillis() - millis > 10000)
timeout = true;
}
if (timeout) {
System.out.println("Warning: Problem downloading token: " + id + "t.jpg from, i will retry 1 time more...");
buftoken = new byte[1024];
ntoken = 0;
millis = System.currentTimeMillis();
timeout = false;
while (-1 != (ntoken = intoken.read(buftoken)) && !timeout) {
outtoken.write(buftoken, 0, ntoken);
if (System.currentTimeMillis() - millis > 10000)
timeout = true;
}
}
}
outtoken.close();
intoken.close();
if (timeout) {
System.err.println("Error: Problem downloading token: " + id + "t.jpg from, i will not retry anymore...");
break;
}
byte[] responsetoken = outtoken.toByteArray();
String tokenimage = imgPath + File.separator + id + "t.jpg";
String tokenthumbimage = thumbPath + File.separator + id + "t.jpg";
FileOutputStream fos2 = new FileOutputStream(tokenimage);
fos2.write(responsetoken);
fos2.close();
try {
Bitmap yourBitmapToken = BitmapFactory.decodeFile(tokenimage);
Bitmap resizedToken = Bitmap.createScaledBitmap(yourBitmapToken, ImgX, ImgY, true);
if (Border > 0)
resizedToken = Bitmap.createBitmap(resizedToken, Border, Border, ImgX - 2 * Border, ImgY - 2 * Border);
FileOutputStream fout = new FileOutputStream(tokenimage);
resizedToken.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.close();
} catch (Exception e) {
System.err.println("Error: Problem resizing token: " + id + "t.jpg, image may be corrupted...");
res = nametoken + " - " + set + File.separator + "thumbnails" + File.separator + id + "t.jpg\n" + res;
break;
}
try {
Bitmap yourBitmapTokenthumb = BitmapFactory.decodeFile(tokenimage);
Bitmap resizedThumbToken = Bitmap.createScaledBitmap(yourBitmapTokenthumb, ThumbX, ThumbY, true);
if (BorderThumb > 0)
resizedThumbToken = Bitmap.createBitmap(resizedThumbToken, BorderThumb, BorderThumb, ThumbX - 2 * BorderThumb, ThumbY - 2 * BorderThumb);
FileOutputStream fout = new FileOutputStream(tokenthumbimage);
resizedThumbToken.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.close();
} catch (Exception e) {
System.err.println("Error: Problem resizing token thumbnail: " + id + "t.jpg, image may be corrupted...");
res = nametoken + " - " + set + File.separator + "thumbnails" + File.separator + id + "t.jpg\n" + res;
}
}
}
continue;
}
if (id.endsWith("t"))
continue;
Document doc = null;
String cardname = mappa.get(id);
Elements divs = new Elements();
@@ -3965,7 +4207,8 @@ public class ImgDownloader {
|| scryset.equals("SOI") || scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2")
|| scryset.equals("Q06") || scryset.equals("DBL") || scryset.equals("Y22") | scryset.equals("CLB") || scryset.equals("MOM")
|| scryset.equals("MOC") || scryset.equals("BRO") || scryset.equals("MAT") || scryset.equals("BRC") || scryset.equals("BRR")
|| scryset.equals("NEO") || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC")){
|| scryset.equals("NEO") || scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC")
|| scryset.equals("J22")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a");
@@ -4134,7 +4377,8 @@ public class ImgDownloader {
&& !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2")
&& !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22") && !scryset.equals("CLB") && !scryset.equals("MOM")
&& !scryset.equals("MOC") && !scryset.equals("BRO") && !scryset.equals("MAT") && !scryset.equals("BRC") && !scryset.equals("BRR")
&& !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")){
&& !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")
&& !scryset.equals("J22")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a");
@@ -4254,7 +4498,8 @@ public class ImgDownloader {
&& !scryset.equals("SOI") && !scryset.equals("UST") && !scryset.equals("PLG21") && !scryset.equals("J21") && !scryset.equals("CC2")
&& !scryset.equals("Q06") && !scryset.equals("DBL") && !scryset.equals("Y22") && !scryset.equals("CLB") && !scryset.equals("MOM")
&& !scryset.equals("MOC") && !scryset.equals("BRO") && !scryset.equals("MAT") && !scryset.equals("BRC") && !scryset.equals("BRR")
&& !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")){
&& !scryset.equals("NEO") && !scryset.equals("ONE") && !scryset.equals("ONC") && !scryset.equals("DMR") && !scryset.equals("NEC")
&& !scryset.equals("J22")){
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
} catch (Exception e) {
@@ -4426,7 +4671,7 @@ public class ImgDownloader {
|| scryset.equals("UST") || scryset.equals("PLG21") || scryset.equals("J21") || scryset.equals("CC2") || scryset.equals("Q06")
|| scryset.equals("DBL") || scryset.equals("Y22") || scryset.equals("CLB") || scryset.equals("MOM") || scryset.equals("MOC")
|| scryset.equals("BRO") || scryset.equals("MAT") || scryset.equals("BRC") || scryset.equals("BRR") || scryset.equals("NEO")
|| scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC")){
|| scryset.equals("ONE") || scryset.equals("ONC") || scryset.equals("DMR") || scryset.equals("NEC") || scryset.equals("J22")){
Elements metadata = doc.select("head meta");
if(metadata != null) {
for (int j = 0; j < metadata.size(); j++){
@@ -4640,6 +4885,10 @@ public class ImgDownloader {
String specialtokenurl = getSpecialTokenUrl(id + "t", set);
if(specialtokenurl.isEmpty())
specialtokenurl = getSpecialCardUrl(id + "t", set);
if(specialtokenurl.isEmpty() && card != null)
specialtokenurl = findTokenImageUrl(card, "large");
if(nametoken.isEmpty() && card != null)
nametoken = findTokenName(card);
if (!specialtokenurl.isEmpty()) {
try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();

View File

@@ -64537,6 +64537,130 @@ GN3;582743;https://cards.scryfall.io/large/front/2/8/28294aef-eba7-4f20-bf81-c85
GN3;582744;https://cards.scryfall.io/large/front/5/8/586ad230-fb4b-4b34-8d5c-633726496634.jpg
GN3;582745;https://cards.scryfall.io/large/front/2/f/2fd47e30-2ab0-452d-ac51-fa182c2b00fc.jpg
GN3;582746;https://cards.scryfall.io/large/front/8/5/85a1b232-92ab-4829-9af3-26b280507dc0.jpg
J22;589563t;https://cards.scryfall.io/large/front/a/5/a5c325d9-6cfc-4e41-b73d-4a45454d9fad.jpg
J22;589568t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;589581t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;589583t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;589594t;https://www.mtgnexus.com/img/ccc/ren/7830/29125.jpg
J22;597043t;https://cards.scryfall.io/large/front/7/b/7b0b95ce-4821-4955-a27c-93471240f54b.jpg
J22;597049t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;597054t;https://cards.scryfall.io/large/front/2/0/209d3f3e-a41e-4d9b-a9bd-50d11e89b5ea.jpg
J22;597059t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;597063t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;597068t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;597078t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;597510t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;597518t;https://www.mtg.onl/static/987cd9d77ce79d4feb56788cabbb5dd0/4d406/PROXY_Spawn_2_2.jpg
J22;591418t;https://cards.scryfall.io/large/front/b/0/b0819e8e-fb7e-43c7-a7cf-d768f43193ac.jpg
J22;591428t;https://cards.scryfall.io/large/front/d/e/dee1c2ee-d92e-409a-995a-b4c91620c918.jpg
J22;591429t;https://cards.scryfall.io/large/front/5/f/5f458f39-27b6-4121-bda9-1a0d1b42f5fb.jpg
J22;591433t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg
J22;591443t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg
J22;591446t;https://cards.scryfall.io/large/front/1/7/1774c68a-3d76-4fe1-b741-e6acf6b9214c.jpg
J22;591450t;https://cards.scryfall.io/large/front/d/0/d0cc09a9-a21b-40ee-8b68-bc084f71737d.jpg
J22;591455t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg
J22;591461t;https://cards.scryfall.io/large/front/0/5/0537522a-1f4f-4a81-a678-6b280ebc29fc.jpg
J22;591463t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg
J22;591485t;https://cards.scryfall.io/large/front/d/7/d754e09c-efc0-4536-9f2a-6bd7e2f860ab.jpg
J22;591490t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg
J22;591496t;https://cards.scryfall.io/large/front/d/0/d0cc09a9-a21b-40ee-8b68-bc084f71737d.jpg
J22;591499t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg
J22;591509t;https://cards.scryfall.io/large/front/d/7/d754e09c-efc0-4536-9f2a-6bd7e2f860ab.jpg
J22;591517t;https://cards.scryfall.io/large/front/3/8/38476293-627e-44e6-a83e-24aaf3de8e9a.jpg
J22;591521t;https://cards.scryfall.io/large/front/6/6/663333ab-4e92-4290-b4e2-65f3f173e53f.jpg
J22;591532t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;591535t;https://cards.scryfall.io/large/front/4/7/476261b8-635c-4228-b5bf-ddc27157876e.jpg
J22;591538t;https://cards.scryfall.io/large/front/0/d/0dd269c7-1333-470d-b8ef-e54add09b350.jpg
J22;591541t;https://cards.scryfall.io/large/front/5/2/52cf8f6b-2334-4881-8f58-4e11745c8851.jpg
J22;595089t;https://cards.scryfall.io/large/front/9/0/90317f5e-d121-4c00-86cc-5bbee953f600.jpg
J22;595093t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;595107t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;595109t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;595112t;https://cards.scryfall.io/large/front/0/1/010ffef8-22ce-4d8f-80f0-6749f63ec4c2.jpg
J22;595118t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;595129t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;595137t;https://cards.scryfall.io/large/front/3/4/34db5e62-4792-4207-b008-7d62bae683a7.jpg
J22;595143t;https://cards.scryfall.io/large/front/3/d/3d0b9b88-705e-4df0-8a93-3e240b81355b.jpg
J22;595155t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;595171t;https://cards.scryfall.io/large/front/0/1/010ffef8-22ce-4d8f-80f0-6749f63ec4c2.jpg
J22;595178t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;595179t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;593935t;https://cards.scryfall.io/large/front/c/7/c7bb00e4-7eb0-4f7d-b2c3-8995959a6e6a.jpg
J22;593942t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593950t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593956t;https://cards.scryfall.io/large/front/c/7/c7bb00e4-7eb0-4f7d-b2c3-8995959a6e6a.jpg
J22;593961t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593973t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593975t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593978t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593986t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593988t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;593992t;https://cards.scryfall.io/large/front/1/3/13e4832d-8530-4b85-b738-51d0c18f28ec.jpg
J22;593997t;https://cards.scryfall.io/large/front/1/d/1db0ae89-74fb-4865-99d0-31e3e19f1480.jpg
J22;594007t;https://cards.scryfall.io/large/front/1/d/1db0ae89-74fb-4865-99d0-31e3e19f1480.jpg
J22;594009t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;594016t;https://cards.scryfall.io/large/front/2/c/2c0e7faf-43cb-4a96-ac3c-9533f957ee28.jpg
J22;590071t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590079t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590082t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590092t;https://cards.scryfall.io/large/front/8/9/895df6af-6799-4ec6-b8f4-912b06f30ed2.jpg
J22;590095t;https://cards.scryfall.io/large/front/6/5/6592849a-3875-42e6-bab8-f1c04b5f58bf.jpg
J22;590096t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590111t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590118t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590119t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590123t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590125t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590127t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590131t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590135t;https://cards.scryfall.io/large/front/5/c/5cd9a145-86cc-4591-b64b-c003eaa926eb.jpg
J22;590137t;https://cards.scryfall.io/large/front/9/c/9cb4069a-0ec9-415d-8a2c-82f4a9f3ea2b.jpg
J22;590139t;https://cards.scryfall.io/large/front/3/1/312ea78e-a4e6-4c66-9fd7-62dc7822d89e.jpg
J22;590143t;https://cards.scryfall.io/large/front/2/0/209d3f3e-a41e-4d9b-a9bd-50d11e89b5ea.jpg
J22;590154t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590171t;https://cards.scryfall.io/large/front/c/4/c4052aed-981b-41d0-85f0-20c2599811ba.jpg
J22;590174t;https://cards.scryfall.io/large/front/c/b/cbafdfc0-380a-482b-b5f8-a7a00ecf8da6.jpg
J22;590183t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590189t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590190t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;590199t;https://cards.scryfall.io/large/front/4/6/462bb611-5a02-441c-ae8a-911b75436864.jpg
J22;592707t;https://cards.scryfall.io/large/front/f/7/f7164476-4a93-4295-9ac4-33e1677b09b8.jpg
J22;592710t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg
J22;592715t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg
J22;592720t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg
J22;592729t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592730t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592731t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592732t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592735t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592737t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592739t;https://cards.scryfall.io/large/front/e/4/e4b7e3b5-2f3c-4eb7-abc9-322a049a9e1a.jpg
J22;592744t;https://cards.scryfall.io/large/front/d/7/d7636957-f183-4f58-87a6-056cde657114.jpg
J22;592755t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592756t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg
J22;592759t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592764t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592766t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592774t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592786t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592787t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592793t;https://cards.scryfall.io/large/front/d/2/d2bfef17-6e00-4097-b27a-4e3c7e19ca03.jpg
J22;592803t;https://cards.scryfall.io/large/front/2/6/265b1462-dd9c-42af-8ba0-e840f8a651e2.jpg
J22;592812t;https://cards.scryfall.io/large/front/e/6/e662eefb-c454-44b9-8270-f2229e20024e.jpg
J22;592818t;https://cards.scryfall.io/large/front/3/6/365b2234-c29d-42db-a8e0-80685a4b6434.jpg
J22;592819t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592820t;https://cards.scryfall.io/large/front/3/9/39133387-9cd3-49f1-88e1-d23636e020b3.jpg
J22;592821t;https://cards.scryfall.io/large/front/8/0/805945e7-dea2-476d-a274-b6e801ccb95e.jpg
J22;592825t;https://cards.scryfall.io/large/front/5/d/5dc134da-51b8-452d-b515-54def56fe0c7.jpg
J22;596176t;https://cards.scryfall.io/large/front/e/b/eb7b2c61-b903-4669-b9a3-110418a35593.jpg
J22;596185t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;596186t;https://cards.scryfall.io/large/front/4/2/42ac3b2a-cc0a-45a4-802c-1c543472cdc6.jpg
J22;596189t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;596217t;https://cards.scryfall.io/large/front/e/1/e197929c-1334-48f5-a03c-546a4074ad02.jpg
J22;596225t;https://cards.scryfall.io/large/front/d/b/db0041d8-cacd-4057-8f99-37810edb4b7e.jpg
J22;596245t;https://cards.scryfall.io/large/front/e/7/e72daa68-0680-431c-a616-b3693fd58813.jpg
J22;597895t;https://www.mtgnexus.com/img/ccc/ren/7830/29125.jpg
J22;596204t;https://www.mtg.onl/static/9ce248147e36a52ccc388b3e642839aa/4d406/PROXY_Ape_G_2_2.jpg
J22;589555;https://cards.scryfall.io/large/front/e/a/ea531418-6c7c-4e23-b681-6bfdd4a3eb79.jpg
J22;589556;https://cards.scryfall.io/large/front/f/4/f45e1832-1070-4d12-aba9-dcad47a02eda.jpg
J22;589557;https://cards.scryfall.io/large/front/9/4/94a1a840-bcdc-4d6f-a28d-9805578473f6.jpg
Can't render this file because it is too large.

View File

@@ -2,9 +2,634 @@
author=Wagic Team
name=Jumpstart 2022
year=2022-12-02
total=835
total=960
[/meta]
[card]
primitive=Drake
id=-589563
rarity=T
[/card]
[card]
primitive=Thopter
id=-589568
rarity=T
[/card]
[card]
primitive=Zombie
id=-589581
rarity=T
[/card]
[card]
primitive=Goblin
id=-589583
rarity=T
[/card]
[card]
primitive=Pirate
id=-589587
rarity=T
[/card]
[card]
primitive=Banana
id=-589594
rarity=T
[/card]
[card]
primitive=Wizard
id=-597043
rarity=T
[/card]
[card]
primitive=Thopter
id=-597049
rarity=T
[/card]
[card]
primitive=Rat
id=-597054
rarity=T
[/card]
[card]
primitive=Goblin
id=-597059
rarity=T
[/card]
[card]
primitive=Treasure
id=-597063
rarity=T
[/card]
[card]
primitive=Wolf
id=-597068
rarity=T
[/card]
[card]
primitive=Clue
id=-597078
rarity=T
[/card]
[card]
primitive=Zombie
id=-597510
rarity=T
[/card]
[card]
primitive=Spawn
id=-597518
rarity=T
[/card]
[card]
primitive=Ajani's Pridemate
id=-591418
rarity=T
[/card]
[card]
primitive=Pegasus
id=-591428
rarity=T
[/card]
[card]
primitive=Cat
id=-591429
rarity=T
[/card]
[card]
primitive=Spirit
id=-591433
rarity=T
[/card]
[card]
primitive=Knight
id=-591443
rarity=T
[/card]
[card]
primitive=Soldier
id=-591446
rarity=T
[/card]
[card]
primitive=Soldier
id=-591450
rarity=T
[/card]
[card]
primitive=Spirit
id=-591455
rarity=T
[/card]
[card]
primitive=Cat Beast
id=-591461
rarity=T
[/card]
[card]
primitive=Knight
id=-591463
rarity=T
[/card]
[card]
primitive=Cat
id=-591485
rarity=T
[/card]
[card]
primitive=Spirit
id=-591490
rarity=T
[/card]
[card]
primitive=Soldier
id=-591496
rarity=T
[/card]
[card]
primitive=Spirit
id=-591499
rarity=T
[/card]
[card]
primitive=Cat
id=-591509
rarity=T
[/card]
[card]
primitive=Bird
id=-591517
rarity=T
[/card]
[card]
primitive=Angel
id=-591521
rarity=T
[/card]
[card]
primitive=Clue
id=-591532
rarity=T
[/card]
[card]
primitive=Spirit
id=-591535
rarity=T
[/card]
[card]
primitive=Angel
id=-591538
rarity=T
[/card]
[card]
primitive=Knight
id=-591541
rarity=T
[/card]
[card]
primitive=Merfolk
id=-595089
rarity=T
[/card]
[card]
primitive=Thopter
id=-595093
rarity=T
[/card]
[card]
primitive=Clue
id=-595107
rarity=T
[/card]
[card]
primitive=Clue
id=-595109
rarity=T
[/card]
[card]
primitive=Faerie
id=-595112
rarity=T
[/card]
[card]
primitive=Clue
id=-595118
rarity=T
[/card]
[card]
primitive=Clue
id=-595129
rarity=T
[/card]
[card]
primitive=Marit Lage
id=-595137
rarity=T
[/card]
[card]
primitive=Elemental
id=-595143
rarity=T
[/card]
[card]
primitive=Clue
id=-595155
rarity=T
[/card]
[card]
primitive=Faerie
id=-595171
rarity=T
[/card]
[card]
primitive=Thopter
id=-595178
rarity=T
[/card]
[card]
primitive=Thopter
id=-595179
rarity=T
[/card]
[card]
primitive=Saproling
id=-593935
rarity=T
[/card]
[card]
primitive=Zombie
id=-593942
rarity=T
[/card]
[card]
primitive=Zombie
id=-593950
rarity=T
[/card]
[card]
primitive=Saproling
id=-593956
rarity=T
[/card]
[card]
primitive=Zombie
id=-593961
rarity=T
[/card]
[card]
primitive=Zombie
id=-593973
rarity=T
[/card]
[card]
primitive=Zombie
id=-593975
rarity=T
[/card]
[card]
primitive=Zombie
id=-593978
rarity=T
[/card]
[card]
primitive=Zombie
id=-593986
rarity=T
[/card]
[card]
primitive=Zombie
id=-593988
rarity=T
[/card]
[card]
primitive=Snake // Zombie
id=-593992
rarity=T
[/card]
[card]
primitive=Demon
id=-593997
rarity=T
[/card]
[card]
primitive=Demon
id=-594007
rarity=T
[/card]
[card]
primitive=Goblin
id=-594009
rarity=T
[/card]
[card]
primitive=Demon
id=-594016
rarity=T
[/card]
[card]
primitive=Treasure
id=-590071
rarity=T
[/card]
[card]
primitive=Treasure
id=-590079
rarity=T
[/card]
[card]
primitive=Treasure
id=-590082
rarity=T
[/card]
[card]
primitive=Devil
id=-590092
rarity=T
[/card]
[card]
primitive=Dragon
id=-590095
rarity=T
[/card]
[card]
primitive=Goblin
id=-590096
rarity=T
[/card]
[card]
primitive=Treasure
id=-590111
rarity=T
[/card]
[card]
primitive=Goblin
id=-590118
rarity=T
[/card]
[card]
primitive=Goblin
id=-590119
rarity=T
[/card]
[card]
primitive=Treasure
id=-590123
rarity=T
[/card]
[card]
primitive=Goblin
id=-590125
rarity=T
[/card]
[card]
primitive=Goblin
id=-590127
rarity=T
[/card]
[card]
primitive=Treasure
id=-590131
rarity=T
[/card]
[card]
primitive=Ragavan
id=-590135
rarity=T
[/card]
[card]
primitive=Goblin
id=-590137
rarity=T
[/card]
[card]
primitive=Dragon
id=-590139
rarity=T
[/card]
[card]
primitive=Rat
id=-590143
rarity=T
[/card]
[card]
primitive=Treasure
id=-590154
rarity=T
[/card]
[card]
primitive=Elemental
id=-590171
rarity=T
[/card]
[card]
primitive=Construct
id=-590174
rarity=T
[/card]
[card]
primitive=Treasure
id=-590183
rarity=T
[/card]
[card]
primitive=Treasure
id=-590189
rarity=T
[/card]
[card]
primitive=Treasure
id=-590190
rarity=T
[/card]
[card]
primitive=Elemental
id=-590199
rarity=T
[/card]
[card]
primitive=Plant
id=-592707
rarity=T
[/card]
[card]
primitive=Eldrazi Scion
id=-592710
rarity=T
[/card]
[card]
primitive=Eldrazi Scion
id=-592715
rarity=T
[/card]
[card]
primitive=Insect
id=-592720
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592729
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592730
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592731
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592732
rarity=T
[/card]
[card]
primitive=Wolf
id=-592735
rarity=T
[/card]
[card]
primitive=Wolf
id=-592737
rarity=T
[/card]
[card]
primitive=Food
id=-592739
rarity=T
[/card]
[card]
primitive=Butterfly
id=-592744
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592755
rarity=T
[/card]
[card]
primitive=Insect
id=-592756
rarity=T
[/card]
[card]
primitive=Wolf
id=-592759
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592764
rarity=T
[/card]
[card]
primitive=Wolf
id=-592766
rarity=T
[/card]
[card]
primitive=Wolf
id=-592774
rarity=T
[/card]
[card]
primitive=Wolf
id=-592786
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592787
rarity=T
[/card]
[card]
primitive=Beast
id=-592793
rarity=T
[/card]
[card]
primitive=Eldrazi Scion
id=-592803
rarity=T
[/card]
[card]
primitive=Insect
id=-592812
rarity=T
[/card]
[card]
primitive=Boar
id=-592818
rarity=T
[/card]
[card]
primitive=Wolf
id=-592819
rarity=T
[/card]
[card]
primitive=Wolf
id=-592820
rarity=T
[/card]
[card]
primitive=Elf Warrior
id=-592821
rarity=T
[/card]
[card]
primitive=Elemental
id=-592825
rarity=T
[/card]
[card]
primitive=Zombie
id=-596176
rarity=T
[/card]
[card]
primitive=Treasure
id=-596185
rarity=T
[/card]
[card]
primitive=Treasure
id=-596186
rarity=T
[/card]
[card]
primitive=Thopter
id=-596189
rarity=T
[/card]
[card]
primitive=Monkey
id=-596204
rarity=T
[/card]
[card]
primitive=Clue
id=-596217
rarity=T
[/card]
[card]
primitive=Thopter
id=-596225
rarity=T
[/card]
[card]
primitive=Assembly-Worker
id=-596245
rarity=T
[/card]
[card]
primitive=Banana
id=-597895
rarity=T
[/card]
[card]
primitive=Agrus Kos, Eternal Soldier
id=589555
rarity=R