mirror of
https://github.com/correl/mage.git
synced 2024-12-25 11:11:16 +00:00
Implement double faced cards URL from Scryfall
This commit is contained in:
parent
924b0725d2
commit
879a3d6c71
1 changed files with 36 additions and 22 deletions
|
@ -1,8 +1,17 @@
|
||||||
package org.mage.plugins.card.dl.sources;
|
package org.mage.plugins.card.dl.sources;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
import mage.client.util.CardLanguage;
|
import mage.client.util.CardLanguage;
|
||||||
import org.mage.plugins.card.images.CardDownloadData;
|
import org.mage.plugins.card.images.CardDownloadData;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -62,29 +71,16 @@ public enum ScryfallImageSource implements CardImageSource {
|
||||||
alternativeUrl = null;
|
alternativeUrl = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// special card number like "103a" and "U123" already compatible
|
// double faced cards
|
||||||
if (baseUrl == null && card.isCollectorIdWithStr()) {
|
// Scryfall doesn't support string collector ID's anymore (like "U123" or "176a")
|
||||||
// WARNING, after 2018 it's not compatible and some new sets have GUID files instead card numbers
|
// as such, we need to get the image URL's manually from their API
|
||||||
// TODO: replace card number links to API calls (need test with lands, alternative images and double faces), replace not working images by direct links
|
|
||||||
|
|
||||||
if (card.getCollectorId().startsWith("U") || card.getCollectorIdAsInt() == -1) {
|
|
||||||
// fix for Ultimate Box Topper (PUMA) and Mythic Edition (MED) -- need to use API
|
|
||||||
// ignored and go to API call at the end
|
|
||||||
} else {
|
|
||||||
baseUrl = "https://img.scryfall.com/cards/large/" + localizedCode + "/" + formatSetName(card.getSet(), isToken) + "/"
|
|
||||||
+ card.getCollectorId() + ".jpg";
|
|
||||||
alternativeUrl = "https://img.scryfall.com/cards/large/" + defaultCode + "/" + formatSetName(card.getSet(), isToken) + "/"
|
|
||||||
+ card.getCollectorId() + ".jpg";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// double faced cards do not supports by API (need direct link for img)
|
|
||||||
// example: https://img.scryfall.com/cards/large/en/xln/173b.jpg
|
|
||||||
if (baseUrl == null && card.isTwoFacedCard()) {
|
if (baseUrl == null && card.isTwoFacedCard()) {
|
||||||
baseUrl = "https://img.scryfall.com/cards/large/" + localizedCode + "/" + formatSetName(card.getSet(), isToken) + "/"
|
try {
|
||||||
+ card.getCollectorId() + (card.isSecondSide() ? "b" : "a") + ".jpg";
|
baseUrl = getFaceImageUrl(card, isToken, localizedCode);
|
||||||
alternativeUrl = "https://img.scryfall.com/cards/large/" + defaultCode + "/" + formatSetName(card.getSet(), isToken) + "/"
|
alternativeUrl = getFaceImageUrl(card, isToken, defaultCode);
|
||||||
+ card.getCollectorId() + (card.isSecondSide() ? "b" : "a") + ".jpg";
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// basic cards by api call (redirect to img link)
|
// basic cards by api call (redirect to img link)
|
||||||
|
@ -99,6 +95,24 @@ public enum ScryfallImageSource implements CardImageSource {
|
||||||
return new CardImageUrls(baseUrl, alternativeUrl);
|
return new CardImageUrls(baseUrl, alternativeUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getFaceImageUrl(CardDownloadData card, boolean isToken, String localizationCode) throws IOException {
|
||||||
|
// connect to Scryfall API
|
||||||
|
URL cardUrl = new URL("https://api.scryfall.com/cards/" + formatSetName(card.getSet(), isToken) + "/"
|
||||||
|
+ card.getCollectorIdAsInt() + "/" + localizationCode);
|
||||||
|
URLConnection request = cardUrl.openConnection();
|
||||||
|
request.connect();
|
||||||
|
|
||||||
|
// parse the response and return the image URI from the correct card face
|
||||||
|
JsonParser jp = new JsonParser();
|
||||||
|
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
|
||||||
|
JsonObject jsonCard = root.getAsJsonObject();
|
||||||
|
JsonArray jsonCardFaces = jsonCard.getAsJsonArray("card_faces");
|
||||||
|
JsonObject jsonCardFace = jsonCardFaces.get(card.isSecondSide() ? 1 : 0).getAsJsonObject();
|
||||||
|
JsonObject jsonImageUris = jsonCardFace.getAsJsonObject("image_uris");
|
||||||
|
|
||||||
|
return jsonImageUris.get("png").getAsString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception {
|
public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception {
|
||||||
return innerGenerateURL(card, false);
|
return innerGenerateURL(card, false);
|
||||||
|
|
Loading…
Reference in a new issue