Пример #1
0
    def handle_correct_captcha (self, match):
        num = int (match.group (1))

        m = re.search ('id="downloadlink"><a href="([^"]*)"', self.tfile.contents)
        self.furl = m.group (1)

        self.timeout = Timeout (num, self.handle_start_download, self.print_progress)
        self.set_state (STATE_WAITING)
Пример #2
0
    def handle_download (self, match):
        m = re.search ('var c=(\d+)', self.tfile.contents)

        m2 = re.search ('<input checked type="radio" name="mirror" onclick="document\.dlf\.action=\\\\\'(.*?)\\\\\';" \/> (.*?)<br \/>', self.tfile.contents)
#        print 'Mirror %s: %s' % (m2.group (2), m2.group (1))
        self.furl = m2.group (1)

        num = int (m.group (1))
        self.timeout = Timeout (num, self.handle_start_download, self.print_progress)
        self.set_state (STATE_WAITING)
Пример #3
0
class Rapidshare (GenericHost):
    def __init__ (self, url, downman):
        GenericHost.__init__ (self, url, downman)

        self.case_handlers = [
            ('<form id="ff" action="([^"]*)" method="post">', self.handle_start_page),
            ('You have reached the download limit for free\-users', self.handle_download_limit),
            ('Your IP address (\w+\.\w+\.\w+\.\w+) is already downloading a file', self.handle_already_downloading),
            ('we have no more download slots', self.handle_no_slots),
            ('Please try again in (\w+) minutes', self.handle_no_slots_count),
            ('var c=(\d+)', self.handle_download),
        ]

    def handle_start_page (self, match):
        self.aurl = match.group (1)

        m = re.search ('<p class="downloadlink">[^<]*?<font [^>]*?>\| (\d+) (KB|MB|GB)</font></p>', self.tfile.contents)

        self.total = int (m.group (1))
        if m.group (2) == 'KB':
            self.total = self.total * 1000
        if m.group (2) == 'MB':
            self.total = self.total * 1000000
        if m.group (2) == 'GB':
            self.total = self.total * 1000000000

        self.name = re.search ('([^\/]*)$', self.url).group (1)

        if self.state != STATE_INFO:
            self.tfile = TempFile (self.aurl, "dl.start=Free", self.url)
            self.tfile.completed_cb = self.stage_download_completed
            self.tfile.start ()
        else:
            self.set_state (STATE_INFO_COMPLETED)

    def handle_download_limit (self, match):
        m2 = re.search ('Or try again in about (\d+) minutes', self.tfile.contents)
        self.status = 'Download limit, try again in %s minutes' % (m2.group (1))
        self.set_state (STATE_HOLDING)

    def handle_already_downloading (self, match):
        self.status = 'You are already downloading %s' % (match.group (1))
        self.set_state (STATE_HOLDING)

    def handle_no_slots (self, match):
        self.status = 'No download slots available'
        self.set_state (STATE_HOLDING)

    def handle_no_slots_count (self, match):
        self.status = 'No download slots available, try again in %s minutes' % (match.group (1))
        self.set_state (STATE_HOLDING)

    def handle_download (self, match):
        m = re.search ('var c=(\d+)', self.tfile.contents)

        m2 = re.search ('<input checked type="radio" name="mirror" onclick="document\.dlf\.action=\\\\\'(.*?)\\\\\';" \/> (.*?)<br \/>', self.tfile.contents)
#        print 'Mirror %s: %s' % (m2.group (2), m2.group (1))
        self.furl = m2.group (1)

        num = int (m.group (1))
        self.timeout = Timeout (num, self.handle_start_download, self.print_progress)
        self.set_state (STATE_WAITING)

    def handle_start_download (self):
        dpath = self.downman.config.get_property ('DefaultDownloadDirectory')

        self.location = os.path.join (dpath, re.search ('([^\/]*)$', self.furl).group (1))

        """
        resume = None

        if os.path.exists (self.location):
            s = os.stat (self.location)

            if s.st_size == self.total:
                self.set_state (STATE_COMPLETED)
                return
            if s.st_size == self.downloaded:
                self.furl = self.furl + '?start=' + str (int (self.downloaded))
                resume = self.downloaded
        """

        self.tfile = RapidshareWriteFile (self.furl, self.location, self.url)
        self.tfile.completed_cb = self.download_completed
        self.tfile.progress_cb = self.download_progress
        self.tfile.start ()

        self.status = 'Downloading...'
        self.set_state (STATE_DOWNLOADING)

    def startup (self, data):
        self.name = data['name']
        self.url = data['url']
        self.downloaded = float (data['downloaded'])
        self.total = float (data['total'])
        self.state = int (data['state'])
        if data.has_key ('location'):
            self.location = data['location']

    def shutdown (self):
        data = {}

        if self.state == STATE_CONNECTING:
            self.tfile.close ()
            self.state = STATE_QUEUED
        elif self.state == STATE_DOWNLOADING:
            self.tfile.close ()
            self.state = STATE_QUEUED
        elif self.state == STATE_WAITING:
            self.timeout.cancel ()
            self.state = STATE_QUEUED
        elif self.state == STATE_INFO or self.state == STATE_INFO_COMPLETED:
            self.tfile.close ()
            return

        data['name'] = self.name
        data['url'] = self.url
        data['downloaded'] = str (self.downloaded)
        data['total'] = str (self.total)
        data['state'] = str (self.state)
        data['match'] = RAPIDSHARE_MATCH
        if hasattr (self, 'location'):
            data['location'] = self.location

        return data
Пример #4
0
class MUDownload (GenericHost):
    location = None

    def __init__ (self, url, downman):
        GenericHost.__init__ (self, url, downman)

        self.case_handlers = [
            ('<FORM method="POST" id="captchaform">', self.handle_start_page),
            ('count=(\d+);', self.handle_correct_captcha),
        ]

    def start_get_info (self):
        fileid = re.search ('\?d=([A-Za-z0-9]+)', self.url).group (1)
        postdata = 'id0=%s' % (fileid)

        self.tfile = TempFile ('http://www.megaupload.com/mgr_linkcheck.php', postdata, headers=['TE: trailers', 'Connection: TE'])
        self.tfile.completed_cb = self.handle_info_page
        self.tfile.start ()

    def handle_info_page (self, tfile):
        self.total = int (re.search ('s=(\d+)', self.tfile.contents).group (1))
        self.name = re.search ('n=(.+)', self.tfile.contents).group (1)

        self.set_state (STATE_INFO_COMPLETED)

    def handle_start_page (self, match):
        ccstr = '<INPUT type="hidden" name="captchacode" value="(.*?)">'
        m = re.search (ccstr, self.tfile.contents)
        self.captchacode = m.group (1)

        mvstr = '<INPUT type="hidden" name="megavar" value="(.*?)">'
        m = re.search (mvstr, self.tfile.contents)
        self.megavar = m.group (1)

        imgstr = '<TD>Enter this </TD>\s*?<TD width="100" align="center" height="40"><img src="([^"]*?)" border="0" alt=""></TD>\s*?<TD> here:</TD>'
        m = re.search (imgstr, self.tfile.contents)
        self.iurl = m.group (1)

        self.tfile = TempFile (self.iurl)
        self.tfile.completed_cb = self.stage_captcha_download_completed
        self.tfile.start ()

    def stage_captcha_download_completed (self, tfile):
        self.code = self.downman.application.prompt_for_captcha (tfile.contents)

        if self.code != None:
            post_data = 'captchacode=%s&megavar=%s&captcha=%s' % (self.captchacode, self.megavar, self.code)

            self.tfile = TempFile (self.url, post_data)
            self.tfile.completed_cb = self.stage_download_completed
            self.tfile.start ()
        else:
            self.status = 'Invalid Code'
            self.set_state (STATE_DISABLED)

    def handle_correct_captcha (self, match):
        num = int (match.group (1))

        m = re.search ('id="downloadlink"><a href="([^"]*)"', self.tfile.contents)
        self.furl = m.group (1)

        self.timeout = Timeout (num, self.handle_start_download, self.print_progress)
        self.set_state (STATE_WAITING)

    def handle_start_download (self):
        dpath = self.downman.config.get_property ('DefaultDownloadDirectory')

        self.location = os.path.join (dpath, re.search ('([^\/]*)$', self.furl).group (1))

        rfrom = None

        if os.path.exists (self.location):
            s = os.stat (self.location)

            if s.st_size == self.total:
                self.set_state (STATE_COMPLETED)
                return
            if s.st_size == self.downloaded:
                rfrom = self.downloaded

        self.tfile = WriteFile (self.furl, self.location, None, self.url, rfrom)
        self.tfile.completed_cb = self.download_completed
        self.tfile.progress_cb = self.download_progress
        self.tfile.start ()

        self.status = 'Downloading...'
        self.set_state (STATE_DOWNLOADING)

    def startup (self, data):
        self.name = data['name']
        self.url = data['url']
        self.downloaded = float (data['downloaded'])
        self.total = float (data['total'])
        self.state = int (data['state'])
        if data.has_key ('location'):
            self.location = data['location']

    def shutdown (self):
        data = {}

        if self.state == STATE_CONNECTING:
            self.tfile.close ()
            self.state = STATE_QUEUED
        elif self.state == STATE_DOWNLOADING:
            self.tfile.close ()
            self.state = STATE_QUEUED
        elif self.state == STATE_WAITING:
            self.timeout.cancel ()
            self.state = STATE_QUEUED
        elif self.state == STATE_INFO or self.state == STATE_INFO_COMPLETED:
            self.tfile.close ()
            return

        data['name'] = self.name
        data['url'] = self.url
        data['downloaded'] = str (self.downloaded)
        data['total'] = str (self.total)
        data['state'] = str (self.state)
        data['match'] = MUDOWNLOAD_MATCH
        if self.location != None:
            data['location'] = self.location

        return data