package org.rr.jeborker.metadata.download;
import static org.rr.commons.utils.BooleanUtils.not;
import static org.rr.commons.utils.StringUtil.EMPTY;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.utils.StringUtil;
public class ComicsOrgDownloadEntry implements MetadataDownloadEntry {
private final Document htmlDoc;
private final String mainUrl;
private byte[] thumbnailImage = null;
private byte[] coverImage = null;
public ComicsOrgDownloadEntry(Document htmlDoc, String mainUrl) {
this.htmlDoc = htmlDoc;
this.mainUrl = mainUrl;
}
@Override
public String getTitle() {
Elements headlines = htmlDoc.getElementsByClass("item_id");
if(headlines != null && not(headlines.isEmpty())) {
return headlines.get(0).text();
}
return null;
}
@Override
public List<String> getAuthors() {
Map<String, String> values = getValues();
List<String> result = new ArrayList<String>(values.size());
if(values.containsKey("Pencils")) {
result.add(values.get("Pencils"));
}
if(values.containsKey("Inks")) {
result.add(values.get("Inks"));
}
if(values.containsKey("Colors")) {
result.add(values.get("Colors"));
}
return result;
}
public Map<String, String> getValues() {
Map<String, String> result = new HashMap<>();
Elements credits = htmlDoc.getElementsByClass("single_story");
for (Element credit : credits) {
Elements spans = credit.getElementsByTag("span");
String creditLabel = null;
for (Element span : spans) {
if(span.className().equals("credit_label")) {
creditLabel = span.text().replace(":", "").trim();
} else if(span.className().equals("credit_value")) {
String value = span.text().trim();
if(not(StringUtil.equals(value, "?"))) {
result.put(creditLabel, span.text().trim());
}
}
}
}
return result;
}
@Override
public String getIsbn10() {
Element isbn = htmlDoc.getElementById("issue_isbn");
if(isbn != null && MetadataDownloadUtils.isIsbn10(isbn.text())) {
return isbn.text();
}
return null;
}
@Override
public String getIsbn13() {
Element isbn = htmlDoc.getElementById("issue_isbn");
if(isbn != null && MetadataDownloadUtils.isIsbn13(isbn.text())) {
return isbn.text();
}
return null;
}
@Override
public String getLanguage() {
return null;
}
@Override
public String getDescription() {
return null;
}
@Override
public String getAgeSuggestion() {
return null;
}
@Override
public byte[] getThumbnailImageBytes() {
if(thumbnailImage == null) {
thumbnailImage = getCoverImage(htmlDoc);
}
return thumbnailImage;
}
@Override
public byte[] getCoverImage() {
if(coverImage == null) {
try {
Elements coverLinks = htmlDoc.getElementsByClass("issue_cover_links");
for (Element coverLink : coverLinks) {
String html = coverLink.html();
String imagePage = StringUtil.between(html, "\"/issue/", "\"");
if(imagePage != null) {
imagePage = StringUtil.replace(imagePage, "\"", EMPTY);
byte[] loadPage = MetadataDownloadUtils.loadPage(new URL(mainUrl + imagePage));
Document document = MetadataDownloadUtils.getDocument(loadPage, mainUrl);
coverImage = getCoverImage(document);
}
}
} catch(Exception e) {
LoggerFactory.getLogger().log(Level.WARNING, "Failed to load cover", e);
}
}
return coverImage;
}
public byte[] getCoverImage(Document document) {
byte[] imageData = null;
Elements images = document.getElementsByClass("cover_img");
for (Element image : images) {
if (image.tagName().equals("img")) {
String imageUrl = image.attr("src");
imageData = MetadataDownloadUtils.loadImage(imageUrl);
}
}
return imageData;
}
}