diff options
Diffstat (limited to 'pyload/api/DownloadPreparingApi.py')
-rw-r--r-- | pyload/api/DownloadPreparingApi.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/pyload/api/DownloadPreparingApi.py b/pyload/api/DownloadPreparingApi.py new file mode 100644 index 000000000..a7e32c4eb --- /dev/null +++ b/pyload/api/DownloadPreparingApi.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from itertools import chain + +from pyload.Api import Api, DownloadStatus as DS,\ + RequirePerm, Permission, OnlineCheck, LinkStatus, urlmatcher +from pyload.utils import uniqify +from pyload.utils.fs import join +from pyload.utils.packagetools import parseNames +from pyload.network.RequestFactory import getURL + +from ApiComponent import ApiComponent + +class DownloadPreparingApi(ApiComponent): + """ All kind of methods to parse links or retrieve online status """ + + @RequirePerm(Permission.Add) + def parseLinks(self, links): + """ Gets urls and returns pluginname mapped to list of matching urls. + + :param links: + :return: {plugin: urls} + """ + data, crypter = self.core.pluginManager.parseUrls(links) + plugins = {} + + for url, plugin in chain(data, crypter): + if plugin in plugins: + plugins[plugin].append(url) + else: + plugins[plugin] = [url] + + return plugins + + @RequirePerm(Permission.Add) + def checkLinks(self, links): + """ initiates online status check, will also decrypt files. + + :param links: + :return: initial set of data as :class:`OnlineCheck` instance containing the result id + """ + hoster, crypter = self.core.pluginManager.parseUrls(links) + + #: TODO: withhold crypter, derypt or add later + # initial result does not contain the crypter links + tmp = [(url, LinkStatus(url, url, -1, DS.Queued, pluginname)) for url, pluginname in hoster] + data = parseNames(tmp) + rid = self.core.threadManager.createResultThread(self.primaryUID, hoster + crypter) + + return OnlineCheck(rid, data) + + @RequirePerm(Permission.Add) + def checkContainer(self, filename, data): + """ checks online status of urls and a submitted container file + + :param filename: name of the file + :param data: file content + :return: :class:`OnlineCheck` + """ + th = open(join(self.core.config["general"]["download_folder"], "tmp_" + filename), "wb") + th.write(str(data)) + th.close() + return self.checkLinks([th.name]) + + @RequirePerm(Permission.Add) + def checkHTML(self, html, url): + """Parses html content or any arbitrary text for links and returns result of `checkURLs` + + :param html: html source + :return: + """ + urls = [] + if html: + urls += [x[0] for x in urlmatcher.findall(html)] + if url: + page = getURL(url) + urls += [x[0] for x in urlmatcher.findall(page)] + + return self.checkLinks(uniqify(urls)) + + @RequirePerm(Permission.Add) + def pollResults(self, rid): + """ Polls the result available for ResultID + + :param rid: `ResultID` + :return: `OnlineCheck`, if rid is -1 then there is no more data available + """ + result = self.core.threadManager.getInfoResult(rid) + if result and result.owner == self.primaryUID: + return result.toApiData() + + @RequirePerm(Permission.Add) + def generatePackages(self, links): + """ Parses links, generates packages names from urls + + :param links: list of urls + :return: package names mapped to urls + """ + result = parseNames((x, x) for x in links) + return result + + +if Api.extend(DownloadPreparingApi): + del DownloadPreparingApi
\ No newline at end of file |