Fix Mega Server
This commit is contained in:
@@ -318,7 +318,7 @@ def resolve_video_urls_for_playing(server, url, video_password="", muestra_dialo
|
||||
video_urls.extend(response)
|
||||
except:
|
||||
logger.error("Error al obtener la url en modo free")
|
||||
error_messages.append("Se ha producido un error en %s" % server_name)
|
||||
error_messages.append(config.get_localized_string(60006) % server_name)
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
|
||||
@@ -84,17 +84,31 @@ class Client(object):
|
||||
|
||||
def get_files(self):
|
||||
files = []
|
||||
enc_url = None
|
||||
if self.files:
|
||||
for file in self.files:
|
||||
n = file.name.encode("utf8")
|
||||
u = "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(n)
|
||||
s = file.size
|
||||
file_id = file.file_id
|
||||
enc_url = file.url
|
||||
files.append({"name":n,"url":u,"size":s, "id": file_id})
|
||||
if len(self.files) == 1:
|
||||
try:
|
||||
code = httptools.downloadpage(enc_url, only_headers=True).code
|
||||
if code > 300:
|
||||
return code
|
||||
else:
|
||||
return files
|
||||
|
||||
except:
|
||||
print(traceback.format_exc())
|
||||
pass
|
||||
|
||||
return files
|
||||
|
||||
def add_url(self, url):
|
||||
url = url.split("/#")[1]
|
||||
url = url.split("#")[1]
|
||||
id_video = None
|
||||
if "|" in url:
|
||||
url, id_video = url.split("|")
|
||||
@@ -135,7 +149,8 @@ class Client(object):
|
||||
def api_req(self, req, get=""):
|
||||
seqno = random.randint(0, 0xFFFFFFFF)
|
||||
url = 'https://g.api.mega.co.nz/cs?id=%d%s' % (seqno, get)
|
||||
return json.loads(self.post(url, json.dumps([req])))[0]
|
||||
page = httptools.downloadpage(url, post=json.dumps([req])).data
|
||||
return json.loads(page)[0]
|
||||
|
||||
def base64urldecode(self,data):
|
||||
data += '=='[(2 - len(data) * 3) % 4:]
|
||||
@@ -165,12 +180,11 @@ class Client(object):
|
||||
|
||||
def aes_cbc_decrypt(self, data, key):
|
||||
try:
|
||||
from Cryptodome.Cipher import AES
|
||||
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16)
|
||||
except:
|
||||
from Crypto.Cipher import AES
|
||||
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16)
|
||||
#decryptor = aes.AESModeOfOperationCBC(key, iv='\0' * 16)
|
||||
except:
|
||||
import jscrypto
|
||||
decryptor = jscrypto.new(key, jscrypto.MODE_CBC, '\0' * 16)
|
||||
return decryptor.decrypt(data)
|
||||
|
||||
def aes_cbc_decrypt_a32(self,data, key):
|
||||
@@ -179,20 +193,6 @@ class Client(object):
|
||||
def decrypt_key(self,a, key):
|
||||
return sum((self.aes_cbc_decrypt_a32(a[i:i+4], key) for i in xrange(0, len(a), 4)), ())
|
||||
|
||||
def post(self, url, data):
|
||||
return httptools.downloadpage(url, data).data
|
||||
import ssl
|
||||
from functools import wraps
|
||||
def sslwrap(func):
|
||||
@wraps(func)
|
||||
def bar(*args, **kw):
|
||||
kw['ssl_version'] = ssl.PROTOCOL_TLSv1
|
||||
return func(*args, **kw)
|
||||
return bar
|
||||
|
||||
ssl.wrap_socket = sslwrap(ssl.wrap_socket)
|
||||
return urllib.urlopen(url, data).read()
|
||||
|
||||
def dec_attr(self, attr, key):
|
||||
attr = self.aes_cbc_decrypt(attr, self.a32_to_str(key)).rstrip('\0')
|
||||
if not attr.endswith("}"):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import urllib2
|
||||
import traceback
|
||||
|
||||
class Cursor(object):
|
||||
def __init__(self, file):
|
||||
@@ -21,9 +22,11 @@ class Cursor(object):
|
||||
req.headers['Range'] = 'bytes=%s-' % (offset)
|
||||
try:
|
||||
self.conn = urllib2.urlopen(req)
|
||||
self.prepare_decoder(offset)
|
||||
try:
|
||||
self.prepare_decoder(offset)
|
||||
except:
|
||||
print(traceback.format_exc())
|
||||
except:
|
||||
#La url del archivo expira transcurrido un tiempo, si da error 403, reintenta volviendo a solicitar la url mediante la API
|
||||
self.mega_request(offset, True)
|
||||
|
||||
def read(self,n=None):
|
||||
@@ -35,7 +38,6 @@ class Cursor(object):
|
||||
self.pos+=len(res)
|
||||
return res
|
||||
|
||||
|
||||
def seek(self,n):
|
||||
if n>self._file.size:
|
||||
n=self._file.size
|
||||
@@ -53,20 +55,21 @@ class Cursor(object):
|
||||
def __exit__(self,exc_type, exc_val, exc_tb):
|
||||
self._file.cursors.remove(self)
|
||||
if len(self._file.cursors) == 0: self._file.cursor = False
|
||||
|
||||
|
||||
def decode(self, data):
|
||||
return self.decryptor.decrypt(data)
|
||||
|
||||
def prepare_decoder(self,offset):
|
||||
initial_value = self.initial_value + int(offset/16)
|
||||
try:
|
||||
from Cryptodome.Cipher import AES
|
||||
from Cryptodome.Util import Counter
|
||||
self.decryptor = AES.new(self._file._client.a32_to_str(self.k), AES.MODE_CTR, counter = Counter.new(128, initial_value = initial_value))
|
||||
except:
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util import Counter
|
||||
self.decryptor = AES.new(self._file._client.a32_to_str(self.k), AES.MODE_CTR, counter = Counter.new(128, initial_value = initial_value))
|
||||
except:
|
||||
from pyaes import aes
|
||||
self.decryptor = aes.AESModeOfOperationCTR(f=self,key=self._client.a32_to_str(self.k),counter=aes.Counter(initial_value=initial_value))
|
||||
|
||||
rest = offset - int(offset/16)*16
|
||||
if rest:
|
||||
self.decode(str(0)*rest)
|
||||
self.decode(str(0)*rest)
|
||||
|
||||
Reference in New Issue
Block a user