import subprocess import threading import os import glob from flask import Flask, render_template_string, send_from_directory from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app, async_mode='eventlet') HTML_PAGE = """ Ajij APK Grinder - Pro Edition

🚀 AJIJ APK GRINDER v3.0

Status: Ready

⬇️ DOWNLOAD READY APK
-- Logs will appear here --
""" @app.route('/') def index(): return render_template_string(HTML_PAGE) @app.route('/download/') def download(filename): return send_from_directory('bin', filename, as_attachment=True) def emit_log(msg): socketio.emit('log', msg) def run_command(cmd, desc): socketio.emit('status_update', desc) emit_log(f"\\n>>> Executing: {desc}\\n") process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, text=True) for line in iter(process.stdout.readline, ''): emit_log(line.strip()) process.stdout.close() return process.wait() def build_logic(): # 1. تثبيت Cython النسخة المناسبة run_command("pip install --user cython==0.29.33", "Installing Cython") # 2. الموافقة الأوتوماتيكية على التراخيص (الحل لمشكل الحبسة اللي وقع ليك) sdk_path = "/home/user/.buildozer/android/platform/android-sdk" if os.path.exists(sdk_path): license_cmd = f"yes | {sdk_path}/tools/bin/sdkmanager --sdk_root={sdk_path} --licenses" run_command(license_cmd, "Accepting Android Licenses") # 3. البدء في الطحن الحقيقي exit_code = run_command("buildozer -v android debug", "Grinding APK (This will take time)") # 4. التحقق من النتيجة apk_files = glob.glob("bin/*.apk") if exit_code == 0 and apk_files: latest_apk = os.path.basename(apk_files[-1]) emit_log(f"\\n✅ DONE! APK: {latest_apk}") socketio.emit('build_complete', {'success': True, 'filename': latest_apk}) else: emit_log("\\n❌ ERROR: Build failed or APK not found.") socketio.emit('build_complete', {'success': False}) @socketio.on('start_build') def handle_build(data): with open("main.py", "w") as f: f.write(data['code']) socketio.start_background_task(target=build_logic) if __name__ == '__main__': socketio.run(app, host='0.0.0.0', port=7860)