Opera8 commited on
Commit
6862a8f
·
verified ·
1 Parent(s): fc6783c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -36
app.py CHANGED
@@ -266,8 +266,8 @@ async (image) => {
266
  }
267
  """
268
 
269
- # --- جاوااسکریپت سراسری (تزریق از طریق HTML برای جلوگیری از خطا) ---
270
- # این اسکریپت هم تم روشن را اجبار می‌کند و هم پیام خطای GPU را مدیریت می‌کند
271
  js_global_content = """
272
  <script>
273
  document.addEventListener('DOMContentLoaded', () => {
@@ -284,47 +284,49 @@ document.addEventListener('DOMContentLoaded', () => {
284
  forceLight();
285
  setInterval(forceLight, 1000);
286
 
287
- // 2. GPU Quota Replacer
288
  const observer = new MutationObserver((mutations) => {
289
  mutations.forEach((mutation) => {
290
  if (mutation.addedNodes.length) {
291
  mutation.addedNodes.forEach((node) => {
292
- if (node.nodeType === 1) {
293
- const textContent = node.innerText || "";
294
- if (textContent.includes("exceeded your GPU quota")) {
 
 
 
 
 
 
 
 
 
295
 
296
- // Find the container
297
- let targetNode = node.classList.contains('toast-wrap') ? node : node.closest('.toast-wrap');
298
- if (!targetNode) {
299
- targetNode = node.classList.contains('toast-body') ? node : node.closest('.toast-body');
300
- }
301
-
302
- if (targetNode && !targetNode.dataset.fixed) {
303
- targetNode.innerHTML = `
304
- <div style="font-family: 'Vazirmatn', sans-serif; direction: rtl; text-align: right; padding: 15px; background: white; border-radius: 12px; border: 2px solid #e74c3c; box-shadow: 0 5px 15px rgba(0,0,0,0.1);">
305
- <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 10px;">
306
- <span style="font-size: 32px;">✈️</span>
307
- <div>
308
- <h3 style="margin: 0; color: #c0392b; font-size: 18px; font-weight: bold;">ظرفیت سرور تکمیل شد</h3>
309
- </div>
310
- </div>
311
- <p style="margin: 0 0 12px 0; color: #555; font-size: 14px;">
312
- سهمیه رایگان شما برای استفاده از سرور تمام شده است.
313
  </p>
314
- <div style="background-color: #e3f2fd; border: 1px solid #64b5f6; border-radius: 8px; padding: 10px;">
315
- <p style="margin: 0; color: #1565c0; font-weight: bold; font-size: 13px;">💡 راه حل سریع:</p>
316
- <p style="margin: 5px 0 0 0; font-size: 13px; color: #0d47a1;">
317
- لطفا�� <b>حالت هواپیما (Airplane Mode)</b> گوشی خود را روشن و سپس خاموش کنید تا IP شما تغییر کند.
318
- </p>
319
  </div>
320
- <button onclick="this.closest('.toast-wrap').remove()" style="margin-top:10px; width:100%; border:none; background:#eee; padding:5px; border-radius:5px; cursor:pointer;">بستن</button>
321
  </div>
322
- `;
323
- targetNode.dataset.fixed = "true";
324
- targetNode.style.backgroundColor = "transparent";
325
- targetNode.style.border = "none";
326
- targetNode.style.boxShadow = "none";
327
- targetNode.style.padding = "0";
 
 
 
 
 
 
328
  }
329
  }
330
  }
@@ -515,7 +517,7 @@ footer { display: none !important; }
515
  # ادغام CSS و JS
516
  combined_html = css_code + js_global_content
517
 
518
- # استفاده از gr.Blocks بدون پارامتر js (برای جلوگیری از خطا)
519
  with gr.Blocks() as demo:
520
  # تزریق کدها به عنوان HTML
521
  gr.HTML(combined_html)
 
266
  }
267
  """
268
 
269
+ # --- جاوااسکریپت سراسری (شامل منطق جدید مدیریت خطا) ---
270
+ # در اینجا منطق Regex برنامه قبلی برای محاسبه زمان باقی‌مانده و نمایش کارت زیبا ادغام شده است
271
  js_global_content = """
272
  <script>
273
  document.addEventListener('DOMContentLoaded', () => {
 
284
  forceLight();
285
  setInterval(forceLight, 1000);
286
 
287
+ // 2. GPU Quota Replacer (Logic from MoDA Farsi)
288
  const observer = new MutationObserver((mutations) => {
289
  mutations.forEach((mutation) => {
290
  if (mutation.addedNodes.length) {
291
  mutation.addedNodes.forEach((node) => {
292
+ // بررسی المان‌های خطا
293
+ if (node.nodeType === 1 && (node.classList.contains('toast-body') || node.classList.contains('error') || node.closest('.toast-body'))) {
294
+ const originalText = node.innerText;
295
+
296
+ // الگوی پیدا کردن زمان درخواستی و زمان باقی‌مانده
297
+ const regex = /(\d+)s requested vs. (\d+)s left/;
298
+ const match = originalText.match(regex);
299
+
300
+ // اگر خطا مربوط به Quota بود و قبلا ترجمه نشده بود
301
+ if (match && !node.dataset.translated) {
302
+ const requested = match[1];
303
+ const left = match[2];
304
 
305
+ // ساخت کارت HTML زیبا (مشابه برنامه اول اما با فونت برنامه دوم)
306
+ const prettyHtml = `
307
+ <div style="display: flex; align-items: center; gap: 15px; font-family: 'Vazirmatn', sans-serif; direction: rtl; padding: 10px;">
308
+ <div style="font-size: 2.5em; color: #dc3545;">⏳</div>
309
+ <div>
310
+ <h4 style="margin: 0; color: #5a6268; font-weight: bold;">ظرفیت سرور تکمیل است!</h4>
311
+ <p style="margin: 5px 0 0 0; color: #6c757d; font-size: 0.9em;">
312
+ سهمیه رایگان GPU شما برای پردازش یک تسک <b>${requested} ثانیه‌ای</b> کافی نیست.
 
 
 
 
 
 
 
 
 
313
  </p>
314
+ <div style="background-color: #f8d7da; border: 1px solid #f5c6cb; border-radius: 5px; padding: 5px 8px; margin-top: 10px; font-size: 0.85em;">
315
+ اعتبار باقیمانده: <b>${left} ثانیه</b>
 
 
 
316
  </div>
 
317
  </div>
318
+ </div>
319
+ `;
320
+
321
+ node.innerHTML = prettyHtml;
322
+ node.dataset.translated = 'true';
323
+
324
+ // استایل دادن به کادر والد برای حذف استایل‌های پیش‌فرض زشت
325
+ let parent = node.closest('.toast-wrap') || node;
326
+ if(parent) {
327
+ parent.style.backgroundColor = "white";
328
+ parent.style.border = "1px solid #ddd";
329
+ parent.style.boxShadow = "0 2px 10px rgba(0,0,0,0.1)";
330
  }
331
  }
332
  }
 
517
  # ادغام CSS و JS
518
  combined_html = css_code + js_global_content
519
 
520
+ # استفاده از gr.Blocks بدون پارامتر js
521
  with gr.Blocks() as demo:
522
  # تزریق کدها به عنوان HTML
523
  gr.HTML(combined_html)