summaryrefslogtreecommitdiffstats
path: root/module/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins')
-rw-r--r--module/plugins/accounts/EasybytezCom.py68
-rw-r--r--module/plugins/accounts/MegauploadCom.py6
-rw-r--r--module/plugins/hooks/EasybytezCom.py32
-rw-r--r--module/plugins/hoster/CrockoCom.py5
-rw-r--r--module/plugins/hoster/EasybytezCom.py100
-rw-r--r--module/plugins/hoster/FilesonicCom.py6
-rw-r--r--module/plugins/hoster/MediafireCom.py6
7 files changed, 204 insertions, 19 deletions
diff --git a/module/plugins/accounts/EasybytezCom.py b/module/plugins/accounts/EasybytezCom.py
new file mode 100644
index 000000000..cf2b16394
--- /dev/null
+++ b/module/plugins/accounts/EasybytezCom.py
@@ -0,0 +1,68 @@
+# -*- 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 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 <http://www.gnu.org/licenses/>.
+
+ @author: zoidberg
+"""
+
+from module.plugins.Account import Account
+import re
+from module.utils import parseFileSize
+from time import mktime, strptime
+
+class EasybytezCom(Account):
+ __name__ = "EasybytezCom"
+ __version__ = "0.01"
+ __type__ = "account"
+ __description__ = """EasyBytez.com account plugin"""
+ __author_name__ = ("zoidberg")
+ __author_mail__ = ("zoidberg@mujmail.cz")
+
+ VALID_UNTIL_PATTERN = r'<TR><TD>Premium account expire:</TD><TD><b>([^<]+)</b>'
+ TRAFFIC_LEFT_PATTERN = r'<TR><TD>Traffic available today:</TD><TD><b>(?P<S>[^<]+)</b>'
+
+ def loadAccountInfo(self, user, req):
+ #self.relogin(user)
+ html = req.load("http://www.easybytez.com/?op=my_account", decode = True)
+
+ validuntil = -1
+ found = re.search(self.VALID_UNTIL_PATTERN, html)
+ if found:
+ premium = True
+ try:
+ self.logDebug(found.group(1))
+ validuntil = mktime(strptime(found.group(1), "%d %B %Y"))
+ except Exception, e:
+ self.logError(e)
+ else:
+ premium = False
+
+ #found = re.search(self.TRAFFIC_LEFT_PATTERN, html)
+ #trafficleft = parseFileSize(found.group('S')) / 1024 if found else 0
+ #self.premium = True if trafficleft else False
+ trafficleft = -1
+
+ return ({"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium})
+
+ def login(self, user, data, req):
+ html = req.load('http://www.easybytez.com/', post = {
+ "login": user,
+ "op": "login",
+ "password": data['password'],
+ "redirect": "http://easybytez.com/"
+ }, decode = True)
+
+ if 'Incorrect Login or Password' in html:
+ self.wrongPassword() \ No newline at end of file
diff --git a/module/plugins/accounts/MegauploadCom.py b/module/plugins/accounts/MegauploadCom.py
index 12e510fcf..ff4f5971c 100644
--- a/module/plugins/accounts/MegauploadCom.py
+++ b/module/plugins/accounts/MegauploadCom.py
@@ -24,16 +24,16 @@ from module.plugins.Account import Account
class MegauploadCom(Account):
__name__ = "MegauploadCom"
- __version__ = "0.11"
+ __version__ = "0.12"
__type__ = "account"
__description__ = """megaupload account plugin"""
__author_name__ = ("RaNaN")
__author_mail__ = ("RaNaN@pyload.org")
def loadAccountInfo(self, user, req):
- page = req.load("http://www.megaupload.com/?c=account")
+ page = req.load("http://www.megaupload.com/?c=account&setlang=en", decode = True)
- premium = True if r'<div class="account_txt">Premium' in page else False
+ premium = False if r'<div class="account_txt">Regular' in page else True
validuntil = -1
if premium:
diff --git a/module/plugins/hooks/EasybytezCom.py b/module/plugins/hooks/EasybytezCom.py
new file mode 100644
index 000000000..4dd39cca6
--- /dev/null
+++ b/module/plugins/hooks/EasybytezCom.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+from module.network.RequestFactory import getURL
+from module.plugins.internal.MultiHoster import MultiHoster
+import re
+
+def getConfigSet(option):
+ s = set(option.lower().replace(',','|').split('|'))
+ s.discard(u'')
+ return s
+
+class EasybytezCom(MultiHoster):
+ __name__ = "EasybytezCom"
+ __version__ = "0.01"
+ __type__ = "hook"
+ __config__ = [("activated", "bool", "Activated", "False"),
+ ("includeHoster", "str", "Use only for downloads from (comma-separated hosters)", ""),
+ ("excludeHoster", "str", "Do not use for downloads from (comma-separated hosters)", "")]
+ __description__ = """EasyBytez.com hook plugin"""
+ __author_name__ = ("zoidberg")
+ __author_mail__ = ("zoidberg@mujmail.cz")
+
+ def getHoster(self):
+
+ hoster = set(['2shared.com', 'easy-share.com', 'filefactory.com', 'fileserve.com', 'filesonic.com', 'hotfile.com', 'mediafire.com', 'megaupload.com', 'netload.in', 'rapidshare.com', 'uploading.com', 'wupload.com', 'oron.com', 'uploadstation.com', 'ul.to', 'uploaded.to'])
+
+ option = self.getConfig('includeHoster').strip()
+ if option: hoster &= getConfigSet(option)
+ option = self.getConfig('excludeHoster').strip()
+ if option: hoster -= getConfigSet(option)
+
+ return list(hoster) \ No newline at end of file
diff --git a/module/plugins/hoster/CrockoCom.py b/module/plugins/hoster/CrockoCom.py
index 9598025ec..bf058b613 100644
--- a/module/plugins/hoster/CrockoCom.py
+++ b/module/plugins/hoster/CrockoCom.py
@@ -9,12 +9,13 @@ class CrockoCom(SimpleHoster):
__name__ = "CrockoCom"
__type__ = "hoster"
__pattern__ = r"http://(www\.)?(crocko|easy-share).com/.*"
- __version__ = "0.11"
+ __version__ = "0.12"
__description__ = """Crocko Download Hoster"""
__author_name__ = ("zoidberg")
__author_mail__ = ("zoidberg@mujmail.cz")
- FILE_INFO_PATTERN = r'<strong>(?P<N>.*)\s*<span class="tip1"><span class="inner">(?P<S>[0-9,.]+) (?P<U>[kKMG])i?B</span></span>'
+ FILE_NAME_PATTERN = r'<span class="fz24">Download:\s*<strong>(?P<N>.*)'
+ FILE_NAME_PATTERN = r'<span class="tip1"><span class="inner">(?P<S>[^<]+)</span></span>'
FILE_OFFLINE_PATTERN = r"<h1>Sorry,<br />the page you're looking for <br />isn't here.</h1>"
DOWNLOAD_URL_PATTERN = r"window.location ='([^']+)';"
CAPTCHA_URL_PATTERN = re.compile(r"u='(/file_contents/captcha/\w+)';\s*w='(\d+)';")
diff --git a/module/plugins/hoster/EasybytezCom.py b/module/plugins/hoster/EasybytezCom.py
index 5858dd935..3ee2e9ba5 100644
--- a/module/plugins/hoster/EasybytezCom.py
+++ b/module/plugins/hoster/EasybytezCom.py
@@ -18,12 +18,13 @@
import re
from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
+from random import random
class EasybytezCom(SimpleHoster):
__name__ = "EasybytezCom"
__type__ = "hoster"
__pattern__ = r"http://(?:\w*\.)?easybytez.com/(\w+).*"
- __version__ = "0.01"
+ __version__ = "0.04"
__description__ = """easybytez.com"""
__author_name__ = ("zoidberg")
__author_mail__ = ("zoidberg@mujmail.cz")
@@ -32,29 +33,112 @@ class EasybytezCom(SimpleHoster):
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'<h2>File Not Found</h2>'
- FORM_INPUT_PATTERN = r'<input[^>]* name="([^"]+)" value="([^"]*)">'
+ FORM_INPUT_PATTERN = r'<input[^>]* name="([^"]+)"[^>]*value="([^"]*)"'
WAIT_PATTERN = r'<span id="countdown_str">[^>]*>(\d+)</span> seconds</span>'
+ DIRECT_LINK_PATTERN = r'(http://\w+\.easybytez\.com/files/\d+/\w+/[^"<]+)'
+ FORM_PATTERN = r'<form name=["\']?%s[^>]*action=["\']?([^"\' ]+)(.*?)</form>'
+ OVR_DOWNLOAD_LINK_PATTERN = r'<h2>Download Link</h2>\s*<textarea[^>]*>([^<]+)'
+ OVR_KILL_LINK_PATTERN = r'<h2>Delete Link</h2>\s*<textarea[^>]*>([^<]+)'
+ TEXTAREA_PATTERN = r"<textarea name='([^']+)'>([^<]+)</textarea>"
+
+ HOSTER_URL = "www.easybytez.com"
+
+ def process(self, pyfile):
+ if not re.match(self.__pattern__, self.pyfile.url):
+ if self.premium:
+ self.handleOverriden()
+ else:
+ self.fail("Only premium users can download from other hosters with %s" % self.HOSTER_URL)
+ else:
+ self.html = self.load(pyfile.url, cookies = False, decode = True)
+ self.file_info = self.getFileInfo()
+
+ header = self.load(self.pyfile.url, just_header = True, cookies = True)
+ self.logDebug(header)
+
+ if 'location' in header and re.match(self.DIRECT_LINK_PATTERN, header['location']):
+ self.downloadLink(header['location'])
+ elif self.premium:
+ self.handlePremium()
+ else:
+ self.handleFree()
+
def handleFree(self):
self.download(self.pyfile.url, post = self.getPostParameters(), ref = True, cookies = True)
+
+ def handlePremium(self):
+ self.html = self.load(self.pyfile.url, post = self.getPostParameters(premium=True))
+ found = re.search(self.DIRECT_LINK_PATTERN, self.html)
+ if not found: self.parseError('DIRECT LINK')
+ self.downloadLink(found.group(1))
+
+ def handleOverriden(self):
+ self.html = self.load(self.HOSTER_URL)
+ action, form = re.search(self.FORM_PATTERN % "url", self.html, re.DOTALL).groups()
+ inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form))
+ 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)
+ self.html = self.load(action, post = inputs)
- def getPostParameters(self):
+ found = re.search(self.FORM_PATTERN % "F1", self.html, re.S | re.I)
+ if not found:
+ self.logDebug(self.html)
+ self.fail("upload failed")
+ action, form = found.groups()
+
+ inputs = dict(re.findall(self.TEXTAREA_PATTERN, form))
+ if not inputs: parseError('TEXTAREA')
+ self.logDebug(inputs)
+ if inputs['st'] == 'OK':
+ self.html = self.load(action, post = inputs)
+ else:
+ self.fail(inputs['st'])
+
+ 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()
+
+ def downloadLink(self, link):
+ self.logDebug('DIRECT LINK: %s' % link)
+ self.download(link)
+
+ def getPostParameters(self, premium=False):
inputs = dict(re.findall(self.FORM_INPUT_PATTERN, self.html))
self.logDebug(inputs)
- inputs['method_free'] = "Free Download"
+
+ if 'op' in inputs and inputs['op'] == 'download2': return inputs
+
inputs['referer'] = self.pyfile.url
- if 'method_premium' in inputs: del inputs['method_premium']
+
+ if premium:
+ inputs['method_premium'] = "Premium Download"
+ if 'method_free' in inputs: del inputs['method_free']
+ else:
+ inputs['method_free'] = "Free Download"
+ if 'method_premium' in inputs: del inputs['method_premium']
self.html = self.load(self.pyfile.url, post = inputs, ref = True, cookies = True)
inputs = dict(re.findall(self.FORM_INPUT_PATTERN, self.html))
self.logDebug(inputs)
- found = re.search(self.WAIT_PATTERN, self.html)
- self.setWait(int(found.group(1)) + 1 if found else 60)
- self.wait()
+ if not premium:
+ found = re.search(self.WAIT_PATTERN, self.html)
+ self.setWait(int(found.group(1)) + 1 if found else 60)
+ self.wait()
return inputs
+
+ def urlParseFileName(self):
+ return html_unescape(urlparse(self.pyfile.url).path.split("/")[-1])
getInfo = create_getInfo(EasybytezCom) \ No newline at end of file
diff --git a/module/plugins/hoster/FilesonicCom.py b/module/plugins/hoster/FilesonicCom.py
index 736b5b96b..6094859ef 100644
--- a/module/plugins/hoster/FilesonicCom.py
+++ b/module/plugins/hoster/FilesonicCom.py
@@ -28,7 +28,7 @@ def getInfo(urls):
response = json_loads(getURL(check_url, decode=True))
for item in response["FSApi_Link"]["getInfo"]["response"]["links"]:
if item["status"] != "AVAILABLE":
- result.append((ids[str(item["id"])], 0, 1, ids[str(item["id"])]))
+ result.append((None, 0, 1, ids[str(item["id"])]))
else:
result.append((item["filename"], item["size"], 2, ids[str(item["id"])]))
yield result
@@ -45,7 +45,7 @@ def getId(url):
class FilesonicCom(Hoster):
__name__ = "FilesonicCom"
__type__ = "hoster"
- __pattern__ = r"http://[\w\.]*?(sharingmatrix|filesonic)\..*?/.*?file/([a-zA-Z0-9]+(/.+)?|[a-z0-9]+/[0-9]+(/.+)?|[0-9]+(/.+)?)"
+ __pattern__ = r"http://[\w\.]*?(sharingmatrix|filesonic)\..*?/file/(([a-z][0-9]+/)?[a-zA-Z0-9\-._+]+)(/.*)?"
__version__ = "0.34"
__description__ = """FilesonicCom und Sharingmatrix Download Hoster"""
__author_name__ = ("jeix", "paulking")
@@ -54,7 +54,7 @@ class FilesonicCom(Hoster):
API_ADDRESS = "http://api.filesonic.com"
URL_DOMAIN_PATTERN = r'(?P<prefix>.*?)(?P<domain>.(filesonic|sharingmatrix)\..+?)(?P<suffix>/.*)'
FILE_ID_PATTERN = r'/file/(?P<id>([a-z][0-9]+/)?[a-zA-Z0-9\-._+]+)(/.*)?' #change may break wupload - be careful
- FILE_LINK_PATTERN = r'<a href="(http://.+?\.(filesonic|sharingmatrix)\..+?)" class="downloadLink"><span>Start Download'
+ FILE_LINK_PATTERN = r'<p><a href="(http://.+?\.(filesonic|sharingmatrix)\..+?)"><span>Start download'
WAIT_TIME_PATTERN = r'countDownDelay = (?P<wait>\d+)'
WAIT_TM_PATTERN = r"name='tm' value='(.*?)' />"
WAIT_TM_HASH_PATTERN = r"name='tm_hash' value='(.*?)' />"
diff --git a/module/plugins/hoster/MediafireCom.py b/module/plugins/hoster/MediafireCom.py
index 484b48ba6..14180ff3d 100644
--- a/module/plugins/hoster/MediafireCom.py
+++ b/module/plugins/hoster/MediafireCom.py
@@ -58,20 +58,20 @@ class MediafireCom(SimpleHoster):
__name__ = "MediafireCom"
__type__ = "hoster"
__pattern__ = r"http://(?:\w*\.)*mediafire\.com/[^?].*"
- __version__ = "0.70"
+ __version__ = "0.71"
__description__ = """Mediafire.com plugin - free only"""
__author_name__ = ("zoidberg")
__author_mail__ = ("zoidberg@mujmail.cz")
DOWNLOAD_LINK_PATTERN = r'<div class="download_link"[^>]*z-index:(?P<zindex>\d+)[^>]*>\s*<a href="(?P<href>[^"]+)"'
- JS_KEY_PATTERN = r"DoShow\('mfpromo1'\);\s*((\w+)='';.*?)eval\(\2\);"
+ 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=([^"]+)">'
PAGE1_ACTION_PATTERN = r'<link rel="canonical" href="([^"]+)"/>'
PASSWORD_PATTERN = r";break;}\s*dh\('"
FILE_NAME_PATTERN = r'<META NAME="description" CONTENT="(?P<N>[^"]+)"/>'
- FILE_SIZE_PATTERN = r'>Download <span>\((?P<S>[0-9.]+) (?P<U>[kKMG])i?B">\)</span>'
+ FILE_SIZE_PATTERN = r'>Download\s*<span>\((?P<S>[^)]+)\)</span>'
FILE_OFFLINE_PATTERN = r'class="error_msg_title"> Invalid or Deleted File. </div>'
def process(self, pyfile):