Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -266,8 +266,8 @@ async (image) => {
|
|
| 266 |
}
|
| 267 |
"""
|
| 268 |
|
| 269 |
-
# --- جاوااسکریپت سراسری (
|
| 270 |
-
#
|
| 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 |
-
|
| 293 |
-
|
| 294 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
|
| 296 |
-
//
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 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: #
|
| 315 |
-
|
| 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 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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)
|