summaryrefslogtreecommitdiffstats
path: root/module/plugins/hoster
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/hoster')
-rw-r--r--module/plugins/hoster/CatShareNet.py14
-rw-r--r--module/plugins/hoster/EuroshareEu.py2
-rw-r--r--module/plugins/hoster/FreakshareCom.py20
-rw-r--r--module/plugins/hoster/Keep2ShareCc.py13
-rw-r--r--module/plugins/hoster/NetloadIn.py2
-rw-r--r--module/plugins/hoster/OverLoadMe.py2
-rw-r--r--module/plugins/hoster/PornhubCom.py2
-rw-r--r--module/plugins/hoster/RapiduNet.py28
-rw-r--r--module/plugins/hoster/RealdebridCom.py2
-rw-r--r--module/plugins/hoster/RedtubeCom.py2
-rw-r--r--module/plugins/hoster/RemixshareCom.py33
-rw-r--r--module/plugins/hoster/ShareplaceCom.py2
-rw-r--r--module/plugins/hoster/SolidfilesCom.py33
-rw-r--r--module/plugins/hoster/XHamsterCom.py2
-rw-r--r--module/plugins/hoster/YadiSk.py84
-rw-r--r--module/plugins/hoster/YoupornCom.py2
-rw-r--r--module/plugins/hoster/YourfilesTo.py2
-rw-r--r--module/plugins/hoster/ZippyshareCom.py4
18 files changed, 180 insertions, 69 deletions
diff --git a/module/plugins/hoster/CatShareNet.py b/module/plugins/hoster/CatShareNet.py
index ec9c62a23..9e3f28cfa 100644
--- a/module/plugins/hoster/CatShareNet.py
+++ b/module/plugins/hoster/CatShareNet.py
@@ -9,7 +9,7 @@ from module.plugins.internal.CaptchaService import ReCaptcha
class CatShareNet(SimpleHoster):
__name__ = "CatShareNet"
__type__ = "hoster"
- __version__ = "0.12"
+ __version__ = "0.13"
__pattern__ = r'http://(?:www\.)?catshare\.net/\w{16}'
__config__ = [("use_premium", "bool", "Use premium account if available", True)]
@@ -24,12 +24,13 @@ class CatShareNet(SimpleHoster):
TEXT_ENCODING = True
INFO_PATTERN = r'<title>(?P<N>.+) \((?P<S>[\d.,]+) (?P<U>[\w^_]+)\)<'
- OFFLINE_PATTERN = ur'Podany plik został usunięty\s*</div>'
+ OFFLINE_PATTERN = r'<div class="alert alert-error"'
IP_BLOCKED_PATTERN = ur'>Nasz serwis wykrył że Twój adres IP nie pochodzi z Polski.<'
WAIT_PATTERN = r'var\scount\s=\s(\d+);'
- LINK_FREE_PATTERN = LINK_PREMIUM_PATTERN = r'<form action="(.+?)" method="GET">'
+ LINK_FREE_PATTERN = r'<form action="(.+?)" method="GET">'
+ LINK_PREMIUM_PATTERN = r'<form action="(.+?)" method="GET">'
def setup(self):
@@ -54,11 +55,8 @@ class CatShareNet(SimpleHoster):
'recaptcha_response_field' : response})
m = re.search(self.LINK_FREE_PATTERN, self.html)
- if m is None:
- self.invalidCaptcha()
- self.retry(reason=_("Wrong captcha entered"))
-
- self.link = m.group(1)
+ if m:
+ self.link = m.group(1)
getInfo = create_getInfo(CatShareNet)
diff --git a/module/plugins/hoster/EuroshareEu.py b/module/plugins/hoster/EuroshareEu.py
index c5059e69e..922665c2e 100644
--- a/module/plugins/hoster/EuroshareEu.py
+++ b/module/plugins/hoster/EuroshareEu.py
@@ -48,7 +48,7 @@ class EuroshareEu(SimpleHoster):
def handleFree(self, pyfile):
- if re.search(self.ERR_PARDL_PATTERN, self.html) is not None:
+ if re.search(self.ERR_PARDL_PATTERN, self.html):
self.longWait(5 * 60, 12)
m = re.search(self.LINK_FREE_PATTERN, self.html)
diff --git a/module/plugins/hoster/FreakshareCom.py b/module/plugins/hoster/FreakshareCom.py
index 9a11f933d..6a595e75b 100644
--- a/module/plugins/hoster/FreakshareCom.py
+++ b/module/plugins/hoster/FreakshareCom.py
@@ -107,12 +107,14 @@ class FreakshareCom(Hoster):
def get_file_name(self):
if not self.html:
self.download_html()
+
if not self.wantReconnect:
- file_name = re.search(r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center;\">([^ ]+)", self.html)
- if file_name is not None:
- file_name = file_name.group(1)
+ m = re.search(r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center;\">([^ ]+)", self.html)
+ if m:
+ file_name = m.group(1)
else:
file_name = self.pyfile.url
+
return file_name
else:
return self.pyfile.url
@@ -122,12 +124,12 @@ class FreakshareCom(Hoster):
size = 0
if not self.html:
self.download_html()
+
if not self.wantReconnect:
- file_size_check = re.search(
- r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center;\">[^ ]+ - ([^ ]+) (\w\w)yte", self.html)
- if file_size_check is not None:
- units = float(file_size_check.group(1).replace(",", ""))
- pow = {'KB': 1, 'MB': 2, 'GB': 3}[file_size_check.group(2)]
+ m = re.search(r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center;\">[^ ]+ - ([^ ]+) (\w\w)yte", self.html)
+ if m:
+ units = float(m.group(1).replace(",", ""))
+ pow = {'KB': 1, 'MB': 2, 'GB': 3}[m.group(2)]
size = int(units * 1024 ** pow)
return size
@@ -153,7 +155,7 @@ class FreakshareCom(Hoster):
"""
if not self.html:
self.download_html()
- if re.search(r"This file does not exist!", self.html) is not None:
+ if re.search(r"This file does not exist!", self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/Keep2ShareCc.py b/module/plugins/hoster/Keep2ShareCc.py
index 296226e3c..65e9ddc2d 100644
--- a/module/plugins/hoster/Keep2ShareCc.py
+++ b/module/plugins/hoster/Keep2ShareCc.py
@@ -30,7 +30,7 @@ class Keep2ShareCc(SimpleHoster):
OFFLINE_PATTERN = r'File not found or deleted|Sorry, this file is blocked or deleted|Error 404'
TEMP_OFFLINE_PATTERN = r'Downloading blocked due to'
- LINK_FREE_PATTERN = r'"([^"]+url.html\?file=.+?)"|window\.location\.href = \'(.+?)\';'
+ LINK_FREE_PATTERN = r'"(.+?url.html\?file=.+?)"|window\.location\.href = \'(.+?)\';'
LINK_PREMIUM_PATTERN = r'window\.location\.href = \'(.+?)\';'
CAPTCHA_PATTERN = r'src="(/file/captcha\.html.+?)"'
@@ -67,20 +67,18 @@ class Keep2ShareCc(SimpleHoster):
def handleFree(self, pyfile):
- self.fid = re.search(r'<input type="hidden" name="slow_id" value="([^"]+)">', self.html).group(1)
+ self.fid = re.search(r'<input type="hidden" name="slow_id" value="(.+?)">', self.html).group(1)
self.html = self.load(pyfile.url, post={'yt0': '', 'slow_id': self.fid})
- self.logDebug(self.fid)
- self.logDebug(pyfile.url)
+
+ # self.logDebug(self.fid)
+ # self.logDebug(pyfile.url)
self.checkErrors()
m = re.search(self.LINK_FREE_PATTERN, self.html)
-
if m is None:
self.handleCaptcha()
-
self.wait(31)
-
self.html = self.load(pyfile.url)
m = re.search(self.LINK_FREE_PATTERN, self.html)
@@ -98,6 +96,7 @@ class Keep2ShareCc(SimpleHoster):
m = re.search(r'id="(captcha\-form)"', self.html)
self.logDebug("captcha-form found %s" % m)
+
m = re.search(self.CAPTCHA_PATTERN, self.html)
self.logDebug("CAPTCHA_PATTERN found %s" % m)
if m:
diff --git a/module/plugins/hoster/NetloadIn.py b/module/plugins/hoster/NetloadIn.py
index 0ff3c25d3..57af3f18e 100644
--- a/module/plugins/hoster/NetloadIn.py
+++ b/module/plugins/hoster/NetloadIn.py
@@ -268,7 +268,7 @@ class NetloadIn(Hoster):
try:
file_url_pattern = r'<a class="Orange_Link" href="(http://.+)".?>Or click here'
attempt = re.search(file_url_pattern, page)
- if attempt is not None:
+ if attempt:
return attempt.group(1)
else:
self.logDebug("Backup try for final link")
diff --git a/module/plugins/hoster/OverLoadMe.py b/module/plugins/hoster/OverLoadMe.py
index 398946e43..934de5746 100644
--- a/module/plugins/hoster/OverLoadMe.py
+++ b/module/plugins/hoster/OverLoadMe.py
@@ -42,7 +42,7 @@ class OverLoadMe(MultiHoster):
self.logWarning(data['msg'])
self.tempOffline()
else:
- if pyfile.name is not None and pyfile.name.endswith('.tmp') and data['filename']:
+ if pyfile.name and pyfile.name.endswith('.tmp') and data['filename']:
pyfile.name = data['filename']
pyfile.size = parseFileSize(data['filesize'])
diff --git a/module/plugins/hoster/PornhubCom.py b/module/plugins/hoster/PornhubCom.py
index 9e0b16a85..16ce36ea9 100644
--- a/module/plugins/hoster/PornhubCom.py
+++ b/module/plugins/hoster/PornhubCom.py
@@ -83,7 +83,7 @@ class PornhubCom(Hoster):
if not self.html:
self.download_html()
- if re.search(r'This video is no longer in our database or is in conversion', self.html) is not None:
+ if re.search(r'This video is no longer in our database or is in conversion', self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/RapiduNet.py b/module/plugins/hoster/RapiduNet.py
index f43eda0cb..8a85bc844 100644
--- a/module/plugins/hoster/RapiduNet.py
+++ b/module/plugins/hoster/RapiduNet.py
@@ -13,7 +13,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class RapiduNet(SimpleHoster):
__name__ = "RapiduNet"
__type__ = "hoster"
- __version__ = "0.07"
+ __version__ = "0.08"
__pattern__ = r'https?://(?:www\.)?rapidu\.net/(?P<ID>\d{10})'
__config__ = [("use_premium", "bool", "Use premium account if available", True)]
@@ -26,7 +26,7 @@ class RapiduNet(SimpleHoster):
COOKIES = [("rapidu.net", "rapidu_lang", "en")]
INFO_PATTERN = r'<h1 title="(?P<N>.*)">.*</h1>\s*<small>(?P<S>\d+(\.\d+)?)\s(?P<U>\w+)</small>'
- OFFLINE_PATTERN = r'404 - File not found'
+ OFFLINE_PATTERN = r'<h1>404'
ERROR_PATTERN = r'<div class="error">'
@@ -58,20 +58,18 @@ class RapiduNet(SimpleHoster):
self.wait(int(jsvars['timeToDownload']) - int(time.time()))
recaptcha = ReCaptcha(self)
+ response, challenge = recaptcha.challenge(self.RECAPTCHA_KEY)
- for _i in xrange(10):
- response, challenge = recaptcha.challenge(self.RECAPTCHA_KEY)
-
- jsvars = self.getJsonResponse("https://rapidu.net/ajax.php",
- get={'a': "getCheckCaptcha"},
- post={'_go' : "",
- 'captcha1': challenge,
- 'captcha2': response,
- 'fileId' : self.info['pattern']['ID']},
- decode=True)
- if jsvars['message'] == 'success':
- self.download(jsvars['url'])
- break
+ jsvars = self.getJsonResponse("https://rapidu.net/ajax.php",
+ get={'a': "getCheckCaptcha"},
+ post={'_go' : "",
+ 'captcha1': challenge,
+ 'captcha2': response,
+ 'fileId' : self.info['pattern']['ID']},
+ decode=True)
+
+ if jsvars['message'] == 'success':
+ self.link = jsvars['url']
def getJsonResponse(self, *args, **kwargs):
diff --git a/module/plugins/hoster/RealdebridCom.py b/module/plugins/hoster/RealdebridCom.py
index 1a8715e0e..f35eb5e03 100644
--- a/module/plugins/hoster/RealdebridCom.py
+++ b/module/plugins/hoster/RealdebridCom.py
@@ -44,7 +44,7 @@ class RealdebridCom(MultiHoster):
self.logWarning(data['message'])
self.tempOffline()
else:
- if pyfile.name is not None and pyfile.name.endswith('.tmp') and data['file_name']:
+ if pyfile.name and pyfile.name.endswith('.tmp') and data['file_name']:
pyfile.name = data['file_name']
pyfile.size = parseFileSize(data['file_size'])
self.link = data['generated_links'][0][-1]
diff --git a/module/plugins/hoster/RedtubeCom.py b/module/plugins/hoster/RedtubeCom.py
index d68fbe262..9051c498a 100644
--- a/module/plugins/hoster/RedtubeCom.py
+++ b/module/plugins/hoster/RedtubeCom.py
@@ -56,7 +56,7 @@ class RedtubeCom(Hoster):
if not self.html:
self.download_html()
- if re.search(r'This video has been removed.', self.html) is not None:
+ if re.search(r'This video has been removed.', self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/RemixshareCom.py b/module/plugins/hoster/RemixshareCom.py
index 803256d86..d60101aed 100644
--- a/module/plugins/hoster/RemixshareCom.py
+++ b/module/plugins/hoster/RemixshareCom.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
#
# Test links:
-# http://remixshare.com/download/p946u
+# http://remixshare.com/download/z8uli
#
# Note:
# The remixshare.com website is very very slow, so
@@ -16,23 +16,26 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class RemixshareCom(SimpleHoster):
__name__ = "RemixshareCom"
__type__ = "hoster"
- __version__ = "0.03"
+ __version__ = "0.05"
__pattern__ = r'https?://remixshare\.com/(download|dl)/\w+'
__config__ = [("use_premium", "bool", "Use premium account if available", True)]
__description__ = """Remixshare.com hoster plugin"""
__license__ = "GPLv3"
- __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de"),
- ("Walter Purcaro", "vuolter@gmail.com")]
+ __authors__ = [("zapp-brannigan", "fuerst.reinje@web.de" ),
+ ("Walter Purcaro", "vuolter@gmail.com" ),
+ ("sraedler" , "simon.raedler@yahoo.de")]
- INFO_PATTERN = r'title=\'.+?\'>(?P<N>.+?)</span><span class=\'light2\'>&nbsp;\((?P<S>\d+)&nbsp;(?P<U>[\w^_]+)\)<'
- OFFLINE_PATTERN = r'<h1>Ooops!<'
+ INFO_PATTERN = r'title=\'.+?\'>(?P<N>.+?)</span><span class=\'light2\'>&nbsp;\((?P<S>\d+)&nbsp;(?P<U>[\w^_]+)\)<'
+ HASHSUM_PATTERN = r'>(?P<T>MD5): (?P<H>\w+)'
+ OFFLINE_PATTERN = r'<h1>Ooops!'
- LINK_FREE_PATTERN = r'(http://remixshare\.com/downloadfinal/.+?)"'
+ LINK_PATTERN = r'var uri = "(.+?)"'
TOKEN_PATTERN = r'var acc = (\d+)'
- WAIT_PATTERN = r'var XYZ = r"(\d+)"'
+
+ WAIT_PATTERN = r'var XYZ = "(\d+)"'
def setup(self):
@@ -41,21 +44,15 @@ class RemixshareCom(SimpleHoster):
def handleFree(self, pyfile):
- b = re.search(self.LINK_FREE_PATTERN, self.html)
+ b = re.search(self.LINK_PATTERN, self.html)
if not b:
- self.error(_("Cannot parse download url"))
+ self.error(_("File url"))
c = re.search(self.TOKEN_PATTERN, self.html)
if not c:
- self.error(_("Cannot parse file token"))
-
- self.link = b.group(1) + c.group(1)
+ self.error(_("File token"))
- #Check if we have to wait
- seconds = re.search(self.WAIT_PATTERN, self.html)
- if seconds:
- self.logDebug("Wait " + seconds.group(1))
- self.wait(seconds.group(1))
+ self.link = b.group(1) + "/zzz/" + c.group(1)
getInfo = create_getInfo(RemixshareCom)
diff --git a/module/plugins/hoster/ShareplaceCom.py b/module/plugins/hoster/ShareplaceCom.py
index 07724a9d1..c540dd2df 100644
--- a/module/plugins/hoster/ShareplaceCom.py
+++ b/module/plugins/hoster/ShareplaceCom.py
@@ -83,7 +83,7 @@ class ShareplaceCom(Hoster):
if not self.html:
self.download_html()
- if re.search(r"HTTP Status 404", self.html) is not None:
+ if re.search(r"HTTP Status 404", self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/SolidfilesCom.py b/module/plugins/hoster/SolidfilesCom.py
new file mode 100644
index 000000000..d359577d6
--- /dev/null
+++ b/module/plugins/hoster/SolidfilesCom.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+# Test links:
+# http://www.solidfiles.com/d/609cdb4b1b
+
+from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
+
+
+class SolidfilesCom(SimpleHoster):
+ __name__ = "SolidfilesCom"
+ __type__ = "hoster"
+ __version__ = "0.02"
+
+ __pattern__ = r'http://(?:www\.)?solidfiles\.com\/d/\w+'
+
+ __description__ = """Solidfiles.com hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("sraedler", "simon.raedler@yahoo.de")]
+
+
+ NAME_PATTERN = r'<h1 title="(?P<N>.+?)"'
+ SIZE_PATTERN = r'<p class="meta">(?P<S>[\d.,]+) (?P<U>[\w_^]+)'
+ OFFLINE_PATTERN = r'<h1>404'
+
+ LINK_FREE_PATTERN = r'id="ddl-text" href="(.+?)"'
+
+
+ def setup(self):
+ self.multiDL = True
+ self.chunkLimit = 1
+
+
+getInfo = create_getInfo(SolidfilesCom)
diff --git a/module/plugins/hoster/XHamsterCom.py b/module/plugins/hoster/XHamsterCom.py
index fd494e099..9004dbac0 100644
--- a/module/plugins/hoster/XHamsterCom.py
+++ b/module/plugins/hoster/XHamsterCom.py
@@ -123,7 +123,7 @@ class XHamsterCom(Hoster):
"""
if not self.html:
self.download_html()
- if re.search(r"(.*Video not found.*)", self.html) is not None:
+ if re.search(r"(.*Video not found.*)", self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/YadiSk.py b/module/plugins/hoster/YadiSk.py
new file mode 100644
index 000000000..c3749d30d
--- /dev/null
+++ b/module/plugins/hoster/YadiSk.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+
+import re
+import random
+
+from module.common.json_layer import json_loads
+from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
+
+
+class YadiSk(SimpleHoster):
+ __name__ = "YadiSk"
+ __type__ = "hoster"
+ __version__ = "0.03"
+
+ __pattern__ = r'https?://yadi\.sk/d/\w+'
+
+ __description__ = """Yadi.sk hoster plugin"""
+ __license__ = "GPLv3"
+ __authors__ = [("GammaC0de", None)]
+
+
+ OFFLINE_PATTERN = r'Nothing found'
+
+
+ def setup(self):
+ self.resumeDownload = False
+ self.multiDL = False
+ self.chunkLimit = 1
+
+
+ def handleFree(self, pyfile):
+ m = re.search(r'<script id="models-client" type="application/json">(.+?)</script>', self.html)
+ if m is None:
+ self.error(_("could not find required json data"))
+
+ res = json_loads(m.group(1))
+
+ yadisk_ver = None
+ yadisk_sk = None
+ yadisk_id = None
+ yadisk_size = None
+ yadisk_name = None
+
+ try: #@TODO: Copy to apiInfo
+ for sect in res:
+ if 'model' in sect:
+ if sect['model'] == "config":
+ yadisk_ver = sect['data']['version']
+ yadisk_sk = sect['data']['sk']
+
+ elif sect['model'] == "resource":
+ yadisk_id = sect['data']['id']
+ yadisk_size = sect['data']['meta']['size']
+ yadisk_name = sect['data']['name']
+
+ except Exception, e:
+ self.fail(_("Unexpected server response"), e)
+
+ if None in (yadisk_id, yadisk_sk, yadisk_id, yadisk_size, yadisk_name):
+ self.error(_("Missing JSON data"))
+
+ self.pyfile.size = yadisk_size
+ self.pyfile.name = yadisk_name
+
+ yadisk_idclient = ""
+ for _i in range(32):
+ yadisk_idclient += random.choice('0123456abcdef')
+
+ try:
+ self.html = self.load("https://yadi.sk/models/",
+ get={'_m': "do-get-resource-url"},
+ post={'idClient': yadisk_idclient,
+ 'version' : yadisk_ver,
+ '_model.0': "do-get-resource-url",
+ 'sk' : yadisk_sk,
+ 'id.0' : yadisk_id})
+
+ self.link = json_loads(self.html)['models'][0]['data']['file']
+
+ except Exception:
+ pass
+
+
+getInfo = create_getInfo(YadiSk)
diff --git a/module/plugins/hoster/YoupornCom.py b/module/plugins/hoster/YoupornCom.py
index 4bb2520e6..19d07fa36 100644
--- a/module/plugins/hoster/YoupornCom.py
+++ b/module/plugins/hoster/YoupornCom.py
@@ -54,7 +54,7 @@ class YoupornCom(Hoster):
"""
if not self.html:
self.download_html()
- if re.search(r"(.*invalid video_id.*)", self.html) is not None:
+ if re.search(r"(.*invalid video_id.*)", self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/YourfilesTo.py b/module/plugins/hoster/YourfilesTo.py
index e0def108e..fd65a6a41 100644
--- a/module/plugins/hoster/YourfilesTo.py
+++ b/module/plugins/hoster/YourfilesTo.py
@@ -81,7 +81,7 @@ class YourfilesTo(Hoster):
if not self.html:
self.download_html()
- if re.search(r"HTTP Status 404", self.html) is not None:
+ if re.search(r"HTTP Status 404", self.html):
return False
else:
return True
diff --git a/module/plugins/hoster/ZippyshareCom.py b/module/plugins/hoster/ZippyshareCom.py
index 27ec598e1..cdb37a18c 100644
--- a/module/plugins/hoster/ZippyshareCom.py
+++ b/module/plugins/hoster/ZippyshareCom.py
@@ -12,7 +12,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class ZippyshareCom(SimpleHoster):
__name__ = "ZippyshareCom"
__type__ = "hoster"
- __version__ = "0.77"
+ __version__ = "0.78"
__pattern__ = r'http://www\d{0,2}\.zippyshare\.com/v(/|iew\.jsp.*key=)(?P<KEY>[\w^_]+)'
__config__ = [("use_premium", "bool", "Use premium account if available", True)]
@@ -25,7 +25,7 @@ class ZippyshareCom(SimpleHoster):
COOKIES = [("zippyshare.com", "ziplocale", "en")]
- NAME_PATTERN = r'("/|<title>Zippyshare.com - )(?P<N>[^/]+?)("\);|</title>)'
+ NAME_PATTERN = r'(<title>Zippyshare.com - |"/)(?P<N>[^/]+)(</title>|";)'
SIZE_PATTERN = r'>Size:.+?">(?P<S>[\d.,]+) (?P<U>[\w^_]+)'
OFFLINE_PATTERN = r'does not exist (anymore )?on this server<'