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_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)
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
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