From ecfbaded5e03529d1b189b6b5fc8b2f8516c4b31 Mon Sep 17 00:00:00 2001 From: enkore Date: Sat, 6 Apr 2013 20:21:43 +0200 Subject: Add hoster plugin for ARD mediathek --- module/plugins/hoster/ARD.py | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 module/plugins/hoster/ARD.py (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/ARD.py b/module/plugins/hoster/ARD.py new file mode 100644 index 000000000..60a40e69d --- /dev/null +++ b/module/plugins/hoster/ARD.py @@ -0,0 +1,80 @@ + +import subprocess +import re +import os.path +import os + +from module.utils import save_join, save_path +from module.plugins.Hoster import Hoster + +# Requires rtmpdump +# by Roland Beermann + +class RTMP: + # TODO: Port to some RTMP-library like rtmpy or similar + # TODO?: Integrate properly into the API of pyLoad + + command = "rtmpdump" + + @classmethod + def download_rtmp_stream(cls, url, output_file, playpath=None): + opts = [ + "-r", url, + "-o", output_file, + ] + if playpath: + opts.append("--playpath") + opts.append(playpath) + + cls._invoke_rtmpdump(opts) + + @classmethod + def _invoke_rtmpdump(cls, opts): + args = [ + cls.command + ] + args.extend(opts) + + return subprocess.check_call(args) + +class ARD(Hoster): + __name__ = "ARD Mediathek" + __version__ = "0.1" + __pattern__ = r"http://www\.ardmediathek\.de/.*" + __config__ = [] + + def process(self, pyfile): + site = self.load(pyfile.url) + + avail_videos = re.findall(r"""mediaCollection.addMediaStream\(0, ([0-9]*), "([^\"]*)", "([^\"]*)", "[^\"]*"\);""", site) + avail_videos.sort(key=lambda videodesc: int(videodesc[0]), reverse=True) # The higher the number, the better the quality + + quality, url, playpath = avail_videos[0] + + pyfile.name = re.search(r"

([^<]*)

", site).group(1) + + if url.startswith("http"): + # Best quality is available over HTTP. Very rare. + self.download(url) + else: + pyfile.setStatus("downloading") + + download_folder = self.config['general']['download_folder'] + + location = save_join(download_folder, pyfile.package().folder) + + if not os.path.exists(location): + os.makedirs(location, int(self.core.config["permission"]["folder"], 8)) + + if self.core.config["permission"]["change_dl"] and os.name != "nt": + try: + uid = getpwnam(self.config["permission"]["user"])[2] + gid = getgrnam(self.config["permission"]["group"])[2] + + chown(location, uid, gid) + except Exception, e: + self.log.warning(_("Setting User and Group failed: %s") % str(e)) + + output_file = save_join(location, save_path(pyfile.name)) + + RTMP.download_rtmp_stream(url, playpath=playpath, output_file=output_file) -- cgit v1.2.3 From d8f2b5d9046f4cca3a8d0cd5c5dd297526ea870e Mon Sep 17 00:00:00 2001 From: enkore Date: Sat, 6 Apr 2013 20:43:48 +0200 Subject: ARD: Correct file extension --- module/plugins/hoster/ARD.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/ARD.py b/module/plugins/hoster/ARD.py index 60a40e69d..5ab65cd4b 100644 --- a/module/plugins/hoster/ARD.py +++ b/module/plugins/hoster/ARD.py @@ -75,6 +75,6 @@ class ARD(Hoster): except Exception, e: self.log.warning(_("Setting User and Group failed: %s") % str(e)) - output_file = save_join(location, save_path(pyfile.name)) + output_file = save_join(location, save_path(pyfile.name)) + os.path.splitext(playpath)[1] RTMP.download_rtmp_stream(url, playpath=playpath, output_file=output_file) -- cgit v1.2.3 From b89bc76f6cc8fa64b16eee42a0e00fdc2ddf13cc Mon Sep 17 00:00:00 2001 From: Stefano Date: Sat, 6 Apr 2013 21:33:52 +0200 Subject: DebridItaliaCom: fail instead of offline to allow revert to traditional download --- module/plugins/hoster/DebridItaliaCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/DebridItaliaCom.py b/module/plugins/hoster/DebridItaliaCom.py index 121a141b3..470c4ae5d 100644 --- a/module/plugins/hoster/DebridItaliaCom.py +++ b/module/plugins/hoster/DebridItaliaCom.py @@ -47,7 +47,7 @@ class DebridItaliaCom(Hoster): self.logDebug("XML data: %s" % page) if 'File not available' in page: - self.offline() + self.fail('File not available') else: new_url = re.search(r'(?P[^<]+)', page).group('direct') -- cgit v1.2.3 From 73792d869620ea1a2aca4a0dbda67fb9b87b29c7 Mon Sep 17 00:00:00 2001 From: enkore Date: Sun, 7 Apr 2013 00:36:13 +0200 Subject: Add XVideosCom hoster --- module/plugins/hoster/XVideosCom.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 module/plugins/hoster/XVideosCom.py (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/XVideosCom.py b/module/plugins/hoster/XVideosCom.py new file mode 100644 index 000000000..b7f3f7b58 --- /dev/null +++ b/module/plugins/hoster/XVideosCom.py @@ -0,0 +1,19 @@ + +import re +import urllib + +from module.plugins.Hoster import Hoster + +class XVideosCom(Hoster): + __name__ = "XVideos.com" + __version__ = "0.1" + __pattern__ = r"http://www\.xvideos\.com/video([0-9]+)/.*" + __config__ = [] + + def process(self, pyfile): + site = self.load(pyfile.url) + pyfile.name = "%s (%s).flv" %( + re.search(r"

([^<]+) Date: Sun, 7 Apr 2013 14:08:18 +0200 Subject: UploadedTo: fixed #68 --- module/plugins/hoster/UploadedTo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index 5d8c9a5ac..874b04d64 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -14,7 +14,7 @@ key = "bGhGMkllZXByd2VEZnU5Y2NXbHhYVlZ5cEE1bkEzRUw=".decode('base64') def getID(url): """ returns id from file url""" - m = re.match(r"http://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=)(?P\w+)", url) + m = re.match(r"http://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P\w+)", url) return m.group('ID') @@ -78,7 +78,7 @@ class UploadedTo(Hoster): __name__ = "UploadedTo" __type__ = "hoster" __pattern__ = r"http://[\w\.-]*?(uploaded\.(to|net)(/file/|/?\?id=|.*?&id=)|ul\.to/)\w+" - __version__ = "0.65" + __version__ = "0.66" __description__ = """Uploaded.net Download Hoster""" __author_name__ = ("spoob", "mkaay", "zoidberg", "netpok", "stickell") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "netpok@gmail.com", "l.stickell@yahoo.it") -- cgit v1.2.3 From e0b97f04b6bf8dac024cf1c15f640cab1a687098 Mon Sep 17 00:00:00 2001 From: Stefano Date: Sun, 7 Apr 2013 20:47:16 +0200 Subject: FilefactoryCom: fixes #70 --- module/plugins/hoster/FilefactoryCom.py | 88 ++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 39 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FilefactoryCom.py b/module/plugins/hoster/FilefactoryCom.py index 66d26c999..b3eb4c865 100644 --- a/module/plugins/hoster/FilefactoryCom.py +++ b/module/plugins/hoster/FilefactoryCom.py @@ -8,6 +8,9 @@ from module.common.json_layer import json_loads import re +# Test links (random.bin): +# http://www.filefactory.com/file/ymxkmdud2o3/n/random.bin + def checkFile(plugin, urls): url_dict = {} @@ -34,7 +37,7 @@ class FilefactoryCom(Hoster): __name__ = "FilefactoryCom" __type__ = "hoster" __pattern__ = r"http://(?:www\.)?filefactory\.com/file/(?P[a-zA-Z0-9]+).*" # URLs given out are often longer but this is the requirement - __version__ = "0.36" + __version__ = "0.37" __description__ = """Filefactory.Com File Download Hoster""" __author_name__ = ("paulking", "zoidberg") @@ -48,7 +51,8 @@ class FilefactoryCom(Hoster): FILE_CHECK_PATTERN = r'check:\s*\'(?P.*?)\'' CAPTCHA_KEY_PATTERN = r'Recaptcha.create\(\s*"(.*?)",' WAIT_PATTERN = r'id="startWait" value="(?P\d+)"' - FILE_URL_PATTERN = r']*?id="downloadLinkTarget"[^>]*>\s*]*?id="downloadLinkTarget"[^>]*>\s*'}) -- cgit v1.2.3 From f516aaecff9d4efa8a60af521b4e1c1965a1a249 Mon Sep 17 00:00:00 2001 From: Stefano Date: Sun, 7 Apr 2013 22:31:51 +0200 Subject: FilefactoryCom: plugin rewritten (see also bug #70) --- module/plugins/hoster/FilefactoryCom.py | 218 +++++++++++++------------------- 1 file changed, 90 insertions(+), 128 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FilefactoryCom.py b/module/plugins/hoster/FilefactoryCom.py index b3eb4c865..e92c1505d 100644 --- a/module/plugins/hoster/FilefactoryCom.py +++ b/module/plugins/hoster/FilefactoryCom.py @@ -1,159 +1,121 @@ # -*- coding: utf-8 -*- -from module.network.RequestFactory import getURL -from module.plugins.Hoster import Hoster -from module.plugins.ReCaptcha import ReCaptcha -from module.utils import parseFileSize -from module.plugins.Plugin import chunks -from module.common.json_layer import json_loads -import re +############################################################################ +# 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 -def checkFile(plugin, urls): - url_dict = {} - +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: - url_dict[re.search(plugin.__pattern__, url).group('id')] = (url, 0, 0, url) - url_ids = url_dict.keys() - urls = map(lambda url_id: 'http://www.filefactory.com/file/' + url_id, url_ids) - - html = getURL("http://www.filefactory.com/tool/links.php", post = {"func": "links", "links": "\n".join(urls)}, decode=True) - - for m in re.finditer(plugin.LC_INFO_PATTERN, html): - if m.group('id') in url_ids: - url_dict[m.group('id')] = (m.group('name'), parseFileSize(m.group('size')), 2, url_dict[m.group('id')][3]) - - for m in re.finditer(plugin.LC_OFFLINE_PATTERN, html): - if m.group('id') in url_ids: - url_dict[m.group('id')] = (url_dict[m.group('id')][0], 0, 1, url_dict[m.group('id')][3]) - - file_info = url_dict.values() - + 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(Hoster): + + +class FilefactoryCom(SimpleHoster): __name__ = "FilefactoryCom" __type__ = "hoster" - __pattern__ = r"http://(?:www\.)?filefactory\.com/file/(?P[a-zA-Z0-9]+).*" # URLs given out are often longer but this is the requirement - __version__ = "0.37" + __pattern__ = r"https?://(?:www\.)?filefactory\.com/file/(?P[a-zA-Z0-9]+)" + __version__ = "0.38" __description__ = """Filefactory.Com File Download Hoster""" - __author_name__ = ("paulking", "zoidberg") - - LC_INFO_PATTERN = r'

(?P[^<]+) \((?P[0-9.]+ \w+)\)

\s*

http://www.filefactory.com/file/(?P\w+)/' - LC_OFFLINE_PATTERN = r'

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

\s*

' - + __author_name__ = ("stickell") + __author_mail__ = ("l.stickell@yahoo.it") + + FILE_INFO_PATTERN = r'(?P\S+)\s*\s*

\s*

(?P[\w.]+) (?P\w+) file uploaded' FILE_OFFLINE_PATTERN = r'File Not Found' - FILE_NAME_PATTERN = r'<span class="last">(?P<name>.*?)</span>' - FILE_INFO_PATTERN = r'<span>(?P<size>\d(\d|\.)*) (?P<units>..) file uploaded' - - FILE_CHECK_PATTERN = r'check:\s*\'(?P<check>.*?)\'' - CAPTCHA_KEY_PATTERN = r'Recaptcha.create\(\s*"(.*?)",' - WAIT_PATTERN = r'id="startWait" value="(?P<wait>\d+)"' - FILE_URL_PATTERN = r'<p[^>]*?id="downloadLinkTarget"[^>]*>\s*<a href="(?P<url>.*?)"' - - - def setup(self): - self.multiDL = self.resumeDownloads = self.premium def process(self, pyfile): - # Check file - pyfile.name, pyfile.size, status, self.url = checkFile(self, [pyfile.url])[0] - if status != 2: self.offline() - self.logDebug("File Name: %s Size: %d" % (pyfile.name, pyfile.size)) - - # Handle downloading - url = self.checkDirectDownload(pyfile.url) - if url: - self.download(url) - else: - self.html = self.load(pyfile.url, decode = True) - - if self.premium: - self.handlePremium() - else: - self.handleFree() - - def checkDirectDownload(self, url): - for i in range(5): - header = self.load(url, just_header = True) - if 'location' in header: - url = header['location'].strip() - if not url.startswith("http://"): - url = "http://www.filefactory.com" + url - self.logDebug('URL: ' + url) - elif 'content-disposition' in header: - return url - - return False - + 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") - - url = re.search(r"document\.location\.host \+\s*'(.+)';", self.html).group(1) - if not url.startswith('"http://"'): - url = 'http://www.filefactory.com' + url + + 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) - direct = re.search(r'data-href-direct="(.*)" class="button', self.html).group(1) - waittime = re.search(r'id="startWait" value="(\d+)"', self.html).group(1) - self.setWait(waittime) + 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() - # # Resolve captcha - # found = re.search(self.CAPTCHA_KEY_PATTERN, self.html) - # recaptcha_key = found.group(1) if found else "6LeN8roSAAAAAPdC1zy399Qei4b1BwmSBSsBN8zm" - # recaptcha = ReCaptcha(self) - # - # # Try up to 5 times - # for i in range(5): - # challenge, code = recaptcha.challenge(recaptcha_key) - # response = json_loads(self.load("http://www.filefactory.com/file/checkCaptcha.php", - # post={"check" : self.check, "recaptcha_challenge_field" : challenge, "recaptcha_response_field" : code})) - # if response['status'] == 'ok': - # self.correctCaptcha() - # break - # else: - # self.invalidCaptcha() - # else: - # self.fail("No valid captcha after 5 attempts") - # - # # This will take us to a wait screen - # waiturl = "http://www.filefactory.com" + response['path'] - # self.logDebug("Fetching wait with url [%s]" % waiturl) - # waithtml = self.load(waiturl, decode=True) - # found = re.search(r'<a href="(http://www.filefactory.com/dlf/.*?)"', waithtml) - # waithtml = self.load(found.group(1), decode=True) - # - # # Find the wait value and wait - # wait = int(re.search(self.WAIT_PATTERN, waithtml).group('wait')) - # self.logDebug("Waiting %d seconds." % wait) - # self.setWait(wait, True) - # self.wait() - # - # # Now get the real download url and retrieve the file - # url = re.search(self.FILE_URL_PATTERN,waithtml).group('url') - # # this may either download our file or forward us to an error page - # self.logDebug("Download URL: %s" % url) - self.download(direct) - + 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": '<div id="errorMessage">'}) if check == "multiple": - self.setWait(15*60) self.logDebug("Parallel downloads detected; waiting 15 minutes") - self.wait() - self.retry() + self.retry(wait_time=15 * 60, reason='Parallel downloads') elif check == "error": self.fail("Unknown error") - + def handlePremium(self): - self.fail('Please enable direct downloads') - -def getInfo(urls): - for chunk in chunks(urls, 100): yield checkFile(FilefactoryCom, chunk) + 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: + self.parseError('Unable to detect premium direct link') + + self.logDebug('DIRECT PREMIUM LINK: ' + url) + self.download(url, disposition=True) -- cgit v1.2.3 From 7d4dbda910413ab5db4e689a3b73d83676cd1b23 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Mon, 8 Apr 2013 00:25:03 +0300 Subject: FilefactoryCom: removed unused constants + code comments --- module/plugins/hoster/FilefactoryCom.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FilefactoryCom.py b/module/plugins/hoster/FilefactoryCom.py index e92c1505d..aebf0f38d 100644 --- a/module/plugins/hoster/FilefactoryCom.py +++ b/module/plugins/hoster/FilefactoryCom.py @@ -57,14 +57,11 @@ class FilefactoryCom(SimpleHoster): __name__ = "FilefactoryCom" __type__ = "hoster" __pattern__ = r"https?://(?:www\.)?filefactory\.com/file/(?P<id>[a-zA-Z0-9]+)" - __version__ = "0.38" + __version__ = "0.39" __description__ = """Filefactory.Com File Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") - FILE_INFO_PATTERN = r'(?P<N>\S+)\s*</span>\s*</h1>\s*<h2>(?P<S>[\w.]+) (?P<U>\w+) file uploaded' - FILE_OFFLINE_PATTERN = r'<title>File Not Found' - def process(self, pyfile): if self.premium and (not self.SH_CHECK_TRAFFIC or self.checkTrafficLeft()): self.handlePremium() @@ -78,18 +75,21 @@ class FilefactoryCom(SimpleHoster): 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') -- cgit v1.2.3 From adc259b69f1b283c92cfcb759fffc05d777a309a Mon Sep 17 00:00:00 2001 From: philou75 <pjupin@gmail.com> Date: Mon, 8 Apr 2013 23:00:02 +0300 Subject: Update OneFichierCom.py Waiting pattern correction following hoster modification --- module/plugins/hoster/OneFichierCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/OneFichierCom.py b/module/plugins/hoster/OneFichierCom.py index 7b87bbe71..5d7e14f1e 100644 --- a/module/plugins/hoster/OneFichierCom.py +++ b/module/plugins/hoster/OneFichierCom.py @@ -19,7 +19,7 @@ class OneFichierCom(SimpleHoster): DOWNLOAD_LINK_PATTERN = r'<br/> <br/> <br/> \s+<a href="(?P<url>http://.*?)"' PASSWORD_PROTECTED_TOKEN = "protected by password" - WAITING_PATTERN = "Warning ! Without premium status, you can download only one file at a time and you must wait at least (\d+) minutes between each downloads." + WAITING_PATTERN = "Warning ! Without premium status, you can download only one file at a time and you must wait up to (\d+) minutes between each downloads." def process(self, pyfile): found = re.search(self.__pattern__, pyfile.url) file_id = found.group(2) -- cgit v1.2.3 From 7a2980d939b64e20c2c3ec5891dae2afcce550d0 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 9 Apr 2013 20:46:39 +0200 Subject: UploadedTo: getID uses the __pattern__ regex to avoid duplication. + test links + https support + content-disposition --- module/plugins/hoster/UploadedTo.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index 874b04d64..c7ce5846e 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +# Test links (random.bin): +# http://ul.to/044yug9o +# http://ul.to/gzfhd0xs + import re from module.utils import html_unescape, parseFileSize @@ -14,7 +18,7 @@ key = "bGhGMkllZXByd2VEZnU5Y2NXbHhYVlZ5cEE1bkEzRUw=".decode('base64') def getID(url): """ returns id from file url""" - m = re.match(r"http://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P<ID>\w+)", url) + m = re.match(UploadedTo.__pattern__, url) return m.group('ID') @@ -77,8 +81,8 @@ def getInfo(urls): class UploadedTo(Hoster): __name__ = "UploadedTo" __type__ = "hoster" - __pattern__ = r"http://[\w\.-]*?(uploaded\.(to|net)(/file/|/?\?id=|.*?&id=)|ul\.to/)\w+" - __version__ = "0.66" + __pattern__ = r"https?://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P<ID>\w+)" + __version__ = "0.67" __description__ = """Uploaded.net Download Hoster""" __author_name__ = ("spoob", "mkaay", "zoidberg", "netpok", "stickell") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "netpok@gmail.com", "l.stickell@yahoo.it") @@ -221,7 +225,7 @@ class UploadedTo(Hoster): if not downloadURL: self.fail("No Download url retrieved/all captcha attempts failed") - self.download(downloadURL) + self.download(downloadURL, disposition=True) check = self.checkDownload({"limit-dl": self.DL_LIMIT_PATTERN}) if check == "limit-dl": self.setWait(60 * 60, True) -- cgit v1.2.3 From 95f56ae40b7c6a56b959b512aa82c8674377c31c Mon Sep 17 00:00:00 2001 From: Gonzalo SR <gonzalo@gonzalosr.com> Date: Thu, 11 Apr 2013 15:16:13 +0300 Subject: Fixed incorrect use of rstrip() rstrip() ate the last "r" in .rar files. "The chars argument is not a suffix; rather, all combinations of its values are stripped" (see http://docs.python.org/2/library/stdtypes.html#str.rstrip) Using rsplit() instead. --- module/plugins/hoster/MegaNz.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MegaNz.py b/module/plugins/hoster/MegaNz.py index a28ddca9d..3b64c3ef5 100644 --- a/module/plugins/hoster/MegaNz.py +++ b/module/plugins/hoster/MegaNz.py @@ -19,7 +19,7 @@ class MegaNz(Hoster): __name__ = "MegaNz" __type__ = "hoster" __pattern__ = r"https?://([a-z0-9]+\.)?mega\.co\.nz/#!([a-zA-Z0-9!_\-]+)" - __version__ = "0.11" + __version__ = "0.12" __description__ = """mega.co.nz hoster plugin""" __author_name__ = ("RaNaN", ) __author_mail__ = ("ranan@pyload.org", ) @@ -34,7 +34,7 @@ class MegaNz(Hoster): def getCipherKey(self, key): """ Construct the cipher key from the given data """ a = array("I", key) - key_array = array("I", [a[0] ^ a[4], a[1] ^a[5], a[2] ^ a[6], a[3] ^a[7]]) + key_array = array("I", [a[0] ^ a[4], a[1] ^ a[5], a[2] ^ a[6], a[3] ^ a[7]]) return key_array def callApi(self, **kwargs): @@ -55,7 +55,7 @@ class MegaNz(Hoster): self.fail(_("Decryption failed")) # Data is padded, 0-bytes must be stripped - return json.loads(attr.replace("MEGA", "").rstrip("\0").strip()) + return json.loads(attr.replace("MEGA", "").rsplit("\0")[0].strip()) def decryptFile(self, key): """ Decrypts the file at lastDownload` """ @@ -69,7 +69,7 @@ class MegaNz(Hoster): self.pyfile.setStatus("decrypting") f = open(self.lastDownload, "rb") - df = open(self.lastDownload.rstrip(self.FILE_SUFFIX), "wb") + df = open(self.lastDownload.rsplit(self.FILE_SUFFIX)[0], "wb") # TODO: calculate CBC-MAC for checksum -- cgit v1.2.3 From 2f9dc56db6fc84e9915b7b8bc7892b880fe03059 Mon Sep 17 00:00:00 2001 From: Gonzalo SR <gonzalo@gonzalosr.com> Date: Thu, 11 Apr 2013 19:07:46 +0300 Subject: revert correct rsrtrip() --- module/plugins/hoster/MegaNz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MegaNz.py b/module/plugins/hoster/MegaNz.py index 3b64c3ef5..e5be4eeb7 100644 --- a/module/plugins/hoster/MegaNz.py +++ b/module/plugins/hoster/MegaNz.py @@ -55,7 +55,7 @@ class MegaNz(Hoster): self.fail(_("Decryption failed")) # Data is padded, 0-bytes must be stripped - return json.loads(attr.replace("MEGA", "").rsplit("\0")[0].strip()) + return json.loads(attr.replace("MEGA", "").rstrip("\0").strip()) def decryptFile(self, key): """ Decrypts the file at lastDownload` """ -- cgit v1.2.3 From 3b86e3ee0b31bb4b32caa2ac3c2a543b00d290aa Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Fri, 12 Apr 2013 15:20:09 +0200 Subject: EgoFilesCom: fixed FILE_INFO_PATTERN --- module/plugins/hoster/EgoFilesCom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/EgoFilesCom.py b/module/plugins/hoster/EgoFilesCom.py index ad278e60f..4e78a5b9a 100644 --- a/module/plugins/hoster/EgoFilesCom.py +++ b/module/plugins/hoster/EgoFilesCom.py @@ -28,12 +28,12 @@ class EgoFilesCom(SimpleHoster): __name__ = "EgoFilesCom" __type__ = "hoster" __pattern__ = r"https?://(www\.)?egofiles.com/(\w+)" - __version__ = "0.11" + __version__ = "0.12" __description__ = """Egofiles.com Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") - FILE_INFO_PATTERN = r'<div class="down-file">\s+(?P<N>\S+)\s+<div class="file-properties">\s+(File size|Rozmiar): (?P<S>[\w.]+) (?P<U>\w+) \|' + FILE_INFO_PATTERN = r'<div class="down-file">\s+(?P<N>.+)\s+<div class="file-properties">\s+(File size|Rozmiar): (?P<S>[\w.]+) (?P<U>\w+) \|' FILE_OFFLINE_PATTERN = r'(File size|Rozmiar): 0 KB' WAIT_TIME_PATTERN = r'For next free download you have to wait <strong>((?P<m>\d*)m)? ?((?P<s>\d+)s)?</strong>' DIRECT_LINK_PATTERN = r'<a href="(?P<link>[^"]+)">Download ></a>' -- cgit v1.2.3 From c235e869a50d8783b01f5a46d5b93e171cbbb71e Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Fri, 12 Apr 2013 15:30:17 +0200 Subject: New debrid: MultiDebridCom http://forum.pyload.org/viewtopic.php?f=13&t=2426 --- module/plugins/hoster/MultiDebridCom.py | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 module/plugins/hoster/MultiDebridCom.py (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MultiDebridCom.py b/module/plugins/hoster/MultiDebridCom.py new file mode 100644 index 000000000..ca98e8a0e --- /dev/null +++ b/module/plugins/hoster/MultiDebridCom.py @@ -0,0 +1,57 @@ +# -*- 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 <http://www.gnu.org/licenses/>. # +############################################################################ + +import re + +from module.plugins.Hoster import Hoster +from module.common.json_layer import json_loads + + +class MultiDebridCom(Hoster): + __name__ = "MultiDebridCom" + __version__ = "0.01" + __type__ = "hoster" + __pattern__ = r"http://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/dl/" + __description__ = """Multi-debrid.com hoster plugin""" + __author_name__ = ("stickell") + __author_mail__ = ("l.stickell@yahoo.it") + + def init(self): + self.chunkLimit = -1 + self.resumeDownload = True + + def process(self, pyfile): + if not self.account: + self.logError("Please enter your Multi-debrid.com account or deactivate this plugin") + self.fail("No Multi-debrid.com account provided") + + self.logDebug("Original URL: %s" % pyfile.url) + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + else: + page = self.req.load('http://multi-debrid.com/api.php', + get={'user': self.user, 'pass': self.account.getAccountData(self.user)['password'], + 'link': pyfile.url}) + self.logDebug("JSON data: " + page) + page = json_loads(page) + if page['status'] != 'ok': + self.fail('Unable to unrestrict link') + new_url = page['link'] + + self.logDebug("Unrestricted URL: " + new_url) + + self.download(new_url, disposition=True) -- cgit v1.2.3 From 4403f97651be9a3e178377ce38fed14b9b7d7c32 Mon Sep 17 00:00:00 2001 From: healthhazard <healthhazard@freenet.de> Date: Sun, 14 Apr 2013 13:25:24 +0300 Subject: Update UploadedTo.py Corrected waiting time to 180 (not 60) minutes as free user. --- module/plugins/hoster/UploadedTo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index c7ce5846e..8c7cb5b0a 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -209,7 +209,7 @@ class UploadedTo(Hoster): elif "limit-parallel" in result: self.fail("Cannot download in parallel") elif self.DL_LIMIT_PATTERN in result: # limit-dl - self.setWait(60 * 60, True) + self.setWait(3 * 60 * 60, True) self.wait() self.retry() elif 'err:"captcha"' in result: @@ -228,6 +228,6 @@ class UploadedTo(Hoster): self.download(downloadURL, disposition=True) check = self.checkDownload({"limit-dl": self.DL_LIMIT_PATTERN}) if check == "limit-dl": - self.setWait(60 * 60, True) + self.setWait(3 * 60 * 60, True) self.wait() self.retry() -- cgit v1.2.3 From ef99c19aa5285ad5ad54aec867135b325da6acd0 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Sun, 14 Apr 2013 16:04:44 +0300 Subject: UploadedTo: version increased after #83 --- module/plugins/hoster/UploadedTo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index 8c7cb5b0a..5855f118c 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -82,7 +82,7 @@ class UploadedTo(Hoster): __name__ = "UploadedTo" __type__ = "hoster" __pattern__ = r"https?://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P<ID>\w+)" - __version__ = "0.67" + __version__ = "0.68" __description__ = """Uploaded.net Download Hoster""" __author_name__ = ("spoob", "mkaay", "zoidberg", "netpok", "stickell") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "netpok@gmail.com", "l.stickell@yahoo.it") -- cgit v1.2.3 From f2a215b81cc579514fa1850f18a03d73a87eb3b0 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Sun, 14 Apr 2013 21:05:36 +0200 Subject: ExtabitCom: fixed #77 --- module/plugins/hoster/ExtabitCom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/ExtabitCom.py b/module/plugins/hoster/ExtabitCom.py index 718423986..702cfe2bc 100644 --- a/module/plugins/hoster/ExtabitCom.py +++ b/module/plugins/hoster/ExtabitCom.py @@ -24,8 +24,8 @@ from module.common.json_layer import json_loads class ExtabitCom(SimpleHoster): __name__ = "ExtabitCom" __type__ = "hoster" - __pattern__ = r"http://(\w+\.)*extabit\.com/(file|go)/(?P<ID>\w+)" - __version__ = "0.2" + __pattern__ = r"http://(\w+\.)*extabit\.com/(file|go|fid)/(?P<ID>\w+)" + __version__ = "0.3" __description__ = """Extabit.com""" __author_name__ = ("zoidberg") -- cgit v1.2.3 From 1211334dd71aa705d733475e74ea0d27e949a7c4 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Sun, 14 Apr 2013 21:07:10 +0200 Subject: ExtabitCom: cosmetics --- module/plugins/hoster/ExtabitCom.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/ExtabitCom.py b/module/plugins/hoster/ExtabitCom.py index 702cfe2bc..fd91bb023 100644 --- a/module/plugins/hoster/ExtabitCom.py +++ b/module/plugins/hoster/ExtabitCom.py @@ -17,10 +17,12 @@ """ import re + from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo from module.plugins.ReCaptcha import ReCaptcha from module.common.json_layer import json_loads + class ExtabitCom(SimpleHoster): __name__ = "ExtabitCom" __type__ = "hoster" @@ -33,34 +35,34 @@ class ExtabitCom(SimpleHoster): FILE_SIZE_PATTERN = r'<th>Size:</th>\s*<td class="col-fileinfo">(?P<S>[^<]+)</td>' FILE_OFFLINE_PATTERN = r'<h1>File not found</h1>' TEMP_OFFLINE_PATTERN = r">(File is temporary unavailable|No download mirror)<" - + DOWNLOAD_LINK_PATTERN = r'"(http://guest\d+\.extabit\.com/[a-z0-9]+/.*?)"' - def handleFree(self): + def handleFree(self): if r">Only premium users can download this file" in self.html: self.fail("Only premium users can download this file") - + m = re.search(r"Next free download from your ip will be available in <b>(\d+)\s*minutes", self.html) if m: self.setWait(int(m.group(1)) * 60, True) - self.wait() + self.wait() elif "The daily downloads limit from your IP is exceeded" in self.html: self.setWait(3600, True) self.wait() - + self.logDebug("URL: " + self.req.http.lastEffectiveURL) m = re.match(self.__pattern__, self.req.http.lastEffectiveURL) - fileID = m.group('ID') if m else self.file_info('ID') - + fileID = m.group('ID') if m else self.file_info('ID') + m = re.search(r'recaptcha/api/challenge\?k=(\w+)', self.html) if m: recaptcha = ReCaptcha(self) captcha_key = m.group(1) - + for i in range(5): get_data = {"type": "recaptcha"} get_data["challenge"], get_data["capture"] = recaptcha.challenge(captcha_key) - response = json_loads(self.load("http://extabit.com/file/%s/" % fileID, get = get_data)) + response = json_loads(self.load("http://extabit.com/file/%s/" % fileID, get=get_data)) if "ok" in response: self.correctCaptcha() break @@ -70,15 +72,16 @@ class ExtabitCom(SimpleHoster): self.fail("Invalid captcha") else: self.parseError('Captcha') - + if not "href" in response: self.parseError('JSON') - + self.html = self.load("http://extabit.com/file/%s%s" % (fileID, response['href'])) m = re.search(self.DOWNLOAD_LINK_PATTERN, self.html) if not m: self.parseError('Download URL') url = m.group(1) self.logDebug("Download URL: " + url) - self.download(url) + self.download(url) + -getInfo = create_getInfo(ExtabitCom) \ No newline at end of file +getInfo = create_getInfo(ExtabitCom) -- cgit v1.2.3 From 14d9964ed8b4c501d79546d99b50d053381f6630 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 16 Apr 2013 21:14:55 +0200 Subject: EasybytezCom: fixed direct link error. http://forum.pyload.org/viewtopic.php?f=12&t=2027 --- module/plugins/hoster/EasybytezCom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/EasybytezCom.py b/module/plugins/hoster/EasybytezCom.py index 0deaa782e..5c21eff5d 100644 --- a/module/plugins/hoster/EasybytezCom.py +++ b/module/plugins/hoster/EasybytezCom.py @@ -25,7 +25,7 @@ class EasybytezCom(XFileSharingPro): __name__ = "EasybytezCom" __type__ = "hoster" __pattern__ = r"http://(?:\w*\.)?easybytez.com/(\w+).*" - __version__ = "0.12" + __version__ = "0.13" __description__ = """easybytez.com""" __author_name__ = ("zoidberg") __author_mail__ = ("zoidberg@mujmail.cz") @@ -35,7 +35,7 @@ class EasybytezCom(XFileSharingPro): FILE_INFO_PATTERN = r'<tr><td align=right><b>Filename:</b></td><td nowrap>(?P<N>[^<]+)</td></tr>\s*.*?<small>\((?P<S>[^<]+)\)</small>' FILE_OFFLINE_PATTERN = r'<h1>File not available</h1>' - DIRECT_LINK_PATTERN = r'(http://(\w+\.easybytez\.com|\d+\.\d+\.\d+\.\d+)/files/\d+/\w+/[^"<]+)' + DIRECT_LINK_PATTERN = r'(http://(\w+\.(easybytez|zingload)\.com|\d+\.\d+\.\d+\.\d+)/files/\d+/\w+/[^"<]+)' OVR_DOWNLOAD_LINK_PATTERN = r'<h2>Download Link</h2>\s*<textarea[^>]*>([^<]+)' OVR_KILL_LINK_PATTERN = r'<h2>Delete Link</h2>\s*<textarea[^>]*>([^<]+)' ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<Center><b>)(.*?)</' -- cgit v1.2.3 From 10e07bf671dc5c61c4016686afbd723b162cf44a Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 16 Apr 2013 21:15:59 +0200 Subject: EasybytezCom: code cleanup --- module/plugins/hoster/EasybytezCom.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/EasybytezCom.py b/module/plugins/hoster/EasybytezCom.py index 5c21eff5d..c4a9e2ba5 100644 --- a/module/plugins/hoster/EasybytezCom.py +++ b/module/plugins/hoster/EasybytezCom.py @@ -19,8 +19,10 @@ import re from random import random from pycurl import LOW_SPEED_TIME + from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + class EasybytezCom(XFileSharingPro): __name__ = "EasybytezCom" __type__ = "hoster" @@ -33,28 +35,28 @@ class EasybytezCom(XFileSharingPro): FILE_NAME_PATTERN = r'<input type="hidden" name="fname" value="(?P<N>[^"]+)"' FILE_SIZE_PATTERN = r'You have requested <font color="red">[^<]+</font> \((?P<S>[^<]+)\)</font>' FILE_INFO_PATTERN = r'<tr><td align=right><b>Filename:</b></td><td nowrap>(?P<N>[^<]+)</td></tr>\s*.*?<small>\((?P<S>[^<]+)\)</small>' - FILE_OFFLINE_PATTERN = r'<h1>File not available</h1>' - + FILE_OFFLINE_PATTERN = r'<h1>File not available</h1>' + DIRECT_LINK_PATTERN = r'(http://(\w+\.(easybytez|zingload)\.com|\d+\.\d+\.\d+\.\d+)/files/\d+/\w+/[^"<]+)' OVR_DOWNLOAD_LINK_PATTERN = r'<h2>Download Link</h2>\s*<textarea[^>]*>([^<]+)' OVR_KILL_LINK_PATTERN = r'<h2>Delete Link</h2>\s*<textarea[^>]*>([^<]+)' ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<Center><b>)(.*?)</' - + HOSTER_NAME = "easybytez.com" - + def setup(self): self.resumeDownload = self.multiDL = self.premium def handlePremium(self): - self.html = self.load(self.pyfile.url, post = self.getPostParameters()) + self.html = self.load(self.pyfile.url, post=self.getPostParameters()) found = re.search(self.DIRECT_LINK_PATTERN, self.html) if not found: self.parseError('DIRECT LINK') self.startDownload(found.group(1)) def handleOverriden(self): self.html = self.load("http://www.%s/" % self.HOSTER_NAME) - action, inputs = self.parseHtmlForm('') - upload_id = "%012d" % int(random()*10**12) + action, inputs = self.parseHtmlForm('') + upload_id = "%012d" % int(random() * 10 ** 12) action += upload_id + "&js_on=1&utype=prem&upload_type=url" inputs['tos'] = '1' inputs['url_mass'] = self.pyfile.url @@ -63,22 +65,23 @@ class EasybytezCom(XFileSharingPro): self.logDebug(action, inputs) #wait for file to upload to easybytez.com self.req.http.c.setopt(LOW_SPEED_TIME, 600) - self.html = self.load(action, post = inputs) + self.html = self.load(action, post=inputs) action, inputs = self.parseHtmlForm('F1') if not inputs: self.parseError('TEXTAREA') self.logDebug(inputs) if inputs['st'] == 'OK': - self.html = self.load(action, post = inputs) + self.html = self.load(action, post=inputs) elif inputs['st'] == 'Can not leech file': self.retry(max_tries=20, wait_time=180, reason=inputs['st']) else: - self.fail(inputs['st']) - - #get easybytez.com link for uploaded file + self.fail(inputs['st']) + + #get easybytez.com link for uploaded file found = re.search(self.OVR_DOWNLOAD_LINK_PATTERN, self.html) if not found: self.parseError('DIRECT LINK (OVR)') self.pyfile.url = found.group(1) self.retry() -getInfo = create_getInfo(EasybytezCom) \ No newline at end of file + +getInfo = create_getInfo(EasybytezCom) -- cgit v1.2.3 From a129e50c81e7466da7f91106ed279c346f7c3ee3 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 16 Apr 2013 21:39:01 +0200 Subject: EasybytezCom: the overridden functions were the same. --- module/plugins/hoster/EasybytezCom.py | 42 +---------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/EasybytezCom.py b/module/plugins/hoster/EasybytezCom.py index c4a9e2ba5..96e3d93d2 100644 --- a/module/plugins/hoster/EasybytezCom.py +++ b/module/plugins/hoster/EasybytezCom.py @@ -16,10 +16,6 @@ @author: zoidberg """ -import re -from random import random -from pycurl import LOW_SPEED_TIME - from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo @@ -27,7 +23,7 @@ class EasybytezCom(XFileSharingPro): __name__ = "EasybytezCom" __type__ = "hoster" __pattern__ = r"http://(?:\w*\.)?easybytez.com/(\w+).*" - __version__ = "0.13" + __version__ = "0.14" __description__ = """easybytez.com""" __author_name__ = ("zoidberg") __author_mail__ = ("zoidberg@mujmail.cz") @@ -47,41 +43,5 @@ class EasybytezCom(XFileSharingPro): def setup(self): self.resumeDownload = self.multiDL = self.premium - def handlePremium(self): - self.html = self.load(self.pyfile.url, post=self.getPostParameters()) - found = re.search(self.DIRECT_LINK_PATTERN, self.html) - if not found: self.parseError('DIRECT LINK') - self.startDownload(found.group(1)) - - def handleOverriden(self): - self.html = self.load("http://www.%s/" % self.HOSTER_NAME) - action, inputs = self.parseHtmlForm('') - upload_id = "%012d" % int(random() * 10 ** 12) - action += upload_id + "&js_on=1&utype=prem&upload_type=url" - inputs['tos'] = '1' - inputs['url_mass'] = self.pyfile.url - inputs['up1oad_type'] = 'url' - - self.logDebug(action, inputs) - #wait for file to upload to easybytez.com - self.req.http.c.setopt(LOW_SPEED_TIME, 600) - self.html = self.load(action, post=inputs) - - action, inputs = self.parseHtmlForm('F1') - if not inputs: self.parseError('TEXTAREA') - self.logDebug(inputs) - if inputs['st'] == 'OK': - self.html = self.load(action, post=inputs) - elif inputs['st'] == 'Can not leech file': - self.retry(max_tries=20, wait_time=180, reason=inputs['st']) - else: - self.fail(inputs['st']) - - #get easybytez.com link for uploaded file - found = re.search(self.OVR_DOWNLOAD_LINK_PATTERN, self.html) - if not found: self.parseError('DIRECT LINK (OVR)') - self.pyfile.url = found.group(1) - self.retry() - getInfo = create_getInfo(EasybytezCom) -- cgit v1.2.3 From c37581d307afe6e745d2421fd31ba26e4f647fa9 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Fri, 19 Apr 2013 20:04:55 +0300 Subject: OneFichierCom: version increased after adc259b69f1b283c92cfcb759fffc05d777a309a --- module/plugins/hoster/OneFichierCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/OneFichierCom.py b/module/plugins/hoster/OneFichierCom.py index 5d7e14f1e..c7c3384e9 100644 --- a/module/plugins/hoster/OneFichierCom.py +++ b/module/plugins/hoster/OneFichierCom.py @@ -7,7 +7,7 @@ class OneFichierCom(SimpleHoster): __name__ = "OneFichierCom" __type__ = "hoster" __pattern__ = r"(http://(\w+)\.((1fichier|d(es)?fichiers|pjointe)\.(com|fr|net|org)|(cjoint|mesfichiers|piecejointe|oi)\.(org|net)|tenvoi\.(com|org|net)|dl4free\.com|alterupload\.com|megadl.fr))" - __version__ = "0.46" + __version__ = "0.47" __description__ = """1fichier.com download hoster""" __author_name__ = ("fragonib", "the-razer", "zoidberg","imclem") __author_mail__ = ("fragonib[AT]yahoo[DOT]es", "daniel_ AT gmx DOT net", "zoidberg@mujmail.cz","imclem on github") -- cgit v1.2.3 From 2847d4b8f0a534e209b0aca9c96fbffbf2759716 Mon Sep 17 00:00:00 2001 From: Joris <joris.onghena.83@gmail.com> Date: Mon, 22 Apr 2013 20:50:45 +0200 Subject: MovReelCom: hoster added --- module/plugins/hoster/MovReelCom.py | 106 ++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 module/plugins/hoster/MovReelCom.py (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MovReelCom.py b/module/plugins/hoster/MovReelCom.py new file mode 100644 index 000000000..6f5f1d3f1 --- /dev/null +++ b/module/plugins/hoster/MovReelCom.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +import re +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.utils import html_unescape +from module.network.RequestFactory import getURL + +class MovReelCom(SimpleHoster): + __name__ = "MovReelCom" + __type__ = "hoster" + __pattern__ = r"http://movreel.com/.*" + __version__ = "1.00" + __description__ = """MovReel.com hoster plugin""" + __author_name__ = ("JorisV83") + __author_mail__ = ("jorisv83-pyload@yahoo.com") + + FILE_INFO_PATTERN = r'You have requested <font color="red">http://movreel.com/.*/(?P<N>.+?)</font>.*\((?P<S>[\d.]+) (?P<U>..)\)</font>' + FILE_OFFLINE_PATTERN = r'<b>File Not Found</b>' + + def setup(self): + self.resumeDownload = True + self.multiDL = False + + def handleFree(self): + + # Define search patterns + op_pattern = '<input type="hidden" name="op" value="(.*)">' + id_pattern = '<input type="hidden" name="id" value="(.*)">' + fn_pattern = '<input type="hidden" name="fname" value="(.*)">' + re_pattern = '<input type="hidden" name="referer" value="(.*)">' + ul_pattern = '<input type="hidden" name="usr_login" value="(.*)">' + rand_pattern = '<input type="hidden" name="rand" value="(.*)">' + link_pattern = "var file_link = '(.*)';" + downlimit_pattern = '<br><p class="err">You have reached the download-limit: .*</p>' + + # Get HTML source + self.logDebug("Getting first HTML source") + html = self.load(self.pyfile.url) + self.logDebug(" > Done") + + op_val = re.search(op_pattern, html).group(1) + id_val = re.search(id_pattern, html).group(1) + fn_val = re.search(fn_pattern, html).group(1) + re_val = re.search(re_pattern, html).group(1) + ul_val = re.search(ul_pattern, html).group(1) + + # Debug values + self.logDebug(" > Op " + op_val) + self.logDebug(" > Id " + id_val) + self.logDebug(" > Fname " + fn_val) + self.logDebug(" > Referer " + re_val) + self.logDebug(" > User Login " + ul_val) + + # Create post data + post_data = {"op" : op_val, "usr_login" : ul_val, "id" : id_val, "fname" : fn_val, "referer" : re_val, "method_free" : "+Free+Download"} + + # Post and get new HTML source + self.logDebug("Getting second HTML source") + html = self.load(self.pyfile.url, post = post_data, decode=True) + self.logDebug(" > Done") + + # Check download limit + if re.search(downlimit_pattern, html) is not None: + self.retry(3, 7200, "Download limit reached, wait 2h") + + # Retrieve data + if re.search(op_pattern, html) is not None: + op_val = re.search(op_pattern, html).group(1) + else: + self.retry(3, 10, "Second html: no op found!!") + + if re.search(id_pattern, html) is not None: + id_val = re.search(id_pattern, html).group(1) + else: + self.retry(3, 10, "Second html: no id found!!") + + if re.search(rand_pattern, html) is not None: + rand_val = re.search(rand_pattern, html).group(1) + else: + self.retry(3, 10, "Second html: no rand found!!") + + re_val = self.pyfile.url + + # Debug values + self.logDebug(" > Op " + op_val) + self.logDebug(" > Id " + id_val) + self.logDebug(" > Rand " + rand_val) + self.logDebug(" > Referer " + re_val) + + # Create post data + post_data = {"op" : op_val, "id" : id_val, "rand" : rand_val, "referer" : re_val, "method_free" : "+Free+Download", "method_premium" : "", "down_direct" : "1"} + + # Post and get new HTML source + self.logDebug("Getting third HTML source") + html = self.load(self.pyfile.url, post = post_data, decode=True) + self.logDebug(" > Done") + + # Get link value + if re.search(link_pattern, html) is not None: + link_val = re.search(link_pattern, html).group(1) + self.logDebug(" > Link " + link_val) + self.download(link_val) + else: + self.logDebug("No link found!!") + self.retry(3, 10, "No link found!!") + +getInfo = create_getInfo(MovReelCom) \ No newline at end of file -- cgit v1.2.3 From 3d1693ec11b02d5bdda1690927b2635f8b285c9b Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 25 Apr 2013 15:31:52 +0200 Subject: UploadedTo: sometimes API returns "can't find request". Trying three times. --- module/plugins/hoster/UploadedTo.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index 5855f118c..b7740bb40 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -32,7 +32,10 @@ def getAPIData(urls): post["id_%s" % i] = id idMap[id] = url - api = unicode(getURL("http://uploaded.net/api/filemultiple", post=post, decode=False), 'iso-8859-1') + for i in xrange(3): + api = unicode(getURL("http://uploaded.net/api/filemultiple", post=post, decode=False), 'iso-8859-1') + if api != "can't find request": + break result = {} @@ -82,7 +85,7 @@ class UploadedTo(Hoster): __name__ = "UploadedTo" __type__ = "hoster" __pattern__ = r"https?://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P<ID>\w+)" - __version__ = "0.68" + __version__ = "0.69" __description__ = """Uploaded.net Download Hoster""" __author_name__ = ("spoob", "mkaay", "zoidberg", "netpok", "stickell") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "netpok@gmail.com", "l.stickell@yahoo.it") -- cgit v1.2.3 From d20d733cec7f8d45b4854cc14216d94f8915d8fc Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 30 Apr 2013 21:04:05 +0200 Subject: UploadedTo: improvements to 3d1693ec11b02d5bdda1690927b2635f8b285c9b --- module/plugins/hoster/UploadedTo.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadedTo.py b/module/plugins/hoster/UploadedTo.py index b7740bb40..21a9812ab 100644 --- a/module/plugins/hoster/UploadedTo.py +++ b/module/plugins/hoster/UploadedTo.py @@ -5,6 +5,7 @@ # http://ul.to/gzfhd0xs import re +from time import sleep from module.utils import html_unescape, parseFileSize @@ -32,10 +33,12 @@ def getAPIData(urls): post["id_%s" % i] = id idMap[id] = url - for i in xrange(3): + for i in xrange(5): api = unicode(getURL("http://uploaded.net/api/filemultiple", post=post, decode=False), 'iso-8859-1') if api != "can't find request": break + else: + sleep(3) result = {} @@ -85,7 +88,7 @@ class UploadedTo(Hoster): __name__ = "UploadedTo" __type__ = "hoster" __pattern__ = r"https?://[\w\.-]*?(uploaded\.(to|net)|ul\.to)(/file/|/?\?id=|.*?&id=|/)(?P<ID>\w+)" - __version__ = "0.69" + __version__ = "0.70" __description__ = """Uploaded.net Download Hoster""" __author_name__ = ("spoob", "mkaay", "zoidberg", "netpok", "stickell") __author_mail__ = ("spoob@pyload.org", "mkaay@mkaay.de", "zoidberg@mujmail.cz", "netpok@gmail.com", "l.stickell@yahoo.it") -- cgit v1.2.3 From 3785b7c9a96963499000d8926f4192af2aa6493c Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Sun, 5 May 2013 19:15:02 +0200 Subject: MediafireCom: fixed #98 Mediafire now uses SolveMedia instead of ReCaptcha --- module/plugins/hoster/MediafireCom.py | 56 ++++++++--------------------------- 1 file changed, 12 insertions(+), 44 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MediafireCom.py b/module/plugins/hoster/MediafireCom.py index 0e405930f..76dc0a538 100644 --- a/module/plugins/hoster/MediafireCom.py +++ b/module/plugins/hoster/MediafireCom.py @@ -18,7 +18,7 @@ import re from module.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo -from module.plugins.ReCaptcha import ReCaptcha +from module.plugins.internal.CaptchaService import SolveMedia from module.network.RequestFactory import getURL def replace_eval(js_expr): @@ -58,15 +58,15 @@ class MediafireCom(SimpleHoster): __name__ = "MediafireCom" __type__ = "hoster" __pattern__ = r"http://(?:\w*\.)*mediafire\.com/(file/|(view/?|download.php)?\?)(\w{11}|\w{15})($|/)" - __version__ = "0.78" + __version__ = "0.79" __description__ = """Mediafire.com plugin - free only""" - __author_name__ = ("zoidberg") - __author_mail__ = ("zoidberg@mujmail.cz") + __author_name__ = ("zoidberg", "stickell") + __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") DOWNLOAD_LINK_PATTERN = r'<div class="download_link"[^>]*(?:z-index:(?P<zindex>\d+))?[^>]*>\s*<a href="(?P<href>http://[^"]+)"' JS_KEY_PATTERN = r"DoShow\('mfpromo1'\);[^{]*{((\w+)='';.*?)eval\(\2\);" JS_ZMODULO_PATTERN = r"\('z-index'\)\) \% (\d+)\)\);" - RECAPTCHA_PATTERN = r'src="http://(?:api.recaptcha.net|www.google.com/recaptcha/api)/challenge\?k=([^"]+)">' + SOLVEMEDIA_PATTERN = r'http://api\.solvemedia\.com/papi/challenge\.noscript\?k=([^"]+)' PAGE1_ACTION_PATTERN = r'<link rel="canonical" href="([^"]+)"/>' PASSWORD_PATTERN = r'<form name="form_password"' @@ -108,36 +108,7 @@ class MediafireCom(SimpleHoster): self.html = self.load(self.url, post={"downloadp": password}) else: self.fail("No or incorrect password") - - """ - links = re.findall(self.DOWNLOAD_LINK_PATTERN, self.html) - link_count = len(links) - self.logDebug('LINKS ', links) - - if link_count == 0: - self.retry(3, 0, "No links found") - - elif link_count > 1: - found = re.search(self.JS_KEY_PATTERN, self.html) - try: - result = self.js.eval(found.group(1)) - zmodulo = int(re.search(self.JS_ZMODULO_PATTERN, result).group(1)) - self.logDebug("ZMODULO: %d" % zmodulo) - except Exception, e: - self.logDebug(e) - self.parseError("ZMODULO") - - max_index = 0 - for index, url in links: - index = int(index) % zmodulo - if index >= max_index: - download_url = url - - self.logDebug("DOWNLOAD LINK:", download_url) - - else: - zindex, download_url = links[0] - """ + found = re.search(r'kNO = "(http://.*?)";', self.html) if not found: self.parseError("Download URL") download_url = found.group(1) @@ -146,17 +117,14 @@ class MediafireCom(SimpleHoster): self.download(download_url) def checkCaptcha(self): - for i in range(5): - found = re.search(self.RECAPTCHA_PATTERN, self.html) + for i in xrange(5): + found = re.search(self.SOLVEMEDIA_PATTERN, self.html) if found: - captcha_action = re.search(self.PAGE1_ACTION_PATTERN, self.html).group(1) captcha_key = found.group(1) - recaptcha = ReCaptcha(self) - captcha_challenge, captcha_response = recaptcha.challenge(captcha_key) - self.html = self.load(captcha_action, post = { - "recaptcha_challenge_field": captcha_challenge, - "recaptcha_response_field": captcha_response - }, decode = True) + solvemedia = SolveMedia(self) + captcha_challenge, captcha_response = solvemedia.challenge(captcha_key) + self.html = self.load(self.url, post={"adcopy_challenge": captcha_challenge, + "adcopy_response": captcha_response}, decode=True) else: break else: -- cgit v1.2.3 From 0df4d2de77f4443f3d44e97b5fd746f31341afeb Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Sun, 5 May 2013 19:16:07 +0200 Subject: MediafireCom: code cleanup --- module/plugins/hoster/MediafireCom.py | 40 +++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/MediafireCom.py b/module/plugins/hoster/MediafireCom.py index 76dc0a538..1e856c41d 100644 --- a/module/plugins/hoster/MediafireCom.py +++ b/module/plugins/hoster/MediafireCom.py @@ -21,18 +21,20 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo from module.plugins.internal.CaptchaService import SolveMedia from module.network.RequestFactory import getURL + def replace_eval(js_expr): return js_expr.replace(r'eval("', '').replace(r"\'", r"'").replace(r'\"', r'"') + def checkHTMLHeader(url): try: for i in range(3): - header = getURL(url, just_header = True) + header = getURL(url, just_header=True) for line in header.splitlines(): line = line.lower() - if 'location' in line: + if 'location' in line: url = line.split(':', 1)[1].strip() - if 'error.php?errno=320' in url: + if 'error.php?errno=320' in url: return url, 1 if not url.startswith('http://'): url = 'http://www.mediafire.com' + url break @@ -42,9 +44,10 @@ def checkHTMLHeader(url): break except: return url, 3 - + return url, 0 + def getInfo(urls): for url in urls: location, status = checkHTMLHeader(url) @@ -52,7 +55,8 @@ def getInfo(urls): file_info = (url, 0, status, url) else: file_info = parseFileInfo(MediafireCom, url, getURL(url, decode=True)) - yield file_info + yield file_info + class MediafireCom(SimpleHoster): __name__ = "MediafireCom" @@ -65,7 +69,7 @@ class MediafireCom(SimpleHoster): DOWNLOAD_LINK_PATTERN = r'<div class="download_link"[^>]*(?:z-index:(?P<zindex>\d+))?[^>]*>\s*<a href="(?P<href>http://[^"]+)"' JS_KEY_PATTERN = r"DoShow\('mfpromo1'\);[^{]*{((\w+)='';.*?)eval\(\2\);" - JS_ZMODULO_PATTERN = r"\('z-index'\)\) \% (\d+)\)\);" + JS_ZMODULO_PATTERN = r"\('z-index'\)\) \% (\d+)\)\);" SOLVEMEDIA_PATTERN = r'http://api\.solvemedia\.com/papi/challenge\.noscript\?k=([^"]+)' PAGE1_ACTION_PATTERN = r'<link rel="canonical" href="([^"]+)"/>' PASSWORD_PATTERN = r'<form name="form_password"' @@ -73,31 +77,31 @@ class MediafireCom(SimpleHoster): FILE_NAME_PATTERN = r'<META NAME="description" CONTENT="(?P<N>[^"]+)"/>' FILE_INFO_PATTERN = r"oFileSharePopup\.ald\('(?P<ID>[^']*)','(?P<N>[^']*)','(?P<S>[^']*)','','(?P<sha256>[^']*)'\)" FILE_OFFLINE_PATTERN = r'class="error_msg_title"> Invalid or Deleted File. </div>' - + def setup(self): self.multiDL = False def process(self, pyfile): pyfile.url = re.sub(r'/view/?\?', '/?', pyfile.url) - + self.url, result = checkHTMLHeader(pyfile.url) self.logDebug('Location (%d): %s' % (result, self.url)) - + if result == 0: - self.html = self.load(self.url, decode = True) - self.checkCaptcha() - self.multiDL = True + self.html = self.load(self.url, decode=True) + self.checkCaptcha() + self.multiDL = True self.check_data = self.getFileInfo() - + if self.account: self.handlePremium() else: self.handleFree() elif result == 1: - self.offline() + self.offline() else: - self.multiDL = True - self.download(self.url, disposition = True) + self.multiDL = True + self.download(self.url, disposition=True) def handleFree(self): passwords = self.getPassword().splitlines() @@ -112,8 +116,8 @@ class MediafireCom(SimpleHoster): found = re.search(r'kNO = "(http://.*?)";', self.html) if not found: self.parseError("Download URL") download_url = found.group(1) - self.logDebug("DOWNLOAD LINK:", download_url) - + self.logDebug("DOWNLOAD LINK:", download_url) + self.download(download_url) def checkCaptcha(self): -- cgit v1.2.3 From 6ccaef8875ad3e3855717066d71ababbbc1fb67d Mon Sep 17 00:00:00 2001 From: reinoldus <idonthave@amail.com> Date: Mon, 6 May 2013 21:57:08 +0200 Subject: Changed the way of checking for available youtube videos The other way didn't work, because the string doesn't always say watch-player-unavailable This strings appears in all blocked videos, like age, region blocked --- module/plugins/hoster/YoutubeCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/YoutubeCom.py b/module/plugins/hoster/YoutubeCom.py index 2fb1e5264..e2ec25ca4 100644 --- a/module/plugins/hoster/YoutubeCom.py +++ b/module/plugins/hoster/YoutubeCom.py @@ -76,7 +76,7 @@ class YoutubeCom(Hoster): def process(self, pyfile): html = self.load(pyfile.url, decode=True) - if "watch-player-unavailable" in html: + if '<h1 id="unavailable-message" class="message">' in html: self.offline() if "We have been receiving a large volume of requests from your network." in html: -- cgit v1.2.3 From 017ee424821bc5efefd4e78e28f014b643bddb5c Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 7 May 2013 01:06:57 +0300 Subject: YoutubeCom: version increased after 6ccaef8875ad3e3855717066d71ababbbc1fb67d see #105 --- module/plugins/hoster/YoutubeCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/YoutubeCom.py b/module/plugins/hoster/YoutubeCom.py index e2ec25ca4..304cffd69 100644 --- a/module/plugins/hoster/YoutubeCom.py +++ b/module/plugins/hoster/YoutubeCom.py @@ -34,7 +34,7 @@ class YoutubeCom(Hoster): __name__ = "YoutubeCom" __type__ = "hoster" __pattern__ = r"(http|https)://(www\.)?(de\.)?\youtube\.com/watch\?v=.*" - __version__ = "0.30" + __version__ = "0.31" __config__ = [("quality", "sd;hd;fullhd;240p;360p;480p;720p;1080p;3072p", "Quality Setting", "hd"), ("fmt", "int", "FMT/ITAG Number (5-102, 0 for auto)", 0), (".mp4", "bool", "Allow .mp4", True), -- cgit v1.2.3 From 2746d10440ce7ed267290e41ef7b272d6b9a7f17 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 9 May 2013 12:12:28 +0200 Subject: PutlockerCom: fixed parseError raised if the url don't have the www prefix. Fixes #96 --- module/plugins/hoster/PutlockerCom.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/PutlockerCom.py b/module/plugins/hoster/PutlockerCom.py index 9eff0dc2b..b2016472d 100644 --- a/module/plugins/hoster/PutlockerCom.py +++ b/module/plugins/hoster/PutlockerCom.py @@ -28,7 +28,7 @@ class PutlockerCom(SimpleHoster): __name__ = "PutlockerCom" __type__ = "hoster" __pattern__ = r'http://(www\.)?putlocker\.com/(file|embed)/[A-Z0-9]+' - __version__ = "0.24" + __version__ = "0.25" __description__ = """Putlocker.Com""" __author_name__ = ("jeix", "stickell") __author_mail__ = ("l.stickell@yahoo.it") @@ -37,6 +37,8 @@ class PutlockerCom(SimpleHoster): FILE_INFO_PATTERN = r'site-content">\s*<h1>(?P<N>.+)<strong>\( (?P<S>[^)]+) \)</strong></h1>' def handleFree(self): + self.pyfile.url = re.sub(r'http://putlocker\.com', r'http://www.putlocker.com', self.pyfile.url) + self.html = self.load(self.pyfile.url, decode=True) link = self._getLink() -- cgit v1.2.3 From 8ccd40fa7811106d5e3f91bac8c3e66cbd26729e Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Fri, 10 May 2013 10:28:40 +0200 Subject: EgoFilesCom: fixed #109 --- module/plugins/hoster/EgoFilesCom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/EgoFilesCom.py b/module/plugins/hoster/EgoFilesCom.py index 4e78a5b9a..7e6673210 100644 --- a/module/plugins/hoster/EgoFilesCom.py +++ b/module/plugins/hoster/EgoFilesCom.py @@ -28,12 +28,12 @@ class EgoFilesCom(SimpleHoster): __name__ = "EgoFilesCom" __type__ = "hoster" __pattern__ = r"https?://(www\.)?egofiles.com/(\w+)" - __version__ = "0.12" + __version__ = "0.13" __description__ = """Egofiles.com Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") - FILE_INFO_PATTERN = r'<div class="down-file">\s+(?P<N>.+)\s+<div class="file-properties">\s+(File size|Rozmiar): (?P<S>[\w.]+) (?P<U>\w+) \|' + FILE_INFO_PATTERN = r'<div class="down-file">\s+(?P<N>[^\t]+)\s+<div class="file-properties">\s+(File size|Rozmiar): (?P<S>[\w.]+) (?P<U>\w+) \|' FILE_OFFLINE_PATTERN = r'(File size|Rozmiar): 0 KB' WAIT_TIME_PATTERN = r'For next free download you have to wait <strong>((?P<m>\d*)m)? ?((?P<s>\d+)s)?</strong>' DIRECT_LINK_PATTERN = r'<a href="(?P<link>[^"]+)">Download ></a>' -- cgit v1.2.3 From bbc0553151a685715aa3e2aba92a2b90932622f0 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Sat, 11 May 2013 22:00:51 +0200 Subject: YoutubeCom.py: Fixed regulare expression. My intention for this was to also match watch?feature=player_embedded&v= --- module/plugins/hoster/YoutubeCom.py | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/YoutubeCom.py b/module/plugins/hoster/YoutubeCom.py index 304cffd69..33d195c82 100644 --- a/module/plugins/hoster/YoutubeCom.py +++ b/module/plugins/hoster/YoutubeCom.py @@ -33,8 +33,8 @@ def which(program): class YoutubeCom(Hoster): __name__ = "YoutubeCom" __type__ = "hoster" - __pattern__ = r"(http|https)://(www\.)?(de\.)?\youtube\.com/watch\?v=.*" - __version__ = "0.31" + __pattern__ = r"https?://(?:www\.)?(?:de\.)?youtube\.com/watch.*?[?&]v=.*" + __version__ = "0.32" __config__ = [("quality", "sd;hd;fullhd;240p;360p;480p;720p;1080p;3072p", "Quality Setting", "hd"), ("fmt", "int", "FMT/ITAG Number (5-102, 0 for auto)", 0), (".mp4", "bool", "Allow .mp4", True), @@ -47,9 +47,9 @@ class YoutubeCom(Hoster): __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz") # name, width, height, quality ranking, 3D - formats = {5: (".flv", 400, 240, 1, False), + formats = {5: (".flv", 400, 240, 1, False), 6: (".flv", 640, 400, 4, False), - 17: (".3gp", 176, 144, 0, False), + 17: (".3gp", 176, 144, 0, False), 18: (".mp4", 480, 360, 2, False), 22: (".mp4", 1280, 720, 8, False), 43: (".webm", 640, 360, 3, False), @@ -59,7 +59,7 @@ class YoutubeCom(Hoster): 37: (".mp4", 1920, 1080, 9, False), 38: (".mp4", 4096, 3072, 10, False), 44: (".webm", 854, 480, 5, False), - 45: (".webm", 1280, 720, 7, False), + 45: (".webm", 1280, 720, 7, False), 46: (".webm", 1920, 1080, 9, False), 82: (".mp4", 640, 360, 3, True), 83: (".mp4", 400, 240, 1, True), @@ -81,49 +81,49 @@ class YoutubeCom(Hoster): if "We have been receiving a large volume of requests from your network." in html: self.tempOffline() - + #get config use3d = self.getConf("3d") if use3d: - quality = {"sd":82,"hd":84,"fullhd":85,"240p":83,"360p":82,"480p":82,"720p":84,"1080p":85,"3072p":85} + quality = {"sd":82,"hd":84,"fullhd":85,"240p":83,"360p":82,"480p":82,"720p":84,"1080p":85,"3072p":85} else: - quality = {"sd":18,"hd":22,"fullhd":37,"240p":5,"360p":18,"480p":35,"720p":22,"1080p":37,"3072p":38} + quality = {"sd":18,"hd":22,"fullhd":37,"240p":5,"360p":18,"480p":35,"720p":22,"1080p":37,"3072p":38} desired_fmt = self.getConf("fmt") if desired_fmt and desired_fmt not in self.formats: - self.logWarning("FMT %d unknown - using default." % desired_fmt) - desired_fmt = 0 + self.logWarning("FMT %d unknown - using default." % desired_fmt) + desired_fmt = 0 if not desired_fmt: - desired_fmt = quality.get(self.getConf("quality"), 18) - + desired_fmt = quality.get(self.getConf("quality"), 18) + #parse available streams streams = re.search(r'"url_encoded_fmt_stream_map": "(.*?)",', html).group(1) streams = [x.split('\u0026') for x in streams.split(',')] streams = [dict((y.split('=',1)) for y in x) for x in streams] streams = [(int(x['itag']), "%s&signature=%s" % (unquote(x['url']), x['sig'])) for x in streams] - #self.logDebug("Found links: %s" % streams) - self.logDebug("AVAILABLE STREAMS: %s" % [x[0] for x in streams]) - + #self.logDebug("Found links: %s" % streams) + self.logDebug("AVAILABLE STREAMS: %s" % [x[0] for x in streams]) + #build dictionary of supported itags (3D/2D) - allowed = lambda x: self.getConfig(self.formats[x][0]) + allowed = lambda x: self.getConfig(self.formats[x][0]) streams = [x for x in streams if x[0] in self.formats and allowed(x[0])] if not streams: self.fail("No available stream meets your preferences") - fmt_dict = dict([x for x in streams if self.formats[x[0]][4] == use3d] or streams) - - self.logDebug("DESIRED STREAM: ITAG:%d (%s) %sfound, %sallowed" % - (desired_fmt, + fmt_dict = dict([x for x in streams if self.formats[x[0]][4] == use3d] or streams) + + self.logDebug("DESIRED STREAM: ITAG:%d (%s) %sfound, %sallowed" % + (desired_fmt, "%s %dx%d Q:%d 3D:%s" % self.formats[desired_fmt], - "" if desired_fmt in fmt_dict else "NOT ", + "" if desired_fmt in fmt_dict else "NOT ", "" if allowed(desired_fmt) else "NOT ") - ) + ) - #return fmt nearest to quality index + #return fmt nearest to quality index if desired_fmt in fmt_dict and allowed(desired_fmt): fmt = desired_fmt else: sel = lambda x: self.formats[x][3] #select quality index comp = lambda x, y: abs(sel(x) - sel(y)) - + self.logDebug("Choosing nearest fmt: %s" % [(x, allowed(x), comp(x, desired_fmt)) for x in fmt_dict.keys()]) fmt = reduce(lambda x, y: x if comp(x, desired_fmt) <= comp(y, desired_fmt) and sel(x) > sel(y) else y, fmt_dict.keys()) @@ -132,7 +132,7 @@ class YoutubeCom(Hoster): url = fmt_dict[fmt] self.logDebug("URL: %s" % url) - #set file name + #set file name file_suffix = self.formats[fmt][0] if fmt in self.formats else ".flv" file_name_pattern = '<meta name="title" content="(.+?)">' name = re.search(file_name_pattern, html).group(1).replace("/", "") -- cgit v1.2.3 From 51c3399e371765acaf167d2dc4b91931b0480c50 Mon Sep 17 00:00:00 2001 From: Christopher <4Christopher@gmx.de> Date: Sat, 11 May 2013 23:54:25 +0200 Subject: YoutubeBatch.py, YoutubeCom.py: Synced regulare expression. YoutubeBatch.py now also supports https (tested). --- module/plugins/hoster/YoutubeCom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/YoutubeCom.py b/module/plugins/hoster/YoutubeCom.py index 33d195c82..70db597cf 100644 --- a/module/plugins/hoster/YoutubeCom.py +++ b/module/plugins/hoster/YoutubeCom.py @@ -33,7 +33,7 @@ def which(program): class YoutubeCom(Hoster): __name__ = "YoutubeCom" __type__ = "hoster" - __pattern__ = r"https?://(?:www\.)?(?:de\.)?youtube\.com/watch.*?[?&]v=.*" + __pattern__ = r"https?://(?:[^/]*?)youtube\.com/watch.*?[?&]v=.*" __version__ = "0.32" __config__ = [("quality", "sd;hd;fullhd;240p;360p;480p;720p;1080p;3072p", "Quality Setting", "hd"), ("fmt", "int", "FMT/ITAG Number (5-102, 0 for auto)", 0), -- cgit v1.2.3 From 29a6c6a15207e0914864ff4709a9648bd7f1d9d9 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Mon, 13 May 2013 16:16:45 +0200 Subject: RyushareCom: two simultaneous downloads and resume are allowed even in free mode. --- module/plugins/hoster/RyushareCom.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/RyushareCom.py b/module/plugins/hoster/RyushareCom.py index c2ff54e0c..7bfe4e8fe 100644 --- a/module/plugins/hoster/RyushareCom.py +++ b/module/plugins/hoster/RyushareCom.py @@ -7,7 +7,7 @@ class RyushareCom(XFileSharingPro): __name__ = "RyushareCom" __type__ = "hoster" __pattern__ = r"http://(?:\w*\.)*?ryushare.com/\w{11,}" - __version__ = "0.10" + __version__ = "0.11" __description__ = """ryushare.com hoster plugin""" __author_name__ = ("zoidberg", "stickell") __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it") @@ -18,7 +18,9 @@ class RyushareCom(XFileSharingPro): DIRECT_LINK_PATTERN = r'<a href="([^"]+)">Click here to download</a>' def setup(self): - self.resumeDownload = self.multiDL = self.premium + self.resumeDownload = self.multiDL = True + if not self.premium: + self.limitDL = 2 # Up to 3 chunks allowed in free downloads. Unknown for premium self.chunkLimit = 3 -- cgit v1.2.3 From d32cc1306b06ad7da09124d2497815128d2af9a5 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 14 May 2013 12:14:35 +0200 Subject: FilefactoryCom: fixed handlePremium http://forum.pyload.org/viewtopic.php?f=7&t=2572 --- module/plugins/hoster/FilefactoryCom.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FilefactoryCom.py b/module/plugins/hoster/FilefactoryCom.py index aebf0f38d..bb11ee9e8 100644 --- a/module/plugins/hoster/FilefactoryCom.py +++ b/module/plugins/hoster/FilefactoryCom.py @@ -57,11 +57,13 @@ class FilefactoryCom(SimpleHoster): __name__ = "FilefactoryCom" __type__ = "hoster" __pattern__ = r"https?://(?:www\.)?filefactory\.com/file/(?P<id>[a-zA-Z0-9]+)" - __version__ = "0.39" + __version__ = "0.40" __description__ = """Filefactory.Com File Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") + DIRECT_LINK_PATTERN = r'<section id="downloadLink">\s*<p class="textAlignCenter">\s*<a href="([^"]+)">[^<]+</a>\s*</p>\s*</section>' + def process(self, pyfile): if self.premium and (not self.SH_CHECK_TRAFFIC or self.checkTrafficLeft()): self.handlePremium() @@ -115,7 +117,12 @@ class FilefactoryCom(SimpleHoster): elif 'content-disposition' in header: url = self.pyfile.url else: - self.parseError('Unable to detect premium direct link') + 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) -- cgit v1.2.3 From 68800e5d19fa06b7dd78ffddc9fef48ae6c0fae8 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Tue, 14 May 2013 14:46:31 +0200 Subject: FastshareCz: Fixed #110 --- module/plugins/hoster/FastshareCz.py | 43 ++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FastshareCz.py b/module/plugins/hoster/FastshareCz.py index cc0b18c96..1dbf9fe8f 100644 --- a/module/plugins/hoster/FastshareCz.py +++ b/module/plugins/hoster/FastshareCz.py @@ -16,27 +16,39 @@ @author: zoidberg """ +# Test links (random.bin): +# http://www.fastshare.cz/2141189/random.bin + import re -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, replace_patterns + class FastshareCz(SimpleHoster): __name__ = "FastshareCz" __type__ = "hoster" __pattern__ = r"http://(?:\w*\.)?fastshare.cz/\d+/.+" - __version__ = "0.14" + __version__ = "0.15" __description__ = """FastShare.cz""" - __author_name__ = ("zoidberg") + __author_name__ = ("zoidberg", "stickell") - FILE_NAME_PATTERN = r'<h[23]><b><span style=color:black;>(?P<N>[^<]+)</b></h[23]>' - FILE_SIZE_PATTERN = r'<tr><td>Velikost: </td><td style=font-weight:bold>(?P<S>[^<]+)</td></tr>' + FILE_INFO_PATTERN = r'<h1 class="dwp">(?P<N>[^<]+)</h1>\s*<div class="fileinfo">\s*(?:Velikost|Size)\s*: (?P<S>[^,]+),' FILE_OFFLINE_PATTERN = ur'<td align=center>Tento soubor byl smazán' - SH_COOKIES = [("fastshare.cz","lang","cs")] FILE_URL_REPLACEMENTS = [('#.*','')] FREE_URL_PATTERN = ur'<form method=post action=(/free/.*?)><b>Stáhnout FREE.*?<img src="([^"]*)">' PREMIUM_URL_PATTERN = r'(http://data\d+\.fastshare\.cz/download\.php\?id=\d+\&[^\s\"\'<>]+)' NOT_ENOUGH_CREDIC_PATTERN = "Nem.te dostate.n. kredit pro sta.en. tohoto souboru" + def process(self, pyfile): + pyfile.url = replace_patterns(pyfile.url, self.FILE_URL_REPLACEMENTS) + self.req.setOption("timeout", 120) + if self.premium and (not self.SH_CHECK_TRAFFIC or self.checkTrafficLeft()): + self.handlePremium() + else: + self.html = self.load(pyfile.url, decode = not self.SH_BROKEN_ENCODING, cookies = self.SH_COOKIES) + self.getFileInfo() + self.handleFree() + def handleFree(self): if u">100% FREE slotů je plných.<" in self.html: self.setWait(60, False) @@ -60,13 +72,20 @@ class FastshareCz(SimpleHoster): self.retry(6, "Paralell download") def handlePremium(self): - if self.NOT_ENOUGH_CREDIC_PATTERN in self.html: - self.logWarning('Not enough traffic left') - self.resetAccount() + header = self.load(self.pyfile.url, just_header=True) + if 'location' in header: + url = header['location'] + else: + self.html = self.load(self.pyfile.url) + self.getFileInfo() + if self.NOT_ENOUGH_CREDIC_PATTERN in self.html: + self.logWarning('Not enough traffic left') + self.resetAccount() + + found = re.search(self.PREMIUM_URL_PATTERN, self.html) + if not found: self.parseError("Premium URL") + url = found.group(1) - found = re.search(self.PREMIUM_URL_PATTERN, self.html) - if not found: self.parseError("Premium URL") - url = found.group(1) self.logDebug("PREMIUM URL: %s" % url) self.download(url) -- cgit v1.2.3 From f018466335af1e7e10c0fda4d18042975a3894ec Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 16 May 2013 11:39:48 +0200 Subject: FilefactoryCom: fixed bug: premium download fails if the url is not in standard format --- module/plugins/hoster/FilefactoryCom.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/FilefactoryCom.py b/module/plugins/hoster/FilefactoryCom.py index bb11ee9e8..fdde1f9d7 100644 --- a/module/plugins/hoster/FilefactoryCom.py +++ b/module/plugins/hoster/FilefactoryCom.py @@ -57,7 +57,7 @@ class FilefactoryCom(SimpleHoster): __name__ = "FilefactoryCom" __type__ = "hoster" __pattern__ = r"https?://(?:www\.)?filefactory\.com/file/(?P<id>[a-zA-Z0-9]+)" - __version__ = "0.40" + __version__ = "0.41" __description__ = """Filefactory.Com File Download Hoster""" __author_name__ = ("stickell") __author_mail__ = ("l.stickell@yahoo.it") @@ -65,6 +65,11 @@ class FilefactoryCom(SimpleHoster): DIRECT_LINK_PATTERN = r'<section id="downloadLink">\s*<p class="textAlignCenter">\s*<a href="([^"]+)">[^<]+</a>\s*</p>\s*</section>' 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: -- cgit v1.2.3 From 11a02d05b3a2d3b65624281c22f22a311bdb3f25 Mon Sep 17 00:00:00 2001 From: Stefano <l.stickell@yahoo.it> Date: Thu, 16 May 2013 12:12:18 +0200 Subject: RapidgatorNet: fixed #124 --- module/plugins/hoster/RapidgatorNet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/RapidgatorNet.py b/module/plugins/hoster/RapidgatorNet.py index 1cc3ff8ae..d2ca77e0f 100644 --- a/module/plugins/hoster/RapidgatorNet.py +++ b/module/plugins/hoster/RapidgatorNet.py @@ -29,9 +29,9 @@ class RapidgatorNet(SimpleHoster): __name__ = "RapidgatorNet" __type__ = "hoster" __pattern__ = r"http://(?:www\.)?(rapidgator.net)/file/(\w+)" - __version__ = "0.16" + __version__ = "0.17" __description__ = """rapidgator.net""" - __author_name__ = ("zoidberg","chrox") + __author_name__ = ("zoidberg", "chrox", "stickell") API_URL = 'http://rapidgator.net/api/file' @@ -39,7 +39,7 @@ class RapidgatorNet(SimpleHoster): FILE_OFFLINE_PATTERN = r'<title>File not found' JSVARS_PATTERN = r"\s+var\s*(startTimerUrl|getDownloadUrl|captchaUrl|fid|secs)\s*=\s*'?(.*?)'?;" - DOWNLOAD_LINK_PATTERN = r"location.href = '([^']+)';\s*}\s*return false;" + DOWNLOAD_LINK_PATTERN = r"return '(http[^']+)';\s*}\s*}\s*}\);" RECAPTCHA_KEY_PATTERN = r'"http://api.recaptcha.net/challenge?k=(.*?)"' ADSCAPTCHA_SRC_PATTERN = r'(http://api.adscaptcha.com/Get.aspx[^"\']*)' SOLVEMEDIA_PATTERN = r'http:\/\/api\.solvemedia\.com\/papi\/challenge\.script\?k=(.*?)"' -- cgit v1.2.3 From 16a9b2221f656134d8cf7220e280caa7be6cdfa3 Mon Sep 17 00:00:00 2001 From: Stefano Date: Thu, 16 May 2013 22:57:13 +0300 Subject: UploadheroCom: fixed #125 --- module/plugins/hoster/UploadheroCom.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/UploadheroCom.py b/module/plugins/hoster/UploadheroCom.py index eb7b5fb23..502f849af 100644 --- a/module/plugins/hoster/UploadheroCom.py +++ b/module/plugins/hoster/UploadheroCom.py @@ -22,8 +22,8 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo class UploadheroCom(SimpleHoster): __name__ = "UploadheroCom" __type__ = "hoster" - __pattern__ = r"http://(?:www\.)?uploadhero\.com/dl/\w+" - __version__ = "0.12" + __pattern__ = r"http://(?:www\.)?uploadhero\.com?/dl/\w+" + __version__ = "0.13" __description__ = """UploadHero.com plugin""" __author_name__ = ("mcmyst", "zoidberg") __author_mail__ = ("mcmyst@hotmail.fr", "zoidberg@mujmail.cz") @@ -81,4 +81,4 @@ class UploadheroCom(SimpleHoster): self.wait() self.retry() -getInfo = create_getInfo(UploadheroCom) \ No newline at end of file +getInfo = create_getInfo(UploadheroCom) -- cgit v1.2.3 From b62ff3b3972a2fe23f98f60d0fdabf09a54f7784 Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 17 May 2013 11:28:41 +0200 Subject: CzshareCom: content-disposition see #111 --- module/plugins/hoster/CzshareCom.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/CzshareCom.py b/module/plugins/hoster/CzshareCom.py index a4a811e82..347427586 100644 --- a/module/plugins/hoster/CzshareCom.py +++ b/module/plugins/hoster/CzshareCom.py @@ -16,6 +16,9 @@ @author: zoidberg """ +# Test links (random.bin): +# http://czshare.com/5278880/random.bin + import re from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, PluginParseError from module.utils import parseFileSize @@ -24,7 +27,7 @@ class CzshareCom(SimpleHoster): __name__ = "CzshareCom" __type__ = "hoster" __pattern__ = r"http://(\w*\.)*czshare\.(com|cz)/(\d+/|download.php\?).*" - __version__ = "0.92" + __version__ = "0.93" __description__ = """CZshare.com""" __author_name__ = ("zoidberg") @@ -80,7 +83,7 @@ class CzshareCom(SimpleHoster): self.resetAccount() # download the file, destination is determined by pyLoad - self.download("http://czshare.com/profi_down.php", cookies=True, post=inputs) + self.download("http://czshare.com/profi_down.php", post=inputs, disposition=True) self.checkDownloadedFile() def handleFree(self): -- cgit v1.2.3 From 1e4d58837840f4c088900033c070deec1380583b Mon Sep 17 00:00:00 2001 From: Stefano Date: Mon, 20 May 2013 12:35:31 +0200 Subject: XvidstageCom: bug fix http://forum.pyload.org/viewtopic.php?f=12&t=2590 --- module/plugins/hoster/XvidstageCom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/XvidstageCom.py b/module/plugins/hoster/XvidstageCom.py index 14079df43..8accba597 100644 --- a/module/plugins/hoster/XvidstageCom.py +++ b/module/plugins/hoster/XvidstageCom.py @@ -52,7 +52,7 @@ def parseFileInfo(url, getInfoMode = False): class XvidstageCom(Hoster): __name__ = 'XvidstageCom' - __version__ = '0.3' + __version__ = '0.4' __pattern__ = r'http://(?:www.)?xvidstage.com/(?P[0-9A-Za-z]+)' __type__ = 'hoster' __description__ = """A Plugin that allows you to download files from http://xvidstage.com""" @@ -64,7 +64,7 @@ class XvidstageCom(Hoster): pyfile.name, pyfile.size, pyfile.status, self.html = parseFileInfo(pyfile.url) self.logDebug('Name: %s' % pyfile.name) if pyfile.status == 1: ## offline - self.fail() + self.offline() self.id = re.search(self.__pattern__, pyfile.url).group('id') wait_sec = int(re.search(r'countdown_str">.+?>(\d+?)<', self.html).group(1)) -- cgit v1.2.3 From 1647dfbe4e8d0573e852b1d946bf475bd42ead01 Mon Sep 17 00:00:00 2001 From: Stefano Date: Mon, 20 May 2013 12:37:37 +0200 Subject: XvidstageCom: code reformat tabs -> spaces --- module/plugins/hoster/XvidstageCom.py | 187 ++++++++++++++++++---------------- 1 file changed, 98 insertions(+), 89 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/XvidstageCom.py b/module/plugins/hoster/XvidstageCom.py index 8accba597..4962c05af 100644 --- a/module/plugins/hoster/XvidstageCom.py +++ b/module/plugins/hoster/XvidstageCom.py @@ -1,105 +1,114 @@ # -*- coding: utf-8 -*- """ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU 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 free software; you can redistribute it and/or modify + it under the terms of the GNU 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 General Public License for more details. + 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 General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, see . + You should have received a copy of the GNU General Public License + along with this program; if not, see . - @author: 4Christopher + @author: 4Christopher """ -from module.plugins.Hoster import Hoster -from module.network.RequestFactory import getURL import re import HTMLParser +from module.plugins.Hoster import Hoster +from module.network.RequestFactory import getURL + + def setup(self): - self.wantReconnect = False - self.resumeDownload = True - self.multiDL = True + self.wantReconnect = False + self.resumeDownload = True + self.multiDL = True + def getInfo(urls): - result = [] - - for url in urls: - result.append(parseFileInfo(url, getInfoMode = True)) - yield result - -def parseFileInfo(url, getInfoMode = False): - html = getURL(url) - info = {"name" : url, "size" : 0, "status" : 3} - try: - info['name'] = re.search(r'(?:Filename|Dateiname):]*?>(.*?)<', html).group(1) - info['size'] = re.search(r'(?:Size|Größe):.*? \((\d+?) bytes\)', html).group(1) - except: ## The file is offline - info['status'] = 1 - else: - info['status'] = 2 - - if getInfoMode: - return info['name'], info['size'], info['status'], url - else: - return info['name'], info['size'], info['status'], html + result = [] + + for url in urls: + result.append(parseFileInfo(url, getInfoMode=True)) + yield result + + +def parseFileInfo(url, getInfoMode=False): + html = getURL(url) + info = {"name": url, "size": 0, "status": 3} + try: + info['name'] = re.search(r'(?:Filename|Dateiname):]*?>(.*?)<', html).group(1) + info['size'] = re.search(r'(?:Size|Größe):.*? \((\d+?) bytes\)', html).group(1) + except: ## The file is offline + info['status'] = 1 + else: + info['status'] = 2 + + if getInfoMode: + return info['name'], info['size'], info['status'], url + else: + return info['name'], info['size'], info['status'], html + class XvidstageCom(Hoster): - __name__ = 'XvidstageCom' - __version__ = '0.4' - __pattern__ = r'http://(?:www.)?xvidstage.com/(?P[0-9A-Za-z]+)' - __type__ = 'hoster' - __description__ = """A Plugin that allows you to download files from http://xvidstage.com""" - __author_name__ = ('4Christopher') - __author_mail__ = ('4Christopher@gmx.de') - - - def process(self, pyfile): - pyfile.name, pyfile.size, pyfile.status, self.html = parseFileInfo(pyfile.url) - self.logDebug('Name: %s' % pyfile.name) - if pyfile.status == 1: ## offline - self.offline() - self.id = re.search(self.__pattern__, pyfile.url).group('id') - - wait_sec = int(re.search(r'countdown_str">.+?>(\d+?)<', self.html).group(1)) - self.setWait(wait_sec, reconnect=False) - self.logDebug('Waiting %d seconds before submitting the captcha' % wait_sec) - self.wait() - - rand = re.search(r'', self.html).group(1) - self.logDebug('rand: %s, id: %s' % (rand, self.id)) - self.html = self.req.load(pyfile.url, post={'op': 'download2', 'id' : self.id, 'rand' : rand, 'code': self.get_captcha()}) - file_url = re.search(r'(?P=url)', self.html).group('url') - try: - hours_file_available = int(re.search(r'This direct link will be available for your IP next (?P\d+?) hours', self.html).group('hours')) - self.logDebug('You have %d hours to download this file with your current IP address.' % hours_file_available) - except: - self.logDebug('Failed') - self.logDebug('Download file: %s' % file_url) - self.download(file_url) - check = self.checkDownload({'empty': re.compile(r'^$')}) - - if check == 'empty': - self.logInfo('Downloaded File was empty') - # self.retry() - - def get_captcha(self): - ## 1 … - cap_chars = {} - for pad_left, char in re.findall(r"position:absolute;padding-left:(\d+?)px;.*?;'>(.*?)<", self.html): - cap_chars[int(pad_left)] = char - - h = HTMLParser.HTMLParser() - ## Sorting after padding-left - captcha = '' - for pad_left in sorted(cap_chars): - captcha += h.unescape(cap_chars[pad_left]) - - self.logDebug('The captcha is: %s' % captcha) - return captcha + __name__ = 'XvidstageCom' + __version__ = '0.4' + __pattern__ = r'http://(?:www.)?xvidstage.com/(?P[0-9A-Za-z]+)' + __type__ = 'hoster' + __description__ = """A Plugin that allows you to download files from http://xvidstage.com""" + __author_name__ = ('4Christopher') + __author_mail__ = ('4Christopher@gmx.de') + + + def process(self, pyfile): + pyfile.name, pyfile.size, pyfile.status, self.html = parseFileInfo(pyfile.url) + self.logDebug('Name: %s' % pyfile.name) + if pyfile.status == 1: ## offline + self.offline() + self.id = re.search(self.__pattern__, pyfile.url).group('id') + + wait_sec = int(re.search(r'countdown_str">.+?>(\d+?)<', self.html).group(1)) + self.setWait(wait_sec, reconnect=False) + self.logDebug('Waiting %d seconds before submitting the captcha' % wait_sec) + self.wait() + + rand = re.search(r'', self.html).group(1) + self.logDebug('rand: %s, id: %s' % (rand, self.id)) + self.html = self.req.load(pyfile.url, + post={'op': 'download2', 'id': self.id, 'rand': rand, 'code': self.get_captcha()}) + file_url = re.search(r'(?P=url)', self.html).group('url') + try: + hours_file_available = int( + re.search(r'This direct link will be available for your IP next (?P\d+?) hours', + self.html).group('hours')) + self.logDebug( + 'You have %d hours to download this file with your current IP address.' % hours_file_available) + except: + self.logDebug('Failed') + self.logDebug('Download file: %s' % file_url) + self.download(file_url) + check = self.checkDownload({'empty': re.compile(r'^$')}) + + if check == 'empty': + self.logInfo('Downloaded File was empty') + # self.retry() + + def get_captcha(self): + ## 1 … + cap_chars = {} + for pad_left, char in re.findall(r"position:absolute;padding-left:(\d+?)px;.*?;'>(.*?)<", self.html): + cap_chars[int(pad_left)] = char + + h = HTMLParser.HTMLParser() + ## Sorting after padding-left + captcha = '' + for pad_left in sorted(cap_chars): + captcha += h.unescape(cap_chars[pad_left]) + + self.logDebug('The captcha is: %s' % captcha) + return captcha -- cgit v1.2.3 From 5fce9b9761537b1e171d137fe32239d5ea38566f Mon Sep 17 00:00:00 2001 From: Stefano Date: Mon, 20 May 2013 12:41:16 +0200 Subject: Premium4Me: error handled http://forum.pyload.org/viewtopic.php?f=12&t=2587 --- module/plugins/hoster/Premium4Me.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/Premium4Me.py b/module/plugins/hoster/Premium4Me.py index 2679916e9..1c65a85a4 100644 --- a/module/plugins/hoster/Premium4Me.py +++ b/module/plugins/hoster/Premium4Me.py @@ -9,13 +9,13 @@ from os import remove class Premium4Me(Hoster): __name__ = "Premium4Me" - __version__ = "0.04" + __version__ = "0.05" __type__ = "hoster" __pattern__ = r"http://premium4.me/.*" __description__ = """premium4.me hoster plugin""" - __author_name__ = ("RaNaN", "zoidberg") - __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz") + __author_name__ = ("RaNaN", "zoidberg", "stickell") + __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it") def setup(self): self.resumeDownload = True @@ -34,7 +34,12 @@ class Premium4Me(Hoster): self.req.setOption("timeout", 120) self.download("http://premium4.me/api/getfile.php?authcode=%s&link=%s" % (self.account.authcode, quote(pyfile.url, "")), disposition=True) - + + check = self.checkDownload({"nopremium": "No premium account available"}) + + if check == "nopremium": + self.retry(3, 60, 'No premium account available') + err = '' if self.req.http.code == '420': # Custom error code send - fail -- cgit v1.2.3 From e1cc6e81cbdd17b79fba3511aa47d3dd2893ccf7 Mon Sep 17 00:00:00 2001 From: Stefano Date: Mon, 20 May 2013 12:42:03 +0200 Subject: Premium4Me: code cleanup --- module/plugins/hoster/Premium4Me.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/Premium4Me.py b/module/plugins/hoster/Premium4Me.py index 1c65a85a4..5dd907b9f 100644 --- a/module/plugins/hoster/Premium4Me.py +++ b/module/plugins/hoster/Premium4Me.py @@ -2,11 +2,13 @@ # -*- coding: utf-8 -*- from urllib import quote -from module.plugins.Hoster import Hoster -from module.utils import fs_encode from os.path import exists from os import remove +from module.plugins.Hoster import Hoster +from module.utils import fs_encode + + class Premium4Me(Hoster): __name__ = "Premium4Me" __version__ = "0.05" @@ -29,38 +31,40 @@ class Premium4Me(Hoster): self.logDebug("premium4.me: Old URL: %s" % pyfile.url) tra = self.getTraffic() - + #raise timeout to 2min self.req.setOption("timeout", 120) - - self.download("http://premium4.me/api/getfile.php?authcode=%s&link=%s" % (self.account.authcode, quote(pyfile.url, "")), disposition=True) + + self.download( + "http://premium4.me/api/getfile.php?authcode=%s&link=%s" % (self.account.authcode, quote(pyfile.url, "")), + disposition=True) check = self.checkDownload({"nopremium": "No premium account available"}) if check == "nopremium": self.retry(3, 60, 'No premium account available') - err = '' + err = '' if self.req.http.code == '420': # Custom error code send - fail lastDownload = fs_encode(self.lastDownload) - - if exists(lastDownload): + + if exists(lastDownload): f = open(lastDownload, "rb") err = f.read(256).strip() f.close() remove(lastDownload) else: err = 'File does not exist' - + trb = self.getTraffic() - self.logInfo("Filesize: %d, Traffic used %d, traffic left %d" % (pyfile.size, tra-trb, trb)) - + self.logInfo("Filesize: %d, Traffic used %d, traffic left %d" % (pyfile.size, tra - trb, trb)) + if err: self.fail(err) - + def getTraffic(self): try: - traffic = int(self.load ("http://premium4.me/api/traffic.php?authcode=%s" % self.account.authcode)) + traffic = int(self.load("http://premium4.me/api/traffic.php?authcode=%s" % self.account.authcode)) except: - traffic = 0 + traffic = 0 return traffic -- cgit v1.2.3 From 257c3285867c6decbfe8cb8fde43e54708a542b9 Mon Sep 17 00:00:00 2001 From: Stefano Date: Mon, 20 May 2013 15:32:01 +0200 Subject: CloudzerNet: reconnect support http://forum.pyload.org/viewtopic.php?f=7&t=2106 --- module/plugins/hoster/CloudzerNet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/hoster') diff --git a/module/plugins/hoster/CloudzerNet.py b/module/plugins/hoster/CloudzerNet.py index 08a54d509..7608b193d 100644 --- a/module/plugins/hoster/CloudzerNet.py +++ b/module/plugins/hoster/CloudzerNet.py @@ -20,7 +20,7 @@ class CloudzerNet(SimpleHoster): __name__ = "CloudzerNet" __type__ = "hoster" __pattern__ = r"http://(www\.)?(cloudzer\.net/file/|clz\.to/(file/)?)(?P\w+).*" - __version__ = "0.01" + __version__ = "0.02" __description__ = """Cloudzer.net hoster plugin""" __author_name__ = ("gs", "z00nx") __author_mail__ = ("I-_-I-_-I@web.de", "z00nx0@gmail.com") @@ -56,7 +56,7 @@ class CloudzerNet(SimpleHoster): self.retry() elif "Sie haben die max" in response["err"] or "You have reached the max" in response["err"]: self.logDebug("Download limit reached, waiting an hour") - self.setWait(3600) + self.setWait(3600, True) self.wait() if "type" in response: if response["type"] == "download": -- cgit v1.2.3