summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorGravatar Stanley F <stanley.foerster@gmail.com> 2014-06-12 16:10:15 +0200
committerGravatar Stefano <l.stickell@yahoo.it> 2014-06-12 16:10:15 +0200
commita9459282850bc3b9e8346f1909b47a7548aa84d9 (patch)
treef73740336a2e03d180ecdf69fb07bb5e77922eda /module
parent[Linksnappy] Fixed expired account detect (diff)
downloadpyload-a9459282850bc3b9e8346f1909b47a7548aa84d9.tar.xz
[Oboom] new hoster and account
Merges #650 Resolves #587
Diffstat (limited to 'module')
-rw-r--r--module/plugins/accounts/OboomCom.py50
-rw-r--r--module/plugins/hoster/OboomCom.py129
2 files changed, 179 insertions, 0 deletions
diff --git a/module/plugins/accounts/OboomCom.py b/module/plugins/accounts/OboomCom.py
new file mode 100644
index 000000000..19fcea67a
--- /dev/null
+++ b/module/plugins/accounts/OboomCom.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+import time
+
+from module.plugins.Account import Account
+from module.lib.beaker.crypto.pbkdf2 import PBKDF2
+from module.common.json_layer import json_loads
+
+
+class OboomCom(Account):
+ __name__ = "OboomCom"
+ __version__ = "0.1"
+ __type__ = "account"
+ __description__ = """Oboom.com account plugin"""
+ __author_name__ = "stanley"
+ __author_mail__ = "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.0/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 "premium_unix" in userData:
+ validUntilUtc = int(userData["premium_unix"])
+ if validUntilUtc > int(time.time()):
+ premium = True
+ validUntil = validUntilUtc
+ traffic = userData["traffic"]
+ trafficLeft = traffic["current"]
+ maxTraffic = traffic["max"]
+ session = accountData["session"]
+ return {"premium": premium,
+ "validuntil": validUntil,
+ "trafficleft": trafficLeft / 1024,
+ "maxtraffic": maxTraffic / 1024,
+ "session": session
+ }
+ return {"premium": False, "validuntil": -1}
+
+ def login(self, user, data, req):
+ self.loadAccountData(user, req)
diff --git a/module/plugins/hoster/OboomCom.py b/module/plugins/hoster/OboomCom.py
new file mode 100644
index 000000000..1e0508d32
--- /dev/null
+++ b/module/plugins/hoster/OboomCom.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+
+# Test link:
+# https://www.oboom.com/B7CYZIEB/10Mio.dat
+
+import re
+
+from module.plugins.Hoster import Hoster
+from module.plugins.internal.CaptchaService import ReCaptcha
+from module.common.json_layer import json_loads
+
+
+class OboomCom(Hoster):
+ __name__ = "OboomCom"
+ __type__ = "hoster"
+ __pattern__ = r'https?://(?:www\.)?oboom\.com/(#(id=|/)?)?(?P<ID>[A-Z0-9]{8})'
+ __version__ = "0.1"
+ __description__ = """oboom.com hoster plugin"""
+ __author_name__ = "stanley"
+ __author_mail__ = "stanley.foerster@gmail.com"
+
+ RECAPTCHA_KEY = "6LdqpO0SAAAAAJGHXo63HyalP7H4qlRs_vff0kJX"
+
+ def loadUrl(self, url, get=None):
+ if not get:
+ get = dict()
+ return json_loads(self.load(url, get, decode=True))
+
+ def getFileId(self, url):
+ self.fileId = re.match(OboomCom.__pattern__, url).group('ID')
+
+ def getSessionToken(self):
+ if self.premium:
+ accountInfo = self.account.getAccountInfo(self.user, True)
+ if "session" in accountInfo:
+ self.sessionToken = accountInfo["session"]
+ else:
+ self.fail("Could not retrieve premium session")
+ else:
+ apiUrl = "https://www.oboom.com/1.0/guestsession"
+ result = self.loadUrl(apiUrl)
+ if result[0] == 200:
+ self.sessionToken = result[1]
+ else:
+ self.fail("Could not retrieve token for guest session. Error code %s" % result[0])
+
+ def solveCaptcha(self):
+ recaptcha = ReCaptcha(self)
+ for _ in xrange(5):
+ challenge, response = recaptcha.challenge(self.RECAPTCHA_KEY)
+ apiUrl = "https://www.oboom.com/1.0/download/ticket"
+ params = {"recaptcha_challenge_field": challenge,
+ "recaptcha_response_field": response,
+ "download_id": self.fileId,
+ "token": self.sessionToken}
+ result = self.loadUrl(apiUrl, params)
+
+ if result[0] == 200:
+ self.downloadToken = result[1]
+ self.downloadAuth = result[2]
+ self.correctCaptcha()
+ self.setWait(30)
+ self.wait()
+ break
+ elif result[0] == 400:
+ if result[1] == "incorrect-captcha-sol":
+ self.invalidCaptcha()
+ elif result[1] == "captcha-timeout":
+ self.invalidCaptcha()
+ elif result[1] == "forbidden":
+ self.retry(5, 15 * 60, "Service unavailable")
+ elif result[0] == 403:
+ if result[1] == -1: # another download is running
+ self.setWait(15 * 60)
+ else:
+ self.setWait(result[1], reconnect=True)
+ self.wait()
+ self.retry(5)
+ else:
+ self.invalidCaptcha()
+ self.fail("Received invalid captcha 5 times")
+
+ def getFileInfo(self, token, fileId):
+ apiUrl = "https://api.oboom.com/1.0/info"
+ params = {"token": token, "items": fileId, "http_errors": 0}
+
+ result = self.loadUrl(apiUrl, params)
+ if result[0] == 200:
+ item = result[1][0]
+ if item["state"] == "online":
+ self.fileSize = item["size"]
+ self.fileName = item["name"]
+ else:
+ self.offline()
+ else:
+ self.fail("Could not retrieve file info. Error code %s: %s" % (result[0], result[1]))
+
+ def getDownloadTicket(self):
+ apiUrl = "https://api.oboom.com/1.0/dl"
+ params = {"item": self.fileId, "http_errors": 0}
+ if self.premium:
+ params["token"] = self.sessionToken
+ else:
+ params["token"] = self.downloadToken
+ params["auth"] = self.downloadAuth
+
+ result = self.loadUrl(apiUrl, params)
+ if result[0] == 200:
+ self.downloadDomain = result[1]
+ self.downloadTicket = result[2]
+ else:
+ self.fail("Could not retrieve download ticket. Error code %s" % result[0])
+
+ def setup(self):
+ self.chunkLimit = 1
+ self.multiDL = self.premium
+
+ def process(self, pyfile):
+ self.pyfile.url.replace(".com/#id=", ".com/#")
+ self.pyfile.url.replace(".com/#/", ".com/#")
+ self.getFileId(self.pyfile.url)
+ self.getSessionToken()
+ self.getFileInfo(self.sessionToken, self.fileId)
+ self.pyfile.name = self.fileName
+ self.pyfile.size = self.fileSize
+ if not self.premium:
+ self.solveCaptcha()
+ self.getDownloadTicket()
+ self.download("https://%s/1.0/dlh" % self.downloadDomain, get={"ticket": self.downloadTicket, "http_errors": 0})