def public_gdrive_transfer(filepath,destiny="SD",truecopy=True): check_connection() lib,TD,libpath=get_cache_lib() if lib==None: sys.exit(f"Google Drive Public Links are only supported via cache folder") if destiny=="SD": destiny="1: External SD Card/" filename=addtodrive(filepath,truecopy=truecopy) ID,name,type,size,md5,remote=DrivePrivate.get_Data(filename,TD=TD,Print=False) token=remote.access_token name=remote.name sz=remote.size URL='https://www.googleapis.com/drive/v3/files/'+remote.ID+'?alt=media' ext=name.split('.') ext=ext[-1] file_size=int(sz) print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File installed size: {file_size} ({sq_tools.getSize(file_size)})") if file_size>SD_fs: print(" Not enough space on SD. Changing target to EMMC") print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") sys.exit(" NOT ENOUGH SPACE SD STORAGE") process=subprocess.Popen([nscb_mtp,"DriveTransfer","-ori",URL,"-dst",destiny,"-name",name,"-size",sz,"-tk",token]) while process.poll()==None: if process.poll()!=None: process.terminate();
def fichier_transfer(url,destiny="SD"): check_connection() if not os.path.exists(_1fichier_token): sys.exit("No 1fichier token setup") with open(_1fichier_token,'rt',encoding='utf8') as tfile: token=(tfile.readline().strip()) if token==None: sys.exit("Missing 1fichier token") APIkey=token auth={'Authorization':f'Bearer {APIkey}','Content-Type':'application/json'} session = requests.session() download_params = { 'url' : url, 'inline' : 0, 'cdn' : 0, 'restrict_ip': 0, 'no_ssl' : 0, } info_params={ 'url' : url } r=session.post('https://api.1fichier.com/v1/file/info.cgi',json=info_params,headers=auth) info_dict=r.json() # print(info_dict) sz=info_dict['size'] name=info_dict['filename'] r=session.post('https://api.1fichier.com/v1/download/get_token.cgi',json=download_params,headers=auth) dict_=r.json() # print(dict_) ext=name.split('.') ext=ext[-1] if not dict_['status']=="OK": sys.exit(f"API call returned {dict_['status']}") URL=dict_['url'] print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print("- Calculating File size") file_size=int(sz) print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File installed size: {file_size} ({sq_tools.getSize(file_size)})") if file_size>SD_fs: print(" Not enough space on SD. Changing target to EMMC") print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") sys.exit(" NOT ENOUGH SPACE SD STORAGE") process=subprocess.Popen([nscb_mtp,"fichierTransfer","-ori",URL,"-dst",destiny,"-name",name,"-size",str(sz)]) while process.poll()==None: if process.poll()!=None: process.terminate();
def generate_multixci_and_transfer(tfile=None,outfolder=None,destiny="SD",kgpatch=False,verification=False): if destiny==False or destiny=="pick" or destiny=="": destiny=pick_transfer_folder() if destiny=="SD": destiny="1: External SD Card\\" from mtpinstaller import get_storage_info,get_DB_dict tgkg=0;kgwarning=False if tfile=="": tfile=None if tfile==None: print("File input = null") return False if not os.path.exists(tfile): sys.exit(f"Couldn't find {tfile}") if outfolder=="": outfolder=None if outfolder==None: outfolder=cachefolder if not os.path.exists(cachefolder): os.makedirs(cachefolder) if not os.path.exists(outfolder): os.makedirs(outfolder) for f in os.listdir(outfolder): fp = os.path.join(outfolder, f) try: shutil.rmtree(fp) except OSError: os.remove(fp) file_list=listmanager.read_lines_to_list(tfile,all=True) if verification==True or str(verification).upper()=="HASH": verdict=False for fp in file_list: if str(verification).upper()=="HASH": verdict,isrestored,cnmt_is_patched=file_verification(fp,hash=True) else: verdict,isrestored,cnmt_is_patched=file_verification(fp) if verdict==False: print(f"{fp} didn't pass verification. Skipping {tfile}") return False dopatch=False print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print("- Calculating Size") fullxcisize=0;maxkg=0 for fp in file_list: head_xci_size,keygeneration,sz=get_header_size(fp) installedsize=head_xci_size+sz fullxcisize+=installedsize if int(maxkg)<int(keygeneration): maxkg=keygeneration print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File installed size: {installedsize} ({sq_tools.getSize(installedsize)})") if installedsize>SD_fs: sys.exit(" NOT ENOUGH SPACE SD STORAGE") if kgpatch==True: if FW!='unknown': try: FW_RSV,RRSV=sq_tools.transform_fw_string(FW) FW_kg=sq_tools.kg_by_RSV(FW_RSV) except BaseException as e: Print.error('Exception: ' + str(e)) FW='unknown' FW_kg='unknown' pass if FW!='unknown' and FW_kg!='unknown': if int(keygeneration)>int(FW_kg): kgwarning=True tgkg=int(FW_kg) else: tgkg=keygeneration else: tgkg=keygeneration print(f"- Console Firmware: {FW} ({FW_RSV}) - keygen {FW_kg})") print(f"- File keygeneration: {keygeneration}") else: tgkg=keygeneration if kgwarning==True: print("File requires a higher firmware. It'll will be prepatch") dopatch=True keypatch=int(tgkg) if isExe==False: process0=subprocess.Popen([sys.executable,squirrel,"-b","65536","-pv","true","-kp",str(keypatch),"--RSVcap","268435656","-fat","exfat","-fx","files","-ND","true","-t","xci","-o",outfolder,"-tfile",tfile,"-roma","TRUE","-dmul","calculate"]) else: process0=subprocess.Popen([squirrel,"-b","65536","-pv","true","-kp",str(keypatch),"--RSVcap","268435656","-fat","exfat","-fx","files","-ND","true","-t","xci","-o",outfolder,"-tfile",tfile,"-roma","TRUE","-dmul","calculate"]) while process0.poll()==None: if process0.poll()!=None: process0.terminate(); files2transfer=listmanager.folder_to_list(outfolder,['xci']) for f in files2transfer: bname=str(os.path.basename(f)) destinypath=os.path.join(destiny,bname) process=subprocess.Popen([nscb_mtp,"Transfer","-ori",f,"-dst",destinypath]) while process.poll()==None: if process.poll()!=None: process.terminate(); try: for f in os.listdir(outfolder): fp = os.path.join(outfolder, f) try: shutil.rmtree(fp) except OSError: os.remove(fp) except:pass
def generate_xci_and_transfer(filepath=None,outfolder=None,destiny="SD",kgpatch=False,verification=False): if destiny=="SD": destiny="1: External SD Card\\" from mtpinstaller import get_storage_info,get_DB_dict tgkg=0;kgwarning=False if filepath=="": filepath=None if filepath==None: print("File input = null") return False if outfolder=="": outfolder=None if outfolder==None: outfolder=cachefolder if not os.path.exists(cachefolder): os.makedirs(cachefolder) if not os.path.exists(outfolder): os.makedirs(outfolder) for f in os.listdir(outfolder): fp = os.path.join(outfolder, f) try: shutil.rmtree(fp) except OSError: os.remove(fp) if verification==True or str(verification).upper()=="HASH": if str(verification).upper()=="HASH": verdict,isrestored,cnmt_is_patched=file_verification(filepath,hash=True) else: verdict,isrestored,cnmt_is_patched=file_verification(filepath) if verdict==False: print("File didn't pass verification. Skipping...") return False dopatch=False print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print("- Calculating Size") head_xci_size,keygeneration,sz=get_header_size(filepath) installedsize=head_xci_size+sz print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File installed size: {installedsize} ({sq_tools.getSize(installedsize)})") if installedsize>SD_fs: sys.exit(" NOT ENOUGH SPACE SD STORAGE") if kgpatch==True: if FW!='unknown': try: FW_RSV,RRSV=sq_tools.transform_fw_string(FW) FW_kg=sq_tools.kg_by_RSV(FW_RSV) except BaseException as e: Print.error('Exception: ' + str(e)) FW='unknown' FW_kg='unknown' pass if FW!='unknown' and FW_kg!='unknown': if int(keygeneration)>int(FW_kg): kgwarning=True tgkg=int(FW_kg) else: tgkg=keygeneration else: tgkg=keygeneration print(f"- Console Firmware: {FW} ({FW_RSV}) - keygen {FW_kg})") print(f"- File keygeneration: {keygeneration}") else: tgkg=keygeneration if kgwarning==True: print("File requires a higher firmware. It'll will be prepatch") dopatch=True keypatch=int(tgkg) tname=str(os.path.basename(filepath))[:-3]+'xci' tmpfile=os.path.join(outfolder,tname) if isExe==False: process0=subprocess.Popen([sys.executable,squirrel,"-lib_call","mtp.mtpxci","generate_and_transfer_st1","-xarg",filepath,outfolder,str(keypatch)]) else: process0=subprocess.Popen([squirrel,"-lib_call","mtp.mtpxci","generate_and_transfer_st1","-xarg",filepath,outfolder,str(keypatch)]) while process0.poll()==None: if process0.poll()!=None: process0.terminate(); if isExe==False: process1=subprocess.Popen([sys.executable,squirrel,"-renf",tmpfile,"-t","xci","-renm","force","-nover","xci_no_v0","-addl","false","-roma","TRUE"]) else: process1=subprocess.Popen([sys.executable,squirrel,"-renf",tmpfile,"-t","xci","-renm","force","-nover","xci_no_v0","-addl","false","-roma","TRUE"]) while process1.poll()==None: if process1.poll()!=None: process1.terminate(); files2transfer=listmanager.folder_to_list(outfolder,['xci']) for f in files2transfer: bname=str(os.path.basename(f)) destinypath=os.path.join(destiny,bname) process=subprocess.Popen([nscb_mtp,"Transfer","-ori",f,"-dst",destinypath]) while process.poll()==None: if process.poll()!=None: process.terminate(); try: for f in os.listdir(outfolder): fp = os.path.join(outfolder, f) try: shutil.rmtree(fp) except OSError: os.remove(fp) except:pass
def fichier_install(url,destiny="SD",ch_medium=True,ch_base=False,ch_other=False,installed_list=False): check_connection() if not os.path.exists(_1fichier_token): sys.exit("No 1fichier token setup") with open(_1fichier_token,'rt',encoding='utf8') as tfile: token=(tfile.readline().strip()) if token==None: sys.exit("Missing 1fichier token") APIkey=token auth={'Authorization':f'Bearer {APIkey}','Content-Type':'application/json'} session = requests.session() download_params = { 'url' : url, 'inline' : 0, 'cdn' : 0, 'restrict_ip': 0, 'no_ssl' : 0, } info_params={ 'url' : url } r=session.post('https://api.1fichier.com/v1/file/info.cgi',json=info_params,headers=auth) info_dict=r.json() # print(info_dict) sz=info_dict['size'] name=info_dict['filename'] r=session.post('https://api.1fichier.com/v1/download/get_token.cgi',json=download_params,headers=auth) dict_=r.json() # print(dict_) ext=name.split('.') ext=ext[-1] if not name.endswith('nsp') and not name.endswith('nsz'): sys.exit(f"Extension not supported for direct instalation {ext} in {name}") if not dict_['status']=="OK": sys.exit(f"API call returned {dict_['status']}") URL=dict_['url'] print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print("- Calculating Installed size") filesize=int(sz) if destiny=="SD": print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File size: {filesize} ({sq_tools.getSize(filesize)})") if filesize>SD_fs: if filesize<NAND_fs and ch_medium==True: print(" Not enough space on SD. Changing target to EMMC") print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") destiny="NAND" elif ch_medium==False: sys.exit(" NOT ENOUGH SPACE SD STORAGE") else: sys.exit(" NOT ENOUGH SPACE ON DEVICE") else: print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") print(f" * File size: {filesize} ({sq_tools.getSize(filesize)})") if filesize>NAND_fs: if filesize<SD_fs and ch_medium==True: print(" Not enough space on EMMC. Changing target to SD") print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") destiny="SD" elif ch_medium==False: sys.exit(" NOT ENOUGH SPACE EMMC STORAGE") else: sys.exit(" NOT ENOUGH SPACE ON DEVICE") if installed_list!=False: try: fileid,fileversion,cctag,nG,nU,nD,baseid=listmanager.parsetags(name) fileversion=int(fileversion) if fileid.endswith('000') and fileversion==0 and fileid in installed_list.keys() and ch_base==True: print("Base game already installed. Skipping...") return False elif fileid.endswith('000') and fileid in installed_list.keys() and ch_other==True: updid=fileid[:-3]+'800' if fileversion>((installed_list[fileid])[2]): print("Asking DBI to delete previous content") process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",fileid]) while process.poll()==None: if process.poll()!=None: process.terminate(); process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",updid]) while process.poll()==None: if process.poll()!=None: process.terminate(); else: print("The update is a previous version than the installed on device.Skipping..") listmanager.striplines(tfile,counter=True) return False elif ch_other==True and fileid in installed_list.keys(): if fileversion>((installed_list[fileid])[2]): print("Asking DBI to delete previous update") process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",fileid]) while process.poll()==None: if process.poll()!=None: process.terminate(); else: print("The update is a previous version than the installed on device.Skipping..") listmanager.striplines(tfile,counter=True) return False except:pass process=subprocess.Popen([nscb_mtp,"fichierInstall","-ori",URL,"-dst",destiny,"-name",name,"-size",str(sz)]) while process.poll()==None: if process.poll()!=None: process.terminate();
def public_gdrive_install(filepath,destiny="SD",truecopy=True,outfolder=None,ch_medium=True,check_fw=True,patch_keygen=False,ch_base=False,ch_other=False,installed_list=False): check_connection() lib,TD,libpath=get_cache_lib() if lib==None: sys.exit(f"Google Drive Public Links are only supported via cache folder") filename=addtodrive(filepath,truecopy=truecopy) ID,name,type,size,md5,remote=DrivePrivate.get_Data(filename,TD=TD,Print=False) token=remote.access_token name=remote.name sz=remote.size URL='https://www.googleapis.com/drive/v3/files/'+remote.ID+'?alt=media' ext=name.split('.') ext=ext[-1] if not name.endswith('nsp') and not name.endswith('nsz') and not name.endswith('xci') and not name.endswith('xcz'): print(f"Extension not supported for direct instalation {ext} in {name}") return False print("- Retrieving Space on device") SD_ds,SD_fs,NAND_ds,NAND_fs,FW,device=get_storage_info() print("- Calculating Installed size") filesize=int(sz) if destiny=="SD": print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") print(f" * File size: {filesize} ({sq_tools.getSize(filesize)})") if filesize>SD_fs: if filesize<NAND_fs and ch_medium==True: print(" Not enough space on SD. Changing target to EMMC") print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") destiny="NAND" elif ch_medium==False: sys.exit(" NOT ENOUGH SPACE SD STORAGE") else: sys.exit(" NOT ENOUGH SPACE ON DEVICE") else: print(f" * EMMC free space: {NAND_fs} ({sq_tools.getSize(NAND_fs)})") print(f" * File size: {filesize} ({sq_tools.getSize(filesize)})") if filesize>NAND_fs: if filesize<SD_fs and ch_medium==True: print(" Not enough space on EMMC. Changing target to SD") print(f" * SD free space: {SD_fs} ({sq_tools.getSize(SD_fs)})") destiny="SD" elif ch_medium==False: sys.exit(" NOT ENOUGH SPACE EMMC STORAGE") else: sys.exit(" NOT ENOUGH SPACE ON DEVICE") kgwarning=False if check_fw==True: try: cnmtdata,files_list,remote=DriveTools.get_cnmt_data(file=remote) keygeneration=int(cnmtdata['keygeneration']) if FW!='unknown': try: FW_RSV,RRSV=sq_tools.transform_fw_string(FW) FW_kg=sq_tools.kg_by_RSV(FW_RSV) except BaseException as e: Print.error('Exception: ' + str(e)) FW='unknown' FW_kg='unknown' pass if FW!='unknown' and FW_kg!='unknown': if int(keygeneration)>int(FW_kg): kgwarning=True tgkg=int(FW_kg) else: tgkg=keygeneration else: tgkg=keygeneration print(f"- Console Firmware: {FW} ({FW_RSV}) - keygen {FW_kg})") print(f"- File keygeneration: {keygeneration}") if kgwarning==True: print("File requires a higher firmware. Skipping...") return False except: print("Error getting cnmtdata from file") if installed_list!=False: try: fileid,fileversion,cctag,nG,nU,nD,baseid=listmanager.parsetags(name) fileversion=int(fileversion) if fileid.endswith('000') and fileversion==0 and fileid in installed_list.keys() and ch_base==True: print("Base game already installed. Skipping...") return False elif fileid.endswith('000') and fileid in installed_list.keys() and ch_other==True: updid=fileid[:-3]+'800' if fileversion>((installed_list[fileid])[2]): print("Asking DBI to delete previous content") process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",fileid]) while process.poll()==None: if process.poll()!=None: process.terminate(); process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",updid]) while process.poll()==None: if process.poll()!=None: process.terminate(); else: print("The update is a previous version than the installed on device.Skipping..") listmanager.striplines(tfile,counter=True) return False elif ch_other==True and fileid in installed_list.keys(): if fileversion>((installed_list[fileid])[2]): print("Asking DBI to delete previous update") process=subprocess.Popen([nscb_mtp,"DeleteID","-ID",fileid]) while process.poll()==None: if process.poll()!=None: process.terminate(); else: print("The update is a previous version than the installed on device.Skipping..") listmanager.striplines(tfile,counter=True) return False except:pass if name.endswith('xci') or name.endswith('xcz'): from mtpxci_remote import install_xci_csv install_xci_csv(remote=remote,destiny=destiny,cachefolder=outfolder) else: process=subprocess.Popen([nscb_mtp,"DriveInstall","-ori",URL,"-dst",destiny,"-name",name,"-size",sz,"-tk",token]) while process.poll()==None: if process.poll()!=None: process.terminate();