diff options
author | Stanley F <stanley.foerster@gmail.com> | 2014-06-12 16:10:15 +0200 |
---|---|---|
committer | Stefano <l.stickell@yahoo.it> | 2014-06-12 16:10:15 +0200 |
commit | a9459282850bc3b9e8346f1909b47a7548aa84d9 (patch) | |
tree | f73740336a2e03d180ecdf69fb07bb5e77922eda /module/plugins/hoster | |
parent | [Linksnappy] Fixed expired account detect (diff) | |
download | pyload-a9459282850bc3b9e8346f1909b47a7548aa84d9.tar.xz |
[Oboom] new hoster and account
Diffstat (limited to 'module/plugins/hoster')
-rw-r--r-- | module/plugins/hoster/OboomCom.py | 129 |
1 files changed, 129 insertions, 0 deletions
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}) |