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") h1 = soup.find("h1") if h1.get("class") == "wrap": captchaTag = soup.find(attrs={"src": re.compile("^/secure/")}) if not captchaTag: sleep(5) self.retry() captchaUrl = "http://download.serienjunkies.org" + captchaTag[ 'src'] result = self.decryptCaptcha(str(captchaUrl), imgtype="png") sinp = form.find(attrs={"name": "s"}) self.req.lastURL = str(url) sj = self.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: sleep(1) self.retry() return self.correctCaptcha() links = [] for link in rawLinks: frameUrl = link['action'].replace("/go-", "/frame/go-") links.append(self.handleFrame(frameUrl)) 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 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(' –')[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("–", "-") 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 decrypt(self, pyfile): url = pyfile.url if re.match(self.__pattern__, url).group(1) == "d": self.req.http.c.setopt(FOLLOWLOCATION, 0) self.load(url) m = re.search("^Location: (.+)$", self.req.http.header, re.MULTILINE) if m: self.core.files.addLinks([m.group(1)], pyfile.package().id) else: self.fail("Couldn't find forwarded Link") else: password = "" packageLinks = [] postData = {"post-protect": "1"} self.html = self.load(url) if "link-password" in self.html: password = pyfile.package().password postData["link-password"] = password if "altcaptcha" in self.html: for _ in xrange(5): m = re.search(self.__Solvemedia_pattern__, self.html) if m: captchaKey = m.group(1) captcha = SolveMedia(self) captchaProvider = "Solvemedia" else: self.fail("Error parsing captcha") challenge, response = captcha.challenge(captchaKey) postData["adcopy_challenge"] = challenge postData["adcopy_response"] = response self.html = self.load(url, post=postData) if "The password you entered was incorrect" in self.html: self.fail("Incorrect Password") if not "The CAPTCHA code you entered was wrong" in self.html: break pyfile.package().password = "" soup = BeautifulSoup(self.html) scripts = soup.findAll("script") for s in scripts: if "d_links" in s.text: break m = re.search('d_links":(\[.*?\])', s.text) if m: linkDict = json_loads(m.group(1)) for link in linkDict: if not "http://" in link["full"]: packageLinks.append("https://safelinking.net/d/" + link["full"]) else: packageLinks.append(link["full"]) self.core.files.addLinks(packageLinks, pyfile.package().id)
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 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)
def proceed(self, url, location): links = [] ajaxUrl = "http://secured.in/ajax-handler.php" src = self.req.load(url, cookies=True) soup = BeautifulSoup(src) img = soup.find("img", attrs={"id": "captcha_img"}) for i in range(3): form = soup.find("form", attrs={"id": "frm_captcha"}) captchaHash = form.find("input", attrs={"id": "captcha_hash"})["value"] captchaUrl = "http://secured.in/%s" % img["src"] captchaData = self.req.load(str(captchaUrl), cookies=True) result = self.waitForCaptcha(captchaData, "jpg") src = self.req.load(url, cookies=True, post={ "captcha_key": result, "captcha_hash": captchaHash }) soup = BeautifulSoup(src) img = soup.find("img", attrs={"id": "captcha_img"}) if not img: files = soup.findAll("tr", attrs={"id": re.compile("file-\d+")}) dlIDPattern = re.compile( "accessDownload\(\d, \d+, '(.*?)', \d\)") cypher = self.Cypher() for cfile in files: m = dlIDPattern.search(cfile["onclick"]) if m: crypted = self.req.load(ajaxUrl, cookies=True, post={ "cmd": "download", "download_id": m.group(1) }) cypher.reset() link = cypher.cypher(crypted) links.append(link) break self.links = links
def handleFolder(self, found): src = self.load("http://duckcrypt.info/ajax/auth.php?hash=" + str(found.group(2))) found = re.match(self.__pattern__, src) self.logDebug("Redirectet to " + str(found.group(0))) src = self.load(str(found.group(0))) soup = BeautifulSoup(src) cryptlinks = soup.findAll("div", attrs={"class": "folderbox"}) self.logDebug("Redirectet to " + str(cryptlinks)) if not cryptlinks: self.fail('no links found - (Plugin out of date?)') for clink in cryptlinks: if clink.find("a"): self.handleLink(clink.find("a")['href'])
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"] result = self.decryptCaptcha(str(captchaUrl)) 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.core.files.addLinks([decrypted], self.pyfile.package().id)
def decrypt(self, pyfile): url = pyfile.url src = self.req.load(str(url)) soup = BeautifulSoup(src) # find captcha URL and decrypt captchaTag = soup.find("img", attrs={"id": "Captcha"}) if not captchaTag: self.fail("Cannot find Captcha") captchaUrl = "http://iload.to" + captchaTag["src"] self.logDebug("Captcha URL: %s" % captchaUrl) result = self.decryptCaptcha(str(captchaUrl)) # find captcha form URL formTag = soup.find("form", attrs={"id": "CaptchaForm"}) formUrl = "http://iload.to" + formTag["action"] self.logDebug("Form URL: %s" % formUrl) # submit decrypted captcha self.req.lastURL = url src = self.req.load(str(formUrl), post={'captcha': result}) # find decrypted links links = re.findall( r"<a href=\"(.+)\" style=\"text-align:center;font-weight:bold;\" class=\"button\" target=\"_blank\" onclick=\"this.className\+=' success';\">", src) if not len(links) > 0: self.retry() self.correctCaptcha() cleanedLinks = [] for link in links: if link.startswith("http://dontknow.me/at/?"): cleanedLink = urllib.unquote(link[23:]) else: cleanedLink = link self.logDebug("Link: %s" % cleanedLink) cleanedLinks.append(cleanedLink) self.logDebug("Decrypted %d links" % len(links)) self.pyfile.package().password = "******" self.packages.append((self.pyfile.package().name, cleanedLinks, self.pyfile.package().folder))
def syncronize(self): # read existing episodes self.episodesOnDisk = {} self.loadEpisodesOnDisk(self.showDir) # process every episode link and check if it needs to be downloaded showHtml = self.loadHtml(self.showUrl) if showHtml == '': return False linkStrainer = SoupStrainer('a') showLinkSoup = BeautifulSoup(showHtml, parseOnlyThese=linkStrainer) for a in showLinkSoup.findAll( 'a', attrs={'href': re.compile('/ip\.php\?v=.*')}): if not a.string: continue ep = Episode(self, a['href'], a.string) if ep.seasonNum == -1: self.hook.logError('Unable to extract episode info from %s' % a.string) continue if self.excluded(ep.seasonNum, ep.episodeNum): self.hook.logDebug( 'skipping, excluded => %s - S%02dE%02d - %s' % (self.showName, ep.seasonNum, ep.episodeNum, ep.episodeName)) continue if self.onDiskAlready(ep.seasonNum, ep.episodeNum): self.hook.logDebug( 'skipping, already downloaded => %s - S%02dE%02d - %s' % (self.showName, ep.seasonNum, ep.episodeNum, ep.episodeName)) continue if ep.refreshDownloadLink(): self.hook.logDebug('downloading => %s - S%02dE%02d - %s' % (self.showName, ep.seasonNum, ep.episodeNum, ep.episodeName)) self.episodesToDownload.append({'season': ep.seasonNum, 'episode': ep.episodeNum, \ 'name': ep.episodeName, 'url': ep.url['download'], 'showDir': self.showDir}) # prevent duplicate downloads, add downloads and store target filepath of file url self.removeAlreadyQueuedEpisodes() self.addDownloads() self.storeNameInfo(self.episodesToDownload)
def decrypt(self, pyfile): self.pyfile = pyfile if self.article.match(pyfile.url): src = self.load(pyfile.url) soup = BeautifulSoup( src, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) abookname = soup.find("a", attrs={"rel": "bookmark"}).text for a in soup.findAll("a", attrs={"href": self.protection}): package = "%s (%s)" % ( abookname, a.previousSibling.previousSibling.text[:-1]) links = self.decryptFolder(a["href"]) self.packages.append((package, links, pyfile.package().folder)) else: links = self.decryptFolder(pyfile.url) self.packages.append( (pyfile.package().name, links, pyfile.package().folder))
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(' –')[0]) if found: packageName = found nav = soup.find("div", attrs={"id": "scb"}) package_links = [] for a in nav.findAll("a"): 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 decrypt(self, pyfile): url = pyfile.url src = self.req.load(str(url)) soup = BeautifulSoup(src) captchaTag = soup.find("img", attrs={"id": "captcha_image"}) if captchaTag: captchaUrl = "http://rs-layer.com/" + captchaTag["src"] self.logDebug("Captcha URL: %s" % captchaUrl) result = self.decryptCaptcha(str(captchaUrl), imgtype="png") captchaInput = soup.find("input", attrs={"id": "captcha"}) self.req.lastUrl = url src = self.req.load(str(url), post={ 'captcha_input': result, 'image_name': captchaTag["src"] }) link_ids = re.findall( r"onclick=\"getFile\(\'([0-9]{7}-.{8})\'\);changeBackgroundColor", src) if not len(link_ids) > 0: self.retry() self.correctCaptcha() links = [] for id in link_ids: self.logDebug("ID: %s" % id) new_link = unescape( re.search( r"<iframe style=\"width: 100%; height: 100%;\" src=\"(.*)\"></frame>", self.req.load("http://rs-layer.com/link-" + id + ".html")).group(1)) self.logDebug("Link: %s" % new_link) links.append(new_link) self.packages.append( (self.pyfile.package().name, links, self.pyfile.package().folder))
def refreshDownloadLink(self): self.url['download'] = '' # get iframe url epPageHtml = self.show.loadHtml(baseUrl + self.url['epPage']) if epPageHtml == '': return False epPageStrainer = SoupStrainer('iframe') epPageSoup = BeautifulSoup(epPageHtml, parseOnlyThese=epPageStrainer) iframeUrl = epPageSoup.find('iframe', {'id': 'videoframe'})['src'] del epPageHtml del epPageStrainer del epPageSoup # get iframe iframeHtml = self.show.loadHtml(baseUrl + iframeUrl) if iframeHtml == '': return False iframeSoup = BeautifulSoup(iframeHtml) # downloadIds (separated in hd and everything else) idsHD = {} idsOther = {} for div in iframeSoup.findAll('div', {'class': 'ripdiv'}): if div.b and div.b.string.count("HD") > 0: hdDiv = True else: hdDiv = False for a in div.findAll('a', attrs={'onclick': re.compile('go\(\d+\)')}): hn = a.find('span') if not hn: img = a.find('img') if not img: self.show.hook.logWarning( 'Name of file hoster not found') self.show.hook.logDebug(a) continue else: hoster = img["alt"].strip().lower() else: hoster = hn.getText().strip().lower() # if more than one file per hoster is available, # some id´s get overridden, but thats ok. We only need one dlink... if hdDiv: idsHD[hoster] = a['onclick'][3:-1] else: idsOther[hoster] = a['onclick'][3:-1] # choose file to download downloadId = 0 if self.show.hd and len(idsHD) > 0: for hoster in self.show.hook.preferredHosters: if idsHD.has_key(hoster): downloadId = idsHD[hoster] break else: downloadId = idsHD.values()[-1] #memorize latest id elif len(idsOther) > 0: for hoster in self.show.hook.preferredHosters: if idsOther.has_key(hoster): downloadId = idsOther[hoster] break else: downloadId = idsOther.values()[-1] #memorize latest id if downloadId == 0: self.show.hook.logError('No download id found for %s' % self.getEpCodeStr()) return False # secret value and videoId secret = '' videoId = '' for line in iframeHtml.split('\n'): if line.find("f.lastChild.value=") >= 0: m = re.search('(?<=f.lastChild.value=")\w+', line) secret = m.group(0) m = re.search('(?<="&t=)\d+', line) videoId = m.group(0) break if secret == '': self.show.hook.logError('Secret not found for %s' % self.getEpCodeStr()) return False if videoId == '': self.show.hook.logError('Video id not found for %s' % self.getEpCodeStr()) return False # assemble download post data string postData = 'id=' + downloadId + '&s=4&iqs=&url=&m=-141&cap=&sec=' + secret + '&t=' + videoId # get download url ajaxUrl = 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.phpAjaxResp.php' downloadUrlHtml = self.show.loadHtml(ajaxUrl, postData) if downloadUrlHtml == '': return False if len(downloadUrlHtml) > 2: self.url['download'] = urllib.unquote( downloadUrlHtml.split('?url=')[1]) else: self.show.hook.logError( 'Unable to retrieve download link (%s: %s)' % self.getEpCodeStr(), downloadUrlHtml) return False return True