summaryrefslogtreecommitdiffstats
path: root/pyload/plugin
diff options
context:
space:
mode:
authorGravatar Walter Purcaro <vuolter@users.noreply.github.com> 2015-04-13 10:21:32 +0200
committerGravatar Walter Purcaro <vuolter@users.noreply.github.com> 2015-04-13 10:21:32 +0200
commiteca20b701c411046e7ededb0462b310124ce3c18 (patch)
treec5eb36261cfc935f001b816f28f15d1f5afbf7e0 /pyload/plugin
parentMerge branch 'stable' into 0.4.10 (diff)
downloadpyload-eca20b701c411046e7ededb0462b310124ce3c18.tar.xz
Cleanup + fixup + new lib
Diffstat (limited to 'pyload/plugin')
-rw-r--r--pyload/plugin/Plugin.py15
-rw-r--r--pyload/plugin/addon/AntiVirus.py3
-rw-r--r--pyload/plugin/addon/UpdateManager.py4
-rw-r--r--pyload/plugin/addon/UserAgentSwitcher.py44
-rw-r--r--pyload/plugin/captcha/AdsCaptcha.py4
-rw-r--r--pyload/plugin/captcha/ReCaptcha.py23
-rw-r--r--pyload/plugin/captcha/SolveMedia.py2
-rw-r--r--pyload/plugin/container/CCF.py5
-rw-r--r--pyload/plugin/hook/AlldebridCom.py27
-rw-r--r--pyload/plugin/hook/DebridItaliaCom.py26
-rw-r--r--pyload/plugin/hook/EasybytezCom.py30
-rw-r--r--pyload/plugin/hook/FastixRu.py29
-rw-r--r--pyload/plugin/hook/FreeWayMe.py32
-rw-r--r--pyload/plugin/hook/LinkdecrypterCom.py26
-rw-r--r--pyload/plugin/hook/LinksnappyCom.py27
-rw-r--r--pyload/plugin/hook/MegaDebridEu.py33
-rw-r--r--pyload/plugin/hook/MegaRapidoNet.py81
-rw-r--r--pyload/plugin/hook/MultihostersCom.py18
-rw-r--r--pyload/plugin/hook/MultishareCz.py29
-rw-r--r--pyload/plugin/hook/MyfastfileCom.py28
-rw-r--r--pyload/plugin/hook/NoPremiumPl.py29
-rw-r--r--pyload/plugin/hook/OverLoadMe.py29
-rw-r--r--pyload/plugin/hook/PremiumTo.py27
-rw-r--r--pyload/plugin/hook/PremiumizeMe.py38
-rw-r--r--pyload/plugin/hook/PutdriveCom.py18
-rw-r--r--pyload/plugin/hook/RPNetBiz.py36
-rw-r--r--pyload/plugin/hook/RapideoPl.py29
-rw-r--r--pyload/plugin/hook/RealdebridCom.py27
-rw-r--r--pyload/plugin/hook/RehostTo.py27
-rw-r--r--pyload/plugin/hook/SimplyPremiumCom.py29
-rw-r--r--pyload/plugin/hook/SimplydebridCom.py24
-rw-r--r--pyload/plugin/hook/SmoozedCom.py24
-rw-r--r--pyload/plugin/hook/UnrestrictLi.py28
-rw-r--r--pyload/plugin/hook/ZeveraCom.py25
-rw-r--r--pyload/plugin/hoster/Ftp.py10
-rw-r--r--pyload/plugin/hoster/LolabitsEs.py45
-rw-r--r--pyload/plugin/hoster/SolidfilesCom.py30
-rw-r--r--pyload/plugin/hoster/YadiSk.py81
-rw-r--r--pyload/plugin/internal/BasePlugin.py10
-rw-r--r--pyload/plugin/internal/SimpleHoster.py14
-rw-r--r--pyload/plugin/internal/XFSHoster.py4
41 files changed, 1009 insertions, 61 deletions
diff --git a/pyload/plugin/Plugin.py b/pyload/plugin/Plugin.py
index af70232e0..c14155751 100644
--- a/pyload/plugin/Plugin.py
+++ b/pyload/plugin/Plugin.py
@@ -7,6 +7,9 @@ from random import randint
import os
import re
+import urllib
+import urlparse
+
from os import remove, makedirs, chmod, stat
from os.path import exists, join
@@ -17,7 +20,6 @@ if os.name != "nt":
from itertools import islice
from traceback import print_exc
-from urlparse import urlparse
from pyload.utils import fs_decode, fs_encode, safe_filename, fs_join, encode
@@ -217,7 +219,7 @@ class Plugin(Base):
#: captcha task
self.cTask = None
- self.html = None # @TODO: Move to hoster class in 0.4.10
+ self.html = None #@TODO: Move to hoster class in 0.4.10
self.retries = 0
self.init()
@@ -490,7 +492,7 @@ class Plugin(Base):
if not url:
self.fail(_("No url given"))
- url = encode(url).strip() # @NOTE: utf8 vs decode -> please use decode attribute in all future plugins
+ url = urllib.unquote(encode(url).strip()) #@NOTE: utf8 vs decode -> please use decode attribute in all future plugins
if self.core.debug:
self.logDebug("Load url: " + url, *["%s=%s" % (key, val) for key, val in locals().iteritems() if key not in ("self", "url")])
@@ -555,7 +557,7 @@ class Plugin(Base):
if not url:
self.fail(_("No url given"))
- url = encode(url).strip()
+ url = urllib.unquote(encode(url).strip())
if self.core.debug:
self.logDebug("Download url: " + url, *["%s=%s" % (key, val) for key, val in locals().iteritems() if key not in ("self", "url")])
@@ -564,6 +566,9 @@ class Plugin(Base):
self.pyfile.setStatus("downloading")
+ if disposition:
+ self.pyfile.name = urlparse.urlparse(url).path.split('/')[-1] or self.pyfile.name
+
download_folder = self.core.config['general']['download_folder']
location = fs_join(download_folder, self.pyfile.package().folder)
@@ -596,7 +601,7 @@ class Plugin(Base):
self.pyfile.size = self.req.size
if newname:
- newname = urlparse(newname).path.split("/")[-1]
+ newname = urlparse.urlparse(newname).path.split('/')[-1]
if disposition and newname != name:
self.logInfo(_("%(name)s saved as %(newname)s") % {"name": name, "newname": newname})
diff --git a/pyload/plugin/addon/AntiVirus.py b/pyload/plugin/addon/AntiVirus.py
index 2213cddc1..6fae3b532 100644
--- a/pyload/plugin/addon/AntiVirus.py
+++ b/pyload/plugin/addon/AntiVirus.py
@@ -27,9 +27,6 @@ class AntiVirus(Addon):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
- interval = 0 #@TODO: Remove in 0.4.10
-
-
def setup(self):
self.info = {} #@TODO: Remove in 0.4.10
diff --git a/pyload/plugin/addon/UpdateManager.py b/pyload/plugin/addon/UpdateManager.py
index c5bee16a1..0837918d3 100644
--- a/pyload/plugin/addon/UpdateManager.py
+++ b/pyload/plugin/addon/UpdateManager.py
@@ -32,7 +32,7 @@ class UpdateManager(Addon):
__type__ = "addon"
__version__ = "0.50"
- __config__ = [("activated", "bool", "Activated", True),
+ __config__ = [("activated", "bool", "Activated", False),
("checkinterval", "int", "Check interval in hours", 8),
("autorestart", "bool",
"Auto-restart pyLoad when required", True),
@@ -83,7 +83,7 @@ class UpdateManager(Addon):
def autoreloadPlugins(self):
""" reload and reindex all modified plugins """
modules = filter(
- lambda m: m and (m.__name__.startswith("module.plugins.") or
+ lambda m: m and (m.__name__.startswith("pyload.plugin.") or
m.__name__.startswith("userplugins.")) and
m.__name__.count(".") >= 2, sys.modules.itervalues()
)
diff --git a/pyload/plugin/addon/UserAgentSwitcher.py b/pyload/plugin/addon/UserAgentSwitcher.py
new file mode 100644
index 000000000..46807da67
--- /dev/null
+++ b/pyload/plugin/addon/UserAgentSwitcher.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import with_statement
+
+import os
+import pycurl
+import random
+
+from pyload.plugin.Addon import Addon
+from pyload.utils import fs_encode
+
+
+class UserAgentSwitcher(Addon):
+ __name__ = "UserAgentSwitcher"
+ __type__ = "addon"
+ __version__ = "0.04"
+
+ __config__ = [("activated", "bool", "Activated" , True ),
+ ("uaf" , "file", "Random user-agents file" , "" ),
+ ("uar" , "bool", "Random user-agent" , False ),
+ ("uas" , "str" , "Custom user-agent string", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0")]
+
+ __description__ = """Custom user-agent"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def setup(self):
+ self.info = {} #@TODO: Remove in 0.4.10
+
+
+ def downloadPreparing(self, pyfile):
+ uar = self.getConfig('uar')
+ uaf = fs_encode(self.getConfig('uaf'))
+
+ if uar and os.path.isfile(uaf):
+ with open(uaf) as f:
+ uas = random.choice([ua for ua in f.read().splitlines()])
+ else:
+ uas = self.getConfig('uas')
+
+ if uas:
+ self.logDebug("Use custom user-agent string: " + uas)
+ pyfile.plugin.req.http.c.setopt(pycurl.USERAGENT, uas.encode('utf-8'))
diff --git a/pyload/plugin/captcha/AdsCaptcha.py b/pyload/plugin/captcha/AdsCaptcha.py
index 5b23247c0..89579881f 100644
--- a/pyload/plugin/captcha/AdsCaptcha.py
+++ b/pyload/plugin/captcha/AdsCaptcha.py
@@ -17,8 +17,8 @@ class AdsCaptcha(Captcha):
__authors__ = [("pyLoad Team", "admin@pyload.org")]
- CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?[^"\']*CaptchaId=(\d+)'
- PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?[^"\']*PublicKey=([\w-]+)'
+ CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?CaptchaId=(\d+)'
+ PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?PublicKey=([\w-]+)'
def detect_key(self, html=None):
diff --git a/pyload/plugin/captcha/ReCaptcha.py b/pyload/plugin/captcha/ReCaptcha.py
index 6dcb09f55..4920262b2 100644
--- a/pyload/plugin/captcha/ReCaptcha.py
+++ b/pyload/plugin/captcha/ReCaptcha.py
@@ -13,7 +13,7 @@ from pyload.plugin.Captcha import Captcha
class ReCaptcha(Captcha):
__name__ = "ReCaptcha"
__type__ = "captcha"
- __version__ = "0.14"
+ __version__ = "0.15"
__description__ = """ReCaptcha captcha service plugin"""
__license__ = "GPLv3"
@@ -161,21 +161,12 @@ class ReCaptcha(Captcha):
token2 = re.search(r'"finput","(.*?)",', html)
self.logDebug("Token #2: %s" % token2.group(1))
- token3 = re.search(r'."asconf".\s,".*?".\s,"(.*?)".', html)
+ token3 = re.search(r'"rresp","(.*?)",', html)
self.logDebug("Token #3: %s" % token3.group(1))
- html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload",
- post={'k' : key,
- 'c' : token2.group(1),
- 'reason': "fi",
- 'fbg' : token3.group(1)})
-
- token4 = re.search(r'"rresp","(.*?)",', html)
- self.logDebug("Token #4: %s" % token4.group(1))
-
millis_captcha_loading = int(round(time.time() * 1000))
captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload",
- get={'c': token4.group(1), 'k': key},
+ get={'c':token3.group(1), 'k':key},
cookies=True,
forceUser=True)
response = b64encode('{"response":"%s"}' % captcha_response)
@@ -187,15 +178,15 @@ class ReCaptcha(Captcha):
html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify",
post={'k' : key,
- 'c' : token4.group(1),
+ 'c' : token3.group(1),
'response': response,
't' : timeToSolve,
'ct' : timeToSolveMore,
'bg' : botguardstring})
- token5 = re.search(r'"uvresp","(.*?)",', html)
- self.logDebug("Token #5: %s" % token5.group(1))
+ token4 = re.search(r'"uvresp","(.*?)",', html)
+ self.logDebug("Token #4: %s" % token4.group(1))
- result = token5.group(1)
+ result = token4.group(1)
return result, None
diff --git a/pyload/plugin/captcha/SolveMedia.py b/pyload/plugin/captcha/SolveMedia.py
index 7f421f490..45f7a69e8 100644
--- a/pyload/plugin/captcha/SolveMedia.py
+++ b/pyload/plugin/captcha/SolveMedia.py
@@ -49,7 +49,7 @@ class SolveMedia(Captcha):
html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript",
get={'k': key})
try:
- challenge = re.search(r'<input type=hidden name="adcopy_challenge" id="adcopy_challenge" value="([^"]+)">',
+ challenge = re.search(r'<input type=hidden name="adcopy_challenge" id="adcopy_challenge" value="(.+?)">',
html).group(1)
server = "http://api.solvemedia.com/papi/media"
diff --git a/pyload/plugin/container/CCF.py b/pyload/plugin/container/CCF.py
index 65f96033a..d984e23dc 100644
--- a/pyload/plugin/container/CCF.py
+++ b/pyload/plugin/container/CCF.py
@@ -3,8 +3,7 @@
from __future__ import with_statement
import re
-
-from urllib2 import build_opener
+import urllib2
from MultipartPostHandler import MultipartPostHandler
@@ -27,7 +26,7 @@ class CCF(Container):
def decrypt(self, pyfile):
fs_filename = fs_encode(pyfile.url.strip())
- opener = build_opener(MultipartPostHandler)
+ opener = urllib2.build_opener(MultipartPostHandler)
dlc_content = opener.open('http://service.jdownloader.net/dlcrypt/getDLC.php',
{'src' : "ccf",
diff --git a/pyload/plugin/hook/AlldebridCom.py b/pyload/plugin/hook/AlldebridCom.py
new file mode 100644
index 000000000..3d05fb761
--- /dev/null
+++ b/pyload/plugin/hook/AlldebridCom.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class AlldebridCom(MultiHook):
+ __name__ = "AlldebridCom"
+ __type__ = "hook"
+ __version__ = "0.16"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 ),
+ ("ssl" , "bool" , "Use HTTPS" , True )]
+
+ __description__ = """Alldebrid.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Andy Voigt", "spamsales@online.de")]
+
+
+ def getHosters(self):
+ https = "https" if self.getConfig('ssl') else "http"
+ html = self.getURL(https + "://www.alldebrid.com/api.php", get={'action': "get_host"}).replace("\"", "").strip()
+
+ return [x.strip() for x in html.split(",") if x.strip()]
diff --git a/pyload/plugin/hook/DebridItaliaCom.py b/pyload/plugin/hook/DebridItaliaCom.py
new file mode 100644
index 000000000..e7760ba5a
--- /dev/null
+++ b/pyload/plugin/hook/DebridItaliaCom.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class DebridItaliaCom(MultiHook):
+ __name__ = "DebridItaliaCom"
+ __type__ = "hook"
+ __version__ = "0.12"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Debriditalia.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("stickell" , "l.stickell@yahoo.it"),
+ ("Walter Purcaro", "vuolter@gmail.com" )]
+
+
+ def getHosters(self):
+ return self.getURL("http://debriditalia.com/api.php", get={'hosts': ""}).replace('"', '').split(',')
diff --git a/pyload/plugin/hook/EasybytezCom.py b/pyload/plugin/hook/EasybytezCom.py
new file mode 100644
index 000000000..79640a367
--- /dev/null
+++ b/pyload/plugin/hook/EasybytezCom.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class EasybytezCom(MultiHook):
+ __name__ = "EasybytezCom"
+ __type__ = "hook"
+ __version__ = "0.07"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """EasyBytez.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ def getHosters(self):
+ user, data = self.account.selectAccount()
+
+ req = self.account.getAccountRequest(user)
+ html = req.load("http://www.easybytez.com")
+
+ return re.search(r'</textarea>\s*Supported sites:(.*)', html).group(1).split(',')
diff --git a/pyload/plugin/hook/FastixRu.py b/pyload/plugin/hook/FastixRu.py
new file mode 100644
index 000000000..d0e2ff2fd
--- /dev/null
+++ b/pyload/plugin/hook/FastixRu.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class FastixRu(MultiHook):
+ __name__ = "FastixRu"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Fastix.ru hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Massimo Rosamilia", "max@spiritix.eu")]
+
+
+ def getHosters(self):
+ html = self.getURL("http://fastix.ru/api_v2",
+ get={'apikey': "5182964c3f8f9a7f0b00000a_kelmFB4n1IrnCDYuIFn2y",
+ 'sub' : "allowed_sources"})
+ host_list = json_loads(html)
+ host_list = host_list['allow']
+ return host_list
diff --git a/pyload/plugin/hook/FreeWayMe.py b/pyload/plugin/hook/FreeWayMe.py
new file mode 100644
index 000000000..086824550
--- /dev/null
+++ b/pyload/plugin/hook/FreeWayMe.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class FreeWayMe(MultiHook):
+ __name__ = "FreeWayMe"
+ __type__ = "hook"
+ __version__ = "0.15"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """FreeWay.me hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Nicolas Giese", "james@free-way.me")]
+
+
+ def getHosters(self):
+ # Get account data
+ if not self.account or not self.account.canUse():
+ hostis = self.getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3}).replace("\"", "").strip()
+ else:
+ self.logDebug("AccountInfo available - Get HosterList with User Pass")
+ (user, data) = self.account.selectAccount()
+ hostis = self.getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3, "user": user, "pass": data['password']}).replace("\"", "").strip()
+
+ self.logDebug("hosters: %s" % hostis)
+ return [x.strip() for x in hostis.split(",") if x.strip()]
diff --git a/pyload/plugin/hook/LinkdecrypterCom.py b/pyload/plugin/hook/LinkdecrypterCom.py
new file mode 100644
index 000000000..446e33327
--- /dev/null
+++ b/pyload/plugin/hook/LinkdecrypterCom.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class LinkdecrypterCom(MultiHook):
+ __name__ = "LinkdecrypterCom"
+ __type__ = "hook"
+ __version__ = "1.04"
+
+ __config__ = [("activated" , "bool" , "Activated" , True ),
+ ("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)", "" ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Linkdecrypter.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def getCrypters(self):
+ return re.search(r'>Supported\(\d+\)</b>: <i>(.[\w.\-, ]+)',
+ self.getURL("http://linkdecrypter.com/", decode=True).replace("(g)", "")).group(1).split(', ')
diff --git a/pyload/plugin/hook/LinksnappyCom.py b/pyload/plugin/hook/LinksnappyCom.py
new file mode 100644
index 000000000..7eddc5811
--- /dev/null
+++ b/pyload/plugin/hook/LinksnappyCom.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class LinksnappyCom(MultiHook):
+ __name__ = "LinksnappyCom"
+ __type__ = "hook"
+ __version__ = "0.04"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Linksnappy.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def getHosters(self):
+ json_data = self.getURL("http://gen.linksnappy.com/lseAPI.php", get={'act': "FILEHOSTS"})
+ json_data = json_loads(json_data)
+
+ return json_data['return'].keys()
diff --git a/pyload/plugin/hook/MegaDebridEu.py b/pyload/plugin/hook/MegaDebridEu.py
new file mode 100644
index 000000000..e373a544b
--- /dev/null
+++ b/pyload/plugin/hook/MegaDebridEu.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class MegaDebridEu(MultiHook):
+ __name__ = "MegaDebridEu"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Mega-debrid.eu hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("D.Ducatel", "dducatel@je-geek.fr")]
+
+
+ def getHosters(self):
+ reponse = self.getURL("http://www.mega-debrid.eu/api.php", get={'action': "getHosters"})
+ json_data = json_loads(reponse)
+
+ if json_data['response_code'] == "ok":
+ host_list = [element[0] for element in json_data['hosters']]
+ else:
+ self.logError(_("Unable to retrieve hoster list"))
+ host_list = list()
+
+ return host_list
diff --git a/pyload/plugin/hook/MegaRapidoNet.py b/pyload/plugin/hook/MegaRapidoNet.py
new file mode 100644
index 000000000..2f660c939
--- /dev/null
+++ b/pyload/plugin/hook/MegaRapidoNet.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class MegaRapidoNet(MultiHook):
+ __name__ = "MegaRapidoNet"
+ __type__ = "hook"
+ __version__ = "0.02"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)", "" ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """MegaRapido.net hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Kagenoshin", "kagenoshin@gmx.ch")]
+
+
+ def getHosters(self):
+ hosters = {'1fichier' : [],#leave it there are so many possible addresses?
+ '1st-files' : ['1st-files.com'],
+ '2shared' : ['2shared.com'],
+ '4shared' : ['4shared.com', '4shared-china.com'],
+ 'asfile' : ['http://asfile.com/'],
+ 'bitshare' : ['bitshare.com'],
+ 'brupload' : ['brupload.net'],
+ 'crocko' : ['crocko.com','easy-share.com'],
+ 'dailymotion' : ['dailymotion.com'],
+ 'depfile' : ['depfile.com'],
+ 'depositfiles': ['depositfiles.com', 'dfiles.eu'],
+ 'dizzcloud' : ['dizzcloud.com'],
+ 'dl.dropbox' : [],
+ 'extabit' : ['extabit.com'],
+ 'extmatrix' : ['extmatrix.com'],
+ 'facebook' : [],
+ 'file4go' : ['file4go.com'],
+ 'filecloud' : ['filecloud.io','ifile.it','mihd.net'],
+ 'filefactory' : ['filefactory.com'],
+ 'fileom' : ['fileom.com'],
+ 'fileparadox' : ['fileparadox.in'],
+ 'filepost' : ['filepost.com', 'fp.io'],
+ 'filerio' : ['filerio.in','filerio.com','filekeen.com'],
+ 'filesflash' : ['filesflash.com'],
+ 'firedrive' : ['firedrive.com', 'putlocker.com'],
+ 'flashx' : [],
+ 'freakshare' : ['freakshare.net', 'freakshare.com'],
+ 'gigasize' : ['gigasize.com'],
+ 'hipfile' : ['hipfile.com'],
+ 'junocloud' : ['junocloud.me'],
+ 'letitbit' : ['letitbit.net','shareflare.net'],
+ 'mediafire' : ['mediafire.com'],
+ 'mega' : ['mega.co.nz'],
+ 'megashares' : ['megashares.com'],
+ 'metacafe' : ['metacafe.com'],
+ 'netload' : ['netload.in'],
+ 'oboom' : ['oboom.com'],
+ 'rapidgator' : ['rapidgator.net'],
+ 'rapidshare' : ['rapidshare.com'],
+ 'rarefile' : ['rarefile.net'],
+ 'ryushare' : ['ryushare.com'],
+ 'sendspace' : ['sendspace.com'],
+ 'turbobit' : ['turbobit.net', 'unextfiles.com'],
+ 'uploadable' : ['uploadable.ch'],
+ 'uploadbaz' : ['uploadbaz.com'],
+ 'uploaded' : ['uploaded.to', 'uploaded.net', 'ul.to'],
+ 'uploadhero' : ['uploadhero.com'],
+ 'uploading' : ['uploading.com'],
+ 'uptobox' : ['uptobox.com'],
+ 'xvideos' : ['xvideos.com'],
+ 'youtube' : ['youtube.com']}
+
+ hoster_list = []
+
+ for item in hosters.itervalues():
+ hoster_list.extend(item)
+
+ return hoster_list
diff --git a/pyload/plugin/hook/MultihostersCom.py b/pyload/plugin/hook/MultihostersCom.py
new file mode 100644
index 000000000..7b92089a1
--- /dev/null
+++ b/pyload/plugin/hook/MultihostersCom.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.hook.ZeveraCom import ZeveraCom
+
+
+class MultihostersCom(ZeveraCom):
+ __name__ = "MultihostersCom"
+ __type__ = "hook"
+ __version__ = "0.02"
+
+ __config__ = [("mode" , "all;listed;unlisted", "Use for plugins (if supported)" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed", "bool" , "Revert to standard download if download fails", False),
+ ("interval" , "int" , "Reload interval in hours (0 to disable)" , 12 )]
+
+ __description__ = """Multihosters.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("tjeh", "tjeh@gmx.net")]
diff --git a/pyload/plugin/hook/MultishareCz.py b/pyload/plugin/hook/MultishareCz.py
new file mode 100644
index 000000000..97cbf9b4d
--- /dev/null
+++ b/pyload/plugin/hook/MultishareCz.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class MultishareCz(MultiHook):
+ __name__ = "MultishareCz"
+ __type__ = "hook"
+ __version__ = "0.07"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """MultiShare.cz hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ HOSTER_PATTERN = r'<img class="logo-shareserveru"[^>]*?alt="(.+?)"></td>\s*<td class="stav">[^>]*?alt="OK"'
+
+
+ def getHosters(self):
+ html = self.getURL("http://www.multishare.cz/monitoring/")
+ return re.findall(self.HOSTER_PATTERN, html)
diff --git a/pyload/plugin/hook/MyfastfileCom.py b/pyload/plugin/hook/MyfastfileCom.py
new file mode 100644
index 000000000..3149e832c
--- /dev/null
+++ b/pyload/plugin/hook/MyfastfileCom.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+from pyload.utils import json_loads
+
+
+class MyfastfileCom(MultiHook):
+ __name__ = "MyfastfileCom"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Myfastfile.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def getHosters(self):
+ json_data = self.getURL("http://myfastfile.com/api.php", get={'hosts': ""}, decode=True)
+ self.logDebug("JSON data", json_data)
+ json_data = json_loads(json_data)
+
+ return json_data['hosts']
diff --git a/pyload/plugin/hook/NoPremiumPl.py b/pyload/plugin/hook/NoPremiumPl.py
new file mode 100644
index 000000000..93c5b8d1e
--- /dev/null
+++ b/pyload/plugin/hook/NoPremiumPl.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class NoPremiumPl(MultiHook):
+ __name__ = "NoPremiumPl"
+ __type__ = "hook"
+ __version__ = "0.03"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """NoPremium.pl hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("goddie", "dev@nopremium.pl")]
+
+
+ def getHosters(self):
+ hostings = json_loads(self.getURL("https://www.nopremium.pl/clipboard.php?json=3").strip())
+ hostings_domains = [domain for row in hostings for domain in row["domains"] if row["sdownload"] == "0"]
+
+ self.logDebug(hostings_domains)
+
+ return hostings_domains
diff --git a/pyload/plugin/hook/OverLoadMe.py b/pyload/plugin/hook/OverLoadMe.py
new file mode 100644
index 000000000..6db7c1fa2
--- /dev/null
+++ b/pyload/plugin/hook/OverLoadMe.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class OverLoadMe(MultiHook):
+ __name__ = "OverLoadMe"
+ __type__ = "hook"
+ __version__ = "0.04"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 ),
+ ("ssl" , "bool" , "Use HTTPS" , True )]
+
+ __description__ = """Over-Load.me hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("marley", "marley@over-load.me")]
+
+
+ def getHosters(self):
+ https = "https" if self.getConfig('ssl') else "http"
+ html = self.getURL(https + "://api.over-load.me/hoster.php",
+ get={'auth': "0001-cb1f24dadb3aa487bda5afd3b76298935329be7700cd7-5329be77-00cf-1ca0135f"}).replace("\"", "").strip()
+ self.logDebug("Hosterlist", html)
+
+ return [x.strip() for x in html.split(",") if x.strip()]
diff --git a/pyload/plugin/hook/PremiumTo.py b/pyload/plugin/hook/PremiumTo.py
new file mode 100644
index 000000000..51e801c4f
--- /dev/null
+++ b/pyload/plugin/hook/PremiumTo.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class PremiumTo(MultiHook):
+ __name__ = "PremiumTo"
+ __type__ = "hook"
+ __version__ = "0.08"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Premium.to hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("RaNaN" , "RaNaN@pyload.org" ),
+ ("zoidberg", "zoidberg@mujmail.cz"),
+ ("stickell", "l.stickell@yahoo.it")]
+
+
+ def getHosters(self):
+ html = self.getURL("http://premium.to/api/hosters.php",
+ get={'username': self.account.username, 'password': self.account.password})
+ return [x.strip() for x in html.replace("\"", "").split(";")]
diff --git a/pyload/plugin/hook/PremiumizeMe.py b/pyload/plugin/hook/PremiumizeMe.py
new file mode 100644
index 000000000..209db7c75
--- /dev/null
+++ b/pyload/plugin/hook/PremiumizeMe.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class PremiumizeMe(MultiHook):
+ __name__ = "PremiumizeMe"
+ __type__ = "hook"
+ __version__ = "0.17"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Premiumize.me hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Florian Franzen", "FlorianFranzen@gmail.com")]
+
+
+ def getHosters(self):
+ # Get account data
+ user, data = self.account.selectAccount()
+
+ # Get supported hosters list from premiumize.me using the
+ # json API v1 (see https://secure.premiumize.me/?show=api)
+ answer = self.getURL("https://api.premiumize.me/pm-api/v1.php",
+ get={'method': "hosterlist", 'params[login]': user, 'params[pass]': data['password']})
+ data = json_loads(answer)
+
+ # If account is not valid thera are no hosters available
+ if data['status'] != 200:
+ return []
+
+ # Extract hosters from json file
+ return data['result']['hosterlist']
diff --git a/pyload/plugin/hook/PutdriveCom.py b/pyload/plugin/hook/PutdriveCom.py
new file mode 100644
index 000000000..85e2f541d
--- /dev/null
+++ b/pyload/plugin/hook/PutdriveCom.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.hook.ZeveraCom import ZeveraCom
+
+
+class PutdriveCom(ZeveraCom):
+ __name__ = "PutdriveCom"
+ __type__ = "hook"
+ __version__ = "0.01"
+
+ __config__ = [("mode" , "all;listed;unlisted", "Use for plugins (if supported)" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed", "bool" , "Revert to standard download if download fails", False),
+ ("interval" , "int" , "Reload interval in hours (0 to disable)" , 12 )]
+
+ __description__ = """Putdrive.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
diff --git a/pyload/plugin/hook/RPNetBiz.py b/pyload/plugin/hook/RPNetBiz.py
new file mode 100644
index 000000000..e8afb4fc0
--- /dev/null
+++ b/pyload/plugin/hook/RPNetBiz.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class RPNetBiz(MultiHook):
+ __name__ = "RPNetBiz"
+ __type__ = "hook"
+ __version__ = "0.14"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """RPNet.biz hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Dman", "dmanugm@gmail.com")]
+
+
+ def getHosters(self):
+ # Get account data
+ user, data = self.account.selectAccount()
+
+ res = self.getURL("https://premium.rpnet.biz/client_api.php",
+ get={'username': user, 'password': data['password'], 'action': "showHosterList"})
+ hoster_list = json_loads(res)
+
+ # If account is not valid thera are no hosters available
+ if 'error' in hoster_list:
+ return []
+
+ # Extract hosters from json file
+ return hoster_list['hosters']
diff --git a/pyload/plugin/hook/RapideoPl.py b/pyload/plugin/hook/RapideoPl.py
new file mode 100644
index 000000000..74bad2cfd
--- /dev/null
+++ b/pyload/plugin/hook/RapideoPl.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class RapideoPl(MultiHook):
+ __name__ = "RapideoPl"
+ __type__ = "hook"
+ __version__ = "0.03"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Rapideo.pl hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("goddie", "dev@rapideo.pl")]
+
+
+ def getHosters(self):
+ hostings = json_loads(self.getURL("https://www.rapideo.pl/clipboard.php?json=3").strip())
+ hostings_domains = [domain for row in hostings for domain in row["domains"] if row["sdownload"] == "0"]
+
+ self.logDebug(hostings_domains)
+
+ return hostings_domains
diff --git a/pyload/plugin/hook/RealdebridCom.py b/pyload/plugin/hook/RealdebridCom.py
new file mode 100644
index 000000000..74a114105
--- /dev/null
+++ b/pyload/plugin/hook/RealdebridCom.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class RealdebridCom(MultiHook):
+ __name__ = "RealdebridCom"
+ __type__ = "hook"
+ __version__ = "0.46"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 ),
+ ("ssl" , "bool" , "Use HTTPS" , True )]
+
+ __description__ = """Real-Debrid.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Devirex Hazzard", "naibaf_11@yahoo.de")]
+
+
+ def getHosters(self):
+ https = "https" if self.getConfig('ssl') else "http"
+ html = self.getURL(https + "://real-debrid.com/api/hosters.php").replace("\"", "").strip()
+
+ return [x.strip() for x in html.split(",") if x.strip()]
diff --git a/pyload/plugin/hook/RehostTo.py b/pyload/plugin/hook/RehostTo.py
new file mode 100644
index 000000000..69978edaa
--- /dev/null
+++ b/pyload/plugin/hook/RehostTo.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class RehostTo(MultiHook):
+ __name__ = "RehostTo"
+ __type__ = "hook"
+ __version__ = "0.50"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Rehost.to hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("RaNaN", "RaNaN@pyload.org")]
+
+
+ def getHosters(self):
+ user, data = self.account.selectAccount()
+ html = self.getURL("http://rehost.to/api.php",
+ get={'cmd' : "get_supported_och_dl",
+ 'long_ses': self.account.getAccountInfo(user)['session']})
+ return [x.strip() for x in html.replace("\"", "").split(",")]
diff --git a/pyload/plugin/hook/SimplyPremiumCom.py b/pyload/plugin/hook/SimplyPremiumCom.py
new file mode 100644
index 000000000..9f696666f
--- /dev/null
+++ b/pyload/plugin/hook/SimplyPremiumCom.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class SimplyPremiumCom(MultiHook):
+ __name__ = "SimplyPremiumCom"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Simply-Premium.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("EvolutionClip", "evolutionclip@live.de")]
+
+
+ def getHosters(self):
+ json_data = self.getURL("http://www.simply-premium.com/api/hosts.php", get={'format': "json", 'online': 1})
+ json_data = json_loads(json_data)
+
+ host_list = [element['regex'] for element in json_data['result']]
+
+ return host_list
diff --git a/pyload/plugin/hook/SimplydebridCom.py b/pyload/plugin/hook/SimplydebridCom.py
new file mode 100644
index 000000000..74eba106e
--- /dev/null
+++ b/pyload/plugin/hook/SimplydebridCom.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class SimplydebridCom(MultiHook):
+ __name__ = "SimplydebridCom"
+ __type__ = "hook"
+ __version__ = "0.04"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Simply-Debrid.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("Kagenoshin", "kagenoshin@gmx.ch")]
+
+
+ def getHosters(self):
+ html = self.getURL("http://simply-debrid.com/api.php", get={'list': 1})
+ return [x.strip() for x in html.rstrip(';').replace("\"", "").split(";")]
diff --git a/pyload/plugin/hook/SmoozedCom.py b/pyload/plugin/hook/SmoozedCom.py
new file mode 100644
index 000000000..37c0d9bcb
--- /dev/null
+++ b/pyload/plugin/hook/SmoozedCom.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class SmoozedCom(MultiHook):
+ __name__ = "SmoozedCom"
+ __type__ = "hook"
+ __version__ = "0.03"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Smoozed.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("", "")]
+
+
+ def getHosters(self):
+ user, data = self.account.selectAccount()
+ return self.account.getAccountInfo(user)["hosters"]
diff --git a/pyload/plugin/hook/UnrestrictLi.py b/pyload/plugin/hook/UnrestrictLi.py
new file mode 100644
index 000000000..a0fb53004
--- /dev/null
+++ b/pyload/plugin/hook/UnrestrictLi.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+from pyload.utils import json_loads
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class UnrestrictLi(MultiHook):
+ __name__ = "UnrestrictLi"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 ),
+ ("history" , "bool" , "Delete History" , False)]
+
+ __description__ = """Unrestrict.li hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("stickell", "l.stickell@yahoo.it")]
+
+
+ def getHosters(self):
+ json_data = self.getURL("http://unrestrict.li/api/jdownloader/hosts.php", get={'format': "json"})
+ json_data = json_loads(json_data)
+
+ return [element['host'] for element in json_data['result']]
diff --git a/pyload/plugin/hook/ZeveraCom.py b/pyload/plugin/hook/ZeveraCom.py
new file mode 100644
index 000000000..0ca2e72d2
--- /dev/null
+++ b/pyload/plugin/hook/ZeveraCom.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugin.internal.MultiHook import MultiHook
+
+
+class ZeveraCom(MultiHook):
+ __name__ = "ZeveraCom"
+ __type__ = "hook"
+ __version__ = "0.05"
+
+ __config__ = [("pluginmode" , "all;listed;unlisted", "Use for plugins" , "all"),
+ ("pluginlist" , "str" , "Plugin list (comma separated)" , "" ),
+ ("revertfailed" , "bool" , "Revert to standard download if fails", True ),
+ ("reload" , "bool" , "Reload plugin list" , True ),
+ ("reloadinterval", "int" , "Reload interval in hours" , 12 )]
+
+ __description__ = """Zevera.com hook plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg" , "zoidberg@mujmail.cz"),
+ ("Walter Purcaro", "vuolter@gmail.com" )]
+
+
+ def getHosters(self):
+ html = self.account.api_response(pyreq.getHTTPRequest(timeout=120), cmd="gethosters")
+ return [x.strip() for x in html.split(",")]
diff --git a/pyload/plugin/hoster/Ftp.py b/pyload/plugin/hoster/Ftp.py
index d7aaa730e..b18e39a1c 100644
--- a/pyload/plugin/hoster/Ftp.py
+++ b/pyload/plugin/hoster/Ftp.py
@@ -28,16 +28,6 @@ class Ftp(Hoster):
self.resumeDownload = True
- #: Work-around to `filename*=UTF-8` bug; remove in 0.4.10
- def download(self, url, get={}, post={}, ref=True, cookies=True, disposition=False):
- try:
- if disposition:
- content = urllib2.urlopen(url).info()['Content-Disposition'].split(';')
- self.pyfile.name = content[1].split('filename=')[1][1:-1] or self.pyfile.name
- finally:
- return super(Ftp, self).download(url, get, post, ref, cookies, False)
-
-
def process(self, pyfile):
parsed_url = urlparse(pyfile.url)
netloc = parsed_url.netloc
diff --git a/pyload/plugin/hoster/LolabitsEs.py b/pyload/plugin/hoster/LolabitsEs.py
new file mode 100644
index 000000000..dbd392624
--- /dev/null
+++ b/pyload/plugin/hoster/LolabitsEs.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*
+
+import HTMLParser
+import re
+
+from pyload.plugin.internal.SimpleHoster import SimpleHoster
+
+
+class LolabitsEs(SimpleHoster):
+ __name__ = "LolabitsEs"
+ __type__ = "hoster"
+ __version__ = "0.02"
+
+ __pattern__ = r'https?://(?:www\.)?lolabits\.es/.+'
+
+ __description__ = """Lolabits.es hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de")]
+
+
+ NAME_PATTERN = r'Descargar: <b>(?P<N>.+?)<'
+ SIZE_PATTERN = r'class="fileSize">(?P<S>[\d.,]+) (?P<U>[\w^_]+)'
+ OFFLINE_PATTERN = r'Un usuario con este nombre no existe'
+
+ FILEID_PATTERN = r'name="FileId" value="(\d+)"'
+ TOKEN_PATTERN = r'name="__RequestVerificationToken" type="hidden" value="(.+?)"'
+ LINK_PATTERN = r'"redirectUrl":"(.+?)"'
+
+
+ def setup(self):
+ self.chunkLimit = 1
+
+
+ def handleFree(self, pyfile):
+ fileid = re.search(self.FILEID_PATTERN, self.html).group(1)
+ self.logDebug("FileID: " + fileid)
+
+ token = re.search(self.TOKEN_PATTERN, self.html).group(1)
+ self.logDebug("Token: " + token)
+
+ self.html = self.load("http://lolabits.es/action/License/Download",
+ post={'fileId' : fileid,
+ '__RequestVerificationToken' : token}).decode('unicode-escape')
+
+ self.link = HTMLParser.HTMLParser().unescape(re.search(self.LINK_PATTERN, self.html).group(1))
diff --git a/pyload/plugin/hoster/SolidfilesCom.py b/pyload/plugin/hoster/SolidfilesCom.py
new file mode 100644
index 000000000..e700e861f
--- /dev/null
+++ b/pyload/plugin/hoster/SolidfilesCom.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#
+# Test links:
+# http://www.solidfiles.com/d/609cdb4b1b
+
+from pyload.plugin.internal.SimpleHoster import SimpleHoster
+
+
+class SolidfilesCom(SimpleHoster):
+ __name__ = "SolidfilesCom"
+ __type__ = "hoster"
+ __version__ = "0.02"
+
+ __pattern__ = r'http://(?:www\.)?solidfiles\.com\/d/\w+'
+
+ __description__ = """Solidfiles.com hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("sraedler", "simon.raedler@yahoo.de")]
+
+
+ NAME_PATTERN = r'<h1 title="(?P<N>.+?)"'
+ SIZE_PATTERN = r'<p class="meta">(?P<S>[\d.,]+) (?P<U>[\w_^]+)'
+ OFFLINE_PATTERN = r'<h1>404'
+
+ LINK_FREE_PATTERN = r'id="ddl-text" href="(.+?)"'
+
+
+ def setup(self):
+ self.multiDL = True
+ self.chunkLimit = 1
diff --git a/pyload/plugin/hoster/YadiSk.py b/pyload/plugin/hoster/YadiSk.py
new file mode 100644
index 000000000..28576d5d6
--- /dev/null
+++ b/pyload/plugin/hoster/YadiSk.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+
+import random
+import re
+
+from pyload.plugin.internal.SimpleHoster import SimpleHoster
+from pyload.utils import json_loads
+
+
+class YadiSk(SimpleHoster):
+ __name__ = "YadiSk"
+ __type__ = "hoster"
+ __version__ = "0.03"
+
+ __pattern__ = r'https?://yadi\.sk/d/\w+'
+
+ __description__ = """Yadi.sk hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("GammaC0de", None)]
+
+
+ OFFLINE_PATTERN = r'Nothing found'
+
+
+ def setup(self):
+ self.resumeDownload = False
+ self.multiDL = False
+ self.chunkLimit = 1
+
+
+ def handleFree(self, pyfile):
+ m = re.search(r'<script id="models-client" type="application/json">(.+?)</script>', self.html)
+ if m is None:
+ self.error(_("could not find required json data"))
+
+ res = json_loads(m.group(1))
+
+ yadisk_ver = None
+ yadisk_sk = None
+ yadisk_id = None
+ yadisk_size = None
+ yadisk_name = None
+
+ try: #@TODO: Copy to apiInfo
+ for sect in res:
+ if 'model' in sect:
+ if sect['model'] == "config":
+ yadisk_ver = sect['data']['version']
+ yadisk_sk = sect['data']['sk']
+
+ elif sect['model'] == "resource":
+ yadisk_id = sect['data']['id']
+ yadisk_size = sect['data']['meta']['size']
+ yadisk_name = sect['data']['name']
+
+ except Exception, e:
+ self.fail(_("Unexpected server response"), e)
+
+ if None in (yadisk_id, yadisk_sk, yadisk_id, yadisk_size, yadisk_name):
+ self.error(_("Missing JSON data"))
+
+ self.pyfile.size = yadisk_size
+ self.pyfile.name = yadisk_name
+
+ yadisk_idclient = ""
+ for _i in range(32):
+ yadisk_idclient += random.choice('0123456abcdef')
+
+ try:
+ self.html = self.load("https://yadi.sk/models/",
+ get={'_m': "do-get-resource-url"},
+ post={'idClient': yadisk_idclient,
+ 'version' : yadisk_ver,
+ '_model.0': "do-get-resource-url",
+ 'sk' : yadisk_sk,
+ 'id.0' : yadisk_id})
+
+ self.link = json_loads(self.html)['models'][0]['data']['file']
+
+ except Exception:
+ pass
diff --git a/pyload/plugin/internal/BasePlugin.py b/pyload/plugin/internal/BasePlugin.py
index 7c83ddef0..a0745f99a 100644
--- a/pyload/plugin/internal/BasePlugin.py
+++ b/pyload/plugin/internal/BasePlugin.py
@@ -41,16 +41,6 @@ class BasePlugin(Hoster):
self.resumeDownload = True
- #: Work-around to `filename*=UTF-8` bug; remove in 0.4.10
- def download(self, url, get={}, post={}, ref=True, cookies=True, disposition=False):
- try:
- if disposition:
- content = urllib2.urlopen(url).info()['Content-Disposition'].split(';')
- self.pyfile.name = content[1].split('filename=')[1][1:-1] or self.pyfile.name
- finally:
- return super(BasePlugin, self).download(url, get, post, ref, cookies, False)
-
-
def process(self, pyfile):
"""main function"""
diff --git a/pyload/plugin/internal/SimpleHoster.py b/pyload/plugin/internal/SimpleHoster.py
index 56170a4fd..fa48f1e25 100644
--- a/pyload/plugin/internal/SimpleHoster.py
+++ b/pyload/plugin/internal/SimpleHoster.py
@@ -307,7 +307,7 @@ class SimpleHoster(Hoster):
LOGIN_ACCOUNT = False #: Set to True to require account login
DISPOSITION = True #: Set to True to use any content-disposition value in http header as file name
- directLink = getFileURL # @TODO: Remove in 0.4.10
+ directLink = getFileURL #@TODO: Remove in 0.4.10
@classmethod
@@ -410,13 +410,13 @@ class SimpleHoster(Hoster):
self.resumeDownload = self.multiDL = self.premium
def prepare(self):
- self.pyfile.error = "" # @TODO: Remove in 0.4.10
+ self.pyfile.error = "" #@TODO: Remove in 0.4.10
self.info = {}
self.html = ""
- self.link = "" # @TODO: Move to hoster class in 0.4.10
- self.directDL = False # @TODO: Move to hoster class in 0.4.10
- self.multihost = False # @TODO: Move to hoster class in 0.4.10
+ self.link = "" #@TODO: Move to hoster class in 0.4.10
+ self.directDL = False #@TODO: Move to hoster class in 0.4.10
+ self.multihost = False #@TODO: Move to hoster class in 0.4.10
if not self.getConfig('use_premium', True):
self.retryFree()
@@ -480,7 +480,7 @@ class SimpleHoster(Hoster):
self.downloadLink(self.link, self.DISPOSITION)
self.checkFile()
- except Fail, e: # @TODO: Move to PluginThread in 0.4.10
+ except Fail, e: #@TODO: Move to PluginThread in 0.4.10
if self.premium:
self.logWarning(_("Premium download failed"))
self.retryFree()
@@ -711,7 +711,7 @@ class SimpleHoster(Hoster):
self.logInfo(_("Filesize: %i KiB, Traffic left for user %s: %i KiB") % (size, self.user, traffic))
return size <= traffic
- def getConfig(self, option, default=''): # @TODO: Remove in 0.4.10
+ def getConfig(self, option, default=''): #@TODO: Remove in 0.4.10
"""getConfig with default value - sublass may not implements all config options"""
try:
return self.getConf(option)
diff --git a/pyload/plugin/internal/XFSHoster.py b/pyload/plugin/internal/XFSHoster.py
index 0e265ce64..db2d2e1d0 100644
--- a/pyload/plugin/internal/XFSHoster.py
+++ b/pyload/plugin/internal/XFSHoster.py
@@ -29,7 +29,7 @@ class XFSHoster(SimpleHoster):
TEXT_ENCODING = False
DIRECT_LINK = None
- MULTI_HOSTER = True # @NOTE: Should be default to False for safe, but I'm lazy...
+ MULTI_HOSTER = True #@NOTE: Should be default to False for safe, but I'm lazy...
NAME_PATTERN = r'(Filename[ ]*:[ ]*</b>(</td><td nowrap>)?|name="fname"[ ]+value="|<[\w^_]+ class="(file)?name">)\s*(?P<N>.+?)(\s*<|")'
SIZE_PATTERN = r'(Size[ ]*:[ ]*</b>(</td><td>)?|File:.*>|</font>\s*\(|<[\w^_]+ class="size">)\s*(?P<S>[\d.,]+)\s*(?P<U>[\w^_]+)'
@@ -109,7 +109,7 @@ class XFSHoster(SimpleHoster):
self.logError(data['op'] if 'op' in data else _("UNKNOWN"))
return ""
- self.link = m.group(1).strip() # @TODO: Remove .strip() in 0.4.10
+ self.link = m.group(1).strip() #@TODO: Remove .strip() in 0.4.10
def handlePremium(self, pyfile):
return self.handleFree(pyfile)