# -*- coding: utf-8 -*- import re from module.plugins.Crypter import Crypter from module.BeautifulSoup import BeautifulSoup from module.unescape import unescape from module.plugins.Plugin import Fail class SerienjunkiesOrg(Crypter): __name__ = "SerienjunkiesOrg" __type__ = "container" __pattern__ = r"http://.*?serienjunkies.org/.*?" __version__ = "0.2" __config__ = [ ("preferredHoster", "str", "preferred hoster" , "RapidshareCom,UploadedTo,NetloadIn,FilefactoryCom,RapidshareDe") ] __description__ = """serienjunkies.org Container Plugin""" __author_name__ = ("mkaay") __author_mail__ = ("mkaay@mkaay.de") def setup(self): self.hosterMap = { "rc": "RapidshareCom", "ff": "FilefactoryCom", "ut": "UploadedTo", "ul": "UploadedTo", "nl": "NetloadIn", "rs": "RapidshareDe" } self.hosterMapReverse = dict((v,k) for k, v in self.hosterMap.iteritems()) def getSJSrc(self, url): src = self.req.load(str(url)) if not src.find("Enter Serienjunkies") == -1: src = self.req.load(str(url)) return src 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)) groups = {} gid = -1 seasonName = unescape(soup.find("a", attrs={"rel":"bookmark"}).string) for p in ps: if re.search("Dauer|Sprache|Format", str(p)): var = p.findAll("strong") opts = {"Dauer": "", "Uploader": "", "Sprache": "", "Format": "", u"Größe": ""} for v in var: n = unescape(v.string) n = n.strip() n = re.sub(r"^([:]?)(.*?)([:]?)$", r'\2', n) if not opts.has_key(n.strip()): continue val = v.nextSibling if not val: continue print type(val), val 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]["opts"] = opts elif re.search("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"]) for g in groups.values(): links = [] linklist = g["ep"] 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 not linkgroups.has_key(key): 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)) def handleEpisode(self, url): src = self.getSJSrc(url) if not src.find("Du hast das Download-Limit überschritten! Bitte versuche es später nocheinmal.") == -1: self.fail(_("Downloadlimit reached")) else: soup = BeautifulSoup(src) form = soup.find("form") packageName = soup.find("h1", attrs={"class":"wrap"}).text captchaTag = soup.find(attrs={"src":re.compile("^/secure/")}) if not captchaTag: self.retry() captchaUrl = "http://download.serienjunkies.org"+captchaTag["src"] result = self.decryptCaptcha(str(captchaUrl)) sinp = form.find(attrs={"name":"s"}) self.req.lastUrl = url sj = self.req.load(str(url), post={'s': sinp["value"], 'c': result, 'action': "Download"}) soup = BeautifulSoup(sj) rawLinks = soup.findAll(attrs={"action": re.compile("^http://download.serienjunkies.org/")}) if not len(rawLinks) > 0: self.retry() links = [] for link in rawLinks: frameUrl = link["action"].replace("/go-", "/frame/go-") links.append(self.handleFrame(frameUrl)) self.packages.append((packageName, links, packageName)) def handleOldStyleLink(self, url): sj = self.req.load(str(url)) soup = BeautifulSoup(sj) form = soup.find("form", attrs={"action":re.compile("^http://serienjunkies.org")}) captchaTag = form.find(attrs={"src":re.compile("^/safe/secure/")}) captchaUrl = "http://serienjunkies.org"+captchaTag["src"] captchaData = self.req.load(str(captchaUrl)) result = self.waitForCaptcha(captchaData, "png") url = form["action"] sinp = form.find(attrs={"name":"s"}) self.req.load(str(url), post={'s': sinp["value"], 'c': result, 'dl.start': "Download"}, cookies=False, just_header=True) decrypted = self.req.lastEffectiveURL if decrypted == str(url): self.retry() self.packages.append((self.pyfile.package().name, [decrypted], self.pyfile.package().folder)) def handleFrame(self, url): self.req.load(str(url), cookies=False, just_header=True) return self.req.lastEffectiveURL 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$") oldStyleLink = re.compile("^http://serienjunkies.org/safe/(.*)$") framePattern = re.compile("^http://download.serienjunkies.org/frame/go-.*?/$") url = pyfile.url if framePattern.match(url): self.packages.append((self.pyfile.package().name, [self.handleFrame(url)], self.pyfile.package().name)) elif episodePattern.match(url): self.handleEpisode(url) elif oldStyleLink.match(url): self.handleOldStyleLink(url) elif showPattern.match(url): pass elif seasonPattern.match(url): self.handleSeason(url)