Fix Mega Server
This commit is contained in:
+1
-1
@@ -318,7 +318,7 @@ def resolve_video_urls_for_playing(server, url, video_password="", muestra_dialo
|
|||||||
video_urls.extend(response)
|
video_urls.extend(response)
|
||||||
except:
|
except:
|
||||||
logger.error("Error al obtener la url en modo free")
|
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
|
import traceback
|
||||||
logger.error(traceback.format_exc())
|
logger.error(traceback.format_exc())
|
||||||
|
|
||||||
|
|||||||
+20
-20
@@ -84,17 +84,31 @@ class Client(object):
|
|||||||
|
|
||||||
def get_files(self):
|
def get_files(self):
|
||||||
files = []
|
files = []
|
||||||
|
enc_url = None
|
||||||
if self.files:
|
if self.files:
|
||||||
for file in self.files:
|
for file in self.files:
|
||||||
n = file.name.encode("utf8")
|
n = file.name.encode("utf8")
|
||||||
u = "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(n)
|
u = "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(n)
|
||||||
s = file.size
|
s = file.size
|
||||||
file_id = file.file_id
|
file_id = file.file_id
|
||||||
|
enc_url = file.url
|
||||||
files.append({"name":n,"url":u,"size":s, "id": file_id})
|
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
|
return files
|
||||||
|
|
||||||
def add_url(self, url):
|
def add_url(self, url):
|
||||||
url = url.split("/#")[1]
|
url = url.split("#")[1]
|
||||||
id_video = None
|
id_video = None
|
||||||
if "|" in url:
|
if "|" in url:
|
||||||
url, id_video = url.split("|")
|
url, id_video = url.split("|")
|
||||||
@@ -135,7 +149,8 @@ class Client(object):
|
|||||||
def api_req(self, req, get=""):
|
def api_req(self, req, get=""):
|
||||||
seqno = random.randint(0, 0xFFFFFFFF)
|
seqno = random.randint(0, 0xFFFFFFFF)
|
||||||
url = 'https://g.api.mega.co.nz/cs?id=%d%s' % (seqno, get)
|
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):
|
def base64urldecode(self,data):
|
||||||
data += '=='[(2 - len(data) * 3) % 4:]
|
data += '=='[(2 - len(data) * 3) % 4:]
|
||||||
@@ -165,12 +180,11 @@ class Client(object):
|
|||||||
|
|
||||||
def aes_cbc_decrypt(self, data, key):
|
def aes_cbc_decrypt(self, data, key):
|
||||||
try:
|
try:
|
||||||
|
from Cryptodome.Cipher import AES
|
||||||
|
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16)
|
||||||
|
except:
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16)
|
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)
|
return decryptor.decrypt(data)
|
||||||
|
|
||||||
def aes_cbc_decrypt_a32(self,data, key):
|
def aes_cbc_decrypt_a32(self,data, key):
|
||||||
@@ -179,20 +193,6 @@ class Client(object):
|
|||||||
def decrypt_key(self,a, key):
|
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)), ())
|
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):
|
def dec_attr(self, attr, key):
|
||||||
attr = self.aes_cbc_decrypt(attr, self.a32_to_str(key)).rstrip('\0')
|
attr = self.aes_cbc_decrypt(attr, self.a32_to_str(key)).rstrip('\0')
|
||||||
if not attr.endswith("}"):
|
if not attr.endswith("}"):
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import urllib2
|
import urllib2
|
||||||
|
import traceback
|
||||||
|
|
||||||
class Cursor(object):
|
class Cursor(object):
|
||||||
def __init__(self, file):
|
def __init__(self, file):
|
||||||
@@ -21,9 +22,11 @@ class Cursor(object):
|
|||||||
req.headers['Range'] = 'bytes=%s-' % (offset)
|
req.headers['Range'] = 'bytes=%s-' % (offset)
|
||||||
try:
|
try:
|
||||||
self.conn = urllib2.urlopen(req)
|
self.conn = urllib2.urlopen(req)
|
||||||
self.prepare_decoder(offset)
|
try:
|
||||||
|
self.prepare_decoder(offset)
|
||||||
|
except:
|
||||||
|
print(traceback.format_exc())
|
||||||
except:
|
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)
|
self.mega_request(offset, True)
|
||||||
|
|
||||||
def read(self,n=None):
|
def read(self,n=None):
|
||||||
@@ -35,7 +38,6 @@ class Cursor(object):
|
|||||||
self.pos+=len(res)
|
self.pos+=len(res)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def seek(self,n):
|
def seek(self,n):
|
||||||
if n>self._file.size:
|
if n>self._file.size:
|
||||||
n=self._file.size
|
n=self._file.size
|
||||||
@@ -60,12 +62,13 @@ class Cursor(object):
|
|||||||
def prepare_decoder(self,offset):
|
def prepare_decoder(self,offset):
|
||||||
initial_value = self.initial_value + int(offset/16)
|
initial_value = self.initial_value + int(offset/16)
|
||||||
try:
|
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.Cipher import AES
|
||||||
from Crypto.Util import Counter
|
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))
|
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
|
rest = offset - int(offset/16)*16
|
||||||
if rest:
|
if rest:
|
||||||
|
|||||||
Reference in New Issue
Block a user