package be.nikiroo.fanfix.supported;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import java.util.Scanner;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.utils.StringUtils;
/**
* Support class for Faniction.net
* stories, a website dedicated to fanfictions of many, many different
* universes, from TV shows to novels to games.
*
* @author niki
*/
class Fanfiction extends BasicSupport {
@Override
protected boolean isHtml() {
return true;
}
@Override
public String getSourceName() {
return "Fanfiction.net";
}
@Override
protected String getSubject(URL source, InputStream in) {
String line = getLine(in, "id=pre_story_links", 0);
if (line != null) {
int pos = line.lastIndexOf('"');
if (pos >= 1) {
line = line.substring(pos + 1);
pos = line.indexOf('<');
if (pos >= 0) {
return line.substring(0, pos);
}
}
}
return null;
}
@Override
protected List getTags(URL source, InputStream in)
throws IOException {
List tags = super.getTags(source, in);
String key = "title=\"Send Private Message\"";
String line = getLine(in, key, 2);
if (line != null) {
key = "Rated:";
int pos = line.indexOf(key);
if (pos >= 0) {
line = line.substring(pos + key.length());
key = "Chapters:";
pos = line.indexOf(key);
if (pos >= 0) {
line = line.substring(0, pos);
line = StringUtils.unhtml(line).trim();
if (line.endsWith("-")) {
line = line.substring(0, line.length() - 1);
}
for (String tag : line.split("-")) {
tags.add(tag.trim());
}
}
}
}
return tags;
}
@Override
protected String getTitle(URL source, InputStream in) {
int i = 0;
@SuppressWarnings("resource")
Scanner scan = new Scanner(in, "UTF-8");
scan.useDelimiter("\\n");
while (scan.hasNext()) {
String line = scan.next();
if (line.contains("xcontrast_txt")) {
if ((++i) == 2) {
line = StringUtils.unhtml(line).trim();
if (line.startsWith("Follow/Fav")) {
line = line.substring("Follow/Fav".length()).trim();
}
return line;
}
}
}
return null;
}
@Override
protected String getAuthor(URL source, InputStream in) {
int i = 0;
@SuppressWarnings("resource")
Scanner scan = new Scanner(in, "UTF-8");
scan.useDelimiter("\\n");
while (scan.hasNext()) {
String line = scan.next();
if (line.contains("xcontrast_txt")) {
if ((++i) == 3) {
return StringUtils.unhtml(line).trim();
}
}
}
return null;
}
@Override
protected String getDate(URL source, InputStream in) {
String key = "Published: = 0) {
line = line.substring(0, pos).trim();
try {
SimpleDateFormat sdf = new SimpleDateFormat(
"YYYY-MM-dd");
return sdf
.format(new Date(1000 * Long.parseLong(line)));
} catch (NumberFormatException e) {
Instance.syserr(new IOException(
"Cannot convert publication date: " + line, e));
}
}
}
}
return null;
}
@Override
protected String getDesc(URL source, InputStream in) {
return getLine(in, "title=\"Send Private Message\"", 1);
}
@Override
protected URL getCover(URL url, InputStream in) {
String key = "class='cimage";
String line = getLine(in, key, 0);
if (line != null) {
int pos = line.indexOf(key);
if (pos >= 0) {
line = line.substring(pos + key.length());
key = "src='";
pos = line.indexOf(key);
if (pos >= 0) {
line = line.substring(pos + key.length());
pos = line.indexOf('\'');
if (pos >= 0) {
line = line.substring(0, pos);
if (line.startsWith("//")) {
line = url.getProtocol() + "://"
+ line.substring(2);
} else if (line.startsWith("//")) {
line = url.getProtocol() + "://" + url.getHost()
+ "/" + line.substring(1);
} else {
line = url.getProtocol() + "://" + url.getHost()
+ "/" + url.getPath() + "/" + line;
}
try {
return new URL(line);
} catch (MalformedURLException e) {
Instance.syserr(e);
}
}
}
}
}
return null;
}
@Override
protected List> getChapters(URL source, InputStream in) {
List> urls = new ArrayList>();
String base = source.toString();
int pos = base.lastIndexOf('/');
String suffix = base.substring(pos); // including '/' at start
base = base.substring(0, pos);
if (base.endsWith("/1")) {
base = base.substring(0, base.length() - 1); // including '/' at end
}
String line = getLine(in, "id=chap_select", 0);
String key = "