# -*- coding: utf-8 -*- import binascii import pycurl import random import re import time import urllib from Crypto.Cipher import ARC4 from pyload.network.RequestFactory import getURL from pyload.plugin.captcha.ReCaptcha import ReCaptcha from pyload.plugin.internal.SimpleHoster import SimpleHoster, timestamp class TurbobitNet(SimpleHoster): __name = "TurbobitNet" __type = "hoster" __version = "0.19" __pattern = r'http://(?:www\.)?turbobit\.net/(?:download/free/)?(?P\w+)' __config = [("use_premium", "bool", "Use premium account if available", True)] __description = """Turbobit.net hoster plugin""" __license = "GPLv3" __authors = [("zoidberg", "zoidberg@mujmail.cz"), ("prOq", "")] URL_REPLACEMENTS = [(__pattern + ".*", "http://turbobit.net/\g.html")] COOKIES = [("turbobit.net", "user_lang", "en")] NAME_PATTERN = r'id="file-title">(?P.+?)<' SIZE_PATTERN = r'class="file-size">(?P[\d.,]+) (?P[\w^_]+)' OFFLINE_PATTERN = r'

File Not Found

|html\(\'File (?:was )?not found' LINK_FREE_PATTERN = LINK_PREMIUM_PATTERN = r'(/download/redirect/[^"\']+)' LIMIT_WAIT_PATTERN = r'
(\d+)<' CAPTCHA_PATTERN = r'Captcha 60) self.retry() action, inputs = self.parseHtmlForm("action='#'") if not inputs: self.error(_("Captcha form not found")) self.logDebug(inputs) if inputs['captcha_type'] == 'recaptcha': recaptcha = ReCaptcha(self) inputs['recaptcha_response_field'], inputs['recaptcha_challenge_field'] = recaptcha.challenge() else: m = re.search(self.CAPTCHA_PATTERN, self.html) if m is None: self.error(_("captcha")) captcha_url = m.group(1) inputs['captcha_response'] = self.decryptCaptcha(captcha_url) self.logDebug(inputs) self.html = self.load(self.url, post=inputs) if '
Incorrect, try again!<' in self.html: self.invalidCaptcha() else: self.correctCaptcha() break else: self.fail(_("Invalid captcha")) def getRtUpdate(self): rtUpdate = self.getStorage("rtUpdate") if not rtUpdate: if self.getStorage("version") != self.__version \ or int(self.getStorage("timestamp", 0)) + 86400000 < timestamp(): # that's right, we are even using jdownloader updates rtUpdate = getURL("http://update0.jdownloader.org/pluginstuff/tbupdate.js") rtUpdate = self.decrypt(rtUpdate.splitlines()[1]) # but we still need to fix the syntax to work with other engines than rhino rtUpdate = re.sub(r'for each\(var (\w+) in(\[[^\]]+\])\)\{', r'zza=\2;for(var zzi=0;zzi]+)", self.html) if m: url = "http://turbobit.net%s%s" % m.groups() else: url = "http://turbobit.net/files/timeout.js?ver=%s" % "".join(random.choice('0123456789ABCDEF') for _i in xrange(32)) fun = self.load(url) self.setWait(65, False) for b in [1, 3]: self.jscode = "var id = \'%s\';var b = %d;var inn = \'%s\';%sout" % ( self.info['pattern']['ID'], b, urllib.quote(fun), rtUpdate) try: out = self.js.eval(self.jscode) self.logDebug("URL", self.js.engine, out) if out.startswith('/download/'): return "http://turbobit.net%s" % out.strip() except Exception, e: self.logError(e) else: if self.retries >= 2: # retry with updated js self.delStorage("rtUpdate") else: self.retry() self.wait() def decrypt(self, data): cipher = ARC4.new(binascii.hexlify('E\x15\xa1\x9e\xa3M\xa0\xc6\xa0\x84\xb6H\x83\xa8o\xa0')) return binascii.unhexlify(cipher.encrypt(binascii.unhexlify(data))) def getLocalTimeString(self): lt = time.localtime() tz = time.altzone if lt.tm_isdst else time.timezone return "%s GMT%+03d%02d" % (time.strftime("%a %b %d %Y %H:%M:%S", lt), -tz // 3600, tz % 3600)