summaryrefslogtreecommitdiffstats
path: root/module/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins')
-rw-r--r--module/plugins/accounts/AlldebridCom.py2
-rw-r--r--module/plugins/accounts/CatShareNet.py37
-rw-r--r--module/plugins/accounts/ExashareCom.py16
-rw-r--r--module/plugins/accounts/JunkyvideoCom.py16
-rw-r--r--module/plugins/accounts/NoPremiumPl.py4
-rw-r--r--module/plugins/accounts/RapideoPl.py4
-rw-r--r--module/plugins/accounts/RehostTo.py12
-rw-r--r--module/plugins/accounts/SimplyPremiumCom.py26
-rw-r--r--module/plugins/accounts/SmoozedCom.py4
-rw-r--r--module/plugins/captcha/LinksaveIn.py2
-rw-r--r--module/plugins/captcha/captcha.py6
-rw-r--r--module/plugins/container/LinkList.py4
-rw-r--r--module/plugins/crypter/ChipDe.py2
-rw-r--r--module/plugins/crypter/EasybytezComFolder.py2
-rw-r--r--module/plugins/crypter/FilecryptCc.py31
-rw-r--r--module/plugins/crypter/FilerNetFolder.py8
-rw-r--r--module/plugins/crypter/Go4UpCom.py2
-rw-r--r--module/plugins/crypter/JunocloudMeFolder.py23
-rw-r--r--module/plugins/crypter/LinkCryptWs.py2
-rw-r--r--module/plugins/crypter/NCryptIn.py2
-rw-r--r--module/plugins/crypter/RapidfileshareNetFolder.py23
-rw-r--r--module/plugins/crypter/RelinkUs.py4
-rw-r--r--module/plugins/crypter/ShareLinksBiz.py2
-rw-r--r--module/plugins/crypter/TusfilesNetFolder.py2
-rw-r--r--module/plugins/hooks/AndroidPhoneNotify.py79
-rw-r--r--module/plugins/hooks/ClickAndLoad.py20
-rw-r--r--module/plugins/hooks/ExternalScripts.py4
-rw-r--r--module/plugins/hooks/ExtractArchive.py42
-rw-r--r--module/plugins/hooks/IRCInterface.py8
-rw-r--r--module/plugins/hooks/ImageTyperz.py2
-rw-r--r--module/plugins/hooks/LinkdecrypterCom.py9
-rw-r--r--module/plugins/hooks/RehostTo.py4
-rw-r--r--module/plugins/hooks/SkipRev.py4
-rw-r--r--module/plugins/hooks/SmoozedCom.py4
-rw-r--r--module/plugins/hooks/UpdateManager.py8
-rw-r--r--module/plugins/hooks/WindowsPhoneToastNotify.py91
-rw-r--r--module/plugins/hooks/XFileSharingPro.py8
-rw-r--r--module/plugins/hooks/XMPPInterface.py6
-rw-r--r--module/plugins/hoster/BasePlugin.py42
-rw-r--r--module/plugins/hoster/BillionuploadsCom.py2
-rw-r--r--module/plugins/hoster/CatShareNet.py12
-rw-r--r--module/plugins/hoster/CramitIn.py2
-rw-r--r--module/plugins/hoster/DepositfilesCom.py2
-rw-r--r--module/plugins/hoster/EasybytezCom.py2
-rw-r--r--module/plugins/hoster/ExashareCom.py38
-rw-r--r--module/plugins/hoster/FileSharkPl.py15
-rw-r--r--module/plugins/hoster/FileomCom.py2
-rw-r--r--module/plugins/hoster/FilerNet.py4
-rw-r--r--module/plugins/hoster/FilerioCom.py2
-rw-r--r--module/plugins/hoster/FilesMailRu.py2
-rw-r--r--module/plugins/hoster/FourSharedCom.py2
-rw-r--r--module/plugins/hoster/Ftp.py6
-rw-r--r--module/plugins/hoster/HugefilesNet.py2
-rw-r--r--module/plugins/hoster/HundredEightyUploadCom.py2
-rw-r--r--module/plugins/hoster/JunocloudMe.py2
-rw-r--r--module/plugins/hoster/Keep2shareCc.py6
-rw-r--r--module/plugins/hoster/MediafireCom.py2
-rw-r--r--module/plugins/hoster/MovReelCom.py2
-rw-r--r--module/plugins/hoster/NitroflareCom.py4
-rw-r--r--module/plugins/hoster/NosuploadCom.py2
-rw-r--r--module/plugins/hoster/NovafileCom.py2
-rw-r--r--module/plugins/hoster/PremiumTo.py5
-rw-r--r--module/plugins/hoster/RapidfileshareNet.py2
-rw-r--r--module/plugins/hoster/RapidgatorNet.py5
-rw-r--r--module/plugins/hoster/RapiduNet.py4
-rw-r--r--module/plugins/hoster/RarefileNet.py2
-rw-r--r--module/plugins/hoster/RehostTo.py4
-rw-r--r--module/plugins/hoster/SafesharingEu.py2
-rw-r--r--module/plugins/hoster/SecureUploadEu.py2
-rw-r--r--module/plugins/hoster/ShareonlineBiz.py2
-rw-r--r--module/plugins/hoster/SmoozedCom.py4
-rw-r--r--module/plugins/hoster/StreamcloudEu.py2
-rw-r--r--module/plugins/hoster/TusfilesNet.py2
-rw-r--r--module/plugins/hoster/UnrestrictLi.py2
-rw-r--r--module/plugins/hoster/UpleaCom.py2
-rw-r--r--module/plugins/hoster/UptoboxCom.py2
-rw-r--r--module/plugins/hoster/VidPlayNet.py2
-rw-r--r--module/plugins/hoster/WebshareCz.py4
-rw-r--r--module/plugins/hoster/YibaishiwuCom.py2
-rw-r--r--module/plugins/hoster/ZippyshareCom.py4
-rw-r--r--module/plugins/internal/CaptchaService.py172
-rw-r--r--module/plugins/internal/MultiHook.py14
-rw-r--r--module/plugins/internal/MultiHoster.py3
-rw-r--r--module/plugins/internal/SimpleCrypter.py18
-rw-r--r--module/plugins/internal/SimpleDereferer.py6
-rw-r--r--module/plugins/internal/SimpleHoster.py110
-rw-r--r--module/plugins/internal/UnRar.py2
-rw-r--r--module/plugins/internal/XFSHoster.py30
88 files changed, 645 insertions, 446 deletions
diff --git a/module/plugins/accounts/AlldebridCom.py b/module/plugins/accounts/AlldebridCom.py
index 1f2371e28..c830f0c09 100644
--- a/module/plugins/accounts/AlldebridCom.py
+++ b/module/plugins/accounts/AlldebridCom.py
@@ -37,7 +37,7 @@ class AlldebridCom(Account):
exp_data[1]) * 60 * 60 + (int(exp_data[2]) - 1) * 60
#Get expiration date from API
- except:
+ except Exception:
data = self.getAccountData(user)
html = req.load("http://www.alldebrid.com/api.php",
get={'action': "info_user", 'login': user, 'pw': data['password']})
diff --git a/module/plugins/accounts/CatShareNet.py b/module/plugins/accounts/CatShareNet.py
index bcb14bee3..00bfadd09 100644
--- a/module/plugins/accounts/CatShareNet.py
+++ b/module/plugins/accounts/CatShareNet.py
@@ -10,39 +10,48 @@ from module.plugins.Account import Account
class CatShareNet(Account):
__name__ = "CatShareNet"
__type__ = "account"
- __version__ = "0.02"
+ __version__ = "0.03"
__description__ = """CatShareNet account plugin"""
__license__ = "GPLv3"
__authors__ = [("prOq", None)]
- PREMIUM_PATTERN = r'class="nav-collapse collapse pull-right">[\s\w<>=-."/:]*\sz.</a></li>\s*<li><a href="/premium">.*\s*<span style="color: red">(.*?)</span>[\s\w<>/]*href="/logout"'
- VALID_UNTIL_PATTERN = r'<div class="span6 pull-right">[\s\w<>=-":;]*<span style="font-size:13px;">.*?<strong>(.*?)</strong></span>'
+ PREMIUM_PATTERN = r'class="nav-collapse collapse pull-right">[\s\w<>=-."/:]*\sz.</a></li>\s*<li><a href="/premium">.*\s*<span style="color: red">(.*?)</span>[\s\w<>/]*href="/logout"'
+ VALID_UNTIL_PATTERN = r'<div class="span6 pull-right">[\s\w<>=-":;]*<span style="font-size:13px;">.*?<strong>(.*?)</strong></span>'
+ TRAFFIC_LEFT_PATTERN = r'<a href="/premium">([0-9.]+ [kMG]B)'
def loadAccountInfo(self, user, req):
- premium = False
- validuntil = -1
+ premium = False
+ validuntil = -1
+ trafficleft = -1
html = req.load("http://catshare.net/", decode=True)
try:
- m = re.search(self.PREMIUM_PATTERN, html)
- if "Premium" in m.group(1):
+ if "Premium" in re.search(self.PREMIUM_PATTERN, html).group(1):
premium = True
- except:
+
+ except Exception:
pass
try:
- m = re.search(self.VALID_UNTIL_PATTERN, html)
- expiredate = m.group(1)
- if "-" not in expiredate:
- validuntil = mktime(strptime(expiredate, "%d.%m.%Y"))
- except:
+ expiredate = re.search(self.VALID_UNTIL_PATTERN, html).group(1)
+ self.logDebug("Expire date: " + expiredate)
+
+ validuntil = mktime(strptime(expiredate, "%d.%m.%Y"))
+
+ except Exception:
+ pass
+
+ try:
+ trafficleft = self.parseTraffic(re.search(TRAFFIC_LEFT_PATTERN, html).group(1))
+
+ except Exception:
pass
- return {'premium': premium, 'trafficleft': -1, 'validuntil': validuntil}
+ return {'premium': premium, 'trafficleft': trafficleft, 'validuntil': validuntil}
def login(self, user, data, req):
diff --git a/module/plugins/accounts/ExashareCom.py b/module/plugins/accounts/ExashareCom.py
new file mode 100644
index 000000000..431798522
--- /dev/null
+++ b/module/plugins/accounts/ExashareCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.XFSAccount import XFSAccount
+
+
+class ExashareCom(XFSAccount):
+ __name__ = "ExashareCom"
+ __type__ = "account"
+ __version__ = "0.01"
+
+ __description__ = """Exashare.com account plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "exashare.com"
diff --git a/module/plugins/accounts/JunkyvideoCom.py b/module/plugins/accounts/JunkyvideoCom.py
new file mode 100644
index 000000000..8275ff176
--- /dev/null
+++ b/module/plugins/accounts/JunkyvideoCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.XFSAccount import XFSAccount
+
+
+class JunkyvideoCom(XFSAccount):
+ __name__ = "JunkyvideoCom"
+ __type__ = "account"
+ __version__ = "0.01"
+
+ __description__ = """Junkyvideo.com account plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "junkyvideo.com"
diff --git a/module/plugins/accounts/NoPremiumPl.py b/module/plugins/accounts/NoPremiumPl.py
index f2223b7d9..a36b114eb 100644
--- a/module/plugins/accounts/NoPremiumPl.py
+++ b/module/plugins/accounts/NoPremiumPl.py
@@ -35,7 +35,7 @@ class NoPremiumPl(Account):
self._req = req
try:
result = loads(self.runAuthQuery())
- except:
+ except Exception:
# todo: return or let it be thrown?
return
@@ -60,7 +60,7 @@ class NoPremiumPl(Account):
try:
response = loads(self.runAuthQuery())
- except:
+ except Exception:
self.wrongPassword()
if "errno" in response.keys():
diff --git a/module/plugins/accounts/RapideoPl.py b/module/plugins/accounts/RapideoPl.py
index 438ce7ad3..426c680a6 100644
--- a/module/plugins/accounts/RapideoPl.py
+++ b/module/plugins/accounts/RapideoPl.py
@@ -35,7 +35,7 @@ class RapideoPl(Account):
self._req = req
try:
result = loads(self.runAuthQuery())
- except:
+ except Exception:
# todo: return or let it be thrown?
return
@@ -59,7 +59,7 @@ class RapideoPl(Account):
self._req = req
try:
response = loads(self.runAuthQuery())
- except:
+ except Exception:
self.wrongPassword()
if "errno" in response.keys():
diff --git a/module/plugins/accounts/RehostTo.py b/module/plugins/accounts/RehostTo.py
index 4efe38cad..04e71c9ad 100644
--- a/module/plugins/accounts/RehostTo.py
+++ b/module/plugins/accounts/RehostTo.py
@@ -6,7 +6,7 @@ from module.plugins.Account import Account
class RehostTo(Account):
__name__ = "RehostTo"
__type__ = "account"
- __version__ = "0.15"
+ __version__ = "0.16"
__description__ = """Rehost.to account plugin"""
__license__ = "GPLv3"
@@ -18,25 +18,25 @@ class RehostTo(Account):
trafficleft = None
validuntil = -1
session = ""
-
+
html = req.load("http://rehost.to/api.php",
get={'cmd' : "login", 'user': user,
'pass': self.getAccountData(user)['password']})
try:
session = html.split(",")[1].split("=")[1]
-
+
html = req.load("http://rehost.to/api.php",
get={'cmd': "get_premium_credits", 'long_ses': session})
- if html.strip() == "0,0" or "ERROR" not in html:
+ if html.strip() == "0,0" or "ERROR" in html:
self.logDebug(html)
else:
traffic, valid = html.split(",")
-
+
premium = True
trafficleft = self.parseTraffic(traffic + "MB")
validuntil = float(valid)
-
+
finally:
return {'premium' : premium,
'trafficleft': trafficleft,
diff --git a/module/plugins/accounts/SimplyPremiumCom.py b/module/plugins/accounts/SimplyPremiumCom.py
index accb3aba8..8caf600f9 100644
--- a/module/plugins/accounts/SimplyPremiumCom.py
+++ b/module/plugins/accounts/SimplyPremiumCom.py
@@ -7,7 +7,7 @@ from module.plugins.Account import Account
class SimplyPremiumCom(Account):
__name__ = "SimplyPremiumCom"
__type__ = "account"
- __version__ = "0.03"
+ __version__ = "0.05"
__description__ = """Simply-Premium.com account plugin"""
__license__ = "GPLv3"
@@ -15,34 +15,34 @@ class SimplyPremiumCom(Account):
def loadAccountInfo(self, user, req):
+ premium = False
validuntil = -1
trafficleft = None
json_data = req.load('http://www.simply-premium.com/api/user.php?format=json')
- self.logDebug("JSON data: " + json_data)
+
+ self.logDebug("JSON data: %s" % json_data)
+
json_data = json_loads(json_data)
- if 'vip' in json_data['result'] and json_data['result']['vip'] == 0:
- return {"premium": False}
+ if 'vip' in json_data['result'] and json_data['result']['vip']:
+ premium = True
if 'timeend' in json_data['result'] and json_data['result']['timeend']:
validuntil = float(json_data['result']['timeend'])
- if 'traffic' in json_data['result'] and json_data['result']['traffic']:
- trafficleft = float(json_data['result']['traffic']) / 1024 #@TODO: Remove `/ 1024` in 0.4.10
+ if 'remain_traffic' in json_data['result'] and json_data['result']['remain_traffic']:
+ trafficleft = float(json_data['result']['remain_traffic']) / 1024 #@TODO: Remove `/ 1024` in 0.4.10
- return {"premium": True, "validuntil": validuntil, "trafficleft": trafficleft}
+ return {"premium": premium, "validuntil": validuntil, "trafficleft": trafficleft}
def login(self, user, data, req):
req.cj.setCookie("simply-premium.com", "lang", "EN")
- if data['password'] == '' or data['password'] == '0':
- post_data = {"key": user}
- else:
- post_data = {"login_name": user, "login_pass": data['password']}
-
- html = req.load("http://www.simply-premium.com/login.php", post=post_data, decode=True)
+ html = req.load("http://www.simply-premium.com/login.php",
+ post={'key': user} if not data['password'] else {'login_name': user, 'login_pass': data['password']},
+ decode=True)
if 'logout' not in html:
self.wrongPassword()
diff --git a/module/plugins/accounts/SmoozedCom.py b/module/plugins/accounts/SmoozedCom.py
index d192f20cf..e6c25752b 100644
--- a/module/plugins/accounts/SmoozedCom.py
+++ b/module/plugins/accounts/SmoozedCom.py
@@ -12,7 +12,7 @@ from module.plugins.Account import Account
class SmoozedCom(Account):
__name__ = "SmoozedCom"
__type__ = "account"
- __version__ = "0.02"
+ __version__ = "0.03"
__description__ = """Smoozed.com account plugin"""
__license__ = "GPLv3"
@@ -33,7 +33,7 @@ class SmoozedCom(Account):
# Parse account info
info = {'validuntil' : float(status["data"]["user"]["user_premium"]),
'trafficleft': max(0, status["data"]["traffic"][1] - status["data"]["traffic"][0]),
- 'session_key': status["data"]["session_key"],
+ 'session' : status["data"]["session_key"],
'hosters' : [hoster["name"] for hoster in status["data"]["hoster"]]}
if info['validuntil'] < time():
diff --git a/module/plugins/captcha/LinksaveIn.py b/module/plugins/captcha/LinksaveIn.py
index 56cbd58a0..de6b0e7ff 100644
--- a/module/plugins/captcha/LinksaveIn.py
+++ b/module/plugins/captcha/LinksaveIn.py
@@ -79,7 +79,7 @@ class LinksaveIn(OCR):
rgb_c = lut[pix[x, y]]
try:
cstat[rgb_c] += 1
- except:
+ except Exception:
cstat[rgb_c] = 1
if rgb_bg == rgb_c:
stat[bgpath] += 1
diff --git a/module/plugins/captcha/captcha.py b/module/plugins/captcha/captcha.py
index 0f233ec00..e89ec2e81 100644
--- a/module/plugins/captcha/captcha.py
+++ b/module/plugins/captcha/captcha.py
@@ -102,7 +102,7 @@ class OCR(object):
try:
with open(tmpTxt.name, 'r') as f:
self.result_captcha = f.read().replace("\n", "")
- except:
+ except Exception:
self.result_captcha = ""
self.logger.debug(self.result_captcha)
@@ -111,7 +111,7 @@ class OCR(object):
os.remove(tmpTxt.name)
if subset and (digits or lowercase or uppercase):
os.remove(tmpSub.name)
- except:
+ except Exception:
pass
@@ -166,7 +166,7 @@ class OCR(object):
count += 1
if pixels[x, y-1] != 255:
count += 1
- except:
+ except Exception:
pass
# not enough neighbors are dark pixels so mark this pixel
diff --git a/module/plugins/container/LinkList.py b/module/plugins/container/LinkList.py
index c6173ad73..69461249e 100644
--- a/module/plugins/container/LinkList.py
+++ b/module/plugins/container/LinkList.py
@@ -23,7 +23,7 @@ class LinkList(Container):
def decrypt(self, pyfile):
try:
file_enc = codecs.lookup(self.getConfig("encoding")).name
- except:
+ except Exception:
file_enc = "utf-8"
file_name = fs_encode(pyfile.url)
@@ -64,7 +64,7 @@ class LinkList(Container):
try:
txt = open(file_name, 'wb')
txt.close()
- except:
+ except Exception:
self.logWarning(_("LinkList could not be cleared"))
for name, links in packages.iteritems():
diff --git a/module/plugins/crypter/ChipDe.py b/module/plugins/crypter/ChipDe.py
index 133e5a005..2fc36c355 100644
--- a/module/plugins/crypter/ChipDe.py
+++ b/module/plugins/crypter/ChipDe.py
@@ -22,7 +22,7 @@ class ChipDe(Crypter):
self.html = self.load(pyfile.url)
try:
f = re.search(r'"(http://video\.chip\.de/.+)"', self.html)
- except:
+ except Exception:
self.fail(_("Failed to find the URL"))
else:
self.urls = [f.group(1)]
diff --git a/module/plugins/crypter/EasybytezComFolder.py b/module/plugins/crypter/EasybytezComFolder.py
index 04f9b853b..6c643e83f 100644
--- a/module/plugins/crypter/EasybytezComFolder.py
+++ b/module/plugins/crypter/EasybytezComFolder.py
@@ -17,8 +17,6 @@ class EasybytezComFolder(XFSCrypter):
__authors__ = [("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "easybytez.com"
-
LOGIN_ACCOUNT = True
diff --git a/module/plugins/crypter/FilecryptCc.py b/module/plugins/crypter/FilecryptCc.py
index af31dc743..51e6eb296 100644
--- a/module/plugins/crypter/FilecryptCc.py
+++ b/module/plugins/crypter/FilecryptCc.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-
+# http://filecrypt.cc/Container/64E039F859.html
import base64
import binascii
import re
@@ -8,13 +8,13 @@ from Crypto.Cipher import AES
from urlparse import urljoin
from module.plugins.Crypter import Crypter
-from module.plugins.internal.CaptchaService import ReCaptcha
+from module.plugins.internal.CaptchaService import ReCaptchaV2
class FilecryptCc(Crypter):
__name__ = "FilecryptCc"
__type__ = "crypter"
- __version__ = "0.09"
+ __version__ = "0.10"
__pattern__ = r'https?://(?:www\.)?filecrypt\.cc/Container/\w+'
@@ -74,7 +74,7 @@ class FilecryptCc(Crypter):
self.logInfo(_("Folder is password protected"))
password = self.getPassword()
-
+
if not password:
self.fail(_("Please enter the password in package section and try again"))
@@ -108,20 +108,17 @@ class FilecryptCc(Crypter):
post={'button.x': captcha_code[0], 'button.y': captcha_code[1]},
cookies=True,
decode=True)
+
+ elif 'class="g-recaptcha"' in self.html: #: ReCaptchaV2
+ captcha = ReCaptchaV2(self)
+ response = captcha.doTheCaptcha(self.pyfile.url.split("/")[2])
+ self.siteWithLinks = self.load(self.pyfile.url, cookies=True, decode=True, post={"g-recaptcha-response":response})
+
else:
- recaptcha = ReCaptcha(self)
- captcha_key = recaptcha.detect_key()
-
- if captcha_key:
- self.siteWithLinks = self.load(self.pyfile.url,
- post={'g-recaptcha-response': recaptcha.challenge(captcha_key, True)},
- cookies=True,
- decode=True)
- else:
- self.logDebug("No captcha found")
- self.siteWithLinks = self.html
-
- if "recaptcha_image" in self.siteWithLinks:
+ self.logInfo(_("No captcha found"))
+ self.siteWithLinks = self.html
+
+ if "recaptcha_image" in self.siteWithLinks or "data-sitekey" in self.siteWithLinks:
self.invalidCaptcha()
self.retry()
diff --git a/module/plugins/crypter/FilerNetFolder.py b/module/plugins/crypter/FilerNetFolder.py
index 00db173bb..d33e26ee8 100644
--- a/module/plugins/crypter/FilerNetFolder.py
+++ b/module/plugins/crypter/FilerNetFolder.py
@@ -6,7 +6,7 @@ from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo
class FilerNetFolder(SimpleCrypter):
__name__ = "FilerNetFolder"
__type__ = "crypter"
- __version__ = "0.41"
+ __version__ = "0.42"
__pattern__ = r'https?://filer\.net/folder/\w{16}'
__config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
@@ -19,11 +19,9 @@ class FilerNetFolder(SimpleCrypter):
LINK_PATTERN = r'href="(/get/\w{16})">(?!<)'
- NAME_PATTERN = r'<h3>(?P<N>.+?) - <small'
-
- def getLinks(self):
- return ['http://filer.net%s' % link for link in re.findall(self.LINK_PATTERN, self.html)]
+ NAME_PATTERN = r'<h3>(?P<N>.+?) - <small'
+ OFFLINE_PATTERN = r'Nicht gefunden'
getInfo = create_getInfo(FilerNetFolder)
diff --git a/module/plugins/crypter/Go4UpCom.py b/module/plugins/crypter/Go4UpCom.py
index 102bc32b5..a7e16c0ab 100644
--- a/module/plugins/crypter/Go4UpCom.py
+++ b/module/plugins/crypter/Go4UpCom.py
@@ -40,7 +40,7 @@ class Go4UpCom(SimpleCrypter):
for html in pages:
try:
links.append(re.search(r'<b><a href="(.+?)"', html).group(1))
- except:
+ except Exception:
continue
return links
diff --git a/module/plugins/crypter/JunocloudMeFolder.py b/module/plugins/crypter/JunocloudMeFolder.py
deleted file mode 100644
index 990f25902..000000000
--- a/module/plugins/crypter/JunocloudMeFolder.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo
-
-
-class JunocloudMeFolder(XFSCrypter):
- __name__ = "JunocloudMeFolder"
- __type__ = "crypter"
- __version__ = "0.03"
-
- __pattern__ = r'http://(?:www\.)?junocloud\.me/folders/(?P<ID>\d+/\w+)'
- __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
- ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
-
- __description__ = """Junocloud.me folder decrypter plugin"""
- __license__ = "GPLv3"
- __authors__ = [("guidobelix", "guidobelix@hotmail.it")]
-
-
- HOSTER_DOMAIN = "junocloud.me"
-
-
-getInfo = create_getInfo(JunocloudMeFolder)
diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py
index 996a92c7b..c67372e3d 100644
--- a/module/plugins/crypter/LinkCryptWs.py
+++ b/module/plugins/crypter/LinkCryptWs.py
@@ -279,7 +279,7 @@ class LinkCryptWs(Crypter):
(vcrypted, vjk) = self._getCipherParams(cnl_section)
for (crypted, jk) in zip(vcrypted, vjk):
package_links.extend(self._getLinks(crypted, jk))
- except:
+ except Exception:
self.logError(_("Unable to decrypt CNL links (JS Error) try to get over links"))
return self.handleWebLinks()
diff --git a/module/plugins/crypter/NCryptIn.py b/module/plugins/crypter/NCryptIn.py
index 8b7214157..7c881ce75 100644
--- a/module/plugins/crypter/NCryptIn.py
+++ b/module/plugins/crypter/NCryptIn.py
@@ -229,7 +229,7 @@ class NCryptIn(Crypter):
(vcrypted, vjk) = self._getCipherParams()
for (crypted, jk) in zip(vcrypted, vjk):
package_links.extend(self._getLinks(crypted, jk))
- except:
+ except Exception:
self.fail(_("Unable to decrypt CNL2 links"))
return package_links
diff --git a/module/plugins/crypter/RapidfileshareNetFolder.py b/module/plugins/crypter/RapidfileshareNetFolder.py
deleted file mode 100644
index fc3d4241e..000000000
--- a/module/plugins/crypter/RapidfileshareNetFolder.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from module.plugins.internal.XFSCrypter import XFSCrypter, create_getInfo
-
-
-class RapidfileshareNetFolder(XFSCrypter):
- __name__ = "RapidfileshareNetFolder"
- __type__ = "crypter"
- __version__ = "0.03"
-
- __pattern__ = r'http://(?:www\.)?rapidfileshare\.net/users/\w+/\d+/\w+'
- __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
- ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
-
- __description__ = """Rapidfileshare.net folder decrypter plugin"""
- __license__ = "GPLv3"
- __authors__ = [("guidobelix", "guidobelix@hotmail.it")]
-
-
- HOSTER_DOMAIN = "rapidfileshare.net"
-
-
-getInfo = create_getInfo(RapidfileshareNetFolder)
diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py
index c5a3f1011..0fd80d593 100644
--- a/module/plugins/crypter/RelinkUs.py
+++ b/module/plugins/crypter/RelinkUs.py
@@ -204,7 +204,7 @@ class RelinkUs(Crypter):
(vcrypted, vjk) = self._getCipherParams(cnl2_form)
for (crypted, jk) in zip(vcrypted, vjk):
package_links.extend(self._getLinks(crypted, jk))
- except:
+ except Exception:
self.logDebug("Unable to decrypt CNL2 links")
return package_links
@@ -223,7 +223,7 @@ class RelinkUs(Crypter):
with open(dlc_filepath, "wb") as f:
f.write(dlc)
package_links.append(dlc_filepath)
- except:
+ except Exception:
self.fail("Unable to download DLC container")
return package_links
diff --git a/module/plugins/crypter/ShareLinksBiz.py b/module/plugins/crypter/ShareLinksBiz.py
index d2e8138f6..df53b5879 100644
--- a/module/plugins/crypter/ShareLinksBiz.py
+++ b/module/plugins/crypter/ShareLinksBiz.py
@@ -235,7 +235,7 @@ class ShareLinksBiz(Crypter):
try:
(crypted, jk) = self._getCipherParams()
package_links.extend(self._getLinks(crypted, jk))
- except:
+ except Exception:
self.fail(_("Unable to decrypt CNL2 links"))
return package_links
diff --git a/module/plugins/crypter/TusfilesNetFolder.py b/module/plugins/crypter/TusfilesNetFolder.py
index 20bed0ab1..cb8efc9a8 100644
--- a/module/plugins/crypter/TusfilesNetFolder.py
+++ b/module/plugins/crypter/TusfilesNetFolder.py
@@ -22,8 +22,6 @@ class TusfilesNetFolder(XFSCrypter):
("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "tusfiles.net"
-
PAGES_PATTERN = r'>\((\d+) \w+\)<'
URL_REPLACEMENTS = [(__pattern__ + ".*", r'https://www.tusfiles.net/go/\g<ID>/')]
diff --git a/module/plugins/hooks/AndroidPhoneNotify.py b/module/plugins/hooks/AndroidPhoneNotify.py
new file mode 100644
index 000000000..fbc2acd5c
--- /dev/null
+++ b/module/plugins/hooks/AndroidPhoneNotify.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+
+from time import time
+
+from module.network.RequestFactory import getURL
+from module.plugins.Hook import Hook
+
+
+class AndroidPhoneNotify(Hook):
+ __name__ = "AndroidPhoneNotify"
+ __type__ = "hook"
+ __version__ = "0.03"
+
+ __config__ = [("apikey" , "str" , "API key" , "" ),
+ ("notifycaptcha" , "bool", "Notify captcha request" , True ),
+ ("notifypackage" , "bool", "Notify package finished" , True ),
+ ("notifyprocessed", "bool", "Notify processed packages status" , True ),
+ ("timeout" , "int" , "Timeout between captchas in seconds" , 5 ),
+ ("force" , "bool", "Send notifications if client is connected", False)]
+
+ __description__ = """Send push notifications to your Android Phone using notifymyandroid.com"""
+ __license__ = "GPLv3"
+ __authors__ = [("Steven Kosyra", "steven.kosyra@gmail.com"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ event_list = ["allDownloadsProcessed"]
+
+
+ #@TODO: Remove in 0.4.10
+ def initPeriodical(self):
+ pass
+
+
+ def setup(self):
+ self.info = {} #@TODO: Remove in 0.4.10
+
+
+ def newCaptchaTask(self, task):
+ if not self.getConfig("notifycaptcha"):
+ return False
+
+ if time() - float(self.getStorage("AndroidPhoneNotify", 0)) < self.getConf("timeout"):
+ return False
+
+ self.notify(_("Captcha"), _("New request waiting user input"))
+
+
+ def packageFinished(self, pypack):
+ if self.getConfig("notifypackage"):
+ self.notify(_("Package finished"), pypack.name)
+
+
+ def allDownloadsProcessed(self):
+ if not self.getConfig("notifyprocessed"):
+ return False
+
+ if any(True for pdata in self.core.api.getQueue() if pdata.linksdone < pdata.linkstotal):
+ self.notify(_("Package failed"), _("One or more packages was not completed successfully"))
+ else:
+ self.notify(_("All packages finished"))
+
+
+ def notify(self, event, msg=""):
+ apikey = self.getConfig("apikey")
+
+ if not apikey:
+ return False
+
+ if self.core.isClientConnected() and not self.getConfig("force"):
+ return False
+
+ getURL("http://www.notifymyandroid.com/publicapi/notify",
+ get={'apikey' : apikey,
+ 'application': "pyLoad",
+ 'event' : event,
+ 'description': msg})
+
+ self.setStorage("AndroidPhoneNotify", time())
diff --git a/module/plugins/hooks/ClickAndLoad.py b/module/plugins/hooks/ClickAndLoad.py
index 8ef31ec1e..222310c25 100644
--- a/module/plugins/hooks/ClickAndLoad.py
+++ b/module/plugins/hooks/ClickAndLoad.py
@@ -3,6 +3,7 @@
import socket
from threading import Thread, Lock
+from time import sleep
from module.plugins.Hook import Hook, threaded
@@ -20,7 +21,7 @@ def forward(source, destination):
class ClickAndLoad(Hook):
__name__ = "ClickAndLoad"
__type__ = "hook"
- __version__ = "0.25"
+ __version__ = "0.26"
__config__ = [("activated", "bool", "Activated" , True ),
("port" , "int" , "Port" , 9666 ),
@@ -54,6 +55,8 @@ class ClickAndLoad(Hook):
def server(self, ip, webport, cnlport):
try:
dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
dock_socket.bind((ip, cnlport))
dock_socket.listen(5)
@@ -65,17 +68,8 @@ class ClickAndLoad(Hook):
hookManager.startThread(forward, client_socket, server_socket)
except socket.error, e:
- if hasattr(e, "errno"):
- errno = e.errno
- else:
- errno = e.args[0]
-
- if errno == 98:
- self.logWarning(_("Port %s already in use") % cnlport)
- else:
- self.logError(e)
- self.server(ip, webport, cnlport)
-
- except Exception, e:
self.logError(e)
self.server(ip, webport, cnlport)
+
+ finally:
+ dock_socket.close()
diff --git a/module/plugins/hooks/ExternalScripts.py b/module/plugins/hooks/ExternalScripts.py
index a35e47c03..b2b4548a2 100644
--- a/module/plugins/hooks/ExternalScripts.py
+++ b/module/plugins/hooks/ExternalScripts.py
@@ -13,7 +13,7 @@ from module.utils import save_join
class ExternalScripts(Hook):
__name__ = "ExternalScripts"
__type__ = "hook"
- __version__ = "0.25"
+ __version__ = "0.27"
__config__ = [("activated", "bool", "Activated", True)]
@@ -59,7 +59,7 @@ class ExternalScripts(Hook):
if not exists(path):
try:
makedirs(path)
- except:
+ except Exception:
self.logDebug("Script folder %s not created" % folder)
return
diff --git a/module/plugins/hooks/ExtractArchive.py b/module/plugins/hooks/ExtractArchive.py
index 2e9efa2b0..bdbaf64af 100644
--- a/module/plugins/hooks/ExtractArchive.py
+++ b/module/plugins/hooks/ExtractArchive.py
@@ -58,7 +58,7 @@ from module.utils import save_join, uniqify
class ExtractArchive(Hook):
__name__ = "ExtractArchive"
__type__ = "hook"
- __version__ = "1.03"
+ __version__ = "1.04"
__config__ = [("activated" , "bool" , "Activated" , True ),
("fullpath" , "bool" , "Extract full path" , True ),
@@ -158,7 +158,7 @@ class ExtractArchive(Hook):
@threaded
- def allDownloadsProcessed(self, thread):
+ def allDownloadsProcessed(self):
local = copy(self.queue)
self.queue[:] = []
@@ -302,36 +302,36 @@ class ExtractArchive(Hook):
try:
progress = lambda x: pyfile.setProgress(x)
- encrypted = False
+ encrypted = True #@TODO: set to `False`
passwords = self.getPasswords()
- try:
- self.logInfo(basename(plugin.file), "Verifying...")
+ # try:
+ # self.logInfo(basename(plugin.file), "Verifying...")
- tmp_password = plugin.password
- plugin.password = "" #: Force verifying without password
+ # tmp_password = plugin.password
+ # plugin.password = "" #: Force verifying without password
- plugin.verify()
+ # plugin.verify()
- except PasswordError:
- encrypted = True
+ # except PasswordError:
+ # encrypted = True
- except CRCError:
- self.logWarning(basename(plugin.file), _("Archive damaged"))
+ # except CRCError:
+ # self.logWarning(basename(plugin.file), _("Archive damaged"))
- if not self.getConfig("repair"):
- raise CRCError
+ # if not self.getConfig("repair"):
+ # raise CRCError
- elif plugin.repair():
- self.logInfo(basename(plugin.file), _("Successfully repaired"))
+ # elif plugin.repair():
+ # self.logInfo(basename(plugin.file), _("Successfully repaired"))
- elif not self.getConfig("keepbroken"):
- raise ArchiveError(_("Broken archive"))
+ # elif not self.getConfig("keepbroken"):
+ # raise ArchiveError(_("Broken archive"))
- else:
- self.logInfo(basename(plugin.file), _("All OK"))
+ # else:
+ # self.logInfo(basename(plugin.file), _("All OK"))
- plugin.password = tmp_password
+ # plugin.password = tmp_password
if not encrypted:
plugin.extract(progress)
diff --git a/module/plugins/hooks/IRCInterface.py b/module/plugins/hooks/IRCInterface.py
index efd4e411d..98fa1d030 100644
--- a/module/plugins/hooks/IRCInterface.py
+++ b/module/plugins/hooks/IRCInterface.py
@@ -61,7 +61,7 @@ class IRCInterface(Thread, Hook):
try:
if self.getConfig("info_pack"):
self.response(_("Package finished: %s") % pypack.name)
- except:
+ except Exception:
pass
@@ -70,7 +70,7 @@ class IRCInterface(Thread, Hook):
if self.getConfig("info_file"):
self.response(
_("Download finished: %(name)s @ %(plugin)s ") % {"name": pyfile.name, "plugin": pyfile.pluginname})
- except:
+ except Exception:
pass
@@ -183,7 +183,7 @@ class IRCInterface(Thread, Hook):
trigger = temp[0]
if len(temp) > 1:
args = temp[1:]
- except:
+ except Exception:
pass
handler = getattr(self, "event_%s" % trigger, self.event_pass)
@@ -347,7 +347,7 @@ class IRCInterface(Thread, Hook):
return ["INFO: Added %d links to Package %s [#%d]" % (len(links), pack['name'], id)]
- except:
+ except Exception:
# create new package
id = self.core.api.addPackage(pack, links, 1)
return ["INFO: Created new Package %s [#%d] with %d links." % (pack, id, len(links))]
diff --git a/module/plugins/hooks/ImageTyperz.py b/module/plugins/hooks/ImageTyperz.py
index d448d1be9..768129e4a 100644
--- a/module/plugins/hooks/ImageTyperz.py
+++ b/module/plugins/hooks/ImageTyperz.py
@@ -69,7 +69,7 @@ class ImageTyperz(Hook):
try:
balance = float(res)
- except:
+ except Exception:
raise ImageTyperzException("Invalid response")
self.logInfo(_("Account balance: $%s left") % res)
diff --git a/module/plugins/hooks/LinkdecrypterCom.py b/module/plugins/hooks/LinkdecrypterCom.py
index d4924a687..f85a598bc 100644
--- a/module/plugins/hooks/LinkdecrypterCom.py
+++ b/module/plugins/hooks/LinkdecrypterCom.py
@@ -8,7 +8,7 @@ from module.plugins.internal.MultiHook import MultiHook
class LinkdecrypterCom(MultiHook):
__name__ = "LinkdecrypterCom"
__type__ = "hook"
- __version__ = "1.01"
+ __version__ = "1.02"
__config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
@@ -21,8 +21,5 @@ class LinkdecrypterCom(MultiHook):
def getCrypters(self):
- try:
- html = self.getURL("http://linkdecrypter.com/")
- return re.search(r'>Supported\(\d+\)</b>: <i>(.+?) \+ RSDF', html).group(1).split(', ')
- except Exception:
- return list()
+ return re.search(r'>Supported\(\d+\)</b>: <i>(.[\w.\-, ]+)',
+ self.getURL("http://linkdecrypter.com/").replace("(g)", "")).group(1).split(', ')
diff --git a/module/plugins/hooks/RehostTo.py b/module/plugins/hooks/RehostTo.py
index 0cb736d9c..ddb8b3eb0 100644
--- a/module/plugins/hooks/RehostTo.py
+++ b/module/plugins/hooks/RehostTo.py
@@ -6,7 +6,7 @@ from module.plugins.internal.MultiHook import MultiHook
class RehostTo(MultiHook):
__name__ = "RehostTo"
__type__ = "hook"
- __version__ = "0.49"
+ __version__ = "0.50"
__config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
@@ -25,5 +25,5 @@ class RehostTo(MultiHook):
user, data = self.account.selectAccount()
page = self.getURL("http://rehost.to/api.php",
get={'cmd' : "get_supported_och_dl",
- 'long_ses': self.account.getAccountData(user)['session']})
+ 'long_ses': self.account.getAccountInfo(user)['session']})
return [x.strip() for x in page.replace("\"", "").split(",")]
diff --git a/module/plugins/hooks/SkipRev.py b/module/plugins/hooks/SkipRev.py
index ad6d7dacd..51d385bb4 100644
--- a/module/plugins/hooks/SkipRev.py
+++ b/module/plugins/hooks/SkipRev.py
@@ -18,7 +18,7 @@ def _setup(self):
class SkipRev(Hook):
__name__ = "SkipRev"
__type__ = "hook"
- __version__ = "0.22"
+ __version__ = "0.24"
__config__ = [("tokeep", "int", "Number of rev files to keep for package (-1 to auto)", -1)]
@@ -34,7 +34,7 @@ class SkipRev(Hook):
def _pyname(self, pyfile):
if hasattr(pyfile.pluginmodule, "getInfo"):
- return getattr(pyfile.pluginmodule, "getInfo")([pyfile.url])[0][0]
+ return getattr(pyfile.pluginmodule, "getInfo")([pyfile.url]).next()[0]
else:
self.logWarning("Unable to grab file name")
return urlparse(unquote(pyfile.url)).path.split('/')[-1]
diff --git a/module/plugins/hooks/SmoozedCom.py b/module/plugins/hooks/SmoozedCom.py
index 4e706c959..9ba2daac9 100644
--- a/module/plugins/hooks/SmoozedCom.py
+++ b/module/plugins/hooks/SmoozedCom.py
@@ -6,7 +6,7 @@ from module.plugins.internal.MultiHook import MultiHook
class SmoozedCom(MultiHook):
__name__ = "SmoozedCom"
__type__ = "hook"
- __version__ = "0.02"
+ __version__ = "0.03"
__config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
@@ -23,4 +23,4 @@ class SmoozedCom(MultiHook):
def getHosters(self):
user, data = self.account.selectAccount()
- return self.account.getAccountData(user)["hosters"]
+ return self.account.getAccountInfo(user)["hosters"]
diff --git a/module/plugins/hooks/UpdateManager.py b/module/plugins/hooks/UpdateManager.py
index c72699228..b6a8bac7c 100644
--- a/module/plugins/hooks/UpdateManager.py
+++ b/module/plugins/hooks/UpdateManager.py
@@ -16,14 +16,14 @@ from module.utils import save_join
class UpdateManager(Hook):
__name__ = "UpdateManager"
__type__ = "hook"
- __version__ = "0.42"
+ __version__ = "0.43"
__config__ = [("activated" , "bool" , "Activated" , True ),
("mode" , "pyLoad + plugins;plugins only", "Check updates for" , "pyLoad + plugins"),
("interval" , "int" , "Check interval in hours" , 8 ),
("autorestart" , "bool" , "Automatically restart pyLoad when required" , True ),
("reloadplugins", "bool" , "Monitor plugins for code changes in debug mode", True ),
- ("nodebugupdate", "bool" , "Don't check for updates in debug mode" , True )]
+ ("nodebugupdate", "bool" , "Don't check for updates in debug mode" , False )]
__description__ = """ Check for updates """
__license__ = "GPLv3"
@@ -117,7 +117,7 @@ class UpdateManager(Hook):
def server_request(self):
try:
return getURL(self.SERVER_URL, get={'v': self.core.api.getServerVersion()}).splitlines()
- except:
+ except Exception:
self.logWarning(_("Unable to contact server to get updates"))
@@ -192,7 +192,7 @@ class UpdateManager(Hook):
# Protect UpdateManager from self-removing
try:
blacklisted.remove(("hook", "UpdateManager"))
- except:
+ except Exception:
pass
for t, n in blacklisted:
diff --git a/module/plugins/hooks/WindowsPhoneToastNotify.py b/module/plugins/hooks/WindowsPhoneToastNotify.py
index ed305778c..20686ee36 100644
--- a/module/plugins/hooks/WindowsPhoneToastNotify.py
+++ b/module/plugins/hooks/WindowsPhoneToastNotify.py
@@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
import httplib
-import time
+
+from time import time
from module.plugins.Hook import Hook
@@ -9,16 +10,23 @@ from module.plugins.Hook import Hook
class WindowsPhoneToastNotify(Hook):
__name__ = "WindowsPhoneToastNotify"
__type__ = "hook"
- __version__ = "0.03"
+ __version__ = "0.05"
- __config__ = [("force", "bool", "Force even if client is connected", False),
- ("pushId", "str", "pushId", ""),
- ("pushUrl", "str", "pushUrl", ""),
- ("pushTimeout", "int", "Timeout between notifications in seconds", 0)]
+ __config__ = [("id" , "str" , "Push ID" , "" ),
+ ("url" , "str" , "Push url" , "" ),
+ ("notifycaptcha" , "bool", "Notify captcha request" , True ),
+ ("notifypackage" , "bool", "Notify package finished" , True ),
+ ("notifyprocessed", "bool", "Notify processed packages status" , True ),
+ ("timeout" , "int" , "Timeout between captchas in seconds" , 5 ),
+ ("force" , "bool", "Send notifications if client is connected", False)]
__description__ = """Send push notifications to Windows Phone"""
__license__ = "GPLv3"
- __authors__ = [("Andy Voigt", "phone-support@hotmail.de")]
+ __authors__ = [("Andy Voigt", "phone-support@hotmail.de"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ event_list = ["allDownloadsProcessed"]
#@TODO: Remove in 0.4.10
@@ -30,37 +38,58 @@ class WindowsPhoneToastNotify(Hook):
self.info = {} #@TODO: Remove in 0.4.10
- def getXmlData(self):
- myxml = ("<?xml version='1.0' encoding='utf-8'?> <wp:Notification xmlns:wp='WPNotification'> "
- "<wp:Toast> <wp:Text1>Pyload Mobile</wp:Text1> <wp:Text2>Captcha waiting!</wp:Text2> "
- "</wp:Toast> </wp:Notification>")
- return myxml
+ def newCaptchaTask(self, task):
+ if not self.getConfig("notifycaptcha"):
+ return False
+ if time() - float(self.getStorage("WindowsPhoneToastNotify", 0)) < self.getConf("timeout"):
+ return False
- def doRequest(self):
- URL = self.getConfig("pushUrl")
- request = self.getXmlData()
- webservice = httplib.HTTP(URL)
- webservice.putrequest("POST", self.getConfig("pushId"))
- webservice.putheader("Host", URL)
- webservice.putheader("Content-type", "text/xml")
- webservice.putheader("X-NotificationClass", "2")
- webservice.putheader("X-WindowsPhone-Target", "toast")
- webservice.putheader("Content-length", "%d" % len(request))
- webservice.endheaders()
- webservice.send(request)
- webservice.close()
- self.setStorage("LAST_NOTIFY", time.time())
+ self.notify(_("Captcha"), _("New request waiting user input"))
- def newCaptchaTask(self, task):
- if not self.getConfig("pushId") or not self.getConfig("pushUrl"):
+ def packageFinished(self, pypack):
+ if self.getConfig("notifypackage"):
+ self.notify(_("Package finished"), pypack.name)
+
+
+ def allDownloadsProcessed(self):
+ if not self.getConfig("notifyprocessed"):
return False
- if self.core.isClientConnected() and not self.getConfig("force"):
+ if any(True for pdata in self.core.api.getQueue() if pdata.linksdone < pdata.linkstotal):
+ self.notify(_("Package failed"), _("One or more packages was not completed successfully"))
+ else:
+ self.notify(_("All packages finished"))
+
+
+ def getXmlData(self, msg):
+ return ("<?xml version='1.0' encoding='utf-8'?> <wp:Notification xmlns:wp='WPNotification'> "
+ "<wp:Toast> <wp:Text1>pyLoad</wp:Text1> <wp:Text2>%s</wp:Text2> "
+ "</wp:Toast> </wp:Notification>" % msg)
+
+
+ def notify(self, event, msg=""):
+ id = self.getConfig("id")
+ url = self.getConfig("url")
+
+ if not id or not url:
return False
- if (time.time() - float(self.getStorage("LAST_NOTIFY", 0))) < self.getConf("pushTimeout"):
+ if self.core.isClientConnected() and not self.getConfig("force"):
return False
- self.doRequest()
+ request = self.getXmlData("%s: %s" % (event, msg) if msg else event)
+ webservice = httplib.HTTP(url)
+
+ webservice.putrequest("POST", id)
+ webservice.putheader("Host", url)
+ webservice.putheader("Content-type", "text/xml")
+ webservice.putheader("X-NotificationClass", "2")
+ webservice.putheader("X-WindowsPhone-Target", "toast")
+ webservice.putheader("Content-length", "%d" % len(request))
+ webservice.endheaders()
+ webservice.send(request)
+ webservice.close()
+
+ self.setStorage("WindowsPhoneToastNotify", time())
diff --git a/module/plugins/hooks/XFileSharingPro.py b/module/plugins/hooks/XFileSharingPro.py
index 0745a6c7e..e6e30ca8f 100644
--- a/module/plugins/hooks/XFileSharingPro.py
+++ b/module/plugins/hooks/XFileSharingPro.py
@@ -8,7 +8,7 @@ from module.plugins.Hook import Hook
class XFileSharingPro(Hook):
__name__ = "XFileSharingPro"
__type__ = "hook"
- __version__ = "0.30"
+ __version__ = "0.31"
__config__ = [("activated" , "bool", "Activated" , True ),
("use_hoster_list" , "bool", "Load listed hosters only" , False),
@@ -30,15 +30,15 @@ class XFileSharingPro(Hook):
HOSTER_BUILTIN = [#WORKING HOSTERS:
"180upload.com", "backin.net", "eyesfile.ca", "file4safe.com", "fileband.com", "filedwon.com",
- "fileparadox.in", "filevice.com", "hostingbulk.com", "linestorage.com", "ravishare.com", "ryushare.com",
- "salefiles.com", "sendmyway.com", "sharesix.com", "thefile.me", "verzend.be", "xvidstage.com",
+ "fileparadox.in", "filevice.com", "hostingbulk.com", "junkyvideo.com", "linestorage.com", "ravishare.com",
+ "ryushare.com", "salefiles.com", "sendmyway.com", "sharesix.com", "thefile.me", "verzend.be", "xvidstage.com",
#NOT TESTED:
"101shared.com", "4upfiles.com", "filemaze.ws", "filenuke.com", "linkzhost.com", "mightyupload.com",
"rockdizfile.com", "sharebeast.com", "sharerepo.com", "shareswift.com", "uploadbaz.com", "uploadc.com",
"vidbull.com", "zalaa.com", "zomgupload.com",
#NOT WORKING:
"amonshare.com", "banicrazy.info", "boosterking.com", "host4desi.com", "laoupload.com", "rd-fs.com"]
- CRYPTER_BUILTIN = []
+ CRYPTER_BUILTIN = ["junocloud.me", "rapidfileshare.net"]
# def pluginConfigChanged(self.__name__, plugin, name, value):
diff --git a/module/plugins/hooks/XMPPInterface.py b/module/plugins/hooks/XMPPInterface.py
index bbeab4341..b8e9fc1ad 100644
--- a/module/plugins/hooks/XMPPInterface.py
+++ b/module/plugins/hooks/XMPPInterface.py
@@ -69,7 +69,7 @@ class XMPPInterface(IRCInterface, JabberClient):
try:
if self.getConfig("info_pack"):
self.announce(_("Package finished: %s") % pypack.name)
- except:
+ except Exception:
pass
@@ -78,7 +78,7 @@ class XMPPInterface(IRCInterface, JabberClient):
if self.getConfig("info_file"):
self.announce(
_("Download finished: %(name)s @ %(plugin)s") % {"name": pyfile.name, "plugin": pyfile.pluginname})
- except:
+ except Exception:
pass
@@ -152,7 +152,7 @@ class XMPPInterface(IRCInterface, JabberClient):
trigger = temp[0]
if len(temp) > 1:
args = temp[1:]
- except:
+ except Exception:
pass
handler = getattr(self, "event_%s" % trigger, self.event_pass)
diff --git a/module/plugins/hoster/BasePlugin.py b/module/plugins/hoster/BasePlugin.py
index 6d3132e65..f098111c2 100644
--- a/module/plugins/hoster/BasePlugin.py
+++ b/module/plugins/hoster/BasePlugin.py
@@ -6,14 +6,14 @@ from urllib import unquote
from urlparse import urljoin, urlparse
from module.network.HTTPRequest import BadHeader
-from module.plugins.internal.SimpleHoster import create_getInfo
+from module.plugins.internal.SimpleHoster import create_getInfo, fileUrl
from module.plugins.Hoster import Hoster
class BasePlugin(Hoster):
__name__ = "BasePlugin"
__type__ = "hoster"
- __version__ = "0.30"
+ __version__ = "0.31"
__pattern__ = r'^unmatchable$'
@@ -35,7 +35,7 @@ class BasePlugin(Hoster):
def setup(self):
- self.chunkLimit = -1
+ self.chunkLimit = -1
self.resumeDownload = True
@@ -49,7 +49,12 @@ class BasePlugin(Hoster):
for _i in xrange(5):
try:
- self.downloadFile(pyfile)
+ link = fileUrl(unquote(pyfile.url))
+
+ if link:
+ self.download(link, disposition=True)
+ else:
+ self.fail(_("File not found"))
except BadHeader, e:
if e.code is 404:
@@ -85,33 +90,4 @@ class BasePlugin(Hoster):
self.fail(check.capitalize())
- def downloadFile(self, pyfile):
- url = pyfile.url
-
- for i in xrange(1, 7): #@TODO: retrieve the pycurl.MAXREDIRS value set by req
- header = self.load(url, ref=True, cookies=True, just_header=True, decode=True)
-
- if 'location' not in header or not header['location']:
- if 'code' in header and header['code'] not in (200, 201, 203, 206):
- self.logDebug("Received HTTP status code: %d" % header['code'])
- self.fail(_("File not found"))
- else:
- break
-
- location = header['location']
-
- self.logDebug("Redirect #%d to: %s" % (i, location))
-
- if urlparse(location).scheme:
- url = location
- else:
- p = urlparse(url)
- base = "%s://%s" % (p.scheme, p.netloc)
- url = urljoin(base, location)
- else:
- self.fail(_("Too many redirects"))
-
- self.download(unquote(url), disposition=True)
-
-
getInfo = create_getInfo(BasePlugin)
diff --git a/module/plugins/hoster/BillionuploadsCom.py b/module/plugins/hoster/BillionuploadsCom.py
index b20ace0f1..7d7e2624a 100644
--- a/module/plugins/hoster/BillionuploadsCom.py
+++ b/module/plugins/hoster/BillionuploadsCom.py
@@ -15,8 +15,6 @@ class BillionuploadsCom(XFSHoster):
__authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
- HOSTER_DOMAIN = "billionuploads.com"
-
NAME_PATTERN = r'<td class="dofir" title="(?P<N>.+?)"'
SIZE_PATTERN = r'<td class="dofir">(?P<S>[\d.,]+) (?P<U>[\w^_]+)'
diff --git a/module/plugins/hoster/CatShareNet.py b/module/plugins/hoster/CatShareNet.py
index f2ddd64a0..ba8996193 100644
--- a/module/plugins/hoster/CatShareNet.py
+++ b/module/plugins/hoster/CatShareNet.py
@@ -9,7 +9,7 @@ from module.plugins.internal.CaptchaService import ReCaptcha
class CatShareNet(SimpleHoster):
__name__ = "CatShareNet"
__type__ = "hoster"
- __version__ = "0.09"
+ __version__ = "0.10"
__pattern__ = r'http://(?:www\.)?catshare\.net/\w{16}'
@@ -26,8 +26,9 @@ class CatShareNet(SimpleHoster):
OFFLINE_PATTERN = ur'Podany plik został usunięty\s*</div>'
IP_BLOCKED_PATTERN = ur'>Nasz serwis wykrył że Twój adres IP nie pochodzi z Polski.<'
- SECONDS_PATTERN = 'var\scount\s=\s(\d+);'
- LINK_FREE_PATTERN = r'<form action="(.+?)" method="GET">'
+ WAIT_PATTERN = r'var\scount\s=\s(\d+);'
+
+ LINK_FREE_PATTERN = LINK_PREMIUM_PATTERN = r'<form action="(.+?)" method="GET">'
def setup(self):
@@ -43,11 +44,6 @@ class CatShareNet(SimpleHoster):
def handleFree(self, pyfile):
- m = re.search(self.SECONDS_PATTERN, self.html)
- if m:
- wait_time = int(m.group(1))
- self.wait(wait_time, True)
-
recaptcha = ReCaptcha(self)
challenge, response = recaptcha.challenge()
diff --git a/module/plugins/hoster/CramitIn.py b/module/plugins/hoster/CramitIn.py
index f444718bc..44dac958d 100644
--- a/module/plugins/hoster/CramitIn.py
+++ b/module/plugins/hoster/CramitIn.py
@@ -15,8 +15,6 @@ class CramitIn(XFSHoster):
__authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
- HOSTER_DOMAIN = "cramit.in"
-
INFO_PATTERN = r'<span class=t2>\s*(?P<N>.*?)</span>.*?<small>\s*\((?P<S>.*?)\)'
LINK_PATTERN = r'href="(http://cramit\.in/file_download/.*?)"'
diff --git a/module/plugins/hoster/DepositfilesCom.py b/module/plugins/hoster/DepositfilesCom.py
index 9d060e75d..6e7f2909c 100644
--- a/module/plugins/hoster/DepositfilesCom.py
+++ b/module/plugins/hoster/DepositfilesCom.py
@@ -95,7 +95,7 @@ class DepositfilesCom(SimpleHoster):
try:
self.download(link, disposition=True)
- except:
+ except Exception:
self.retry(wait_time=60)
diff --git a/module/plugins/hoster/EasybytezCom.py b/module/plugins/hoster/EasybytezCom.py
index cd54bdc70..693910c1b 100644
--- a/module/plugins/hoster/EasybytezCom.py
+++ b/module/plugins/hoster/EasybytezCom.py
@@ -16,8 +16,6 @@ class EasybytezCom(XFSHoster):
("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "easybytez.com"
-
OFFLINE_PATTERN = r'>File not available'
LINK_PATTERN = r'(http://(\w+\.(easybytez|easyload|ezbytez|zingload)\.(com|to)|\d+\.\d+\.\d+\.\d+)/files/\d+/\w+/.+?)["\'<]'
diff --git a/module/plugins/hoster/ExashareCom.py b/module/plugins/hoster/ExashareCom.py
new file mode 100644
index 000000000..536c09b6d
--- /dev/null
+++ b/module/plugins/hoster/ExashareCom.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo
+
+
+class ExashareCom(XFSHoster):
+ __name__ = "ExashareCom"
+ __type__ = "hoster"
+ __version__ = "0.01"
+
+ __pattern__ = r'http://(?:www\.)?exashare\.com/\w{12}'
+
+ __description__ = """Exashare.com hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ INFO_PATTERN = r'>(?P<NAME>.+?)<small>\( (?P<S>[\d.,]+) (?P<U>[\w^_]+)'
+ LINK_FREE_PATTERN = r'file: "(.+?)"'
+
+
+ def setup(self):
+ self.multiDL = True
+ self.chunkLimit = 1
+ self.resumeDownload = self.premium
+
+
+ def handleFree(self, pyfile):
+ m = re.search(self.LINK_FREE_PATTERN, self.html)
+ if m is None:
+ self.error(_("Free download link not found"))
+ else:
+ self.link = m.group(1)
+
+
+getInfo = create_getInfo(ExashareCom)
diff --git a/module/plugins/hoster/FileSharkPl.py b/module/plugins/hoster/FileSharkPl.py
index d686be480..252270c4b 100644
--- a/module/plugins/hoster/FileSharkPl.py
+++ b/module/plugins/hoster/FileSharkPl.py
@@ -10,9 +10,9 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class FileSharkPl(SimpleHoster):
__name__ = "FileSharkPl"
__type__ = "hoster"
- __version__ = "0.06"
+ __version__ = "0.07"
- __pattern__ = r'http://(?:www\.)?fileshark\.pl/pobierz/\d{6}/\w{5}'
+ __pattern__ = r'http://(?:www\.)?fileshark\.pl/pobierz/\d+/\w+'
__description__ = """FileShark.pl hoster plugin"""
__license__ = "GPLv3"
@@ -39,6 +39,7 @@ class FileSharkPl(SimpleHoster):
def setup(self):
self.resumeDownload = True
+
if self.premium:
self.multiDL = True
self.limitDL = 20
@@ -53,7 +54,7 @@ class FileSharkPl(SimpleHoster):
errmsg = self.info['error'] = _("Another download already run")
self.retry(15, int(m.group(1)), errmsg)
- m = re.search(self.ERROR_PATTERN, self.html):
+ m = re.search(self.ERROR_PATTERN, self.html)
if m:
alert = m.group(1)
@@ -72,13 +73,6 @@ class FileSharkPl(SimpleHoster):
self.info.pop('error', None)
- #@NOTE: handlePremium method was never been tested
- def handlePremium(self, pyfile):
- super(FilerNet, self).handlePremium(pyfile)
- if self.link:
- self.link = urljoin("http://fileshark.pl/", self.link)
-
-
def handleFree(self, pyfile):
m = re.search(self.LINK_FREE_PATTERN, self.html)
if m is None:
@@ -119,7 +113,6 @@ class FileSharkPl(SimpleHoster):
check = self.checkDownload({'wrong_captcha': re.compile(r'<label for="form_captcha" generated="true" class="error">(.*?)</label>'),
'wait_pattern' : re.compile(self.SECONDS_PATTERN),
'DL-found' : re.compile('<a href="(.*)">')})
-
if check == "DL-found":
self.correctCaptcha()
diff --git a/module/plugins/hoster/FileomCom.py b/module/plugins/hoster/FileomCom.py
index 2b6fd34db..306953b84 100644
--- a/module/plugins/hoster/FileomCom.py
+++ b/module/plugins/hoster/FileomCom.py
@@ -18,8 +18,6 @@ class FileomCom(XFSHoster):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
- HOSTER_DOMAIN = "fileom.com"
-
NAME_PATTERN = r'Filename: <span>(?P<N>.+?)<'
SIZE_PATTERN = r'File Size: <span class="size">(?P<S>[\d.,]+) (?P<U>[\w^_]+)'
diff --git a/module/plugins/hoster/FilerNet.py b/module/plugins/hoster/FilerNet.py
index 159aab964..a668a834b 100644
--- a/module/plugins/hoster/FilerNet.py
+++ b/module/plugins/hoster/FilerNet.py
@@ -62,8 +62,8 @@ class FilerNet(SimpleHoster):
#@TODO: Check for v0.4.10
self.req.http.c.setopt(pycurl.FOLLOWLOCATION, 0)
self.load(pyfile.url, post={'recaptcha_challenge_field': challenge,
- 'recaptcha_response_field' : response,
- 'hash' : inputs['hash']})
+ 'recaptcha_response_field' : response,
+ 'hash' : inputs['hash']})
self.req.http.c.setopt(pycurl.FOLLOWLOCATION, 1)
if 'location' in self.req.http.header.lower():
diff --git a/module/plugins/hoster/FilerioCom.py b/module/plugins/hoster/FilerioCom.py
index db81f5b16..c6ebbd444 100644
--- a/module/plugins/hoster/FilerioCom.py
+++ b/module/plugins/hoster/FilerioCom.py
@@ -15,8 +15,6 @@ class FilerioCom(XFSHoster):
__authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
- HOSTER_DOMAIN = "filerio.in"
-
URL_REPLACEMENTS = [(r'filekeen\.com', "filerio.in")]
OFFLINE_PATTERN = r'>&quot;File Not Found|File has been removed'
diff --git a/module/plugins/hoster/FilesMailRu.py b/module/plugins/hoster/FilesMailRu.py
index 18fca7176..7bd099282 100644
--- a/module/plugins/hoster/FilesMailRu.py
+++ b/module/plugins/hoster/FilesMailRu.py
@@ -21,7 +21,7 @@ def getInfo(urls):
url_pattern = '<a href="(.+?)" onclick="return Act\(this\, \'dlink\'\, event\)">(.+?)</a>'
file_name = re.search(url_pattern, html).group(0).split(', event)">')[1].split('</a>')[0]
result.append((file_name, 0, 2, url))
- except:
+ except Exception:
pass
# status 1=OFFLINE, 2=OK, 3=UNKNOWN
diff --git a/module/plugins/hoster/FourSharedCom.py b/module/plugins/hoster/FourSharedCom.py
index 78aeece44..a3f53ac5e 100644
--- a/module/plugins/hoster/FourSharedCom.py
+++ b/module/plugins/hoster/FourSharedCom.py
@@ -53,7 +53,7 @@ class FourSharedCom(SimpleHoster):
m = re.search(self.ID_PATTERN, self.html)
res = self.load('http://www.4shared.com/web/d2/getFreeDownloadLimitInfo?fileId=%s' % m.group(1))
self.logDebug(res)
- except:
+ except Exception:
pass
self.wait(20)
diff --git a/module/plugins/hoster/Ftp.py b/module/plugins/hoster/Ftp.py
index 3daf50bc5..22fc5f67a 100644
--- a/module/plugins/hoster/Ftp.py
+++ b/module/plugins/hoster/Ftp.py
@@ -12,7 +12,7 @@ from module.plugins.Hoster import Hoster
class Ftp(Hoster):
__name__ = "Ftp"
__type__ = "hoster"
- __version__ = "0.45"
+ __version__ = "0.46"
__pattern__ = r'(?:ftps?|sftp)://([\w.-]+(:[\w.-]+)?@)?[\w.-]+(:\d+)?/.+'
@@ -35,7 +35,7 @@ class Ftp(Hoster):
pyfile.name = parsed_url.path.rpartition('/')[2]
try:
pyfile.name = unquote(str(pyfile.name)).decode('utf8')
- except:
+ except Exception:
pass
if not "@" in netloc:
@@ -43,7 +43,7 @@ class Ftp(Hoster):
if netloc in servers:
self.logDebug("Logging on to %s" % netloc)
- self.req.addAuth(self.account.getAccountData(netloc)['password'])
+ self.req.addAuth(self.account.getAccountInfo(netloc)['password'])
else:
pwd = self.getPassword()
if ':' in pwd:
diff --git a/module/plugins/hoster/HugefilesNet.py b/module/plugins/hoster/HugefilesNet.py
index f7221f8c5..b7e599a50 100644
--- a/module/plugins/hoster/HugefilesNet.py
+++ b/module/plugins/hoster/HugefilesNet.py
@@ -17,8 +17,6 @@ class HugefilesNet(XFSHoster):
__authors__ = [("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "hugefiles.net"
-
SIZE_PATTERN = r'File Size:</span>\s*<span[^>]*>(?P<S>[^<]+)</span></div>'
FORM_INPUTS_MAP = {'ctype': re.compile(r'\d+')}
diff --git a/module/plugins/hoster/HundredEightyUploadCom.py b/module/plugins/hoster/HundredEightyUploadCom.py
index 4fc96a2b1..32d36ddb9 100644
--- a/module/plugins/hoster/HundredEightyUploadCom.py
+++ b/module/plugins/hoster/HundredEightyUploadCom.py
@@ -15,7 +15,5 @@ class HundredEightyUploadCom(XFSHoster):
__authors__ = [("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "180upload.com"
-
getInfo = create_getInfo(HundredEightyUploadCom)
diff --git a/module/plugins/hoster/JunocloudMe.py b/module/plugins/hoster/JunocloudMe.py
index 56d6588fa..415d5e2d0 100644
--- a/module/plugins/hoster/JunocloudMe.py
+++ b/module/plugins/hoster/JunocloudMe.py
@@ -15,8 +15,6 @@ class JunocloudMe(XFSHoster):
__authors__ = [("guidobelix", "guidobelix@hotmail.it")]
- HOSTER_DOMAIN = "junocloud.me"
-
URL_REPLACEMENTS = [(r'//(www\.)?junocloud', "//dl3.junocloud")]
OFFLINE_PATTERN = r'>No such file with this filename<'
diff --git a/module/plugins/hoster/Keep2shareCc.py b/module/plugins/hoster/Keep2shareCc.py
index 16bda27e0..05b3c639d 100644
--- a/module/plugins/hoster/Keep2shareCc.py
+++ b/module/plugins/hoster/Keep2shareCc.py
@@ -5,13 +5,13 @@ import re
from urlparse import urljoin, urlparse
from module.plugins.internal.CaptchaService import ReCaptcha
-from module.plugins.internal.SimpleHoster import _isDirectLink, SimpleHoster, create_getInfo
+from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class Keep2ShareCc(SimpleHoster):
__name__ = "Keep2ShareCc"
__type__ = "hoster"
- __version__ = "0.18"
+ __version__ = "0.19"
__pattern__ = r'https?://(?:www\.)?(keep2share|k2s|keep2s)\.cc/file/(?P<ID>\w+)'
@@ -121,7 +121,7 @@ class Keep2ShareCc(SimpleHoster):
if not link or not isinstance(link, basestring):
return
- link = _isDirectLink(self, link, self.premium)
+ link = self.directLink(self, link, self.resumeDownload)
if link:
self.download(urljoin("http://k2s.cc/", link), disposition=True)
diff --git a/module/plugins/hoster/MediafireCom.py b/module/plugins/hoster/MediafireCom.py
index 81bd36f73..d404498f3 100644
--- a/module/plugins/hoster/MediafireCom.py
+++ b/module/plugins/hoster/MediafireCom.py
@@ -33,7 +33,7 @@ def checkHTMLHeader(url):
return url, 2
else:
break
- except:
+ except Exception:
return url, 3
else:
return url, 0
diff --git a/module/plugins/hoster/MovReelCom.py b/module/plugins/hoster/MovReelCom.py
index 9bb63701c..9b8679c10 100644
--- a/module/plugins/hoster/MovReelCom.py
+++ b/module/plugins/hoster/MovReelCom.py
@@ -15,8 +15,6 @@ class MovReelCom(XFSHoster):
__authors__ = [("JorisV83", "jorisv83-pyload@yahoo.com")]
- HOSTER_DOMAIN = "movreel.com"
-
LINK_PATTERN = r'<a href="([^"]+)">Download Link'
diff --git a/module/plugins/hoster/NitroflareCom.py b/module/plugins/hoster/NitroflareCom.py
index 30cc62eaf..fdbcf0e64 100644
--- a/module/plugins/hoster/NitroflareCom.py
+++ b/module/plugins/hoster/NitroflareCom.py
@@ -10,13 +10,13 @@ import re
from module.common.json_layer import json_loads
from module.plugins.internal.CaptchaService import ReCaptcha
-from module.plugins.SimpleHoster import SimpleHoster
+from module.plugins.internal.SimpleHoster import SimpleHoster
class NitroflareCom(SimpleHoster):
__name__ = "NitroflareCom"
__type__ = "hoster"
- __version__ = "0.25"
+ __version__ = "0.04"
__pattern__ = r'https?://(?:www\.)?nitroflare\.com/view/(?P<ID>[\w^_]+)'
diff --git a/module/plugins/hoster/NosuploadCom.py b/module/plugins/hoster/NosuploadCom.py
index 8a03d7090..aeedd54f6 100644
--- a/module/plugins/hoster/NosuploadCom.py
+++ b/module/plugins/hoster/NosuploadCom.py
@@ -17,8 +17,6 @@ class NosuploadCom(XFSHoster):
__authors__ = [("igel", "igelkun@myopera.com")]
- HOSTER_DOMAIN = "nosupload.com"
-
SIZE_PATTERN = r'<p><strong>Size:</strong> (?P<S>[\d.,]+) (?P<U>[\w^_]+)</p>'
LINK_PATTERN = r'<a class="select" href="(http://.+?)">Download</a>'
diff --git a/module/plugins/hoster/NovafileCom.py b/module/plugins/hoster/NovafileCom.py
index 9754ceed1..bdd66473b 100644
--- a/module/plugins/hoster/NovafileCom.py
+++ b/module/plugins/hoster/NovafileCom.py
@@ -20,8 +20,6 @@ class NovafileCom(XFSHoster):
("stickell", "l.stickell@yahoo.it")]
- HOSTER_DOMAIN = "novafile.com"
-
ERROR_PATTERN = r'class="alert[^"]*alert-separate"[^>]*>\s*(?:<p>)?(.*?)\s*</'
WAIT_PATTERN = r'<p>Please wait <span id="count"[^>]*>(\d+)</span> seconds</p>'
diff --git a/module/plugins/hoster/PremiumTo.py b/module/plugins/hoster/PremiumTo.py
index 665005ec3..39e7522e2 100644
--- a/module/plugins/hoster/PremiumTo.py
+++ b/module/plugins/hoster/PremiumTo.py
@@ -11,7 +11,7 @@ from module.utils import fs_encode
class PremiumTo(MultiHoster):
__name__ = "PremiumTo"
__type__ = "hoster"
- __version__ = "0.20"
+ __version__ = "0.21"
__pattern__ = r'^unmatchable$'
@@ -22,6 +22,9 @@ class PremiumTo(MultiHoster):
("stickell", "l.stickell@yahoo.it")]
+ CHECK_TRAFFIC = True
+
+
def handlePremium(self, pyfile):
#raise timeout to 2min
self.download("http://premium.to/api/getfile.php",
diff --git a/module/plugins/hoster/RapidfileshareNet.py b/module/plugins/hoster/RapidfileshareNet.py
index 3473b1c7c..0bbaed57f 100644
--- a/module/plugins/hoster/RapidfileshareNet.py
+++ b/module/plugins/hoster/RapidfileshareNet.py
@@ -15,8 +15,6 @@ class RapidfileshareNet(XFSHoster):
__authors__ = [("guidobelix", "guidobelix@hotmail.it")]
- HOSTER_DOMAIN = "rapidfileshare.net"
-
NAME_PATTERN = r'<input type="hidden" name="fname" value="(?P<N>.+?)">'
SIZE_PATTERN = r'>http://www.rapidfileshare.net/\w+?</font> \((?P<S>[\d.,]+) (?P<U>[\w^_]+)\)</font>'
diff --git a/module/plugins/hoster/RapidgatorNet.py b/module/plugins/hoster/RapidgatorNet.py
index 4d192d602..84c3b20d6 100644
--- a/module/plugins/hoster/RapidgatorNet.py
+++ b/module/plugins/hoster/RapidgatorNet.py
@@ -13,7 +13,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, s
class RapidgatorNet(SimpleHoster):
__name__ = "RapidgatorNet"
__type__ = "hoster"
- __version__ = "0.28"
+ __version__ = "0.29"
__pattern__ = r'http://(?:www\.)?(rapidgator\.net|rg\.to)/file/\w+'
@@ -46,7 +46,7 @@ class RapidgatorNet(SimpleHoster):
def setup(self):
if self.account:
- self.sid = self.account.getAccountData(self.user).get('SID', None)
+ self.sid = self.account.getAccountInfo(self.user).get('SID', None)
else:
self.sid = None
@@ -85,7 +85,6 @@ class RapidgatorNet(SimpleHoster):
def handlePremium(self, pyfile):
- #self.logDebug("ACCOUNT_DATA", self.account.getAccountData(self.user))
self.api_data = self.api_response('info')
self.api_data['md5'] = self.api_data['hash']
diff --git a/module/plugins/hoster/RapiduNet.py b/module/plugins/hoster/RapiduNet.py
index 34e71b5f2..0c40d95b9 100644
--- a/module/plugins/hoster/RapiduNet.py
+++ b/module/plugins/hoster/RapiduNet.py
@@ -13,7 +13,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class RapiduNet(SimpleHoster):
__name__ = "RapiduNet"
__type__ = "hoster"
- __version__ = "0.04"
+ __version__ = "0.05"
__pattern__ = r'https?://(?:www\.)?rapidu\.net/(?P<ID>\d{10})'
@@ -66,7 +66,7 @@ class RapiduNet(SimpleHoster):
post={'_go' : "",
'captcha1': challenge,
'captcha2': response,
- 'fileId' : self.info['ID']},
+ 'fileId' : self.info['pattern']['ID']},
decode=True)
if jsvars['message'] == 'success':
self.download(jsvars['url'])
diff --git a/module/plugins/hoster/RarefileNet.py b/module/plugins/hoster/RarefileNet.py
index 2be952efe..a45e4ed4d 100644
--- a/module/plugins/hoster/RarefileNet.py
+++ b/module/plugins/hoster/RarefileNet.py
@@ -17,8 +17,6 @@ class RarefileNet(XFSHoster):
__authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
- HOSTER_DOMAIN = "rarefile.net"
-
LINK_PATTERN = r'<a href="(.+?)">\1</a>'
diff --git a/module/plugins/hoster/RehostTo.py b/module/plugins/hoster/RehostTo.py
index e706fa6c6..28de35d08 100644
--- a/module/plugins/hoster/RehostTo.py
+++ b/module/plugins/hoster/RehostTo.py
@@ -8,7 +8,7 @@ from module.plugins.internal.MultiHoster import MultiHoster, create_getInfo
class RehostTo(MultiHoster):
__name__ = "RehostTo"
__type__ = "hoster"
- __version__ = "0.20"
+ __version__ = "0.21"
__pattern__ = r'https?://.*rehost\.to\..+'
@@ -20,7 +20,7 @@ class RehostTo(MultiHoster):
def handlePremium(self, pyfile):
self.download("http://rehost.to/process_download.php",
get={'user': "cookie",
- 'pass': self.account.getAccountData(self.user)['session'],
+ 'pass': self.account.getAccountInfo(self.user)['session'],
'dl' : pyfile.url},
disposition=True)
diff --git a/module/plugins/hoster/SafesharingEu.py b/module/plugins/hoster/SafesharingEu.py
index bb6e0f646..08612e413 100644
--- a/module/plugins/hoster/SafesharingEu.py
+++ b/module/plugins/hoster/SafesharingEu.py
@@ -15,8 +15,6 @@ class SafesharingEu(XFSHoster):
__authors__ = [("zapp-brannigan", "fuerst.reinje@web.de")]
- HOSTER_DOMAIN = "safesharing.eu"
-
ERROR_PATTERN = r'(?:<div class="alert alert-danger">)(.+?)(?:</div>)'
diff --git a/module/plugins/hoster/SecureUploadEu.py b/module/plugins/hoster/SecureUploadEu.py
index 64e6456a9..6bfbce328 100644
--- a/module/plugins/hoster/SecureUploadEu.py
+++ b/module/plugins/hoster/SecureUploadEu.py
@@ -15,8 +15,6 @@ class SecureUploadEu(XFSHoster):
__authors__ = [("z00nx", "z00nx0@gmail.com")]
- HOSTER_DOMAIN = "secureupload.eu"
-
INFO_PATTERN = r'<h3>Downloading (?P<N>[^<]+) \((?P<S>[^<]+)\)</h3>'
diff --git a/module/plugins/hoster/ShareonlineBiz.py b/module/plugins/hoster/ShareonlineBiz.py
index 636e5824d..5918726f5 100644
--- a/module/plugins/hoster/ShareonlineBiz.py
+++ b/module/plugins/hoster/ShareonlineBiz.py
@@ -164,7 +164,7 @@ class ShareonlineBiz(SimpleHoster):
try:
self.logError(errmsg, re.search(self.ERROR_PATTERN, self.html).group(1))
- except:
+ except Exception:
self.logError("Unknown error occurred", errmsg)
if errmsg is "invalid":
diff --git a/module/plugins/hoster/SmoozedCom.py b/module/plugins/hoster/SmoozedCom.py
index a5116db16..bd653ff59 100644
--- a/module/plugins/hoster/SmoozedCom.py
+++ b/module/plugins/hoster/SmoozedCom.py
@@ -7,7 +7,7 @@ from module.plugins.internal.MultiHoster import MultiHoster
class SmoozedCom(MultiHoster):
__name__ = "SmoozedCom"
__type__ = "hoster"
- __version__ = "0.02"
+ __version__ = "0.03"
__pattern__ = r'^unmatchable$' #: Since we want to allow the user to specify the list of hoster to use we let MultiHoster.coreReady
@@ -29,7 +29,7 @@ class SmoozedCom(MultiHoster):
pyfile.name = ".".join(temp)
# Check the link
- get_data = {'session_key': self.account.getAccountData(self.user)['session_key'],
+ get_data = {'session_key': self.account.getAccountInfo(self.user)['session'],
'url' : pyfile.url}
data = json_loads(self.load("http://www2.smoozed.com/api/check", get=get_data))
diff --git a/module/plugins/hoster/StreamcloudEu.py b/module/plugins/hoster/StreamcloudEu.py
index b9d6d9ae6..54f430508 100644
--- a/module/plugins/hoster/StreamcloudEu.py
+++ b/module/plugins/hoster/StreamcloudEu.py
@@ -17,8 +17,6 @@ class StreamcloudEu(XFSHoster):
__authors__ = [("seoester", "seoester@googlemail.com")]
- HOSTER_DOMAIN = "streamcloud.eu"
-
WAIT_PATTERN = r'var count = (\d+)'
LINK_PATTERN = r'file: "(http://(stor|cdn)\d+\.streamcloud\.eu:?\d*/.*/video\.(mp4|flv))",'
diff --git a/module/plugins/hoster/TusfilesNet.py b/module/plugins/hoster/TusfilesNet.py
index 9d0a86fe9..9fdb6eae1 100644
--- a/module/plugins/hoster/TusfilesNet.py
+++ b/module/plugins/hoster/TusfilesNet.py
@@ -17,8 +17,6 @@ class TusfilesNet(XFSHoster):
("guidobelix", "guidobelix@hotmail.it")]
- HOSTER_DOMAIN = "tusfiles.net"
-
INFO_PATTERN = r'\](?P<N>.+) - (?P<S>[\d.,]+) (?P<U>[\w^_]+)\['
OFFLINE_PATTERN = r'>File Not Found|<Title>TusFiles - Fast Sharing Files!|The file you are trying to download is no longer available'
diff --git a/module/plugins/hoster/UnrestrictLi.py b/module/plugins/hoster/UnrestrictLi.py
index 52f12b5b8..e87f9b97f 100644
--- a/module/plugins/hoster/UnrestrictLi.py
+++ b/module/plugins/hoster/UnrestrictLi.py
@@ -2,8 +2,6 @@
import re
-from datetime import datetime, timedelta
-
from module.common.json_layer import json_loads
from module.plugins.internal.MultiHoster import MultiHoster, create_getInfo
from module.plugins.internal.SimpleHoster import secondsToMidnight
diff --git a/module/plugins/hoster/UpleaCom.py b/module/plugins/hoster/UpleaCom.py
index 4ea4e345f..5c63c7e8b 100644
--- a/module/plugins/hoster/UpleaCom.py
+++ b/module/plugins/hoster/UpleaCom.py
@@ -19,8 +19,6 @@ class UpleaCom(XFSHoster):
__authors__ = [("Redleon", None)]
- HOSTER_DOMAIN = "uplea.com"
-
NAME_PATTERN = r'class="agmd size18">(?P<N>.+?)<'
SIZE_PATTERN = r'size14">(?P<S>[\d.,]+) (?P<U>[\w^_])</span>'
diff --git a/module/plugins/hoster/UptoboxCom.py b/module/plugins/hoster/UptoboxCom.py
index 21d781f55..dedb6ed1f 100644
--- a/module/plugins/hoster/UptoboxCom.py
+++ b/module/plugins/hoster/UptoboxCom.py
@@ -15,8 +15,6 @@ class UptoboxCom(XFSHoster):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
- HOSTER_DOMAIN = "uptobox.com"
-
INFO_PATTERN = r'"para_title">(?P<N>.+) \((?P<S>[\d.,]+) (?P<U>[\w^_]+)\)'
OFFLINE_PATTERN = r'>(File not found|Access Denied|404 Not Found)'
diff --git a/module/plugins/hoster/VidPlayNet.py b/module/plugins/hoster/VidPlayNet.py
index 76af05edd..f1a32a897 100644
--- a/module/plugins/hoster/VidPlayNet.py
+++ b/module/plugins/hoster/VidPlayNet.py
@@ -18,8 +18,6 @@ class VidPlayNet(XFSHoster):
__authors__ = [("t4skforce", "t4skforce1337[AT]gmail[DOT]com")]
- HOSTER_DOMAIN = "vidplay.net"
-
NAME_PATTERN = r'<b>Password:</b></div>\s*<h[1-6]>(?P<N>[^<]+)</h[1-6]>'
diff --git a/module/plugins/hoster/WebshareCz.py b/module/plugins/hoster/WebshareCz.py
index e3424fc21..98187d46a 100644
--- a/module/plugins/hoster/WebshareCz.py
+++ b/module/plugins/hoster/WebshareCz.py
@@ -9,7 +9,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class WebshareCz(SimpleHoster):
__name__ = "WebshareCz"
__type__ = "hoster"
- __version__ = "0.15"
+ __version__ = "0.16"
__pattern__ = r'https?://(?:www\.)?webshare\.cz/(?:#/)?file/(?P<ID>\w+)'
@@ -21,7 +21,7 @@ class WebshareCz(SimpleHoster):
@classmethod
def getInfo(cls, url="", html=""):
- info = super(WebshareCz, self).getInfo(url, html)
+ info = super(WebshareCz, cls).getInfo(url, html)
if url:
info['pattern'] = re.match(cls.__pattern__, url).groupdict()
diff --git a/module/plugins/hoster/YibaishiwuCom.py b/module/plugins/hoster/YibaishiwuCom.py
index adc403de4..cf1550ebc 100644
--- a/module/plugins/hoster/YibaishiwuCom.py
+++ b/module/plugins/hoster/YibaishiwuCom.py
@@ -50,7 +50,7 @@ class YibaishiwuCom(SimpleHoster):
self.logDebug("Trying URL: " + url)
self.download(url)
break
- except:
+ except Exception:
continue
else:
self.fail(_("No working link found"))
diff --git a/module/plugins/hoster/ZippyshareCom.py b/module/plugins/hoster/ZippyshareCom.py
index 2648f532f..39c8d36d6 100644
--- a/module/plugins/hoster/ZippyshareCom.py
+++ b/module/plugins/hoster/ZippyshareCom.py
@@ -10,9 +10,9 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class ZippyshareCom(SimpleHoster):
__name__ = "ZippyshareCom"
__type__ = "hoster"
- __version__ = "0.66"
+ __version__ = "0.67"
- __pattern__ = r'(?P<HOST>http://www\d{0,2}\.zippyshare\.com)/v(?:/|iew\.jsp.*key=)(?P<KEY>\d+)'
+ __pattern__ = r'(?P<HOST>http://www\d{0,2}\.zippyshare\.com)/v(?:/|iew\.jsp.*key=)(?P<KEY>[\w^_]+)'
__description__ = """Zippyshare.com hoster plugin"""
__license__ = "GPLv3"
diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py
index b429fd6e0..be6a056fc 100644
--- a/module/plugins/internal/CaptchaService.py
+++ b/module/plugins/internal/CaptchaService.py
@@ -1,16 +1,17 @@
# -*- coding: utf-8 -*-
import re
+import time
+import base64
-from base64 import urlsafe_b64encode
-from random import random
+from random import random,randint
from module.common.json_layer import json_loads
class CaptchaService:
__name__ = "CaptchaService"
- __version__ = "0.16"
+ __version__ = "0.17"
__description__ = """Base captcha service plugin"""
__license__ = "GPLv3"
@@ -55,14 +56,14 @@ class CaptchaService:
class ReCaptcha(CaptchaService):
__name__ = "ReCaptcha"
- __version__ = "0.09"
+ __version__ = "0.08"
__description__ = """ReCaptcha captcha service plugin"""
__license__ = "GPLv3"
__authors__ = [("pyLoad Team", "admin@pyload.org")]
- KEY_PATTERN = r'(?:class="g-recaptcha"\s+data-sitekey="|recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=)([\w-]+)'
+ KEY_PATTERN = r'recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=([\w-]+)'
KEY_AJAX_PATTERN = r'Recaptcha\.create\s*\(\s*["\']([\w-]+)'
@@ -85,7 +86,7 @@ class ReCaptcha(CaptchaService):
return None
- def challenge(self, key=None, userverify=False):
+ def challenge(self, key=None):
if not key:
if self.detect_key():
key = self.key
@@ -98,30 +99,14 @@ class ReCaptcha(CaptchaService):
try:
challenge = re.search("challenge : '(.+?)',", html).group(1)
server = re.search("server : '(.+?)',", html).group(1)
-
- except AttributeError:
+ except:
errmsg = _("ReCaptcha challenge pattern not found")
self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ raise ValueError(errmsg)
self.plugin.logDebug("ReCaptcha challenge: %s" % challenge)
- response = challenge, self.result(server, challenge)
-
- return self.userverify(*response) if userverify else response
-
-
- def userverify(self, challenge, result):
- response = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify",
- post={'c' : challenge,
- 'response': urlsafe_b64encode('{"response":"%s"}' % result)})
- try:
- return re.search(r'"uvresp","(.+?)"', response).group(1)
-
- except AttributeError:
- errmsg = _("ReCaptcha userverify response not found")
- self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ return challenge, self.result(server, challenge)
def result(self, server, challenge):
@@ -136,6 +121,123 @@ class ReCaptcha(CaptchaService):
return result
+class ReCaptchaV2(CaptchaService):
+ __name__ = "ReCaptchaV2"
+ __version__ = "0.01"
+
+ __description__ = """ReCaptchaV2 captcha service plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("pyLoad Team", "admin@pyload.org")]
+
+
+ KEY_PATTERN = r'data-sitekey="(.*?)">'
+
+
+ def detect_key(self, html=None):
+ if not html:
+ if hasattr(self.plugin, "html") and self.plugin.html:
+ html = self.plugin.html
+ else:
+ errmsg = _("ReCaptcha html not found")
+ self.plugin.fail(errmsg)
+ raise TypeError(errmsg)
+
+ m = re.search(self.KEY_PATTERN, html)
+ if m:
+ self.key = m.group(1).strip()
+ self.plugin.logDebug("ReCaptcha key: %s" % self.key)
+ return self.key
+ else:
+ self.plugin.logDebug("ReCaptcha key not found")
+ return None
+
+
+ def collectApiInfo(self):
+ html = self.plugin.req.load("http://www.google.com/recaptcha/api.js",cookies=True)
+ a = re.search("po.src = '(.*?)';",html).group(1)
+ vers = a.split("/")[5]
+ self.plugin.logDebug("API version: %s" %vers)
+ language = a.split("__")[1].split(".")[0]
+ self.plugin.logDebug("API language: %s" %language)
+
+ html = self.plugin.req.load("https://apis.google.com/js/api.js",cookies=True)
+ b = re.search('"h":"(.*?)","',html).group(1)
+ jsh = b.decode('unicode-escape')
+ self.plugin.logDebug("API jsh-string: %s" %jsh)
+
+ return vers,language,jsh
+
+ def prepareTimeAndRpc(self):
+ html = self.plugin.req.load("http://www.google.com/recaptcha/api2/demo",cookies=True)
+
+ millis = int(round(time.time() * 1000))
+ self.plugin.logDebug("Systemtime in milliseconds: %s" %str(millis))
+
+ rand = randint(1,99999999)
+ a = "0.%s"%str(rand*2147483647)
+ rpc = int(100000000*float(a))
+ self.plugin.logDebug("Self-generated rpc-token: %s" %str(rpc))
+
+ return millis,rpc
+
+ def doTheCaptcha(self, host):
+ self.plugin.logDebug("Parent host: %s" %host)
+ botguardstring = "!A"
+ sitekey = self.detect_key()
+ vers,language,jsh = self.collectApiInfo()
+ millis,rpc = self.prepareTimeAndRpc()
+
+ html = self.plugin.req.load("https://www.google.com/recaptcha/api2/anchor",
+ get={"k":sitekey,
+ "hl":language,
+ "v":vers,
+ "usegapi":"1",
+ "jsh":jsh+"#id=IO_"+str(millis),
+ "parent":"http://"+host,
+ "pfname":"",
+ "rpctoken":rpc},
+ cookies=True)
+ recaptchatoken = re.search('id="recaptcha-token" value="(.*?)">',html)
+ self.plugin.logDebug("Captchatoken #1: %s" %recaptchatoken.group(1))
+
+ html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={"c":recaptchatoken.group(1),
+ "hl":language,
+ "v":vers,
+ "bg":botguardstring,
+ "usegapi":"1",
+ "jsh":jsh},
+ cookies=True)
+ html = html.decode('unicode-escape')
+ recaptchatoken2 = re.search('"finput","(.*?)",',html)
+ self.plugin.logDebug("Captchatoken #2: %s" %recaptchatoken2.group(1))
+ recaptchatoken3 = re.search('."asconf".\s.\s,"(.*?)".',html)
+ self.plugin.logDebug("Captchatoken #3: %s" %recaptchatoken3.group(1))
+
+ html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={"c":recaptchatoken2.group(1),
+ "reason":"fi",
+ "fbg":recaptchatoken3.group(1)},
+ cookies=True)
+ recaptchatoken4 = re.search('"rresp","(.*?)",',html)
+ self.plugin.logDebug("Captchatoken #4: %s" %recaptchatoken4.group(1))
+
+ millis_captcha_loading = int(round(time.time() * 1000))
+ captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={"c":recaptchatoken4.group(1)},forceUser=True)
+ respone_encoded = base64.b64encode('{"response":"%s"}' %captcha_response)
+ self.plugin.logDebug("Encoded result: %s" %respone_encoded)
+
+ timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading
+ timeToSolveMore = timeToSolve + int(float("0."+str(randint(1,99999999))) * 500)
+ html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", cookies=True, post={"c":recaptchatoken4.group(1),
+ "response":respone_encoded,
+ "t":timeToSolve,
+ "ct":timeToSolveMore,
+ "bg":botguardstring})
+ recaptchatoken5 = re.search('"uvresp","(.*?)",',html)
+ self.plugin.logDebug("Captchatoken #5: %s" %recaptchatoken5.group(1))
+
+ return recaptchatoken5.group(1)
+
+
class AdsCaptcha(CaptchaService):
__name__ = "AdsCaptcha"
__version__ = "0.06"
@@ -184,11 +286,10 @@ class AdsCaptcha(CaptchaService):
try:
challenge = re.search("challenge: '(.+?)',", html).group(1)
server = re.search("server: '(.+?)',", html).group(1)
-
- except AttributeError:
+ except:
errmsg = _("AdsCaptcha challenge pattern not found")
self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ raise ValueError(errmsg)
self.plugin.logDebug("AdsCaptcha challenge: %s" % challenge)
@@ -232,11 +333,10 @@ class SolveMedia(CaptchaService):
challenge = re.search(r'<input type=hidden name="adcopy_challenge" id="adcopy_challenge" value="([^"]+)">',
html).group(1)
server = "http://api.solvemedia.com/papi/media"
-
- except AttributeError:
+ except:
errmsg = _("SolveMedia challenge pattern not found")
self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ raise ValueError(errmsg)
self.plugin.logDebug("SolveMedia challenge: %s" % challenge)
@@ -305,11 +405,10 @@ class AdYouLike(CaptchaService):
'callback': callback})
try:
challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1))
-
- except AttributeError:
+ except:
errmsg = _("AdYouLike challenge pattern not found")
self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ raise ValueError(errmsg)
self.plugin.logDebug("AdYouLike challenge: %s" % challenge)
@@ -336,11 +435,10 @@ class AdYouLike(CaptchaService):
try:
instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual']
result = re.search(u'«(.+?)»', instructions_visual).group(1).strip()
-
- except AttributeError:
+ except:
errmsg = _("AdYouLike result not found")
self.plugin.fail(errmsg)
- raise AttributeError(errmsg)
+ raise ValueError(errmsg)
result = {'_ayl_captcha_engine' : "adyoulike",
'_ayl_env' : server['all']['env'],
diff --git a/module/plugins/internal/MultiHook.py b/module/plugins/internal/MultiHook.py
index a3b266679..795565d73 100644
--- a/module/plugins/internal/MultiHook.py
+++ b/module/plugins/internal/MultiHook.py
@@ -11,7 +11,7 @@ from module.utils import decode, remove_chars
class MultiHook(Hook):
__name__ = "MultiHook"
__type__ = "hook"
- __version__ = "0.35"
+ __version__ = "0.36"
__config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
@@ -48,7 +48,7 @@ class MultiHook(Hook):
(r'uploaded\.net' , "uploaded.to" ),
(r'uploadhero\.co' , "uploadhero.com" ),
(r'zshares\.net' , "zshare.net" ),
- (r'\d+.+' , "X\0" )]
+ (r'(\d+.+)' , "X\1" )]
def setup(self):
@@ -118,15 +118,15 @@ class MultiHook(Hook):
def pluginsCached(self):
if self.plugins:
return self.plugins
-
+
for _i in xrange(3):
try:
pluginset = self._pluginSet(self.getHosters() if self.plugintype == "hoster" else self.getCrypters())
-
+
except Exception, e:
self.logError(e, "Waiting 1 minute and retry")
sleep(60)
-
+
else:
break
else:
@@ -293,12 +293,16 @@ class MultiHook(Hook):
self.logDebug("Unload MultiHook", pyfile.pluginname, hdict)
self.unloadPlugin(pyfile.pluginname)
pyfile.setStatus("queued")
+ pyfile.sync()
else:
retries = max(self.getConfig("retry", 10), 0)
wait_time = max(self.getConfig("retryinterval", 1), 0)
if 0 < retries > pyfile.plugin.retries:
+ self.logInfo(_("Retrying: %s") % pyfile.name)
pyfile.setCustomStatus("MultiHook", "queued")
+ pyfile.sync()
+
pyfile.plugin.retries += 1
pyfile.plugin.setWait(wait_time)
pyfile.plugin.wait()
diff --git a/module/plugins/internal/MultiHoster.py b/module/plugins/internal/MultiHoster.py
index 8ca4d427f..ba613c997 100644
--- a/module/plugins/internal/MultiHoster.py
+++ b/module/plugins/internal/MultiHoster.py
@@ -8,7 +8,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, r
class MultiHoster(SimpleHoster):
__name__ = "MultiHoster"
__type__ = "hoster"
- __version__ = "0.32"
+ __version__ = "0.33"
__pattern__ = r'^unmatchable$'
@@ -17,7 +17,6 @@ class MultiHoster(SimpleHoster):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
- CHECK_TRAFFIC = True
LOGIN_ACCOUNT = True
diff --git a/module/plugins/internal/SimpleCrypter.py b/module/plugins/internal/SimpleCrypter.py
index 43b1347fd..2e2f2ca0d 100644
--- a/module/plugins/internal/SimpleCrypter.py
+++ b/module/plugins/internal/SimpleCrypter.py
@@ -2,7 +2,7 @@
import re
-from urlparse import urlparse
+from urlparse import urljoin, urlparse
from module.plugins.Crypter import Crypter
from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, replace_patterns, set_cookies
@@ -12,7 +12,7 @@ from module.utils import fixup
class SimpleCrypter(Crypter, SimpleHoster):
__name__ = "SimpleCrypter"
__type__ = "crypter"
- __version__ = "0.38"
+ __version__ = "0.41"
__pattern__ = r'^unmatchable$'
__config__ = [("use_subfolder", "bool", "Save package to subfolder", True), #: Overrides core.config['general']['folder_per_package']
@@ -71,12 +71,12 @@ class SimpleCrypter(Crypter, SimpleHoster):
#@TODO: Remove in 0.4.10
def init(self):
account_name = (self.__name__ + ".py").replace("Folder.py", "").replace(".py", "")
- account = self.core.accountManager.getAccountPlugin(account_name)
+ account = self.pyfile.m.core.accountManager.getAccountPlugin(account_name)
if account and account.canUse():
self.user, data = account.selectAccount()
- self.req = account.getAccountRequest(self.user)
- self.premium = account.isPremium(self.user)
+ self.req = account.getAccountRequest(self.user)
+ self.premium = account.isPremium(self.user)
self.account = account
@@ -151,13 +151,17 @@ class SimpleCrypter(Crypter, SimpleHoster):
Returns the links extracted from self.html
You should override this only if it's impossible to extract links using only the LINK_PATTERN.
"""
- return re.findall(self.LINK_PATTERN, self.html)
+ parsed = urlparse(self.pyfile.url)
+ base = "%s://%s" % (parsed.scheme, parsed.netloc)
+
+ return [urljoin(base, link) if not urlparse(link).scheme else link \
+ for link in re.findall(self.LINK_PATTERN, self.html)]
def handlePages(self, pyfile):
try:
pages = int(re.search(self.PAGES_PATTERN, self.html).group(1))
- except:
+ except Exception:
pages = 1
for p in xrange(2, pages + 1):
diff --git a/module/plugins/internal/SimpleDereferer.py b/module/plugins/internal/SimpleDereferer.py
index 53b80f827..deef42620 100644
--- a/module/plugins/internal/SimpleDereferer.py
+++ b/module/plugins/internal/SimpleDereferer.py
@@ -5,13 +5,13 @@ import re
from urllib import unquote
from module.plugins.Crypter import Crypter
-from module.plugins.internal.SimpleHoster import directLink, set_cookies
+from module.plugins.internal.SimpleHoster import fileUrl, set_cookies
class SimpleDereferer(Crypter):
__name__ = "SimpleDereferer"
__type__ = "crypter"
- __version__ = "0.03"
+ __version__ = "0.04"
__pattern__ = r'^unmatchable$'
__config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
@@ -45,7 +45,7 @@ class SimpleDereferer(Crypter):
def decrypt(self, pyfile):
- link = directLink(self, pyfile.url)
+ link = fileUrl(self, pyfile.url)
if not link:
try:
diff --git a/module/plugins/internal/SimpleHoster.py b/module/plugins/internal/SimpleHoster.py
index 5a32ac943..c1982ee67 100644
--- a/module/plugins/internal/SimpleHoster.py
+++ b/module/plugins/internal/SimpleHoster.py
@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
+import mimetypes
+import os
import re
+from datetime import datetime, timedelta
from inspect import isclass
-from os.path import exists
from time import time
from urllib import unquote
from urlparse import urljoin, urlparse
@@ -106,7 +108,13 @@ def parseFileInfo(plugin, url="", html=""):
info = plugin.getInfo(url, html)
res = info['name'], info['size'], info['status'], info['url']
else:
- res = urlparse(unquote(url)).path.split('/')[-1] or _("Unknown"), 0, 3, url
+ url = unquote(url)
+ res = ((urlparse(url).path.split('/')[-1]
+ or urlparse(url).query.split('=', 1)[::-1][0].split('&', 1)[0]
+ or _("Unknown")),
+ 0,
+ 3 if url else 8,
+ url)
return res
@@ -114,10 +122,15 @@ def parseFileInfo(plugin, url="", html=""):
#@TODO: Remove in 0.4.10
#@NOTE: Every plugin must have own parseInfos classmethod to work with 0.4.10
def create_getInfo(plugin):
+
+ def generator(list):
+ for x in list:
+ yield x
+
if hasattr(plugin, "parseInfos"):
- fn = lambda urls: [(info['name'], info['size'], info['status'], info['url']) for info in plugin.parseInfos(urls)]
+ fn = lambda urls: generator((info['name'], info['size'], info['status'], info['url']) for info in plugin.parseInfos(urls))
else:
- fn = lambda urls: [parseFileInfo(url) for url in urls]
+ fn = lambda urls: generator(parseFileInfo(url) for url in urls)
return fn
@@ -127,35 +140,58 @@ def timestamp():
#@TODO: Move to hoster class in 0.4.10
-def directLink(self, url, resumable=False):
- link = ""
+def fileUrl(self, url, follow_location=False):
+ link = ""
+ redirect = 1
+
+ if isinstance(follow_location, int):
+ redirect = max(follow_location, 1)
+
+ elif follow_location:
+ redirect = 5
+
+ for i in xrange(redirect):
+ self.logDebug("Redirect #%d to: %s" % (i, url))
- for i in xrange(5 if resumable else 1):
header = self.load(url, ref=True, cookies=True, just_header=True, decode=True)
if 'content-disposition' in header:
link = url
- elif 'location' in header and header['location']:
+ elif 'location' in header and header['location'].strip():
location = header['location']
if not urlparse(location).scheme:
- p = urlparse(url)
- base = "%s://%s" % (p.scheme, p.netloc)
- location = urljoin(base, location)
+ url_p = urlparse(url)
+ baseurl = "%s://%s" % (url_p.scheme, url_p.netloc)
+ location = urljoin(baseurl, location)
+
+ if 'code' in header and header['code'] == 302:
+ link = location
- if resumable:
+ if follow_location:
url = location
- self.logDebug("Redirect #%d to: %s" % (++i, location))
continue
- elif 'code' in header and header['code'] == 302:
- link = location
+ else:
+ extension = os.path.splitext(urlparse(url).path.split('/')[-1])[-1]
- elif 'content-type' in header and header['content-type'] and "html" not in header['content-type']:
- link = url
+ if 'content-type' in header and header['content-type'].strip():
+ mimetype = header['content-type'].split(';')[0].strip()
+
+ elif extension:
+ mimetype = mimetypes.guess_extension(extension, False)[0] or "application/octet-stream"
+
+ else:
+ mimetype = ""
+
+ if mimetype and (link or 'html' not in mimetype):
+ link = url
+ else:
+ link = ""
break
+
else:
self.logError(_("Too many redirects"))
@@ -183,7 +219,7 @@ def secondsToMidnight(gmt=0):
class SimpleHoster(Hoster):
__name__ = "SimpleHoster"
__type__ = "hoster"
- __version__ = "0.94"
+ __version__ = "1.01"
__pattern__ = r'^unmatchable$'
@@ -247,7 +283,7 @@ class SimpleHoster(Hoster):
MULTI_HOSTER = False #: Set to True to leech other hoster link (as defined in handleMulti method)
LOGIN_ACCOUNT = False #: Set to True to require account login
- directLink = directLink #@TODO: Remove in 0.4.10
+ directLink = fileUrl #@TODO: Remove in 0.4.10
@classmethod
@@ -328,9 +364,6 @@ class SimpleHoster(Hoster):
else:
online = True
- if not info['pattern']:
- info.pop('pattern', None)
-
if online:
info['status'] = 2
@@ -351,6 +384,9 @@ class SimpleHoster(Hoster):
hashtype = info['pattern']['T'] if 'T' in info['pattern'] else "hash"
info[hashtype] = info['pattern']['H']
+ if not info['pattern']:
+ info.pop('pattern', None)
+
return info
@@ -439,9 +475,9 @@ class SimpleHoster(Hoster):
self.invalidCaptcha()
self.retry(10, reason=_("Wrong captcha"))
- elif not self.lastDownload or not exists(fs_encode(self.lastDownload)):
+ elif not self.lastDownload or not os.path.exists(fs_encode(self.lastDownload)):
self.lastDownload = ""
- self.fail(self.pyfile.error or _("No file downloaded"))
+ self.error(self.pyfile.error or _("No file downloaded"))
else:
rules = {'empty file': re.compile(r'\A\Z'),
@@ -553,7 +589,7 @@ class SimpleHoster(Hoster):
def handleDirect(self, pyfile):
- link = self.directLink(pyfile.url, self.resumeDownload)
+ link = self.fileUrl(pyfile.url, self.resumeDownload)
if link:
self.logInfo(_("Direct download link detected"))
@@ -571,16 +607,12 @@ class SimpleHoster(Hoster):
if not hasattr(self, 'LINK_FREE_PATTERN'):
self.logError(_("Free download not implemented"))
- try:
- m = re.search(self.LINK_FREE_PATTERN, self.html)
- if m is None:
- self.error(_("Free download link not found"))
-
+ m = re.search(self.LINK_FREE_PATTERN, self.html)
+ if m is None:
+ self.error(_("Free download link not found"))
+ else:
self.link = m.group(1)
- except Exception, e:
- self.fail(e)
-
def handlePremium(self, pyfile):
if not hasattr(self, 'LINK_PREMIUM_PATTERN'):
@@ -588,16 +620,12 @@ class SimpleHoster(Hoster):
self.logDebug("Handled as free download")
self.handleFree(pyfile)
- try:
- m = re.search(self.LINK_PREMIUM_PATTERN, self.html)
- if m is None:
- self.error(_("Premium download link not found"))
-
+ m = re.search(self.LINK_PREMIUM_PATTERN, self.html)
+ if m is None:
+ self.error(_("Premium download link not found"))
+ else:
self.link = m.group(1)
- except Exception, e:
- self.fail(e)
-
def longWait(self, wait_time=None, max_tries=3):
if wait_time and isinstance(wait_time, (int, long, float)):
diff --git a/module/plugins/internal/UnRar.py b/module/plugins/internal/UnRar.py
index 572fe95b9..296405101 100644
--- a/module/plugins/internal/UnRar.py
+++ b/module/plugins/internal/UnRar.py
@@ -16,7 +16,7 @@ def renice(pid, value):
if os.name != "nt" and value:
try:
Popen(["renice", str(value), str(pid)], stdout=PIPE, stderr=PIPE, bufsize=-1)
- except:
+ except Exception:
print "Renice failed"
diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py
index b32f5978f..bae75c092 100644
--- a/module/plugins/internal/XFSHoster.py
+++ b/module/plugins/internal/XFSHoster.py
@@ -15,7 +15,7 @@ from module.utils import html_unescape
class XFSHoster(SimpleHoster):
__name__ = "XFSHoster"
__type__ = "hoster"
- __version__ = "0.35"
+ __version__ = "0.36"
__pattern__ = r'^unmatchable$'
@@ -63,10 +63,28 @@ class XFSHoster(SimpleHoster):
def prepare(self):
""" Initialize important variables """
if not self.HOSTER_DOMAIN:
- self.fail(_("Missing HOSTER_DOMAIN"))
+ if self.account:
+ account = self.account
+ else:
+ account = self.pyfile.m.core.accountManager.getAccountPlugin(self.__name__)
+
+ if account and hasattr(account, "HOSTER_DOMAIN") and account.HOSTER_DOMAIN:
+ self.HOSTER_DOMAIN = account.HOSTER_DOMAIN
+ else:
+ self.fail(_("Missing HOSTER_DOMAIN"))
+
+ try:
+ self.COOKIES.index((None, "lang", "english"))
+
+ except ValueError:
+ pass
+
+ else:
+ self.COOKIES.remove((None, "lang", "english"))
+ self.COOKIES.insert((self.HOSTER_DOMAIN, "lang", "english"))
if not self.LINK_PATTERN:
- pattern = r'(https?://(www\.)?([^/]*?%s|\d+\.\d+\.\d+\.\d+)(\:\d+)?(/d/|(/files)?/\d+/\w+/).+?)["\'<]'
+ pattern = r'(https?://(?:www\.)?([^/]*?%s|\d+\.\d+\.\d+\.\d+)(\:\d+)?(/d/|(/files)?/\d+/\w+/).+?)["\'<]'
self.LINK_PATTERN = pattern % self.HOSTER_DOMAIN.replace('.', '\.')
self.captcha = None
@@ -75,7 +93,7 @@ class XFSHoster(SimpleHoster):
super(XFSHoster, self).prepare()
if self.DIRECT_LINK is None:
- self.directDL = bool(self.premium)
+ self.directDL = self.premium
def downloadLink(self, link):
@@ -311,7 +329,7 @@ class XFSHoster(SimpleHoster):
recaptcha = ReCaptcha(self)
try:
captcha_key = re.search(self.RECAPTCHA_PATTERN, self.html).group(1)
- except:
+ except Exception:
captcha_key = recaptcha.detect_key()
else:
self.logDebug("ReCaptcha key: %s" % captcha_key)
@@ -323,7 +341,7 @@ class XFSHoster(SimpleHoster):
solvemedia = SolveMedia(self)
try:
captcha_key = re.search(self.SOLVEMEDIA_PATTERN, self.html).group(1)
- except:
+ except Exception:
captcha_key = solvemedia.detect_key()
else:
self.logDebug("SolveMedia key: %s" % captcha_key)