#!/usr/bin/env python # -*- coding: utf-8 -*- import re from base64 import b64decode import hashlib import random from time import sleep from module.plugins.Hoster import Hoster from module.network.RequestFactory import getURL from module.plugins.Plugin import chunks def getInfo(urls): api_url_base = "http://www.share-online.biz/linkcheck/linkcheck.php" for chunk in chunks(urls, 90): api_param_file = {"links": "\n".join(x.replace("http://www.share-online.biz/dl/","").rstrip("/") for x in chunk)} #api only supports old style links src = getURL(api_url_base, post=api_param_file) result = [] for i, res in enumerate(src.split("\n")): if not res: continue fields = res.split(";") if fields[1] == "OK": status = 2 elif fields[1] in ("DELETED", "NOT FOUND"): status = 1 else: status = 3 result.append((fields[2], int(fields[3]), status, chunk[i])) yield result class ShareonlineBiz(Hoster): __name__ = "ShareonlineBiz" __type__ = "hoster" __pattern__ = r"(?:http://)?(?:www.)?share-online.biz/(download.php\?id=|dl/)" __version__ = "0.2" __description__ = """Shareonline.biz Download Hoster""" __author_name__ = ("spoob", "mkaay") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de") def setup(self): #self.req.canContinue = self.multiDL = True if self.account else False # range request not working? self.multiDL = True if self.account else False def process(self, pyfile): self.convertURL() self.downloadAPIData() pyfile.name = self.api_data["filename"] pyfile.sync() self.downloadHTML() self.download(self.getFileUrl(), cookies=True) def downloadAPIData(self): api_url_base = "http://www.share-online.biz/linkcheck/linkcheck.php?md5=1" api_param_file = {"links": self.pyfile.url.replace("http://www.share-online.biz/dl/","")} #api only supports old style links src = self.load(api_url_base, cookies=False, post=api_param_file) fields = src.split(";") self.api_data = {} self.api_data["fileid"] = fields[0] self.api_data["status"] = fields[1] if not self.api_data["status"] == "OK": self.offline() self.api_data["filename"] = fields[2] self.api_data["size"] = fields[3] # in bytes self.api_data["checksum"] = fields[4].strip().lower().replace("\n\n", "") # md5 def downloadHTML(self): self.html = self.load(self.pyfile.url, cookies=True) if not self.account: self.html = self.load("%s/free/" % self.pyfile.url, post={"dl_free":"1"}, cookies=True) if re.search(r"/failure/full/1", self.req.lastEffectiveURL): self.setWait(120) self.log.info("%s: no free slots, waiting 120 seconds" % (self.__name__)) self.wait() self.retry() if "Captcha number error or expired" in self.html: captcha = self.decryptCaptcha("http://www.share-online.biz/captcha.php", get={"rand":"0.%s" % random.randint(10**15,10**16)}, cookies=True) self.log.debug("%s Captcha: %s" % (self.__name__, captcha)) sleep(3) self.html = self.load(self.pyfile.url, post={"captchacode": captcha}, cookies=True) if r"Der Download ist Ihnen zu langsam" not in self.html and r"The download is too slow for you" not in self.html: self.fail("Plugin defect. Save dumps and report.") m = re.search("var timeout='(\d+)';", self.html[1]) wait_time = int(m.group(1)) if m else 30 self.setWait(wait_time) self.log.debug("%s: Waiting %d seconds." % (self.__name__, wait_time)) self.wait() return True else: if r"Die Nummer ist leider nicht richtig oder ausgelaufen!" in self.html: self.retry() return True def convertURL(self): if self.account: self.pyfile.url = self.pyfile.url.replace("http://www.share-online.biz/dl/", "http://www.share-online.biz/download.php?id=") self.pyfile.url = self.pyfile.url.replace("http://www.share-online.biz/dl/", "http://share-online.biz/download.php?id=") else: self.pyfile.url = self.pyfile.url.replace("http://www.share-online.biz/download.php?id=", "http://www.share-online.biz/dl/") self.pyfile.url = self.pyfile.url.replace("http://share-online.biz/download.php?id=", "http://www.share-online.biz/dl/") def getFileUrl(self): """ returns the absolute downloadable filepath """ if self.account: try: return re.search('loadfilelink\.decode\("(.*?)"\);', self.html, re.S).group(1) except: self.log.debug("Login issue, trying again") self.account.relogin(self.user) self.retry() file_url_pattern = r'var\sdl="(.*?)"' return b64decode(re.search(file_url_pattern, self.html).group(1)) def checksum(self, local_file): if self.api_data and self.api_data["checksum"]: h = hashlib.md5() f = open(local_file, "rb") h.update(f.read()) f.close() hexd = h.hexdigest() if hexd == self.api_data["checksum"]: return (True, 0) else: return (False, 1) else: return (True, 5)