Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ public void initialize() {
lstControls.add(Pair.of(view.getCbEnableNonLegalCards(), FPref.UI_LOAD_NONLEGAL_CARDS));
lstControls.add(Pair.of(view.getCbAllowCustomCardsDeckConformance(), FPref.ALLOW_CUSTOM_CARDS_IN_DECKS_CONFORMANCE));
lstControls.add(Pair.of(view.getCbImageFetcher(), FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER));
lstControls.add(Pair.of(view.getCbUseAlternateArtApi(), FPref.UI_USE_ALTERNATE_CARD_ART_API));
lstControls.add(Pair.of(view.getCbDisableCardImages(), FPref.UI_DISABLE_CARD_IMAGES));
lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT));
lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final JCheckBox cbSROptimize = new OptionsCheckBox(localizer.getMessage("cbSROptimize"));
private final JCheckBox cbFilteredHands = new OptionsCheckBox(localizer.getMessage("cbFilteredHands"));
private final JCheckBox cbImageFetcher = new OptionsCheckBox(localizer.getMessage("cbImageFetcher"));
private final JCheckBox cbUseAlternateArtApi = new OptionsCheckBox(localizer.getMessage("cbUseAlternateArtApi"));
private final JCheckBox cbDisableCardImages = new OptionsCheckBox(localizer.getMessage("lblDisableCardImages"));
private final JCheckBox cbCloneImgSource = new OptionsCheckBox(localizer.getMessage("cbCloneImgSource"));
private final JCheckBox cbScaleLarger = new OptionsCheckBox(localizer.getMessage("cbScaleLarger"));
Expand Down Expand Up @@ -396,6 +397,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
pnlPrefs.add(cbImageFetcher, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlImageFetcher")), descriptionConstraints);

pnlPrefs.add(cbUseAlternateArtApi, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlUseAlternateArtApi")), descriptionConstraints);

pnlPrefs.add(cbDisableCardImages, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisableCardImages")), descriptionConstraints);

Expand Down Expand Up @@ -782,6 +786,11 @@ public JCheckBox getCbImageFetcher() {
return cbImageFetcher;
}

/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbUseAlternateArtApi() {
return cbUseAlternateArtApi;
}

/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbDisableCardImages() {
return cbDisableCardImages;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ private boolean doFetch(String urlToDownload) throws IOException {
return false;
}

String newdespath = urlToDownload.contains(".fullborder.jpg") || urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) ?
String newdespath = urlToDownload.contains(".fullborder.jpg") || urlToDownload.startsWith(getCardArtApiBaseUrl()) ?
TextUtil.fastReplace(destPath, ".full.jpg", ".fullborder.jpg") : destPath;
if (!newdespath.contains(".full") && !newdespath.contains(".artcrop") && urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) && !destPath.startsWith(ForgeConstants.CACHE_TOKEN_PICS_DIR))
if (!newdespath.contains(".full") && !newdespath.contains(".artcrop") && urlToDownload.startsWith(getCardArtApiBaseUrl()) && !destPath.startsWith(ForgeConstants.CACHE_TOKEN_PICS_DIR))
newdespath = newdespath.replace(".jpg", ".fullborder.jpg"); //fix planes/phenomenon for round border options
URL url = new URL(urlToDownload);
System.out.println("Attempting to fetch: " + url);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ public void changed(ChangeEvent event, Actor actor) {
addCheckBox(Forge.getLocalizer().getMessage("lblCardID"), ForgePreferences.FPref.UI_OVERLAY_CARD_ID);
addCheckBox(Forge.getLocalizer().getMessage("lblAbilityIcon"), ForgePreferences.FPref.UI_OVERLAY_ABILITY_ICONS);
addCheckBox(Forge.getLocalizer().getMessage("cbImageFetcher"), ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER);
addCheckBox(Forge.getLocalizer().getMessage("cbUseAlternateArtApi"), ForgePreferences.FPref.UI_USE_ALTERNATE_CARD_ART_API);

if (!GuiBase.isAndroid()) {
addCheckBox(Forge.getLocalizer().getMessage("lblBattlefieldTextureFiltering"), ForgePreferences.FPref.UI_LIBGDX_TEXTURE_FILTERING);
Expand Down
3 changes: 3 additions & 0 deletions forge-gui-mobile/src/forge/screens/settings/SettingsPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,9 @@ public void select() {
lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER,
Forge.getLocalizer().getMessage("cbImageFetcher"),
Forge.getLocalizer().getMessage("nlImageFetcher")), 4);
lstSettings.addItem(new BooleanSetting(FPref.UI_USE_ALTERNATE_CARD_ART_API,
Forge.getLocalizer().getMessage("cbUseAlternateArtApi"),
Forge.getLocalizer().getMessage("nlUseAlternateArtApi")), 4);
lstSettings.addItem(new CustomSelectSetting(FPref.UI_PREFERRED_ART,
Forge.getLocalizer().getMessage("lblPreferredArt"),
Forge.getLocalizer().getMessage("nlPreferredArt"),
Expand Down
6 changes: 3 additions & 3 deletions forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private boolean doFetch(String urlToDownload) throws IOException {
return false;
}

if (scryfallCooldownTime != null && urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD)) {
if (scryfallCooldownTime != null && urlToDownload.startsWith(getCardArtApiBaseUrl())) {
// Don't try to download card images from scryfall if we've been rate limited
if (scryfallCooldownTime.after(new Date())) {
System.err.println("Currently in cooldown period for scryfall downloads. Skipping download attempt for: " + urlToDownload);
Expand All @@ -67,9 +67,9 @@ private boolean doFetch(String urlToDownload) throws IOException {
}
}

String newdespath = urlToDownload.contains(".fullborder.") || urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) ?
String newdespath = urlToDownload.contains(".fullborder.") || urlToDownload.startsWith(getCardArtApiBaseUrl()) ?
TextUtil.fastReplace(destPath, ".full.", ".fullborder.") : destPath;
if (!newdespath.contains(".full") && urlToDownload.startsWith(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD) &&
if (!newdespath.contains(".full") && urlToDownload.startsWith(getCardArtApiBaseUrl()) &&
!destPath.startsWith(ForgeConstants.CACHE_TOKEN_PICS_DIR) && !destPath.startsWith(ForgeConstants.CACHE_PLANECHASE_PICS_DIR))
newdespath = newdespath.replace(".jpg", ".fullborder.jpg"); //fix planes/phenomenon for round border options
URL url = new URL(urlToDownload);
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/en-US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ cbPerformanceMode=Performance Mode
cbOrderHand=Keep Hand ordered
cbFilteredHands=Filtered Hands
cbImageFetcher=Automatically Download Missing Card Art
cbUseAlternateArtApi=Use Alternate Card Art API
cbCloneImgSource=Clones Use Original Card Art
cbScaleLarger=Scale Image Larger
cbRenderBlackCardBorders=Render Black Card Borders
Expand Down Expand Up @@ -241,6 +242,7 @@ nlCardArtFormat=The format of card art images. (Full: image of entire card. Crop
nlDefaultFontSize=The default font size within the UI. All font elements are scaled relative to this. (REQUIRES RESTART)
cbpMulliganRule=Mulligan Rule
nlImageFetcher=Enables live fetching of missing card images from an online resource.
nlUseAlternateArtApi=Download card images from the alternate API (card-forge.net) instead of Scryfall.
nlDisplayFoil=Displays foil cards with the visual foil overlay effect.
nlRandomFoil=Adds foil effect to random cards.
nlScaleLarger=Allows card pictures to be expanded larger than their original size.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import forge.item.PaperCard;
import forge.localinstance.properties.ForgeConstants;
import forge.model.FModel;
import forge.util.ImageFetcher;
import forge.util.ImageUtil;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -97,7 +98,7 @@ private static String buildUrl(PaperCard c, String face) {
String langCode = edition.getCardsLangCode();
String path = ImageUtil.getScryfallDownloadUrl(c, face, scryfallCode, langCode, false);
if (path != null) {
return ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + path;
return ImageFetcher.buildCardArtApiUrl(path);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import forge.item.PaperCard;
import forge.localinstance.properties.ForgeConstants;
import forge.model.FModel;
import forge.util.ImageFetcher;
import forge.util.ImageUtil;

import java.io.File;
Expand Down Expand Up @@ -93,7 +94,7 @@ private void addDLObject(final PaperCard c, final String face) {

cardname = cardname.replace(" ", "+");
cardname = cardname.replace("'", "");
String scryfallurl = ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + "named?fuzzy=" + cardname;
String scryfallurl = ImageFetcher.getCardArtApiBaseUrl() + "named?fuzzy=" + cardname;
if(!setCode.equals(CardEdition.UNKNOWN_CODE)) scryfallurl += "&set=" + setCode.toLowerCase();
if(face.equals("back")) scryfallurl += "&face=back";
scryfallurl += "&format=image";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,9 @@ public final class ForgeConstants {
public static final String URL_PRICE_DOWNLOAD = GITHUB_ASSETS_BASE + "all-prices.txt";
private static final String URL_SCRYFALL = "https://api.scryfall.com";
public static final String URL_PIC_SCRYFALL_DOWNLOAD = URL_SCRYFALL + "/cards/";
// Alternate card image API (mirrors Scryfall data, always serves images)
private static final String URL_CARDFORGE_NET_API = "https://card-forge.net/api/v1";
public static final String URL_PIC_CARDFORGE_NET_API_DOWNLOAD = URL_CARDFORGE_NET_API + "/cards/";

// Constants for Display Card Identity game setting
public static final String DISP_CURRENT_COLORS_ALWAYS = "Always";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public enum FPref implements AbstractPreferences.IPref {
UI_OVERLAY_ABILITY_ICONS("true"),
UI_OVERLAY_DRAFT_RANKING("true"),
UI_ENABLE_ONLINE_IMAGE_FETCHER ("true"),
UI_USE_ALTERNATE_CARD_ART_API ("false"),
UI_PREFERRED_ART("LATEST_ART_ALL_EDITIONS"),
UI_SMART_CARD_ART("false"),
UI_AUTO_AIDECK_SELECTION("true"),
Expand Down
22 changes: 17 additions & 5 deletions forge-gui/src/main/java/forge/util/ImageFetcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ public abstract class ImageFetcher {

private HashMap<String, HashSet<Callback>> currentFetches = new HashMap<>();

/** @return the base "/cards/" URL of the currently selected card image API. */
public static String getCardArtApiBaseUrl() {
return FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_USE_ALTERNATE_CARD_ART_API)
? ForgeConstants.URL_PIC_CARDFORGE_NET_API_DOWNLOAD
: ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD;
}

/** Builds a full download URL from a path produced by {@link ImageUtil#getScryfallDownloadUrl}. */
public static String buildCardArtApiUrl(String path) {
return getCardArtApiBaseUrl() + path;
}

private String getScryfallDownloadURL(PaperCard c, String face, boolean useArtCrop, boolean hasSetLookup, String imagePath, ArrayList<String> downloadUrls) {
StaticData data = StaticData.instance();
CardEdition edition = data.getEditions().get(c.getEdition());
Expand All @@ -64,7 +76,7 @@ private String getScryfallDownloadURL(PaperCard c, String face, boolean useArtCr
} else {
addScryfallUrl(c, face, useArtCrop, downloadUrls);
String setCode = edition.getScryfallCode();
downloadUrls.add(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(c, face, setCode, "", useArtCrop));
downloadUrls.add(buildCardArtApiUrl(ImageUtil.getScryfallDownloadUrl(c, face, setCode, "", useArtCrop)));
}
return null;
}
Expand All @@ -77,7 +89,7 @@ private void addScryfallUrl(PaperCard card, String face, boolean useArtCrop, Arr

String setCode = edition.getScryfallCode();
String langCode = edition.getCardsLangCode();
String primaryUrl = ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(card, face, setCode, langCode, useArtCrop);
String primaryUrl = buildCardArtApiUrl(ImageUtil.getScryfallDownloadUrl(card, face, setCode, langCode, useArtCrop));
if (!downloadUrls.contains(primaryUrl)) {
downloadUrls.add(primaryUrl);
}
Expand Down Expand Up @@ -151,7 +163,7 @@ public void fetchImage(final String imageKey, final Callback callback) {
if (ed != null) {
String setCode = ed.getScryfallCode();
String langCode = ed.getCardsLangCode();
downloadUrls.add("PLANECHASEBG:" + ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallDownloadUrl(pc, "", setCode, langCode, true));
downloadUrls.add("PLANECHASEBG:" + buildCardArtApiUrl(ImageUtil.getScryfallDownloadUrl(pc, "", setCode, langCode, true)));
FileUtil.ensureDirectoryExists(ForgeConstants.CACHE_PLANECHASE_PICS_DIR);
File destFile = new File(ForgeConstants.CACHE_PLANECHASE_PICS_DIR, getPlanechaseFilename(cardName));
if (destFile.exists())
Expand Down Expand Up @@ -327,7 +339,7 @@ public void fetchImage(final String imageKey, final Callback callback) {
String tokenCode = edition.getTokensCode();
String langCode = edition.getCardsLangCode();
// Just assume the CNr from the token image is valid
downloadUrls.add(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallTokenDownloadUrl(tempdata[2], tokenCode, langCode, face));
downloadUrls.add(buildCardArtApiUrl(ImageUtil.getScryfallTokenDownloadUrl(tempdata[2], tokenCode, langCode, face)));
} else if (!allTokens.isEmpty()) {
// This loop is going to try to download all the arts until it finds one
// This is a bit wrong since it _should_ just be trying to get the one with the appropriate collector number
Expand All @@ -345,7 +357,7 @@ public void fetchImage(final String imageKey, final Callback callback) {
continue;
}

downloadUrls.add(ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + ImageUtil.getScryfallTokenDownloadUrl(tis.collectorNumber(), tokenCode, langCode, face));
downloadUrls.add(buildCardArtApiUrl(ImageUtil.getScryfallTokenDownloadUrl(tis.collectorNumber(), tokenCode, langCode, face)));
}
}

Expand Down
Loading