Skip to content
This repository has been archived by the owner on Nov 28, 2019. It is now read-only.

Commit

Permalink
Add batch download support
Browse files Browse the repository at this point in the history
  • Loading branch information
yamada95 committed Nov 18, 2015
1 parent bf68e9e commit c3f966f
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions bddown_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import re
import os
import json
import pickle
from time import time
try:
Expand All @@ -17,7 +18,7 @@
from command.config import global_config

BAIDUPAN_SERVER = "http://pan.baidu.com/api/"

DLTYPE_MULTIPLE = 'multi_file'

class Pan(object):
headers = {
Expand Down Expand Up @@ -98,7 +99,7 @@ def _get_js(self, link, secret=None):
return js[0] or None

def get_dlink(self, link, secret=None, fsid=None):
info = FileInfo()
info = ShareInfo()
js = None
try:
js = self._get_js(link, secret)
Expand All @@ -118,12 +119,15 @@ def get_dlink(self, link, secret=None, fsid=None):
info.fid_list = fsid

extra_params = dict(bdstoken=info.bdstoken, sign=info.sign, timestamp=info.timestamp)
if info.sharepagetype == DLTYPE_MULTIPLE:
extra_params['type'] = 'batch'

post_form = {
'encrypt': '0',
'product': 'share',
'uk': info.uk,
'primaryid': info.share_id,
'fid_list': '[{0}]'.format(info.fid_list),
'fid_list': info.fid_list,
}
if self.session.cookies.get('BDCLND'):
post_form['extra'] = '{"sekey":"%s"}' % (url_unquote(self.session.cookies['BDCLND'])),
Expand All @@ -138,8 +142,10 @@ def get_dlink(self, link, secret=None, fsid=None):
errno = _json['errno']
logger.debug(_json, extra={'type': 'json', 'method': 'POST'})
if errno == 0:
# FIXME: only support single file for now
dlink = _json['list'][0]['dlink']
if info.sharepagetype == DLTYPE_MULTIPLE:
dlink = _json['dlink']
else:
dlink = _json['list'][0]['dlink']
setattr(info, 'dlink', dlink)

# Fix #17
Expand Down Expand Up @@ -217,9 +223,10 @@ def _request(self, method='GET', base_url='', extra_params=None, post_data=None,
return response


class FileInfo(object):
class ShareInfo(object):
pattern = re.compile('yunData\.(\w+\s=\s"\w+");')
filename_pattern = re.compile('"server_filename":"([^"]+)"', re.DOTALL)
fileinfo_pattern = re.compile('yunData\.FILEINFO\s=\s(.*);')

def __init__(self):
self.share_id = None
Expand All @@ -230,17 +237,22 @@ def __init__(self):
self.sign = None
self.filename = None
self.timestamp = None
self.sharepagetype = None
self.fileinfo = None

def __call__(self, js):
return self.match(js)

def __repr__(self):
return '<FileInfo %r>' % self.share_id
return '<ShareInfo %r>' % self.share_id

def match(self, js):
_filename = re.search(self.filename_pattern, js)
_fileinfo = re.search(self.fileinfo_pattern, js)
if _filename:
self.filename = _filename.group(1).decode('unicode_escape')
if _fileinfo:
self.fileinfo = json.loads(_fileinfo.group(1).decode('unicode_escape'))
data = re.findall(self.pattern, js)
if not data:
return False
Expand All @@ -251,11 +263,14 @@ def match(self, js):
self.uk = yun_data.get('SHARE_UK').strip('"')
# self.bduss = yun_data.get('MYBDUSS').strip('"')
self.share_id = yun_data.get('SHARE_ID').strip('"')
self.fid_list = yun_data.get('FS_ID').strip('"')
self.fid_list = json.dumps([i['fs_id'] for i in self.fileinfo])
self.sign = yun_data.get('SIGN').strip('"')
if yun_data.get('MYBDSTOKEN'):
self.bdstoken = yun_data.get('MYBDSTOKEN').strip('"')
self.timestamp = yun_data.get('TIMESTAMP').strip('"')
self.sharepagetype = yun_data.get('SHAREPAGETYPE').strip('"')
if self.sharepagetype == DLTYPE_MULTIPLE:
self.filename = os.path.splitext(self.filename)[0] + '-batch.zip'
#if self.bdstoken:
# return True
return True
Expand Down

0 comments on commit c3f966f

Please sign in to comment.