summaryrefslogtreecommitdiffstats
path: root/pyload/plugins/hoster
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-07-12 13:11:11 +0200
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-07-12 13:11:11 +0200
commitfc638ded28b7b222203fba9907b6bf7f828d1b7b (patch)
tree7bc4f95042c9f4a036901837e74248b257506675 /pyload/plugins/hoster
parentadded legacy file to fix older plugins (diff)
parentMerge pull request #193 from vuolter/plugin/UnrestrictLi (diff)
downloadpyload-fc638ded28b7b222203fba9907b6bf7f828d1b7b.tar.xz
Merge remote-tracking branch 'origin/stable'
Conflicts: module/plugins/accounts/Premium4Me.py pyload/plugins/addons/Premium4Me.py pyload/plugins/crypter/NCryptIn.py pyload/plugins/hooks/Captcha9kw.py pyload/plugins/hoster/Premium4Me.py pyload/plugins/hoster/Xdcc.py pyload/plugins/hoster/XvidstageCom.py
Diffstat (limited to 'pyload/plugins/hoster')
-rw-r--r--pyload/plugins/hoster/CloudzerNet.py17
-rw-r--r--pyload/plugins/hoster/DdlstorageCom.py17
-rw-r--r--pyload/plugins/hoster/EasybytezCom.py12
-rw-r--r--pyload/plugins/hoster/FilerNet.py30
-rw-r--r--pyload/plugins/hoster/FilezyNet.py33
-rw-r--r--pyload/plugins/hoster/HundredEightyUploadCom.py36
-rw-r--r--pyload/plugins/hoster/LoadTo.py64
-rw-r--r--pyload/plugins/hoster/MegacrypterCom.py59
-rw-r--r--pyload/plugins/hoster/Premium4Me.py18
-rw-r--r--pyload/plugins/hoster/RapidgatorNet.py42
-rw-r--r--pyload/plugins/hoster/StreamcloudEu.py111
-rw-r--r--pyload/plugins/hoster/TurbobitNet.py4
-rw-r--r--pyload/plugins/hoster/UploadheroCom.py3
-rw-r--r--pyload/plugins/hoster/VeehdCom.py6
-rw-r--r--pyload/plugins/hoster/XFileSharingPro.py19
-rw-r--r--pyload/plugins/hoster/XHamsterCom.py4
-rw-r--r--pyload/plugins/hoster/Xdcc.py8
-rw-r--r--pyload/plugins/hoster/XvidstageCom.py114
-rw-r--r--pyload/plugins/hoster/YoutubeCom.py10
-rw-r--r--pyload/plugins/hoster/ZippyshareCom.py13
20 files changed, 380 insertions, 240 deletions
diff --git a/pyload/plugins/hoster/CloudzerNet.py b/pyload/plugins/hoster/CloudzerNet.py
index 7608b193d..2701752ce 100644
--- a/pyload/plugins/hoster/CloudzerNet.py
+++ b/pyload/plugins/hoster/CloudzerNet.py
@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
import re
-from module.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo
+from module.plugins.internal.SimpleHoster import SimpleHoster
from module.common.json_layer import json_loads
from module.plugins.ReCaptcha import ReCaptcha
from module.network.RequestFactory import getURL
+from module.utils import parseFileSize
def getInfo(urls):
@@ -12,7 +13,13 @@ def getInfo(urls):
if 'Location: http://cloudzer.net/404' in header:
file_info = (url, 0, 1, url)
else:
- file_info = parseFileInfo(CloudzerNet, url, getURL(url, decode=True))
+ if url.endswith('/'):
+ api_data = getURL(url + 'status')
+ else:
+ api_data = getURL(url + '/status')
+ name, size = api_data.splitlines()
+ size = parseFileSize(size)
+ file_info = (name, size, 2, url)
yield file_info
@@ -20,10 +27,10 @@ class CloudzerNet(SimpleHoster):
__name__ = "CloudzerNet"
__type__ = "hoster"
__pattern__ = r"http://(www\.)?(cloudzer\.net/file/|clz\.to/(file/)?)(?P<ID>\w+).*"
- __version__ = "0.02"
+ __version__ = "0.03"
__description__ = """Cloudzer.net hoster plugin"""
- __author_name__ = ("gs", "z00nx")
- __author_mail__ = ("I-_-I-_-I@web.de", "z00nx0@gmail.com")
+ __author_name__ = ("gs", "z00nx", "stickell")
+ __author_mail__ = ("I-_-I-_-I@web.de", "z00nx0@gmail.com", "l.stickell@yahoo.it")
FILE_SIZE_PATTERN = '<span class="size">(?P<S>[^<]+)</span>'
WAIT_PATTERN = '<meta name="wait" content="(\d+)">'
diff --git a/pyload/plugins/hoster/DdlstorageCom.py b/pyload/plugins/hoster/DdlstorageCom.py
index 1ad5fa6d8..5eaebf1d1 100644
--- a/pyload/plugins/hoster/DdlstorageCom.py
+++ b/pyload/plugins/hoster/DdlstorageCom.py
@@ -1,20 +1,19 @@
# -*- coding: utf-8 -*-
+
from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo
+
class DdlstorageCom(XFileSharingPro):
__name__ = "DdlstorageCom"
__type__ = "hoster"
__pattern__ = r"http://(?:\w*\.)*?ddlstorage.com/\w{12}"
- __version__ = "0.06"
+ __version__ = "0.07"
__description__ = """DDLStorage.com hoster plugin"""
- __author_name__ = ("zoidberg")
- __author_mail__ = ("zoidberg@mujmail.cz")
-
- FILE_INFO_PATTERN = r'<h2>\s*Download File\s*<span[^>]*>(?P<N>[^>]+)</span></h2>\s*[^\(]*\((?P<S>[^\)]+)\)</h2>'
+ __author_name__ = ("zoidberg", "stickell")
+ __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it")
+
+ FILE_INFO_PATTERN = r'<p class="sub_title"[^>]*>(?P<N>.+) \((?P<S>[^)]+)\)</p>'
HOSTER_NAME = "ddlstorage.com"
-
- def setup(self):
- self.resumeDownload = self.multiDL = self.premium
- self.chunkLimit = 1
+
getInfo = create_getInfo(DdlstorageCom) \ No newline at end of file
diff --git a/pyload/plugins/hoster/EasybytezCom.py b/pyload/plugins/hoster/EasybytezCom.py
index 96e3d93d2..98691a641 100644
--- a/pyload/plugins/hoster/EasybytezCom.py
+++ b/pyload/plugins/hoster/EasybytezCom.py
@@ -23,17 +23,15 @@ class EasybytezCom(XFileSharingPro):
__name__ = "EasybytezCom"
__type__ = "hoster"
__pattern__ = r"http://(?:\w*\.)?easybytez.com/(\w+).*"
- __version__ = "0.14"
+ __version__ = "0.17"
__description__ = """easybytez.com"""
- __author_name__ = ("zoidberg")
- __author_mail__ = ("zoidberg@mujmail.cz")
+ __author_name__ = ("zoidberg", "stickell")
+ __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it")
- 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_INFO_PATTERN = r'<span class="name">(?P<N>.+)</span><br>\s*<span class="size">(?P<S>[^<]+)</span>'
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+/[^"<]+)'
+ DIRECT_LINK_PATTERN = r'(http://(\w+\.(easyload|easybytez|zingload)\.(com|to)|\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>)(.*?)</'
diff --git a/pyload/plugins/hoster/FilerNet.py b/pyload/plugins/hoster/FilerNet.py
index 9693723f9..815685ef8 100644
--- a/pyload/plugins/hoster/FilerNet.py
+++ b/pyload/plugins/hoster/FilerNet.py
@@ -30,7 +30,7 @@ class FilerNet(SimpleHoster):
__name__ = "FilerNet"
__type__ = "hoster"
__pattern__ = r"https?://(www\.)?filer\.net/get/(\w+)"
- __version__ = "0.01"
+ __version__ = "0.02"
__description__ = """Filer.net Download Hoster"""
__author_name__ = ("stickell")
__author_mail__ = ("l.stickell@yahoo.it")
@@ -38,10 +38,17 @@ class FilerNet(SimpleHoster):
FILE_INFO_PATTERN = r'<h1 class="page-header">Free Download (?P<N>\S+) <small>(?P<S>[\w.]+) (?P<U>\w+)</small></h1>'
FILE_OFFLINE_PATTERN = r'Nicht gefunden'
RECAPTCHA_KEY = '6LcFctISAAAAAAgaeHgyqhNecGJJRnxV1m_vAz3V'
+ DIRECT_LINK_PATTERN = r'href="([^"]+)">Get download</a>'
def process(self, pyfile):
+ if self.premium and (not self.SH_CHECK_TRAFFIC or self.checkTrafficLeft()):
+ self.handlePremium()
+ else:
+ self.handleFree()
+
+ def handleFree(self):
self.req.setOption("timeout", 120)
- self.html = self.load(pyfile.url, decode=not self.SH_BROKEN_ENCODING, cookies=self.SH_COOKIES)
+ self.html = self.load(self.pyfile.url, decode=not self.SH_BROKEN_ENCODING, cookies=self.SH_COOKIES)
# Wait between downloads
m = re.search(r'musst du <span id="time">(\d+)</span> Sekunden warten', self.html)
@@ -50,12 +57,7 @@ class FilerNet(SimpleHoster):
self.retry(3, waittime, 'Wait between free downloads')
self.getFileInfo()
- 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)
inputs = self.parseHtmlForm(input_names='token')[1]
@@ -99,5 +101,19 @@ class FilerNet(SimpleHoster):
self.download(downloadURL, disposition=True)
+ def handlePremium(self):
+ header = self.load(self.pyfile.url, just_header=True)
+ if 'location' in header: # Direct Download ON
+ dl = self.pyfile.url
+ else: # Direct Download OFF
+ html = self.load(self.pyfile.url)
+ m = re.search(self.DIRECT_LINK_PATTERN, html)
+ if not m:
+ self.parseError("Unable to detect direct link, try to enable 'Direct download' in your user settings")
+ dl = 'http://filer.net' + m.group(1)
+
+ self.logDebug('Direct link: ' + dl)
+ self.download(dl, disposition=True)
+
getInfo = create_getInfo(FilerNet)
diff --git a/pyload/plugins/hoster/FilezyNet.py b/pyload/plugins/hoster/FilezyNet.py
new file mode 100644
index 000000000..7c5729c2d
--- /dev/null
+++ b/pyload/plugins/hoster/FilezyNet.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+import re
+from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo
+
+class FilezyNet(XFileSharingPro):
+ __name__ = "FilezyNet"
+ __type__ = "hoster"
+ __version__ = "0.1"
+ __pattern__ = r"http://filezy.net/.*/.*.html"
+ __description__ = """filezy.net hoster plugin"""
+
+ HOSTER_NAME = "filezy.net"
+
+ FILE_SIZE_PATTERN = r'<span class="plansize">(?P<S>[0-9.]+) (?P<U>[kKMG])i?B</span>'
+ WAIT_PATTERN = r'<div id="countdown_str" class="seconds">\n<!--Wait--> <span id=".*?">(\d+)</span>'
+ DOWNLOAD_JS_PATTERN = r"<script type='text/javascript'>eval(.*)"
+
+ def setup(self):
+ self.resumeDownload = True
+ self.multiDL = self.premium
+
+ def getDownloadLink(self):
+ self.logDebug("Getting download link")
+
+ data = self.getPostParameters()
+ self.html = self.load(self.pyfile.url, post = data, ref = True, decode = True)
+
+ obfuscated_js = re.search(self.DOWNLOAD_JS_PATTERN, self.html)
+ dl_file_now = self.js.eval(obfuscated_js.group(1))
+ link = re.search(self.DIRECT_LINK_PATTERN, dl_file_now)
+ return link.group(1)
+
+getInfo = create_getInfo(FilezyNet)
diff --git a/pyload/plugins/hoster/HundredEightyUploadCom.py b/pyload/plugins/hoster/HundredEightyUploadCom.py
new file mode 100644
index 000000000..d8b744359
--- /dev/null
+++ b/pyload/plugins/hoster/HundredEightyUploadCom.py
@@ -0,0 +1,36 @@
+# -*- 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/>. #
+############################################################################
+
+from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo
+
+
+class HundredEightyUploadCom(XFileSharingPro):
+ __name__ = "HundredEightyUploadCom"
+ __type__ = "hoster"
+ __pattern__ = r"http://(?:\w*\.)?180upload\.com/(\w+).*"
+ __version__ = "0.01"
+ __description__ = """180upload.com hoster plugin"""
+ __author_name__ = ("stickell")
+ __author_mail__ = ("l.stickell@yahoo.it")
+
+ FILE_NAME_PATTERN = r'Filename:</b></td><td nowrap>(?P<N>.+)</td></tr>-->'
+ FILE_SIZE_PATTERN = r'Size:</b></td><td>(?P<S>[\d.]+) (?P<U>[A-Z]+)\s*<small>'
+
+ HOSTER_NAME = "180upload.com"
+
+
+getInfo = create_getInfo(HundredEightyUploadCom)
diff --git a/pyload/plugins/hoster/LoadTo.py b/pyload/plugins/hoster/LoadTo.py
index babf354a9..0f99c272a 100644
--- a/pyload/plugins/hoster/LoadTo.py
+++ b/pyload/plugins/hoster/LoadTo.py
@@ -16,41 +16,25 @@
@author: halfman
"""
+# Test links (random.bin):
+# http://www.load.to/dNsmgXRk4/random.bin
+# http://www.load.to/edbNTxcUb/random100.bin
+
import re
-from module.plugins.Hoster import Hoster
-from module.network.RequestFactory import getURL
-
-def getInfo(urls):
- result = []
-
- for url in urls:
-
- html = getURL(url, decode=True)
- if re.search(LoadTo.FILE_OFFLINE_PATTERN, html):
- # File offline
- result.append((url, 0, 1, url))
- else:
- # Get file info
- name = re.search(LoadTo.FILE_NAME_PATTERN, html)
- size = re.search(LoadTo.SIZE_PATTERN, html)
- if name is not None and size is not None:
- name = name.group(1)
- size = size.group(1)
- result.append((name, size, 2, url))
- yield result
-
-class LoadTo(Hoster):
+from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
+
+
+class LoadTo(SimpleHoster):
__name__ = "LoadTo"
__type__ = "hoster"
- __pattern__ = r"http://(www.*?\.)?load\.to/.{7,10}?/.*"
- __version__ = "0.11"
- __description__ = """load.to"""
- __author_name__ = ("halfman")
- __author_mail__ = ("Pulpan3@gmail.com")
+ __pattern__ = r"http://(?:www\.)?load\.to/\w+"
+ __version__ = "0.12"
+ __description__ = """Load.to hoster plugin"""
+ __author_name__ = ("halfman", "stickell")
+ __author_mail__ = ("Pulpan3@gmail.com", "l.stickell@yahoo.it")
- FILE_NAME_PATTERN = r'<div class="toolarge"><h1>(.+?)</h1></div>'
+ FILE_INFO_PATTERN = r'<a [^>]+>(?P<N>.+)</a></h3>\s*Size: (?P<S>\d+) Bytes'
URL_PATTERN = r'<form method="post" action="(.+?)"'
- SIZE_PATTERN = r'<div class="download_table_right">(\d+) Bytes</div>'
FILE_OFFLINE_PATTERN = r'Can\'t find file. Please check URL.<br />'
WAIT_PATTERN = r'type="submit" value="Download \((\d+)\)"'
@@ -61,23 +45,17 @@ class LoadTo(Hoster):
self.html = self.load(pyfile.url, decode=True)
- if re.search(self.FILE_OFFLINE_PATTERN, self.html):
- self.offline()
-
- found = re.search(self.FILE_NAME_PATTERN, self.html)
- if found is None:
- self.fail("Parse error (NAME)")
- pyfile.name = found.group(1)
-
found = re.search(self.URL_PATTERN, self.html)
- if found is None:
- self.fail("Parse error (URL)")
+ if not found:
+ self.parseError('URL')
download_url = found.group(1)
-
+
timmy = re.search(self.WAIT_PATTERN, self.html)
if timmy:
self.setWait(timmy.group(1))
self.wait()
- self.req.setOption("timeout", 120)
- self.download(download_url) \ No newline at end of file
+ self.download(download_url, disposition=True)
+
+
+getInfo = create_getInfo(LoadTo)
diff --git a/pyload/plugins/hoster/MegacrypterCom.py b/pyload/plugins/hoster/MegacrypterCom.py
new file mode 100644
index 000000000..9f012e5be
--- /dev/null
+++ b/pyload/plugins/hoster/MegacrypterCom.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+import re
+
+from module.common.json_layer import json
+from module.plugins.hoster.MegaNz import MegaNz
+
+
+class MegacrypterCom(MegaNz):
+ __name__ = "MegacrypterCom"
+ __type__ = "hoster"
+ __pattern__ = r"(https?://[a-z0-9]{0,10}\.?megacrypter\.com/[a-zA-Z0-9!_\-]+)"
+ __version__ = "0.1"
+ __description__ = """megacrypter plugin, based and inherits from RaNaN's MegaNz plugin"""
+ __author_name__ = ("GonzaloSR", )
+ __author_mail__ = ("gonzalo@gonzalosr.com", )
+
+ API_URL = "http://megacrypter.com/api"
+ FILE_SUFFIX = ".crypted"
+
+
+ def callApi(self, **kwargs):
+ """ Dispatch a call to the api, see megacrypter.com/api_doc """
+ self.logDebug("JSON request: " + json.dumps(kwargs))
+ resp = self.load(self.API_URL, post=json.dumps(kwargs))
+ self.logDebug("API Response: " + resp)
+ return json.loads(resp)
+
+
+ def process(self, pyfile):
+
+ key = None
+
+ # match is guaranteed because plugin was chosen to handle url
+ node = re.search(self.__pattern__, pyfile.url).group(1)
+
+
+ # get Mega.co.nz link info
+ info = self.callApi(link=node, m="info")
+
+ # get crypted file URL
+ dl = self.callApi(link=node, m="dl")
+
+
+ # TODO: map error codes, implement password protection
+ # if info["pass"] == true:
+ # crypted_file_key, md5_file_key = info["key"].split("#")
+
+
+ key = self.b64_decode(info["key"])
+
+ pyfile.name = info["name"] + self.FILE_SUFFIX
+
+ self.download(dl["url"])
+ self.decryptFile(key)
+
+ # Everything is finished and final name can be set
+ pyfile.name = info["name"]
+
+
diff --git a/pyload/plugins/hoster/Premium4Me.py b/pyload/plugins/hoster/Premium4Me.py
index c93084d5d..502e9ff12 100644
--- a/pyload/plugins/hoster/Premium4Me.py
+++ b/pyload/plugins/hoster/Premium4Me.py
@@ -11,11 +11,11 @@ from module.utils import fs_encode
class Premium4Me(Hoster):
__name__ = "Premium4Me"
- __version__ = "0.05"
+ __version__ = "0.07"
__type__ = "hoster"
- __pattern__ = r"http://premium4.me/.*"
- __description__ = """premium4.me hoster plugin"""
+ __pattern__ = r"http://premium.to/.*"
+ __description__ = """Premium.to hoster plugin"""
__author_name__ = ("RaNaN", "zoidberg", "stickell")
__author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it")
@@ -25,10 +25,10 @@ class Premium4Me(Hoster):
def process(self, pyfile):
if not self.account:
- self.logError(_("Please enter your premium4.me account or deactivate this plugin"))
- self.fail("No premium4.me account provided")
+ self.logError(_("Please enter your premium.to account or deactivate this plugin"))
+ self.fail("No premium.to account provided")
- self.logDebug("premium4.me: Old URL: %s" % pyfile.url)
+ self.logDebug("premium.to: Old URL: %s" % pyfile.url)
tra = self.getTraffic()
@@ -36,13 +36,13 @@ 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, "")),
+ "http://premium.to/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')
+ self.retry(60, 300, 'No premium account available')
err = ''
if self.req.http.code == '420':
@@ -64,7 +64,7 @@ class Premium4Me(Hoster):
def getTraffic(self):
try:
- traffic = int(self.load("http://premium4.me/api/traffic.php?authcode=%s" % self.account.authcode))
+ traffic = int(self.load("http://premium.to/api/traffic.php?authcode=%s" % self.account.authcode))
except:
traffic = 0
return traffic
diff --git a/pyload/plugins/hoster/RapidgatorNet.py b/pyload/plugins/hoster/RapidgatorNet.py
index d2ca77e0f..3c4611446 100644
--- a/pyload/plugins/hoster/RapidgatorNet.py
+++ b/pyload/plugins/hoster/RapidgatorNet.py
@@ -18,18 +18,18 @@
import re
from pycurl import HTTPHEADER
-from random import random
from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia, AdsCaptcha
from module.common.json_layer import json_loads
from module.network.HTTPRequest import BadHeader
+
class RapidgatorNet(SimpleHoster):
__name__ = "RapidgatorNet"
__type__ = "hoster"
__pattern__ = r"http://(?:www\.)?(rapidgator.net)/file/(\w+)"
- __version__ = "0.17"
+ __version__ = "0.18"
__description__ = """rapidgator.net"""
__author_name__ = ("zoidberg", "chrox", "stickell")
@@ -39,32 +39,32 @@ class RapidgatorNet(SimpleHoster):
FILE_OFFLINE_PATTERN = r'<title>File not found</title>'
JSVARS_PATTERN = r"\s+var\s*(startTimerUrl|getDownloadUrl|captchaUrl|fid|secs)\s*=\s*'?(.*?)'?;"
- DOWNLOAD_LINK_PATTERN = r"return '(http[^']+)';\s*}\s*}\s*}\);"
+ 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=(.*?)"'
-
+
def setup(self):
self.resumeDownload = False
self.multiDL = False
self.sid = None
self.chunkLimit = 1
self.req.setOption("timeout", 120)
-
+
def process(self, pyfile):
- if self.account:
- self.sid = self.account.getAccountData(self.user).get('SID', None)
-
+ if self.account:
+ self.sid = self.account.getAccountData(self.user).get('SID', None)
+
if self.sid:
self.handlePremium()
else:
- self.handleFree()
+ self.handleFree()
def getAPIResponse(self, cmd):
try:
json = self.load('%s/%s' % (self.API_URL, cmd),
- get = {'sid': self.sid,
- 'url': self.pyfile.url}, decode = True)
+ get={'sid': self.sid,
+ 'url': self.pyfile.url}, decode=True)
self.logDebug('API:%s' % cmd, json, "SID: %s" % self.sid)
json = json_loads(json)
status = json['response_status']
@@ -94,11 +94,11 @@ class RapidgatorNet(SimpleHoster):
self.download(url)
def handleFree(self):
- self.html = self.load(self.pyfile.url, decode = True)
+ self.html = self.load(self.pyfile.url, decode=True)
self.getFileInfo()
-
+
if "You can download files up to 500 MB in free mode" in self.html \
- or "This file can be downloaded by premium only" in self.html:
+ or "This file can be downloaded by premium only" in self.html:
self.fail("Premium account needed for download")
self.checkWait()
@@ -109,13 +109,15 @@ class RapidgatorNet(SimpleHoster):
self.req.http.lastURL = self.pyfile.url
self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"])
- url = "http://rapidgator.net%s?fid=%s" % (jsvars.get('startTimerUrl', '/download/AjaxStartTimer'), jsvars["fid"])
+ url = "http://rapidgator.net%s?fid=%s" % (
+ jsvars.get('startTimerUrl', '/download/AjaxStartTimer'), jsvars["fid"])
jsvars.update(self.getJsonResponse(url))
self.setWait(int(jsvars.get('secs', 30)) + 1, False)
self.wait()
- url = "http://rapidgator.net%s?sid=%s" % (jsvars.get('getDownloadUrl', '/download/AjaxGetDownload'), jsvars["sid"])
+ url = "http://rapidgator.net%s?sid=%s" % (
+ jsvars.get('getDownloadUrl', '/download/AjaxGetDownload'), jsvars["sid"])
jsvars.update(self.getJsonResponse(url))
self.req.http.lastURL = self.pyfile.url
@@ -167,7 +169,8 @@ class RapidgatorNet(SimpleHoster):
self.download(download_url)
def checkWait(self):
- found = re.search(r"(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)", self.html)
+ found = re.search(r"(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)",
+ self.html)
if found:
wait_time = int(found.group(1)) * {"hour": 60, "min": 1}[found.group(2)]
else:
@@ -180,13 +183,14 @@ class RapidgatorNet(SimpleHoster):
self.logDebug("Waiting %d minutes" % wait_time)
self.setWait(wait_time * 60, True)
self.wait()
- self.retry(max_tries = 24)
+ self.retry(max_tries=24)
def getJsonResponse(self, url):
- response = self.load(url, decode = True)
+ response = self.load(url, decode=True)
if not response.startswith('{'):
self.retry()
self.logDebug(url, response)
return json_loads(response)
+
getInfo = create_getInfo(RapidgatorNet)
diff --git a/pyload/plugins/hoster/StreamcloudEu.py b/pyload/plugins/hoster/StreamcloudEu.py
new file mode 100644
index 000000000..73c0465f8
--- /dev/null
+++ b/pyload/plugins/hoster/StreamcloudEu.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo
+from module.network.HTTPRequest import HTTPRequest
+from time import sleep
+import re
+
+class StreamcloudEu(XFileSharingPro):
+ __name__ = "StreamcloudEu"
+ __type__ = "hoster"
+ __pattern__ = r"http://(www\.)?streamcloud\.eu/\S+"
+ __version__ = "0.02"
+ __description__ = """Streamcloud.eu hoster plugin"""
+ __author_name__ = ("seoester")
+ __author_mail__ = ("seoester@googlemail.com")
+
+ HOSTER_NAME = "streamcloud.eu"
+ DIRECT_LINK_PATTERN = r'file: "(http://(stor|cdn)\d+\.streamcloud.eu:?\d*/.*/video\.mp4)",'
+
+ def setup(self):
+ super(StreamcloudEu, self).setup()
+ self.multiDL = True
+
+ def getDownloadLink(self):
+ found = re.search(self.DIRECT_LINK_PATTERN, self.html, re.S)
+ if found:
+ return found.group(1)
+
+ for i in range(5):
+ self.logDebug("Getting download link: #%d" % i)
+ data = self.getPostParameters()
+ httpRequest = HTTPRequest(options=self.req.options)
+ httpRequest.cj = self.req.cj
+ sleep(10)
+ self.html = httpRequest.load(self.pyfile.url, post = data, referer=False, cookies=True, decode = True)
+ self.header = httpRequest.header
+
+ found = re.search("Location\s*:\s*(.*)", self.header, re.I)
+ if found:
+ break
+
+ found = re.search(self.DIRECT_LINK_PATTERN, self.html, re.S)
+ if found:
+ break
+
+ else:
+ if self.errmsg and 'captcha' in self.errmsg:
+ self.fail("No valid captcha code entered")
+ else:
+ self.fail("Download link not found")
+
+ return found.group(1)
+
+ def getPostParameters(self):
+ for i in range(3):
+ if not self.errmsg: self.checkErrors()
+
+ if hasattr(self,"FORM_PATTERN"):
+ action, inputs = self.parseHtmlForm(self.FORM_PATTERN)
+ else:
+ action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")})
+
+ if not inputs:
+ action, inputs = self.parseHtmlForm('F1')
+ if not inputs:
+ if self.errmsg:
+ self.retry()
+ else:
+ self.parseError("Form not found")
+
+ self.logDebug(self.HOSTER_NAME, inputs)
+
+ if 'op' in inputs and inputs['op'] in ('download1', 'download2', 'download3'):
+ if "password" in inputs:
+ if self.passwords:
+ inputs['password'] = self.passwords.pop(0)
+ else:
+ self.fail("No or invalid passport")
+
+ if not self.premium:
+ found = re.search(self.WAIT_PATTERN, self.html)
+ if found:
+ wait_time = int(found.group(1)) + 1
+ self.setWait(wait_time, False)
+ else:
+ wait_time = 0
+
+ self.captcha = self.handleCaptcha(inputs)
+
+ if wait_time: self.wait()
+
+ self.errmsg = None
+ self.logDebug("getPostParameters {0}".format(i))
+ return inputs
+
+ else:
+ inputs['referer'] = self.pyfile.url
+
+ if self.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 = False)
+ self.errmsg = None
+
+ else: self.parseError('FORM: %s' % (inputs['op'] if 'op' in inputs else 'UNKNOWN'))
+
+
+getInfo = create_getInfo(StreamcloudEu)
diff --git a/pyload/plugins/hoster/TurbobitNet.py b/pyload/plugins/hoster/TurbobitNet.py
index b429d5510..09ce46a31 100644
--- a/pyload/plugins/hoster/TurbobitNet.py
+++ b/pyload/plugins/hoster/TurbobitNet.py
@@ -36,14 +36,14 @@ class TurbobitNet(SimpleHoster):
__name__ = "TurbobitNet"
__type__ = "hoster"
__pattern__ = r"http://(?:\w*\.)?(turbobit.net|unextfiles.com)/(?:download/free/)?(?P<ID>\w+).*"
- __version__ = "0.08"
+ __version__ = "0.09"
__description__ = """Turbobit.net plugin"""
__author_name__ = ("zoidberg")
__author_mail__ = ("zoidberg@mujmail.cz")
FILE_INFO_PATTERN = r"<span class='file-icon1[^>]*>(?P<N>[^<]+)</span>\s*\((?P<S>[^\)]+)\)\s*</h1>" #long filenames are shortened
FILE_NAME_PATTERN = r'<meta name="keywords" content="\s+(?P<N>[^,]+)' #full name but missing on page2
- FILE_OFFLINE_PATTERN = r'<h2>File Not Found</h2>|html\(\'File was not found'
+ FILE_OFFLINE_PATTERN = r'<h2>File Not Found</h2>|html\(\'File (?:was )?not found'
FILE_URL_REPLACEMENTS = [(r"http://(?:\w*\.)?(turbobit.net|unextfiles.com)/(?:download/free/)?(?P<ID>\w+).*", "http://turbobit.net/\g<ID>.html")]
SH_COOKIES = [("turbobit.net", "user_lang", "en")]
diff --git a/pyload/plugins/hoster/UploadheroCom.py b/pyload/plugins/hoster/UploadheroCom.py
index 502f849af..a2348b9f9 100644
--- a/pyload/plugins/hoster/UploadheroCom.py
+++ b/pyload/plugins/hoster/UploadheroCom.py
@@ -16,6 +16,9 @@
@author: zoidberg
"""
+# Test link (random.bin):
+# http://uploadhero.co/dl/wQBRAVSM
+
import re
from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
diff --git a/pyload/plugins/hoster/VeehdCom.py b/pyload/plugins/hoster/VeehdCom.py
index 23048b831..d4422afc3 100644
--- a/pyload/plugins/hoster/VeehdCom.py
+++ b/pyload/plugins/hoster/VeehdCom.py
@@ -11,7 +11,7 @@ class VeehdCom(Hoster):
('filename_spaces', 'bool', "Allow spaces in filename", 'False'),
('replacement_char', 'str', "Filename replacement character", '_'),
]
- __version__ = '0.2'
+ __version__ = '0.21'
__description__ = """Veehd.com Download Hoster"""
__author_name__ = ('cat')
__author_mail__ = ('cat@pyload')
@@ -55,12 +55,12 @@ class VeehdCom(Hoster):
name = match.group(1)
# replace unwanted characters in filename
- if self.getConf('filename_spaces'):
+ if self.getConfig('filename_spaces'):
pattern = '[^0-9A-Za-z\.\ ]+'
else:
pattern = '[^0-9A-Za-z\.]+'
- name = re.sub(pattern, self.getConf('replacement_char'),
+ name = re.sub(pattern, self.getConfig('replacement_char'),
name)
return name + '.avi'
diff --git a/pyload/plugins/hoster/XFileSharingPro.py b/pyload/plugins/hoster/XFileSharingPro.py
index 1120a2a8b..2103b0c20 100644
--- a/pyload/plugins/hoster/XFileSharingPro.py
+++ b/pyload/plugins/hoster/XFileSharingPro.py
@@ -23,7 +23,7 @@ from urlparse import urlparse
from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME
from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, PluginParseError
from module.plugins.ReCaptcha import ReCaptcha
-from module.plugins.internal.CaptchaService import SolveMedia, AdsCaptcha
+from module.plugins.internal.CaptchaService import SolveMedia
from module.utils import html_unescape
class XFileSharingPro(SimpleHoster):
@@ -35,10 +35,10 @@ class XFileSharingPro(SimpleHoster):
__name__ = "XFileSharingPro"
__type__ = "hoster"
__pattern__ = r"^unmatchable$"
- __version__ = "0.17"
+ __version__ = "0.18"
__description__ = """XFileSharingPro common hoster base"""
- __author_name__ = ("zoidberg")
- __author_mail__ = ("zoidberg@mujmail.cz")
+ __author_name__ = ("zoidberg", "stickell")
+ __author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it")
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>'
@@ -151,7 +151,8 @@ class XFileSharingPro(SimpleHoster):
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')
+ if not found:
+ self.parseError('DIRECT LINK')
self.startDownload(found.group(1))
def handleOverriden(self):
@@ -183,13 +184,17 @@ class XFileSharingPro(SimpleHoster):
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()
+ header = self.load(self.pyfile.url, just_header=True)
+ if 'location' in header: # Direct link
+ self.startDownload(self.pyfile.url)
+ else:
+ self.retry()
def startDownload(self, link):
link = link.strip()
if self.captcha: self.correctCaptcha()
self.logDebug('DIRECT LINK: %s' % link)
- self.download(link)
+ self.download(link, disposition=True)
def checkErrors(self):
found = re.search(self.ERROR_PATTERN, self.html)
diff --git a/pyload/plugins/hoster/XHamsterCom.py b/pyload/plugins/hoster/XHamsterCom.py
index 0779a78e6..866c5da45 100644
--- a/pyload/plugins/hoster/XHamsterCom.py
+++ b/pyload/plugins/hoster/XHamsterCom.py
@@ -17,7 +17,7 @@ class XHamsterCom(Hoster):
__name__ = "XHamsterCom"
__type__ = "hoster"
__pattern__ = r"http://(www\.)?xhamster\.com/movies/.+"
- __version__ = "0.1"
+ __version__ = "0.11"
__config__ = [("type", ".mp4;.flv", "Preferred type", ".mp4")]
__description__ = """XHamster.com Video Download Hoster"""
@@ -31,7 +31,7 @@ class XHamsterCom(Hoster):
self.offline()
if self.getConfig("type"):
- self.desired_fmt = self.getConf("type")
+ self.desired_fmt = self.getConfig("type")
self.pyfile.name = self.get_file_name() + self.desired_fmt
self.download(self.get_file_url())
diff --git a/pyload/plugins/hoster/Xdcc.py b/pyload/plugins/hoster/Xdcc.py
index 4870b8ab9..723623f52 100644
--- a/pyload/plugins/hoster/Xdcc.py
+++ b/pyload/plugins/hoster/Xdcc.py
@@ -32,7 +32,7 @@ from module.plugins.Hoster import Hoster
class Xdcc(Hoster):
__name__ = "Xdcc"
- __version__ = "0.3"
+ __version__ = "0.31"
__pattern__ = r'xdcc://.*?(/#?.*?)?/.*?/#?\d+/?' # xdcc://irc.Abjects.net/#channel/[XDCC]|Shit/#0004/
__type__ = "hoster"
__config__ = [
@@ -91,9 +91,9 @@ class Xdcc(Hoster):
chan = m.group(2)
bot = m.group(3)
pack = m.group(4)
- nick = self.getConf('nick')
- ident = self.getConf('ident')
- real = self.getConf('realname')
+ nick = self.getConfig('nick')
+ ident = self.getConfig('ident')
+ real = self.getConfig('realname')
temp = server.split(':')
ln = len(temp)
diff --git a/pyload/plugins/hoster/XvidstageCom.py b/pyload/plugins/hoster/XvidstageCom.py
deleted file mode 100644
index 4962c05af..000000000
--- a/pyload/plugins/hoster/XvidstageCom.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- 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: 4Christopher
-"""
-
-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
-
-
-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):</b></td><td nowrap[^>]*?>(.*?)<', html).group(1)
- info['size'] = re.search(r'(?:Size|Größe):</b></td><td>.*? <small>\((\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<id>[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'<input type="hidden" name="rand" value="(.*?)">', 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'<a href="(?P<url>.*?)">(?P=url)</a>', self.html).group('url')
- try:
- hours_file_available = int(
- re.search(r'This direct link will be available for your IP next (?P<hours>\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):
- ## <span style='position:absolute;padding-left:7px;padding-top:6px;'>&#49; …
- 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
diff --git a/pyload/plugins/hoster/YoutubeCom.py b/pyload/plugins/hoster/YoutubeCom.py
index 70db597cf..129b948bf 100644
--- a/pyload/plugins/hoster/YoutubeCom.py
+++ b/pyload/plugins/hoster/YoutubeCom.py
@@ -34,7 +34,7 @@ class YoutubeCom(Hoster):
__name__ = "YoutubeCom"
__type__ = "hoster"
__pattern__ = r"https?://(?:[^/]*?)youtube\.com/watch.*?[?&]v=.*"
- __version__ = "0.32"
+ __version__ = "0.34"
__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),
@@ -76,24 +76,24 @@ class YoutubeCom(Hoster):
def process(self, pyfile):
html = self.load(pyfile.url, decode=True)
- if '<h1 id="unavailable-message" class="message">' in html:
+ if re.search(r'<div id="player-unavailable" class="\s*player-width player-height\s*">', html):
self.offline()
if "We have been receiving a large volume of requests from your network." in html:
self.tempOffline()
#get config
- use3d = self.getConf("3d")
+ use3d = self.getConfig("3d")
if use3d:
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}
- desired_fmt = self.getConf("fmt")
+ desired_fmt = self.getConfig("fmt")
if desired_fmt and desired_fmt not in self.formats:
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.getConfig("quality"), 18)
#parse available streams
streams = re.search(r'"url_encoded_fmt_stream_map": "(.*?)",', html).group(1)
diff --git a/pyload/plugins/hoster/ZippyshareCom.py b/pyload/plugins/hoster/ZippyshareCom.py
index 84974e7ba..756a92ef3 100644
--- a/pyload/plugins/hoster/ZippyshareCom.py
+++ b/pyload/plugins/hoster/ZippyshareCom.py
@@ -10,10 +10,10 @@ class ZippyshareCom(SimpleHoster):
__name__ = "ZippyshareCom"
__type__ = "hoster"
__pattern__ = r"(?P<HOST>http://www\d{0,2}\.zippyshare.com)/v(?:/|iew.jsp.*key=)(?P<KEY>\d+)"
- __version__ = "0.37"
+ __version__ = "0.38"
__description__ = """Zippyshare.com Download Hoster"""
- __author_name__ = ("spoob", "zoidberg")
- __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz")
+ __author_name__ = ("spoob", "zoidberg", "stickell")
+ __author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz", "l.stickell@yahoo.it")
__config__ = [("swfdump_path", "string", "Path to swfdump", "")]
FILE_NAME_PATTERN = r'>Name:</font>\s*<font [^>]*>(?P<N>[^<]+)</font><br />'
@@ -62,7 +62,12 @@ class ZippyshareCom(SimpleHoster):
found = re.search(self.DOWNLOAD_URL_PATTERN, self.html, re.S)
if found:
#Method #1: JS eval
- url = self.js.eval("\n".join(found.groups()))
+ js = "\n".join(found.groups())
+ regex = r"document.getElementById\(\\*'dlbutton\\*'\).omg"
+ omg = re.search(regex + r" = ([^;]+);", js).group(1)
+ js = re.sub(regex + r" = ([^;]+);", '', js)
+ js = re.sub(regex, omg, js)
+ url = self.js.eval(js)
else:
#Method #2: SWF eval
seed_search = re.search(self.SEED_PATTERN, self.html)