summaryrefslogtreecommitdiffstats
path: root/module/plugins/crypter
diff options
context:
space:
mode:
authorGravatar Walter Purcaro <vuolter@gmail.com> 2014-11-13 23:47:36 +0100
committerGravatar Walter Purcaro <vuolter@gmail.com> 2014-11-13 23:47:36 +0100
commitbdfa8104065831bf0eb2f6a022552e8de725ed47 (patch)
tree4a43864e1bb257c7737a765d62899244b825a859 /module/plugins/crypter
parent[themes] Tiny code cosmetics (diff)
parent[Plugin] Some fixes by rlindner81 (diff)
downloadpyload-bdfa8104065831bf0eb2f6a022552e8de725ed47.tar.xz
Merge branch 'stable' into 0.4.10
Conflicts: module/plugins/accounts/MegaRapidCz.py module/plugins/accounts/ShareRapidCom.py module/plugins/crypter/HotfileComFolder.py module/plugins/crypter/HotfileFolderCom.py module/plugins/hoster/Keep2shareCC.py module/plugins/hoster/Keep2shareCc.py module/plugins/hoster/MegaCoNz.py module/plugins/hoster/MegaNz.py module/plugins/hoster/MegaRapidCz.py module/plugins/hoster/ShareRapidCom.py module/plugins/internal/CaptchaService.py pyload/api/__init__.py pyload/manager/AccountManager.py pyload/manager/PluginManager.py pyload/manager/thread/PluginThread.py pyload/network/HTTPRequest.py pyload/network/XDCCRequest.py pyload/plugins/Plugin.py pyload/plugins/account/BillionuploadsCom.py pyload/plugins/account/CramitIn.py pyload/plugins/account/EasybytezCom.py pyload/plugins/account/FastshareCz.py pyload/plugins/account/File4safeCom.py pyload/plugins/account/FileParadoxIn.py pyload/plugins/account/FileomCom.py pyload/plugins/account/FilerNet.py pyload/plugins/account/FilerioCom.py pyload/plugins/account/FourSharedCom.py pyload/plugins/account/Ftp.py pyload/plugins/account/Http.py pyload/plugins/account/HugefilesNet.py pyload/plugins/account/HundredEightyUploadCom.py pyload/plugins/account/LomafileCom.py pyload/plugins/account/MovReelCom.py pyload/plugins/account/MultishareCz.py pyload/plugins/account/MyfastfileCom.py pyload/plugins/account/NosuploadCom.py pyload/plugins/account/NovafileCom.py pyload/plugins/account/QuickshareCz.py pyload/plugins/account/RarefileNet.py pyload/plugins/account/RyushareCom.py pyload/plugins/account/SecureUploadEu.py pyload/plugins/account/SendmywayCom.py pyload/plugins/account/ShareRapidCom.py pyload/plugins/account/StahnuTo.py pyload/plugins/account/StreamcloudEu.py pyload/plugins/account/TusfilesNet.py pyload/plugins/account/UploadingCom.py pyload/plugins/account/UptoboxCom.py pyload/plugins/account/VidPlayNet.py pyload/plugins/addon/Checksum.py pyload/plugins/addon/ClickAndLoad.py pyload/plugins/addon/DeleteFinished.py pyload/plugins/addon/DownloadScheduler.py pyload/plugins/addon/ExternalScripts.py pyload/plugins/addon/ExtractArchive.py pyload/plugins/addon/HotFolder.py pyload/plugins/addon/IRCInterface.py pyload/plugins/addon/MergeFiles.py pyload/plugins/addon/MultiHome.py pyload/plugins/addon/RestartFailed.py pyload/plugins/addon/UnSkipOnFail.py pyload/plugins/addon/WindowsPhoneToastNotify.py pyload/plugins/addon/XMPPInterface.py pyload/plugins/base/Container.py pyload/plugins/base/Crypter.py pyload/plugins/base/Hook.py pyload/plugins/base/OCR.py pyload/plugins/container/RSDF.py pyload/plugins/crypter/DuploadOrgFolder.py pyload/plugins/crypter/EasybytezComFolder.py pyload/plugins/crypter/FiredriveComFolder.py pyload/plugins/crypter/HotfileFolderCom.py pyload/plugins/crypter/LinkSaveIn.py pyload/plugins/crypter/MultiuploadCom.py pyload/plugins/crypter/ShareRapidComFolder.py pyload/plugins/crypter/TusfilesNetFolder.py pyload/plugins/crypter/UploadableChFolder.py pyload/plugins/crypter/UploadedToFolder.py pyload/plugins/hook/Captcha9kw.py pyload/plugins/hook/MyfastfileCom.py pyload/plugins/hoster/BillionuploadsCom.py pyload/plugins/hoster/CramitIn.py pyload/plugins/hoster/EasybytezCom.py pyload/plugins/hoster/File4safeCom.py pyload/plugins/hoster/FileParadoxIn.py pyload/plugins/hoster/FilefactoryCom.py pyload/plugins/hoster/FileomCom.py pyload/plugins/hoster/FilerioCom.py pyload/plugins/hoster/FileshareInUa.py pyload/plugins/hoster/FiredriveCom.py pyload/plugins/hoster/Ftp.py pyload/plugins/hoster/HugefilesNet.py pyload/plugins/hoster/HundredEightyUploadCom.py pyload/plugins/hoster/Keep2shareCC.py pyload/plugins/hoster/LoadTo.py pyload/plugins/hoster/LomafileCom.py pyload/plugins/hoster/MegaNz.py pyload/plugins/hoster/MegacrypterCom.py pyload/plugins/hoster/MovReelCom.py pyload/plugins/hoster/MyvideoDe.py pyload/plugins/hoster/NosuploadCom.py pyload/plugins/hoster/NovafileCom.py pyload/plugins/hoster/PandaPlaNet.py pyload/plugins/hoster/PremiumTo.py pyload/plugins/hoster/RarefileNet.py pyload/plugins/hoster/RyushareCom.py pyload/plugins/hoster/SecureUploadEu.py pyload/plugins/hoster/SendmywayCom.py pyload/plugins/hoster/ShareRapidCom.py pyload/plugins/hoster/SockshareCom.py pyload/plugins/hoster/StreamcloudEu.py pyload/plugins/hoster/TurbobitNet.py pyload/plugins/hoster/TusfilesNet.py pyload/plugins/hoster/UptoboxCom.py pyload/plugins/hoster/VidPlayNet.py pyload/plugins/hoster/WebshareCz.py pyload/plugins/internal/DeadCrypter.py pyload/plugins/internal/DeadHoster.py pyload/plugins/internal/MultiHoster.py pyload/plugins/internal/SimpleCrypter.py pyload/plugins/internal/SimpleHoster.py pyload/plugins/internal/UpdateManager.py pyload/plugins/internal/XFSPAccount.py pyload/plugins/internal/XFSPHoster.py pyload/utils/__init__.py pyload/utils/packagetools.py pyload/webui/app/cnl.py
Diffstat (limited to 'module/plugins/crypter')
-rw-r--r--module/plugins/crypter/FilesonicComFolder.py15
-rw-r--r--module/plugins/crypter/HotfileComFolder.py16
-rw-r--r--module/plugins/crypter/JunocloudMeFolder.py20
-rw-r--r--module/plugins/crypter/LinkCryptWs.py343
-rw-r--r--module/plugins/crypter/MegaRapidCzFolder.py20
-rw-r--r--module/plugins/crypter/MegauploadComFolder.py15
-rw-r--r--module/plugins/crypter/RapidfileshareNetFolder.py20
-rw-r--r--module/plugins/crypter/SexuriaCom.py94
-rw-r--r--module/plugins/crypter/SharingmatrixComFolder.py15
-rw-r--r--module/plugins/crypter/WuploadComFolder.py15
-rw-r--r--module/plugins/crypter/XFileSharingProFolder.py47
11 files changed, 620 insertions, 0 deletions
diff --git a/module/plugins/crypter/FilesonicComFolder.py b/module/plugins/crypter/FilesonicComFolder.py
new file mode 100644
index 000000000..2d0540d26
--- /dev/null
+++ b/module/plugins/crypter/FilesonicComFolder.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.DeadCrypter import DeadCrypter
+
+
+class FilesonicComFolder(DeadCrypter):
+ __name__ = "FilesonicComFolder"
+ __type__ = "crypter"
+ __version__ = "0.12"
+
+ __pattern__ = r'http://(?:www\.)?filesonic\.com/folder/\w+'
+
+ __description__ = """Filesonic.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
diff --git a/module/plugins/crypter/HotfileComFolder.py b/module/plugins/crypter/HotfileComFolder.py
new file mode 100644
index 000000000..3fc8f6f63
--- /dev/null
+++ b/module/plugins/crypter/HotfileComFolder.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.DeadCrypter import DeadCrypter
+
+
+class HotfileComFolder(DeadCrypter):
+ __name__ = "HotfileComFolder"
+ __type__ = "crypter"
+ __version__ = "0.3"
+
+ __pattern__ = r'https?://(?:www\.)?hotfile\.com/list/\w+/\w+'
+ __config__ = []
+
+ __description__ = """Hotfile.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("RaNaN", "RaNaN@pyload.org")]
diff --git a/module/plugins/crypter/JunocloudMeFolder.py b/module/plugins/crypter/JunocloudMeFolder.py
new file mode 100644
index 000000000..509f1f7ec
--- /dev/null
+++ b/module/plugins/crypter/JunocloudMeFolder.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.XFSCrypter import XFSCrypter
+
+
+class JunocloudMeFolder(XFSCrypter):
+ __name__ = "JunocloudMeFolder"
+ __type__ = "crypter"
+ __version__ = "0.03"
+
+ __pattern__ = r'http://(?:www\.)?junocloud\.me/folders/(?P<ID>\d+/\w+)'
+ __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
+ ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+ __description__ = """Junocloud.me folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "junocloud.me"
diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py
new file mode 100644
index 000000000..67b1a3f02
--- /dev/null
+++ b/module/plugins/crypter/LinkCryptWs.py
@@ -0,0 +1,343 @@
+# -*- coding: utf-8 -*-
+
+import base64
+import binascii
+import re
+
+import pycurl
+
+from Crypto.Cipher import AES
+
+from module.plugins.Crypter import Crypter
+from module.utils import html_unescape
+
+
+class LinkCryptWs(Crypter):
+ __name__ = "LinkCryptWs"
+ __type__ = "crypter"
+ __version__ = "0.04"
+
+ __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P<ID>\w+)'
+
+ __description__ = """LinkCrypt.ws decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("kagenoshin", "kagenoshin[AT]gmx[DOT]ch"),
+ ("glukgluk", None)]
+
+
+ JK_KEY = "jk"
+ CRYPTED_KEY = "crypted"
+
+
+ def setup(self):
+ self.html = None
+ self.fileid = None
+ self.captcha = False
+ self.package = None
+
+ self.preferred_sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf', ] #['cnl', 'rsdf', 'ccf', 'dlc', 'web']
+
+
+ def prepare():
+ # Init
+ self.package = pyfile.package()
+ self.fileid = re.match(self.__pattern__, pyfile.url).group('ID')
+
+ self.req.cj.setCookie(".linkcrypt.ws", "language", "en")
+
+ # Request package
+ self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko") #better chance to not get those key-captchas
+ self.html = self.load(self.pyfile.url)
+
+
+ def decrypt(self, pyfile):
+ #check if we have js
+ if not self.js:
+ self.fail(_("Missing JS Engine"))
+
+ package_found = None
+
+ self.prepare()
+
+ if not self.isOnline():
+ self.offline()
+
+ if self.isKeyCaptchaProtected():
+ self.retry(4, 30, _("Can't handle Key-Captcha"))
+
+ if self.isCaptchaProtected():
+ self.captcha = True
+ self.unlockCaptchaProtection()
+ self.handleCaptchaErrors()
+
+ # Check for protection
+ if self.isPasswordProtected():
+ self.unlockPasswordProtection()
+ self.handleErrors()
+
+ # get unrar password
+ self.getunrarpw()
+
+ # Get package name and folder
+ package_name, folder_name = self.getPackageInfo()
+
+ #get the container definitions from script section
+ self.get_container_html()
+
+ # Extract package links
+ package_links = []
+
+ for type_ in self.preferred_sources:
+ links = self.handleLinkSource(type_)
+ if links:
+ if isinstance(links, list):
+ package_links.extend(links)
+ else:
+ package_found = True
+ break
+
+ package_links = set(package_links)
+
+ # Pack
+ if package_links:
+ self.packages = [(package_name, package_links, folder_name)]
+
+ elif package_found:
+ self.core.api.deletePackages([self.package.id])
+
+
+ def isOnline(self):
+ if "<title>Linkcrypt.ws // Error 404</title>" in self.html:
+ self.logDebug("folder doesen't exist anymore")
+ return False
+ else:
+ return True
+
+
+ def isPasswordProtected(self):
+ if "Authorizing" in self.html:
+ self.logDebug("Links are password protected")
+ return True
+ else:
+ return False
+
+
+ def isCaptchaProtected(self):
+ if 'id="captcha">' in self.html:
+ self.logDebug("Links are captcha protected")
+ return True
+ else:
+ return False
+
+
+ def isKeyCaptchaProtected(self):
+ if re.search(r'Key[ -]', self.html, re.I):
+ return True
+ else:
+ return False
+
+
+ def unlockPasswordProtection(self):
+ password = self.getPassword()
+
+ if password:
+ self.logDebug("Submitting password [%s] for protected links" % password)
+ self.html = self.load(self.pyfile.url, post={"password": password, 'x': "0", 'y': "0"})
+ else:
+ self.fail(_("Folder is password protected"))
+
+
+ def unlockCaptchaProtection(self):
+ captcha_url = re.search(r'<form.*?id\s*?=\s*?"captcha"[^>]*?>.*?<\s*?input.*?src="([^"]*?)"', self.html, re.I | re.S).group(1)
+ captcha_code = self.decryptCaptcha(captcha_url, forceUser=True, imgtype="gif", result_type='positional')
+
+ self.html = self.load(self.pyfile.url, post={"x": captcha_code[0], "y": captcha_code[1]})
+
+
+ def getPackageInfo(self):
+ name = self.pyfile.package().name
+ folder = self.pyfile.package().folder
+
+ self.logDebug("Defaulting to pyfile name [%s] and folder [%s] for package" % (name, folder))
+
+ return name, folder
+
+
+ def getunrarpw(self):
+ sitein = self.html
+ indexi = sitein.find("|source|") + 8
+ indexe = sitein.find("|",indexi)
+
+ unrarpw = sitein[indexi:indexe]
+
+ if not (unrarpw == "Password" or "Dateipasswort") :
+ self.logDebug("File password set to: [%s]"% unrarpw)
+ self.pyfile.package().password = unrarpw
+
+
+ def handleErrors(self):
+ if self.isPasswordProtected():
+ self.fail(_("Incorrect password"))
+
+
+ def handleCaptchaErrors(self):
+ if self.captcha:
+ if "Your choice was wrong!" in self.html:
+ self.invalidCaptcha()
+ self.retry()
+ else:
+ self.correctCaptcha()
+
+
+ def handleLinkSource(self, type_):
+ if type_ is 'cnl':
+ return self.handleCNL2()
+
+ elif type_ is 'web':
+ return self.handleWebLinks()
+
+ elif type_ in ('rsdf', 'ccf', 'dlc'):
+ return self.handleContainer(type_)
+
+ else:
+ self.error(_("Unknown source type: %s") % type_)
+
+
+ def handleWebLinks(self):
+ self.logDebug("Search for Web links ")
+
+ package_links = []
+ pattern = r'<form action="http://linkcrypt.ws/out.html"[^>]*?>.*?<input[^>]*?value="([^"]*?)"[^>]*?name="file"'
+ ids = re.findall(pattern, self.html, re.I | re.S)
+
+ self.logDebug("Decrypting %d Web links" % len(ids))
+
+ for idx, weblink_id in enumerate(ids):
+ try:
+ self.logDebug("Decrypting Web link %d, %s" % (idx + 1, weblink_id))
+
+ res = self.load("http://linkcrypt.ws/out.html", post = {'file':weblink_id})
+
+ indexs = res.find("window.location =") + 19
+ indexe = res.find('"', indexs)
+
+ link2 = res[indexs:indexe]
+
+ self.logDebug(link2)
+
+ link2 = html_unescape(link2)
+ package_links.append(link2)
+
+ except Exception, detail:
+ self.logDebug("Error decrypting Web link %s, %s" % (weblink_id, detail))
+
+ return package_links
+
+
+ def get_container_html(self):
+ self.container_html = []
+
+ script = re.search(r'<div.*?id="ad_cont".*?<script.*?javascrip[^>]*?>(.*?)</script', self.html, re.I | re.S)
+
+ if script:
+ container_html_text = script.group(1)
+ container_html_text.strip()
+ self.container_html = container_html_text.splitlines()
+
+
+ def handle_javascript(self, line):
+ return self.js.eval(line.replace('{}))',"{}).replace('document.open();document.write','').replace(';document.close();',''))"))
+
+
+ def handleContainer(self, type_):
+ package_links = []
+ type_ = type_.lower()
+
+ self.logDebug('Search for %s Container links' % type_.upper())
+
+ if not type_.isalnum(): # check to prevent broken re-pattern (cnl2,rsdf,ccf,dlc,web are all alpha-numeric)
+ self.error(_("unknown container type: %s") % type_)
+
+ for line in self.container_html:
+ if(type_ in line):
+ jseval = self.handle_javascript(line)
+ clink = re.search(r'href=["\']([^"\']*?)["\']',jseval,re.I)
+
+ if not clink:
+ continue
+
+ self.logDebug("clink avaible")
+
+ package_name, folder_name = self.getPackageInfo()
+ self.logDebug("Added package with name %s.%s and container link %s" %( package_name, type_, clink.group(1)))
+ self.core.api.uploadContainer( "%s.%s" %(package_name, type_), self.load(clink.group(1)))
+ return "Found it"
+
+ return package_links
+
+
+ def handleCNL2(self):
+ self.logDebug("Search for CNL links")
+
+ package_links = []
+ cnl_line = None
+
+ for line in self.container_html:
+ if("cnl" in line):
+ cnl_line = line
+ break
+
+ if cnl_line:
+ self.logDebug("cnl_line gefunden")
+
+ try:
+ cnl_section = self.handle_javascript(cnl_line)
+ (vcrypted, vjk) = self._getCipherParams(cnl_section)
+ for (crypted, jk) in zip(vcrypted, vjk):
+ package_links.extend(self._getLinks(crypted, jk))
+ except:
+ self.logError(_("Unable to decrypt CNL links (JS Error) try to get over links"))
+ return self.handleWebLinks()
+
+ return package_links
+
+
+ def _getCipherParams(self, cnl_section):
+ # Get jk
+ jk_re = r'<INPUT.*?NAME="%s".*?VALUE="(.*?)"' % LinkCryptWs.JK_KEY
+ vjk = re.findall(jk_re, cnl_section)
+
+ # Get crypted
+ crypted_re = r'<INPUT.*?NAME="%s".*?VALUE="(.*?)"' % LinkCryptWs.CRYPTED_KEY
+ vcrypted = re.findall(crypted_re, cnl_section)
+
+ # Log and return
+ self.logDebug("Detected %d crypted blocks" % len(vcrypted))
+ return vcrypted, vjk
+
+
+ def _getLinks(self, crypted, jk):
+ # Get key
+ jreturn = self.js.eval("%s f()" % jk)
+ key = binascii.unhexlify(jreturn)
+
+ self.logDebug("JsEngine returns value [%s]" % jreturn)
+
+ # Decode crypted
+ crypted = base64.standard_b64decode(crypted)
+
+ # Decrypt
+ Key = key
+ IV = key
+ obj = AES.new(Key, AES.MODE_CBC, IV)
+ text = obj.decrypt(crypted)
+
+ # Extract links
+ text = text.replace("\x00", "").replace("\r", "")
+ links = text.split("\n")
+ links = filter(lambda x: x != "", links)
+
+ # Log and return
+ self.logDebug("Package has %d links" % len(links))
+
+ return links
diff --git a/module/plugins/crypter/MegaRapidCzFolder.py b/module/plugins/crypter/MegaRapidCzFolder.py
new file mode 100644
index 000000000..d9fb828a8
--- /dev/null
+++ b/module/plugins/crypter/MegaRapidCzFolder.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.SimpleCrypter import SimpleCrypter
+
+
+class MegaRapidCzFolder(SimpleCrypter):
+ __name__ = "MegaRapidCzFolder"
+ __type__ = "crypter"
+ __version__ = "0.02"
+
+ __pattern__ = r'http://(?:www\.)?(share|mega)rapid\.cz/slozka/\d+/\w+'
+ __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
+ ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+ __description__ = """Share-Rapid.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
+
+
+ LINK_PATTERN = r'<td class="soubor"[^>]*><a href="([^"]+)">'
diff --git a/module/plugins/crypter/MegauploadComFolder.py b/module/plugins/crypter/MegauploadComFolder.py
new file mode 100644
index 000000000..1d487ed61
--- /dev/null
+++ b/module/plugins/crypter/MegauploadComFolder.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.DeadCrypter import DeadCrypter
+
+
+class MegauploadComFolder(DeadCrypter):
+ __name__ = "MegauploadComFolder"
+ __type__ = "crypter"
+ __version__ = "0.02"
+
+ __pattern__ = r'http://(?:www\.)?megaupload\.com/(\?f|xml/folderfiles\.php\?.*&?folderid)=\w+'
+
+ __description__ = """Megaupload.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
diff --git a/module/plugins/crypter/RapidfileshareNetFolder.py b/module/plugins/crypter/RapidfileshareNetFolder.py
new file mode 100644
index 000000000..5531d5a90
--- /dev/null
+++ b/module/plugins/crypter/RapidfileshareNetFolder.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.XFSCrypter import XFSCrypter
+
+
+class RapidfileshareNetFolder(XFSCrypter):
+ __name__ = "RapidfileshareNetFolder"
+ __type__ = "crypter"
+ __version__ = "0.03"
+
+ __pattern__ = r'http://(?:www\.)?rapidfileshare\.net/users/\w+/\d+/\w+'
+ __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
+ ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+ __description__ = """Rapidfileshare.net folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("guidobelix", "guidobelix@hotmail.it")]
+
+
+ HOSTER_DOMAIN = "rapidfileshare.net"
diff --git a/module/plugins/crypter/SexuriaCom.py b/module/plugins/crypter/SexuriaCom.py
new file mode 100644
index 000000000..3c952fd6b
--- /dev/null
+++ b/module/plugins/crypter/SexuriaCom.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from module.plugins.Crypter import Crypter
+
+
+class SexuriaCom(Crypter):
+ __name__ = "SexuriaCom"
+ __type__ = "crypter"
+ __version__ = "0.01"
+
+ __pattern__ = r'http://(?:www\.)?sexuria\.com/(v1/)?(Pornos_Kostenlos_.+?_(\d+)\.html|dl_links_\d+_\d+\.html|id=\d+\&part=\d+\&link=\d+)'
+ __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
+ ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+ __description__ = """Sexuria.com decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("NETHead", "NETHead.AT.gmx.DOT.net")]
+
+
+ PATTERN_SUPPORTED_MAIN = re.compile(r'http://(www\.)?sexuria\.com/(v1/)?Pornos_Kostenlos_.+?_(\d+)\.html', flags=re.I)
+ PATTERN_SUPPORTED_CRYPT = re.compile(r'http://(www\.)?sexuria\.com/(v1/)?dl_links_\d+_(?P<ID>\d+)\.html', flags=re.I)
+ PATTERN_SUPPORTED_REDIRECT = re.compile(r'http://(www\.)?sexuria\.com/out\.php\?id=(?P<ID>\d+)\&part=\d+\&link=\d+', flags=re.I)
+ PATTERN_TITLE = re.compile(r'<title> - (?P<TITLE>.*) Sexuria - Kostenlose Pornos - Rapidshare XXX Porn</title>', flags=re.I)
+ PATTERN_PASSWORD = re.compile(r'<strong>Passwort: </strong></div></td>.*?bgcolor="#EFEFEF">(?P<PWD>.*?)</td>', flags=re.I | re.S)
+ PATTERN_DL_LINK_PAGE = re.compile(r'"(dl_links_\d+_\d+\.html)"', flags=re.I)
+ PATTERN_REDIRECT_LINKS = re.compile(r'value="(http://sexuria\.com/out\.php\?id=\d+\&part=\d+\&link=\d+)" readonly', flags=re.I)
+
+
+ def decrypt(self, pyfile):
+ # Init
+ self.pyfile = pyfile
+ self.package = pyfile.package()
+
+ # Get package links
+ package_name, self.links, folder_name, package_pwd = self.decryptLinks(self.pyfile.url)
+ self.packages = [(package_name, self.links, folder_name)]
+
+
+ def decryptLinks(self, url):
+ linklist = []
+ name = self.package.name
+ folder = self.package.folder
+ password = None
+
+ if re.match(self.PATTERN_SUPPORTED_MAIN, url):
+ # Processing main page
+ html = self.load(url)
+ links = re.findall(self.PATTERN_DL_LINK_PAGE, html)
+ for link in links:
+ linklist.append("http://sexuria.com/v1/" + link)
+
+ elif re.match(self.PATTERN_SUPPORTED_REDIRECT, url):
+ # Processing direct redirect link (out.php), redirecting to main page
+ id = re.search(self.PATTERN_SUPPORTED_REDIRECT, url).group('ID')
+ if id:
+ linklist.append("http://sexuria.com/v1/Pornos_Kostenlos_liebe_%s.html" % id)
+
+ elif re.match(self.PATTERN_SUPPORTED_CRYPT, url):
+ # Extract info from main file
+ id = re.search(self.PATTERN_SUPPORTED_CRYPT, url).group('ID')
+ html = self.load("http://sexuria.com/v1/Pornos_Kostenlos_info_%s.html" % id, decode=True)
+
+ title = re.search(self.PATTERN_TITLE, html).group('TITLE').strip()
+ if title:
+ name = folder = title
+ self.logDebug("Package info found, name [%s] and folder [%s]" % (name, folder))
+
+ pwd = re.search(self.PATTERN_PASSWORD, html).group('PWD')
+ if pwd:
+ password = pwd.strip()
+ self.logDebug("Password info [%s] found" % password)
+
+ # Process link (dl_link)
+ html = self.load(url)
+ links = re.findall(self.PATTERN_REDIRECT_LINKS, html)
+ if len(links) == 0:
+ self.LogError("Broken for link %s" % link)
+ else:
+ for link in links:
+ link = link.replace("http://sexuria.com/", "http://www.sexuria.com/")
+ finallink = self.load(link, just_header=True)['location']
+ if not finallink or "sexuria.com/" in finallink:
+ self.LogError("Broken for link %s" % link)
+ else:
+ linklist.append(finallink)
+
+ # Debug log
+ self.logDebug("%d supported links" % len(linklist))
+ for i, link in enumerate(linklist):
+ self.logDebug("Supported link %d, %s" % (i + 1, link))
+
+ return name, linklist, folder, password
diff --git a/module/plugins/crypter/SharingmatrixComFolder.py b/module/plugins/crypter/SharingmatrixComFolder.py
new file mode 100644
index 000000000..ddc3bdb37
--- /dev/null
+++ b/module/plugins/crypter/SharingmatrixComFolder.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.DeadCrypter import DeadCrypter
+
+
+class SharingmatrixComFolder(DeadCrypter):
+ __name__ = "SharingmatrixComFolder"
+ __type__ = "crypter"
+ __version__ = "0.01"
+
+ __pattern__ = r'http://(?:www\.)?sharingmatrix\.com/folder/\w+'
+
+ __description__ = """Sharingmatrix.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
diff --git a/module/plugins/crypter/WuploadComFolder.py b/module/plugins/crypter/WuploadComFolder.py
new file mode 100644
index 000000000..b77bc3e67
--- /dev/null
+++ b/module/plugins/crypter/WuploadComFolder.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+from module.plugins.internal.DeadCrypter import DeadCrypter
+
+
+class WuploadComFolder(DeadCrypter):
+ __name__ = "WuploadComFolder"
+ __type__ = "crypter"
+ __version__ = "0.01"
+
+ __pattern__ = r'http://(?:www\.)?wupload\.com/folder/\w+'
+
+ __description__ = """Wupload.com folder decrypter plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("zoidberg", "zoidberg@mujmail.cz")]
diff --git a/module/plugins/crypter/XFileSharingProFolder.py b/module/plugins/crypter/XFileSharingProFolder.py
new file mode 100644
index 000000000..dffd8909c
--- /dev/null
+++ b/module/plugins/crypter/XFileSharingProFolder.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from module.plugins.internal.XFSCrypter import XFSCrypter
+
+
+class XFileSharingProFolder(XFSCrypter):
+ __name__ = "XFileSharingProFolder"
+ __type__ = "crypter"
+ __version__ = "0.03"
+
+ __pattern__ = r'^unmatchable$'
+ __config__ = [("use_subfolder", "bool", "Save package to subfolder", True),
+ ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+ __description__ = """XFileSharingPro dummy folder decrypter plugin for hook"""
+ __license__ = "GPLv3"
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ def _log(self, type, args):
+ msg = " | ".join([str(a).strip() for a in args if a])
+ logger = getattr(self.log, type)
+ logger("%s: %s: %s" % (self.__name__, self.HOSTER_NAME, msg or _("%s MARK" % type.upper())))
+
+
+ def init(self):
+ super(XFileSharingProFolder, self).init()
+
+ self.__pattern__ = self.core.pluginManager.crypterPlugins[self.__name__]['pattern']
+
+ self.HOSTER_DOMAIN = re.match(self.__pattern__, self.pyfile.url).group(1).lower()
+ self.HOSTER_NAME = "".join([str.capitalize() for str in self.HOSTER_DOMAIN.split('.')])
+
+ account = self.core.accountManager.getAccountPlugin(self.HOSTER_NAME)
+
+ if account and account.canUse():
+ self.account = account
+ elif self.account:
+ self.account.HOSTER_DOMAIN = self.HOSTER_DOMAIN
+ else:
+ return
+
+ self.user, data = self.account.selectAccount()
+ self.req = self.account.getAccountRequest(self.user)
+ self.premium = self.account.isPremium(self.user)