diff options
53 files changed, 287 insertions, 171 deletions
diff --git a/module/plugins/accounts/MegaDebridEu.py b/module/plugins/accounts/MegaDebridEu.py index 4767b9b05..9a7508617 100644 --- a/module/plugins/accounts/MegaDebridEu.py +++ b/module/plugins/accounts/MegaDebridEu.py @@ -9,7 +9,7 @@ class MegaDebridEu(Account): __type__ = "account" __version__ = "0.21" - __description__ = """mega-debrid.eu account plugin""" + __description__ = """Mega-debrid.eu account plugin""" __license__ = "GPLv3" __authors__ = [("D.Ducatel", "dducatel@je-geek.fr")] diff --git a/module/plugins/captcha/CircleCaptcha.py b/module/plugins/captcha/CircleCaptcha.py index a79198314..8b59c6703 100644 --- a/module/plugins/captcha/CircleCaptcha.py +++ b/module/plugins/captcha/CircleCaptcha.py @@ -241,7 +241,6 @@ class CircleCaptcha(OCR): -1 -> Not found circle -2 -> Found black position then leave position """ - imageheight = range(int(c[1]-c[2]),int(c[1]+c[2])) imagewidth = range(int(c[0]-c[2]),int(c[0]+c[2])) @@ -323,7 +322,6 @@ class CircleCaptcha(OCR): -1 -> Not found circle -2 -> Found black position then leave position """ - imageheight = range(int(c[1]-c[2]),int(c[1]+c[2])) imagewidth = range(int(c[0]-c[2]),int(c[0]+c[2])) @@ -485,7 +483,6 @@ class CircleCaptcha(OCR): if maxX - minX < c[2] * 2 * 0.10 and maxY - minY < c[2] * 2 * 0.10: return -1; """ - if missing / howmany > 0.25 or \ missingconsecutive >= (howmany / 4) * 2 or \ howmany < 80: diff --git a/module/plugins/container/CCF.py b/module/plugins/container/CCF.py index 395f8c953..314a76eb5 100644 --- a/module/plugins/container/CCF.py +++ b/module/plugins/container/CCF.py @@ -32,7 +32,7 @@ class CCF(Container): 'filename': "test.ccf", 'upload' : open(fs_filename, "rb")}).read() - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") dlc_file = fs_join(download_folder, "tmp_%s.dlc" % pyfile.name) try: diff --git a/module/plugins/crypter/DailymotionComFolder.py b/module/plugins/crypter/DailymotionComFolder.py index 26e870d31..e839cf9df 100644 --- a/module/plugins/crypter/DailymotionComFolder.py +++ b/module/plugins/crypter/DailymotionComFolder.py @@ -100,6 +100,6 @@ class DailymotionComFolder(Crypter): for p_id, p_name, p_owner in playlists: p_videos = self.getVideos(p_id) - p_folder = fs_join(self.core.config['general']['download_folder'], p_owner, p_name) + p_folder = fs_join(self.core.config.get("general", "download_folder"), p_owner, p_name) self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) self.packages.append((p_name, p_videos, p_folder)) #: folder is NOT recognized by pyload 0.4.9! diff --git a/module/plugins/crypter/DevhostStFolder.py b/module/plugins/crypter/DevhostStFolder.py index 4d15e2058..c9e809cae 100644 --- a/module/plugins/crypter/DevhostStFolder.py +++ b/module/plugins/crypter/DevhostStFolder.py @@ -19,7 +19,7 @@ class DevhostStFolder(SimpleCrypter): ("use_subfolder" , "bool", "Save package to subfolder" , True), ("subfolder_per_pack", "bool", "Create a subfolder for each package", True)] - __description__ = """d-h.st folder decrypter plugin""" + __description__ = """D-h.st folder decrypter plugin""" __license__ = "GPLv3" __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de"), ("Walter Purcaro", "vuolter@gmail.com")] diff --git a/module/plugins/crypter/OneKhDe.py b/module/plugins/crypter/OneKhDe.py index 2d90afd96..a45d7dbff 100644 --- a/module/plugins/crypter/OneKhDe.py +++ b/module/plugins/crypter/OneKhDe.py @@ -2,9 +2,8 @@ import re -from module.unescape import unescape - from module.plugins.internal.Crypter import Crypter +from module.utils import html_unescape class OneKhDe(Crypter): @@ -27,7 +26,8 @@ class OneKhDe(Crypter): def file_exists(self): - """ returns True or False + """ + Returns True or False """ return True @@ -37,6 +37,6 @@ class OneKhDe(Crypter): self.html = self.load(url) link_ids = re.findall(r"<a id=\"DownloadLink_(\d*)\" href=\"http://1kh.de/", self.html) for id in link_ids: - new_link = unescape( + new_link = html_unescape( re.search("width=\"100%\" src=\"(.*)\"></iframe>", self.load("http://1kh.de/l/" + id)).group(1)) self.urls.append(new_link) diff --git a/module/plugins/crypter/RelinkUs.py b/module/plugins/crypter/RelinkUs.py index 6e7c80561..25bd98190 100644 --- a/module/plugins/crypter/RelinkUs.py +++ b/module/plugins/crypter/RelinkUs.py @@ -219,7 +219,7 @@ class RelinkUs(Crypter): try: dlc = self.load(container_url) dlc_filename = self.fileid + ".dlc" - dlc_filepath = fs_join(self.core.config['general']['download_folder'], dlc_filename) + dlc_filepath = fs_join(self.core.config.get("general", "download_folder"), dlc_filename) with open(dlc_filepath, "wb") as f: f.write(dlc) package_links.append(dlc_filepath) diff --git a/module/plugins/crypter/YoutubeComFolder.py b/module/plugins/crypter/YoutubeComFolder.py index 29a889615..c6f86113d 100644 --- a/module/plugins/crypter/YoutubeComFolder.py +++ b/module/plugins/crypter/YoutubeComFolder.py @@ -131,7 +131,7 @@ class YoutubeComFolder(Crypter): for p in playlists: p_name = p['title'] p_videos = self.getVideosId(p['id']) - p_folder = fs_join(self.core.config['general']['download_folder'], p['channelTitle'], p_name) + p_folder = fs_join(self.core.config.get("general", "download_folder"), p['channelTitle'], p_name) self.logDebug("%s video\s found on playlist \"%s\"" % (len(p_videos), p_name)) if not p_videos: diff --git a/module/plugins/hooks/Checksum.py b/module/plugins/hooks/Checksum.py index 9287fda9c..912a1ba1f 100644 --- a/module/plugins/hooks/Checksum.py +++ b/module/plugins/hooks/Checksum.py @@ -104,7 +104,7 @@ class Checksum(Hook): self.checkFailed(pyfile, None, "No file downloaded") local_file = fs_encode(pyfile.plugin.lastDownload) - #download_folder = self.core.config['general']['download_folder'] + #download_folder = self.core.config.get("general", "download_folder") #local_file = fs_encode(fs_join(download_folder, pyfile.package().folder, pyfile.name)) if not os.path.isfile(local_file): @@ -165,7 +165,7 @@ class Checksum(Hook): def package_finished(self, pypack): - download_folder = fs_join(self.core.config['general']['download_folder'], pypack.folder, "") + download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder, "") for link in pypack.getChildren().itervalues(): file_type = os.path.splitext(link['name'])[1][1:].lower() diff --git a/module/plugins/hooks/ClickAndLoad.py b/module/plugins/hooks/ClickAndLoad.py index 81a446ef3..f7431ebac 100644 --- a/module/plugins/hooks/ClickAndLoad.py +++ b/module/plugins/hooks/ClickAndLoad.py @@ -49,11 +49,11 @@ class ClickAndLoad(Hook): def activate(self): - if not self.core.config['webinterface']['activated']: + if not self.core.config.get("webinterface", "activated"): return ip = "" if self.getConfig('extern') else "127.0.0.1" - webport = self.core.config['webinterface']['port'] + webport = self.core.config.get("webinterface", "port") cnlport = self.getConfig('port') self.proxy(ip, webport, cnlport) @@ -85,7 +85,7 @@ class ClickAndLoad(Hook): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - if self.core.config['webinterface']['https']: + if self.core.config.get("webinterface", "https"): try: server_socket = ssl.wrap_socket(server_socket) diff --git a/module/plugins/hooks/DeleteFinished.py b/module/plugins/hooks/DeleteFinished.py index 38d2a7ed0..86532cdad 100644 --- a/module/plugins/hooks/DeleteFinished.py +++ b/module/plugins/hooks/DeleteFinished.py @@ -70,7 +70,9 @@ class DeleteFinished(Hook): ## event managing ## def addEvent(self, event, func): - """Adds an event listener for event name""" + """ + Adds an event listener for event name + """ if event in self.manager.events: if func in self.manager.events[event]: self.logDebug("Function already registered", func) diff --git a/module/plugins/hooks/ExternalScripts.py b/module/plugins/hooks/ExternalScripts.py index 6b3d21d68..29b43929e 100644 --- a/module/plugins/hooks/ExternalScripts.py +++ b/module/plugins/hooks/ExternalScripts.py @@ -126,10 +126,10 @@ class ExternalScripts(Hook): def download_failed(self, pyfile): - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pyfile.package().folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pyfile.package().folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['download_failed']: file = fs_join(download_folder, pyfile.name) @@ -137,10 +137,10 @@ class ExternalScripts(Hook): def download_finished(self, pyfile): - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pyfile.package().folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pyfile.package().folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['download_finished']: file = fs_join(download_folder, pyfile.name) @@ -158,10 +158,10 @@ class ExternalScripts(Hook): def package_finished(self, pypack): - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pypack.folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['package_finished']: self.callScript(script, pypack.id, pypack.name, download_folder, pypack.password) @@ -170,30 +170,30 @@ class ExternalScripts(Hook): def packageDeleted(self, pid): pack = self.core.api.getPackageInfo(pid) - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pack.folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pack.folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['package_deleted']: self.callScript(script, pack.id, pack.name, download_folder, pack.password) def package_extract_failed(self, pypack): - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pypack.folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['package_extract_failed']: self.callScript(script, pypack.id, pypack.name, download_folder, pypack.password) def package_extracted(self, pypack): - if self.core.config['general']['folder_per_package']: - download_folder = fs_join(self.core.config['general']['download_folder'], pypack.folder) + if self.core.config.get("general", "folder_per_package"): + download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder) else: - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") for script in self.scripts['package_extracted']: self.callScript(script, pypack.id, pypack.name, download_folder) diff --git a/module/plugins/hooks/ExtractArchive.py b/module/plugins/hooks/ExtractArchive.py index c9f368e9f..ee41068eb 100644 --- a/module/plugins/hooks/ExtractArchive.py +++ b/module/plugins/hooks/ExtractArchive.py @@ -25,8 +25,10 @@ if sys.version_info < (2, 7) and os.name != "nt": # unsued timeout option for older python version def wait(self, timeout=0): - """Wait for child process to terminate. Returns returncode - attribute.""" + """ + Wait for child process to terminate. Returns returncode + attribute. + """ if self.returncode is None: try: pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) @@ -209,7 +211,9 @@ class ExtractArchive(Hook): @Expose def extractPackage(self, *ids): - """ Extract packages with given id""" + """ + Extract packages with given id + """ for id in ids: self.queue.add(id) if not self.getConfig('waitall') and not self.extracting: @@ -261,7 +265,7 @@ class ExtractArchive(Hook): # reload from txt file self.reloadPasswords() - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") # iterate packages -> extractors -> targets for pid in ids: @@ -510,7 +514,9 @@ class ExtractArchive(Hook): @Expose def getPasswords(self, reload=True): - """ List of saved passwords """ + """ + List of saved passwords + """ if reload: self.reloadPasswords() @@ -535,7 +541,9 @@ class ExtractArchive(Hook): @Expose def addPassword(self, password): - """ Adds a password to saved list""" + """ + Adds a password to saved list + """ try: self.passwords = uniqify([password] + self.passwords) @@ -554,16 +562,16 @@ class ExtractArchive(Hook): continue try: - if self.core.config['permission']['change_file']: + if self.core.config.get("permission", "change_file"): if os.path.isfile(f): - os.chmod(f, int(self.core.config['permission']['file'], 8)) + os.chmod(f, int(self.core.config.get("permission", "file"), 8)) elif os.path.isdir(f): - os.chmod(f, int(self.core.config['permission']['folder'], 8)) + os.chmod(f, int(self.core.config.get("permission", "folder"), 8)) - if self.core.config['permission']['change_dl'] and os.name != "nt": - uid = getpwnam(self.core.config['permission']['user'])[2] - gid = getgrnam(self.core.config['permission']['group'])[2] + if self.core.config.get("permission", "change_dl") and os.name != "nt": + uid = getpwnam(self.core.config.get("permission", "user"))[2] + gid = getgrnam(self.core.config.get("permission", "group"))[2] os.chown(f, uid, gid) except Exception, e: diff --git a/module/plugins/hooks/IRCInterface.py b/module/plugins/hooks/IRCInterface.py index 9176f2d2c..d50fd6107 100644 --- a/module/plugins/hooks/IRCInterface.py +++ b/module/plugins/hooks/IRCInterface.py @@ -392,7 +392,9 @@ class IRCInterface(Thread, Hook): def event_c(self, args): - """ captcha answer """ + """ + Captcha answer + """ if not args: return ["ERROR: Captcha ID missing."] diff --git a/module/plugins/hooks/MergeFiles.py b/module/plugins/hooks/MergeFiles.py index 0b0f7e475..64ab50400 100644 --- a/module/plugins/hooks/MergeFiles.py +++ b/module/plugins/hooks/MergeFiles.py @@ -43,9 +43,9 @@ class MergeFiles(Hook): files[data['name'][:-4]].sort() fid_dict[data['name']] = fid - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") - if self.core.config['general']['folder_per_package']: + if self.core.config.get("general", "folder_per_package"): download_folder = fs_join(download_folder, pack.folder) for name, file_list in files.iteritems(): diff --git a/module/plugins/hooks/MultiHome.py b/module/plugins/hooks/MultiHome.py index fe7f39a12..790d5dab3 100644 --- a/module/plugins/hooks/MultiHome.py +++ b/module/plugins/hooks/MultiHome.py @@ -12,7 +12,7 @@ class MultiHome(Hook): __config__ = [("interfaces", "str", "Interfaces", "None")] - __description__ = """Ip address changer""" + __description__ = """IP address changer""" __license__ = "GPLv3" __authors__ = [("mkaay", "mkaay@mkaay.de")] @@ -28,7 +28,7 @@ class MultiHome(Hook): self.parseInterfaces(self.getConfig('interfaces').split(";")) if not self.interfaces: - self.parseInterfaces([self.core.config['download']['interface']]) + self.parseInterfaces([self.core.config.get("download", "interface")]) self.setConfig("interfaces", self.toConfig()) diff --git a/module/plugins/hooks/UnSkipOnFail.py b/module/plugins/hooks/UnSkipOnFail.py index 234e1052b..9ba53a698 100644 --- a/module/plugins/hooks/UnSkipOnFail.py +++ b/module/plugins/hooks/UnSkipOnFail.py @@ -55,7 +55,7 @@ class UnSkipOnFail(Hook): def findDuplicate(self, pyfile): - """ Search all packages for duplicate links to "pyfile". + """Search all packages for duplicate links to "pyfile". Duplicates are links that would overwrite "pyfile". To test on duplicity the package-folder and link-name of twolinks are compared (link.name). diff --git a/module/plugins/hooks/UpdateManager.py b/module/plugins/hooks/UpdateManager.py index 26b0cc448..0a89405e7 100644 --- a/module/plugins/hooks/UpdateManager.py +++ b/module/plugins/hooks/UpdateManager.py @@ -97,7 +97,9 @@ class UpdateManager(Hook): @Expose def autoreloadPlugins(self): - """ reload and reindex all modified plugins """ + """ + Reload and reindex all modified plugins + """ modules = filter( lambda m: m and (m.__name__.startswith("module.plugins.") or m.__name__.startswith("userplugins.")) and @@ -137,8 +139,9 @@ class UpdateManager(Hook): @Expose @threaded def update(self): - """ check for updates """ - + """ + Check for updates + """ if self._update() is 2 and self.getConfig('autorestart'): if not self.core.api.statusDownloads(): self.core.api.restart() @@ -179,8 +182,9 @@ class UpdateManager(Hook): def _updatePlugins(self, data): - """ check for plugin updates """ - + """ + Check for plugin updates + """ exitcode = 0 updated = [] @@ -290,8 +294,9 @@ class UpdateManager(Hook): @Expose def removePlugins(self, type_plugins): - """ delete plugins from disk """ - + """ + Delete plugins from disk + """ if not type_plugins: return diff --git a/module/plugins/hooks/XMPPInterface.py b/module/plugins/hooks/XMPPInterface.py index f93273df4..847fb26c3 100644 --- a/module/plugins/hooks/XMPPInterface.py +++ b/module/plugins/hooks/XMPPInterface.py @@ -92,9 +92,11 @@ class XMPPInterface(IRCInterface, JabberClient): def stream_state_changed(self, state, arg): - """This one is called when the state of stream connecting the component + """ + This one is called when the state of stream connecting the component to a server changes. This will usually be used to let the user - know what is going on.""" + know what is going on. + """ self.logDebug("*** State changed: %s %r ***" % (state, arg)) @@ -111,15 +113,19 @@ class XMPPInterface(IRCInterface, JabberClient): def get_message_handlers(self): - """Return list of (message_type, message_handler) tuples. + """ + Return list of (message_type, message_handler) tuples. The handlers returned will be called when matching message is received - in a client session.""" + in a client session. + """ return [("normal", self.message)] def message(self, stanza): - """Message handler for the component.""" + """ + Message handler for the component. + """ subject = stanza.get_subject() body = stanza.get_body() t = stanza.get_type() @@ -181,7 +187,9 @@ class XMPPInterface(IRCInterface, JabberClient): def announce(self, message): - """ send message to all owners""" + """ + Send message to all owners + """ for user in self.getConfig('owners').split(";"): self.logDebug("Send message to", user) @@ -209,42 +217,53 @@ class XMPPInterface(IRCInterface, JabberClient): class VersionHandler(object): - """Provides handler for a version query. + """ + Provides handler for a version query. This class will answer version query and announce 'jabber:iq:version' namespace - in the client's disco#info results.""" - + in the client's disco#info results. + """ implements(IIqHandlersProvider, IFeaturesProvider) def __init__(self, client): - """Just remember who created this.""" + """ + Just remember who created this. + """ self.client = client def get_features(self): - """Return namespace which should the client include in its reply to a - disco#info query.""" + """ + Return namespace which should the client include in its reply to a + disco#info query. + """ return ["jabber:iq:version"] def get_iq_get_handlers(self): - """Return list of tuples (element_name, namespace, handler) describing - handlers of <iq type='get'/> stanzas""" + """ + Return list of tuples (element_name, namespace, handler) describing + handlers of <iq type='get'/> stanzas + """ return [("query", "jabber:iq:version", self.get_version)] def get_iq_set_handlers(self): - """Return empty list, as this class provides no <iq type='set'/> stanza handler.""" + """ + Return empty list, as this class provides no <iq type='set'/> stanza handler. + """ return [] def get_version(self, iq): - """Handler for jabber:iq:version queries. + """ + Handler for jabber:iq:version queries. jabber:iq:version queries are not supported directly by PyXMPP, so the XML node is accessed directly through the libxml2 API. This should be - used very carefully!""" + used very carefully! + """ iq = iq.make_result_response() q = iq.new_query("jabber:iq:version") q.newTextChild(q.ns(), "name", "Echo component") diff --git a/module/plugins/hoster/BasePlugin.py b/module/plugins/hoster/BasePlugin.py index de5bca207..82311dd6b 100644 --- a/module/plugins/hoster/BasePlugin.py +++ b/module/plugins/hoster/BasePlugin.py @@ -41,8 +41,9 @@ class BasePlugin(Hoster): def process(self, pyfile): - """main function""" - + """ + Main function + """ pyfile.name = self.getInfo(pyfile.url)['name'] if not pyfile.url.startswith("http"): diff --git a/module/plugins/hoster/BasketbuildCom.py b/module/plugins/hoster/BasketbuildCom.py index 89e4d39f9..cfc945464 100644 --- a/module/plugins/hoster/BasketbuildCom.py +++ b/module/plugins/hoster/BasketbuildCom.py @@ -17,7 +17,7 @@ class BasketbuildCom(SimpleHoster): __pattern__ = r'https?://(?:www\.)?(?:\w\.)?basketbuild\.com/filedl/.+' __config__ = [("use_premium", "bool", "Use premium account if available", True)] - __description__ = """basketbuild.com hoster plugin""" + __description__ = """Basketbuild.com hoster plugin""" __license__ = "GPLv3" __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de")] diff --git a/module/plugins/hoster/DevhostSt.py b/module/plugins/hoster/DevhostSt.py index e7a23f6b1..a8a031aaf 100644 --- a/module/plugins/hoster/DevhostSt.py +++ b/module/plugins/hoster/DevhostSt.py @@ -16,7 +16,7 @@ class DevhostSt(SimpleHoster): __pattern__ = r'http://(?:www\.)?d-h\.st/(?!users/)\w{3}' __config__ = [("use_premium", "bool", "Use premium account if available", True)] - __description__ = """d-h.st hoster plugin""" + __description__ = """D-h.st hoster plugin""" __license__ = "GPLv3" __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de")] diff --git a/module/plugins/hoster/FilesMailRu.py b/module/plugins/hoster/FilesMailRu.py index b24db62b0..66f715962 100644 --- a/module/plugins/hoster/FilesMailRu.py +++ b/module/plugins/hoster/FilesMailRu.py @@ -70,19 +70,25 @@ class FilesMailRu(Hoster): def prepare(self): - """You have to wait some seconds. Otherwise you will get a 40Byte HTML Page instead of the file you expected""" + """ + You have to wait some seconds. Otherwise you will get a 40Byte HTML Page instead of the file you expected + """ self.setWait(10) self.wait() return True def getFileUrl(self): - """gives you the URL to the file. Extracted from the Files.mail.ru HTML-page stored in self.html""" + """ + Gives you the URL to the file. Extracted from the Files.mail.ru HTML-page stored in self.html + """ return re.search(self.url_pattern, self.html).group(0).split('<a href="')[1].split('" onclick="return Act')[0] def getFileName(self): - """gives you the Name for each file. Also extracted from the HTML-Page""" + """ + Gives you the Name for each file. Also extracted from the HTML-Page + """ return re.search(self.url_pattern, self.html).group(0).split(', event)">')[1].split('</a>')[0] diff --git a/module/plugins/hoster/FreakshareCom.py b/module/plugins/hoster/FreakshareCom.py index 6532ba016..5abded2ac 100644 --- a/module/plugins/hoster/FreakshareCom.py +++ b/module/plugins/hoster/FreakshareCom.py @@ -92,7 +92,8 @@ class FreakshareCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() @@ -151,7 +152,8 @@ class FreakshareCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/IfileIt.py b/module/plugins/hoster/IfileIt.py index ef267b505..18aa0b60f 100644 --- a/module/plugins/hoster/IfileIt.py +++ b/module/plugins/hoster/IfileIt.py @@ -11,7 +11,7 @@ class IfileIt(DeadHoster): __pattern__ = r'^unmatchable$' __config__ = [] #@TODO: Remove in 0.4.10 - __description__ = """Ifile.it""" + __description__ = """Ifile.it hoster plugin""" __license__ = "GPLv3" __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] diff --git a/module/plugins/hoster/LolabitsEs.py b/module/plugins/hoster/LolabitsEs.py index 8ad811248..08773888b 100644 --- a/module/plugins/hoster/LolabitsEs.py +++ b/module/plugins/hoster/LolabitsEs.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -* -import HTMLParser import re from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.utils import html_unescape class LolabitsEs(SimpleHoster): @@ -43,7 +43,7 @@ class LolabitsEs(SimpleHoster): '__RequestVerificationToken' : token}, decode="unicode-escape") - self.link = HTMLParser.HTMLParser().unescape(re.search(self.LINK_PATTERN, self.html).group(1)) + self.link = html_unescape(re.search(self.LINK_PATTERN, self.html).group(1)) getInfo = create_getInfo(LolabitsEs) diff --git a/module/plugins/hoster/MegaCoNz.py b/module/plugins/hoster/MegaCoNz.py index 08eab2fb1..20b879aba 100644 --- a/module/plugins/hoster/MegaCoNz.py +++ b/module/plugins/hoster/MegaCoNz.py @@ -68,7 +68,9 @@ class MegaCoNz(Hoster): def getCipherKey(self, key): - """ Construct the cipher key from the given data """ + """ + Construct the cipher key from the given data + """ a = array.array("I", self.b64_decode(key)) k = array.array("I", (a[0] ^ a[4], a[1] ^ a[5], a[2] ^ a[6], a[3] ^ a[7])) @@ -79,8 +81,9 @@ class MegaCoNz(Hoster): def api_response(self, **kwargs): - """ Dispatch a call to the api, see https://mega.co.nz/#developers """ - + """ + Dispatch a call to the api, see https://mega.co.nz/#developers + """ # generate a session id, no idea where to obtain elsewhere uid = random.randint(10 << 9, 10 ** 10) @@ -103,8 +106,9 @@ class MegaCoNz(Hoster): def decryptFile(self, key): - """ Decrypts the file at lastDownload` """ - + """ + Decrypts the file at lastDownload` + """ # upper 64 bit of counter start n = self.b64_decode(key)[16:24] diff --git a/module/plugins/hoster/MegaDebridEu.py b/module/plugins/hoster/MegaDebridEu.py index 8c713bbb9..b83b80e46 100644 --- a/module/plugins/hoster/MegaDebridEu.py +++ b/module/plugins/hoster/MegaDebridEu.py @@ -15,7 +15,7 @@ class MegaDebridEu(MultiHoster): __pattern__ = r'http://((?:www\d+\.|s\d+\.)?mega-debrid\.eu|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/download/file/[\w^_]+' __config__ = [("use_premium", "bool", "Use premium account if available", True)] - __description__ = """mega-debrid.eu multi-hoster plugin""" + __description__ = """Mega-debrid.eu multi-hoster plugin""" __license__ = "GPLv3" __authors__ = [("D.Ducatel", "dducatel@je-geek.fr")] diff --git a/module/plugins/hoster/MegacrypterCom.py b/module/plugins/hoster/MegacrypterCom.py index 10a2eb025..aea564ded 100644 --- a/module/plugins/hoster/MegacrypterCom.py +++ b/module/plugins/hoster/MegacrypterCom.py @@ -24,7 +24,9 @@ class MegacrypterCom(MegaCoNz): def api_response(self, **kwargs): - """ Dispatch a call to the api, see megacrypter.com/api_doc """ + """ + Dispatch a call to the api, see megacrypter.com/api_doc + """ self.logDebug("JSON request: " + json_dumps(kwargs)) res = self.load(self.API_URL, post=json_dumps(kwargs)) self.logDebug("API Response: " + res) diff --git a/module/plugins/hoster/MyvideoDe.py b/module/plugins/hoster/MyvideoDe.py index bc4d1ffeb..2194069f5 100644 --- a/module/plugins/hoster/MyvideoDe.py +++ b/module/plugins/hoster/MyvideoDe.py @@ -3,7 +3,7 @@ import re from module.plugins.internal.Hoster import Hoster -from module.unescape import unescape +from module.utils import html_unescape class MyvideoDe(Hoster): @@ -38,7 +38,7 @@ class MyvideoDe(Hoster): def get_file_name(self): file_name_pattern = r'<h1 class=\'globalHd\'>(.*)</h1>' - return unescape(re.search(file_name_pattern, self.html).group(1).replace("/", "") + '.flv') + return html_unescape(re.search(file_name_pattern, self.html).group(1).replace("/", "") + '.flv') def file_exists(self): diff --git a/module/plugins/hoster/OboomCom.py b/module/plugins/hoster/OboomCom.py index ae51d4b5a..e2a9c114a 100644 --- a/module/plugins/hoster/OboomCom.py +++ b/module/plugins/hoster/OboomCom.py @@ -17,7 +17,7 @@ class OboomCom(Hoster): __pattern__ = r'https?://(?:www\.)?oboom\.com/(?:#(?:id=|/)?)?(?P<ID>\w{8})' - __description__ = """oboom.com hoster plugin""" + __description__ = """Oboom.com hoster plugin""" __license__ = "GPLv3" __authors__ = [("stanley", "stanley.foerster@gmail.com")] diff --git a/module/plugins/hoster/PornhostCom.py b/module/plugins/hoster/PornhostCom.py index a8bbfdb80..55e04e5f6 100644 --- a/module/plugins/hoster/PornhostCom.py +++ b/module/plugins/hoster/PornhostCom.py @@ -33,7 +33,8 @@ class PornhostCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() @@ -68,7 +69,8 @@ class PornhostCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/PornhubCom.py b/module/plugins/hoster/PornhubCom.py index 0c7e3671e..857bb404c 100644 --- a/module/plugins/hoster/PornhubCom.py +++ b/module/plugins/hoster/PornhubCom.py @@ -32,7 +32,8 @@ class PornhubCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() @@ -78,7 +79,8 @@ class PornhubCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/RedtubeCom.py b/module/plugins/hoster/RedtubeCom.py index 3915b1421..15ce3b2b1 100644 --- a/module/plugins/hoster/RedtubeCom.py +++ b/module/plugins/hoster/RedtubeCom.py @@ -3,7 +3,7 @@ import re from module.plugins.internal.Hoster import Hoster -from module.unescape import unescape +from module.utils import html_unescape class RedtubeCom(Hoster): @@ -33,14 +33,13 @@ class RedtubeCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() - file_url = unescape(re.search(r'hashlink=(http.*?)"', self.html).group(1)) - - return file_url + return html_unescape(re.search(r'hashlink=(http.*?)"', self.html).group(1)) def get_file_name(self): @@ -51,7 +50,8 @@ class RedtubeCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/ShareplaceCom.py b/module/plugins/hoster/ShareplaceCom.py index 9e27aea1e..47ad05a8c 100644 --- a/module/plugins/hoster/ShareplaceCom.py +++ b/module/plugins/hoster/ShareplaceCom.py @@ -55,7 +55,8 @@ class ShareplaceCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ url = re.search(r"var beer = '(.*?)';", self.html) if url: @@ -77,7 +78,8 @@ class ShareplaceCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/VeehdCom.py b/module/plugins/hoster/VeehdCom.py index cd7572dd3..11c70ebff 100644 --- a/module/plugins/hoster/VeehdCom.py +++ b/module/plugins/hoster/VeehdCom.py @@ -68,7 +68,8 @@ class VeehdCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/XHamsterCom.py b/module/plugins/hoster/XHamsterCom.py index 2d742cfa8..d9441d792 100644 --- a/module/plugins/hoster/XHamsterCom.py +++ b/module/plugins/hoster/XHamsterCom.py @@ -47,7 +47,8 @@ class XHamsterCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() @@ -118,7 +119,8 @@ class XHamsterCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/Xdcc.py b/module/plugins/hoster/Xdcc.py index efe3b6d6b..20f800967 100644 --- a/module/plugins/hoster/Xdcc.py +++ b/module/plugins/hoster/Xdcc.py @@ -189,7 +189,7 @@ class Xdcc(Hoster): self.pyfile.name = packname - download_folder = self.core.config['general']['download_folder'] + download_folder = self.core.config.get("general", "download_folder") filename = fs_join(download_folder, packname) self.logInfo(_("Downloading %s from %s:%d") % (packname, ip, port)) diff --git a/module/plugins/hoster/YoupornCom.py b/module/plugins/hoster/YoupornCom.py index 615b10d65..fa40714c6 100644 --- a/module/plugins/hoster/YoupornCom.py +++ b/module/plugins/hoster/YoupornCom.py @@ -33,7 +33,8 @@ class YoupornCom(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ if not self.html: self.download_html() @@ -50,7 +51,8 @@ class YoupornCom(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/YourfilesTo.py b/module/plugins/hoster/YourfilesTo.py index 4d316eabf..f64ac1a43 100644 --- a/module/plugins/hoster/YourfilesTo.py +++ b/module/plugins/hoster/YourfilesTo.py @@ -56,7 +56,8 @@ class YourfilesTo(Hoster): def get_file_url(self): - """ returns the absolute downloadable filepath + """ + Returns the absolute downloadable filepath """ url = re.search(r"var bla = '(.*?)';", self.html) if url: @@ -75,7 +76,8 @@ class YourfilesTo(Hoster): def file_exists(self): - """ returns True or False + """ + Returns True or False """ if not self.html: self.download_html() diff --git a/module/plugins/hoster/YoutubeCom.py b/module/plugins/hoster/YoutubeCom.py index e53a66d00..b2696ddfb 100644 --- a/module/plugins/hoster/YoutubeCom.py +++ b/module/plugins/hoster/YoutubeCom.py @@ -11,9 +11,10 @@ from module.utils import html_unescape def which(program): - """Works exactly like the unix command which - Courtesy of http://stackoverflow.com/a/377028/675646""" - + """ + Works exactly like the unix command which + Courtesy of http://stackoverflow.com/a/377028/675646 + """ isExe = lambda x: os.path.isfile(x) and os.access(x, os.X_OK) fpath, fname = os.path.split(program) diff --git a/module/plugins/internal/Account.py b/module/plugins/internal/Account.py index 0e2996aaa..0595da20b 100644 --- a/module/plugins/internal/Account.py +++ b/module/plugins/internal/Account.py @@ -106,8 +106,9 @@ class Account(Plugin): def updateAccounts(self, user, password=None, options={}): - """Updates account and return true if anything changed""" - + """ + Updates account and return true if anything changed + """ if user in self.accounts: self.accounts[user]['valid'] = True #: do not remove or accounts will not login if password: @@ -227,7 +228,9 @@ class Account(Plugin): def selectAccount(self): - """Returns an valid account name and data""" + """ + Returns an valid account name and data + """ usable = [] for user, data in self.accounts.iteritems(): if not data['valid']: @@ -290,14 +293,18 @@ class Account(Plugin): def scheduleRefresh(self, user, time=0, force=True): - """Add task to refresh account info to sheduler""" + """ + Add task to refresh account info to sheduler + """ self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time)) self.core.scheduler.addJob(time, self.getAccountInfo, [user, force]) @lock def checkLogin(self, user): - """Checks if user is still logged in""" + """ + Checks if user is still logged in + """ if user in self.timestamps: if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time.time(): self.logDebug("Reached login timeout for %s" % user) diff --git a/module/plugins/internal/Container.py b/module/plugins/internal/Container.py index 097b04ac7..fc1a93606 100644 --- a/module/plugins/internal/Container.py +++ b/module/plugins/internal/Container.py @@ -23,8 +23,9 @@ class Container(Crypter): def preprocessing(self, thread): - """Prepare""" - + """ + Prepare + """ self.setup() self.thread = thread @@ -37,9 +38,10 @@ class Container(Crypter): def _load2disk(self): - """Loads container to disk if its stored remotely and overwrite url, - or check existent on several places at disk""" - + """ + Loads container to disk if its stored remotely and overwrite url, + or check existent on several places at disk + """ if self.pyfile.url.startswith("http"): self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1] content = self.load(self.pyfile.url) diff --git a/module/plugins/internal/Crypter.py b/module/plugins/internal/Crypter.py index a713c7da6..e97f22316 100644 --- a/module/plugins/internal/Crypter.py +++ b/module/plugins/internal/Crypter.py @@ -34,8 +34,9 @@ class Crypter(Hoster): def process(self, pyfile): - """Main method""" - + """ + Main method + """ self.decrypt(pyfile) if self.urls: @@ -52,20 +53,22 @@ class Crypter(Hoster): def _generate_packages(self): - """Generate new packages from self.urls""" - + """ + Generate new packages from self.urls + """ packages = [(name, links, None) for name, links in self.core.api.generatePackages(self.urls).iteritems()] self.packages.extend(packages) def _create_packages(self): - """Create new packages from self.packages""" - + """ + Create new packages from self.packages + """ package_folder = self.pyfile.package().folder package_password = self.pyfile.package().password package_queue = self.pyfile.package().queue - folder_per_package = self.core.config.get('general', 'folder_per_package') + folder_per_package = self.core.config.get("general", "folder_per_package") use_subfolder = self.getConfig('use_subfolder', folder_per_package) subfolder_per_package = self.getConfig('subfolder_per_package', True) diff --git a/module/plugins/internal/Extractor.py b/module/plugins/internal/Extractor.py index 2aa26e64a..f73388d8c 100644 --- a/module/plugins/internal/Extractor.py +++ b/module/plugins/internal/Extractor.py @@ -82,7 +82,9 @@ class Extractor(Plugin): delete='No', keepbroken=False, fid=None): - """Initialize extractor for specific file""" + """ + Initialize extractor for specific file + """ self.manager = manager self.filename = filename self.out = out @@ -99,7 +101,9 @@ class Extractor(Plugin): def init(self): - """Initialize additional data structures""" + """ + Initialize additional data structures + """ pass @@ -155,5 +159,7 @@ class Extractor(Plugin): def list(self, password=None): - """Populate self.files at some point while extracting""" + """ + Populate self.files at some point while extracting + """ return self.files diff --git a/module/plugins/internal/Hook.py b/module/plugins/internal/Hook.py index 01ffbc5f2..3a0431feb 100644 --- a/module/plugins/internal/Hook.py +++ b/module/plugins/internal/Hook.py @@ -6,8 +6,9 @@ from module.plugins.internal.Plugin import Plugin class Expose(object): - """Used for decoration to declare rpc services""" - + """ + Used for decoration to declare rpc services + """ def __new__(cls, f, *args, **kwargs): hookManager.addRPC(f.__module__, f.func_name, f.func_doc) return f @@ -113,12 +114,16 @@ class Hook(Plugin): def setup(self): - """More init stuff if needed""" + """ + More init stuff if needed + """ pass def is_activated(self): - """Checks if hook is activated""" + """ + Checks if hook is activated + """ return self.getConfig("activated") @@ -128,7 +133,9 @@ class Hook(Plugin): def deactivate(self): - """Called when hook was deactivated""" + """ + Called when hook was deactivated + """ pass @@ -138,7 +145,9 @@ class Hook(Plugin): def activate(self): - """Called when hook was activated""" + """ + Called when hook was activated + """ pass @@ -148,7 +157,9 @@ class Hook(Plugin): def exit(self): - """Called by core.shutdown just before pyLoad exit""" + """ + Called by core.shutdown just before pyLoad exit + """ pass @@ -212,7 +223,9 @@ class Hook(Plugin): def captcha_task(self, task): - """New captcha task for the plugin, it MUST set the handler and timeout or will be ignored""" + """ + New captcha task for the plugin, it MUST set the handler and timeout or will be ignored + """ pass diff --git a/module/plugins/internal/Hoster.py b/module/plugins/internal/Hoster.py index 40430c38d..32c3312d0 100644 --- a/module/plugins/internal/Hoster.py +++ b/module/plugins/internal/Hoster.py @@ -321,7 +321,6 @@ class Hoster(Plugin): :return: result of decrypting """ - img = self.load(url, get=get, post=post, cookies=cookies) id = ("%.2f" % time.time())[-6:].replace(".", "") diff --git a/module/plugins/internal/MultiHook.py b/module/plugins/internal/MultiHook.py index 0bcab5915..739b225b4 100644 --- a/module/plugins/internal/MultiHook.py +++ b/module/plugins/internal/MultiHook.py @@ -153,7 +153,9 @@ class MultiHook(Hook): def periodical(self): - """Reload plugin list periodically""" + """ + Reload plugin list periodically + """ self.loadAccount() if self.getConfig('reload', True): @@ -244,7 +246,9 @@ class MultiHook(Hook): def deactivate(self): - """Remove override for all plugins. Scheduler job is removed by hookmanager""" + """ + Remove override for all plugins. Scheduler job is removed by hookmanager + """ for plugin in self.supported: self.unloadPlugin(plugin) diff --git a/module/plugins/internal/OCR.py b/module/plugins/internal/OCR.py index 2d41ab39e..5fe6f2532 100644 --- a/module/plugins/internal/OCR.py +++ b/module/plugins/internal/OCR.py @@ -38,7 +38,9 @@ class OCR(Plugin): def deactivate(self): - """Delete all tmp images""" + """ + Delete all tmp images + """ pass @@ -47,8 +49,9 @@ class OCR(Plugin): def run(self, command): - """Run a command""" - + """ + Run a command + """ popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) popen.wait() output = popen.stdout.read() + " | " + popen.stderr.read() @@ -189,8 +192,9 @@ class OCR(Plugin): def derotate_by_average(self): - """Rotate by checking each angle and guess most suitable""" - + """ + Rotate by checking each angle and guess most suitable + """ w, h = self.image.size pixels = self.pixels diff --git a/module/plugins/internal/Plugin.py b/module/plugins/internal/Plugin.py index 0d4c3b165..68169e077 100644 --- a/module/plugins/internal/Plugin.py +++ b/module/plugins/internal/Plugin.py @@ -139,7 +139,9 @@ class Plugin(object): #: Deprecated method def setConf(self, *args, **kwargs): - """See `setConfig`""" + """ + See `setConfig` + """ return self.setConfig(*args, **kwargs) @@ -160,39 +162,53 @@ class Plugin(object): #: Deprecated method def getConf(self, *args, **kwargs): - """See `getConfig`""" + """ + See `getConfig` + """ return self.getConfig(*args, **kwargs) def store(self, key, value): - """Saves a value persistently to the database""" + """ + Saves a value persistently to the database + """ self.core.db.setStorage(self.__name__, key, value) #: Deprecated method def setStorage(self, *args, **kwargs): - """Same as `setStorage`""" + """ + Same as `setStorage` + """ return self.store(*args, **kwargs) def retrieve(self, key, default=None): - """Retrieves saved value or dict of all saved entries if key is None""" + """ + Retrieves saved value or dict of all saved entries if key is None + """ return self.core.db.getStorage(self.__name__, key) or default #: Deprecated method def getStorage(self, *args, **kwargs): - """Same as `getStorage`""" + """ + Same as `getStorage` + """ return self.retrieve(*args, **kwargs) def delStorage(self, key): - """Delete entry in db""" + """ + Delete entry in db + """ self.core.db.delStorage(self.__name__, key) def fail(self, reason): - """Fail and give reason""" + """ + Fail and give reason + """ raise Fail(fs_encode(reason)) diff --git a/module/plugins/internal/SimpleCrypter.py b/module/plugins/internal/SimpleCrypter.py index db253d950..7685be55a 100644 --- a/module/plugins/internal/SimpleCrypter.py +++ b/module/plugins/internal/SimpleCrypter.py @@ -50,7 +50,6 @@ class SimpleCrypter(Crypter, SimpleHoster): def loadPage(self, page_n): return the html of the page number page_n """ - #@TODO: Remove in 0.4.10 def init(self): account_name = (self.__name__ + ".py").replace("Folder.py", "").replace(".py", "") diff --git a/module/plugins/internal/SimpleHoster.py b/module/plugins/internal/SimpleHoster.py index 979da24a9..067b97747 100644 --- a/module/plugins/internal/SimpleHoster.py +++ b/module/plugins/internal/SimpleHoster.py @@ -143,7 +143,6 @@ class SimpleHoster(Hoster): LINK_PREMIUM_PATTERN: (optional) group(1) should be the direct link for premium download example: LINK_PREMIUM_PATTERN = r'<div class="link"><a href="(.+?)"' """ - NAME_REPLACEMENTS = [("&#?\w+;", fixup)] SIZE_REPLACEMENTS = [] URL_REPLACEMENTS = [] diff --git a/module/plugins/internal/XFSHoster.py b/module/plugins/internal/XFSHoster.py index fbce5e2fb..0f4f90128 100644 --- a/module/plugins/internal/XFSHoster.py +++ b/module/plugins/internal/XFSHoster.py @@ -56,7 +56,9 @@ class XFSHoster(SimpleHoster): def prepare(self): - """ Initialize important variables """ + """ + Initialize important variables + """ if not self.HOSTER_DOMAIN: if self.account: account = self.account |