File size: 7,020 Bytes
7dbe575
 
83e8851
 
 
7dbe575
 
83e8851
7dbe575
83e8851
7dbe575
 
83e8851
b81eb0d
221203a
7dbe575
 
 
 
83e8851
 
b81eb0d
221203a
7dbe575
 
 
 
83e8851
 
b81eb0d
221203a
7dbe575
 
 
 
 
221203a
7dbe575
 
 
83e8851
7dbe575
 
19ca955
83e8851
 
19ca955
83e8851
 
 
 
19ca955
 
 
 
 
 
7dbe575
19ca955
 
 
 
7dbe575
 
 
 
 
 
83e8851
7dbe575
83e8851
 
7dbe575
83e8851
7dbe575
 
83e8851
7dbe575
 
83e8851
7dbe575
 
 
83e8851
7dbe575
83e8851
7dbe575
 
 
 
 
 
83e8851
7dbe575
 
 
 
 
 
 
83e8851
7dbe575
 
 
 
 
 
 
 
 
 
 
83e8851
7dbe575
 
 
83e8851
 
7dbe575
 
 
 
83e8851
7dbe575
83e8851
7dbe575
83e8851
 
 
 
 
 
 
 
 
7dbe575
83e8851
 
efbcade
 
 
83e8851
efbcade
 
 
83e8851
efbcade
 
 
83e8851
 
 
 
 
7dbe575
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import gradio as gr
from PIL import Image
import os
import numpy as np
import cv2 # فقط لقراءة الصور باستخدام imread لضمان التوافق

# ----------------------------------------------------
# A. الكتالوج والبيانات التجارية (JPG)
# ----------------------------------------------------
# 🚨 المسارات تطابق تمامًا ملفات JPG المرفوعة حاليًا في مجلد assets/

GLASSES_CATALOG = {
    # النظارة 1
    "النظارة المستديرة (1)": {
        "path": "assets/507b01553ce6931a5d45b5554893a24a.jpg", 
        "price": 120.00,
        "description": "نظارة مستديرة كلاسيكية، مثالية للوجه البيضاوي.",
        "shape_fit": "بيضاوي"
    },
    
    # النظارة 2
    "النظارة الطيار (2)": {
        "path": "assets/56a9c0a1d10c21d475159d6890f4cf48.jpg", 
        "price": 85.00,
        "description": "تصميم طياري رقيق، يبرز جمال الوجه.",
        "shape_fit": "بيضاوي"
    },
    
    # النظارة 3
    "النظارة المربعة (3)": {
        "path": "assets/b1c4d0a357457c77974d5ce4580d0e8e.jpg", 
        "price": 99.00,
        "description": "إطار مربع عصري، مناسب لإضافة تحديد للوجه البيضاوي.",
        "shape_fit": "بيضاوي"
    }
}

LOADED_GLASSES = {}

def load_glasses():
    """تحميل صور النظارات عند بدء التشغيل."""
    all_loaded = True
    for name, data in GLASSES_CATALOG.items():
        try:
            # استخدام OpenCV للقراءة لضمان التوافق مع بيئة Space
            img_bgr = cv2.imread(data['path'], cv2.IMREAD_COLOR) 
            
            if img_bgr is not None and img_bgr.size > 0:
                # تحويلها إلى RGB لكي تتعامل معها مكتبة Gradio بشكل صحيح
                img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
                LOADED_GLASSES[name] = img_rgb
                print(f"✅ تم تحميل النظارة '{name}' بنجاح.")
            else:
                print(f"❌ فشل تحميل النظارة '{name}' من المسار: {data['path']}. يرجى التحقق من وجود الملف واسم الامتداد.")
                all_loaded = False
        except Exception as e:
            print(f"❌ خطأ حاد أثناء محاولة تحميل '{name}': {e}")
            all_loaded = False
            
    if not all_loaded:
        print("❌ فشل تشغيل Gradio: يرجى مراجعة سجلات التحذيرات لتأكيد تحميل صور النظارات.")
        
    return all_loaded

GLASSES_LOADED_OK = load_glasses()


# ----------------------------------------------------
# B. دالة عرض الكتالوج فقط (لا تحتاج مدخلات)
# ----------------------------------------------------
def display_catalog():
    """عرض بيانات الكتالوج والصور المحملة مسبقًا."""
    
    # تصفية الكتالوج (هنا الكل سيظهر لأنه لا يوجد شرط على الوجه)
    filtered_glasses = {
        name: data for name, data in GLASSES_CATALOG.items()
        if name in LOADED_GLASSES
    }

    # إعداد المُخرجات للواجهة (3 نظارات)
    output_imgs = [None] * 3
    output_info = [None] * 3
    
    for i, (name, data) in enumerate(filtered_glasses.items()):
        if i < 3: 
            output_imgs[i] = LOADED_GLASSES[name]
            output_info[i] = (
                f"**{name}**\n"
                f"🏷️ السعر: **{data['price']:.2f} $**\n"
                f"{data['description']}"
            )
    
    # المُخرجات تقتصر على صور النظارات ومعلوماتها
    return (
        output_imgs[0], output_info[0],
        output_imgs[1], output_info[1],
        output_imgs[2], output_info[2]
    )

# ----------------------------------------------------
# C. تشغيل التطبيق (الواجهة التسويقية باستخدام gr.Blocks)
# ----------------------------------------------------

custom_css = """
.gradio-container { max-width: 1600px; margin: 0 auto; font-family: 'Arial', sans-serif !important; }
.product-card { border: 1px solid #e0e0e0; border-radius: 10px; padding: 10px; background-color: #ffffff; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); transition: box-shadow 0.3s ease; }
.product-card:hover { box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1); }
.info-box { background-color: #f8f9fa; padding: 10px; border-radius: 8px; margin-top: 5px; direction: rtl; }
"""

if GLASSES_LOADED_OK:
    
    with gr.Blocks(title="كتالوج النظارات التسويقي", theme=gr.themes.Soft(), css=custom_css) as demo:
        
        gr.Markdown(
            """
            # 🛍️ **كتالوج النظارات التسويقي**
            إليك نظاراتنا المتاحة حاليًا (3 نظارات) مع تفاصيلها وأسعارها.
            ---
            """
        )

        gr.Markdown("## ✨ الكتالوج المقترح لك")

        # 1. قسم عرض الكتالوج (3 منتجات)
        
        # تعريف المخرجات (صور النظارات ومعلوماتها)
        output_img1 = gr.Image(label="النظارة 1", show_label=False)
        output_info1 = gr.Markdown("---", elem_classes=["info-box"])
        output_img2 = gr.Image(label="النظارة 2", show_label=False)
        output_info2 = gr.Markdown("---", elem_classes=["info-box"])
        output_img3 = gr.Image(label="النظارة 3", show_label=False)
        output_info3 = gr.Markdown("---", elem_classes=["info-box"])
        
        all_outputs = [output_img1, output_info1, output_img2, output_info2, output_img3, output_info3]

        with gr.Row():
            with gr.Column(scale=1, elem_classes=["product-card"]):
                # تم حذف: output_img1.render()
                # تم حذف: output_info1.render()
                pass # العناصر تُعرض تلقائياً بمجرد تعريفها في السياق
            with gr.Column(scale=1, elem_classes=["product-card"]):
                # تم حذف: output_img2.render()
                # تم حذف: output_info2.render()
                pass
            with gr.Column(scale=1, elem_classes=["product-card"]):
                # تم حذف: output_img3.render()
                # تم حذف: output_info3.render()
                pass
        
        # تشغيل الدالة لعرض الكتالوج بمجرد تحميل الواجهة
        demo.load(
            fn=display_catalog,
            inputs=None,
            outputs=all_outputs
        )

    demo.launch(server_name="0.0.0.0", server_port=7860)

else:
    print("❌ فشل تشغيل Gradio: يرجى مراجعة سجلات التحذيرات لتأكيد تحميل صور النظارات.")