diff options
Diffstat (limited to 'module/plugins/hoster/ShareonlineBiz.py')
-rw-r--r-- | module/plugins/hoster/ShareonlineBiz.py | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/module/plugins/hoster/ShareonlineBiz.py b/module/plugins/hoster/ShareonlineBiz.py new file mode 100644 index 000000000..bc1951602 --- /dev/null +++ b/module/plugins/hoster/ShareonlineBiz.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import os.path +import re +import tempfile +from time import time +from base64 import b64decode +import hashlib +import random +from time import sleep + +from module.plugins.Hoster import Hoster +from module.network.Request 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/","") 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: + 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.debug("%s: no free slots, waiting 120 seconds" % (self.__name__)) + self.wait() + self.retry() + 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) + + html = self.load(self.pyfile.url, post={"captchacode": captcha}, cookies=True) + if re.search(r"Der Download ist Ihnen zu langsam", html): + #m = re.search("var timeout='(\d+)';", self.html[1]) + #self.waitUntil = time() + int(m.group(1)) if m else 30 + return True + + self.retry() + else: + return True + + def convertURL(self): + self.pyfile.url = self.pyfile.url.replace("http://www.share-online.biz/download.php?id=", "http://www.share-online.biz/dl/") + + def getFileUrl(self): + """ returns the absolute downloadable filepath + """ + if self.account: + return b64decode(re.search('var dl="(.*?)"', self.html).group(1)) + file_url_pattern = 'loadfilelink\.decode\("([^"]+)' + 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) |