--- /dev/null
+package be.nikiroo.fanfix.supported;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.jsoup.helper.DataUtil;
+import org.jsoup.nodes.Document;
+
+import be.nikiroo.fanfix.Instance;
+import be.nikiroo.fanfix.bundles.Config;
+import be.nikiroo.fanfix.data.MetaData;
+import be.nikiroo.utils.IOUtils;
+import be.nikiroo.utils.Progress;
+
+/**
+ * Support class for <a href="https://sofurry.com/">SoFurry.com</a>, a Furry
+ * website supporting images and stories (we only retrieve the stories).
+ *
+ * @author niki
+ */
+class YiffStar2 extends BasicSupport {
+ @Override
+ protected String getSourceName() {
+ return "YiffStar";
+ }
+
+ @Override
+ protected void login() throws IOException {
+ // Note: this is not necessary anymore for NSFW
+ // (the "/guest" trick is enough)
+ // ...but still required for RegUsersOnly pages
+ String login = Instance.getConfig().getString(
+ Config.LOGIN_YIFFSTAR_USER);
+ String password = Instance.getConfig().getString(
+ Config.LOGIN_YIFFSTAR_PASS);
+
+ if (login != null && !login.isEmpty() && password != null
+ && !password.isEmpty()) {
+ Map<String, String> post = new HashMap<String, String>();
+ post.put("YII_CSRF_TOKEN", "");
+ post.put("LoginForm[sfLoginUsername]", login);
+ post.put("LoginForm[sfLoginPassword]", password);
+ post.put("returnUrl", "/");
+ post.put("yt1", "Login");
+
+ // Cookies will actually be retained by the cache manager once
+ // logged in
+ setCurrentReferer(null);
+ Instance.getCache()
+ .openNoCache(new URL("https://www.sofurry.com/user/login"),
+ this, post, null, null).close();
+ }
+ }
+
+ @Override
+ protected Document loadDocument(URL source) throws IOException {
+ String url = getCanonicalUrl(source).toString();
+ return DataUtil
+ .load(Instance.getCache().openNoCache(source, this, null, null,
+ null), "UTF-8", url.toString());
+ }
+
+ @Override
+ protected boolean isHtml() {
+ return true;
+ }
+
+ @Override
+ protected MetaData getMeta() throws IOException {
+
+ IOUtils.writeSmallFile(new File("/tmp/node.html"), getSourceNode()
+ .outerHtml());
+
+ MetaData meta = new MetaData();
+
+ meta.setTitle("");
+ meta.setAuthor("");
+ meta.setDate("");
+ meta.setTags(new ArrayList<String>());
+ meta.setSource(getSourceName());
+ meta.setUrl(getSource().toString());
+ meta.setPublisher(getSourceName());
+ meta.setUuid(getSource().toString());
+ meta.setLuid("");
+ meta.setLang("en");
+ meta.setSubject("Furry");
+ meta.setType(getType().toString());
+ meta.setImageDocument(false);
+ meta.setCover(null);
+
+ return meta;
+ }
+
+ @Override
+ protected String getDesc() throws IOException {
+ // TODO Auto-generated method stub
+ return "";
+ }
+
+ @Override
+ protected List<Entry<String, URL>> getChapters(Progress pg)
+ throws IOException {
+ // TODO Auto-generated method stub
+ return new ArrayList<Map.Entry<String, URL>>();
+ }
+
+ @Override
+ protected String getChapterContent(URL chapUrl, int number, Progress pg)
+ throws IOException {
+ // TODO Auto-generated method stub
+ return "";
+ }
+
+ @Override
+ protected boolean supports(URL url) {
+ String host = url.getHost();
+ if (host.startsWith("www.")) {
+ host = host.substring("www.".length());
+ }
+
+ return "sofurry.com".equals(host);
+ }
+
+ /**
+ * Return a {@link URL} from the given link, but add the "/guest" part to it
+ * to make sure we don't need to be logged-in to see it.
+ *
+ * @param link
+ * the link
+ *
+ * @return the {@link URL}
+ *
+ * @throws MalformedURLException
+ * in case of data error
+ */
+ static private URL guestUrl(String link) throws MalformedURLException {
+
+ if (true)
+ return new URL(link);
+
+ if (link.contains("?")) {
+ if (link.contains("/?")) {
+ return new URL(link.replace("?", "guest?"));
+ }
+
+ return new URL(link.replace("?", "/guest?"));
+ }
+
+ return new URL(link + "/guest");
+ }
+}