public void doFree( DownloadLink downloadLink, boolean resumable, int maxchunks, String directlinkproperty) throws Exception, PluginException { String passCode = null; // First, bring up saved final links String dllink = checkDirectLink(downloadLink, directlinkproperty); // Second, check for streaming links on the first page if (dllink == null) dllink = getDllink(); // Third, continue like normal. if (dllink == null) { checkErrors(downloadLink, false, passCode); if (correctedBR.contains("\"download1\"")) { postPage( br.getURL(), "op=download1&usr_login=&id=" + new Regex(downloadLink.getDownloadURL(), "/([A-Za-z0-9]{12})$").getMatch(0) + "&fname=" + Encoding.urlEncode(downloadLink.getStringProperty("plainfilename")) + "&referer=&method_free=Free+Download"); checkErrors(downloadLink, false, passCode); } dllink = getDllink(); } if (dllink == null) { Form dlForm = br.getFormbyProperty("name", "F1"); if (dlForm == null) throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); // how many forms deep do you want to try. int repeat = 4; for (int i = 1; i <= repeat; i++) { dlForm.remove(null); final long timeBefore = System.currentTimeMillis(); boolean password = false; boolean skipWaittime = false; if (new Regex(correctedBR, PASSWORDTEXT).matches()) { password = true; logger.info("The downloadlink seems to be password protected."); } // md5 can be on the subquent pages if (downloadLink.getMD5Hash() == null) { String md5hash = new Regex(correctedBR, "<b>MD5.*?</b>.*?nowrap>(.*?)<").getMatch(0); if (md5hash != null) downloadLink.setMD5Hash(md5hash.trim()); } /* Captcha START */ if (new Regex(correctedBR, "(api\\.recaptcha\\.net|google\\.com/recaptcha/api/)") .matches()) { logger.info("Detected captcha method \"Re Captcha\" for this host"); PluginForHost recplug = JDUtilities.getPluginForHost("DirectHTTP"); jd.plugins.hoster.DirectHTTP.Recaptcha rc = ((DirectHTTP) recplug).getReCaptcha(br); rc.setForm(dlForm); String id = new Regex(correctedBR, "\\?k=([A-Za-z0-9%_\\+\\- ]+)\"").getMatch(0); rc.setId(id); rc.load(); File cf = rc.downloadCaptcha(getLocalCaptchaFile()); String c = getCaptchaCode(cf, downloadLink); Form rcform = rc.getForm(); rcform.put("recaptcha_challenge_field", rc.getChallenge()); rcform.put("recaptcha_response_field", Encoding.urlEncode(c)); logger.info( "Put captchacode " + c + " obtained by captcha metod \"Re Captcha\" in the form and submitted it."); dlForm = rc.getForm(); /** wait time is often skippable for reCaptcha handling */ skipWaittime = true; } else if (correctedBR.contains(";background:#ccc;text-align")) { logger.info("Detected captcha method \"plaintext captchas\" for this host"); /** Captcha method by ManiacMansion */ String[][] letters = new Regex( Encoding.htmlDecode(br.toString()), "<span style=\\'position:absolute;padding\\-left:(\\d+)px;padding\\-top:\\d+px;\\'>(\\d)</span>") .getMatches(); if (letters == null || letters.length == 0) { logger.warning("plaintext captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } SortedMap<Integer, String> capMap = new TreeMap<Integer, String>(); for (String[] letter : letters) { capMap.put(Integer.parseInt(letter[0]), letter[1]); } StringBuilder code = new StringBuilder(); for (String value : capMap.values()) { code.append(value); } dlForm.put("code", code.toString()); logger.info( "Put captchacode " + code.toString() + " obtained by captcha metod \"plaintext captchas\" in the form."); } else if (correctedBR.contains("/captchas/")) { logger.info("Detected captcha method \"Standard captcha\" for this host"); String[] sitelinks = HTMLParser.getHttpLinks(br.toString(), null); String captchaurl = null; if (sitelinks == null || sitelinks.length == 0) { logger.warning("Standard captcha captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } for (String link : sitelinks) { if (link.contains("/captchas/")) { captchaurl = link; break; } } if (captchaurl == null) { logger.warning("Standard captcha captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } String code = getCaptchaCode("xfilesharingprobasic", captchaurl, downloadLink); dlForm.put("code", code); logger.info( "Put captchacode " + code + " obtained by captcha metod \"Standard captcha\" in the form."); } /* Captcha END */ if (password) passCode = handlePassword(passCode, dlForm, downloadLink); if (!skipWaittime) waitTime(timeBefore, downloadLink); sendForm(dlForm); logger.info("Submitted DLForm"); checkErrors(downloadLink, true, passCode); dllink = getDllink(); if (dllink == null && (!br.containsHTML("<Form name=\"F1\" method=\"POST\" action=\"\"") || i == repeat)) { logger.warning("Final downloadlink (String is \"dllink\") regex didn't match!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } else if (dllink == null && br.containsHTML("<Form name=\"F1\" method=\"POST\" action=\"\"")) { dlForm = br.getFormbyProperty("name", "F1"); continue; } else break; } } logger.info("Final downloadlink = " + dllink + " starting the download..."); dl = jd.plugins.BrowserAdapter.openDownload(br, downloadLink, dllink, resumable, maxchunks); if (dl.getConnection().getContentType().contains("html")) { logger.warning("The final dllink seems not to be a file!"); br.followConnection(); correctBR(); checkServerErrors(); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } downloadLink.setProperty(directlinkproperty, dllink); if (passCode != null) downloadLink.setProperty("pass", passCode); try { // add a download slot controlFree(+1); // start the dl dl.startDownload(); } finally { // remove download slot controlFree(-1); } }
@SuppressWarnings("deprecation") public void doFree( DownloadLink downloadLink, boolean resumable, int maxchunks, boolean checkFastWay) throws Exception, PluginException { String passCode = null; String md5hash = new Regex(BRBEFORE, "<b>MD5.*?</b>.*?nowrap>(.*?)<").getMatch(0); if (md5hash != null) { md5hash = md5hash.trim(); logger.info("Found md5hash: " + md5hash); downloadLink.setMD5Hash(md5hash); } String dllink = null; if (checkFastWay) { dllink = downloadLink.getStringProperty("freelink"); if (dllink != null) { try { Browser br2 = br.cloneBrowser(); URLConnectionAdapter con = br2.openGetConnection(dllink); if (con.getContentType().contains("html") || con.getLongContentLength() == -1) { downloadLink.setProperty("freelink", Property.NULL); dllink = null; } con.disconnect(); } catch (Exception e) { dllink = null; } } } // Videolinks can already be found here, if a link is found here we can // skip waittimes and captchas if (dllink == null) { checkErrors(downloadLink, false, passCode); if (BRBEFORE.contains("\"download1\"")) { br.postPage( downloadLink.getDownloadURL(), "op=download1&usr_login=&id=" + new Regex( downloadLink.getDownloadURL(), COOKIE_HOST.replace("http://", "") + "/" + "([a-z0-9]{12})") .getMatch(0) + "&fname=" + Encoding.urlEncode(downloadLink.getName()) + "&referer=&method_free=Free+Download"); doSomething(); checkErrors(downloadLink, false, passCode); } dllink = getDllink(); } if (dllink == null) { Form dlForm = br.getFormbyProperty("name", "F1"); if (dlForm == null) throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); long timeBefore = System.currentTimeMillis(); boolean password = false; boolean skipWaittime = false; if (new Regex(BRBEFORE, PASSWORDTEXT).matches()) { password = true; logger.info("The downloadlink seems to be password protected."); } /* Captcha START */ if (BRBEFORE.contains(";background:#ccc;text-align")) { logger.info("Detected captcha method \"plaintext captchas\" for this host"); // Captcha method by ManiacMansion String[][] letters = new Regex( Encoding.htmlDecode(br.toString()), "<span style=\\'position:absolute;padding\\-left:(\\d+)px;padding\\-top:\\d+px;\\'>(\\d)</span>") .getMatches(); if (letters == null || letters.length == 0) { logger.warning("plaintext captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } SortedMap<Integer, String> capMap = new TreeMap<Integer, String>(); for (String[] letter : letters) { capMap.put(Integer.parseInt(letter[0]), letter[1]); } StringBuilder code = new StringBuilder(); for (String value : capMap.values()) { code.append(value); } dlForm.put("code", code.toString()); logger.info( "Put captchacode " + code.toString() + " obtained by captcha metod \"plaintext captchas\" in the form."); } else if (BRBEFORE.contains("/captchas/")) { logger.info("Detected captcha method \"Standard captcha\" for this host"); String[] sitelinks = HTMLParser.getHttpLinks(br.toString(), null); String captchaurl = null; if (sitelinks == null || sitelinks.length == 0) { logger.warning("Standard captcha captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } for (String link : sitelinks) { if (link.contains("/captchas/")) { captchaurl = link; break; } } if (captchaurl == null) { logger.warning("Standard captcha captchahandling broken!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } String code = getCaptchaCode("xfilesharingprobasic", captchaurl, downloadLink); dlForm.put("code", code); logger.info( "Put captchacode " + code + " obtained by captcha metod \"Standard captcha\" in the form."); } else if (new Regex(BRBEFORE, "(api\\.recaptcha\\.net|google\\.com/recaptcha/api/)") .matches()) { logger.info("Detected captcha method \"Re Captcha\" for this host"); PluginForHost recplug = JDUtilities.getPluginForHost("DirectHTTP"); jd.plugins.hoster.DirectHTTP.Recaptcha rc = ((DirectHTTP) recplug).getReCaptcha(br); rc.setForm(dlForm); String id = this.br.getRegex("\\?k=([A-Za-z0-9%_\\+\\- ]+)\"").getMatch(0); rc.setId(id); rc.load(); File cf = rc.downloadCaptcha(getLocalCaptchaFile()); String c = getCaptchaCode(cf, downloadLink); rc.prepareForm(c); logger.info( "Put captchacode " + c + " obtained by captcha metod \"Re Captcha\" in the form and submitted it."); dlForm = rc.getForm(); // waittime is often skippable for reCaptcha handling // skipWaittime = true; } /* Captcha END */ if (password) passCode = handlePassword(passCode, dlForm, downloadLink); if (!skipWaittime) waitTime(timeBefore, downloadLink); br.submitForm(dlForm); logger.info("Submitted DLForm"); doSomething(); checkErrors(downloadLink, true, passCode); dllink = getDllink(); if (dllink == null) { logger.warning("Final downloadlink (String is \"dllink\") regex didn't match!"); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } } logger.info("Final downloadlink = " + dllink + " starting the download..."); dl = jd.plugins.BrowserAdapter.openDownload(br, downloadLink, dllink, resumable, maxchunks); if (dl.getConnection().getContentType().contains("html")) { logger.warning("The final dllink seems not to be a file!"); br.followConnection(); doSomething(); checkServerErrors(); throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } downloadLink.setProperty("freelink", dllink); if (passCode != null) downloadLink.setProperty("pass", passCode); dl.startDownload(); }
@SuppressWarnings("unchecked") private void login(Account account, boolean showCaptcha, boolean doCheck) throws Exception { synchronized (LOCK) { try { /** Load cookies */ br.setCookiesExclusive(true); br.setCookie(COOKIE_HOST, "lang", "english"); final Object ret = account.getProperty("cookies", null); boolean refreshCookies = true; boolean acmatch = Encoding.urlEncode(account.getUser()) .equals(account.getStringProperty("name", Encoding.urlEncode(account.getUser()))); if (acmatch) acmatch = Encoding.urlEncode(account.getPass()) .equals(account.getStringProperty("pass", Encoding.urlEncode(account.getPass()))); if (acmatch && ret != null && ret instanceof HashMap<?, ?>) { final HashMap<String, String> cookies = (HashMap<String, String>) ret; if (account.isValid()) { for (final Map.Entry<String, String> cookieEntry : cookies.entrySet()) { final String key = cookieEntry.getKey(); final String value = cookieEntry.getValue(); this.br.setCookie(COOKIE_HOST, key, value); } if (doCheck) { br.getPage(COOKIE_HOST + "/?op=my_account"); doSomething(); if ((br.getCookie(COOKIE_HOST, "login")) == null || br.getCookie(COOKIE_HOST, "xfss") == null) { /* cookies are no longer valid, refresh them */ refreshCookies = true; } else { /* cookies are still okay, no need to refresh */ refreshCookies = false; } } else { /* no doCheck */ return; } } } if (refreshCookies) { /* fresh login = new cookies */ br.getPage(COOKIE_HOST + "/login.html"); Form loginform = br.getForm(0); if (loginform == null) throw new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); loginform.put("login", Encoding.urlEncode(account.getUser())); loginform.put("password", Encoding.urlEncode(account.getPass())); if (br.containsHTML("RecaptchaOptions")) { /* too many logins result in recaptcha login */ if (showCaptcha == false) { AccountInfo ai = account.getAccountInfo(); if (ai != null) { ai.setStatus("Logout/Login in Browser please!"); } throw new PluginException( LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE); } else { /* recaptcha needed */ PluginForHost recplug = JDUtilities.getPluginForHost("DirectHTTP"); jd.plugins.hoster.DirectHTTP.Recaptcha rc = ((DirectHTTP) recplug).getReCaptcha(br); rc.setForm(loginform); String id = this.br.getRegex("\\?k=([A-Za-z0-9%_\\+\\- ]+)\"").getMatch(0); rc.setId(id); rc.load(); File cf = rc.downloadCaptcha(getLocalCaptchaFile()); DownloadLink dummyLink = new DownloadLink(null, "Account", "easybytez.com", "http://easybytez.com", true); String c = getCaptchaCode(cf, dummyLink); rc.setCode(c); } } else { /* no recaptcha needed */ br.submitForm(loginform); } } if (br.getCookie(COOKIE_HOST, "login") == null || br.getCookie(COOKIE_HOST, "xfss") == null) throw new PluginException( LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE); if (refreshCookies) { /* we have to fetch my_account page again */ br.getPage(COOKIE_HOST + "/?op=my_account"); doSomething(); } if (!new Regex( BRBEFORE, "(Premium\\-Account expire|/\\?op=payments\">Get Premium<|>Renew premium<)") .matches()) throw new PluginException( LinkStatus.ERROR_PREMIUM, PluginException.VALUE_ID_PREMIUM_DISABLE); if (!new Regex(BRBEFORE, "(Premium\\-Account expire|>Renew premium<)").matches()) { account.setProperty("nopremium", true); } else { account.setProperty("nopremium", false); } /** Save cookies */ final HashMap<String, String> cookies = new HashMap<String, String>(); final Cookies add = this.br.getCookies(COOKIE_HOST); for (final Cookie c : add.getCookies()) { cookies.put(c.getKey(), c.getValue()); } account.setProperty("name", Encoding.urlEncode(account.getUser())); account.setProperty("pass", Encoding.urlEncode(account.getPass())); account.setProperty("cookies", cookies); } catch (PluginException e) { account.setProperty("cookies", null); throw e; } } }