package org.rr.jeborker.metadata.download; import static org.rr.commons.utils.StringUtil.EMPTY; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.mufs.ResourceHandlerFactory; public class DNBMetadataDownloadEntry implements MetadataDownloadEntry { private static final String IMAGE_SIZE_S = "S"; private static final String IMAGE_SIZE_L = "L"; private Elements tags; private Document htmlDoc; private byte[] smallSizeImage = null; private byte[] largeSizeImage = null; private String isbn = null; private List<String> authors = null; DNBMetadataDownloadEntry(Document htmlDoc, Elements tags) { this.tags = tags; this.htmlDoc = htmlDoc; } private Element getTag(String headline) { for (Element tag : tags) { if (tag.text().equals(headline)) { return tag.nextElementSibling(); } } return null; } private String getValue(String headline) { Element tag = getTag(headline); if (tag != null) { return tag.text(); } return null; } @Override public String getTitle() { return getValue("Titel/Bezeichnung"); } @Override public byte[] getThumbnailImageBytes() { return getCoverImage(IMAGE_SIZE_S); } @Override public String getLanguage() { return getValue("Sprache(n)"); } public String getIsbn() { if (isbn == null) { String htmlString = htmlDoc.html(); String search = "loadCover(\"fullRecordTable\", \""; int start = htmlString.indexOf(search); if (start != -1) { start += search.length(); int end = htmlString.indexOf("\"", start); if (end != -1) { isbn = htmlString.substring(start, end); } } } return isbn; } @Override public String getIsbn13() { if (getIsbn().replaceAll("-", EMPTY).length() == 13) { return getIsbn(); } return null; } @Override public String getIsbn10() { if (getIsbn().replaceAll("-", EMPTY).length() == 10) { return getIsbn(); } return null; } @Override public String getDescription() { return null; } @Override public byte[] getCoverImage() { return getCoverImage(IMAGE_SIZE_L); } public byte[] getCoverImage(String size) { String isbn = getIsbn13(); if (isbn != null) { String imageUrl = "http://vlb.de/GetBlob.aspx?strIsbn=" + isbn + "&size=" + size; try { if (size.equals(IMAGE_SIZE_L)) { if(largeSizeImage == null) { LoggerFactory.getLogger(this).log(Level.INFO, "Downloading large image from " + imageUrl); IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(new URL(imageUrl)); largeSizeImage = resourceHandler.getContent(); } return largeSizeImage; } else if (size.equals(IMAGE_SIZE_S)) { if(smallSizeImage == null) { LoggerFactory.getLogger(this).log(Level.INFO, "Downloading thumbnail image from " + imageUrl); IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(new URL(imageUrl)); smallSizeImage = resourceHandler.getContent(); } return smallSizeImage; } } catch (MalformedURLException e) { LoggerFactory.getLogger(this).log(Level.WARNING, "Failed to create URL " + imageUrl, e); } catch (IOException e) { LoggerFactory.getLogger(this).log(Level.WARNING, "Failed to load URL " + imageUrl, e); } } return null; } @Override public List<String> getAuthors() { if (authors == null) { List<String> evaluatedAuthors = new ArrayList<>(); Element e = getTag("Person(en)"); if (e != null) { Elements authorLinks = e.getElementsByTag("a"); if (authorLinks != null) { for (Element authorLink : authorLinks) { evaluatedAuthors.add(authorLink.text()); } } } authors = evaluatedAuthors; } return authors; } @Override public String getAgeSuggestion() { return null; } }