package de.geeksfactory.opacclient.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ISBNTools {
public static String isbn13to10(String isbn13) {
isbn13 = cleanupISBN(isbn13);
if (isbn13.length() != 13) return isbn13;
String isbn10 = isbn13.substring(3, 12);
int checksum = 0;
int weight = 10;
for (int i = 0; i < isbn10.length(); i++) {
char c = isbn10.charAt(i);
checksum += Character.getNumericValue(c) * weight;
weight--;
}
checksum = 11 - (checksum % 11);
if (checksum == 10) {
isbn10 += "X";
} else if (checksum == 11) {
isbn10 += "0";
} else {
isbn10 += checksum;
}
return isbn10;
}
public static boolean is_valid_isbn10(char[] digits) {
digits = cleanupISBN(new String(digits)).toCharArray();
int a = 0;
for (int i = 0; i < 10; i++) {
a += i * Integer.parseInt(String.valueOf(digits[i]));
}
return a % 11 == Integer.parseInt(String.valueOf(digits[9]));
}
private static String cleanupISBN(String isbn) {
return isbn.replaceAll("[^\\dX]", ""); //Remove all characters that aren't digits or X
}
public static String getAmazonCoverURL(String isbn, boolean large) {
if (large) {
return "http://images.amazon.com/images/P/" + isbn13to10(isbn) + ".01.L";
} else {
return "http://images.amazon.com/images/P/" + isbn13to10(isbn) + ".01.THUMBZZZ";
}
}
/**
* If possible, changes a cover URL to represent the best sized image for the given display
* size. If the URL is not supported, the original URL will be returned.
*
* @param url Original cover URL
* @param width Desired width
* @param height Desired height
* @return Improved URL
*/
public static String getBestSizeCoverUrl(String url, int width, int height) {
Pattern vlbRegex = Pattern.compile("^https?://(?:www.)?vlb\\.de/GetBlob\\.aspx\\?" +
".*strIsbn=([0-9X]*)");
Pattern amazonRegex = Pattern.compile(
"^(https?://(:?images(?:-[^\\.]*)?\\.|[^\\.]*\\.(?:ssl-)?images-)amazon" +
".com/images/[PI]/[^\\.]*\\.?(?:\\d\\d\\.)?)[^.]*\\.jpg");
Matcher vlbMatcher = vlbRegex.matcher(url);
Matcher amazonMatcher = amazonRegex.matcher(url);
int max = Math.max(width, height);
if (vlbMatcher.find()) {
// VLB Covers, sizes accoding to documentation at page 42 of
// http://info.vlb.de/files/vlb_rest_api_anwenderspezifikation.pdf
if (height <= 90) {
return "https://vlb.de/GetBlob.aspx?strIsbn=" + vlbMatcher.group(1) + "&size=S";
} else if (height <= 200) {
return "https://vlb.de/GetBlob.aspx?strIsbn=" + vlbMatcher.group(1) + "&size=M";
} else if (width <= 599) {
return "https://vlb.de/GetBlob.aspx?strIsbn=" + vlbMatcher.group(1) + "&size=L";
} else { // Original size
return "https://vlb.de/GetBlob.aspx?strIsbn=" + vlbMatcher.group(1);
}
} else if (amazonMatcher.find()) {
// Amazon Covers, according to http://aaugh.com/imageabuse.html
String base = amazonMatcher.group(1);
if (!base.endsWith(".")) base = base + ".";
return base + "SL" + max + ".jpg";
} else {
return url;
}
}
}