summaryrefslogtreecommitdiffstats
path: root/module/plugins/crypter
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/crypter')
-rw-r--r--module/plugins/crypter/C1neonCom.py133
-rw-r--r--module/plugins/crypter/DdlstorageComFolder.py32
-rw-r--r--module/plugins/crypter/DontKnowMe.py21
-rw-r--r--module/plugins/crypter/DuckCryptInfo.py57
-rw-r--r--module/plugins/crypter/EmbeduploadCom.py17
-rw-r--r--module/plugins/crypter/LinkdecrypterCom.py39
-rw-r--r--module/plugins/crypter/LixIn.py6
-rw-r--r--module/plugins/crypter/MediafireComFolder.py4
-rw-r--r--module/plugins/crypter/SerienjunkiesOrg.py269
-rw-r--r--module/plugins/crypter/TrailerzoneInfo.py45
10 files changed, 519 insertions, 104 deletions
diff --git a/module/plugins/crypter/C1neonCom.py b/module/plugins/crypter/C1neonCom.py
new file mode 100644
index 000000000..36b84764e
--- /dev/null
+++ b/module/plugins/crypter/C1neonCom.py
@@ -0,0 +1,133 @@
+# -*- 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: godofdream
+"""
+
+import re
+import random
+from module.plugins.Crypter import Crypter
+from module.common.json_layer import json_loads
+class C1neonCom(Crypter):
+ __name__ = "C1neonCom"
+ __type__ = "container"
+ __pattern__ = r"http://(www\.)?c1neon.com/.*?"
+ __version__ = "0.05"
+ __config__ = [
+ ("changeNameS", "Packagename;Show;Season;Episode", "Rename Show by", "Show"),
+ ("changeName", "Packagename;Movie", "Rename Movie by", "Movie"),
+ ("useStreams", "bool", "Use Streams too", False),
+ ("hosterListMode", "all;onlypreferred", "Use for hosters (if supported)", "all"),
+ ("randomPreferred", "bool", "Randomize Preferred-List", False),
+ ("hosterList", "str", "Preferred Hoster list (comma separated, no ending)", "2shared,Bayfiles,Netload,Rapidshare,Share-online"),
+ ("ignoreList", "str", "Ignored Hoster list (comma separated, no ending)", "Megaupload")
+ ]
+ __description__ = """C1neon.Com Container Plugin"""
+ __author_name__ = ("godofdream")
+ __author_mail__ = ("soilfiction@gmail.com")
+
+ VALUES_PATTERN = r"var subcats = (.*?)(;</script>|;var)"
+ SHOW_PATTERN = r"title='(.*?)'"
+ SERIE_PATTERN = r"<title>.*Serie.*</title>"
+
+ def decrypt(self, pyfile):
+ src = self.req.load(str(pyfile.url))
+
+ pattern = re.compile(self.VALUES_PATTERN, re.DOTALL)
+ data = json_loads(re.search(pattern, src).group(1))
+
+ # Get package info
+ links = []
+ Showname = re.search(self.SHOW_PATTERN, src)
+ if Showname:
+ Showname = Showname.group(1).decode("utf-8")
+ else:
+ Showname = self.pyfile.package().name
+
+ if re.search(self.SERIE_PATTERN, src):
+ for Season in data:
+ self.logDebug("Season " + Season)
+ for Episode in data[Season]:
+ self.logDebug("Episode " + Episode)
+ links.extend(self.getpreferred(data[Season][Episode]))
+ if self.getConfig("changeNameS") == "Episode":
+ self.packages.append((data[Season][Episode]['info']['name'].split("»")[0], links, data[Season][Episode]['info']['name'].split("»")[0]))
+ links = []
+
+ if self.getConfig("changeNameS") == "Season":
+ self.packages.append((Showname + " Season " + Season, links, Showname + " Season " + Season))
+ links = []
+
+ if self.getConfig("changeNameS") == "Show":
+ if links == []:
+ self.fail('Could not extract any links (Out of Date?)')
+ else:
+ self.packages.append((Showname, links, Showname))
+
+ elif self.getConfig("changeNameS") == "Packagename":
+ if links == []:
+ self.fail('Could not extract any links (Out of Date?)')
+ else:
+ self.core.files.addLinks(links, self.pyfile.package().id)
+ else:
+ for Movie in data:
+ links.extend(self.getpreferred(data[Movie]))
+ if self.getConfig("changeName") == "Movie":
+ if links == []:
+ self.fail('Could not extract any links (Out of Date?)')
+ else:
+ self.packages.append((Showname, links, Showname))
+
+ elif self.getConfig("changeName") == "Packagename":
+ if links == []:
+ self.fail('Could not extract any links (Out of Date?)')
+ else:
+ self.core.files.addLinks(links, self.pyfile.package().id)
+
+ #selects the preferred hoster, after that selects any hoster (ignoring the one to ignore)
+ #selects only one Hoster
+ def getpreferred(self, hosterslist):
+ hosterlist = {}
+ if 'u' in hosterslist:
+ hosterlist.update(hosterslist['u'])
+ if ('d' in hosterslist):
+ hosterlist.update(hosterslist['d'])
+ if self.getConfig("useStreams") and 's' in hosterslist:
+ hosterlist.update(hosterslist['s'])
+
+ result = []
+ preferredList = self.getConfig("hosterList").strip().lower().replace('|',',').replace('.','').replace(';',',').split(',')
+ if self.getConfig("randomPreferred") == True:
+ random.shuffle(preferredList)
+ for preferred in preferredList:
+ for Hoster in hosterlist:
+ if preferred == Hoster.split('<')[0].strip().lower().replace('.',''):
+ for Part in hosterlist[Hoster]:
+ self.logDebug("selected " + Part[3])
+ result.append(str(Part[3]))
+ return result
+
+ ignorelist = self.getConfig("ignoreList").strip().lower().replace('|',',').replace('.','').replace(';',',').split(',')
+ if self.getConfig('hosterListMode') == "all":
+ for Hoster in hosterlist:
+ if Hoster.split('<')[0].strip().lower().replace('.','') not in ignorelist:
+ for Part in hosterlist[Hoster]:
+ self.logDebug("selected " + Part[3])
+ result.append(str(Part[3]))
+ return result
+ return result
+
+
+
diff --git a/module/plugins/crypter/DdlstorageComFolder.py b/module/plugins/crypter/DdlstorageComFolder.py
new file mode 100644
index 000000000..d536032c6
--- /dev/null
+++ b/module/plugins/crypter/DdlstorageComFolder.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+
+import re
+from module.plugins.Crypter import Crypter
+from module.plugins.hoster.MediafireCom import checkHTMLHeader
+from module.common.json_layer import json_loads
+
+class DdlstorageComFolder(Crypter):
+ __name__ = "DdlstorageComFolder"
+ __type__ = "crypter"
+ __pattern__ = r"http://(?:\w*\.)*?ddlstorage.com/folder/\w{10}"
+ __version__ = "0.01"
+ __description__ = """DDLStorage.com Folder Plugin"""
+ __author_name__ = ("godofdream")
+ __author_mail__ = ("soilfiction@gmail.com")
+
+ FILE_URL_PATTERN = '<a style="text-decoration:none;" href="http://www.ddlstorage.com/(.*)">'
+
+ def decrypt(self, pyfile):
+ new_links = []
+ # load and parse html
+ html = self.load(pyfile.url)
+ found = re.findall(self.FILE_URL_PATTERN, html)
+ self.logDebug(found)
+ for link in found:
+ # file page
+ new_links.append("http://www.ddlstorage.com/%s" % link)
+
+ if new_links:
+ self.core.files.addLinks(new_links, self.pyfile.package().id)
+ else:
+ self.fail('Could not extract any links')
diff --git a/module/plugins/crypter/DontKnowMe.py b/module/plugins/crypter/DontKnowMe.py
new file mode 100644
index 000000000..dfa72df47
--- /dev/null
+++ b/module/plugins/crypter/DontKnowMe.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+
+import re
+import urllib
+
+from module.plugins.Crypter import Crypter
+
+class DontKnowMe(Crypter):
+ __name__ = "DontKnowMe"
+ __type__ = "crypter"
+ __pattern__ = r"http://dontknow.me/at/\?.+$"
+ __version__ = "0.1"
+ __description__ = """DontKnowMe"""
+ __author_name__ = ("selaux")
+ __author_mail__ = ("")
+
+ LINK_PATTERN = r"http://dontknow.me/at/\?(.+)$"
+
+ def decrypt(self, pyfile):
+ link = re.findall(self.LINK_PATTERN, self.pyfile.url)[0]
+ self.core.files.addLinks([ urllib.unquote(link) ], self.pyfile.package().id)
diff --git a/module/plugins/crypter/DuckCryptInfo.py b/module/plugins/crypter/DuckCryptInfo.py
new file mode 100644
index 000000000..6e7166ff8
--- /dev/null
+++ b/module/plugins/crypter/DuckCryptInfo.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+
+import re
+from module.lib.BeautifulSoup import BeautifulSoup
+from module.plugins.Crypter import Crypter
+
+class DuckCryptInfo(Crypter):
+ __name__ = "DuckCryptInfo"
+ __type__ = "container"
+ __pattern__ = r"http://(?:www\.)?duckcrypt.info/(folder|wait|link)/(\w+)/?(\w*)"
+ __version__ = "0.01"
+ __description__ = """DuckCrypt.Info Container Plugin"""
+ __author_name__ = ("godofdream")
+ __author_mail__ = ("soilfiction@gmail.com")
+
+ TIMER_PATTERN = r'<span id="timer">(.*)</span>'
+
+ def decrypt(self, pyfile):
+ url = pyfile.url
+ # seems we don't need to wait
+ #src = self.req.load(str(url))
+ #found = re.search(self.TIMER_PATTERN, src)
+ #if found:
+ # self.logDebug("Sleeping for" % found.group(1))
+ # self.setWait(int(found.group(1)) ,False)
+ found = re.search(self.__pattern__, url)
+ if not found:
+ self.fail('Weird error in link')
+ if str(found.group(1)) == "link":
+ self.handleLink(url)
+ else:
+ self.handleFolder(found)
+
+
+
+ def handleFolder(self, found):
+ src = self.load("http://duckcrypt.info/ajax/auth.php?hash=" + str(found.group(2)))
+ found = re.search(self.__pattern__, src)
+ self.logDebug("Redirectet to " + str(found.group(0)))
+ src = self.load(str(found.group(0)))
+ soup = BeautifulSoup(src)
+ cryptlinks = soup.find("div", attrs={"class": "folderbox"}).findAll("a")
+ self.logDebug("Redirectet to " + str(cryptlinks))
+ if not cryptlinks:
+ self.fail('no links found - (Plugin out of date?)')
+ for clink in cryptlinks:
+ self.handleLink(clink['href'])
+
+ def handleLink(self, url):
+ src = self.load(url)
+ soup = BeautifulSoup(src)
+ link = soup.find("iframe")["src"]
+ if not link:
+ self.logDebug('no links found - (Plugin out of date?)')
+ else:
+ self.core.files.addLinks([link], self.pyfile.package().id)
+
diff --git a/module/plugins/crypter/EmbeduploadCom.py b/module/plugins/crypter/EmbeduploadCom.py
index e84a06cc1..8fd70882f 100644
--- a/module/plugins/crypter/EmbeduploadCom.py
+++ b/module/plugins/crypter/EmbeduploadCom.py
@@ -2,12 +2,13 @@
import re
from module.plugins.Crypter import Crypter
+from module.network.HTTPRequest import BadHeader
class EmbeduploadCom(Crypter):
__name__ = "EmbeduploadCom"
__type__ = "crypter"
__pattern__ = r"http://(www\.)?embedupload.com/\?d=.*"
- __version__ = "0.01"
+ __version__ = "0.02"
__description__ = """EmbedUpload.com crypter"""
__config__ = [("preferedHoster", "str", "Prefered hoster list (bar-separated) ", "embedupload"),
("ignoredHoster", "str", "Ignored hoster list (bar-separated) ", "")]
@@ -18,7 +19,8 @@ class EmbeduploadCom(Crypter):
def decrypt(self, pyfile):
self.html = self.load(self.pyfile.url, decode=True)
- tmp_links = new_links = []
+ tmp_links = []
+ new_links = []
found = re.findall(self.LINK_PATTERN, self.html)
if found:
@@ -32,7 +34,7 @@ class EmbeduploadCom(Crypter):
ignored_set = set(self.getConfig("ignoredHoster").split('|'))
ignored_set = map(lambda s: s.lower().split('.')[0], ignored_set)
print "IG", ignored_set
- tmp_links.extend([x[1] for x in found if x[0] in ignored_set])
+ tmp_links.extend([x[1] for x in found if x[0] not in ignored_set])
self.getLocation(tmp_links, new_links)
if new_links:
@@ -42,8 +44,11 @@ class EmbeduploadCom(Crypter):
def getLocation(self, tmp_links, new_links):
for link in tmp_links:
- header = self.load(link, just_header = True)
- if "location" in header:
- new_links.append(header['location'])
+ try:
+ header = self.load(link, just_header = True)
+ if "location" in header:
+ new_links.append(header['location'])
+ except BadHeader:
+ pass
\ No newline at end of file
diff --git a/module/plugins/crypter/LinkdecrypterCom.py b/module/plugins/crypter/LinkdecrypterCom.py
index 83c74188d..ff21916ef 100644
--- a/module/plugins/crypter/LinkdecrypterCom.py
+++ b/module/plugins/crypter/LinkdecrypterCom.py
@@ -22,22 +22,21 @@ from module.plugins.Crypter import Crypter
class LinkdecrypterCom(Crypter):
__name__ = "LinkdecrypterCom"
__type__ = "crypter"
- #excluded: "1kh\.de|crypt-it\.com|linksave\.in|lix\.in|lof\.cc|multiload\.cz|multiupload\.com|ncrypt\.in|relink\.us|rs-layer\.com|secured\.in|stealth\.to"
- __pattern__ = r"http://(\w*\.)?(00\.uz|10001mb\.com|123link\.it|123url\.org|1cl\.in|1tool\.biz|1zh\.us|2joy\.de|2so\.be|3\.ly|5\.gp|6nc\.net|7li\.in|9\.bb|adf\.ly|adflav\.com|adfoc\.us|allanalpass\.com|alturl\.com|amy\.gs|any\.gs|apurl\.ru|aurl\.es|b23\.ru|baberepublic\.com|bai\.lu|bat5\.com|bax\.li|bc\.vc|beam\.to|birurl\.com|bit\.ly|blu\.cc|bofh\.us|boo\.io|c\.ly|capourl\.com|cash4links\.co|cc\.st|cd\.vg|cl\.lk|cli\.gs|cloneurl\.com|convertircodigo\.com|crypt\.to|crypt2\.be|cryptlink\.ws|ddl-warez\.in|deb\.gs|deurl\.me|digzip\.com|djurl\.com|dl-protect\.com|dl\.dropbox\.com|doiop\.com|ehe\.me|embedupload\.com|encript\.in|encurtador\.com|enlacs\.com|evg\.in|extreme-protect\.com|fa\.by|faja\.me|fapoff\.com|fdnlinks\.com|fea\.me|fff\.to|filedeck\.net|filemirrorupload\.com|filesonthe\.net|fileupster\.com|flameupload\.com|freetexthost\.com|fwd4\.me|fyad\.org|galleries\.bz|goandgrab\.info|goblig\.com|goo\.gl|guardlink\.org|h-url\.in|hasurl\.co\.cc|hide-url\.net|hidemyass\.com|hides\.at|hideurl\.biz|ho\.io|hornywood\.tv|href\.hu|id2\.tryjav\.com|ilii\.in|ilix\.in|ily\.me|ino\.me|interupload\.com|is\.gd|ivpaste\.com|j\.mp|j7\.se|je\.pl|jheberg\.com|just\.as|kickupload\.com|klnk\.de|knoffl\.com|kodo\.ameoto\.com|ks\.gs|latwy\.pl|li\.co\.ve|link-go\.info|link-protector\.com|link-safe\.net|link\.file-up\.ru|link4jo\.com|linkanonimo\.com|linkbabes\.com|linkbank\.eu|linkbee\.com|linkblur\.com|linkbucks\.com|linkbun\.ch|linkcrypt\.com|linkcrypt\.ws|linkencrypter\.com|linkhide\.com\.ar|linkhide\.in|linkoculto\.net|linkok\.org|linkprivado\.com|linkprivate\.net|linkprotect\.in|links-protect\.com|links-protect\.info|links-protection\.com|links\.tc|linksafe\.me|linksaver\.info|linkse\.info|linkseguro\.com\.ar|linkseguro\.org|linksole\.com|linksprotec\.com|linksprotegidos\.info|linkssafe\.com|linkto\.net|linkweb\.dk|linkx\.in|linkzip\.net|listedfiles\.com|littleurl\.net|lixk\.me|lixxin\.com|ljv2\.com|lkt\.es|ll11\.org|lnk\.cm|lnk\.co|longr\.us|lovelink\.in|madlink\.sk|maxi-upload\.com|mcaf\.ee|mediahide\.com|megaline\.co|megalinks\.es|megaupper\.com|mf1\.jp|mhz\.me|migre\.me|miniurl\.com|miniurl\.es|miniurl\.org|miniurls\.co|minu\.me|mir\.cr|mirrorcreator\.com|mo\.by|multi-uploadeur\.com|murl\.kz|musicalmente\.info|myooo\.info|mypaqe\.com|mypl\.us|myrapidlinks\.com|myref\.de|myurl\.in|nbanews\.us|nov\.io|okconsolas\.com|oneddl\.canhaz\.it|ow\.ly|p4p\.com\.es|p6l\.org|paste\.frubar\.net|paste\.hotfile-bb\.com|paste\.to|paste\.ubuntu\.com|paste2\.org|paste21\.info|pastebin\.com|paylesssofts\.net|poontown\.net|pqueno\.com|priva\.us|protec-link\.com|protect-ddl\.com|protect-my-links\.com|protected\.socadvnet\.com|protectlinks\.com|protectlinks\.net|protectlk\.com|protege-mes-liens\.com|ptl\.li|qooy\.com|qqc\.co|qvvo\.com|rapidfolder\.com|rapidsafe\.de|rapidsafe\.org|rapidshare\.mu|realfiles\.net|redir\.ec|ref\.so|relinka\.net|rexwo\.com|rqq\.co|rsmonkey\.com|rurls\.ru|s2l\.biz|saf\.li|safe\.mn|safelinking\.net|saferlinks\.com|scut\.ly|sealed\.in|seclnk\.in|seriousfiles\.com|share-links\.biz|sharebee\.com|short-link\.fr|shortlink\.ca|shorturlscript\.net|shrt\.st|simurl\.com|sinl\.es|skroc\.pl|slexy\.org|slnky\.net|smlk\.es|smsdl\.com|sn\.im|snipr\.com|snipurl\.com|snurl\.com|sonofertas\.es|spedr\.com|spreadlink\.us|star-cyber\.com|stu\.tc|subedlc\.com|subirfacil\.com|syl\.me|szort\.pl|t\.co|t7\.hu|takemyfile\.com|takemylinks\.com|textsave\.de|textsnip\.com|thecow\.me|thesefiles\.com|thinfi\.com|tilien\.net|tiny\.cc|tiny\.lt|tinylinks\.co|tinypaste\.com|tinyurl\.com|tinyurlscript\.info|tmf\.myegy\.com|togoto\.us|tot\.to|tra\.kz|trick\.ly|u\.to|uberpicz\.com|ubervidz\.com|ulinks\.net|ultrafiles\.net|undeadlink\.com|uploadjockey\.com|uploadmirrors\.com|uploadonall\.com|upmirror\.com|upsafe\.org|ur\.ly|url-go\.com|url-site\.com|url\.zeta24\.com|url4t\.com|urla\.in|urlbeat\.net|urlcash\.net|urlcorta\.es|urlcrypt\.com|urlcut\.com|urlcut\.in|urldefender\.com|urlink\.at|urln\.tk|urlpulse\.net|urlspy\.co\.cc|urwij|uselink\.info|uucc\.cc|uze\.in|wa9\.la|wcrypt\.in|webtooljungle\.com|weepax\.com|whackyvidz\.com|wtc\.la|x-ls\.ru|x\.co|xa\.ly|xc\.io|xr\.com|xtreemhost\.com|xurl\.cn|xurl\.es|xxs\.ru|youfap\.me|ysu\.me|yvy\.me|yyv\.co|zff\.co|zio\.in|zpag\.es)/.*"
- __version__ = "0.23"
+ __version__ = "0.26"
__description__ = """linkdecrypter.com"""
__author_name__ = ("zoidberg", "flowlee")
TEXTAREA_PATTERN = r'<textarea name="links" wrap="off" readonly="1" class="caja_des">(.+)</textarea>'
- PASSWORD_PATTERN = r'<p class="textog" style="color:red"><b>PASSWORD:</b></p>'
- CAPTCHA_PATTERN = r'<img style="cursor:crosshair;" src="([^"]+)" alt="Loading CAPTCHA...">'
+ PASSWORD_PATTERN = r'<input type="text" name="password"'
+ CAPTCHA_PATTERN = r'<img class="captcha" src="(.+?)"(.*?)>'
REDIR_PATTERN = r'<i>(Click <a href="./">here</a> if your browser does not redirect you).</i>'
def decrypt(self, pyfile):
self.passwords = self.getPassword().splitlines()
- new_links = self.decryptAPI() or self.decryptHTML()
+ # API not working anymore
+ new_links = self.decryptHTML()
if new_links:
self.core.files.addLinks(new_links, self.pyfile.package().id)
else:
@@ -61,35 +60,41 @@ class LinkdecrypterCom(Crypter):
return None
def decryptHTML(self):
-
- self.html = self.load('http://linkdecrypter.com', cookies = True)
- links_sessid = "links" + self.req.cj.getCookie("PHPSESSID")
+
retries = 5
- post_dict = { "link_cache": "on", links_sessid: self.pyfile.url, "modo_links": "text" }
- self.html = self.load('http://linkdecrypter.com', post = post_dict, cookies = True)
+ post_dict = { "link_cache": "on", "pro_links": self.pyfile.url, "modo_links": "text" }
+ self.html = self.load('http://linkdecrypter.com/', post = post_dict, cookies = True)
while self.passwords or retries:
found = re.search(self.TEXTAREA_PATTERN, self.html, flags=re.DOTALL)
- if found: return found.group(1).splitlines()
+ if found: return [ x for x in found.group(1).splitlines() if '[LINK-ERROR]' not in x ]
found = re.search(self.CAPTCHA_PATTERN, self.html)
if found:
- self.logInfo("Captcha protected link")
- captcha = self.decryptCaptcha(url='http://linkdecrypter.com/' + found.group(1))
- self.html = self.load('http://linkdecrypter.com', post={ "captcha": captcha })
+ captcha_url = 'http://linkdecrypter.com/' + found.group(1)
+ result_type = "positional" if "getPos" in found.group(2) else "textual"
+
+ found = re.search(r"<p><i><b>([^<]+)</b></i></p>", self.html)
+ msg = found.group(1) if found else ""
+ self.logInfo("Captcha protected link", result_type, msg)
+
+ captcha = self.decryptCaptcha(captcha_url, result_type = result_type)
+ if result_type == "positional":
+ captcha = "%d|%d" % captcha
+ self.html = self.load('http://linkdecrypter.com/', post={ "captcha": captcha })
retries -= 1
elif self.PASSWORD_PATTERN in self.html:
if self.passwords:
password = self.passwords.pop(0)
self.logInfo("Password protected link, trying " + password)
- self.html = self.load('http://linkdecrypter.com', post= {'password': password})
+ self.html = self.load('http://linkdecrypter.com/', post= {'password': password})
else:
self.fail("No or incorrect password")
else:
retries -= 1
- self.html = self.load('http://linkdecrypter.com', cookies = True)
+ self.html = self.load('http://linkdecrypter.com/', cookies = True)
return None \ No newline at end of file
diff --git a/module/plugins/crypter/LixIn.py b/module/plugins/crypter/LixIn.py
index b9fd28a34..379b10764 100644
--- a/module/plugins/crypter/LixIn.py
+++ b/module/plugins/crypter/LixIn.py
@@ -9,13 +9,13 @@ class LixIn(Crypter):
__name__ = "LixIn"
__type__ = "container"
__pattern__ = r"http://(www.)?lix.in/(?P<id>.*)"
- __version__ = "0.2"
+ __version__ = "0.21"
__description__ = """Lix.in Container Plugin"""
__author_name__ = ("spoob")
__author_mail__ = ("spoob@pyload.org")
CAPTCHA_PATTERN='<img src="(?P<image>captcha_img.php\?PHPSESSID=.*?)"'
- SUBMIT_PATTERN=r"value='continue .*?'"
+ SUBMIT_PATTERN=r"value='continue.*?'"
LINK_PATTERN=r'name="ifram" src="(?P<link>.*?)"'
@@ -46,7 +46,7 @@ class LixIn(Crypter):
else:
self.logDebug("no captcha/captcha solved")
break
- else:
+ else:
self.html = self.req.load(url, decode=True, post={"submit" : "submit",
"tiny" : id})
diff --git a/module/plugins/crypter/MediafireComFolder.py b/module/plugins/crypter/MediafireComFolder.py
index 1d800b1b0..ddd61379c 100644
--- a/module/plugins/crypter/MediafireComFolder.py
+++ b/module/plugins/crypter/MediafireComFolder.py
@@ -8,8 +8,8 @@ from module.common.json_layer import json_loads
class MediafireComFolder(Crypter):
__name__ = "MediafireComFolder"
__type__ = "crypter"
- __pattern__ = r"http://(\w*\.)*mediafire\.com/(folder/|\?sharekey=|(\?\w{13}|\w+)($|[/#]))"
- __version__ = "0.13"
+ __pattern__ = r"http://(\w*\.)*mediafire\.com/(folder/|\?sharekey=|\?\w{13}($|[/#]))"
+ __version__ = "0.14"
__description__ = """Mediafire.com Folder Plugin"""
__author_name__ = ("zoidberg")
__author_mail__ = ("zoidberg@mujmail.cz")
diff --git a/module/plugins/crypter/SerienjunkiesOrg.py b/module/plugins/crypter/SerienjunkiesOrg.py
index 2178f5300..dfe34ff6e 100644
--- a/module/plugins/crypter/SerienjunkiesOrg.py
+++ b/module/plugins/crypter/SerienjunkiesOrg.py
@@ -2,7 +2,7 @@
import re
from time import sleep
-
+import random
from module.plugins.Crypter import Crypter
from module.lib.BeautifulSoup import BeautifulSoup
from module.unescape import unescape
@@ -10,36 +10,23 @@ from module.unescape import unescape
class SerienjunkiesOrg(Crypter):
__name__ = "SerienjunkiesOrg"
__type__ = "container"
- __pattern__ = r"http://.*?serienjunkies.org/.*?"
- __version__ = "0.31"
- __config__ = [("preferredHoster", "str", "preferred hoster",
- "RapidshareCom,UploadedTo,NetloadIn,FilefactoryCom,FreakshareNet,FilebaseTo,MegauploadCom,HotfileCom,DepositfilesCom,EasyshareCom,KickloadCom")
- ,
- ("changeName", "bool", "Take SJ.org episode name", "True")]
+ __pattern__ = r"http://.*?(serienjunkies.org|dokujunkies.org)/.*?"
+ __version__ = "0.36"
+ __config__ = [
+ ("changeNameSJ", "Packagename;Show;Season;Format;Episode", "Take SJ.org name", "Show"),
+ ("changeNameDJ", "Packagename;Show;Format;Episode", "Take DJ.org name", "Show"),
+ ("randomPreferred", "bool", "Randomize Preferred-List", False),
+ ("hosterListMode", "OnlyOne;OnlyPreferred(One);OnlyPreferred(All);All", "Use for hosters (if supported)", "All"),
+ ("hosterList", "str", "Preferred Hoster list (comma separated)", "RapidshareCom,UploadedTo,NetloadIn,FilefactoryCom,FreakshareNet,FilebaseTo,MegauploadCom,HotfileCom,DepositfilesCom,EasyshareCom,KickloadCom"),
+ ("ignoreList", "str", "Ignored Hoster list (comma separated)", "MegauploadCom")
+ ]
__description__ = """serienjunkies.org Container Plugin"""
- __author_name__ = ("mkaay")
- __author_mail__ = ("mkaay@mkaay.de")
+ __author_name__ = ("mkaay", "godofdream")
+ __author_mail__ = ("mkaay@mkaay.de", "soilfiction@gmail.com")
- def setup(self):
- self.hosterMap = {
- "rc": "RapidshareCom",
- "ff": "FilefactoryCom",
- "ut": "UploadedTo",
- "ul": "UploadedTo",
- "nl": "NetloadIn",
- "fs": "FreakshareNet",
- "fb": "FilebaseTo",
- "mu": "MegauploadCom",
- "hf": "HotfileCom",
- "df": "DepositfilesCom",
- "es": "EasyshareCom",
- "kl": "KickloadCom",
- "fc": "FilesonicCom",
- }
- self.hosterMapReverse = dict((v, k) for k, v in self.hosterMap.iteritems())
+ def setup(self):
self.multiDL = False
- self.limitDL = 4
def getSJSrc(self, url):
src = self.req.load(str(url))
@@ -51,72 +38,84 @@ class SerienjunkiesOrg(Crypter):
def handleShow(self, url):
src = self.getSJSrc(url)
soup = BeautifulSoup(src)
+ packageName = self.pyfile.package().name
+ if self.getConfig("changeNameSJ") == "Show":
+ found = unescape(soup.find("h2").find("a").string.split(' &#8211;')[0])
+ if found:
+ packageName = found
+
nav = soup.find("div", attrs={"id": "scb"})
+
+ package_links = []
for a in nav.findAll("a"):
- self.packages.append((unescape(a.text), [a["href"]], unescape(a.text)))
+ if self.getConfig("changeNameSJ") == "Show":
+ package_links.append(a["href"])
+ else:
+ package_links.append(a["href"] + "#hasName")
+ if self.getConfig("changeNameSJ") == "Show":
+ self.packages.append((packageName, package_links, packageName))
+ else:
+ self.core.files.addLinks(package_links, self.pyfile.package().id)
+
def handleSeason(self, url):
src = self.getSJSrc(url)
soup = BeautifulSoup(src)
post = soup.find("div", attrs={"class": "post-content"})
ps = post.findAll("p")
- hosterPattern = re.compile("^http://download\.serienjunkies\.org/f-.*?/([rcfultns]{2})_.*?\.html$")
- preferredHoster = self.getConfig("preferredHoster").split(",")
- self.log.debug("Preferred hoster: %s" % ", ".join(preferredHoster))
+
+ seasonName = unescape(soup.find("a", attrs={"rel": "bookmark"}).string).replace("&#8211;", "-")
groups = {}
gid = -1
- seasonName = unescape(soup.find("a", attrs={"rel": "bookmark"}).string)
for p in ps:
- if re.search("<strong>Dauer|<strong>Sprache|<strong>Format", str(p)):
+ if re.search("<strong>Sprache|<strong>Format", str(p)):
var = p.findAll("strong")
- opts = {"Dauer": "", "Uploader": "", "Sprache": "", "Format": "", u"Größe": ""}
+ opts = {"Sprache": "", "Format": ""}
for v in var:
- n = unescape(v.string)
- n = n.strip()
+ n = unescape(v.string).strip()
n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n)
if n.strip() not in opts:
continue
val = v.nextSibling
if not val:
continue
- val = val.encode("utf-8")
- val = unescape(val)
val = val.replace("|", "").strip()
- val = val.strip()
val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val)
opts[n.strip()] = val.strip()
gid += 1
groups[gid] = {}
- groups[gid]["ep"] = []
+ groups[gid]["ep"] = {}
groups[gid]["opts"] = opts
elif re.search("<strong>Download:", str(p)):
- links1 = p.findAll("a", attrs={"href": hosterPattern})
- links2 = p.findAll("a", attrs={"href": re.compile("^http://serienjunkies.org/safe/.*$")})
- for link in links1 + links2:
- groups[gid]["ep"].append(link["href"])
+ parts = str(p).split("<br />")
+ if re.search("<strong>", parts[0]):
+ ename = re.search('<strong>(.*?)</strong>',parts[0]).group(1).strip().decode("utf-8").replace("&#8211;", "-")
+ groups[gid]["ep"][ename] = {}
+ parts.remove(parts[0])
+ for part in parts:
+ hostername = re.search(" \| ([-a-zA-Z0-9]+\.\w+)",part)
+ if hostername:
+ hostername = hostername.group(1)
+ groups[gid]["ep"][ename][hostername] = []
+ links = re.findall('href="(.*?)"',part)
+ for link in links:
+ groups[gid]["ep"][ename][hostername].append(link + "#hasName")
+
+ links = []
for g in groups.values():
- links = []
- linklist = g["ep"]
+ for ename in g["ep"]:
+ links.extend(self.getpreferred(g["ep"][ename]))
+ if self.getConfig("changeNameSJ") == "Episode":
+ self.packages.append((ename, links, ename))
+ links = []
package = "%s (%s, %s)" % (seasonName, g["opts"]["Format"], g["opts"]["Sprache"])
- linkgroups = {}
- for link in linklist:
- key = re.sub("^http://download\.serienjunkies\.org/f-.*?/(.{2})_", "", link)
- if key not in linkgroups:
- linkgroups[key] = []
- linkgroups[key].append(link)
- for group in linkgroups.values():
- for pHoster in preferredHoster:
- hmatch = False
- for link in group:
- m = hosterPattern.match(link)
- if m:
- if pHoster == self.hosterMap[m.group(1)]:
- links.append(link)
- hmatch = True
- break
- if hmatch:
- break
- self.packages.append((package, links, package))
+ if self.getConfig("changeNameSJ") == "Format":
+ self.packages.append((package, links, package))
+ links = []
+ if (self.getConfig("changeNameSJ") == "Packagename") or re.search("#hasName", url):
+ self.core.files.addLinks(links, self.pyfile.package().id)
+ elif (self.getConfig("changeNameSJ") == "Season") or not re.search("#hasName", url):
+ self.packages.append((seasonName, links, seasonName))
def handleEpisode(self, url):
src = self.getSJSrc(url)
@@ -127,11 +126,11 @@ class SerienjunkiesOrg(Crypter):
soup = BeautifulSoup(src)
form = soup.find("form")
h1 = soup.find("h1")
- packageName = h1.text
+
if h1.get("class") == "wrap":
captchaTag = soup.find(attrs={"src": re.compile("^/secure/")})
if not captchaTag:
- sleep(1)
+ sleep(5)
self.retry()
captchaUrl = "http://download.serienjunkies.org" + captchaTag["src"]
@@ -155,12 +154,15 @@ class SerienjunkiesOrg(Crypter):
for link in rawLinks:
frameUrl = link["action"].replace("/go-", "/frame/go-")
links.append(self.handleFrame(frameUrl))
-
- # thx gartd6oDLobo
- if not self.getConfig("changeName"):
- packageName = self.pyfile.package().name
-
- self.packages.append((packageName, links, packageName))
+ if re.search("#hasName", url) or ((self.getConfig("changeNameSJ") == "Packagename") and (self.getConfig("changeNameDJ") == "Packagename")):
+ self.core.files.addLinks(links, self.pyfile.package().id)
+ else:
+ if h1.text[2] == "_":
+ eName = h1.text[3:]
+ else:
+ eName = h1.text
+ self.packages.append((eName, links, eName))
+
def handleOldStyleLink(self, url):
sj = self.req.load(str(url))
@@ -177,18 +179,96 @@ class SerienjunkiesOrg(Crypter):
decrypted = self.req.lastEffectiveURL
if decrypted == str(url):
self.retry()
- self.packages.append((self.pyfile.package().name, [decrypted], self.pyfile.package().folder))
+ self.core.files.addLinks([decrypted], self.pyfile.package().id)
def handleFrame(self, url):
self.req.load(str(url))
return self.req.lastEffectiveURL
+ def handleShowDJ(self, url):
+ src = self.getSJSrc(url)
+ soup = BeautifulSoup(src)
+ post = soup.find("div", attrs={"id": "page_post"})
+ ps = post.findAll("p")
+ found = unescape(soup.find("h2").find("a").string.split(' &#8211;')[0])
+ if found:
+ seasonName = found
+
+ groups = {}
+ gid = -1
+ for p in ps:
+ if re.search("<strong>Sprache|<strong>Format", str(p)):
+ var = p.findAll("strong")
+ opts = {"Sprache": "", "Format": ""}
+ for v in var:
+ n = unescape(v.string).strip()
+ n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n)
+ if n.strip() not in opts:
+ continue
+ val = v.nextSibling
+ if not val:
+ continue
+ val = val.replace("|", "").strip()
+ val = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', val)
+ opts[n.strip()] = val.strip()
+ gid += 1
+ groups[gid] = {}
+ groups[gid]["ep"] = {}
+ groups[gid]["opts"] = opts
+ elif re.search("<strong>Download:", str(p)):
+ parts = str(p).split("<br />")
+ if re.search("<strong>", parts[0]):
+ ename = re.search('<strong>(.*?)</strong>',parts[0]).group(1).strip().decode("utf-8").replace("&#8211;", "-")
+ groups[gid]["ep"][ename] = {}
+ parts.remove(parts[0])
+ for part in parts:
+ hostername = re.search(" \| ([-a-zA-Z0-9]+\.\w+)",part)
+ if hostername:
+ hostername = hostername.group(1)
+ groups[gid]["ep"][ename][hostername] = []
+ links = re.findall('href="(.*?)"',part)
+ for link in links:
+ groups[gid]["ep"][ename][hostername].append(link + "#hasName")
+
+ links = []
+ for g in groups.values():
+ for ename in g["ep"]:
+ links.extend(self.getpreferred(g["ep"][ename]))
+ if self.getConfig("changeNameDJ") == "Episode":
+ self.packages.append((ename, links, ename))
+ links = []
+ package = "%s (%s, %s)" % (seasonName, g["opts"]["Format"], g["opts"]["Sprache"])
+ if self.getConfig("changeNameDJ") == "Format":
+ self.packages.append((package, links, package))
+ links = []
+ if (self.getConfig("changeNameDJ") == "Packagename") or re.search("#hasName", url):
+ self.core.files.addLinks(links, self.pyfile.package().id)
+ elif (self.getConfig("changeNameDJ") == "Show") or not re.search("#hasName", url):
+ self.packages.append((seasonName, links, seasonName))
+
+
+
+
+
+
+
+ def handleCategoryDJ(self, url):
+ package_links = []
+ src = self.getSJSrc(url)
+ soup = BeautifulSoup(src)
+ content = soup.find("div", attrs={"id": "content"})
+ for a in content.findAll("a", attrs={"rel": "bookmark"}):
+ package_links.append(a["href"])
+ self.core.files.addLinks(package_links, self.pyfile.package().id)
+
def decrypt(self, pyfile):
showPattern = re.compile("^http://serienjunkies.org/serie/(.*)/$")
seasonPattern = re.compile("^http://serienjunkies.org/.*?/(.*)/$")
- episodePattern = re.compile("^http://download.serienjunkies.org/f-.*?.html$")
+ episodePattern = re.compile("^http://download.serienjunkies.org/f-.*?.html(#hasName)?$")
oldStyleLink = re.compile("^http://serienjunkies.org/safe/(.*)$")
- framePattern = re.compile("^http://download.serienjunkies.org/frame/go-.*?/$")
+ categoryPatternDJ = re.compile("^http://dokujunkies.org/.*?(.*)$")
+ showPatternDJ = re.compile("^http://dokujunkies.org/.*?/(.*)\.html(#hasName)?$")
+ framePattern = re.compile("^http://download.(serienjunkies.org|dokujunkies.org)/frame/go-.*?/$")
url = pyfile.url
if framePattern.match(url):
self.packages.append((self.pyfile.package().name, [self.handleFrame(url)], self.pyfile.package().name))
@@ -198,5 +278,42 @@ class SerienjunkiesOrg(Crypter):
self.handleOldStyleLink(url)
elif showPattern.match(url):
self.handleShow(url)
+ elif showPatternDJ.match(url):
+ self.handleShowDJ(url)
elif seasonPattern.match(url):
self.handleSeason(url)
+ elif categoryPatternDJ.match(url):
+ self.handleCategoryDJ(url)
+
+ #selects the preferred hoster, after that selects any hoster (ignoring the one to ignore)
+ def getpreferred(self, hosterlist):
+
+ result = []
+ preferredList = self.getConfig("hosterList").strip().lower().replace('|',',').replace('.','').replace(';',',').split(',')
+ if (self.getConfig("randomPreferred") == True) and (self.getConfig("hosterListMode") in ["OnlyOne","OnlyPreferred(One)"]) :
+ random.shuffle(preferredList)
+ # we don't want hosters be read two times
+ hosterlist2 = hosterlist.copy()
+
+ for preferred in preferredList:
+ for Hoster in hosterlist:
+ if preferred == Hoster.lower().replace('.',''):
+ for Part in hosterlist[Hoster]:
+ self.logDebug("selected " + Part)
+ result.append(str(Part))
+ del(hosterlist2[Hoster])
+ if (self.getConfig("hosterListMode") in ["OnlyOne","OnlyPreferred(One)"]):
+ return result
+
+
+ ignorelist = self.getConfig("ignoreList").strip().lower().replace('|',',').replace('.','').replace(';',',').split(',')
+ if self.getConfig('hosterListMode') in ["OnlyOne","All"]:
+ for Hoster in hosterlist2:
+ if Hoster.strip().lower().replace('.','') not in ignorelist:
+ for Part in hosterlist2[Hoster]:
+ self.logDebug("selected2 " + Part)
+ result.append(str(Part))
+
+ if self.getConfig('hosterListMode') == "OnlyOne":
+ return result
+ return result
diff --git a/module/plugins/crypter/TrailerzoneInfo.py b/module/plugins/crypter/TrailerzoneInfo.py
new file mode 100644
index 000000000..2683c2429
--- /dev/null
+++ b/module/plugins/crypter/TrailerzoneInfo.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+
+import re
+from module.plugins.Crypter import Crypter
+
+class TrailerzoneInfo(Crypter):
+ __name__ = "TrailerzoneInfo"
+ __type__ = "crypter"
+ __pattern__ = r"http://(www\.)?trailerzone.info/.*?"
+ __version__ = "0.02"
+ __description__ = """TrailerZone.info Crypter Plugin"""
+ __author_name__ = ("godofdream")
+ __author_mail__ = ("soilfiction@gmail.com")
+
+ JS_KEY_PATTERN = r"<script>(.*)var t = window"
+
+ def decrypt(self, pyfile):
+ protectPattern = re.compile("http://(www\.)?trailerzone.info/protect.html.*?")
+ goPattern = re.compile("http://(www\.)?trailerzone.info/go.html.*?")
+ url = pyfile.url
+ if protectPattern.match(url):
+ self.handleProtect(url)
+ elif goPattern.match(url):
+ self.handleGo(url)
+
+ def handleProtect(self, url):
+ self.handleGo("http://trailerzone.info/go.html#:::" + url.split("#:::",1)[1])
+
+ def handleGo(self, url):
+
+ src = self.req.load(str(url))
+ pattern = re.compile(self.JS_KEY_PATTERN, re.DOTALL)
+ found = re.search(pattern, src)
+
+ # Get package info
+ package_links = []
+ try:
+ result = self.js.eval(found.group(1) + " decodeLink('" + url.split("#:::",1)[1] + "');")
+ result = str(result)
+ self.logDebug("RESULT: %s" % result)
+ package_links.append(result)
+ self.core.files.addLinks(package_links, self.pyfile.package().id)
+ except Exception, e:
+ self.logDebug(e)
+ self.fail('Could not extract any links by javascript')