You can't download files in shared folders using public links because public links can't be obtained from shared files. You need to download them directly.
parent
5b141c958c
commit
7e4d2ee557
26
mega/mega.py
26
mega/mega.py
|
@ -135,6 +135,8 @@ class Mega(object):
|
||||||
# folder
|
# folder
|
||||||
else:
|
else:
|
||||||
k = key
|
k = key
|
||||||
|
file['key'] = key
|
||||||
|
file['k'] = k
|
||||||
attributes = base64_url_decode(file['a'])
|
attributes = base64_url_decode(file['a'])
|
||||||
attributes = decrypt_attr(attributes, k)
|
attributes = decrypt_attr(attributes, k)
|
||||||
file['a'] = attributes
|
file['a'] = attributes
|
||||||
|
@ -222,9 +224,9 @@ class Mega(object):
|
||||||
file = file[1]
|
file = file[1]
|
||||||
if 'h' in file and 'k' in file:
|
if 'h' in file and 'k' in file:
|
||||||
public_handle = self.api_request({'a': 'l', 'n': file['h']})
|
public_handle = self.api_request({'a': 'l', 'n': file['h']})
|
||||||
file_key = file['k'][file['k'].index(':') + 1:]
|
if public_handle == -11 :
|
||||||
decrypted_key = a32_to_base64(decrypt_key(base64_to_a32(file_key),
|
raise RequestError("Can't get a public link from that file (is this a shared file?)")
|
||||||
self.master_key))
|
decrypted_key = a32_to_base64(file['key'])
|
||||||
return '{0}://{1}/#!{2}!{3}'.format(self.schema,
|
return '{0}://{1}/#!{2}!{3}'.format(self.schema,
|
||||||
self.domain,
|
self.domain,
|
||||||
public_handle,
|
public_handle,
|
||||||
|
@ -360,8 +362,7 @@ class Mega(object):
|
||||||
"""
|
"""
|
||||||
Download a file by it's file object
|
Download a file by it's file object
|
||||||
"""
|
"""
|
||||||
url = self.get_link(file)
|
self.download_file(None, None, file=file[1], dest_path=dest_path, is_public=False)
|
||||||
self.download_url(url, dest_path)
|
|
||||||
|
|
||||||
def download_url(self, url, dest_path=None):
|
def download_url(self, url, dest_path=None):
|
||||||
"""
|
"""
|
||||||
|
@ -372,18 +373,29 @@ class Mega(object):
|
||||||
file_key = path[1]
|
file_key = path[1]
|
||||||
self.download_file(file_id, file_key, dest_path, is_public=True)
|
self.download_file(file_id, file_key, dest_path, is_public=True)
|
||||||
|
|
||||||
def download_file(self, file_handle, file_key, dest_path=None, is_public=False):
|
def download_file(self, file_handle, file_key, dest_path=None, is_public=False, file=None):
|
||||||
|
if file is None :
|
||||||
if is_public:
|
if is_public:
|
||||||
file_key = base64_to_a32(file_key)
|
file_key = base64_to_a32(file_key)
|
||||||
file_data = self.api_request({'a': 'g', 'g': 1, 'p': file_handle})
|
file_data = self.api_request({'a': 'g', 'g': 1, 'p': file_handle})
|
||||||
else:
|
else :
|
||||||
file_data = self.api_request({'a': 'g', 'g': 1, 'n': file_handle})
|
file_data = self.api_request({'a': 'g', 'g': 1, 'n': file_handle})
|
||||||
|
|
||||||
k = (file_key[0] ^ file_key[4], file_key[1] ^ file_key[5],
|
k = (file_key[0] ^ file_key[4], file_key[1] ^ file_key[5],
|
||||||
file_key[2] ^ file_key[6], file_key[3] ^ file_key[7])
|
file_key[2] ^ file_key[6], file_key[3] ^ file_key[7])
|
||||||
iv = file_key[4:6] + (0, 0)
|
iv = file_key[4:6] + (0, 0)
|
||||||
meta_mac = file_key[6:8]
|
meta_mac = file_key[6:8]
|
||||||
|
else :
|
||||||
|
file_data = self.api_request({'a': 'g', 'g': 1, 'n': file['h']})
|
||||||
|
k = file['k']
|
||||||
|
iv = file['iv']
|
||||||
|
meta_mac = file['meta_mac']
|
||||||
|
|
||||||
|
# Seems to happens sometime... When this occurs, files are
|
||||||
|
# inaccessible also in the official also in the official webapp.
|
||||||
|
# Strangely, files can come back later.
|
||||||
|
if 'g' not in file_data :
|
||||||
|
raise RequestError('File not accessible anymore')
|
||||||
file_url = file_data['g']
|
file_url = file_data['g']
|
||||||
file_size = file_data['s']
|
file_size = file_data['s']
|
||||||
attribs = base64_url_decode(file_data['at'])
|
attribs = base64_url_decode(file_data['at'])
|
||||||
|
|
Loading…
Reference in New Issue