From 7e759ef2d5dbb30da9752b72146bf4ff240821a8 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 2 Nov 2014 22:34:38 +0100 Subject: Update internal XFS plugins --- module/plugins/internal/XFSHoster.py | 299 +++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 module/plugins/internal/XFSHoster.py (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py new file mode 100644 index 000000000..b7a407a19 --- /dev/null +++ b/module/plugins/internal/XFSHoster.py @@ -0,0 +1,299 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME +from random import random + +from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia +from module.plugins.internal.SimpleHoster import create_getInfo, replace_patterns, set_cookies, SimpleHoster +from module.plugins.Plugin import Fail +from module.utils import html_unescape + + +class XFSHoster(SimpleHoster): + __name__ = "XFSHoster" + __type__ = "hoster" + __version__ = "0.08" + + __pattern__ = None + + __description__ = """XFileSharing hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz"), + ("stickell", "l.stickell@yahoo.it"), + ("Walter Purcaro", "vuolter@gmail.com")] + + + HOSTER_DOMAIN = None + HOSTER_NAME = None + + COOKIES = [(HOSTER_DOMAIN, "lang", "english")] + + INFO_PATTERN = r'Filename:(?P[^<]+)\s*.*?\((?P[^<]+)\)' + NAME_PATTERN = r'[\d\.\,]+) ?(?P[\w^_]+)?\)' + + OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' + TEMP_OFFLINE_PATTERN = r'>\s*\w+ server (is in )?(maintenance|maintainance)' + + WAIT_PATTERN = r'.*?>(\d+)' + + OVR_LINK_PATTERN = r'

Download Link

\s*]*>([^<]+)' + LINK_PATTERN = None #: final download url pattern + + CAPTCHA_PATTERN = r'(http://[^"\']+?/captchas?/[^"\']+)' + CAPTCHA_DIV_PATTERN = r'>Enter code.*?(.+?)' + RECAPTCHA_PATTERN = None + SOLVEMEDIA_PATTERN = None + + ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<[Cc]enter>)(.+?)(?:["\']|", " ", self.errmsg)) + + if 'wait' in self.errmsg: + wait_time = sum([int(v) * {"hour": 3600, "minute": 60, "second": 1}[u] for v, u in + re.findall(r'(\d+)\s*(hour|minute|second)', self.errmsg)]) + self.wait(wait_time, True) + + elif 'captcha' in self.errmsg: + self.invalidCaptcha() + + elif 'premium' in self.errmsg and 'require' in self.errmsg: + self.fail(_("File can be downloaded by premium users only")) + + elif 'limit' in self.errmsg: + self.wait(1 * 60 * 60, True) + self.retry(25, reason="Download limit exceeded") + + elif 'countdown' in self.errmsg or 'Expired' in self.errmsg: + self.retry(reason=_("Link expired")) + + elif 'maintenance' in self.errmsg or 'maintainance' in self.errmsg: + self.tempOffline() + + elif 'download files up to' in self.errmsg: + self.fail(_("File too large for free download")) + + else: + self.fail(self.errmsg) + else: + self.errmsg = None + + return self.errmsg + + + def getPostParameters(self): + for _i in xrange(3): + self.checkErrors() + + if hasattr(self, "FORM_PATTERN"): + action, inputs = self.parseHtmlForm(self.FORM_PATTERN) + else: + action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) + + if not inputs: + action, inputs = self.parseHtmlForm('F1') + if not inputs: + if self.errmsg: + self.retry(reason=self.errmsg) + else: + self.error(_("Form not found")) + + self.logDebug(inputs) + + if 'op' in inputs and inputs['op'] in ("download2", "download3"): + if "password" in inputs: + if self.passwords: + inputs['password'] = self.passwords.pop(0) + else: + self.fail(_("No or invalid passport")) + + if not self.premium: + m = re.search(self.WAIT_PATTERN, self.html) + if m: + wait_time = int(m.group(1)) + self.setWait(wait_time, False) + else: + wait_time = 0 + + self.captcha = self.handleCaptcha(inputs) + + if wait_time: + self.wait() + + self.errmsg = None + return inputs + + else: + inputs['referer'] = self.pyfile.url + + if self.premium: + inputs['method_premium'] = "Premium Download" + if 'method_free' in inputs: + del inputs['method_free'] + else: + inputs['method_free'] = "Free Download" + if 'method_premium' in inputs: + del inputs['method_premium'] + + self.html = self.load(self.pyfile.url, post=inputs, ref=True) + self.errmsg = None + + else: + self.error(_("FORM: %s") % (inputs['op'] if 'op' in inputs else _("UNKNOWN"))) + + + def handleCaptcha(self, inputs): + m = re.search(self.CAPTCHA_PATTERN, self.html) + if m: + captcha_url = m.group(1) + inputs['code'] = self.decryptCaptcha(captcha_url) + return 1 + + m = re.search(self.CAPTCHA_DIV_PATTERN, self.html, re.S) + if m: + captcha_div = m.group(1) + self.logDebug(captcha_div) + numerals = re.findall(r'(\d)', html_unescape(captcha_div)) + inputs['code'] = "".join([a[1] for a in sorted(numerals, key=lambda num: int(num[0]))]) + self.logDebug("Captcha code: %s" % inputs['code'], numerals) + return 2 + + recaptcha = ReCaptcha(self) + try: + captcha_key = re.search(self.RECAPTCHA_PATTERN, self.html).group(1) + except: + captcha_key = recaptcha.detect_key() + + if captcha_key: + self.logDebug("ReCaptcha key: %s" % captcha_key) + inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge(captcha_key) + return 3 + + solvemedia = SolveMedia(self) + try: + captcha_key = re.search(self.SOLVEMEDIA_PATTERN, self.html).group(1) + except: + captcha_key = solvemedia.detect_key() + + if captcha_key: + self.logDebug("SolveMedia key: %s" % captcha_key) + inputs['adcopy_challenge'], inputs['adcopy_response'] = solvemedia.challenge(captcha_key) + return 4 + + return 0 -- cgit v1.2.3 From c8532b09917647b656d650e0b4a82de6022d85a4 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 3 Nov 2014 12:05:36 +0100 Subject: [XFSHoster] Fix handleOverriden --- module/plugins/internal/XFSHoster.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index b7a407a19..838af9102 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -2,9 +2,10 @@ import re -from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME from random import random +from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME + from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia from module.plugins.internal.SimpleHoster import create_getInfo, replace_patterns, set_cookies, SimpleHoster from module.plugins.Plugin import Fail @@ -14,7 +15,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.08" + __version__ = "0.09" __pattern__ = None @@ -71,6 +72,12 @@ class XFSHoster(SimpleHoster): self.errmsg = None self.passwords = self.getPassword().splitlines() + if re.match(self.__pattern__, self.pyfile.url) is None: + if self.premium: + self.handleOverriden() + else: + self.fail(_("Only premium users can download from other hosters")) + return super(XFSHoster, self).prepare() @@ -118,26 +125,31 @@ class XFSHoster(SimpleHoster): return m.group(1) - #@TODO: Re-enable def handleOverriden(self): #only tested with easybytez.com - self.html = self.load("http://www.%s/" % self.HOSTER_NAME) + self.html = self.load("http://www.%s/" % self.HOSTER_DOMAIN) + action, inputs = self.parseHtmlForm('') + upload_id = "%012d" % int(random() * 10 ** 12) action += upload_id + "&js_on=1&utype=prem&upload_type=url" + inputs['tos'] = '1' inputs['url_mass'] = self.pyfile.url inputs['up1oad_type'] = 'url' self.logDebug(action, inputs) - #wait for file to upload to easybytez.com - self.req.http.c.setopt(LOW_SPEED_TIME, 600) + + self.req.http.c.setopt(LOW_SPEED_TIME, 600) #: wait for file to upload to easybytez.com + self.html = self.load(action, post=inputs) action, inputs = self.parseHtmlForm('F1') if not inputs: - self.error(_("TEXTAREA not found")) + self.error(_("TEXTAREA F1 not found")) + self.logDebug(inputs) + if inputs['st'] == 'OK': self.html = self.load(action, post=inputs) elif inputs['st'] == 'Can not leech file': @@ -212,7 +224,7 @@ class XFSHoster(SimpleHoster): if self.errmsg: self.retry(reason=self.errmsg) else: - self.error(_("Form not found")) + self.error(_("TEXTAREA F1 not found")) self.logDebug(inputs) -- cgit v1.2.3 From 03f3b86f500c495932fd118b54569d92f700847c Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 3 Nov 2014 16:57:55 +0100 Subject: Code cosmetics about file_info and other stuff --- module/plugins/internal/XFSHoster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 838af9102..a2e4f5846 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -17,7 +17,7 @@ class XFSHoster(SimpleHoster): __type__ = "hoster" __version__ = "0.09" - __pattern__ = None + __pattern__ = r'^unmatchable$' __description__ = """XFileSharing hoster plugin""" __license__ = "GPLv3" -- cgit v1.2.3 From 2f4d7d614171054c3c2b0b6185fa4ea465f5312f Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 4 Nov 2014 01:09:43 +0100 Subject: Use more print_exc + code cosmetics --- module/plugins/internal/XFSHoster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index a2e4f5846..147c4dfde 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -102,7 +102,7 @@ class XFSHoster(SimpleHoster): def getDownloadLink(self): - for i in xrange(5): + for i in xrange(1, 5): self.logDebug("Getting download link: #%d" % i) data = self.getPostParameters() -- cgit v1.2.3 From a476b801080244611001acca694e9937be1c9405 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 4 Nov 2014 03:26:21 +0100 Subject: [XFSHoster] Improved MultiHoster check and download limit detection --- module/plugins/internal/XFSHoster.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 147c4dfde..008cfb3e1 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -6,6 +6,7 @@ from random import random from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME +from module.plugins.hoster.UnrestrictLi import secondsToMidnight from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia from module.plugins.internal.SimpleHoster import create_getInfo, replace_patterns, set_cookies, SimpleHoster from module.plugins.Plugin import Fail @@ -15,7 +16,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.09" + __version__ = "0.10" __pattern__ = r'^unmatchable$' @@ -35,18 +36,18 @@ class XFSHoster(SimpleHoster): NAME_PATTERN = r'[\d\.\,]+) ?(?P[\w^_]+)?\)' - OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' + OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' TEMP_OFFLINE_PATTERN = r'>\s*\w+ server (is in )?(maintenance|maintainance)' WAIT_PATTERN = r'.*?>(\d+)' OVR_LINK_PATTERN = r'

Download Link

\s*]*>([^<]+)' - LINK_PATTERN = None #: final download url pattern + LINK_PATTERN = None #: final download url pattern - CAPTCHA_PATTERN = r'(http://[^"\']+?/captchas?/[^"\']+)' + CAPTCHA_PATTERN = r'(http://[^"\']+?/captchas?/[^"\']+)' CAPTCHA_DIV_PATTERN = r'>Enter code.*?(.+?)' - RECAPTCHA_PATTERN = None - SOLVEMEDIA_PATTERN = None + RECAPTCHA_PATTERN = None + SOLVEMEDIA_PATTERN = None ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<[Cc]enter>)(.+?)(?:["\']| Date: Tue, 4 Nov 2014 14:19:32 +0100 Subject: logDebug when detects ddl or multi hoster link --- module/plugins/internal/XFSHoster.py | 1 + 1 file changed, 1 insertion(+) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 008cfb3e1..12ac4845d 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -75,6 +75,7 @@ class XFSHoster(SimpleHoster): # MultiHoster check if self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern']: + self.logInfo(_("Multi hoster detected")) if self.premium: self.handleOverriden() else: -- cgit v1.2.3 From f74309f89923317eeaaca31d74dff10590ed3d40 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 4 Nov 2014 23:42:46 +0100 Subject: [XFSHoster] Use URL_REPLACEMENTS to clean url --- module/plugins/internal/XFSHoster.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 12ac4845d..4e9a0ffe6 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -16,7 +16,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.10" + __version__ = "0.11" __pattern__ = r'^unmatchable$' @@ -28,7 +28,9 @@ class XFSHoster(SimpleHoster): HOSTER_DOMAIN = None - HOSTER_NAME = None + HOSTER_NAME = None + + URL_REPLACEMENTS = [(r'/(?:embed-)?(\w{12}).*', r'/\1')] #: plus support embedded files COOKIES = [(HOSTER_DOMAIN, "lang", "english")] -- cgit v1.2.3 From 7afad85d15451a235e11b9d7752d828fadbf5d85 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 6 Nov 2014 22:41:16 +0100 Subject: [XFSHoster] Fix Multi hoster detection --- module/plugins/internal/XFSHoster.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 4e9a0ffe6..b380c5f69 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -16,7 +16,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.11" + __version__ = "0.12" __pattern__ = r'^unmatchable$' @@ -76,12 +76,14 @@ class XFSHoster(SimpleHoster): self.passwords = self.getPassword().splitlines() # MultiHoster check - if self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern']: + if self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern'] + and re.match(self.__pattern__, self.pyfile.url) is None: self.logInfo(_("Multi hoster detected")) if self.premium: + self.logDebug(_("Looking for leech download link...")) self.handleOverriden() else: - self.fail(_("Only premium users can download from other hosters")) + self.fail(_("Only premium users can use url leech feature")) return super(XFSHoster, self).prepare() @@ -155,12 +157,19 @@ class XFSHoster(SimpleHoster): self.logDebug(inputs) - if inputs['st'] == 'OK': + stmsg = inputs['st'] + + if stmsg == "OK": self.html = self.load(action, post=inputs) - elif inputs['st'] == 'Can not leech file': - self.retry(20, 3 * 60, inputs['st']) + + elif "Can not leech file" in stmsg: + self.retry(20, 3 * 60, _("Can not leech file")) + + elif "all Leech traffic today" in stmsg: + self.retry(wait_time=secondsToMidnight(gmt=2), reason=_("You've used all Leech traffic today")) + else: - self.fail(_(inputs['st'])) + self.fail(stmsg) #get easybytez.com link for uploaded file m = re.search(self.OVR_LINK_PATTERN, self.html) @@ -170,10 +179,10 @@ class XFSHoster(SimpleHoster): self.pyfile.url = m.group(1) header = self.load(self.pyfile.url, just_header=True, decode=True) - if 'location' in header: # Direct link + if 'location' in header: #: Direct download link self.download(header['location'], ref=True, cookies=True, disposition=True) else: - self.retry(reason=_("OVR link location not found")) + self.error(_("No leech download link found")) def checkErrors(self): @@ -196,13 +205,13 @@ class XFSHoster(SimpleHoster): elif 'limit' in self.errmsg: if 'days' in self.errmsg: delay = secondsToMidnight(gmt=2) - retries = 2 + retries = 3 else: delay = 1 * 60 * 60 retries = 25 self.wait(delay, True) - self.retry(retries, reason="Download limit exceeded") + self.retry(retries, reason=_("Download limit exceeded")) elif 'countdown' in self.errmsg or 'Expired' in self.errmsg: self.retry(reason=_("Link expired")) -- cgit v1.2.3 From 81d05814e4dc4f403b965dbfb0c713c0a6513355 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 7 Nov 2014 02:34:01 +0100 Subject: [XFSHoster] Fix a really silly typo --- module/plugins/internal/XFSHoster.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index b380c5f69..94c5d9595 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -16,7 +16,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.12" + __version__ = "0.13" __pattern__ = r'^unmatchable$' @@ -75,12 +75,11 @@ class XFSHoster(SimpleHoster): self.errmsg = None self.passwords = self.getPassword().splitlines() - # MultiHoster check - if self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern'] - and re.match(self.__pattern__, self.pyfile.url) is None: + if (self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern'] + and re.match(self.__pattern__, self.pyfile.url) is None): self.logInfo(_("Multi hoster detected")) if self.premium: - self.logDebug(_("Looking for leech download link...")) + self.logDebug(_("Looking for download link...")) self.handleOverriden() else: self.fail(_("Only premium users can use url leech feature")) @@ -182,7 +181,7 @@ class XFSHoster(SimpleHoster): if 'location' in header: #: Direct download link self.download(header['location'], ref=True, cookies=True, disposition=True) else: - self.error(_("No leech download link found")) + self.fail(_("No download link found")) def checkErrors(self): -- cgit v1.2.3 From 58c9c8d78417ec6ccac5b6b117ea540033a09574 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 7 Nov 2014 17:08:21 +0100 Subject: Fix download link formatting in some plugins --- module/plugins/internal/XFSHoster.py | 57 +++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 24 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 94c5d9595..ecf1f9f97 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -3,20 +3,20 @@ import re from random import random +from time import sleep from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME from module.plugins.hoster.UnrestrictLi import secondsToMidnight from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia -from module.plugins.internal.SimpleHoster import create_getInfo, replace_patterns, set_cookies, SimpleHoster -from module.plugins.Plugin import Fail +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.13" + __version__ = "0.14" __pattern__ = r'^unmatchable$' @@ -96,11 +96,14 @@ class XFSHoster(SimpleHoster): self.download(link, ref=True, cookies=True, disposition=True) - elif self.errmsg and "captcha" in self.errmsg: - self.error(_("No valid captcha code entered")) + elif self.errmsg: + if 'captcha' in self.errmsg: + self.fail(_("No valid captcha code entered")) + else: + self.fail(self.errmsg) else: - self.error(_("Download link not found")) + self.fail(_("Download link not found")) def handlePremium(self): @@ -111,8 +114,16 @@ class XFSHoster(SimpleHoster): for i in xrange(1, 5): self.logDebug("Getting download link: #%d" % i) + self.checkErrors() + + m = re.search(self.LINK_PATTERN, self.html, re.S) + if m: + break + data = self.getPostParameters() + # sleep(10) + self.req.http.c.setopt(FOLLOWLOCATION, 0) self.html = self.load(self.pyfile.url, post=data, ref=True, decode=True) @@ -120,15 +131,19 @@ class XFSHoster(SimpleHoster): self.req.http.c.setopt(FOLLOWLOCATION, 1) - m = re.search(r"Location\s*:\s*(.+)", self.header, re.I) + m = re.search(r'Location\s*:\s*(.+)', self.header, re.I) if m: break m = re.search(self.LINK_PATTERN, self.html, re.S) if m: break + else: + return - return m.group(1) + self.errmsg = None + + return m.group(1).strip() #@TODO: Remove .strip() in 0.4.10 def handleOverriden(self): @@ -158,13 +173,13 @@ class XFSHoster(SimpleHoster): stmsg = inputs['st'] - if stmsg == "OK": + if stmsg == 'OK': self.html = self.load(action, post=inputs) - elif "Can not leech file" in stmsg: + elif 'Can not leech file' in stmsg: self.retry(20, 3 * 60, _("Can not leech file")) - elif "all Leech traffic today" in stmsg: + elif 'today' in stmsg: self.retry(wait_time=secondsToMidnight(gmt=2), reason=_("You've used all Leech traffic today")) else: @@ -175,19 +190,21 @@ class XFSHoster(SimpleHoster): if m is None: self.error(_("OVR_LINK_PATTERN not found")) - self.pyfile.url = m.group(1) - - header = self.load(self.pyfile.url, just_header=True, decode=True) + header = self.load(m.group(1).strip(), just_header=True, decode=True) #@TODO: Remove .strip() in 0.4.10 if 'location' in header: #: Direct download link self.download(header['location'], ref=True, cookies=True, disposition=True) else: - self.fail(_("No download link found")) + self.fail(_("Download link not found")) def checkErrors(self): m = re.search(self.ERROR_PATTERN, self.html) - if m: + + if m is None: + self.errmsg = None + else: self.errmsg = m.group(1) + self.logWarning(re.sub(r"<.*?>", " ", self.errmsg)) if 'wait' in self.errmsg: @@ -223,16 +240,12 @@ class XFSHoster(SimpleHoster): else: self.fail(self.errmsg) - else: - self.errmsg = None return self.errmsg def getPostParameters(self): for _i in xrange(3): - self.checkErrors() - if hasattr(self, "FORM_PATTERN"): action, inputs = self.parseHtmlForm(self.FORM_PATTERN) else: @@ -268,9 +281,7 @@ class XFSHoster(SimpleHoster): if wait_time: self.wait() - self.errmsg = None return inputs - else: inputs['referer'] = self.pyfile.url @@ -284,8 +295,6 @@ class XFSHoster(SimpleHoster): del inputs['method_premium'] self.html = self.load(self.pyfile.url, post=inputs, ref=True) - self.errmsg = None - else: self.error(_("FORM: %s") % (inputs['op'] if 'op' in inputs else _("UNKNOWN"))) -- cgit v1.2.3 From 84b12612e3498d8e3543b2f54bbe3b848ee83460 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 8 Nov 2014 01:49:36 +0100 Subject: [XFSHoster] Improve ERROR_PATTERN --- module/plugins/internal/XFSHoster.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index ecf1f9f97..84c8dfa91 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -16,7 +16,7 @@ from module.utils import html_unescape class XFSHoster(SimpleHoster): __name__ = "XFSHoster" __type__ = "hoster" - __version__ = "0.14" + __version__ = "0.15" __pattern__ = r'^unmatchable$' @@ -36,7 +36,7 @@ class XFSHoster(SimpleHoster): INFO_PATTERN = r'Filename:(?P[^<]+)\s*.*?\((?P[^<]+)\)' NAME_PATTERN = r'[\d\.\,]+) ?(?P[\w^_]+)?\)' + SIZE_PATTERN = r'You have requested .*\((?P[\d.,]+) ?(?P[\w^_]+)?\)' OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' TEMP_OFFLINE_PATTERN = r'>\s*\w+ server (is in )?(maintenance|maintainance)' @@ -51,7 +51,7 @@ class XFSHoster(SimpleHoster): RECAPTCHA_PATTERN = None SOLVEMEDIA_PATTERN = None - ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<[Cc]enter>)(.+?)(?:["\']|]*>|<[Cc]enter>)(.+?)(?:["\']|\(ERROR:(.+?)\)' def setup(self): @@ -165,9 +165,14 @@ class XFSHoster(SimpleHoster): self.html = self.load(action, post=inputs) + self.checkErrors() + action, inputs = self.parseHtmlForm('F1') if not inputs: - self.error(_("TEXTAREA F1 not found")) + if self.errmsg: + self.retry(reason=self.errmsg) + else: + self.error(_("TEXTAREA F1 not found")) self.logDebug(inputs) @@ -239,7 +244,7 @@ class XFSHoster(SimpleHoster): self.fail(_("File too large for free download")) else: - self.fail(self.errmsg) + self.retry(wait_time=60, reason=self.errmsg) return self.errmsg -- cgit v1.2.3 From 71c9121e0479db4ac1cb34ac4b4881e9b291772c Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 13 Nov 2014 01:01:41 +0100 Subject: Spare code cosmetics --- module/plugins/internal/XFSHoster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/XFSHoster.py') diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index 84c8dfa91..f54bb5e45 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -161,7 +161,7 @@ class XFSHoster(SimpleHoster): self.logDebug(action, inputs) - self.req.http.c.setopt(LOW_SPEED_TIME, 600) #: wait for file to upload to easybytez.com + self.req.setOption("timeout", 600) #: wait for file to upload to easybytez.com self.html = self.load(action, post=inputs) -- cgit v1.2.3