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)