diff options
Diffstat (limited to 'module/plugins/hoster/ZippyshareCom.py')
-rw-r--r-- | module/plugins/hoster/ZippyshareCom.py | 111 |
1 files changed, 60 insertions, 51 deletions
diff --git a/module/plugins/hoster/ZippyshareCom.py b/module/plugins/hoster/ZippyshareCom.py index e130be24c..3c7b68bb6 100644 --- a/module/plugins/hoster/ZippyshareCom.py +++ b/module/plugins/hoster/ZippyshareCom.py @@ -1,21 +1,26 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import re, subprocess, tempfile, os +import re +import subprocess +import tempfile +import os + from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, timestamp from module.plugins.internal.CaptchaService import ReCaptcha from module.common.json_layer import json_loads + class ZippyshareCom(SimpleHoster): __name__ = "ZippyshareCom" __type__ = "hoster" __pattern__ = r"(?P<HOST>http://www\d{0,2}\.zippyshare.com)/v(?:/|iew.jsp.*key=)(?P<KEY>\d+)" - __version__ = "0.38" + __version__ = "0.39" __description__ = """Zippyshare.com Download Hoster""" __author_name__ = ("spoob", "zoidberg", "stickell") __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it") __config__ = [("swfdump_path", "string", "Path to swfdump", "")] - + FILE_NAME_PATTERN = r'>Name:</font>\s*<font [^>]*>(?P<N>[^<]+)</font><br />' FILE_SIZE_PATTERN = r'>Size:</font>\s*<font [^>]*>(?P<S>[0-9.,]+) (?P<U>[kKMG]+)i?B</font><br />' FILE_INFO_PATTERN = r'document\.getElementById\(\'dlbutton\'\)\.href = "[^;]*/(?P<N>[^"]+)";' @@ -26,34 +31,35 @@ class ZippyshareCom(SimpleHoster): CAPTCHA_KEY_PATTERN = r'Recaptcha.create\("([^"]+)"' CAPTCHA_SHORTENCODE_PATTERN = r"shortencode: '([^']+)'" CAPTCHA_DOWNLOAD_PATTERN = r"document.location = '([^']+)'" - - LAST_KNOWN_VALUES = (9, 2374755) #time = (seed * multiply) % modulo + + LAST_KNOWN_VALUES = (9, 2374755) # time = (seed * multiply) % modulo def setup(self): self.html = None self.wantReconnect = False self.multiDL = True - def handleFree(self): + def handleFree(self): url = self.get_file_url() - if not url: self.fail("Download URL not found.") + if not url: + self.fail("Download URL not found.") self.logDebug("Download URL %s" % url) - self.download(url, cookies = True) - + self.download(url, cookies=True) + check = self.checkDownload({ "swf_values": re.compile(self.SEED_PATTERN) }) if check == "swf_values": - swf_sts = self.getStorage("swf_sts") + swf_sts = self.getStorage("swf_sts") if not swf_sts: self.setStorage("swf_sts", 2) self.setStorage("swf_stamp", 0) elif swf_sts == '1': self.setStorage("swf_sts", 2) - - self.retry(max_tries = 1) - + + self.retry(max_tries=1) + def get_file_url(self): """ returns the absolute downloadable filepath """ @@ -73,54 +79,55 @@ class ZippyshareCom(SimpleHoster): seed_search = re.search(self.SEED_PATTERN, self.html) if seed_search: swf_url, file_seed = seed_search.groups() - + swf_sts = self.getStorage("swf_sts") swf_stamp = int(self.getStorage("swf_stamp") or 0) swf_version = self.getStorage("version") self.logDebug("SWF", swf_sts, swf_stamp, swf_version) - - if not swf_sts: + + if not swf_sts: self.logDebug('Using default values') multiply, modulo = self.LAST_KNOWN_VALUES elif swf_sts == "1": - self.logDebug('Using stored values') + self.logDebug('Using stored values') multiply = self.getStorage("multiply") modulo = self.getStorage("modulo") - elif swf_sts == "2": + elif swf_sts == "2": if swf_version < self.__version__: - self.logDebug('Reverting to default values') + self.logDebug('Reverting to default values') self.setStorage("swf_sts", "") self.setStorage("version", self.__version__) - multiply, modulo = self.LAST_KNOWN_VALUES + multiply, modulo = self.LAST_KNOWN_VALUES elif (swf_stamp + 3600000) < timestamp(): swfdump = self.get_swfdump_path() - if swfdump: + if swfdump: multiply, modulo = self.get_swf_values(self.file_info['HOST'] + swf_url, swfdump) else: - self.logWarning("Swfdump not found. Install swftools to bypass captcha.") - + self.logWarning("Swfdump not found. Install swftools to bypass captcha.") + if multiply and modulo: - self.logDebug("TIME = (%s * %s) %s" % (file_seed, multiply, modulo)) - url = "/download?key=%s&time=%d" % (self.file_info['KEY'], (int(file_seed) * int(multiply)) % int(modulo)) - + self.logDebug("TIME = (%s * %s) %s" % (file_seed, multiply, modulo)) + url = "/download?key=%s&time=%d" % (self.file_info['KEY'], + (int(file_seed) * int(multiply)) % int(modulo)) + if not url: #Method #3: Captcha url = self.do_recaptcha() - + return self.file_info['HOST'] + url - + def get_swf_values(self, swf_url, swfdump): self.logDebug('Parsing values from %s' % swf_url) - multiply = modulo = None - + multiply = modulo = None + fd, fpath = tempfile.mkstemp() try: swf_data = self.load(swf_url) os.write(fd, swf_data) - + p = subprocess.Popen([swfdump, '-a', fpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() - + if err: self.logError(err) else: @@ -128,9 +135,9 @@ class ZippyshareCom(SimpleHoster): multiply = re.search(r'pushbyte (\d+)', m_str).group(1) modulo = re.search(r'pushint (\d+)', m_str).group(1) finally: - os.close(fd) + os.close(fd) os.remove(fpath) - + if multiply and modulo: self.setStorage("multiply", multiply) self.setStorage("modulo", modulo) @@ -139,16 +146,16 @@ class ZippyshareCom(SimpleHoster): else: self.logError("Parsing SWF failed: swfdump not installed or plugin out of date") self.setStorage("swf_sts", 2) - - self.setStorage("swf_stamp", timestamp()) - + + self.setStorage("swf_stamp", timestamp()) + return multiply, modulo - + def get_swfdump_path(self): # used for detecting if swfdump is installed def is_exe(ppath): return os.path.isfile(ppath) and os.access(ppath, os.X_OK) - + program = self.getConfig("swfdump_path") or "swfdump" swfdump = None ppath, pname = os.path.split(program) @@ -160,33 +167,35 @@ class ZippyshareCom(SimpleHoster): exe_file = os.path.join(ppath, program) if is_exe(exe_file): swfdump = exe_file - + # return path to the executable or None if not found return swfdump - + def do_recaptcha(self): self.logDebug('Trying to solve captcha') captcha_key = re.search(self.CAPTCHA_KEY_PATTERN, self.html).group(1) shortencode = re.search(self.CAPTCHA_SHORTENCODE_PATTERN, self.html).group(1) - url = re.search(self.CAPTCHA_DOWNLOAD_PATTERN, self.html).group(1) - + url = re.search(self.CAPTCHA_DOWNLOAD_PATTERN, self.html).group(1) + recaptcha = ReCaptcha(self) for i in range(5): challenge, code = recaptcha.challenge(captcha_key) response = json_loads(self.load(self.file_info['HOST'] + '/rest/captcha/test', - post={'challenge': challenge, - 'response': code, - 'shortencode': shortencode})) + post={'challenge': challenge, + 'response': code, + 'shortencode': shortencode})) self.logDebug("reCaptcha response : %s" % response) if response == True: - self.correctCaptcha + self.correctCaptcha() break else: self.invalidCaptcha() - else: self.fail("Invalid captcha") - - return url + else: + self.fail("Invalid captcha") + + return url + -getInfo = create_getInfo(ZippyshareCom)
\ No newline at end of file +getInfo = create_getInfo(ZippyshareCom) |