import gradio as gr import rarfile import pyzipper from io import BytesIO def convert_rar_to_zip(rar_file, password=None, progress=gr.Progress()): """Convert password-protected RAR to encrypted ZIP with progress tracking""" try: progress(0, desc="🔓 Initializing conversion...") # Corrected password parameter with rarfile.RarFile(rar_file.name, password=password.encode() if password else None) as rar: total_files = len(rar.infolist()) zip_buffer = BytesIO() with pyzipper.AESZipFile(zip_buffer, 'w', compression=pyzipper.ZIP_LZMA) as zipf: if password: zipf.setpassword(password.encode()) for i, file_info in enumerate(progress.tqdm(rar.infolist(), desc="Processing")): if file_info.is_dir(): zipf.writestr(file_info.filename + '/', '') else: with rar.open(file_info) as file: content = file.read() zipf.writestr(file_info.filename, content, compress_type=pyzipper.ZIP_LZMA, encrypt=bool(password)) progress((i+1)/total_files, desc=f"🔒 Processed {i+1}/{total_files} files") zip_buffer.seek(0) return ("converted.zip", zip_buffer.read()) except Exception as e: return f"❌ Error: {str(e)}" app = gr.Interface( fn=convert_rar_to_zip, inputs=[ gr.File(label="Upload RAR", file_types=[".rar"]), gr.Textbox(label="Password (optional)", type="password") ], outputs=gr.File(label="Download Encrypted ZIP"), title="Secure RAR to ZIP Converter", description="Convert password-protected RAR archives to AES-256 encrypted ZIP files", allow_flagging="never" ) app.launch()