summaryrefslogtreecommitdiffstats
path: root/pyload/plugin/account
diff options
context:
space:
mode:
Diffstat (limited to 'pyload/plugin/account')
-rw-r--r--pyload/plugin/account/AlldebridCom.py63
-rw-r--r--pyload/plugin/account/BackinNet.py16
-rw-r--r--pyload/plugin/account/BillionuploadsCom.py16
-rw-r--r--pyload/plugin/account/BitshareCom.py34
-rw-r--r--pyload/plugin/account/CatShareNet.py61
-rw-r--r--pyload/plugin/account/CloudzillaTo.py37
-rw-r--r--pyload/plugin/account/CramitIn.py16
-rw-r--r--pyload/plugin/account/CzshareCom.py54
-rw-r--r--pyload/plugin/account/DebridItaliaCom.py44
-rw-r--r--pyload/plugin/account/DepositfilesCom.py36
-rw-r--r--pyload/plugin/account/DropboxCom.py36
-rw-r--r--pyload/plugin/account/EasybytezCom.py19
-rw-r--r--pyload/plugin/account/EuroshareEu.py41
-rw-r--r--pyload/plugin/account/ExashareCom.py16
-rw-r--r--pyload/plugin/account/FastixRu.py42
-rw-r--r--pyload/plugin/account/FastshareCz.py51
-rw-r--r--pyload/plugin/account/File4SafeCom.py18
-rw-r--r--pyload/plugin/account/FileParadoxIn.py16
-rw-r--r--pyload/plugin/account/FilecloudIo.py59
-rw-r--r--pyload/plugin/account/FilefactoryCom.py49
-rw-r--r--pyload/plugin/account/FilejungleCom.py50
-rw-r--r--pyload/plugin/account/FileomCom.py16
-rw-r--r--pyload/plugin/account/FilerNet.py59
-rw-r--r--pyload/plugin/account/FilerioCom.py16
-rw-r--r--pyload/plugin/account/FilesMailRu.py31
-rw-r--r--pyload/plugin/account/FileserveCom.py44
-rw-r--r--pyload/plugin/account/FourSharedCom.py35
-rw-r--r--pyload/plugin/account/FreakshareCom.py51
-rw-r--r--pyload/plugin/account/FreeWayMe.py52
-rw-r--r--pyload/plugin/account/FshareVn.py62
-rw-r--r--pyload/plugin/account/Ftp.py17
-rw-r--r--pyload/plugin/account/HellshareCz.py79
-rw-r--r--pyload/plugin/account/Http.py17
-rw-r--r--pyload/plugin/account/HugefilesNet.py16
-rw-r--r--pyload/plugin/account/HundredEightyUploadCom.py16
-rw-r--r--pyload/plugin/account/JunkyvideoCom.py16
-rw-r--r--pyload/plugin/account/JunocloudMe.py16
-rw-r--r--pyload/plugin/account/Keep2ShareCc.py73
-rw-r--r--pyload/plugin/account/LetitbitNet.py34
-rw-r--r--pyload/plugin/account/LinestorageCom.py17
-rw-r--r--pyload/plugin/account/LinksnappyCom.py57
-rw-r--r--pyload/plugin/account/MegaDebridEu.py39
-rw-r--r--pyload/plugin/account/MegaRapidCz.py60
-rw-r--r--pyload/plugin/account/MegaRapidoNet.py57
-rw-r--r--pyload/plugin/account/MegasharesCom.py48
-rw-r--r--pyload/plugin/account/MovReelCom.py19
-rw-r--r--pyload/plugin/account/MultihostersCom.py16
-rw-r--r--pyload/plugin/account/MultishareCz.py44
-rw-r--r--pyload/plugin/account/MyfastfileCom.py37
-rw-r--r--pyload/plugin/account/NetloadIn.py63
-rw-r--r--pyload/plugin/account/NoPremiumPl.py85
-rw-r--r--pyload/plugin/account/NosuploadCom.py16
-rw-r--r--pyload/plugin/account/NovafileCom.py16
-rw-r--r--pyload/plugin/account/NowVideoSx.py56
-rw-r--r--pyload/plugin/account/OboomCom.py81
-rw-r--r--pyload/plugin/account/OneFichierCom.py59
-rw-r--r--pyload/plugin/account/OverLoadMe.py43
-rw-r--r--pyload/plugin/account/PremiumTo.py37
-rw-r--r--pyload/plugin/account/PremiumizeMe.py49
-rw-r--r--pyload/plugin/account/PutdriveCom.py16
-rw-r--r--pyload/plugin/account/QuickshareCz.py43
-rw-r--r--pyload/plugin/account/RPNetBiz.py51
-rw-r--r--pyload/plugin/account/RapideoPl.py84
-rw-r--r--pyload/plugin/account/RapidfileshareNet.py18
-rw-r--r--pyload/plugin/account/RapidgatorNet.py72
-rw-r--r--pyload/plugin/account/RapiduNet.py65
-rw-r--r--pyload/plugin/account/RarefileNet.py16
-rw-r--r--pyload/plugin/account/RealdebridCom.py40
-rw-r--r--pyload/plugin/account/RehostTo.py54
-rw-r--r--pyload/plugin/account/RyushareCom.py16
-rw-r--r--pyload/plugin/account/SafesharingEu.py16
-rw-r--r--pyload/plugin/account/SecureUploadEu.py16
-rw-r--r--pyload/plugin/account/SendmywayCom.py16
-rw-r--r--pyload/plugin/account/ShareonlineBiz.py62
-rw-r--r--pyload/plugin/account/SimplyPremiumCom.py48
-rw-r--r--pyload/plugin/account/SimplydebridCom.py35
-rw-r--r--pyload/plugin/account/SmoozedCom.py78
-rw-r--r--pyload/plugin/account/StahnuTo.py35
-rw-r--r--pyload/plugin/account/StreamcloudEu.py16
-rw-r--r--pyload/plugin/account/TurbobitNet.py43
-rw-r--r--pyload/plugin/account/TusfilesNet.py22
-rw-r--r--pyload/plugin/account/UlozTo.py50
-rw-r--r--pyload/plugin/account/UnrestrictLi.py44
-rw-r--r--pyload/plugin/account/UploadableCh.py34
-rw-r--r--pyload/plugin/account/UploadcCom.py16
-rw-r--r--pyload/plugin/account/UploadedTo.py67
-rw-r--r--pyload/plugin/account/UploadheroCom.py42
-rw-r--r--pyload/plugin/account/UploadingCom.py65
-rw-r--r--pyload/plugin/account/UptoboxCom.py18
-rw-r--r--pyload/plugin/account/VidPlayNet.py16
-rw-r--r--pyload/plugin/account/WebshareCz.py68
-rw-r--r--pyload/plugin/account/XFileSharingPro.py34
-rw-r--r--pyload/plugin/account/YibaishiwuCom.py40
-rw-r--r--pyload/plugin/account/ZeveraCom.py73
-rw-r--r--pyload/plugin/account/__init__.py1
95 files changed, 3753 insertions, 0 deletions
diff --git a/pyload/plugin/account/AlldebridCom.py b/pyload/plugin/account/AlldebridCom.py
new file mode 100644
index 000000000..efc5753f8
--- /dev/null
+++ b/pyload/plugin/account/AlldebridCom.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+import xml.dom.minidom as dom
+
+from BeautifulSoup import BeautifulSoup
+
+from pyload.plugin.Account import Account
+
+
+class AlldebridCom(Account):
+ __name = "AlldebridCom"
+ __type = "account"
+ __version = "0.23"
+
+ __description = """AllDebrid.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Andy Voigt", "spamsales@online.de")]
+
+
+ def loadAccountInfo(self, user, req):
+ data = self.getAccountData(user)
+ html = req.load("http://www.alldebrid.com/account/")
+ soup = BeautifulSoup(html)
+
+ # Try to parse expiration date directly from the control panel page (better accuracy)
+ try:
+ time_text = soup.find('div', attrs={'class': 'remaining_time_text'}).strong.string
+
+ self.logDebug("Account expires in: %s" % time_text)
+
+ p = re.compile('\d+')
+ exp_data = p.findall(time_text)
+ exp_time = time.time() + int(exp_data[0]) * 24 * 60 * 60 + int(
+ exp_data[1]) * 60 * 60 + (int(exp_data[2]) - 1) * 60
+
+ # Get expiration date from API
+ except Exception:
+ data = self.getAccountData(user)
+ html = req.load("http://www.alldebrid.com/api.php",
+ get={'action': "info_user", 'login': user, 'pw': data['password']})
+
+ self.logDebug(html)
+
+ xml = dom.parseString(html)
+ exp_time = time.time() + int(xml.getElementsByTagName("date")[0].childNodes[0].nodeValue) * 24 * 60 * 60
+
+ account_info = {"validuntil": exp_time, "trafficleft": -1}
+ return account_info
+
+
+ def login(self, user, data, req):
+ html = req.load("http://www.alldebrid.com/register/",
+ get={'action' : "login",
+ 'login_login' : user,
+ 'login_password': data['password']},
+ decode=True)
+
+ if "This login doesn't exist" in html \
+ or "The password is not valid" in html \
+ or "Invalid captcha" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/BackinNet.py b/pyload/plugin/account/BackinNet.py
new file mode 100644
index 000000000..79d46c761
--- /dev/null
+++ b/pyload/plugin/account/BackinNet.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class BackinNet(XFSAccount):
+ __name = "BackinNet"
+ __type = "account"
+ __version = "0.01"
+
+ __description = """Backin.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "backin.net"
diff --git a/pyload/plugin/account/BillionuploadsCom.py b/pyload/plugin/account/BillionuploadsCom.py
new file mode 100644
index 000000000..982a2cc34
--- /dev/null
+++ b/pyload/plugin/account/BillionuploadsCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class BillionuploadsCom(XFSAccount):
+ __name = "BillionuploadsCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Billionuploads.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "billionuploads.com"
diff --git a/pyload/plugin/account/BitshareCom.py b/pyload/plugin/account/BitshareCom.py
new file mode 100644
index 000000000..8a64d3b4c
--- /dev/null
+++ b/pyload/plugin/account/BitshareCom.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class BitshareCom(Account):
+ __name = "BitshareCom"
+ __type = "account"
+ __version = "0.13"
+
+ __description = """Bitshare account plugin"""
+ __license = "GPLv3"
+ __authors = [("Paul King", "")]
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://bitshare.com/mysettings.html")
+
+ if "\"http://bitshare.com/myupgrade.html\">Free" in html:
+ return {"validuntil": -1, "trafficleft": -1, "premium": False}
+
+ if not '<input type="checkbox" name="directdownload" checked="checked" />' in html:
+ self.logWarning(_("Activate direct Download in your Bitshare Account"))
+
+ return {"validuntil": -1, "trafficleft": -1, "premium": True}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://bitshare.com/login.html",
+ post={"user": user, "password": data['password'], "submit": "Login"},
+ decode=True)
+
+ if "login" in req.lastEffectiveURL:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/CatShareNet.py b/pyload/plugin/account/CatShareNet.py
new file mode 100644
index 000000000..8f821413f
--- /dev/null
+++ b/pyload/plugin/account/CatShareNet.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class CatShareNet(Account):
+ __name = "CatShareNet"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """CatShareNet account plugin"""
+ __license = "GPLv3"
+ __authors = [("prOq", "")]
+
+
+ PREMIUM_PATTERN = r'<a href="/premium">Konto:[\s\n]*Premium'
+ VALID_UNTIL_PATTERN = r'>Konto premium.*?<strong>(.*?)</strong></span>'
+ TRAFFIC_LEFT_PATTERN = r'<a href="/premium">([0-9.]+ [kMG]B)'
+
+
+ def loadAccountInfo(self, user, req):
+ premium = False
+ validuntil = -1
+ trafficleft = -1
+
+ html = req.load("http://catshare.net/", decode=True)
+
+ if re.search(self.PREMIUM_PATTERN, html):
+ premium = True
+
+ try:
+ expiredate = re.search(self.VALID_UNTIL_PATTERN, html).group(1)
+ self.logDebug("Expire date: " + expiredate)
+
+ validuntil = time.mktime(time.strptime(expiredate, "%Y-%m-%d %H:%M:%S"))
+
+ except Exception:
+ pass
+
+ try:
+ trafficleft = self.parseTraffic(re.search(self.TRAFFIC_LEFT_PATTERN, html).group(1))
+
+ except Exception:
+ pass
+
+ return {'premium': premium, 'trafficleft': trafficleft, 'validuntil': validuntil}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://catshare.net/login",
+ post={'user_email': user,
+ 'user_password': data['password'],
+ 'remindPassword': 0,
+ 'user[submit]': "Login"},
+ decode=True)
+
+ if not '<a href="/logout">Wyloguj</a>' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/CloudzillaTo.py b/pyload/plugin/account/CloudzillaTo.py
new file mode 100644
index 000000000..bee7c5a17
--- /dev/null
+++ b/pyload/plugin/account/CloudzillaTo.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class CloudzillaTo(Account):
+ __name = "CloudzillaTo"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Cloudzilla.to account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ PREMIUM_PATTERN = r'<h2>account type</h2>\s*Premium Account'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.cloudzilla.to/")
+
+ premium = re.search(self.PREMIUM_PATTERN, html) is not None
+
+ return {'validuntil': -1, 'trafficleft': -1, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://www.cloudzilla.to/",
+ post={'lusername': user,
+ 'lpassword': data['password'],
+ 'w' : "dologin"},
+ decode=True)
+
+ if "ERROR" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/CramitIn.py b/pyload/plugin/account/CramitIn.py
new file mode 100644
index 000000000..ccd291776
--- /dev/null
+++ b/pyload/plugin/account/CramitIn.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class CramitIn(XFSAccount):
+ __name = "CramitIn"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Cramit.in account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ HOSTER_DOMAIN = "cramit.in"
diff --git a/pyload/plugin/account/CzshareCom.py b/pyload/plugin/account/CzshareCom.py
new file mode 100644
index 000000000..4913ed88f
--- /dev/null
+++ b/pyload/plugin/account/CzshareCom.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class CzshareCom(Account):
+ __name = "CzshareCom"
+ __type = "account"
+ __version = "0.18"
+
+ __description = """Czshare.com account plugin, now Sdilej.cz"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ CREDIT_LEFT_PATTERN = r'<tr class="active">\s*<td>([\d ,]+) (KiB|MiB|GiB)</td>\s*<td>([^<]*)</td>\s*</tr>'
+
+
+ def loadAccountInfo(self, user, req):
+ premium = False
+ validuntil = None
+ trafficleft = None
+
+ html = req.load("http://sdilej.cz/prehled_kreditu/")
+
+ try:
+ m = re.search(self.CREDIT_LEFT_PATTERN, html)
+ trafficleft = self.parseTraffic(m.group(1).replace(' ', '').replace(',', '.')) + m.group(2)
+ validuntil = time.mktime(time.strptime(m.group(3), '%d.%m.%y %H:%M'))
+
+ except Exception, e:
+ self.logError(e)
+
+ else:
+ premium = True
+
+ return {'premium' : premium,
+ 'validuntil' : validuntil,
+ 'trafficleft': trafficleft}
+
+
+ def login(self, user, data, req):
+ html = req.load('https://sdilej.cz/index.php',
+ post={"Prihlasit": "Prihlasit",
+ "login-password": data['password'],
+ "login-name": user},
+ decode=True)
+
+ if '<div class="login' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/DebridItaliaCom.py b/pyload/plugin/account/DebridItaliaCom.py
new file mode 100644
index 000000000..49959d5c3
--- /dev/null
+++ b/pyload/plugin/account/DebridItaliaCom.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class DebridItaliaCom(Account):
+ __name = "DebridItaliaCom"
+ __type = "account"
+ __version = "0.13"
+
+ __description = """Debriditalia.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ WALID_UNTIL_PATTERN = r'Premium valid till: (.+?) \|'
+
+
+ def loadAccountInfo(self, user, req):
+ info = {'premium': False, 'validuntil': None, 'trafficleft': None}
+ html = req.load("http://debriditalia.com/")
+
+ if 'Account premium not activated' not in html:
+ m = re.search(self.WALID_UNTIL_PATTERN, html)
+ if m:
+ validuntil = time.mktime(time.strptime(m.group(1), "%d/%m/%Y %H:%M"))
+ info = {'premium': True, 'validuntil': validuntil, 'trafficleft': -1}
+ else:
+ self.logError(_("Unable to retrieve account information"))
+
+ return info
+
+
+ def login(self, user, data, req):
+ html = req.load("http://debriditalia.com/login.php",
+ get={'u': user, 'p': data['password']},
+ decode=True)
+
+ if 'NO' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/DepositfilesCom.py b/pyload/plugin/account/DepositfilesCom.py
new file mode 100644
index 000000000..4e09ee2ed
--- /dev/null
+++ b/pyload/plugin/account/DepositfilesCom.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class DepositfilesCom(Account):
+ __name = "DepositfilesCom"
+ __type = "account"
+ __version = "0.32"
+
+ __description = """Depositfiles.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("mkaay", "mkaay@mkaay.de"),
+ ("stickell", "l.stickell@yahoo.it"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("https://dfiles.eu/de/gold/")
+ validuntil = re.search(r"Sie haben Gold Zugang bis: <b>(.*?)</b></div>", html).group(1)
+
+ validuntil = time.mktime(time.strptime(validuntil, "%Y-%m-%d %H:%M:%S"))
+
+ return {"validuntil": validuntil, "trafficleft": -1}
+
+
+ def login(self, user, data, req):
+ html = req.load("https://dfiles.eu/de/login.php", get={"return": "/de/gold/payment.php"},
+ post={"login": user, "password": data['password']},
+ decode=True)
+
+ if r'<div class="error_message">Sie haben eine falsche Benutzername-Passwort-Kombination verwendet.</div>' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/DropboxCom.py b/pyload/plugin/account/DropboxCom.py
new file mode 100644
index 000000000..80dfd6cea
--- /dev/null
+++ b/pyload/plugin/account/DropboxCom.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.SimpleHoster import SimpleHoster
+
+
+class DropboxCom(SimpleHoster):
+ __name = "DropboxCom"
+ __type = "hoster"
+ __version = "0.04"
+
+ __pattern = r'https?://(?:www\.)?dropbox\.com/.+'
+ __config = [("use_premium", "bool", "Use premium account if available", True)]
+
+ __description = """Dropbox.com hoster plugin"""
+ __license = "GPLv3"
+ __authors = [("zapp-brannigan", "fuerst.reinje@web.de")]
+
+
+ NAME_PATTERN = r'<title>Dropbox - (?P<N>.+?)<'
+ SIZE_PATTERN = r'&nbsp;&middot;&nbsp; (?P<S>[\d.,]+) (?P<U>[\w^_]+)'
+
+ OFFLINE_PATTERN = r'<title>Dropbox - (404|Shared link error)<'
+
+ COOKIES = [("dropbox.com", "lang", "en")]
+
+
+ def setup(self):
+ self.multiDL = True
+ self.chunkLimit = 1
+ self.resumeDownload = True
+
+
+ def handleFree(self, pyfile):
+ self.download(pyfile.url, get={'dl': "1"})
diff --git a/pyload/plugin/account/EasybytezCom.py b/pyload/plugin/account/EasybytezCom.py
new file mode 100644
index 000000000..c1f641669
--- /dev/null
+++ b/pyload/plugin/account/EasybytezCom.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class EasybytezCom(XFSAccount):
+ __name = "EasybytezCom"
+ __type = "account"
+ __version = "0.12"
+
+ __description = """EasyBytez.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "easybytez.com"
diff --git a/pyload/plugin/account/EuroshareEu.py b/pyload/plugin/account/EuroshareEu.py
new file mode 100644
index 000000000..e1e037bf9
--- /dev/null
+++ b/pyload/plugin/account/EuroshareEu.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class EuroshareEu(Account):
+ __name = "EuroshareEu"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Euroshare.eu account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ def loadAccountInfo(self, user, req):
+ self.relogin(user)
+ html = req.load("http://euroshare.eu/customer-zone/settings/")
+
+ m = re.search('id="input_expire_date" value="(\d+\.\d+\.\d+ \d+:\d+)"', html)
+ if m is None:
+ premium, validuntil = False, -1
+ else:
+ premium = True
+ validuntil = time.mktime(time.strptime(m.group(1), "%d.%m.%Y %H:%M"))
+
+ return {"validuntil": validuntil, "trafficleft": -1, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load('http://euroshare.eu/customer-zone/login/',
+ post={"trvale": "1",
+ "login": user,
+ "password": data['password']},
+ decode=True)
+
+ if u">Nesprávne prihlasovacie meno alebo heslo" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/ExashareCom.py b/pyload/plugin/account/ExashareCom.py
new file mode 100644
index 000000000..e61c2f12d
--- /dev/null
+++ b/pyload/plugin/account/ExashareCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.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/pyload/plugin/account/FastixRu.py b/pyload/plugin/account/FastixRu.py
new file mode 100644
index 000000000..ead4e63aa
--- /dev/null
+++ b/pyload/plugin/account/FastixRu.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class FastixRu(Account):
+ __name = "FastixRu"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Fastix account plugin"""
+ __license = "GPLv3"
+ __authors = [("Massimo Rosamilia", "max@spiritix.eu")]
+
+
+ def loadAccountInfo(self, user, req):
+ data = self.getAccountData(user)
+ html = json_loads(req.load("http://fastix.ru/api_v2/", get={'apikey': data['api'], 'sub': "getaccountdetails"}))
+
+ points = html['points']
+ trafficleft = float(points) * 1024 ** 2 / 1000
+
+ if points > 0:
+ account_info = {"validuntil": -1, "trafficleft": trafficleft}
+ else:
+ account_info = {"validuntil": None, "trafficleft": None, "premium": False}
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ html = req.load("http://fastix.ru/api_v2/",
+ get={'sub': "get_apikey", 'email': user, 'password': data['password']})
+
+ api = json_loads(html)
+ api = api['apikey']
+
+ data['api'] = api
+
+ if "error_code" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FastshareCz.py b/pyload/plugin/account/FastshareCz.py
new file mode 100644
index 000000000..f1ed9d634
--- /dev/null
+++ b/pyload/plugin/account/FastshareCz.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+from pyload.utils import parseFileSize
+
+
+class FastshareCz(Account):
+ __name = "FastshareCz"
+ __type = "account"
+ __version = "0.06"
+
+ __description = """Fastshare.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ CREDIT_PATTERN = r'Credit\s*:\s*</td>\s*<td>(.+?)\s*<'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = -1
+ trafficleft = None
+ premium = False
+
+ html = req.load("http://www.fastshare.cz/user", decode=True)
+
+ m = re.search(self.CREDIT_PATTERN, html)
+ if m:
+ trafficleft = self.parseTraffic(m.group(1))
+
+ premium = bool(trafficleft)
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("fastshare.cz", "lang", "en")
+
+ req.load('http://www.fastshare.cz/login') #: Do not remove or it will not login
+
+ html = req.load("http://www.fastshare.cz/sql.php",
+ post={'login': user, 'heslo': data['password']},
+ decode=True)
+
+ if ">Wrong username or password" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/File4SafeCom.py b/pyload/plugin/account/File4SafeCom.py
new file mode 100644
index 000000000..1c7e00fcf
--- /dev/null
+++ b/pyload/plugin/account/File4SafeCom.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class File4SafeCom(XFSAccount):
+ __name = "File4SafeCom"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """File4Safe.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ HOSTER_DOMAIN = "file4safe.com"
+
+ LOGIN_FAIL_PATTERN = r'input_login'
diff --git a/pyload/plugin/account/FileParadoxIn.py b/pyload/plugin/account/FileParadoxIn.py
new file mode 100644
index 000000000..0e103c4e7
--- /dev/null
+++ b/pyload/plugin/account/FileParadoxIn.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class FileParadoxIn(XFSAccount):
+ __name = "FileParadoxIn"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """FileParadox.in account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "fileparadox.in"
diff --git a/pyload/plugin/account/FilecloudIo.py b/pyload/plugin/account/FilecloudIo.py
new file mode 100644
index 000000000..b07fe981a
--- /dev/null
+++ b/pyload/plugin/account/FilecloudIo.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class FilecloudIo(Account):
+ __name = "FilecloudIo"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """FilecloudIo account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ # It looks like the first API request always fails, so we retry 5 times, it should work on the second try
+ for _i in xrange(5):
+ rep = req.load("https://secure.filecloud.io/api-fetch_apikey.api",
+ post={"username": user, "password": self.getAccountData(user)['password']})
+ rep = json_loads(rep)
+ if rep['status'] == 'ok':
+ break
+ elif rep['status'] == 'error' and rep['message'] == 'no such user or wrong password':
+ self.logError(_("Wrong username or password"))
+ return {"valid": False, "premium": False}
+ else:
+ return {"premium": False}
+
+ akey = rep['akey']
+ self.accounts[user]['akey'] = akey #: Saved for hoster plugin
+ rep = req.load("http://api.filecloud.io/api-fetch_account_details.api",
+ post={"akey": akey})
+ rep = json_loads(rep)
+
+ if rep['is_premium'] == 1:
+ return {"validuntil": float(rep['premium_until']), "trafficleft": -1}
+ else:
+ return {"premium": False}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("secure.filecloud.io", "lang", "en")
+ html = req.load('https://secure.filecloud.io/user-login.html')
+
+ if not hasattr(self, "form_data"):
+ self.form_data = {}
+
+ self.form_data['username'] = user
+ self.form_data['password'] = data['password']
+
+ html = req.load('https://secure.filecloud.io/user-login_p.html',
+ post=self.form_data,
+ multipart=True)
+
+ if "you have successfully logged in" not in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FilefactoryCom.py b/pyload/plugin/account/FilefactoryCom.py
new file mode 100644
index 000000000..71a040b65
--- /dev/null
+++ b/pyload/plugin/account/FilefactoryCom.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pycurl import REFERER
+
+from pyload.plugin.Account import Account
+
+
+class FilefactoryCom(Account):
+ __name = "FilefactoryCom"
+ __type = "account"
+ __version = "0.15"
+
+ __description = """Filefactory.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ VALID_UNTIL_PATTERN = r'Premium valid until: <strong>(?P<D>\d{1,2})\w{1,2} (?P<M>\w{3}), (?P<Y>\d{4})</strong>'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.filefactory.com/account/")
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ premium = True
+ validuntil = re.sub(self.VALID_UNTIL_PATTERN, '\g<D> \g<M> \g<Y>', m.group(0))
+ validuntil = time.mktime(time.strptime(validuntil, "%d %b %Y"))
+ else:
+ premium = False
+ validuntil = -1
+
+ return {"premium": premium, "trafficleft": -1, "validuntil": validuntil}
+
+
+ def login(self, user, data, req):
+ req.http.c.setopt(REFERER, "http://www.filefactory.com/member/login.php")
+
+ html = req.load("http://www.filefactory.com/member/signin.php",
+ post={"loginEmail" : user,
+ "loginPassword": data['password'],
+ "Submit" : "Sign In"})
+
+ if req.lastEffectiveURL != "http://www.filefactory.com/account/":
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FilejungleCom.py b/pyload/plugin/account/FilejungleCom.py
new file mode 100644
index 000000000..19d343372
--- /dev/null
+++ b/pyload/plugin/account/FilejungleCom.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class FilejungleCom(Account):
+ __name = "FilejungleCom"
+ __type = "account"
+ __version = "0.12"
+
+ __description = """Filejungle.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ login_timeout = 60
+
+ URL = "http://filejungle.com/"
+ TRAFFIC_LEFT_PATTERN = r'"/extend_premium\.php">Until (\d+ \w+ \d+)<br'
+ LOGIN_FAILED_PATTERN = r'<span htmlfor="loginUser(Name|Password)" generated="true" class="fail_info">'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load(self.URL + "dashboard.php")
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ if m:
+ premium = True
+ validuntil = time.mktime(time.strptime(m.group(1), "%d %b %Y"))
+ else:
+ premium = False
+ validuntil = -1
+
+ return {"premium": premium, "trafficleft": -1, "validuntil": validuntil}
+
+
+ def login(self, user, data, req):
+ html = req.load(self.URL + "login.php",
+ post={"loginUserName": user,
+ "loginUserPassword": data['password'],
+ "loginFormSubmit": "Login",
+ "recaptcha_challenge_field": "",
+ "recaptcha_response_field": "",
+ "recaptcha_shortencode_field": ""},
+ decode=True)
+
+ if re.search(self.LOGIN_FAILED_PATTERN, html):
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FileomCom.py b/pyload/plugin/account/FileomCom.py
new file mode 100644
index 000000000..2868e49e6
--- /dev/null
+++ b/pyload/plugin/account/FileomCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class FileomCom(XFSAccount):
+ __name = "FileomCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Fileom.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "fileom.com"
diff --git a/pyload/plugin/account/FilerNet.py b/pyload/plugin/account/FilerNet.py
new file mode 100644
index 000000000..b6baddacc
--- /dev/null
+++ b/pyload/plugin/account/FilerNet.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class FilerNet(Account):
+ __name = "FilerNet"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """Filer.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ TOKEN_PATTERN = r'_csrf_token" value="(.+?)" />'
+ WALID_UNTIL_PATTERN = r'Der Premium-Zugang ist gültig bis (.+)\.\s*</td>'
+ TRAFFIC_PATTERN = r'Traffic</th>\s*<td>([^<]+)</td>'
+ FREE_PATTERN = r'Account Status</th>\s*<td>\s*Free'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("https://filer.net/profile")
+
+ # Free user
+ if re.search(self.FREE_PATTERN, html):
+ return {"premium": False, "validuntil": None, "trafficleft": None}
+
+ until = re.search(self.WALID_UNTIL_PATTERN, html)
+ traffic = re.search(self.TRAFFIC_PATTERN, html)
+
+ if until and traffic:
+ validuntil = time.mktime(time.strptime(until.group(1), "%d.%m.%Y %H:%M:%S"))
+ trafficleft = self.parseTraffic(traffic.group(1))
+ return {"premium": True, "validuntil": validuntil, "trafficleft": trafficleft}
+
+ else:
+ self.logError(_("Unable to retrieve account information"))
+ return {"premium": False, "validuntil": None, "trafficleft": None}
+
+
+ def login(self, user, data, req):
+ html = req.load("https://filer.net/login")
+
+ token = re.search(self.TOKEN_PATTERN, html).group(1)
+
+ html = req.load("https://filer.net/login_check",
+ post={"_username": user,
+ "_password": data['password'],
+ "_remember_me": "on",
+ "_csrf_token": token,
+ "_target_path": "https://filer.net/"},
+ decode=True)
+
+ if 'Logout' not in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FilerioCom.py b/pyload/plugin/account/FilerioCom.py
new file mode 100644
index 000000000..d222fa78b
--- /dev/null
+++ b/pyload/plugin/account/FilerioCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class FilerioCom(XFSAccount):
+ __name = "FilerioCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """FileRio.in account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ HOSTER_DOMAIN = "filerio.in"
diff --git a/pyload/plugin/account/FilesMailRu.py b/pyload/plugin/account/FilesMailRu.py
new file mode 100644
index 000000000..03b56be44
--- /dev/null
+++ b/pyload/plugin/account/FilesMailRu.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class FilesMailRu(Account):
+ __name = "FilesMailRu"
+ __type = "account"
+ __version = "0.11"
+
+ __description = """Filesmail.ru account plugin"""
+ __license = "GPLv3"
+ __authors = [("RaNaN", "RaNaN@pyload.org")]
+
+
+ def loadAccountInfo(self, user, req):
+ return {"validuntil": None, "trafficleft": None}
+
+
+ def login(self, user, data, req):
+ user, domain = user.split("@")
+
+ html = req.load("http://swa.mail.ru/cgi-bin/auth",
+ post={"Domain": domain,
+ "Login": user,
+ "Password": data['password'],
+ "Page": "http://files.mail.ru/"},
+ decode=True)
+
+ if "Неверное имя пользователя или пароль" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FileserveCom.py b/pyload/plugin/account/FileserveCom.py
new file mode 100644
index 000000000..d68285a33
--- /dev/null
+++ b/pyload/plugin/account/FileserveCom.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class FileserveCom(Account):
+ __name = "FileserveCom"
+ __type = "account"
+ __version = "0.20"
+
+ __description = """Fileserve.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("mkaay", "mkaay@mkaay.de")]
+
+
+ def loadAccountInfo(self, user, req):
+ data = self.getAccountData(user)
+
+ html = req.load("http://app.fileserve.com/api/login/", post={"username": user, "password": data['password'],
+ "submit": "Submit+Query"})
+ res = json_loads(html)
+
+ if res['type'] == "premium":
+ validuntil = time.mktime(time.strptime(res['expireTime'], "%Y-%m-%d %H:%M:%S"))
+ return {"trafficleft": res['traffic'], "validuntil": validuntil}
+ else:
+ return {"premium": False, "trafficleft": None, "validuntil": None}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://app.fileserve.com/api/login/", post={"username": user, "password": data['password'],
+ "submit": "Submit+Query"})
+ res = json_loads(html)
+
+ if not res['type']:
+ self.wrongPassword()
+
+ # login at fileserv html
+ req.load("http://www.fileserve.com/login.php",
+ post={"loginUserName": user, "loginUserPassword": data['password'], "autoLogin": "checked",
+ "loginFormSubmit": "Login"})
diff --git a/pyload/plugin/account/FourSharedCom.py b/pyload/plugin/account/FourSharedCom.py
new file mode 100644
index 000000000..a04c9bc46
--- /dev/null
+++ b/pyload/plugin/account/FourSharedCom.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class FourSharedCom(Account):
+ __name = "FourSharedCom"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """FourShared.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ # Free mode only for now
+ return {"premium": False}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("4shared.com", "4langcookie", "en")
+
+ res = req.load("http://www.4shared.com/web/login",
+ post={'login' : user,
+ 'password' : data['password'],
+ 'remember' : "on",
+ '_remember': "on",
+ 'returnTo' : "http://www.4shared.com/account/home.jsp"},
+ decode=True)
+
+ if 'Please log in to access your 4shared account' in res:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FreakshareCom.py b/pyload/plugin/account/FreakshareCom.py
new file mode 100644
index 000000000..5bfcf9bcd
--- /dev/null
+++ b/pyload/plugin/account/FreakshareCom.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class FreakshareCom(Account):
+ __name = "FreakshareCom"
+ __type = "account"
+ __version = "0.13"
+
+ __description = """Freakshare.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("RaNaN", "RaNaN@pyload.org")]
+
+
+ def loadAccountInfo(self, user, req):
+ premium = False
+ validuntil = None
+ trafficleft = None
+
+ html = req.load("http://freakshare.com/")
+
+ try:
+ m = re.search(r'ltig bis:</td>\s*<td><b>([\d.:-]+)</b></td>', html, re.M)
+ validuntil = time.mktime(time.strptime(m.group(1).strip(), "%d.%m.%Y - %H:%M"))
+
+ except Exception:
+ pass
+
+ try:
+ m = re.search(r'Traffic verbleibend:</td>\s*<td>([^<]+)', html, re.M)
+ trafficleft = self.parseTraffic(m.group(1))
+
+ except Exception:
+ pass
+
+ return {"premium": premium, "validuntil": validuntil, "trafficleft": trafficleft}
+
+
+ def login(self, user, data, req):
+ req.load("http://freakshare.com/index.php?language=EN")
+
+ html = req.load("http://freakshare.com/login.html",
+ post={"submit": "Login", "user": user, "pass": data['password']},
+ decode=True)
+
+ if ">Wrong Username or Password" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/FreeWayMe.py b/pyload/plugin/account/FreeWayMe.py
new file mode 100644
index 000000000..e139b25a6
--- /dev/null
+++ b/pyload/plugin/account/FreeWayMe.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class FreeWayMe(Account):
+ __name = "FreeWayMe"
+ __type = "account"
+ __version = "0.13"
+
+ __description = """FreeWayMe account plugin"""
+ __license = "GPLv3"
+ __authors = [("Nicolas Giese", "james@free-way.me")]
+
+
+ def loadAccountInfo(self, user, req):
+ status = self.getAccountStatus(user, req)
+
+ self.logDebug(status)
+
+ account_info = {"validuntil": -1, "premium": False}
+ if status['premium'] == "Free":
+ account_info['trafficleft'] = self.parseTraffic(status['guthaben'] + "MB")
+ elif status['premium'] == "Spender":
+ account_info['trafficleft'] = -1
+ elif status['premium'] == "Flatrate":
+ account_info = {"validuntil": float(status['Flatrate']),
+ "trafficleft": -1,
+ "premium": True}
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ status = self.getAccountStatus(user, req)
+
+ # Check if user and password are valid
+ if not status:
+ self.wrongPassword()
+
+
+ def getAccountStatus(self, user, req):
+ answer = req.load("https://www.free-way.me/ajax/jd.php",
+ get={"id": 4, "user": user, "pass": self.getAccountData(user)['password']})
+
+ self.logDebug("Login: %s" % answer)
+
+ if answer == "Invalid login":
+ self.wrongPassword()
+
+ return json_loads(answer)
diff --git a/pyload/plugin/account/FshareVn.py b/pyload/plugin/account/FshareVn.py
new file mode 100644
index 000000000..9f0beec84
--- /dev/null
+++ b/pyload/plugin/account/FshareVn.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class FshareVn(Account):
+ __name = "FshareVn"
+ __type = "account"
+ __version = "0.09"
+
+ __description = """Fshare.vn account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ VALID_UNTIL_PATTERN = ur'<dt>Thời hạn dùng:</dt>\s*<dd>([^<]+)</dd>'
+ LIFETIME_PATTERN = ur'<dt>Lần đăng nhập trước:</dt>\s*<dd>.+?</dd>'
+ TRAFFIC_LEFT_PATTERN = ur'<dt>Tổng Dung Lượng Tài Khoản</dt>\s*<dd.*?>([\d.]+) ([kKMG])B</dd>'
+ DIRECT_DOWNLOAD_PATTERN = ur'<input type="checkbox"\s*([^=>]*)[^>]*/>Kích hoạt download trực tiếp</dt>'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.fshare.vn/account_info.php", decode=True)
+
+ if re.search(self.LIFETIME_PATTERN, html):
+ self.logDebug("Lifetime membership detected")
+ trafficleft = self.getTrafficLeft()
+ return {"validuntil": -1, "trafficleft": trafficleft, "premium": True}
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ premium = True
+ validuntil = time.mktime(time.strptime(m.group(1), '%I:%M:%S %p %d-%m-%Y'))
+ trafficleft = self.getTrafficLeft()
+ else:
+ premium = False
+ validuntil = None
+ trafficleft = None
+
+ return {"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load("https://www.fshare.vn/login.php",
+ post={'LoginForm[email]' : user,
+ 'LoginForm[password]' : data['password'],
+ 'LoginForm[rememberMe]': 1,
+ 'yt0' : "Login"},
+ referer=True,
+ decode=True)
+
+ if not re.search(r'<img\s+alt="VIP"', html):
+ self.wrongPassword()
+
+
+ def getTrafficLeft(self):
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ return self.parseTraffic(m.group(1) + m.group(2)) if m else 0
diff --git a/pyload/plugin/account/Ftp.py b/pyload/plugin/account/Ftp.py
new file mode 100644
index 000000000..c7983b0c2
--- /dev/null
+++ b/pyload/plugin/account/Ftp.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class Ftp(Account):
+ __name = "Ftp"
+ __type = "account"
+ __version = "0.01"
+
+ __description = """Ftp dummy account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ login_timeout = -1 #: Unlimited
+ info_threshold = -1 #: Unlimited
diff --git a/pyload/plugin/account/HellshareCz.py b/pyload/plugin/account/HellshareCz.py
new file mode 100644
index 000000000..68843ee80
--- /dev/null
+++ b/pyload/plugin/account/HellshareCz.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class HellshareCz(Account):
+ __name = "HellshareCz"
+ __type = "account"
+ __version = "0.16"
+
+ __description = """Hellshare.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ CREDIT_LEFT_PATTERN = r'<div class="credit-link">\s*<table>\s*<tr>\s*<th>(\d+|\d\d\.\d\d\.)</th>'
+
+
+ def loadAccountInfo(self, user, req):
+ self.relogin(user)
+ html = req.load("http://www.hellshare.com/")
+
+ m = re.search(self.CREDIT_LEFT_PATTERN, html)
+ if m is None:
+ trafficleft = None
+ validuntil = None
+ premium = False
+ else:
+ credit = m.group(1)
+ premium = True
+ try:
+ if "." in credit:
+ # Time-based account
+ vt = [int(x) for x in credit.split('.')[:2]]
+ lt = time.localtime()
+ year = lt.tm_year + int(vt[1] < lt.tm_mon or (vt[1] == lt.tm_mon and vt[0] < lt.tm_mday))
+ validuntil = time.mktime(time.strptime("%s%d 23:59:59" % (credit, year), "%d.%m.%Y %H:%M:%S"))
+ trafficleft = -1
+ else:
+ # Traffic-based account
+ trafficleft = self.parseTraffic(credit + "MB")
+ validuntil = -1
+ except Exception, e:
+ self.logError(_("Unable to parse credit info"), e)
+ validuntil = -1
+ trafficleft = -1
+
+ return {"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load('http://www.hellshare.com/', decode=True)
+ if req.lastEffectiveURL != 'http://www.hellshare.com/':
+ # Switch to English
+ self.logDebug("Switch lang - URL: %s" % req.lastEffectiveURL)
+
+ json = req.load("%s?do=locRouter-show" % req.lastEffectiveURL)
+ hash = re.search(r"(\-\-[0-9a-f]+\-)", json).group(1)
+
+ self.logDebug("Switch lang - HASH: %s" % hash)
+
+ html = req.load('http://www.hellshare.com/%s/' % hash, decode=True)
+
+ if re.search(self.CREDIT_LEFT_PATTERN, html):
+ self.logDebug("Already logged in")
+ return
+
+ html = req.load('http://www.hellshare.com/login?do=loginForm-submit',
+ post={"login": "Log in",
+ "password": data['password'],
+ "username": user,
+ "perm_login": "on"},
+ decode=True)
+
+ if "<p>You input a wrong user name or wrong password</p>" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/Http.py b/pyload/plugin/account/Http.py
new file mode 100644
index 000000000..aacdbf89f
--- /dev/null
+++ b/pyload/plugin/account/Http.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class Http(Account):
+ __name = "Http"
+ __type = "account"
+ __version = "0.01"
+
+ __description = """Http dummy account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ login_timeout = -1 #: Unlimited
+ info_threshold = -1 #: Unlimited
diff --git a/pyload/plugin/account/HugefilesNet.py b/pyload/plugin/account/HugefilesNet.py
new file mode 100644
index 000000000..b4cd6f8c4
--- /dev/null
+++ b/pyload/plugin/account/HugefilesNet.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class HugefilesNet(XFSAccount):
+ __name = "HugefilesNet"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Hugefiles.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "hugefiles.net"
diff --git a/pyload/plugin/account/HundredEightyUploadCom.py b/pyload/plugin/account/HundredEightyUploadCom.py
new file mode 100644
index 000000000..15ee1a12a
--- /dev/null
+++ b/pyload/plugin/account/HundredEightyUploadCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class HundredEightyUploadCom(XFSAccount):
+ __name = "HundredEightyUploadCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """180upload.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "180upload.com"
diff --git a/pyload/plugin/account/JunkyvideoCom.py b/pyload/plugin/account/JunkyvideoCom.py
new file mode 100644
index 000000000..6c600f971
--- /dev/null
+++ b/pyload/plugin/account/JunkyvideoCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.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/pyload/plugin/account/JunocloudMe.py b/pyload/plugin/account/JunocloudMe.py
new file mode 100644
index 000000000..75307c6dd
--- /dev/null
+++ b/pyload/plugin/account/JunocloudMe.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class JunocloudMe(XFSAccount):
+ __name = "JunocloudMe"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Junocloud.me account plugin"""
+ __license = "GPLv3"
+ __authors = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "junocloud.me"
diff --git a/pyload/plugin/account/Keep2ShareCc.py b/pyload/plugin/account/Keep2ShareCc.py
new file mode 100644
index 000000000..56ac5e9ab
--- /dev/null
+++ b/pyload/plugin/account/Keep2ShareCc.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class Keep2ShareCc(Account):
+ __name = "Keep2ShareCc"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Keep2Share.cc account plugin"""
+ __license = "GPLv3"
+ __authors = [("aeronaut", "aeronaut@pianoguy.de"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ VALID_UNTIL_PATTERN = r'Premium expires:\s*<b>(.+?)<'
+ TRAFFIC_LEFT_PATTERN = r'Available traffic \(today\):\s*<b><a href="/user/statistic.html">(.+?)<'
+
+ LOGIN_FAIL_PATTERN = r'Please fix the following input errors'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = -1
+ premium = False
+
+ html = req.load("http://keep2share.cc/site/profile.html", decode=True)
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ expiredate = m.group(1).strip()
+ self.logDebug("Expire date: " + expiredate)
+
+ if expiredate == "LifeTime":
+ premium = True
+ validuntil = -1
+ else:
+ try:
+ validuntil = time.mktime(time.strptime(expiredate, "%Y.%m.%d"))
+
+ except Exception, e:
+ self.logError(e)
+
+ else:
+ premium = validuntil > time.mktime(time.gmtime())
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ if m:
+ try:
+ trafficleft = self.parseTraffic(m.group(1))
+
+ except Exception, e:
+ self.logError(e)
+
+ return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("keep2share.cc", "lang", "en")
+
+ html = req.load("http://keep2share.cc/login.html",
+ post={'LoginForm[username]' : user,
+ 'LoginForm[password]' : data['password'],
+ 'LoginForm[rememberMe]': 1,
+ 'yt0' : ""},
+ decode=True)
+
+ if re.search(self.LOGIN_FAIL_PATTERN, html):
+ self.wrongPassword()
diff --git a/pyload/plugin/account/LetitbitNet.py b/pyload/plugin/account/LetitbitNet.py
new file mode 100644
index 000000000..0ad36f219
--- /dev/null
+++ b/pyload/plugin/account/LetitbitNet.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+# from pyload.utils import json_loads, json_dumps
+
+
+class LetitbitNet(Account):
+ __name = "LetitbitNet"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Letitbit.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ ## DISABLED BECAUSE IT GET 'key exausted' EVEN IF VALID ##
+ # api_key = self.getAccountData(user)['password']
+ # json_data = [api_key, ['key/info']]
+ # api_rep = req.load('http://api.letitbit.net/json', post={'r': json_dumps(json_data)})
+ # self.logDebug("API Key Info: " + api_rep)
+ # api_rep = json_loads(api_rep)
+ #
+ # if api_rep['status'] == 'FAIL':
+ # self.logWarning(api_rep['data'])
+ # return {'valid': False, 'premium': False}
+
+ return {"premium": True}
+
+
+ def login(self, user, data, req):
+ # API_KEY is the username and the PREMIUM_KEY is the password
+ self.logInfo(_("You must use your API KEY as username and the PREMIUM KEY as password"))
diff --git a/pyload/plugin/account/LinestorageCom.py b/pyload/plugin/account/LinestorageCom.py
new file mode 100644
index 000000000..824d3bf77
--- /dev/null
+++ b/pyload/plugin/account/LinestorageCom.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class LinestorageCom(XFSAccount):
+ __name = "LinestorageCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Linestorage.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "linestorage.com"
+ HOSTER_URL = "http://linestorage.com/"
diff --git a/pyload/plugin/account/LinksnappyCom.py b/pyload/plugin/account/LinksnappyCom.py
new file mode 100644
index 000000000..4b91042e2
--- /dev/null
+++ b/pyload/plugin/account/LinksnappyCom.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+from hashlib import md5
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class LinksnappyCom(Account):
+ __name = "LinksnappyCom"
+ __type = "account"
+ __version = "0.05"
+ __description = """Linksnappy.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ data = self.getAccountData(user)
+ r = req.load('http://gen.linksnappy.com/lseAPI.php',
+ get={'act': 'USERDETAILS', 'username': user, 'password': md5(data['password']).hexdigest()})
+
+ self.logDebug("JSON data: " + r)
+
+ j = json_loads(r)
+
+ if j['error']:
+ return {"premium": False}
+
+ validuntil = j['return']['expire']
+
+ if validuntil == 'lifetime':
+ validuntil = -1
+
+ elif validuntil == 'expired':
+ return {"premium": False}
+
+ else:
+ validuntil = float(validuntil)
+
+ if 'trafficleft' not in j['return'] or isinstance(j['return']['trafficleft'], str):
+ trafficleft = -1
+ else:
+ trafficleft = self.parseTraffic("%d MB" % j['return']['trafficleft'])
+
+ return {"premium": True, "validuntil": validuntil, "trafficleft": trafficleft}
+
+
+ def login(self, user, data, req):
+ r = req.load("http://gen.linksnappy.com/lseAPI.php",
+ get={'act' : 'USERDETAILS',
+ 'username': user,
+ 'password': md5(data['password']).hexdigest()},
+ decode=True)
+
+ if 'Invalid Account Details' in r:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/MegaDebridEu.py b/pyload/plugin/account/MegaDebridEu.py
new file mode 100644
index 000000000..67af94541
--- /dev/null
+++ b/pyload/plugin/account/MegaDebridEu.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class MegaDebridEu(Account):
+ __name = "MegaDebridEu"
+ __type = "account"
+ __version = "0.20"
+
+ __description = """mega-debrid.eu account plugin"""
+ __license = "GPLv3"
+ __authors = [("D.Ducatel", "dducatel@je-geek.fr")]
+
+
+ # Define the base URL of MegaDebrid api
+ API_URL = "https://www.mega-debrid.eu/api.php"
+
+
+ def loadAccountInfo(self, user, req):
+ data = self.getAccountData(user)
+ jsonResponse = req.load(self.API_URL,
+ get={'action': 'connectUser', 'login': user, 'password': data['password']})
+ res = json_loads(jsonResponse)
+
+ if res['response_code'] == "ok":
+ return {"premium": True, "validuntil": float(res['vip_end']), "status": True}
+ else:
+ self.logError(res)
+ return {"status": False, "premium": False}
+
+
+ def login(self, user, data, req):
+ jsonResponse = req.load(self.API_URL,
+ get={'action': 'connectUser', 'login': user, 'password': data['password']})
+ res = json_loads(jsonResponse)
+ if res['response_code'] != "ok":
+ self.wrongPassword()
diff --git a/pyload/plugin/account/MegaRapidCz.py b/pyload/plugin/account/MegaRapidCz.py
new file mode 100644
index 000000000..ea788d446
--- /dev/null
+++ b/pyload/plugin/account/MegaRapidCz.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class MegaRapidCz(Account):
+ __name = "MegaRapidCz"
+ __type = "account"
+ __version = "0.35"
+
+ __description = """MegaRapid.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("MikyWoW", "mikywow@seznam.cz"),
+ ("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ login_timeout = 60
+
+ LIMITDL_PATTERN = ur'<td>Max. počet paralelních stahování: </td><td>(\d+)'
+ VALID_UNTIL_PATTERN = ur'<td>Paušální stahování aktivní. Vyprší </td><td><strong>(.*?)</strong>'
+ TRAFFIC_LEFT_PATTERN = r'<tr><td>Kredit</td><td>(.*?) GiB'
+
+
+ def loadAccountInfo(self, user, req):
+ htmll = req.load("http://megarapid.cz/mujucet/", decode=True)
+
+ m = re.search(self.LIMITDL_PATTERN, htmll)
+ if m:
+ data = self.getAccountData(user)
+ data['options']['limitDL'] = [int(m.group(1))]
+
+ m = re.search(self.VALID_UNTIL_PATTERN, htmll)
+ if m:
+ validuntil = time.mktime(time.strptime(m.group(1), "%d.%m.%Y - %H:%M"))
+ return {"premium": True, "trafficleft": -1, "validuntil": validuntil}
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, htmll)
+ if m:
+ trafficleft = float(m.group(1)) * (1 << 20)
+ return {"premium": True, "trafficleft": trafficleft, "validuntil": -1}
+
+ return {"premium": False, "trafficleft": None, "validuntil": None}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://megarapid.cz/prihlaseni/", decode=True)
+
+ if "Heslo:" in html:
+ start = html.index('id="inp_hash" name="hash" value="')
+ html = html[start + 33:]
+ hashes = html[0:32]
+ html = req.load("http://megarapid.cz/prihlaseni/",
+ post={"hash": hashes,
+ "login": user,
+ "pass1": data['password'],
+ "remember": 0,
+ "sbmt": u"Přihlásit"})
diff --git a/pyload/plugin/account/MegaRapidoNet.py b/pyload/plugin/account/MegaRapidoNet.py
new file mode 100644
index 000000000..c4ee559da
--- /dev/null
+++ b/pyload/plugin/account/MegaRapidoNet.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class MegaRapidoNet(Account):
+ __name = "MegaRapidoNet"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """MegaRapido.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("Kagenoshin", "kagenoshin@gmx.ch")]
+
+
+ VALID_UNTIL_PATTERN = r'<\s*?div[^>]*?class\s*?=\s*?[\'"]premium_index[\'"].*?>[^<]*?<[^>]*?b.*?>\s*?TEMPO\s*?PREMIUM.*?<[^>]*?/b.*?>\s*?(\d*)[^\d]*?DIAS[^\d]*?(\d*)[^\d]*?HORAS[^\d]*?(\d*)[^\d]*?MINUTOS[^\d]*?(\d*)[^\d]*?SEGUNDOS'
+ USER_ID_PATTERN = r'<\s*?div[^>]*?class\s*?=\s*?["\']checkbox_compartilhar["\'].*?>.*?<\s*?input[^>]*?name\s*?=\s*?["\']usar["\'].*?>.*?<\s*?input[^>]*?name\s*?=\s*?["\']user["\'][^>]*?value\s*?=\s*?["\'](.*?)\s*?["\']'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = None
+ premium = False
+
+ html = req.load("http://megarapido.net/gerador", decode=True)
+
+ validuntil = re.search(self.VALID_UNTIL_PATTERN, html)
+ if validuntil:
+ # hier weitermachen!!! (müssen umbedingt die zeit richtig machen damit! (sollte aber möglich))
+ validuntil = time.time() + int(validuntil.group(1)) * 24 * 3600 + int(validuntil.group(2)) * 3600 + int(validuntil.group(3)) * 60 + int(validuntil.group(4))
+ trafficleft = -1
+ premium = True
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium}
+
+
+ def login(self, user, data, req):
+ req.load("http://megarapido.net/login")
+ req.load("http://megarapido.net/painel_user/ajax/logar.php",
+ post={'login': user, 'senha': data['password']},
+ decode=True)
+
+ html = req.load("http://megarapido.net/gerador")
+
+ if "sair" not in html.lower():
+ self.wrongPassword()
+ else:
+ m = re.search(self.USER_ID_PATTERN, html)
+ if m:
+ data['uid'] = m.group(1)
+ else:
+ self.fail("Couldn't find the user ID")
diff --git a/pyload/plugin/account/MegasharesCom.py b/pyload/plugin/account/MegasharesCom.py
new file mode 100644
index 000000000..8920bb2db
--- /dev/null
+++ b/pyload/plugin/account/MegasharesCom.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class MegasharesCom(Account):
+ __name = "MegasharesCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Megashares.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ VALID_UNTIL_PATTERN = r'<p class="premium_info_box">Period Ends: (\w{3} \d{1,2}, \d{4})</p>'
+
+
+ def loadAccountInfo(self, user, req):
+ # self.relogin(user)
+ html = req.load("http://d01.megashares.com/myms.php", decode=True)
+
+ premium = '>Premium Upgrade<' not in html
+
+ validuntil = trafficleft = -1
+ try:
+ timestr = re.search(self.VALID_UNTIL_PATTERN, html).group(1)
+ self.logDebug(timestr)
+ validuntil = time.mktime(time.strptime(timestr, "%b %d, %Y"))
+ except Exception, e:
+ self.logError(e)
+
+ return {"validuntil": validuntil, "trafficleft": -1, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load('http://d01.megashares.com/myms_login.php',
+ post={"httpref" : "",
+ "myms_login" : "Login",
+ "mymslogin_name": user,
+ "mymspassword" : data['password']},
+ decode=True)
+
+ if not '<span class="b ml">%s</span>' % user in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/MovReelCom.py b/pyload/plugin/account/MovReelCom.py
new file mode 100644
index 000000000..9eabd0a6d
--- /dev/null
+++ b/pyload/plugin/account/MovReelCom.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class MovReelCom(XFSAccount):
+ __name = "MovReelCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Movreel.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("t4skforce", "t4skforce1337[AT]gmail[DOT]com")]
+
+
+ login_timeout = 60
+ info_threshold = 30
+
+ HOSTER_DOMAIN = "movreel.com"
diff --git a/pyload/plugin/account/MultihostersCom.py b/pyload/plugin/account/MultihostersCom.py
new file mode 100644
index 000000000..bc48979bb
--- /dev/null
+++ b/pyload/plugin/account/MultihostersCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.account.ZeveraCom import ZeveraCom
+
+
+class MultihostersCom(ZeveraCom):
+ __name = "MultihostersCom"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Multihosters.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("tjeh", "tjeh@gmx.net")]
+
+
+ HOSTER_DOMAIN = "multihosters.com"
diff --git a/pyload/plugin/account/MultishareCz.py b/pyload/plugin/account/MultishareCz.py
new file mode 100644
index 000000000..66ab3dd47
--- /dev/null
+++ b/pyload/plugin/account/MultishareCz.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class MultishareCz(Account):
+ __name = "MultishareCz"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Multishare.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ TRAFFIC_LEFT_PATTERN = r'<span class="profil-zvyrazneni">Kredit:</span>\s*<strong>(?P<S>[\d.,]+)&nbsp;(?P<U>[\w^_]+)</strong>'
+ ACCOUNT_INFO_PATTERN = r'<input type="hidden" id="(u_ID|u_hash)" name=".+?" value="(.+?)">'
+
+
+ def loadAccountInfo(self, user, req):
+ # self.relogin(user)
+ html = req.load("http://www.multishare.cz/profil/", decode=True)
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ trafficleft = self.parseTraffic(m.group('S') + m.group('U')) if m else 0
+ self.premium = bool(trafficleft)
+
+ html = req.load("http://www.multishare.cz/", decode=True)
+ mms_info = dict(re.findall(self.ACCOUNT_INFO_PATTERN, html))
+
+ return dict(mms_info, **{"validuntil": -1, "trafficleft": trafficleft})
+
+
+ def login(self, user, data, req):
+ html = req.load('http://www.multishare.cz/html/prihlaseni_process.php',
+ post={"akce" : "Přihlásit",
+ "heslo": data['password'],
+ "jmeno": user},
+ decode=True)
+
+ if '<div class="akce-chyba akce">' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/MyfastfileCom.py b/pyload/plugin/account/MyfastfileCom.py
new file mode 100644
index 000000000..a58767b72
--- /dev/null
+++ b/pyload/plugin/account/MyfastfileCom.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class MyfastfileCom(Account):
+ __name = "MyfastfileCom"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """Myfastfile.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ if 'days_left' in self.json_data:
+ validuntil = time.time() + self.json_data['days_left'] * 24 * 60 * 60
+ return {"premium": True, "validuntil": validuntil, "trafficleft": -1}
+ else:
+ self.logError(_("Unable to get account information"))
+
+
+ def login(self, user, data, req):
+ # Password to use is the API-Password written in http://myfastfile.com/myaccount
+ html = req.load("http://myfastfile.com/api.php",
+ get={"user": user, "pass": data['password']})
+
+ self.logDebug("JSON data: " + html)
+
+ self.json_data = json_loads(html)
+ if self.json_data['status'] != 'ok':
+ self.logError(_('Invalid login. The password to use is the API-Password you find in your "My Account" page'))
+ self.wrongPassword()
diff --git a/pyload/plugin/account/NetloadIn.py b/pyload/plugin/account/NetloadIn.py
new file mode 100644
index 000000000..db0f0ea5a
--- /dev/null
+++ b/pyload/plugin/account/NetloadIn.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class NetloadIn(Account):
+ __name = "NetloadIn"
+ __type = "account"
+ __version = "0.24"
+
+ __description = """Netload.in account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def api_response(self, id, password, req):
+ return req.load("http://api.netload.in/user_info.php",
+ get={'auth' : "BVm96BWDSoB4WkfbEhn42HgnjIe1ilMt",
+ 'user_id' : id,
+ 'user_password': password}).strip()
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = -1
+ premium = False
+
+ html = self.api_response(user, self.getAccountData(user)['password'], req)
+
+ if html == "-1":
+ premium = True
+
+ elif html == "0":
+ validuntil = -1
+
+ else:
+ try:
+ validuntil = time.mktime(time.strptime(html, "%Y-%m-%d %H:%M"))
+
+ except Exception, e:
+ self.logError(e)
+
+ else:
+ self.logDebug("Valid until: %s" % validuntil)
+
+ if validuntil > time.mktime(time.gmtime()):
+ premium = True
+ else:
+ validuntil = -1
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium}
+
+
+ def login(self, user, data, req):
+ html = self.api_response(user, data['password'], req)
+
+ if not html or re.search(r'disallowed_agent|unknown_auth|login_failed', html):
+ self.wrongPassword()
diff --git a/pyload/plugin/account/NoPremiumPl.py b/pyload/plugin/account/NoPremiumPl.py
new file mode 100644
index 000000000..6cefed550
--- /dev/null
+++ b/pyload/plugin/account/NoPremiumPl.py
@@ -0,0 +1,85 @@
+# -*- coding: utf-8 -*-
+
+import datetime
+import hashlib
+import time
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class NoPremiumPl(Account):
+ __name = "NoPremiumPl"
+ __version = "0.01"
+ __type = "account"
+ __description = "NoPremium.pl account plugin"
+ __license = "GPLv3"
+ __authors = [("goddie", "dev@nopremium.pl")]
+
+ _api_url = "http://crypt.nopremium.pl"
+
+ _api_query = {
+ "site": "nopremium",
+ "username": "",
+ "password": "",
+ "output": "json",
+ "loc": "1",
+ "info": "1"
+ }
+
+ _req = None
+ _usr = None
+ _pwd = None
+
+
+ def loadAccountInfo(self, name, req):
+ self._req = req
+ try:
+ result = json_loads(self.runAuthQuery())
+ except Exception:
+ #@TODO: return or let it be thrown?
+ return
+
+ premium = False
+ valid_untill = -1
+
+ if "expire" in result.keys() and result['expire']:
+ premium = True
+ valid_untill = time.mktime(datetime.datetime.fromtimestamp(int(result['expire'])).timetuple())
+ traffic_left = result['balance'] * 2 ** 20
+
+ return ({
+ "validuntil": valid_untill,
+ "trafficleft": traffic_left,
+ "premium": premium
+ })
+
+
+ def login(self, user, data, req):
+ self._usr = user
+ self._pwd = hashlib.sha1(hashlib.md5(data['password']).hexdigest()).hexdigest()
+ self._req = req
+
+ try:
+ response = json_loads(self.runAuthQuery())
+ except Exception:
+ self.wrongPassword()
+
+ if "errno" in response.keys():
+ self.wrongPassword()
+ data['usr'] = self._usr
+ data['pwd'] = self._pwd
+
+
+ def createAuthQuery(self):
+ query = self._api_query
+ query['username'] = self._usr
+ query['password'] = self._pwd
+
+ return query
+
+
+ def runAuthQuery(self):
+ data = self._req.load(self._api_url, post=self.createAuthQuery())
+
+ return data
diff --git a/pyload/plugin/account/NosuploadCom.py b/pyload/plugin/account/NosuploadCom.py
new file mode 100644
index 000000000..10f9007a6
--- /dev/null
+++ b/pyload/plugin/account/NosuploadCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class NosuploadCom(XFSAccount):
+ __name = "NosuploadCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Nosupload.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "nosupload.com"
diff --git a/pyload/plugin/account/NovafileCom.py b/pyload/plugin/account/NovafileCom.py
new file mode 100644
index 000000000..8400cc267
--- /dev/null
+++ b/pyload/plugin/account/NovafileCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class NovafileCom(XFSAccount):
+ __name = "NovafileCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Novafile.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "novafile.com"
diff --git a/pyload/plugin/account/NowVideoSx.py b/pyload/plugin/account/NowVideoSx.py
new file mode 100644
index 000000000..f072e3687
--- /dev/null
+++ b/pyload/plugin/account/NowVideoSx.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class NowVideoSx(Account):
+ __name = "NowVideoSx"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """NowVideo.at account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ VALID_UNTIL_PATTERN = r'>Your premium membership expires on: (.+?)<'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = -1
+ premium = None
+
+ html = req.load("http://www.nowvideo.sx/premium.php")
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ expiredate = m.group(1).strip()
+ self.logDebug("Expire date: " + expiredate)
+
+ try:
+ validuntil = time.mktime(time.strptime(expiredate, "%Y-%b-%d"))
+
+ except Exception, e:
+ self.logError(e)
+
+ else:
+ if validuntil > time.mktime(time.gmtime()):
+ premium = True
+ else:
+ premium = False
+ validuntil = -1
+
+ return {"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://www.nowvideo.sx/login.php",
+ post={'user': user, 'pass': data['password']},
+ decode=True)
+
+ if re.search(r'>Log In<', html):
+ self.wrongPassword()
diff --git a/pyload/plugin/account/OboomCom.py b/pyload/plugin/account/OboomCom.py
new file mode 100644
index 000000000..8b33d0612
--- /dev/null
+++ b/pyload/plugin/account/OboomCom.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+try:
+ from beaker.crypto.pbkdf2 import PBKDF2
+
+except ImportError:
+ from beaker.crypto.pbkdf2 import pbkdf2
+ from binascii import b2a_hex
+
+ class PBKDF2(object):
+
+ def __init__(self, passphrase, salt, iterations=1000):
+ self.passphrase = passphrase
+ self.salt = salt
+ self.iterations = iterations
+
+
+ def hexread(self, octets):
+ return b2a_hex(pbkdf2(self.passphrase, self.salt, self.iterations, octets))
+
+from pyload.utils import json_loads
+from pyload.plugin.Account import Account
+
+
+class OboomCom(Account):
+ __name = "OboomCom"
+ __type = "account"
+ __version = "0.24"
+
+ __description = """Oboom.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("stanley", "stanley.foerster@gmail.com")]
+
+
+ def loadAccountData(self, user, req):
+ passwd = self.getAccountData(user)['password']
+ salt = passwd[::-1]
+ pbkdf2 = PBKDF2(passwd, salt, 1000).hexread(16)
+
+ result = json_loads(req.load("https://www.oboom.com/1/login", get={"auth": user, "pass": pbkdf2}))
+
+ if not result[0] == 200:
+ self.logWarning(_("Failed to log in: %s") % result[1])
+ self.wrongPassword()
+
+ return result[1]
+
+
+ def loadAccountInfo(self, name, req):
+ accountData = self.loadAccountData(name, req)
+
+ userData = accountData['user']
+
+ if userData['premium'] == "null":
+ premium = False
+ else:
+ premium = True
+
+ if userData['premium_unix'] == "null":
+ validUntil = -1
+ else:
+ validUntil = float(userData['premium_unix'])
+
+ traffic = userData['traffic']
+
+ trafficLeft = traffic['current']
+ maxTraffic = traffic['max']
+
+ session = accountData['session']
+
+ return {'premium' : premium,
+ 'validuntil' : validUntil,
+ 'trafficleft': trafficLeft,
+ 'maxtraffic' : maxTraffic,
+ 'session' : session}
+
+
+ def login(self, user, data, req):
+ self.loadAccountData(user, req)
diff --git a/pyload/plugin/account/OneFichierCom.py b/pyload/plugin/account/OneFichierCom.py
new file mode 100644
index 000000000..fbe5ed022
--- /dev/null
+++ b/pyload/plugin/account/OneFichierCom.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pycurl import REFERER
+
+from pyload.plugin.Account import Account
+
+
+class OneFichierCom(Account):
+ __name = "OneFichierCom"
+ __type = "account"
+ __version = "0.12"
+
+ __description = """1fichier.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Elrick69", "elrick69[AT]rocketmail[DOT]com"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ VALID_UNTIL_PATTERN = r'Your Premium Status will end the (\d+/\d+/\d+)'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = -1
+ premium = None
+
+ html = req.load("https://1fichier.com/console/abo.pl")
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ expiredate = m.group(1)
+ self.logDebug("Expire date: " + expiredate)
+
+ try:
+ validuntil = time.mktime(time.strptime(expiredate, "%d/%m/%Y"))
+ except Exception, e:
+ self.logError(e)
+ else:
+ premium = True
+
+ return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium or False}
+
+
+ def login(self, user, data, req):
+ req.http.c.setopt(REFERER, "https://1fichier.com/login.pl?lg=en")
+
+ html = req.load("https://1fichier.com/login.pl?lg=en",
+ post={'mail' : user,
+ 'pass' : data['password'],
+ 'It' : "on",
+ 'purge' : "off",
+ 'valider': "Send"},
+ decode=True)
+
+ if '>Invalid email address' in html or '>Invalid password' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/OverLoadMe.py b/pyload/plugin/account/OverLoadMe.py
new file mode 100644
index 000000000..d65e4ad31
--- /dev/null
+++ b/pyload/plugin/account/OverLoadMe.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class OverLoadMe(Account):
+ __name = "OverLoadMe"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """Over-Load.me account plugin"""
+ __license = "GPLv3"
+ __authors = [("marley", "marley@over-load.me")]
+
+
+ def loadAccountInfo(self, user, req):
+ https = "https" if self.getConfig('ssl') else "http"
+ data = self.getAccountData(user)
+ html = req.load(https + "://api.over-load.me/account.php",
+ get={'user': user,
+ 'auth': data['password']}).strip()
+
+ data = json_loads(html)
+ self.logDebug(data)
+
+ # Check for premium
+ if data['membership'] == "Free":
+ return {'premium': False, 'validuntil': None, 'trafficleft': None}
+ else:
+ return {'premium': True, 'validuntil': data['expirationunix'], 'trafficleft': -1}
+
+
+ def login(self, user, data, req):
+ https = "https" if self.getConfig('ssl') else "http"
+ jsondata = req.load(https + "://api.over-load.me/account.php",
+ get={'user': user,
+ 'auth': data['password']}).strip()
+
+ data = json_loads(jsondata)
+
+ if data['err'] == 1:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/PremiumTo.py b/pyload/plugin/account/PremiumTo.py
new file mode 100644
index 000000000..586ddf635
--- /dev/null
+++ b/pyload/plugin/account/PremiumTo.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class PremiumTo(Account):
+ __name = "PremiumTo"
+ __type = "account"
+ __version = "0.08"
+
+ __description = """Premium.to account plugin"""
+ __license = "GPLv3"
+ __authors = [("RaNaN", "RaNaN@pyload.org"),
+ ("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ traffic = req.load("http://premium.to/api/straffic.php",
+ get={'username': self.username, 'password': self.password})
+
+ if "wrong username" not in traffic:
+ trafficleft = sum(map(float, traffic.split(';')))
+ return {'premium': True, 'trafficleft': trafficleft, 'validuntil': -1}
+ else:
+ return {'premium': False, 'trafficleft': None, 'validuntil': None}
+
+
+ def login(self, user, data, req):
+ self.username = user
+ self.password = data['password']
+ authcode = req.load("http://premium.to/api/getauthcode.php",
+ get={'username': user, 'password': self.password},
+ decode=True)
+
+ if "wrong username" in authcode:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/PremiumizeMe.py b/pyload/plugin/account/PremiumizeMe.py
new file mode 100644
index 000000000..06e6ffb98
--- /dev/null
+++ b/pyload/plugin/account/PremiumizeMe.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+from pyload.utils import json_loads
+
+
+class PremiumizeMe(Account):
+ __name = "PremiumizeMe"
+ __type = "account"
+ __version = "0.13"
+
+ __description = """Premiumize.me account plugin"""
+ __license = "GPLv3"
+ __authors = [("Florian Franzen", "FlorianFranzen@gmail.com")]
+
+
+ def loadAccountInfo(self, user, req):
+ # Get user data from premiumize.me
+ status = self.getAccountStatus(user, req)
+ self.logDebug(status)
+
+ # Parse account info
+ account_info = {"validuntil": float(status['result']['expires']),
+ "trafficleft": max(0, status['result']['trafficleft_bytes'])}
+
+ if status['result']['type'] == 'free':
+ account_info['premium'] = False
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ # Get user data from premiumize.me
+ status = self.getAccountStatus(user, req)
+
+ # Check if user and password are valid
+ if status['status'] != 200:
+ self.wrongPassword()
+
+
+ def getAccountStatus(self, user, req):
+ # Use premiumize.me API v1 (see https://secure.premiumize.me/?show=api)
+ # to retrieve account info and return the parsed json answer
+ answer = req.load("https://api.premiumize.me/pm-api/v1.php",
+ get={'method' : "accountstatus",
+ 'params[login]': user,
+ 'params[pass]' : self.getAccountData(user)['password']})
+ return json_loads(answer)
diff --git a/pyload/plugin/account/PutdriveCom.py b/pyload/plugin/account/PutdriveCom.py
new file mode 100644
index 000000000..3d7279034
--- /dev/null
+++ b/pyload/plugin/account/PutdriveCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.account.ZeveraCom import ZeveraCom
+
+
+class PutdriveCom(ZeveraCom):
+ __name = "PutdriveCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Putdrive.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "putdrive.com"
diff --git a/pyload/plugin/account/QuickshareCz.py b/pyload/plugin/account/QuickshareCz.py
new file mode 100644
index 000000000..2f71d9ae8
--- /dev/null
+++ b/pyload/plugin/account/QuickshareCz.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class QuickshareCz(Account):
+ __name = "QuickshareCz"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Quickshare.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ TRAFFIC_LEFT_PATTERN = r'Stav kreditu: <strong>(.+?)</strong>'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.quickshare.cz/premium", decode=True)
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ if m:
+ trafficleft = self.parseTraffic(m.group(1))
+ premium = bool(trafficleft)
+ else:
+ trafficleft = None
+ premium = False
+
+ return {"validuntil": -1, "trafficleft": trafficleft, "premium": premium}
+
+
+ def login(self, user, data, req):
+ html = req.load('http://www.quickshare.cz/html/prihlaseni_process.php',
+ post={"akce": u'Přihlásit',
+ "heslo": data['password'],
+ "jmeno": user},
+ decode=True)
+
+ if u'>Takový uživatel neexistuje.<' in html or u'>Špatné heslo.<' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/RPNetBiz.py b/pyload/plugin/account/RPNetBiz.py
new file mode 100644
index 000000000..562436e85
--- /dev/null
+++ b/pyload/plugin/account/RPNetBiz.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class RPNetBiz(Account):
+ __name = "RPNetBiz"
+ __type = "account"
+ __version = "0.12"
+
+ __description = """RPNet.biz account plugin"""
+ __license = "GPLv3"
+ __authors = [("Dman", "dmanugm@gmail.com")]
+
+
+ def loadAccountInfo(self, user, req):
+ # Get account information from rpnet.biz
+ res = self.getAccountStatus(user, req)
+ try:
+ if res['accountInfo']['isPremium']:
+ # Parse account info. Change the trafficleft later to support per host info.
+ account_info = {"validuntil": float(res['accountInfo']['premiumExpiry']),
+ "trafficleft": -1, "premium": True}
+ else:
+ account_info = {"validuntil": None, "trafficleft": None, "premium": False}
+
+ except KeyError:
+ # handle wrong password exception
+ account_info = {"validuntil": None, "trafficleft": None, "premium": False}
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ # Get account information from rpnet.biz
+ res = self.getAccountStatus(user, req)
+
+ # If we have an error in the res, we have wrong login information
+ if 'error' in res:
+ self.wrongPassword()
+
+
+ def getAccountStatus(self, user, req):
+ # Using the rpnet API, check if valid premium account
+ res = req.load("https://premium.rpnet.biz/client_api.php",
+ get={"username": user, "password": self.getAccountData(user)['password'],
+ "action": "showAccountInformation"})
+ self.logDebug("JSON data: %s" % res)
+
+ return json_loads(res)
diff --git a/pyload/plugin/account/RapideoPl.py b/pyload/plugin/account/RapideoPl.py
new file mode 100644
index 000000000..c58414b53
--- /dev/null
+++ b/pyload/plugin/account/RapideoPl.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+
+import datetime
+import hashlib
+import time
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class RapideoPl(Account):
+ __name = "RapideoPl"
+ __version = "0.01"
+ __type = "account"
+ __description = "Rapideo.pl account plugin"
+ __license = "GPLv3"
+ __authors = [("goddie", "dev@rapideo.pl")]
+
+ _api_url = "http://enc.rapideo.pl"
+
+ _api_query = {
+ "site": "newrd",
+ "username": "",
+ "password": "",
+ "output": "json",
+ "loc": "1",
+ "info": "1"
+ }
+
+ _req = None
+ _usr = None
+ _pwd = None
+
+
+ def loadAccountInfo(self, name, req):
+ self._req = req
+ try:
+ result = json_loads(self.runAuthQuery())
+ except Exception:
+ #@TODO: return or let it be thrown?
+ return
+
+ premium = False
+ valid_untill = -1
+ if "expire" in result.keys() and result['expire']:
+ premium = True
+ valid_untill = time.mktime(datetime.datetime.fromtimestamp(int(result['expire'])).timetuple())
+
+ traffic_left = result['balance']
+
+ return ({
+ "validuntil": valid_untill,
+ "trafficleft": traffic_left,
+ "premium": premium
+ })
+
+
+ def login(self, user, data, req):
+ self._usr = user
+ self._pwd = hashlib.md5(data['password']).hexdigest()
+ self._req = req
+ try:
+ response = json_loads(self.runAuthQuery())
+ except Exception:
+ self.wrongPassword()
+
+ if "errno" in response.keys():
+ self.wrongPassword()
+ data['usr'] = self._usr
+ data['pwd'] = self._pwd
+
+
+ def createAuthQuery(self):
+ query = self._api_query
+ query['username'] = self._usr
+ query['password'] = self._pwd
+
+ return query
+
+
+ def runAuthQuery(self):
+ data = self._req.load(self._api_url, post=self.createAuthQuery())
+
+ return data
diff --git a/pyload/plugin/account/RapidfileshareNet.py b/pyload/plugin/account/RapidfileshareNet.py
new file mode 100644
index 000000000..0b0ed210c
--- /dev/null
+++ b/pyload/plugin/account/RapidfileshareNet.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class RapidfileshareNet(XFSAccount):
+ __name = "RapidfileshareNet"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Rapidfileshare.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "rapidfileshare.net"
+
+ TRAFFIC_LEFT_PATTERN = r'>Traffic available today:</TD><TD><label for="name">\s*(?P<S>[\d.,]+)\s*(?:(?P<U>[\w^_]+))?'
diff --git a/pyload/plugin/account/RapidgatorNet.py b/pyload/plugin/account/RapidgatorNet.py
new file mode 100644
index 000000000..729635037
--- /dev/null
+++ b/pyload/plugin/account/RapidgatorNet.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class RapidgatorNet(Account):
+ __name = "RapidgatorNet"
+ __type = "account"
+ __version = "0.09"
+
+ __description = """Rapidgator.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ API_URL = "http://rapidgator.net/api/user"
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = None
+ premium = False
+ sid = None
+
+ try:
+ sid = self.getAccountData(user).get('sid')
+ assert sid
+
+ html = req.load("%s/info" % self.API_URL, get={'sid': sid})
+
+ self.logDebug("API:USERINFO", html)
+
+ json = json_loads(html)
+
+ if json['response_status'] == 200:
+ if "reset_in" in json['response']:
+ self.scheduleRefresh(user, json['response']['reset_in'])
+
+ validuntil = json['response']['expire_date']
+ trafficleft = float(json['response']['traffic_left'])
+ premium = True
+ else:
+ self.logError(json['response_details'])
+
+ except Exception, e:
+ self.logError(e)
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium,
+ 'sid' : sid}
+
+
+ def login(self, user, data, req):
+ try:
+ html = req.load('%s/login' % self.API_URL, post={"username": user, "password": data['password']})
+
+ self.logDebug("API:LOGIN", html)
+
+ json = json_loads(html)
+
+ if json['response_status'] == 200:
+ data['sid'] = str(json['response']['session_id'])
+ return
+ else:
+ self.logError(json['response_details'])
+
+ except Exception, e:
+ self.logError(e)
+
+ self.wrongPassword()
diff --git a/pyload/plugin/account/RapiduNet.py b/pyload/plugin/account/RapiduNet.py
new file mode 100644
index 000000000..c19e54a9b
--- /dev/null
+++ b/pyload/plugin/account/RapiduNet.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class RapiduNet(Account):
+ __name = "RapiduNet"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Rapidu.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("prOq", None),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ PREMIUM_PATTERN = r'>Account: <b>Premium'
+
+ VALID_UNTIL_PATTERN = r'>Account: <b>\w+ \((\d+)'
+
+ TRAFFIC_LEFT_PATTERN = r'class="tipsyS"><b>(.+?)<'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = -1
+ premium = False
+
+ html = req.load("https://rapidu.net/", decode=True)
+
+ if re.search(self.PREMIUM_PATTERN, html):
+ premium = True
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ validuntil = time.time() + (86400 * int(m.group(1)))
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ if m:
+ trafficleft = self.parseTraffic(m.group(1))
+
+ return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ req.load("https://rapidu.net/ajax.php",
+ get={'a': "getChangeLang"},
+ post={'_go' : "",
+ 'lang': "en"})
+
+ json = json_loads(req.load("https://rapidu.net/ajax.php",
+ get={'a': "getUserLogin"},
+ post={'_go' : "",
+ 'login' : user,
+ 'pass' : data['password'],
+ 'remember': "1"}))
+
+ self.logDebug(json)
+
+ if not json['message'] == "success":
+ self.wrongPassword()
diff --git a/pyload/plugin/account/RarefileNet.py b/pyload/plugin/account/RarefileNet.py
new file mode 100644
index 000000000..fc736bafc
--- /dev/null
+++ b/pyload/plugin/account/RarefileNet.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class RarefileNet(XFSAccount):
+ __name = "RarefileNet"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """RareFile.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ HOSTER_DOMAIN = "rarefile.net"
diff --git a/pyload/plugin/account/RealdebridCom.py b/pyload/plugin/account/RealdebridCom.py
new file mode 100644
index 000000000..0d28f2ad6
--- /dev/null
+++ b/pyload/plugin/account/RealdebridCom.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+import xml.dom.minidom as dom
+
+from pyload.plugin.Account import Account
+
+
+class RealdebridCom(Account):
+ __name = "RealdebridCom"
+ __type = "account"
+ __version = "0.45"
+
+ __description = """Real-Debrid.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Devirex Hazzard", "naibaf_11@yahoo.de")]
+
+
+ def loadAccountInfo(self, user, req):
+ if self.pin_code:
+ return {"premium": False}
+ html = req.load("https://real-debrid.com/api/account.php")
+ xml = dom.parseString(html)
+ account_info = {"validuntil": float(xml.getElementsByTagName("expiration")[0].childNodes[0].nodeValue),
+ "trafficleft": -1}
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ self.pin_code = False
+ html = req.load("https://real-debrid.com/ajax/login.php",
+ get={"user": user, "pass": data['password']},
+ decode=True)
+
+ if "Your login informations are incorrect" in html:
+ self.wrongPassword()
+
+ elif "PIN Code required" in html:
+ self.logWarning(_("PIN code required. Please login to https://real-debrid.com using the PIN or disable the double authentication in your control panel on https://real-debrid.com"))
+ self.pin_code = True
diff --git a/pyload/plugin/account/RehostTo.py b/pyload/plugin/account/RehostTo.py
new file mode 100644
index 000000000..3b02145fc
--- /dev/null
+++ b/pyload/plugin/account/RehostTo.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class RehostTo(Account):
+ __name = "RehostTo"
+ __type = "account"
+ __version = "0.16"
+
+ __description = """Rehost.to account plugin"""
+ __license = "GPLv3"
+ __authors = [("RaNaN", "RaNaN@pyload.org")]
+
+
+ def loadAccountInfo(self, user, req):
+ premium = False
+ 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" 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,
+ 'validuntil' : validuntil,
+ 'session' : session}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://rehost.to/api.php",
+ get={'cmd': "login", 'user': user, 'pass': data['password']},
+ decode=True)
+
+ if "ERROR" in html:
+ self.logDebug(html)
+ self.wrongPassword()
diff --git a/pyload/plugin/account/RyushareCom.py b/pyload/plugin/account/RyushareCom.py
new file mode 100644
index 000000000..f34d1d388
--- /dev/null
+++ b/pyload/plugin/account/RyushareCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class RyushareCom(XFSAccount):
+ __name = "RyushareCom"
+ __type = "account"
+ __version = "0.06"
+
+ __description = """Ryushare.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "ryushare.com"
diff --git a/pyload/plugin/account/SafesharingEu.py b/pyload/plugin/account/SafesharingEu.py
new file mode 100644
index 000000000..eae8140fb
--- /dev/null
+++ b/pyload/plugin/account/SafesharingEu.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class SafesharingEu(XFSAccount):
+ __name = "SafesharingEu"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Safesharing.eu account plugin"""
+ __license = "GPLv3"
+ __authors = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "safesharing.eu"
diff --git a/pyload/plugin/account/SecureUploadEu.py b/pyload/plugin/account/SecureUploadEu.py
new file mode 100644
index 000000000..b349e893f
--- /dev/null
+++ b/pyload/plugin/account/SecureUploadEu.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class SecureUploadEu(XFSAccount):
+ __name = "SecureUploadEu"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """SecureUpload.eu account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "secureupload.eu"
diff --git a/pyload/plugin/account/SendmywayCom.py b/pyload/plugin/account/SendmywayCom.py
new file mode 100644
index 000000000..add0b2183
--- /dev/null
+++ b/pyload/plugin/account/SendmywayCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class SendmywayCom(XFSAccount):
+ __name = "SendmywayCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Sendmyway.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "sendmyway.com"
diff --git a/pyload/plugin/account/ShareonlineBiz.py b/pyload/plugin/account/ShareonlineBiz.py
new file mode 100644
index 000000000..06b2818c9
--- /dev/null
+++ b/pyload/plugin/account/ShareonlineBiz.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class ShareonlineBiz(Account):
+ __name = "ShareonlineBiz"
+ __type = "account"
+ __version = "0.31"
+
+ __description = """Share-online.biz account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def api_response(self, user, req):
+ return req.load("http://api.share-online.biz/cgi-bin",
+ get={'q' : "userdetails",
+ 'aux' : "traffic",
+ 'username': user,
+ 'password': self.getAccountData(user)['password']})
+
+
+ def loadAccountInfo(self, user, req):
+ premium = False
+ validuntil = None
+ trafficleft = -1
+ maxtraffic = 100 * 2 ** 30 #: 100 GB
+
+ api = {}
+ for line in self.api_response(user, req).splitlines():
+ if "=" in line:
+ key, value = line.split("=")
+ api[key] = value
+
+ self.logDebug(api)
+
+ if api['a'].lower() != "not_available":
+ req.cj.setCookie("share-online.biz", 'a', api['a'])
+
+ premium = api['group'] in ("Premium", "PrePaid")
+
+ validuntil = float(api['expire_date'])
+
+ traffic = float(api['traffic_1d'].split(";")[0])
+ maxtraffic = max(maxtraffic, traffic)
+ trafficleft = maxtraffic - traffic
+
+ return {'premium' : premium,
+ 'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'maxtraffic' : maxtraffic}
+
+
+ def login(self, user, data, req):
+ html = self.api_response(user, req)
+ err = re.search(r'\*\*(.+?)\*\*', html)
+ if err:
+ self.logError(err.group(1))
+ self.wrongPassword()
diff --git a/pyload/plugin/account/SimplyPremiumCom.py b/pyload/plugin/account/SimplyPremiumCom.py
new file mode 100644
index 000000000..2547dad56
--- /dev/null
+++ b/pyload/plugin/account/SimplyPremiumCom.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.Account import Account
+
+
+class SimplyPremiumCom(Account):
+ __name = "SimplyPremiumCom"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Simply-Premium.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("EvolutionClip", "evolutionclip@live.de")]
+
+
+ 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: %s" % json_data)
+
+ json_data = json_loads(json_data)
+
+ 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 'remain_traffic' in json_data['result'] and json_data['result']['remain_traffic']:
+ trafficleft = float(json_data['result']['remain_traffic'])
+
+ return {"premium": premium, "validuntil": validuntil, "trafficleft": trafficleft}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("simply-premium.com", "lang", "EN")
+
+ 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/pyload/plugin/account/SimplydebridCom.py b/pyload/plugin/account/SimplydebridCom.py
new file mode 100644
index 000000000..dc855c441
--- /dev/null
+++ b/pyload/plugin/account/SimplydebridCom.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+from pyload.plugin.Account import Account
+
+
+class SimplydebridCom(Account):
+ __name = "SimplydebridCom"
+ __type = "account"
+ __version = "0.11"
+
+ __description = """Simply-Debrid.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Kagenoshin", "kagenoshin@gmx.ch")]
+
+
+ def loadAccountInfo(self, user, req):
+ get_data = {'login': 2, 'u': self.loginname, 'p': self.password}
+ res = req.load("http://simply-debrid.com/api.php", get=get_data, decode=True)
+ data = [x.strip() for x in res.split(";")]
+ if str(data[0]) != "1":
+ return {"premium": False}
+ else:
+ return {"trafficleft": -1, "validuntil": time.mktime(time.strptime(str(data[2]), "%d/%m/%Y"))}
+
+
+ def login(self, user, data, req):
+ self.loginname = user
+ self.password = data['password']
+ get_data = {'login': 1, 'u': self.loginname, 'p': self.password}
+
+ res = req.load("http://simply-debrid.com/api.php", get=get_data, decode=True)
+ if res != "02: loggin success":
+ self.wrongPassword()
diff --git a/pyload/plugin/account/SmoozedCom.py b/pyload/plugin/account/SmoozedCom.py
new file mode 100644
index 000000000..f24799caf
--- /dev/null
+++ b/pyload/plugin/account/SmoozedCom.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+
+import hashlib
+import time
+
+try:
+ from beaker.crypto.pbkdf2 import PBKDF2
+
+except ImportError:
+ from beaker.crypto.pbkdf2 import pbkdf2
+ from binascii import b2a_hex
+
+ class PBKDF2(object):
+
+ def __init__(self, passphrase, salt, iterations=1000):
+ self.passphrase = passphrase
+ self.salt = salt
+ self.iterations = iterations
+
+
+ def hexread(self, octets):
+ return b2a_hex(pbkdf2(self.passphrase, self.salt, self.iterations, octets))
+
+from pyload.utils import json_loads
+from pyload.plugin.Account import Account
+
+
+class SmoozedCom(Account):
+ __name = "SmoozedCom"
+ __type = "account"
+ __version = "0.04"
+
+ __description = """Smoozed.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("", "")]
+
+
+ def loadAccountInfo(self, user, req):
+ # Get user data from premiumize.me
+ status = self.getAccountStatus(user, req)
+
+ self.logDebug(status)
+
+ if status['state'] != 'ok':
+ info = {'validuntil' : None,
+ 'trafficleft': None,
+ 'premium' : False}
+ else:
+ # Parse account info
+ info = {'validuntil' : float(status['data']['user']['user_premium']),
+ 'trafficleft': max(0, status['data']['traffic'][1] - status['data']['traffic'][0]),
+ 'session' : status['data']['session_key'],
+ 'hosters' : [hoster['name'] for hoster in status['data']['hoster']]}
+
+ if info['validuntil'] < time.time():
+ info['premium'] = False
+ else:
+ info['premium'] = True
+
+ return info
+
+
+ def login(self, user, data, req):
+ # Get user data from premiumize.me
+ status = self.getAccountStatus(user, req)
+
+ # Check if user and password are valid
+ if status['state'] != 'ok':
+ self.wrongPassword()
+
+
+ def getAccountStatus(self, user, req):
+ password = self.getAccountData(user)['password']
+ salt = hashlib.sha256(password).hexdigest()
+ encrypted = PBKDF2(password, salt, iterations=1000).hexread(32)
+
+ return json_loads(req.load("http://www2.smoozed.com/api/login",
+ get={'auth': user, 'password': encrypted}))
diff --git a/pyload/plugin/account/StahnuTo.py b/pyload/plugin/account/StahnuTo.py
new file mode 100644
index 000000000..57f9adc10
--- /dev/null
+++ b/pyload/plugin/account/StahnuTo.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class StahnuTo(Account):
+ __name = "StahnuTo"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """StahnuTo account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.stahnu.to/")
+
+ m = re.search(r'>VIP: (\d+.*)<', html)
+ trafficleft = self.parseTraffic(m.group(1)) if m else 0
+
+ return {"premium": trafficleft > 512, "trafficleft": trafficleft, "validuntil": -1}
+
+
+ def login(self, user, data, req):
+ html = req.load("http://www.stahnu.to/login.php",
+ post={"username": user,
+ "password": data['password'],
+ "submit": "Login"},
+ decode=True)
+
+ if not '<a href="logout.php">' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/StreamcloudEu.py b/pyload/plugin/account/StreamcloudEu.py
new file mode 100644
index 000000000..f3eb6cce9
--- /dev/null
+++ b/pyload/plugin/account/StreamcloudEu.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class StreamcloudEu(XFSAccount):
+ __name = "StreamcloudEu"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Streamcloud.eu account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "streamcloud.eu"
diff --git a/pyload/plugin/account/TurbobitNet.py b/pyload/plugin/account/TurbobitNet.py
new file mode 100644
index 000000000..4b1b6b2a0
--- /dev/null
+++ b/pyload/plugin/account/TurbobitNet.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class TurbobitNet(Account):
+ __name = "TurbobitNet"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """TurbobitNet account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://turbobit.net")
+
+ m = re.search(r'<u>Turbo Access</u> to ([\d.]+)', html)
+ if m:
+ premium = True
+ validuntil = time.mktime(time.strptime(m.group(1), "%d.%m.%Y"))
+ else:
+ premium = False
+ validuntil = -1
+
+ return {"premium": premium, "trafficleft": -1, "validuntil": validuntil}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("turbobit.net", "user_lang", "en")
+
+ html = req.load("http://turbobit.net/user/login",
+ post={"user[login]": user,
+ "user[pass]": data['password'],
+ "user[submit]": "Login"},
+ decode=True)
+
+ if not '<div class="menu-item user-name">' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/TusfilesNet.py b/pyload/plugin/account/TusfilesNet.py
new file mode 100644
index 000000000..b18d49748
--- /dev/null
+++ b/pyload/plugin/account/TusfilesNet.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class TusfilesNet(XFSAccount):
+ __name = "TusfilesNet"
+ __type = "account"
+ __version = "0.06"
+
+ __description = """Tusfile.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "tusfiles.net"
+
+ VALID_UNTIL_PATTERN = r'<span class="label label-default">([^<]+)</span>'
+ TRAFFIC_LEFT_PATTERN = r'<td><img src="//www\.tusfiles\.net/i/icon/meter\.png" alt=""/></td>\n<td>&nbsp;(?P<S>[\d.,]+)'
diff --git a/pyload/plugin/account/UlozTo.py b/pyload/plugin/account/UlozTo.py
new file mode 100644
index 000000000..c43246e7d
--- /dev/null
+++ b/pyload/plugin/account/UlozTo.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from urlparse import urljoin
+
+from pyload.plugin.Account import Account
+
+
+class UlozTo(Account):
+ __name = "UlozTo"
+ __type = "account"
+ __version = "0.10"
+
+ __description = """Uloz.to account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("pulpe", "")]
+
+
+ TRAFFIC_LEFT_PATTERN = r'<li class="menu-kredit"><a .*?title=".+?GB = ([\d.]+) MB"'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.ulozto.net/", decode=True)
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+
+ trafficleft = float(m.group(1).replace(' ', '').replace(',', '.')) * 1000 * 1.048 if m else 0
+ premium = bool(trafficleft)
+
+ return {'validuntil': -1, 'trafficleft': trafficleft, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ login_page = req.load('http://www.ulozto.net/?do=web-login', decode=True)
+ action = re.findall('<form action="(.+?)"', login_page)[1].replace('&amp;', '&')
+ token = re.search('_token_" value="(.+?)"', login_page).group(1)
+
+ html = req.load(urljoin("http://www.ulozto.net/", action),
+ post={'_token_' : token,
+ 'do' : "loginForm-submit",
+ 'login' : u"Přihlásit",
+ 'password': data['password'],
+ 'username': user,
+ 'remember': "on"},
+ decode=True)
+
+ if '<div class="flash error">' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/UnrestrictLi.py b/pyload/plugin/account/UnrestrictLi.py
new file mode 100644
index 000000000..d57b998ca
--- /dev/null
+++ b/pyload/plugin/account/UnrestrictLi.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+from pyload.utils import json_loads
+
+
+class UnrestrictLi(Account):
+ __name = "UnrestrictLi"
+ __type = "account"
+ __version = "0.05"
+
+ __description = """Unrestrict.li account plugin"""
+ __license = "GPLv3"
+ __authors = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def loadAccountInfo(self, user, req):
+ json_data = req.load('http://unrestrict.li/api/jdownloader/user.php?format=json')
+ self.logDebug("JSON data: " + json_data)
+ json_data = json_loads(json_data)
+
+ if 'vip' in json_data['result'] and json_data['result']['vip'] == 0:
+ return {"premium": False}
+
+ validuntil = json_data['result']['expires']
+ trafficleft = float(json_data['result']['traffic'])
+
+ return {"premium": True, "validuntil": validuntil, "trafficleft": trafficleft}
+
+
+ def login(self, user, data, req):
+ req.cj.setCookie("unrestrict.li", "lang", "EN")
+ html = req.load("https://unrestrict.li/sign_in", decode=True)
+
+ if 'solvemedia' in html:
+ self.logError(_("A Captcha is required. Go to http://unrestrict.li/sign_in and login, then retry"))
+ return
+
+ post_data = {"username": user, "password": data['password'],
+ "remember_me": "remember", "signin": "Sign in"}
+ html = req.load("https://unrestrict.li/sign_in", post=post_data, decode=True)
+
+ if 'sign_out' not in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/UploadableCh.py b/pyload/plugin/account/UploadableCh.py
new file mode 100644
index 000000000..c95fe7f0b
--- /dev/null
+++ b/pyload/plugin/account/UploadableCh.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.Account import Account
+
+
+class UploadableCh(Account):
+ __name = "UploadableCh"
+ __type = "account"
+ __version = "0.03"
+
+ __description = """Uploadable.ch account plugin"""
+ __license = "GPLv3"
+ __authors = [("Sasch", "gsasch@gmail.com")]
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("http://www.uploadable.ch/login.php")
+
+ premium = '<a href="/logout.php"' in html
+ trafficleft = -1 if premium else None
+
+ return {'validuntil': None, 'trafficleft': trafficleft, 'premium': premium} #@TODO: validuntil
+
+
+ def login(self, user, data, req):
+ html = req.load("http://www.uploadable.ch/login.php",
+ post={'userName' : user,
+ 'userPassword' : data['password'],
+ 'autoLogin' : "1",
+ 'action__login': "normalLogin"},
+ decode=True)
+
+ if "Login failed" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/UploadcCom.py b/pyload/plugin/account/UploadcCom.py
new file mode 100644
index 000000000..01102168c
--- /dev/null
+++ b/pyload/plugin/account/UploadcCom.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class UploadcCom(XFSAccount):
+ __name = "UploadcCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """Uploadc.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "uploadc.com"
diff --git a/pyload/plugin/account/UploadedTo.py b/pyload/plugin/account/UploadedTo.py
new file mode 100644
index 000000000..1b8ae5b27
--- /dev/null
+++ b/pyload/plugin/account/UploadedTo.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+
+
+class UploadedTo(Account):
+ __name = "UploadedTo"
+ __type = "account"
+ __version = "0.30"
+
+ __description = """Uploaded.to account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ PREMIUM_PATTERN = r'<em>Premium</em>'
+ VALID_UNTIL_PATTERN = r'<td>Duration:</td>\s*<th>(.+?)<'
+ TRAFFIC_LEFT_PATTERN = r'<b class="cB">(?P<S>[\d.,]+) (?P<U>[\w^_]+)'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = None
+ premium = None
+
+ html = req.load("http://uploaded.net/me")
+
+ premium = re.search(self.PREMIUM_PATTERN, html) is not None
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html, re.M)
+ if m:
+ expiredate = m.group(1).lower().strip()
+
+ if expiredate == "unlimited":
+ validuntil = -1
+ else:
+ m = re.findall(r'(\d+) (week|day|hour)', expiredate)
+ if m:
+ validuntil = time.time()
+ for n, u in m:
+ validuntil += float(n) * 60 * 60 * {'week': 168, 'day': 24, 'hour': 1}[u]
+
+ m = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ if m:
+ traffic = m.groupdict()
+ size = traffic['S'].replace('.', '')
+ unit = traffic['U'].lower()
+
+ trafficleft = self.parseTraffic(size + unit)
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium}
+
+
+ def login(self, user, data, req):
+ # req.cj.setCookie("uploaded.net", "lang", "en")
+
+ html = req.load("http://uploaded.net/io/login",
+ post={'id': user, 'pw': data['password'], '_': ""},
+ decode=True)
+
+ if '"err"' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/UploadheroCom.py b/pyload/plugin/account/UploadheroCom.py
new file mode 100644
index 000000000..a0c8e2aa8
--- /dev/null
+++ b/pyload/plugin/account/UploadheroCom.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+
+import re
+import datetime
+import time
+
+from pyload.plugin.Account import Account
+
+
+class UploadheroCom(Account):
+ __name = "UploadheroCom"
+ __type = "account"
+ __version = "0.21"
+
+ __description = """Uploadhero.co account plugin"""
+ __license = "GPLv3"
+ __authors = [("mcmyst", "mcmyst@hotmail.fr")]
+
+
+ def loadAccountInfo(self, user, req):
+ premium_pattern = re.compile('Il vous reste <span class="bleu">(\d+)</span> jours premium')
+
+ data = self.getAccountData(user)
+ html = req.load("http://uploadhero.co/my-account")
+
+ if premium_pattern.search(html):
+ end_date = datetime.date.today() + datetime.timedelta(days=int(premium_pattern.search(html).group(1)))
+ end_date = time.mktime(future.timetuple())
+ account_info = {"validuntil": end_date, "trafficleft": -1, "premium": True}
+ else:
+ account_info = {"validuntil": -1, "trafficleft": -1, "premium": False}
+
+ return account_info
+
+
+ def login(self, user, data, req):
+ html = req.load("http://uploadhero.co/lib/connexion.php",
+ post={"pseudo_login": user, "password_login": data['password']},
+ decode=True)
+
+ if "mot de passe invalide" in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/UploadingCom.py b/pyload/plugin/account/UploadingCom.py
new file mode 100644
index 000000000..992e63615
--- /dev/null
+++ b/pyload/plugin/account/UploadingCom.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from pyload.plugin.Account import Account
+from pyload.plugin.internal.SimpleHoster import set_cookies
+
+
+class UploadingCom(Account):
+ __name = "UploadingCom"
+ __type = "account"
+ __version = "0.12"
+
+ __description = """Uploading.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("mkaay", "mkaay@mkaay.de")]
+
+
+ PREMIUM_PATTERN = r'UPGRADE TO PREMIUM'
+ VALID_UNTIL_PATTERN = r'Valid Until:(.+?)<'
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = None
+ premium = None
+
+ html = req.load("http://uploading.com/")
+
+ premium = re.search(self.PREMIUM_PATTERN, html) is None
+
+ m = re.search(self.VALID_UNTIL_PATTERN, html)
+ if m:
+ expiredate = m.group(1).strip()
+ self.logDebug("Expire date: " + expiredate)
+
+ try:
+ validuntil = time.mktime(time.strptime(expiredate, "%b %d, %Y"))
+
+ except Exception, e:
+ self.logError(e)
+
+ else:
+ if validuntil > time.mktime(time.gmtime()):
+ premium = True
+ else:
+ premium = False
+ validuntil = None
+
+ return {'validuntil' : validuntil,
+ 'trafficleft': trafficleft,
+ 'premium' : premium}
+
+
+ def login(self, user, data, req):
+ set_cookies(req.cj,
+ [("uploading.com", "lang" , "1" ),
+ ("uploading.com", "language", "1" ),
+ ("uploading.com", "setlang" , "en"),
+ ("uploading.com", "_lang" , "en")])
+
+ req.load("http://uploading.com/")
+ req.load("http://uploading.com/general/login_form/?JsHttpRequest=%s-xml" % long(time.time() * 1000),
+ post={'email': user, 'password': data['password'], 'remember': "on"})
diff --git a/pyload/plugin/account/UptoboxCom.py b/pyload/plugin/account/UptoboxCom.py
new file mode 100644
index 000000000..f7e715a33
--- /dev/null
+++ b/pyload/plugin/account/UptoboxCom.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class UptoboxCom(XFSAccount):
+ __name = "UptoboxCom"
+ __type = "account"
+ __version = "0.08"
+
+ __description = """DDLStorage.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ HOSTER_DOMAIN = "uptobox.com"
+ HOSTER_URL = "https://uptobox.com/"
+ LOGIN_URL = "https://login.uptobox.com/"
diff --git a/pyload/plugin/account/VidPlayNet.py b/pyload/plugin/account/VidPlayNet.py
new file mode 100644
index 000000000..c5d4e0b5a
--- /dev/null
+++ b/pyload/plugin/account/VidPlayNet.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class VidPlayNet(XFSAccount):
+ __name = "VidPlayNet"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """VidPlay.net account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "vidplay.net"
diff --git a/pyload/plugin/account/WebshareCz.py b/pyload/plugin/account/WebshareCz.py
new file mode 100644
index 000000000..5cbe6b1b8
--- /dev/null
+++ b/pyload/plugin/account/WebshareCz.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+
+import re
+import time
+
+from hashlib import md5, sha1
+from passlib.hash import md5_crypt
+
+from pyload.plugin.Account import Account
+
+
+class WebshareCz(Account):
+ __name = "WebshareCz"
+ __type = "account"
+ __version = "0.07"
+
+ __description = """Webshare.cz account plugin"""
+ __license = "GPLv3"
+ __authors = [("rush", "radek.senfeld@gmail.com")]
+
+
+ VALID_UNTIL_PATTERN = r'<vip_until>(.+)</vip_until>'
+
+ TRAFFIC_LEFT_PATTERN = r'<bytes>(.+)</bytes>'
+
+
+ def loadAccountInfo(self, user, req):
+ html = req.load("https://webshare.cz/api/user_data/",
+ post={'wst': self.infos['wst']},
+ decode=True)
+
+ self.logDebug("Response: " + html)
+
+ expiredate = re.search(self.VALID_UNTIL_PATTERN, html).group(1)
+ self.logDebug("Expire date: " + expiredate)
+
+ validuntil = time.mktime(time.strptime(expiredate, "%Y-%m-%d %H:%M:%S"))
+ trafficleft = self.parseTraffic(re.search(self.TRAFFIC_LEFT_PATTERN, html).group(1))
+ premium = validuntil > time.time()
+
+ return {'validuntil': validuntil, 'trafficleft': -1, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ salt = req.load("https://webshare.cz/api/salt/",
+ post={'username_or_email': user,
+ 'wst' : ""},
+ decode=True)
+
+ if "<status>OK</status>" not in salt:
+ self.wrongPassword()
+
+ salt = re.search('<salt>(.+)</salt>', salt).group(1)
+ password = sha1(md5_crypt.encrypt(data['password'], salt=salt)).hexdigest()
+ digest = md5(user + ":Webshare:" + password).hexdigest()
+
+ login = req.load("https://webshare.cz/api/login/",
+ post={'digest' : digest,
+ 'keep_logged_in' : 1,
+ 'password' : password,
+ 'username_or_email': user,
+ 'wst' : ""},
+ decode=True)
+
+ if "<status>OK</status>" not in login:
+ self.wrongPassword()
+
+ self.infos['wst'] = re.search('<token>(.+)</token>', login).group(1)
diff --git a/pyload/plugin/account/XFileSharingPro.py b/pyload/plugin/account/XFileSharingPro.py
new file mode 100644
index 000000000..79b5427ef
--- /dev/null
+++ b/pyload/plugin/account/XFileSharingPro.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.XFSAccount import XFSAccount
+
+
+class XFileSharingPro(XFSAccount):
+ __name = "XFileSharingPro"
+ __type = "account"
+ __version = "0.06"
+
+ __description = """XFileSharingPro multi-purpose account plugin"""
+ __license = "GPLv3"
+ __authors = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = None
+
+
+ def init(self):
+ if self.HOSTER_DOMAIN:
+ return super(XFileSharingPro, self).init()
+
+
+ def loadAccountInfo(self, user, req):
+ return super(XFileSharingPro if self.HOSTER_DOMAIN else XFSAccount, self).loadAccountInfo(user, req)
+
+
+ def login(self, user, data, req):
+ if self.HOSTER_DOMAIN:
+ try:
+ return super(XFileSharingPro, self).login(user, data, req)
+ except Exception:
+ self.HOSTER_URL = self.HOSTER_URL.replace("www.", "")
+ return super(XFileSharingPro, self).login(user, data, req)
diff --git a/pyload/plugin/account/YibaishiwuCom.py b/pyload/plugin/account/YibaishiwuCom.py
new file mode 100644
index 000000000..e12e3f3f2
--- /dev/null
+++ b/pyload/plugin/account/YibaishiwuCom.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.Account import Account
+
+
+class YibaishiwuCom(Account):
+ __name = "YibaishiwuCom"
+ __type = "account"
+ __version = "0.02"
+
+ __description = """115.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ ACCOUNT_INFO_PATTERN = r'var USER_PERMISSION = {(.*?)}'
+
+
+ def loadAccountInfo(self, user, req):
+ # self.relogin(user)
+ html = req.load("http://115.com/", decode=True)
+
+ m = re.search(self.ACCOUNT_INFO_PATTERN, html, re.S)
+ premium = m and 'is_vip: 1' in m.group(1)
+ validuntil = trafficleft = (-1 if m else 0)
+ return dict({"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium})
+
+
+ def login(self, user, data, req):
+ html = req.load("http://passport.115.com/?ac=login",
+ post={"back": "http://www.115.com/",
+ "goto": "http://115.com/",
+ "login[account]": user,
+ "login[passwd]": data['password']},
+ decode=True)
+
+ if not 'var USER_PERMISSION = {' in html:
+ self.wrongPassword()
diff --git a/pyload/plugin/account/ZeveraCom.py b/pyload/plugin/account/ZeveraCom.py
new file mode 100644
index 000000000..1e5eacb4c
--- /dev/null
+++ b/pyload/plugin/account/ZeveraCom.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+from pyload.plugin.Account import Account
+
+
+class ZeveraCom(Account):
+ __name = "ZeveraCom"
+ __type = "account"
+ __version = "0.26"
+
+ __description = """Zevera.com account plugin"""
+ __license = "GPLv3"
+ __authors = [("zoidberg", "zoidberg@mujmail.cz"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ HOSTER_DOMAIN = "zevera.com"
+
+
+ def init(self):
+ if not self.HOSTER_DOMAIN:
+ self.logError(_("Missing HOSTER_DOMAIN"))
+
+ if not hasattr(self, "API_URL"):
+ self.API_URL = "http://api.%s/jDownloader.ashx" % (self.HOSTER_DOMAIN or "")
+
+
+ def loadAccountInfo(self, user, req):
+ validuntil = None
+ trafficleft = None
+ premium = False
+
+ api = self.api_response(req)
+
+ if "No trafic" not in api and api['endsubscriptiondate'] != "Expired!":
+ validuntil = time.mktime(time.strptime(api['endsubscriptiondate'], "%Y/%m/%d %H:%M:%S"))
+ trafficleft = float(api['availabletodaytraffic']) * 2 ** 20 if api['orondaytrafficlimit'] != '0' else -1
+ premium = True
+
+ return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium}
+
+
+ def login(self, user, data, req):
+ self.user = user
+ self.password = data['password']
+
+ if self.api_response(req) == "No trafic":
+ self.wrongPassword()
+
+
+ def api_response(self, req, just_header=False, **kwargs):
+ get_data = {'cmd' : "accountinfo",
+ 'login': self.user,
+ 'pass' : self.password}
+
+ get_data.update(kwargs)
+
+ res = req.load(self.API_URL,
+ get=get_data,
+ just_header=just_header,
+ decode=True)
+
+ self.logDebug(res)
+
+ if ':' in res:
+ if not just_header:
+ res = res.replace(',', '\n')
+ return dict((y.strip().lower(), z.strip()) for (y, z) in
+ [x.split(':', 1) for x in res.splitlines() if ':' in x])
+ else:
+ return res
diff --git a/pyload/plugin/account/__init__.py b/pyload/plugin/account/__init__.py
new file mode 100644
index 000000000..40a96afc6
--- /dev/null
+++ b/pyload/plugin/account/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-