summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Stefano <l.stickell@yahoo.it> 2013-10-02 15:28:37 +0200
committerGravatar Stefano <l.stickell@yahoo.it> 2013-10-02 15:28:37 +0200
commitb2e735273ee83820a7e9633f159168e0712c4e75 (patch)
treed3e8e6ef0418d85fe91ea85074a45b1e6c9bd8c5
parentGamefrontCom: unlimited chunks even for free users (diff)
downloadpyload-b2e735273ee83820a7e9633f159168e0712c4e75.tar.xz
DDLStorage: rewritten to use API.
-rw-r--r--module/plugins/accounts/DdlstorageCom.py44
-rw-r--r--module/plugins/hooks/Checksum.py16
-rw-r--r--module/plugins/hoster/DdlstorageCom.py73
3 files changed, 125 insertions, 8 deletions
diff --git a/module/plugins/accounts/DdlstorageCom.py b/module/plugins/accounts/DdlstorageCom.py
index 6c610aa84..7404348a4 100644
--- a/module/plugins/accounts/DdlstorageCom.py
+++ b/module/plugins/accounts/DdlstorageCom.py
@@ -1,13 +1,51 @@
# -*- coding: utf-8 -*-
+from hashlib import md5
+from time import mktime, strptime
+
from module.plugins.internal.XFSPAccount import XFSPAccount
+from module.common.json_layer import json_loads
+from module.utils import parseFileSize
+
+# DDLStorage API Documentation:
+# http://www.ddlstorage.com/cgi-bin/api_req.cgi?req_type=doc
class DdlstorageCom(XFSPAccount):
__name__ = "DdlstorageCom"
- __version__ = "0.01"
+ __version__ = "1.00"
__type__ = "account"
__description__ = """DDLStorage.com account plugin"""
- __author_name__ = ("zoidberg")
- __author_mail__ = ("zoidberg@mujmail.cz")
+ __author_name__ = ("stickell")
+ __author_mail__ = ("l.stickell@yahoo.it")
MAIN_PAGE = "http://ddlstorage.com/"
+
+ def loadAccountInfo(self, user, req):
+ password = self.accounts[user]['password']
+ api_data = req.load('http://www.ddlstorage.com/cgi-bin/api_req.cgi',
+ post={'req_type': 'user_info',
+ 'client_id': 53472,
+ 'user_login': user,
+ 'user_password': md5(password).hexdigest(),
+ 'sign': md5('user_info%d%s%s%s' % (53472, user, md5(password).hexdigest(),
+ '25JcpU2dPOKg8E2OEoRqMSRu068r0Cv3')).hexdigest()})
+ api_data = api_data.replace('<pre>', '').replace('</pre>', '')
+ self.logDebug('Account Info API data: ' + api_data)
+ api_data = json_loads(api_data)
+
+ if api_data['status'] != 'OK': # 'status' must be always OK for a working account
+ return {"premium": False, "valid": False}
+
+ if api_data['account_type'] == 'REGISTERED':
+ premium = False
+ validuntil = None
+ else:
+ premium = True
+ validuntil = int(mktime(strptime(api_data['premium_expire'], "%Y-%m-%d %H:%M:%S")))
+
+ if api_data['usr_bandwidth_available'] == 'UNLIMITED':
+ trafficleft = -1
+ else:
+ trafficleft = parseFileSize(api_data['usr_bandwidth_available']) / 1024
+
+ return {"premium": premium, "validuntil": validuntil, "trafficleft": trafficleft}
diff --git a/module/plugins/hooks/Checksum.py b/module/plugins/hooks/Checksum.py
index 08fd623b8..908286677 100644
--- a/module/plugins/hooks/Checksum.py
+++ b/module/plugins/hooks/Checksum.py
@@ -22,6 +22,7 @@ import zlib
from os import remove
from os.path import getsize, isfile, splitext
import re
+import base64
from module.utils import save_join, fs_encode
from module.plugins.Hook import Hook
@@ -48,13 +49,25 @@ def computeChecksum(local_file, algorithm):
return "%x" % last
+ # Special Hash used by DDLStorage.com
+ # It compute the MD5 hash only on the first and the last 4096 bytes, then the hash is base64 encoded
+ elif algorithm == 'md5_ddlstorage':
+ h = hashlib.md5()
+
+ with open(local_file, 'rb') as f:
+ h.update(f.read(4096))
+ f.seek(-4096, 2)
+ h.update(f.read(4096))
+
+ return base64.b64encode(h.digest()).rstrip('=')
+
else:
return None
class Checksum(Hook):
__name__ = "Checksum"
- __version__ = "0.08"
+ __version__ = "0.09"
__description__ = "Verify downloaded file size and checksum (enable in general preferences)"
__config__ = [("activated", "bool", "Activated", True),
("action", "fail;retry;nothing", "What to do if check fails?", "retry"),
@@ -75,6 +88,7 @@ class Checksum(Hook):
self.algorithms = sorted(
getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")), reverse=True)
self.algorithms.extend(["crc32", "adler32"])
+ self.algorithms.append('md5_ddlstorage')
self.formats = self.algorithms + ['sfv', 'crc', 'hash']
def downloadFinished(self, pyfile):
diff --git a/module/plugins/hoster/DdlstorageCom.py b/module/plugins/hoster/DdlstorageCom.py
index 5eaebf1d1..82072aadb 100644
--- a/module/plugins/hoster/DdlstorageCom.py
+++ b/module/plugins/hoster/DdlstorageCom.py
@@ -1,13 +1,45 @@
# -*- coding: utf-8 -*-
+import re
+from hashlib import md5
-from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo
+from module.plugins.hoster.XFileSharingPro import XFileSharingPro
+from module.network.RequestFactory import getURL
+from module.plugins.Plugin import chunks
+from module.common.json_layer import json_loads
+
+
+def getInfo(urls):
+ # DDLStorage API Documentation:
+ # http://www.ddlstorage.com/cgi-bin/api_req.cgi?req_type=doc
+ ids = dict()
+ for url in urls:
+ m = re.search(DdlstorageCom.__pattern__, url)
+ ids[m.group('ID')] = url
+
+ for chunk in chunks(ids.keys(), 5):
+ api = getURL('http://www.ddlstorage.com/cgi-bin/api_req.cgi',
+ post={'req_type': 'file_info_free',
+ 'client_id': 53472,
+ 'file_code': ','.join(chunk),
+ 'sign': md5('file_info_free%d%s%s' % (53472, ','.join(chunk),
+ '25JcpU2dPOKg8E2OEoRqMSRu068r0Cv3')).hexdigest()})
+ api = api.replace('<pre>', '').replace('</pre>', '')
+ api = json_loads(api)
+
+ result = list()
+ for el in api:
+ if el['status'] == 'online':
+ result.append((el['file_name'], int(el['file_size']), 2, ids[el['file_code']]))
+ else:
+ result.append((ids[el['file_code']], 0, 1, ids[el['file_code']]))
+ yield result
class DdlstorageCom(XFileSharingPro):
__name__ = "DdlstorageCom"
__type__ = "hoster"
- __pattern__ = r"http://(?:\w*\.)*?ddlstorage.com/\w{12}"
- __version__ = "0.07"
+ __pattern__ = r"http://(?:\w*\.)*?ddlstorage.com/(?P<ID>\w{12})"
+ __version__ = "1.00"
__description__ = """DDLStorage.com hoster plugin"""
__author_name__ = ("zoidberg", "stickell")
__author_mail__ = ("zoidberg@mujmail.cz", "l.stickell@yahoo.it")
@@ -15,5 +47,38 @@ class DdlstorageCom(XFileSharingPro):
FILE_INFO_PATTERN = r'<p class="sub_title"[^>]*>(?P<N>.+) \((?P<S>[^)]+)\)</p>'
HOSTER_NAME = "ddlstorage.com"
+ def prepare(self):
+ self.getAPIData()
+ super(DdlstorageCom, self).prepare()
+
+ def getAPIData(self):
+ file_id = re.search(self.__pattern__, self.pyfile.url).group('ID')
+ data = {'client_id': 53472,
+ 'file_code': file_id}
+ if self.user:
+ passwd = self.account.getAccountData(self.user)["password"]
+ data['req_type'] = 'file_info_reg'
+ data['user_login'] = self.user
+ data['user_password'] = md5(passwd).hexdigest()
+ data['sign'] = md5('file_info_reg%d%s%s%s%s' % (data['client_id'], data['user_login'],
+ data['user_password'], data['file_code'],
+ '25JcpU2dPOKg8E2OEoRqMSRu068r0Cv3')).hexdigest()
+ else:
+ data['req_type'] = 'file_info_free'
+ data['sign'] = md5('file_info_free%d%s%s' % (data['client_id'], data['file_code'],
+ '25JcpU2dPOKg8E2OEoRqMSRu068r0Cv3')).hexdigest()
+
+ self.api_data = self.load('http://www.ddlstorage.com/cgi-bin/api_req.cgi', post=data)
+ self.api_data = self.api_data.replace('<pre>', '').replace('</pre>', '')
+ self.logDebug('API Data: ' + self.api_data)
+ self.api_data = json_loads(self.api_data)[0]
+
+ if self.api_data['status'] == 'offline':
+ self.offline()
-getInfo = create_getInfo(DdlstorageCom) \ No newline at end of file
+ if 'file_name' in self.api_data:
+ self.pyfile.name = self.api_data['file_name']
+ if 'file_size' in self.api_data:
+ self.pyfile.size = self.api_data['size'] = self.api_data['file_size']
+ if 'file_md5_base64' in self.api_data:
+ self.api_data['md5_ddlstorage'] = self.api_data['file_md5_base64']