Added 4 missing duel sets and the already implemented cards. Some changes to logging of download. Some fixes to token download configuration.

This commit is contained in:
LevelX2 2014-12-11 12:46:06 +01:00
parent d52ab85018
commit 44c797f88e
280 changed files with 14206 additions and 92 deletions

View file

@ -73,16 +73,21 @@ public class ConstructedFormats {
"Planechase 2012",
"Planechase",
"Portal", "Portal Second Age", "Portal Three Kingdoms","Starter 1999","Starter 2000",
"Duel Decks: Elves vs. Goblins",
"Duel Decks: Jace vs. Chandra",
"Duel Decks: Divine vs. Demonic",
"Duel Decks: Garruk vs. Liliana",
"Duel Decks: Phyrexia vs. the Coalition",
"Duel Decks: Elspeth vs. Tezzeret",
"Duel Decks: Knights vs. Dragons",
"Duel Decks: Ajani vs. Nicol Bolas",
"Duel Decks: Venser vs. Koth",
"Duel Decks: Izzet vs. Golgari",
"Duel Decks: Sorin vs. Tibalt",
"Duel Decks: Heroes vs. Monsters",
"Duel Decks: Jace vs. Vraska",
"Duel Decks: Speed vs. Cunning",
"Guru",
"Unhinged",
};
@ -470,6 +475,9 @@ public class ConstructedFormats {
if (format.equals("Duel Decks: Garruk vs. Liliana")) {
return Arrays.asList("DDD");
}
if (format.equals("Duel Decks: Phyrexia vs. the Coalition")) {
return Arrays.asList("DDE");
}
if (format.equals("Duel Decks: Elspeth vs. Tezzeret")) {
return Arrays.asList("DDF");
}
@ -482,14 +490,21 @@ public class ConstructedFormats {
if (format.equals("Duel Decks: Venser vs. Koth")) {
return Arrays.asList("DDI");
}
if (format.equals("Duel Decks: Izzet vs. Golgari")) {
return Arrays.asList("DDJ");
}
if (format.equals("Duel Decks: Sorin vs. Tibalt")) {
return Arrays.asList("DDK");
}
if (format.equals("Duel Decks: Heroes vs. Monsters")) {
return Arrays.asList("DDL");
}
if (format.equals("Duel Decks: Jace vs. Vraska")) {
return Arrays.asList("DDM");
}
if (format.equals("Duel Decks: Speed vs. Cunning")) {
return Arrays.asList("DDN");
}
if (format.equals(STANDARD)) {
return standard;

View file

@ -34,7 +34,7 @@ public class GathererSets implements Iterable<DownloadJob> {
"POR", "PO2", "PTK"};
private static final String[] withMythics = {"M10", "M11", "M12", "M13", "M14", "M15",
"DDF", "DDL",
"DDF", "DDG", "DDH", "DDI", "DDJ", "DDK", "DDL", "DDM", "DDN",
"ALA", "CON", "ARB",
"ZEN", "WWK", "ROE",
"SOM", "MBS", "NPH",

View file

@ -13,8 +13,8 @@ import org.mage.plugins.card.utils.CardImageUtils;
public class MagicCardsImageSource implements CardImageSource {
private static CardImageSource instance = new MagicCardsImageSource();
private static final Map<String, String> setNameReplacement = new HashMap<String, String>() {
private static final Map<String, String> setNameTokenReplacement = new HashMap<String, String>() {
{
put("C14", "commander-2014-edition");
put("KTK", "khans-of-tarkir");
@ -66,12 +66,14 @@ public class MagicCardsImageSource implements CardImageSource {
put("DDD", "duel-decks-garruk-vs-liliana");
put("DDE", "duel-decks-phyrexia-vs-the-coalition");
put("DDF", "duel-decks-elspeth-vs-tezzeret");
put("DDG", "duel-decks-knight-vs-dragon");
put("DDG", "duel-decks-knights-vs-dragons");
put("DDH", "duel-decks-ajani-vs-nicol-bolas");
put("DDI", "duel-decks-venser-vs-koth");
put("DDJ", "duel-decks-izzet-vs-golgari");
put("DDK", "duel-decks-sorin-vs-tibalt");
put("DDL", "duel-decks-heroes-vs-monsters");
put("DDM", "duel-decks-jace-vs-vraska");
put("DDN", "duel-decks-speed-vs-cunning");
}
private static final long serialVersionUID = 1L;
@ -92,6 +94,7 @@ public class MagicCardsImageSource implements CardImageSource {
throw new Exception("Wrong parameters for image: collector id: " + collectorId + ",card set: " + cardSet);
}
String set = CardImageUtils.updateSet(cardSet, true);
String preferedLanguage = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PREF_LANGUAGE, "en");
StringBuilder url = new StringBuilder("http://magiccards.info/scans/").append(preferedLanguage).append("/");
@ -119,8 +122,8 @@ public class MagicCardsImageSource implements CardImageSource {
public String generateTokenUrl(CardDownloadData card) {
String name = card.getName().replaceAll(" ", "-").replace(",", "").toLowerCase();
String set = "not-supported-set";
if (setNameReplacement.containsKey(card.getSet())) {
set = setNameReplacement.get(card.getSet());
if (setNameTokenReplacement.containsKey(card.getSet())) {
set = setNameTokenReplacement.get(card.getSet());
} else {
set += "-" + card.getSet();
}

View file

@ -1,11 +1,61 @@
package org.mage.plugins.card.images;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import mage.cards.repository.CardInfo;
import mage.client.constants.Constants;
import mage.client.dialog.PreferencesDialog;
import mage.client.util.sets.ConstructedFormats;
import mage.remote.Connection;
import static mage.remote.Connection.ProxyType.HTTP;
import static mage.remote.Connection.ProxyType.SOCKS;
import net.java.truevfs.access.TFile;
import net.java.truevfs.access.TFileOutputStream;
import net.java.truevfs.access.TVFS;
import net.java.truevfs.kernel.spec.FsSyncException;
import org.apache.log4j.Logger;
import org.mage.plugins.card.constants.Constants;
import org.mage.plugins.card.dl.sources.CardImageSource;
import org.mage.plugins.card.dl.sources.MagicCardsImageSource;
import org.mage.plugins.card.dl.sources.MtgImageSource;
@ -13,44 +63,20 @@ import org.mage.plugins.card.dl.sources.WizardCardsImageSource;
import org.mage.plugins.card.properties.SettingsManager;
import org.mage.plugins.card.utils.CardImageUtils;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.*;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.java.truevfs.access.TFile;
import net.java.truevfs.access.TFileOutputStream;
import net.java.truevfs.access.TVFS;
import net.java.truevfs.kernel.spec.FsSyncException;
public class DownloadPictures extends DefaultBoundedRangeModel implements Runnable {
private static final Logger logger = Logger.getLogger(DownloadPictures.class);
private JProgressBar bar;
private JOptionPane dlg;
private final JOptionPane dlg;
private boolean cancel;
private JButton closeButton;
private final JButton closeButton;
private JButton startDownloadButton;
private int cardIndex;
private ArrayList<CardDownloadData> cards;
private ArrayList<CardDownloadData> type2cards;
private JComboBox jComboBox1;
private JLabel jLabel1;
private final JComboBox jComboBox1;
private final JLabel jLabel1;
private static boolean offlineMode = false;
private JCheckBox checkBox;
private final Object sync = new Object();
@ -59,7 +85,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
private Proxy p = Proxy.NO_PROXY;
private ExecutorService executor = Executors.newFixedThreadPool(10);
private final ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
startDownload(null, null);
@ -230,8 +256,10 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
/**
* get filter for Standard Type 2 cards
*/
Set<String> type2SetsFilter = new HashSet<String>();
Set<String> type2SetsFilter = new HashSet<>();
type2SetsFilter.addAll(ConstructedFormats.getSetsByFormat(ConstructedFormats.STANDARD));
int numberCardImages = allCards.size();
try {
offlineMode = true;
@ -272,19 +300,19 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
} else {
if (card.getCardNumber() < 1) {
System.err.println("There was a critical error!");
log.error("Card has no collector ID and won't be sent to client: " + card);
logger.error("Card has no collector ID and won't be sent to client: " + card);
} else if (card.getSetCode().isEmpty()) {
System.err.println("There was a critical error!");
log.error("Card has no set name and won't be sent to client:" + card);
logger.error("Card has no set name and won't be sent to client:" + card);
}
}
}
allCardsUrls.addAll(getTokenCardUrls());
} catch (Exception e) {
log.error(e);
}
} catch (Exception e) {
logger.error(e);
}
int numberTokenImages = allCardsUrls.size() - numberCardImages;
TFile file;
/**
@ -297,14 +325,17 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
}
for (CardDownloadData card : cardsToDownload) {
if (card.isToken()) {
log.info("Card to download: " + card.getName() + " (Token) ");
} else {
try {
log.info("Card to download: " + card.getName() + " (" + card.getSet() + ")");
} catch (Exception e) {
log.error(e);
logger.info("Check download images (total cards: " + numberCardImages + ", total tokens: " + numberTokenImages + ") => Missing images: " + cardsToDownload.size());
if (logger.isDebugEnabled()) {
for (CardDownloadData card : cardsToDownload) {
if (card.isToken()) {
logger.debug("Card to download: " + card.getName() + " (Token) ");
} else {
try {
logger.debug("Card to download: " + card.getName() + " (" + card.getSet() + ")");
} catch (Exception e) {
logger.error(e);
}
}
}
}
@ -313,11 +344,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
private static ArrayList<CardDownloadData> getTokenCardUrls() throws RuntimeException {
ArrayList<CardDownloadData> list = new ArrayList<CardDownloadData>();
ArrayList<CardDownloadData> list = new ArrayList<>();
InputStream in = DownloadPictures.class.getClassLoader().getResourceAsStream("card-pictures-tok.txt");
if (in == null) {
log.error("resources input stream is null");
logger.error("resources input stream is null");
return list;
}
@ -352,28 +383,28 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
list.add(card);
}
} else {
log.error("wrong format for image urls: " + line);
logger.error("wrong format for image urls: " + line);
}
}
line = reader.readLine();
}
} catch (Exception ex) {
log.error(ex);
logger.error(ex);
throw new RuntimeException("DownloadPictures : readFile() error");
} finally {
if (input != null) {
try {
input.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("Input close failed:", e);
}
}
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("Reader close failed:", e);
}
}
@ -422,7 +453,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
CardDownloadData card = cardsToDownload.get(i);
log.info("Downloading card: " + card.getName() + " (" + card.getSet() + ")");
logger.debug("Downloading card: " + card.getName() + " (" + card.getSet() + ")");
String url;
if (ignoreUrls.contains(card.getSet()) || card.isToken()) {
@ -435,7 +466,6 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
if (url != null) {
Logger.getLogger(this.getClass()).info(url);
Runnable task = new DownloadTask(card, new URL(url), cardsToDownload.size());
executor.execute(task);
} else {
@ -445,7 +475,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
} catch (Exception ex) {
log.error(ex, ex);
logger.error(ex, ex);
}
}
executor.shutdown();
@ -458,7 +488,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
try {
TVFS.umount();
} catch (FsSyncException e) {
e.printStackTrace();
logger.fatal("Couldn't unmount zip files", e);
JOptionPane.showMessageDialog(null, "Couldn't unmount zip files", "Error", JOptionPane.ERROR_MESSAGE);
}
finally {
@ -514,7 +544,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
// Logger.getLogger(this.getClass()).info(url.toString());
URLConnection httpConn = url.openConnection(p);
httpConn.connect();
if (((HttpURLConnection) httpConn).getResponseCode() == 200) {
int responseCode = ((HttpURLConnection) httpConn).getResponseCode();
if (responseCode == 200) {
try (BufferedInputStream in = new BufferedInputStream(((HttpURLConnection) httpConn).getInputStream())) {
//try (BufferedInputStream in = new BufferedInputStream(url.openConnection(p).getInputStream())) {
out = new BufferedOutputStream(new TFileOutputStream(temporaryFile));
@ -558,11 +589,14 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
temporaryFile.delete();
}
} else {
Logger.getLogger(this.getClass()).error(convertStreamToString(((HttpURLConnection) httpConn).getErrorStream()));
logger.warn("Image download failed - responseCode: " + responseCode + " url: " + url.toString());
if (logger.isDebugEnabled()) { // Shows the returned html from the request to the web server
logger.debug("Return ed HTML ERROR:\n" + convertStreamToString(((HttpURLConnection) httpConn).getErrorStream()));
}
}
} catch (Exception e) {
log.error(e, e);
logger.error(e, e);
}
synchronized (sync) {
@ -621,7 +655,5 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
}
}
private static final Logger log = Logger.getLogger(DownloadPictures.class);
private static final long serialVersionUID = 1L;
}

View file

@ -1,17 +1,18 @@
|Generate|TOK:DDN|Goblin|
|Generate|TOK:KTK|Bear|
|Generate|TOK:KTK|Bird|
|Generate|TOK:KTK|Goblin|
|Generate|TOK:KTK|Morph|
|Generate|TOK:KTK|Snake|
|Generate|TOK:KTK|Spirit Warrior|
|Generate|TOK:KTK|Spirit|
|Generate|TOK:KTK|Vampire|
|Generate|TOK:KTK|Warrior 1|
|Generate|TOK:KTK|Warrior 2|
|Generate|TOK:KTK|Zombie|
|Generate|EMBLEM!:KTK|Emblem Sarkhan, the Dragonspeaker|
|Generate|EMBLEM!:KTK|Emblem Sorin, Solemn Visitor|
#|Generate|TOK:KTK|Bear|
#|Generate|TOK:KTK|Bird|
#|Generate|TOK:KTK|Goblin|
#|Generate|TOK:KTK|Morph|
#|Generate|TOK:KTK|Snake|
#|Generate|TOK:KTK|Spirit Warrior|
#|Generate|TOK:KTK|Spirit|
#|Generate|TOK:KTK|Vampire|
#|Generate|TOK:KTK|Warrior 1|
#|Generate|TOK:KTK|Warrior 2|
#|Generate|TOK:KTK|Zombie|
#|Generate|EMBLEM!:KTK|Emblem Sarkhan, the Dragonspeaker|
#|Generate|EMBLEM!:KTK|Emblem Sorin, Solemn Visitor|
|Generate|TOK:M15|Sliver|
|Generate|TOK:M15|Soldier|
@ -45,6 +46,8 @@
|Generate|TOK:JOU|Spider|
|Generate|TOK:JOU|Snake|
|Generate|TOK:DDM|Assassin|
|Generate|TOK:BNG|Bird 1|
|Generate|TOK:BNG|Cat Soldier|
|Generate|TOK:BNG|Soldier|
@ -105,6 +108,8 @@
|Generate|TOK:DGM|Elemental|
|Generate|TOK:DDK|Spirit|
|Generate|TOK:GTC|Angel|
|Generate|TOK:GTC|Rat|
|Generate|TOK:GTC|Frog Lizard|
@ -129,6 +134,8 @@
|Generate|EMBLEM-:M13|Liliana of the Dark Realms|
|Generate|TOK:DDJ|Saproling|
|Generate|TOK:M13|Cat|
|Generate|TOK:M13|Goat|
|Generate|TOK:M13|Soldier|
@ -186,6 +193,8 @@
|Generate|TOK:NPH|Golem|
|Generate|TOK:NPH|Myr|
|Generate|TOK:DDG|Goblin|
|Generate|TOK:MBS|Germ|
|Generate|TOK:MBS|Zombie|
|Generate|TOK:MBS|Golem|
@ -220,9 +229,9 @@
|Generate|TOK:ROE|Ooze|
|Generate|TOK:ROE|Tuktuk the Returned|
|Generate|TOK:PVC|Saproling|
|Generate|TOK:PVC|Hornet|
|Generate|TOK:PVC|Minion|
|Generate|TOK:DDE|Saproling|
|Generate|TOK:DDE|Hornet|
|Generate|TOK:DDE|Minion|
|Generate|TOK:WWK|Soldier Ally|
|Generate|TOK:WWK|Dragon|
@ -261,10 +270,14 @@
|Generate|TOK:ARB|Dragon|
|Generate|TOK:ARB|Zombie Wizard|
|Generate|TOK:DDC|Spirit|
|Generate|TOK:DDC|Demon|
|Generate|TOK:DDC|Thrull|
|Generate|TOK:CON|Angel|
|Generate|TOK:CON|Elemental|
|Generate|TOK:JVC|Elemental Shaman|
|Generate|TOK:DD2|Elemental Shaman|
|Generate|TOK:ALA|Soldier|
|Generate|TOK:ALA|Beast|

View file

@ -63,7 +63,8 @@ ddc=dvd
dd2=jvc
ddd=gvl
unh=uh
dde=pvc
# Remove setname as soon as the images can be downloaded
ignore.urls=TOK,EMBLEM
ignore.urls=TOK
# sets ordered by release time (newest goes first)
token.lookup.order=KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,PVC,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK
token.lookup.order=KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK