import os import sys import subprocess import time import glob import shutil import json import dataclasses import gradio as gr from PIL import Image # 1. إعداد المسارات BASE_DIR = os.getcwd() APP_DIR = os.path.join(BASE_DIR, "BallonsTranslator") # مجلد مؤقت للعمليات TEMP_DIR = os.path.join(BASE_DIR, "process_folder") # 2. تحميل المستودع الأساسي if not os.path.exists(APP_DIR): print("جاري تحميل محرك التبييض...") subprocess.run(["git", "clone", "https://github.com/dmMaze/BallonsTranslator.git", APP_DIR], check=True) if APP_DIR not in sys.path: sys.path.insert(0, APP_DIR) # 3. دالة المعالجة الأساسية def process_manga(input_img): if input_img is None: return None # تنظيف المجلدات السابقة if os.path.exists(TEMP_DIR): shutil.rmtree(TEMP_DIR) os.makedirs(TEMP_DIR) # حفظ الصورة المرفوعة في المجلد المؤقت img_path = os.path.join(TEMP_DIR, "input_page.png") # إذا كانت الصورة بصيغة PIL (من واجهة Gradio) input_img.save(img_path) # إعداد الإعدادات (config.json) try: from utils.config import ProgramConfig cfg = ProgramConfig() cfg.module.inpainter = "lama_large_512px" # أفضل موديل للتبييض cfg.module.enable_translate = False cfg.module.enable_ocr = True cfg.module.enable_inpaint = True cfg_path = os.path.join(APP_DIR, 'config/config.json') os.makedirs(os.path.dirname(cfg_path), exist_ok=True) with open(cfg_path, 'w', encoding='utf-8') as f: json.dump(dataclasses.asdict(cfg), f, indent=2, ensure_ascii=False) except Exception as e: print(f"Config error: {e}") # تشغيل المحرك (Headless mode) print("بدء عملية التبييض...") subprocess.run([ sys.executable, "launch.py", "--headless", "--exec_dirs", TEMP_DIR, "--ldpi", "96" ], cwd=APP_DIR) # البحث عن النتيجة result_folder = os.path.join(TEMP_DIR, "inpainted") results = glob.glob(os.path.join(result_folder, "*.*")) if results: return Image.open(results[0]) else: return None # 4. بناء واجهة Gradio with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🎨 مبيّض المانجا الآلي (Manga Inpainter) ارفع صفحة المانجا وسيقوم الذكاء الاصطناعي بإزالة النصوص منها مع الحفاظ على الرسوم. """) with gr.Row(): with gr.Column(): input_file = gr.Image(type="pil", label="ارفع صفحة المانجا هنا") btn = gr.Button("بدء التبييض ✨", variant="primary") with gr.Column(): output_file = gr.Image(type="pil", label="النتيجة (بدون نص)") btn.click(fn=process_manga, inputs=input_file, outputs=output_file) gr.Markdown("---") gr.Markdown("💡 **ملاحظة:** العملية قد تستغرق من 20 إلى 60 ثانية حسب حجم الصورة.") # 5. التشغيل if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)