Opera10 commited on
Commit
78a7eba
·
verified ·
1 Parent(s): 1edf4e9

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +44 -41
index.html CHANGED
@@ -19,7 +19,7 @@
19
 
20
  <div class="container-fluid">
21
  <h2 class="text-center mb-4 text-primary">LTX 2.3 10Eros - تبدیل تصویر به ویدیو</h2>
22
- <p class="text-center text-muted">اتصال مستقیم با قابلیت نمایش وضعیت صف و جلوگیری از فریز شدن</p>
23
 
24
  <div class="row">
25
  <!-- ستون تنظیمات -->
@@ -141,6 +141,7 @@
141
  { group: "مصرف منابع و Seed", id: "seed", type: "number", val: -1 },
142
  { group: "مصرف منابع و Seed", id: "randomize_seed", type: "checkbox", val: true },
143
  { group: "مصرف منابع و Seed", id: "gen_budget", type: "number", val: 0 },
 
144
  { group: "مصرف منابع و Seed", id: "profile_name", type: "text", val: "" },
145
 
146
  { group: "حالت چند مرجعی (MSR)", id: "input_mode", type: "select", options: ["single image (i2v)", "multi-reference (MSR)", "multi-reference (original)"], val: "single image (i2v)" },
@@ -234,6 +235,7 @@
234
  index++;
235
  }
236
 
 
237
  document.getElementById("enhanceBtn").addEventListener("click", async () => {
238
  const hfToken = document.getElementById("hf_token").value.trim();
239
  const imgInput = document.getElementById("image_path");
@@ -253,7 +255,7 @@
253
  const enhanceParams = {
254
  image_path: imgInput.files[0],
255
  prompt: promptInput.value,
256
- enhance_budget: 80, // مقدار ثابت برای جلوگیری از ارسال پارامتر اضافه به فرم
257
  msr_ref2_path: getFile("msr_ref2"),
258
  msr_ref3_path: getFile("msr_ref3"),
259
  msr_ref4_path: getFile("msr_ref4"),
@@ -261,6 +263,7 @@
261
  };
262
 
263
  const result = await client.predict("/enhance_prompt", enhanceParams);
 
264
  if (result.data && result.data[0]) {
265
  promptInput.value = result.data[0];
266
  alert("پرامپت با موفقیت بهینه‌سازی شد!");
@@ -295,7 +298,7 @@
295
  videoRes.style.display = "none";
296
  errorBox.style.display = "none";
297
  statusText.style.display = "block";
298
- statusText.innerText = "در حال اتصال به سرور...";
299
 
300
  try {
301
  const params = {
@@ -323,45 +326,46 @@
323
  }
324
  });
325
 
326
- // اتصال به کلاینت (یک بار)
 
327
  const client = await Client.connect("Fighterdan/LTX-2.3-10Eros_I2V", { hf_token: hfToken });
328
 
329
- // استفاده از submit به همراه for await برای مدیریت استریم و جلوگیری از فریز شدن
330
- const job = client.submit("/generate", params);
331
-
332
- for await (const msg of job) {
333
- if (msg.type === "status") {
334
- if (msg.stage === "pending") {
335
- const q = msg.queue_position !== undefined ? msg.queue_position : "نامشخص";
336
- statusText.innerText = `در صف انتظار... (جایگاه شما: ${q})`;
337
- } else if (msg.stage === "generating") {
338
- statusText.innerText = "در حال پردازش گرافیکی (لطفاً منتظر بمانید)...";
339
- } else if (msg.stage === "error") {
340
- throw new Error(msg.message || "ظرفیت رایگان (ZeroGPU Quota) شما تمام شده یا ارتباط با سرور قطع شد.");
341
- }
342
- } else if (msg.type === "data") {
343
- const data = msg.data;
344
- let videoUrl = "";
345
-
346
- if (data && data[0]) {
347
- let fileData = data[0].video ? data[0].video : data[0];
348
- if (fileData instanceof Blob) {
349
- videoUrl = URL.createObjectURL(fileData);
350
- } else if (typeof fileData === "string") {
351
- videoUrl = fileData;
352
- } else if (typeof fileData === "object") {
353
- videoUrl = fileData.url || (fileData.path ? `https://fighterdan-ltx-2-3-10eros-i2v.hf.space/file=${fileData.path}` : "");
354
- }
355
- }
356
 
357
- if (videoUrl) {
358
- videoRes.src = videoUrl;
359
- videoRes.style.display = "block";
360
- statusText.innerText = "تولید با موفقیت به پایان رسید!";
361
- seedRes.innerText = "گزارش خروجی: " + (data[1] || "") + " | Seed: " + (data[2] || "");
362
- } else {
363
- throw new Error("پردازش با موفقیت تمام شد اما لینک ویدیو یافت نشد.");
364
- }
 
 
 
 
 
 
 
365
  }
366
  }
367
 
@@ -369,8 +373,7 @@
369
  console.error(error);
370
  statusText.style.display = "none";
371
  errorBox.style.display = "block";
372
- // نمایش واضح ارور به جای فریز شدن
373
- errorBox.innerHTML = `<strong>خطا در پردازش:</strong><br><br>${error.message.replace(/\n/g, '<br>')}<br><br><span style="color:#666;">نکته: اگر خطای "Quota Exceeded" یا "Capacity" دریافت کردید، یعنی محدودیت حساب شما در Hugging Face تمام شده است و باید Token دیگری استفاده کنید.</span>`;
374
  } finally {
375
  btn.disabled = false;
376
  loader.style.display = "none";
 
19
 
20
  <div class="container-fluid">
21
  <h2 class="text-center mb-4 text-primary">LTX 2.3 10Eros - تبدیل تصویر به ویدیو</h2>
22
+ <p class="text-center text-muted">اتصال مستقیم و پایدار (نسخه نهایی با پشتیبانی از ساختار ویدیوی Gradio)</p>
23
 
24
  <div class="row">
25
  <!-- ستون تنظیمات -->
 
141
  { group: "مصرف منابع و Seed", id: "seed", type: "number", val: -1 },
142
  { group: "مصرف منابع و Seed", id: "randomize_seed", type: "checkbox", val: true },
143
  { group: "مصرف منابع و Seed", id: "gen_budget", type: "number", val: 0 },
144
+ { group: "مصرف منابع و Seed", id: "enhance_budget", type: "number", val: 80 },
145
  { group: "مصرف منابع و Seed", id: "profile_name", type: "text", val: "" },
146
 
147
  { group: "حالت چند مرجعی (MSR)", id: "input_mode", type: "select", options: ["single image (i2v)", "multi-reference (MSR)", "multi-reference (original)"], val: "single image (i2v)" },
 
235
  index++;
236
  }
237
 
238
+
239
  document.getElementById("enhanceBtn").addEventListener("click", async () => {
240
  const hfToken = document.getElementById("hf_token").value.trim();
241
  const imgInput = document.getElementById("image_path");
 
255
  const enhanceParams = {
256
  image_path: imgInput.files[0],
257
  prompt: promptInput.value,
258
+ enhance_budget: Number(document.getElementById("enhance_budget")?.value || 80),
259
  msr_ref2_path: getFile("msr_ref2"),
260
  msr_ref3_path: getFile("msr_ref3"),
261
  msr_ref4_path: getFile("msr_ref4"),
 
263
  };
264
 
265
  const result = await client.predict("/enhance_prompt", enhanceParams);
266
+
267
  if (result.data && result.data[0]) {
268
  promptInput.value = result.data[0];
269
  alert("پرامپت با موفقیت بهینه‌سازی شد!");
 
298
  videoRes.style.display = "none";
299
  errorBox.style.display = "none";
300
  statusText.style.display = "block";
301
+ statusText.innerText = "در حال تولید ویدیو (بسته به شلوغی سرور ممکن است چند دقیقه طول بکشد)...";
302
 
303
  try {
304
  const params = {
 
326
  }
327
  });
328
 
329
+ delete params.enhance_budget;
330
+
331
  const client = await Client.connect("Fighterdan/LTX-2.3-10Eros_I2V", { hf_token: hfToken });
332
 
333
+ const result = await client.predict("/generate", params);
334
+ const data = result.data;
335
+
336
+ // ========================================================
337
+ // بخش هوشمند استخراج آدرس ویدیو بر اساس ساختار تو در تو
338
+ // ========================================================
339
+ let videoUrl = "";
340
+ if (data && data[0]) {
341
+ // در نسخه‌های جدید Gradio داده ویدیو در key به نام "video" قرار دارد
342
+ let fileData = data[0].video ? data[0].video : data[0];
343
+
344
+ if (fileData instanceof Blob) {
345
+ videoUrl = URL.createObjectURL(fileData);
346
+ } else if (typeof fileData === "string") {
347
+ videoUrl = fileData;
348
+ } else if (typeof fileData === "object") {
349
+ // استخراج URL یا ساخته شدن مسیر پایه
350
+ videoUrl = fileData.url || (fileData.path ? `https://fighterdan-ltx-2-3-10eros-i2v.hf.space/file=${fileData.path}` : "");
351
+ }
352
+ }
 
 
 
 
 
 
 
353
 
354
+ if (videoUrl) {
355
+ // موفقیت کامل
356
+ videoRes.src = videoUrl;
357
+ videoRes.style.display = "block";
358
+ statusText.innerText = "تولید با موفقیت به پایان رسید!";
359
+ // data[1] همان گزارش موفقیت (مثل 1024x1152, 25 frames) است
360
+ seedRes.innerText = "گزارش خروجی: " + (data[1] || "") + " | Seed: " + (data[2] || "");
361
+ } else {
362
+ // اگر ویدیویی یافت نشد، یعنی واقعا در پایتون اکسپشن رخ داده
363
+ statusText.style.display = "none";
364
+ errorBox.style.display = "block";
365
+ if (data && data[1]) {
366
+ errorBox.innerHTML = `<strong>خطای سرور:</strong><br><br>${data[1].replace(/\n/g, '<br>')}`;
367
+ } else {
368
+ errorBox.innerText = "خطا: ارتباط موفق بود اما ویدیویی برگشت داده نشد.";
369
  }
370
  }
371
 
 
373
  console.error(error);
374
  statusText.style.display = "none";
375
  errorBox.style.display = "block";
376
+ errorBox.innerText = "خطای کلاینت/شبکه: " + error.message;
 
377
  } finally {
378
  btn.disabled = false;
379
  loader.style.display = "none";