#!/usr/bin/env python # -*- coding: utf-8 -*- import re from module.plugins.Hoster import Hoster from module.plugins.ReCaptcha import ReCaptcha from module.plugins.Plugin import chunks from module.network.RequestFactory import getURL from module.utils import decode def getInfo(urls): for chunk in chunks(urls, 15): # Always use "filesonic.com" for file's url # mod_link contains the right url to check orig_link = "".join(chunk) mod_link = orig_link url_datas = re.search("(.+)(filesonic\..+)/file/(.+)", orig_link) if url_datas: mod_link = url_datas.group(1) + "filesonic.com" + "/file/" + url_datas.group(3) page = getURL("http://www." + getDomain() + "/link-checker", post={"links": mod_link}).decode("utf8", "ignore") found = re.findall(r'\s+([^<]+)\s+([^<]+)\s+(.+) MB\s+\s+([^<]+)
\s+
\s+\s+', page, re.MULTILINE) result = [] for src, name, size, status in found: result.append((name, float(size)*1024*1024, 2 if status == "Available" else 1, src)) yield result def getDomain(): html = decode(getURL("http://api.filesonic.com/utility?method=getFilesonicDomainForCurrentIp")) return re.search(r"response>.*?filesonic(\..*?)Download (.*?) for free on Filesonic.com', self.html) if name: self.pyfile.name = name.group(1) else: self.offline() if 'The page you are trying to access was not found.' in self.html: self.offline() if self.account: self.download(pyfile.url) else: self.download(self.getFileUrl()) def getFileUrl(self): part_1_link = re.search("(.+/file/\d+/)", self.url).group(1) link = part_1_link + re.search(r'href="(.*?start=1.*?)"', self.html).group(1) self.html = self.load(link) self.handleErrors() realLinkRegexp = "

Start download now!

" url = re.search(realLinkRegexp, self.html) if not url: if "This file is available for premium users only." in self.html: self.fail("Need premium account.") countDownDelay = re.search("countDownDelay = (\\d+)", self.html) if countDownDelay: wait_time = int(countDownDelay.group(1)) if wait_time > 300: self.wantReconnect = True self.setWait(wait_time) self.log.info("%s: Waiting %d seconds." % (self.__name__, wait_time)) self.wait() tm = re.search("name='tm' value='(.*?)' />", self.html) tm_hash = re.search("name='tm_hash' value='(.*?)' />", self.html) if tm and tm_hash: tm = tm.group(1) tm_hash = tm_hash.group(1) else: self.html = self.load(link) self.handleErrors() url = re.search(realLinkRegexp, self.html) if not url: if "This file is available for premium users only." in self.html: self.fail("Need premium account.") countDownDelay = re.search("countDownDelay = (\\d+)", self.html) if countDownDelay: wait_time = int(countDownDelay.group(1)) if wait_time > 300: self.wantReconnect = True self.setWait(wait_time) self.log.info("%s: Waiting %d seconds." % (self.__name__, wait_time)) self.wait() tm = re.search("name='tm' value='(.*?)' />", self.html).group(1) tm_hash = re.search("name='tm_hash' value='(.*?)' />", self.html).group(1) self.html = self.load(self.url + "?start=1", post={"tm":tm,"tm_hash":tm_hash}) self.handleErrors() if "Please Enter Password" in self.html: self.fail("implement need pw") chall = re.search(r'Recaptcha.create\("(.*?)",', self.html) for i in range(5): if not chall: break re_captcha = ReCaptcha(self) challenge, result = re_captcha.challenge(chall.group(1)) postData = {"recaptcha_challenge_field": challenge, "recaptcha_response_field" : result} self.html = self.load(link, post=postData) chall = re.search(r'Recaptcha.create\("(.*?)",', self.html) if chall: self.invalidCaptcha() re_url = re.search(realLinkRegexp, self.html) if re_url: url = re_url.group(1) if not url: self.fail("Plugin failed") return url def convertURL(self, url): id = re.search("/file/([0-9]+(/.+)?)", url) if not id: id = re.search("/file/[a-z0-9]+/([0-9]+(/.+)?)", url) result = "http://www.filesonic.com/file/" + id.group(1) return self.getRightUrl(result) def handleErrors(self): if "The file that you're trying to download is larger than" in self.html: self.fail("need premium account for file") if "Free users may only download 1 file at a time" in self.html: self.fail("only 1 file at a time for free users") if "Free user can not download files" in self.html: self.fail("need premium account for file") if "Download session in progress" in self.html: self.fail("already downloading") if "This file is password protected" in self.html: self.fail("This file is password protected, please one.") if "An Error Occurred" in self.html: self.fail("A server error occured.") if "This file was deleted" in self.html: self.offline() def getRightUrl(self, url): part_2 = re.search("http://www..+(/file.+)", url) if not part_2: part_2 = re.search("http://.+(/file.+)", url) return "http://www.%s%s" % (getDomain(), part_2.group(1))