// jDownloader - Downloadmanager
// Copyright (C) 2008 JD-Team support@jdownloader.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
package jd.plugins.hoster;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import jd.PluginWrapper;
import jd.config.ConfigContainer;
import jd.config.ConfigEntry;
import jd.controlling.DownloadWatchDog;
import jd.controlling.JDLogger;
import jd.http.Browser;
import jd.http.Browser.BrowserException;
import jd.http.Request;
import jd.http.URLConnectionAdapter;
import jd.nutils.Formatter;
import jd.nutils.encoding.Encoding;
import jd.parser.Regex;
import jd.plugins.Account;
import jd.plugins.AccountInfo;
import jd.plugins.DownloadLink;
import jd.plugins.DownloadLink.AvailableStatus;
import jd.plugins.HostPlugin;
import jd.plugins.LinkStatus;
import jd.plugins.PluginException;
import jd.plugins.PluginForHost;
import jd.utils.locale.JDL;
@HostPlugin(revision = "$Revision: 15115 $", interfaceVersion = 2, names = { "rapidshare.com" }, urls = { "https?://[\\w\\.]*?rapidshare\\.com/(files/\\d+/[^\"\r\n ]+|\\#\\!download\\|\\d+.*?\\|\\d+\\|.+?($|\\|\\d+))" }, flags = { 2 })
public class Rapidshare extends PluginForHost {
public static class RSLink {
public static RSLink parse(final DownloadLink link) {
final RSLink ret = new RSLink(link);
ret.id = Long.parseLong(new Regex(ret.url, "files/(\\d+)/").getMatch(0));
if (ret.link.getProperty("htmlworkaround", null) == null) {
/*
* remove html ending, because rs now checks the complete
* filename
*/
ret.name = new Regex(ret.url, "files/\\d+/(.*?/)?(.*?)(\\.html?|$)").getMatch(1);
ret.secMD5 = new Regex(ret.url, "files/\\d+/t(.*?)-(.*?)/").getMatch(1);
ret.secTim = new Regex(ret.url, "files/\\d+/t(.*?)-(.*?)/").getMatch(0);
} else {
ret.name = new Regex(ret.url, "files/\\d+/(.*?/)?(.*?)$").getMatch(1);
ret.secMD5 = new Regex(ret.url, "files/\\d+/t(.*?)-(.*?)/").getMatch(1);
ret.secTim = new Regex(ret.url, "files/\\d+/t(.*?)-(.*?)/").getMatch(0);
}
return ret;
}
/**
* @return the secTim
*/
public String getSecTimout() {
return secTim;
}
private long id;
private String name;
private String url;
private String secMD5;
private String secTim;
/**
* @return the secMD5
*/
public String getSecMD5() {
return secMD5;
}
private DownloadLink link;
public RSLink(final DownloadLink link) {
this.link = link;
this.url = link.getDownloadURL();
}
public long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getUrl() {
return this.url;
}
public void setId(final int id) {
this.id = id;
}
public void setName(final String name) {
this.name = name;
}
public void setUrl(final String url) {
this.url = url;
}
}
private static final String WAIT_HOSTERFULL = "WAIT_HOSTERFULL";
private static final String SSL_CONNECTION = "SSL_CONNECTION2";
private static final String HTTPS_WORKAROUND = "HTTPS_WORKAROUND";
private static final Object LOCK = new Object();
private static final Boolean HTMLWORKAROUND = new Boolean(false);
private static long RS_API_WAIT = 0;
private static final String COOKIEPROP = "cookiesv2";
private static final Account dummyAccount = new Account("TRAFSHARE", "TRAFSHARE");
private static final String PRE_RESOLVE = "PRE_RESOLVE2";
/* returns file id of link */
private static String getID(final String link) {
String ret = new Regex(link, "files/(\\d+)/").getMatch(0);
if (ret == null) {
ret = new Regex(link, "\\#\\!download\\|(\\d+.*?)\\|(\\d+)\\|(.+?)($|\\|)").getMatch(1);
}
return ret;
}
private String accName = null;
public Rapidshare(final PluginWrapper wrapper) {
super(wrapper);
this.setConfigElements();
this.enablePremium("http://rapidshare.com/premium.html");
}
/**
* Bietet der hoster eine Mglichkeit mehrere links gleichzeitig zu prfen,
* kann das ber diese Funktion gemacht werden.
*/
@Override
public boolean checkLinks(final DownloadLink[] urls) {
if (urls == null || urls.length == 0) { return false; }
try {
if (Rapidshare.RS_API_WAIT > System.currentTimeMillis()) {
for (final DownloadLink u : urls) {
u.setAvailable(true);
u.getLinkStatus().setStatusText(JDL.L("plugin.host.rapidshare.status.apiflood", "unchecked (API Flood)"));
}
return true;
}
logger.finest("OnlineCheck: " + urls.length + " links");
final StringBuilder idlist = new StringBuilder();
final StringBuilder namelist = new StringBuilder();
final ArrayList links = new ArrayList();
int size = 0;
for (final DownloadLink u : urls) {
if (size > 3000) {
logger.finest("OnlineCheck: SplitCheck " + links.size() + "/" + urls.length + " links");
/* do not stop here because we are not finished yet */
this.checkLinksIntern2(links);
links.clear();
idlist.delete(0, idlist.capacity());
namelist.delete(0, namelist.capacity());
}
/* workaround reset */
u.setProperty("htmlworkaround", null);
idlist.append(",").append(Rapidshare.getID(u.getDownloadURL()));
namelist.append(",").append(this.getName(u));
links.add(u);
size = ("https://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&files=" + idlist.toString().substring(1) + "&filenames=" + namelist.toString().substring(1) + "&incmd5=1").length();
}
if (links.size() != 0) {
if (links.size() != urls.length) {
logger.finest("OnlineCheck: SplitCheck " + links.size() + "/" + urls.length + " links");
} else {
logger.finest("OnlineCheck: Check " + urls.length + " links");
}
if (!this.checkLinksIntern2(links)) { return false; }
}
} catch (final Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean checkLinksIntern(final DownloadLink[] urls) {
if (urls == null) { return false; }
final ArrayList checkurls = new ArrayList();
final ArrayList finishedurls = new ArrayList();
for (final DownloadLink u : urls) {
checkurls.add(u);
}
try {
for (int retry = 0; retry < 3; retry++) {
final StringBuilder idlist = new StringBuilder();
final StringBuilder namelist = new StringBuilder();
checkurls.removeAll(finishedurls);
for (final DownloadLink u : checkurls) {
idlist.append(",").append(Rapidshare.getID(u.getDownloadURL()));
namelist.append(",").append(this.getName(u));
}
final String req = "https://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&files=" + idlist.toString().substring(1) + "&filenames=" + namelist.toString().substring(1) + "&incmd5=1";
this.queryAPI(null, req, null);
if (this.br.containsHTML("access flood")) {
logger.warning("RS API flooded! Will not check again the next 5 minutes!");
Rapidshare.RS_API_WAIT = System.currentTimeMillis() + 5 * 60 * 1000l;
return false;
}
final String[][] matches = this.br.getRegex("([^\n^\r^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^\n^\r]*)").getMatches();
int i = 0;
boolean doretry = false;
for (final DownloadLink u : checkurls) {
finishedurls.add(u);
if (i > matches.length - 1) {
doretry = true;
break;
}
u.setDownloadSize(Long.parseLong(matches[i][2]));
u.setFinalFileName(matches[i][1]);
if (matches[i][6].trim().length() == 32) {
u.setMD5Hash(matches[i][6]);
} else {
u.setMD5Hash(null);
}
// 0=File not found 1=File OK 2=File OK (direct download)
// 3=Server down 4=File abused 5
switch (Integer.parseInt(matches[i][4])) {
case 0:
if (new Regex(u.getDownloadURL(), ".*?(html?)$").matches() && tryWorkaround(u)) {
/* retry this link with workaround */
finishedurls.remove(u);
doretry = true;
}
u.getLinkStatus().setErrorMessage(JDL.L("plugin.host.rapidshare.status.filenotfound", "File not found"));
u.getLinkStatus().setStatusText(JDL.L("plugin.host.rapidshare.status.filenotfound", "File not found"));
u.setAvailable(false);
break;
case 1:
// u.getLinkStatus().setStatusText("alles prima");
u.setAvailable(true);
u.getLinkStatus().setStatusText("");
u.getLinkStatus().setErrorMessage(null);
break;
case 5:
u.setAvailable(true);
u.getLinkStatus().setStatusText(JDL.L("plugin.host.rapidshare.status.directdownload", "Direct Download"));
u.getLinkStatus().setErrorMessage(null);
break;
case 3:
u.getLinkStatus().setErrorMessage(JDL.L("plugin.host.rapidshare.status.servernotavailable", "Server temp. not available. Try later!"));
u.getLinkStatus().setStatusText(JDL.L("plugin.host.rapidshare.status.servernotavailable", "Server temp. not available. Try later!"));
u.setAvailable(false);
break;
case 4:
u.setAvailable(false);
u.getLinkStatus().setErrorMessage(JDL.L("plugin.host.rapidshare.status.abused", "File abused"));
u.getLinkStatus().setStatusText(JDL.L("plugin.host.rapidshare.status.abused", "File abused"));
break;
}
i++;
}
if (!doretry) { return true; }
}
return false;
} catch (final Exception e) {
if (this.br.containsHTML("access flood")) {
logger.warning("RS API flooded! Will not check again the next 5 minutes!");
Rapidshare.RS_API_WAIT = System.currentTimeMillis() + 5 * 60 * 1000l;
}
return false;
}
}
private boolean checkLinksIntern2(final ArrayList links) {
if (!this.checkLinksIntern(links.toArray(new DownloadLink[] {}))) { return false; }
final ArrayList retry = new ArrayList();
for (final DownloadLink link : links) {
if (link.getProperty("htmlworkaround", null) != null) {
retry.add(link);
}
}
if (retry.size() > 0) {
if (!this.checkLinksIntern(retry.toArray(new DownloadLink[] {}))) { return false; }
}
return true;
}
@Override
public void correctDownloadLink(final DownloadLink link) {
link.setUrlDownload(this.getCorrectedURL(link.getDownloadURL()));
}
@Override
public AccountInfo fetchAccountInfo(final Account account) throws Exception {
try {
this.login(account, true);
} catch (final PluginException e) {
if (e.getValue() != PluginException.VALUE_ID_PREMIUM_TEMP_DISABLE) {
if (account.getAccountInfo() == null) {
account.setAccountInfo(new AccountInfo());
}
account.getAccountInfo().setStatus(e.getErrorMessage());
account.setValid(false);
}
return account.getAccountInfo();
}
return account.getAccountInfo();
}
@Override
public String getAGBLink() {
return "http://rapidshare.com/#!rapidshare-ag/rapidshare-ag_agb";
}
/**
* Korrigiert die URL und befreit von subdomains etc.
*
* @param link
* @return
*/
private String getCorrectedURL(String link) {
if (link == null) { return null; }
if (link.contains("://ssl.") || !link.startsWith("http://rapidshare.com")) {
link = "http://rapidshare.com" + link.substring(link.indexOf("rapidshare.com") + 14);
}
String filename = new Regex(link, "http://[\\w\\.]*?rapidshare\\.com/files/\\d+/?(.*?)($|\\?)").getMatch(0);
if (filename == null) {
filename = new Regex(link, "\\#\\!download\\|(\\d+.*?)\\|(\\d+)\\|(.+?)($|\\|)").getMatch(2);
}
return "http://rapidshare.com/files/" + Rapidshare.getID(link) + "/" + filename;
}
private HashMap getMap(final String[][] matches) {
final HashMap map = new HashMap();
for (final String[] m : matches) {
map.put(m[0].trim(), m[1].trim());
}
return map;
}
@Override
public int getMaxSimultanFreeDownloadNum() {
return 1;
}
/* get filename of link */
private String getName(final DownloadLink link) {
String name;
if (link.getProperty("htmlworkaround", null) == null) {
/* remove html ending, because rs now checks the complete filename */
name = new Regex(link.getDownloadURL(), "files/\\d+/(.*?/)?(.*?)(\\.html?|$)").getMatch(1);
} else {
name = new Regex(link.getDownloadURL(), "files/\\d+/(.*?/)?(.*?)$").getMatch(1);
}
return name;
}
@Override
public String getSessionInfo() {
if (this.accName != null) { return this.accName; }
return super.getSessionInfo();
}
@Override
public int getTimegapBetweenConnections() {
return 100;
}
private void handleErrors(final Browser br) throws PluginException {
String error = null;
if (this.br.toString().startsWith("ERROR: ")) {
error = this.br.getRegex("ERROR: ([^\r\n]+)").getMatch(0);
int index = error.lastIndexOf("(");
if (index > 0) error = error.substring(0, index).trim();
final String ipwait = new Regex(error, "You need to wait (\\d+) seconds until you can download another file without having RapidPro.").getMatch(0);
if (ipwait != null) {
logger.info(error);
throw new PluginException(LinkStatus.ERROR_IP_BLOCKED, null, Long.parseLong(ipwait) * 1000l);
}
if ("RapidPro expired.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE);
} else if ("File not found.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_FILE_NOT_FOUND, error);
} else if ("All free download slots are full. Please try again later.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_HOSTER_TEMPORARILY_UNAVAILABLE, JDL.L("jd.plugins.hoster.Rapidshare.handleErrors.message.nofreeslots", "Download as freeuser currently not possible"), 5 * 60 * 1000l);
} else if ("Please stop flooding our download servers.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_IP_BLOCKED, JDL.L("jd.plugins.hoster.Rapidshare.handleErrors.message.stopflood", "Please stop flooding our download servers"), 10 * 60 * 1000l);
} else if ("No traffic left.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_TEMP_DISABLE);
} else if ("You need RapidPro to download more files from your IP address.".equals(error)) {
throw new PluginException(LinkStatus.ERROR_IP_BLOCKED, 10 * 60 * 1000l);
} else {
JDLogger.getLogger().fine(br.toString());
throw new PluginException(LinkStatus.ERROR_FATAL, error);
}
}
}
@Override
public void handleFree(final DownloadLink downloadLink) throws Exception {
this.accName = "FreeUser";
if ("MD5NOTFOUND".equalsIgnoreCase(downloadLink.getMD5Hash())) {
downloadLink.setMD5Hash(null);
}
this.workAroundTimeOut(this.br);/* TODO: remove me after 0.9xx public */
/* we need file size to calculate left traffic */
if (downloadLink.getDownloadSize() <= 0) {
this.requestFileInformation(downloadLink);
}
try {
this.br.setFollowRedirects(false);
RSLink link = null;
try {
link = RSLink.parse(downloadLink);
} catch (final NumberFormatException e) {
/* invalid link format */
throw new PluginException(LinkStatus.ERROR_FILE_NOT_FOUND);
}
String query = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&try=1&fileid=" + link.getId() + "&filename=" + link.getName();
/* needed for secured links */
if (link.getSecMD5() != null) {
query += "&seclinkmd5=" + link.getSecMD5();
}
if (link.getSecTimout() != null) {
query += "&seclinktimeout=" + link.getSecTimout();
}
this.queryAPI(this.br, query, null);
this.handleErrors(this.br);
// RS URL wird aufgerufen
// this.br.getPage(link);
final String host = this.br.getRegex("DL:(.*?),").getMatch(0);
final String auth = this.br.getRegex("DL:(.*?),(.*?),").getMatch(1);
final String wait = this.br.getRegex("DL:(.*?),(.*?),(\\d+)").getMatch(2);
if (wait == null) throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT);
this.sleep(Long.parseLong(wait) * 1000l, downloadLink);
String directurl = "http://" + host + "/cgi-bin/rsapi.cgi?sub=download&dlauth=" + auth + "&bin=1&noflvheader=1&fileid=" + link.getId() + "&filename=" + link.getName();
/* needed for secured links */
if (link.getSecMD5() != null) {
directurl += "&seclinkmd5=" + link.getSecMD5();
}
if (link.getSecTimout() != null) {
directurl += "&seclinktimeout=" + link.getSecTimout();
}
logger.finest("Direct-Download: Server-Selection not available!");
br.setFollowRedirects(true);
try {
br.setVerbose(true);
} catch (Throwable e) {
/* only available after 0.9xx version */
}
dl = jd.plugins.BrowserAdapter.openDownload(br, downloadLink, directurl, true, 1);
URLConnectionAdapter urlConnection = dl.getConnection();
if (!urlConnection.isContentDisposition() && urlConnection.getHeaderField("Cache-Control") != null) {
urlConnection.disconnect();
throw new PluginException(LinkStatus.ERROR_TEMPORARILY_UNAVAILABLE, 10 * 60 * 1000l);
}
this.dl.startDownload();
} finally {
if (!downloadLink.getLinkStatus().hasStatus(LinkStatus.FINISHED)) {
this.accName = null;
}
}
}
private boolean useSSL() {
try {
if (Browser.getGlobalProxy() != null) {
/* workaround for ssl proxy bug in 09581 stable */
return false;
}
} catch (Throwable e) {
/* catch not found in old nightly */
}
return this.getPluginConfig().getBooleanProperty(Rapidshare.SSL_CONNECTION, true) || this.getPluginConfig().getBooleanProperty(Rapidshare.HTTPS_WORKAROUND, false);
}
@Override
public void handlePremium(final DownloadLink downloadLink, final Account account) throws Exception {
this.br.forceDebug(true);
this.workAroundTimeOut(this.br);
/* TODO: remove me after 0.9xx public */
if ("MD5NOTFOUND".equalsIgnoreCase(downloadLink.getMD5Hash())) {
downloadLink.setMD5Hash(null);
}
/* we need file size to calculate left traffic */
if (downloadLink.getDownloadSize() <= 0) {
this.requestFileInformation(downloadLink);
}
try {
this.br.forceDebug(true);
Request request = null;
this.accName = account.getUser();
/* synchronized check of account, package handling */
synchronized (Rapidshare.LOCK) {
this.br = this.login(account, false);
}
this.br.setFollowRedirects(false);
RSLink link = null;
try {
link = RSLink.parse(downloadLink);
} catch (final NumberFormatException e) {
/* invalid link format */
throw new PluginException(LinkStatus.ERROR_FILE_NOT_FOUND);
}
String query = "https://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&try=1&fileid=" + link.getId() + "&filename=" + link.getName() + "&cookie=" + account.getProperty("cookie");
/* needed for secured links */
if (link.getSecMD5() != null) {
query += "&seclinkmd5=" + link.getSecMD5();
}
if (link.getSecTimout() != null) {
query += "&seclinktimeout=" + link.getSecTimout();
}
this.queryAPI(this.br, query, account);
this.handleErrors(this.br);
String host = this.br.getRegex("DL:(.*?),").getMatch(0);
// this might bypass some isps limit restrictions on rapidshare host
// names
if (this.getPluginConfig().getBooleanProperty(Rapidshare.PRE_RESOLVE, false)) {
try {
logger.fine("Try to resolve adress " + host);
final InetAddress inetAddress = InetAddress.getByName(host);
host = inetAddress.getHostAddress();
} catch (final Exception e) {
JDLogger.exception(e);
}
}
String directurl = "https://" + host + "/cgi-bin/rsapi.cgi?sub=download&bin=1&noflvheader=1&fileid=" + link.getId() + "&filename=" + link.getName() + "&cookie=" + account.getProperty("cookie");
/* needed for secured links */
if (link.getSecMD5() != null) {
directurl += "&seclinkmd5=" + link.getSecMD5();
}
if (link.getSecTimout() != null) {
directurl += "&seclinktimeout=" + link.getSecTimout();
}
br.setFollowRedirects(true);
dl = jd.plugins.BrowserAdapter.openDownload(br, downloadLink, directurl, true, 0);
URLConnectionAdapter urlConnection = dl.getConnection();
/*
* Download starten prft ob ein content disposition header
* geschickt wurde. Falls nicht, ist es eintweder eine Bilddatei
* oder eine Fehlerseite. BIldfiles haben keinen Cache-Control
* Header
*/
if (!urlConnection.isContentDisposition() && urlConnection.getHeaderField("Cache-Control") != null) {
// Ldt die zuletzt aufgebaute vernindung
this.br.setRequest(request);
this.br.followConnection();
// Fehlerbehanldung
/*
* Achtung! keine Parsing arbeiten an diesem String!!!
*/
this.reportUnknownError(this.br.toString(), 6);
throw new PluginException(LinkStatus.ERROR_RETRY);
}
this.dl.startDownload();
} finally {
if (!downloadLink.getLinkStatus().hasStatus(LinkStatus.FINISHED)) {
this.accName = null;
// rs api does not return 416 error for bad ranges
if ((JDL.L("download.error.message.rangeheaderparseerror", "Unexpected rangeheader format:") + "null").equals(downloadLink.getLinkStatus().getErrorMessage())) {
downloadLink.setChunksProgress(null);
throw new PluginException(LinkStatus.ERROR_DOWNLOAD_FAILED, "Too many Chunks");
}
}
if (account == Rapidshare.dummyAccount) {
downloadLink.getLinkStatus().setStatusText(JDL.LF("plugins.host.rapidshare.loadedvia", "Loaded via %s", "DirectDownload"));
} else {
downloadLink.getLinkStatus().setStatusText(JDL.LF("plugins.host.rapidshare.loadedvia", "Loaded via %s", account.getUser()));
}
}
}
/**
* DO NOT REMOVE, ANTI DDOS PROTECTION
*/
@SuppressWarnings("deprecation")
@Override
public boolean isPremiumDownload() {
/*
* this plugin must take care of HOST_TEMP_UNAVAIL status even in
* premium mode, can be removed with next major update TODO
*/
if (DownloadWatchDog.getInstance().getRemainingTempUnavailWaittime(this.getHost()) > 0) { return false; }
return super.isPremiumDownload();
}
private Browser login(final Account account, final boolean forceRefresh) throws Exception {
synchronized (Rapidshare.LOCK) {
final Browser br = new Browser();
this.workAroundTimeOut(br);/* TODO: remove me after 0.9xx public */
br.setDebug(true);
br.setCookiesExclusive(true);
br.clearCookies(this.getHost());
boolean ssl = useSSL();
final String prtotcol = ssl ? "https" : "http";
/*
* we can use cookie login if user does not want to get asked before
* package upgrade. we dont need live traffic stats here
*/
HashMap cookies = account.getGenericProperty(Rapidshare.COOKIEPROP, (HashMap) null);
boolean cookieLogin = false;
if (cookies != null && forceRefresh == false) {
cookieLogin = true;
}
/* cookie login or not? */
if (cookieLogin && cookies != null && cookies.get("enc") != null && cookies.get("enc").length() != 0) {
logger.finer("Cookie Login");
for (final Entry cookie : cookies.entrySet()) {
br.setCookie(prtotcol + "://rapidshare.com", cookie.getKey(), cookie.getValue());
}
return br;
} else {
account.setProperty(Rapidshare.COOKIEPROP, null);
}
final String req = prtotcol + "://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=getaccountdetails&withcookie=1&type=prem&login=" + Encoding.urlEncode(account.getUser()) + "&password=" + Encoding.urlEncode(account.getPass());
this.queryAPI(br, req, account);
final String error = br.getRegex("ERROR:(.*)").getMatch(0);
if (error != null) {
account.setProperty(Rapidshare.COOKIEPROP, null);
logger.severe("10 " + br.toString());
throw new PluginException(LinkStatus.ERROR_PREMIUM, error, PluginException.VALUE_ID_PREMIUM_DISABLE);
}
if (br.containsHTML("Login failed")) {
account.setProperty(Rapidshare.COOKIEPROP, null);
logger.severe("1 " + br.toString());
throw new PluginException(LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE);
}
if (br.containsHTML("access flood")) {
logger.warning("RS API flooded! will not check again the next 15 minutes!");
throw new PluginException(LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_TEMP_DISABLE);
} else {
logger.finer("API Login");
final String cookie = br.getRegex("cookie=([A-Z0-9]+)").getMatch(0);
br.setCookie("http://rapidshare.com", "enc", cookie);
}
final String cookie = br.getCookie("http://rapidshare.com", "enc");
if (cookie == null) {
account.setProperty(Rapidshare.COOKIEPROP, null);
logger.severe("2 " + br.toString());
throw new PluginException(LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE);
} else {
cookies = new HashMap();
cookies.put("enc", cookie);
account.setProperty(Rapidshare.COOKIEPROP, cookies);
}
// put all accountproperties
for (final String[] m : br.getRegex("(\\w+)=([^\r^\n]+)").getMatches()) {
account.setProperty(m[0].trim(), m[1].trim());
}
this.updateAccountInfo(account, br);
return br;
}
}
/**
* requests the API url req. if the http ip is blocked (UK-BT isp returns
* 500 or 502 error) https is used.
*
* @param br
* @param req
* @throws Exception
*/
private void queryAPI(Browser br, String req, final Account account) throws Exception {
if (br == null) {
br = this.br;
}
this.workAroundTimeOut(br);/* TODO: remove me after 0.9xx public */
br.forceDebug(true);
if (account != null && useSSL()) {
req = req.replaceFirst("http:", "https:");
}
boolean follow = br.isFollowingRedirects();
try {
br.setFollowRedirects(true);
br.getPage(req);
} catch (final BrowserException e) {
if (e.getConnection() != null && !req.startsWith("https")) {
switch (e.getConnection().getResponseCode()) {
case 500:
case 502:
req = "https" + req.substring(4);
br.getPage(req);
break;
default:
throw e;
}
} else {
throw e;
}
} finally {
br.setFollowRedirects(follow);
}
}
private void reportUnknownError(final Object req, final int id) {
logger.severe("Unknown error(" + id + "). Please add this HTML-Code to your Bugreport:\r\n" + req);
}
@Override
public AvailableStatus requestFileInformation(final DownloadLink downloadLink) throws IOException, PluginException {
this.checkLinks(new DownloadLink[] { downloadLink });
if (!downloadLink.isAvailabilityStatusChecked()) {
downloadLink.setAvailableStatus(AvailableStatus.UNCHECKABLE);
} else {
if (!downloadLink.isAvailable()) { throw new PluginException(LinkStatus.ERROR_FILE_NOT_FOUND); }
}
return downloadLink.getAvailableStatus();
}
@Override
public void reset() {
Rapidshare.RS_API_WAIT = 0;
}
@Override
public void resetDownloadlink(final DownloadLink link) {
}
/**
* Erzeugt den Configcontainer fr die Gui
*/
private void setConfigElements() {
getConfig().addEntry(new ConfigEntry(ConfigContainer.TYPE_CHECKBOX, this.getPluginConfig(), Rapidshare.SSL_CONNECTION, JDL.L("plugins.hoster.rapidshare.com.ssl2", "Use Secure Communication over SSL")).setDefaultValue(true));
getConfig().addEntry(new ConfigEntry(ConfigContainer.TYPE_CHECKBOX, this.getPluginConfig(), Rapidshare.HTTPS_WORKAROUND, JDL.L("plugins.hoster.rapidshare.com.https", "Use HTTPS workaround for ISP Block")).setDefaultValue(false));
/* caused issues lately because it seems some ip's are sharedhosting */
// this.config.addEntry(new ConfigEntry(ConfigContainer.TYPE_CHECKBOX,
// this.getPluginConfig(), Rapidshare.PRE_RESOLVE,
// JDL.L("plugins.hoster.rapidshare.com.resolve",
// "Use IP instead of hostname")).setDefaultValue(false));
getConfig().addEntry(new ConfigEntry(ConfigContainer.TYPE_SEPARATOR));
getConfig().addEntry(new ConfigEntry(ConfigContainer.TYPE_CHECKBOX, this.getPluginConfig(), Rapidshare.WAIT_HOSTERFULL, JDL.L("plugins.hoster.rapidshare.com.waithosterfull", "Wait if all FreeUser Slots are full")).setDefaultValue(true));
}
/**
* try the html filename workaround
*/
private boolean tryWorkaround(final DownloadLink link) {
if (link.getProperty("htmlworkaround", null) == null) {
link.setProperty("htmlworkaround", Rapidshare.HTMLWORKAROUND);
return true;
}
return false;
}
private void updateAccountInfo(final Account account, final Browser br) {
if (account == null || br == null) { return; }
AccountInfo ai = account.getAccountInfo();
if (ai == null) {
ai = new AccountInfo();
account.setAccountInfo(ai);
}
/* let hoster report traffic limit reached! */
// ai.setSpecialTraffic(true);
/* reset expired flag */
ai.setExpired(false);
ai.setValidUntil(-1);
account.setValid(true);
ai.setUnlimitedTraffic();
try {
final String[][] matches = br.getRegex("(\\w+)=([^\r^\n]+)").getMatches();
final HashMap data = this.getMap(matches);
final long rapids = Long.parseLong(data.get("rapids"));
/* account infos */
ai.setFilesNum(Long.parseLong(data.get("curfiles")));
ai.setPremiumPoints(Long.parseLong(data.get("rapids")));
ai.setUsedSpace(Long.parseLong(data.get("curspace")));
boolean autoextend = "1".equals(data.get("autoextend"));
final String billedUntilTime = data.get("billeduntil");
final String serverTimeString = data.get("servertime");
long nextBill = 0;
if (billedUntilTime != null && serverTimeString != null) {
/* next billing in */
nextBill = Long.parseLong(billedUntilTime) - Long.parseLong(serverTimeString);
if (nextBill <= 0) {
String possible = "";
if (autoextend) {
long days = (rapids / 495) * 30;
if (days > 0) {
possible = "(enough rapids for " + days + " days RapidPro left)";
}
}
ai.setStatus("No RapidPro" + possible);
ai.setExpired(true);
account.setValid(false);
} else {
if (autoextend) {
long days = (rapids / 495) * 30;
if (days > 0) {
nextBill = nextBill + (days * 24 * 60);
}
}
final String left = Formatter.formatSeconds(nextBill, false);
ai.setValidUntil((Long.parseLong(serverTimeString) + nextBill) * 1000l);
ai.setStatus("Valid for " + left);
}
}
} catch (final Throwable e) {
logger.severe("RS-API change detected, please inform support!");
}
}
private void workAroundTimeOut(final Browser br) {
try {
if (br != null) {
br.setConnectTimeout(30000);
br.setReadTimeout(30000);
}
} catch (final Throwable e) {
}
}
}