# -*- coding: utf-8 -*- ############################################################################ # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU Affero General Public License as # # published by the Free Software Foundation, either version 3 of the # # License, or (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU Affero General Public License for more details. # # # # You should have received a copy of the GNU Affero General Public License # # along with this program. If not, see . # ############################################################################ # Test links (random.bin): # http://www.filefactory.com/file/ymxkmdud2o3/n/random.bin import re from module.plugins.internal.SimpleHoster import SimpleHoster from module.network.RequestFactory import getURL from module.utils import parseFileSize def getInfo(urls): file_info = list() list_ids = dict() # Create a dict id:url. Will be used to retrieve original url for url in urls: m = re.search(FilefactoryCom.__pattern__, url) list_ids[m.group('id')] = url # WARN: There could be a limit of urls for request post_data = {'func': 'links', 'links': '\n'.join(urls)} rep = getURL('http://www.filefactory.com/tool/links.php', post=post_data, decode=True) # Online links for m in re.finditer( r'innerText">\s*

(?P.+) \((?P[\w.]+) (?P\w+)\)

\s*

http://www.filefactory.com/file/(?P\w+).*

\s*

(http://www.filefactory.com/file/(?P\w+)/)

\s*

\1

\s*

Error: file not found

', rep): file_info.append((list_ids[m.group('ID')], 0, 1, list_ids[m.group('ID')])) return file_info class FilefactoryCom(SimpleHoster): __name__ = "FilefactoryCom" __type__ = "hoster" __pattern__ = r"https?://(?:www\.)?filefactory\.com/file/(?P[a-zA-Z0-9]+)" __version__ = "0.41" __description__ = """Filefactory.Com File Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") DIRECT_LINK_PATTERN = r'' def process(self, pyfile): if not re.match(self.__pattern__ + r'/n/.+', pyfile.url): # Not in standard format header = self.load(pyfile.url, just_header=True) if 'location' in header: self.pyfile.url = 'http://www.filefactory.com' + header['location'] if self.premium and (not self.SH_CHECK_TRAFFIC or self.checkTrafficLeft()): self.handlePremium() else: self.handleFree() def handleFree(self): self.html = self.load(self.pyfile.url, decode=True) if "Currently only Premium Members can download files larger than" in self.html: self.fail("File too large for free download") elif "All free download slots on this server are currently in use" in self.html: self.retry(50, 900, "All free slots are busy") # Load the page that contains the direct link url = re.search(r"document\.location\.host \+\s*'(.+)';", self.html) if not url: self.parseError('Unable to detect free link') url = 'http://www.filefactory.com' + url.group(1) self.html = self.load(url, decode=True) # Free downloads wait time waittime = re.search(r'id="startWait" value="(\d+)"', self.html) if not waittime: self.parseError('Unable to detect wait time') self.setWait(int(waittime.group(1))) self.wait() # Parse the direct link and download it direct = re.search(r'data-href-direct="(.*)" class="button', self.html) if not direct: self.parseError('Unable to detect free direct link') direct = direct.group(1) self.logDebug('DIRECT LINK: ' + direct) self.download(direct, disposition=True) check = self.checkDownload({"multiple": "You are currently downloading too many files at once.", "error": '
'}) if check == "multiple": self.logDebug("Parallel downloads detected; waiting 15 minutes") self.retry(wait_time=15 * 60, reason='Parallel downloads') elif check == "error": self.fail("Unknown error") def handlePremium(self): header = self.load(self.pyfile.url, just_header=True) if 'location' in header: url = header['location'].strip() if not url.startswith("http://"): url = "http://www.filefactory.com" + url elif 'content-disposition' in header: url = self.pyfile.url else: html = self.load(self.pyfile.url) found = re.search(self.DIRECT_LINK_PATTERN, html) if found: url = found.group(1) else: self.parseError('Unable to detect premium direct link') self.logDebug('DIRECT PREMIUM LINK: ' + url) self.download(url, disposition=True)