اپ کی ایپ میں ویڈیو جنریشن شامل کرنا امیج جنریشن شامل کرنے جیسا نہیں ہے۔ API کال فوراً جواب دے دیتی ہے — لیکن ویڈیو ابھی تیار نہیں ہوتی۔ آپ کو ایک ٹاسک ID ملتا ہے، اور آپ کو بار بار پوچھنا پڑتا ہے "کیا یہ مکمل ہو گیا؟" یہاں تک کہ یہ ہو جائے۔
زیادہ تر ڈویلپر پہلی بار ویڈیو API کال کرتے وقت یہی مسئلہ دیکھتے ہیں: وہ ریسپانس باڈی میں ویڈیو URL کا انتظار کرتے ہیں، اور اس کی جگہ ٹاسک ID واپس آتا ہے۔ یہ گائیڈ مکمل فلو بتاتی ہے: ٹاسک سبمٹ کرنا، نتائج کے لیے پولنگ، ناکامیوں کو ہینڈل کرنا، اور URL ایکسپائر ہونے سے پہلے آؤٹ پٹ کو اسٹور کرنا۔
What you'll build
ایک بیک اینڈ سروس جو ٹیکسٹ پرامپٹ یا امیج قبول کرتی ہے، ویڈیو جنریشن ٹاسک سبمٹ کرتی ہے، مکمل ہونے تک پولنگ کرتی ہے، اور آخری ویڈیو URL لوٹاتی ہے۔ آپ چار ماڈلز کے ساتھ کام کریں گے — Veo 3 Fast، Sora 2، Kling Video، اور Runway — سب ایک ہی API key کے ذریعے۔
Prerequisites:
- Python 3.8+ یا Node.js 18+
- ایک CometAPI key
- REST APIs سے بنیادی واقفیت
Understand why video generation is different
امیج جنریشن میں، آپ ریکویسٹ بھیجتے ہیں اور اسی ریسپانس میں امیج واپس مل جاتا ہے۔ ویڈیو جنریشن ایک غیر متزامن ٹاسک قطار استعمال کرتی ہے:
- Submit جنریشن ریکویسٹ → واپس ایک
task_idملتا ہے - ہر چند سیکنڈ بعد ایک اسٹیٹس اینڈ پوائنٹ پر Poll کریں
- جب اسٹیٹس ٹرمینل حالت تک پہنچے، آپ کو ویڈیو URL ملتا ہے
- ویڈیو کو Download اور store کریں — URL عارضی ہوتا ہے
اگر آپ ویڈیو جنریشن کو امیج جنریشن کی طرح لیں اور پہلے ریسپانس میں ویڈیو کی توقع کریں، تو آپ کی ریکویسٹ ہر بار ٹائم آؤٹ ہو جائے گی۔
پروڈکشن ویب سروس میں، یہ پولنگ لوپ آپ کے ریکویسٹ ہینڈلر میں نہیں بلکہ ایک بیک گراؤنڈ ورکر (Celery، Bull، یا اسی طرح) میں چلنا چاہیے۔ نیچے دیے گئے مثالیں ہم وقتی پولنگ استعمال کرتی ہیں — اسکرپٹس اور پروٹو ٹائپس کے لیے ٹھیک ہے، لیکن یکساں طور پر کئی یوزرز ہینڈل کرنے کے لیے نہیں۔
Choose a model
| Model | Provider | Max duration | Price (via CometAPI) | Best for |
|---|---|---|---|---|
| Veo 3 Fast | 8 sec | $0.05/sec | تیز پروٹو ٹائپنگ، سوشل کلپس | |
| Sora 2 | OpenAI (via CometAPI model ID) | ~10 sec | $0.08/sec | اعلیٰ کوالٹی تخلیقی شارٹس |
| Kling Video | Kuaishou | 10 sec | $0.13–$2.64/task | مارکیٹنگ مواد، گرینولر کنٹرول |
| Runway Gen-3A Turbo | Runway | 5 or 10 sec | $0.32/task | Image-to-video، کمرشل مواد |
Source**: CometAPI ماڈل پیجز، May 2026۔ نوٹ: "Sora 2" CometAPI کا ماڈل identifier ہے — ان کے model page سے بنیادی ماڈل کی تفصیل دیکھیں۔
- Veo 3 Fast ٹیکسٹ-ٹو-ویڈیو اور امیج-ٹو-ویڈیو دونوں سپورٹ کرتا ہے۔ فی سیکنڈ سب سے سستا، اچھا ابتدائی نقطہ۔
- Sora 2 ویڈیو کے ساتھ آڈیو بھی نیٹو طور پر جنریٹ کرتا ہے — ڈائیلاگ، ایمبینٹ ساؤنڈ، اور ایفیکٹس بغیر الگ TTS قدم کے۔
- Kling Video آپ کو
negative_prompt,cfg_scale، کیمرہ موومنٹ سیٹنگز، اورproموڈ دیتا ہے۔ ان چاروں میں سب سے زیادہ کنٹرول۔ - Runway CometAPI کے ذریعے صرف image-to-video ہے۔ اسے اسٹیٹک امیج اور موشن ڈسکرپشن دیں، یہ اسے اینیمیٹ کر دیتا ہے۔
Submit a Veo task
Veo multipart/form-data استعمال کرتا ہے۔ Python requests میں درست طور پر بھیجنے کے لیے files= استعمال کریں — data=dict application/x-www-form-urlencoded بھیجتا ہے، جو کہ مختلف چیز ہے:
import requestsimport osfrom dotenv import load_dotenvload_dotenv()def submit_veo_task(prompt: str, size: str = "16x9") -> str: """Veo 3 Fast ٹیکسٹ-ٹو-ویڈیو ٹاسک سبمٹ کریں۔ task_id واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") response = requests.post( "https://api.cometapi.com/v1/videos", headers={"Authorization": f"Bearer {api_key}"}, files={ "prompt": (None, prompt), "model": (None, "veo3-fast"), "size": (None, size) }, timeout=30 ) response.raise_for_status() return response.json()["id"]task_id = submit_veo_task("ہواؤں بھری دوپہر میں گندم کے کھیت کے اوپر لہراتی ہوئی کاغذی پتنگ")print(f"ٹاسک سبمٹ ہوا: {task_id}")
Poll for the result
import timedef poll_veo_task(task_id: str, interval: int = 10, max_wait: int = 600) -> str: """Veo ٹاسک مکمل ہونے تک پول کریں۔ ویڈیو URL واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") headers = {"Authorization": f"Bearer {api_key}"} url = f"https://api.cometapi.com/v1/videos/{task_id}" elapsed = 0 while elapsed < max_wait: response = requests.get(url, headers=headers, timeout=30) response.raise_for_status() result = response.json() status = result.get("status") if status == "succeeded": return result["output"][0] elif status in ("failed", "cancelled"): raise RuntimeError( f"ٹاسک {task_id} اسٹیٹس '{status}' کے ساتھ ناکام ہوا: " f"{result.get('error', 'کوئی ایرر تفصیل واپس نہیں آئی')}" ) time.sleep(interval) elapsed += interval raise TimeoutError(f"ٹاسک {task_id} {max_wait} سیکنڈ کے اندر مکمل نہیں ہوا")video_url = poll_veo_task(task_id)print(f"ویڈیو تیار: {video_url}")
Use Kling Video for more control
Kling کا اینڈ پوائنٹ ڈھانچہ مختلف ہے اور JSON استعمال کرتا ہے۔ نوٹ کریں کہ Kling کی ٹرمینل اسٹیٹس سٹرنگ "succeed" ہے (نہ کہ "succeeded") — یہ API کے اصل ریسپانس فارمیٹ سے مطابقت رکھتی ہے:
def submit_kling_task(prompt: str, duration: str = "5", mode: str = "std") -> str: """Kling ٹیکسٹ-ٹو-ویڈیو ٹاسک سبمٹ کریں۔ task_id واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") response = requests.post( "https://api.cometapi.com/kling/v1/videos/text2video", headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }, json={ "model_name": "kling-v1-6", "prompt": prompt, "negative_prompt": "blurry, low quality, watermark", "cfg_scale": 0.5, "mode": mode, # "std" یا "pro" "aspect_ratio": "16:9", "duration": duration # "5" یا "10" }, timeout=30 ) response.raise_for_status() return response.json()["data"]["task_id"]def poll_kling_task(task_id: str, interval: int = 10, max_wait: int = 600) -> str: """Kling ٹاسک مکمل ہونے تک پول کریں۔ ویڈیو URL واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") headers = {"Authorization": f"Bearer {api_key}"} url = f"https://api.cometapi.com/kling/v1/videos/text2video/{task_id}" elapsed = 0 while elapsed < max_wait: response = requests.get(url, headers=headers, timeout=30) response.raise_for_status() result = response.json() status = result["data"]["task_status"] if status == "succeed": # Kling "succeed" استعمال کرتا ہے، "succeeded" نہیں return result["data"]["task_result"]["videos"][0]["url"] elif status == "failed": error_detail = result.get("data", {}).get("task_result", "کوئی تفصیل نہیں") raise RuntimeError( f"Kling ٹاسک {task_id} ناکام ہوا: {error_detail}" ) time.sleep(interval) elapsed += interval raise TimeoutError(f"Kling ٹاسک {task_id} {max_wait}s کے بعد ٹائم آؤٹ ہو گیا")
Source**: CometAPI Kling Video docs
Animate a static image with Runway
Runway صرف image-to-video ہے۔ اسے ایک اضافی ہیڈر (X-Runway-Version) بھی درکار ہے:
def submit_runway_task(image_url: str, motion_prompt: str, duration: int = 5) -> str: """Runway امیج-ٹو-ویڈیو ٹاسک سبمٹ کریں۔ task_id واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") response = requests.post( "https://api.cometapi.com/runwayml/v1/image_to_video", headers={ "Authorization": f"Bearer {api_key}", "X-Runway-Version": "2024-11-06", "Content-Type": "application/json" }, json={ "model": "gen3a_turbo", "promptImage": image_url, # ایک مستحکم HTTPS URL ہونا چاہیے "promptText": motion_prompt, "duration": duration, "ratio": "1280:720", "watermark": False }, timeout=30 ) response.raise_for_status() return response.json()["id"]def poll_runway_task(task_id: str, interval: int = 5, max_wait: int = 600) -> str: """Runway ٹاسک پول کریں۔ مکمل ہونے پر ویڈیو URL واپس کرتا ہے۔""" api_key = os.getenv("COMETAPI_KEY") if not api_key: raise ValueError("COMETAPI_KEY ماحولیہ متغیر سیٹ نہیں ہے") headers = { "Authorization": f"Bearer {api_key}", "X-Runway-Version": "2024-11-06" } url = f"https://api.cometapi.com/runwayml/v1/tasks/{task_id}" elapsed = 0 while elapsed < max_wait: response = requests.get(url, headers=headers, timeout=30) response.raise_for_status() result = response.json() status = result.get("status") if status == "task_not_exist": # CometAPI-خاص: ٹاسک ابھی ابتدائی حالت میں ہے، چند سیکنڈ بعد دوبارہ کوشش کریں time.sleep(interval) elapsed += interval continue elif status == "succeeded": return result["output"][0] elif status in ("failed", "cancelled"): raise RuntimeError(f"Runway ٹاسک {task_id} ناکام ہوا: {result.get('error', 'کوئی تفصیل نہیں')}") time.sleep(interval) elapsed += interval raise TimeoutError(f"Runway ٹاسک {task_id} {max_wait}s کے بعد ٹائم آؤٹ ہو گیا")
Source**: CometAPI Runway docs
Save the video before the URL expires
جنریشن APIs سے آنے والے ویڈیو URLs عارضی ہوتے ہیں۔ فائل فوراً ڈاؤن لوڈ کریں اور کہیں محفوظ کریں جو آپ کے کنٹرول میں ہو:
import requestsimport pathlibdef download_video(url: str, output_path: str) -> None: """اسٹریمنگ استعمال کرتے ہوئے URL سے ویڈیو مقامی فائل میں ڈاؤن لوڈ کریں۔""" out = pathlib.Path(output_path) if out.parent != pathlib.Path("."): out.parent.mkdir(parents=True, exist_ok=True) with requests.get(url, stream=True, timeout=60) as r: r.raise_for_status() with open(out, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print(f"{output_path} میں محفوظ ہو گیا")# مکمل فلوtask_id = submit_veo_task("شہر کے اسکی لائن پر بادلوں کی ٹائم لیپس حرکت")video_url = poll_veo_task(task_id)download_video(video_url, "output/city_timelapse.mp4")
پروڈکشن میں، مقامی فائل لکھنے کی جگہ S3، Cloudflare R2، یا اپنی پسند کی اسٹوریج پر اپ لوڈ کریں۔ اسٹریمنگ پیٹرن وہی رہتا ہے — بائٹس کو براہ راست پائپ کریں بجائے اس کے کہ پوری ویڈیو میموری میں لوڈ کریں۔
Handle failures
| Symptom | Likely cause | Fix |
|---|---|---|
| Task stuck in queued for 10+ min | سرور لوڈ یا ماڈل دستیاب نہیں | کسی دوسرے ماڈل کے ساتھ دوبارہ کوشش کریں |
| task_not_exist on first Runway poll | ٹاسک ابھی ابتدائی حالت میں ہے | 5 سیکنڈ انتظار کریں اور دوبارہ کوشش کریں — CometAPI کا دستاویزی رویہ |
| failed with no error message | پرامپٹ نے کانٹینٹ فلٹر کو ٹرگر کیا | پرامپٹ کو دوبارہ لکھیں |
| Video URL returns 403 | URL ڈاؤن لوڈ سے پہلے ایکسپائر ہو گیا | URL ملتے ہی فوراً ڈاؤن لوڈ کریں |
| Timeout after 10 min | جنریشن میں بہت وقت لگا | max_wait بڑھائیں یا Veo 3 Fast پر جائیں |
| Kling returns "succeed" not "succeeded" | Kling کی API نان-اسٹینڈرڈ اسٹیٹس سٹرنگ | یہ درست ہے — اوپر Kling پولنگ کوڈ دیکھیں |
Source: CometAPI video generation docs
Node.js version
Node.js 18+ میں fetch اور FormData نیٹو طور پر شامل ہیں۔ یہ مثال چاروں ماڈلز کو کور کرتی ہے:
// Node.js 18+ — کسی اضافی پیکیج کی ضرورت نہیںconst API_KEY = process.env.COMETAPI_KEY;if (!API_KEY) throw new Error('COMETAPI_KEY سیٹ نہیں ہے');// --- Veo 3 Fast ---async function submitVeoTask(prompt, size = '16x9') { const form = new FormData(); form.append('prompt', prompt); form.append('model', 'veo3-fast'); form.append('size', size); const res = await fetch('https://api.cometapi.com/v1/videos', { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}` }, body: form }); if (!res.ok) throw new Error(`Veo سبمٹ ناکام: ${res.status}`); return (await res.json()).id;}async function pollVeoTask(taskId, intervalMs = 10000, maxWaitMs = 600000) { let elapsed = 0; while (elapsed < maxWaitMs) { const res = await fetch(`https://api.cometapi.com/v1/videos/${taskId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); if (!res.ok) throw new Error(`پول ناکام: ${res.status}`); const result = await res.json(); if (result.status === 'succeeded') return result.output[0]; if (['failed', 'cancelled'].includes(result.status)) { throw new Error(`ٹاسک ${taskId} ناکام ہوا: ${result.error ?? 'کوئی تفصیل نہیں'}`); } await new Promise(r => setTimeout(r, intervalMs)); elapsed += intervalMs; } throw new Error(`ٹاسک ${taskId} ٹائم آؤٹ ہو گیا`);}// --- Kling Video ---async function submitKlingTask(prompt, duration = '5', mode = 'std') { const res = await fetch('https://api.cometapi.com/kling/v1/videos/text2video', { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model_name: 'kling-v1-6', prompt, negative_prompt: 'blurry, low quality, watermark', cfg_scale: 0.5, mode, aspect_ratio: '16:9', duration }) }); if (!res.ok) throw new Error(`Kling سبمٹ ناکام: ${res.status}`); return (await res.json()).data.task_id;}async function pollKlingTask(taskId, intervalMs = 10000, maxWaitMs = 600000) { let elapsed = 0; while (elapsed < maxWaitMs) { const res = await fetch( `https://api.cometapi.com/kling/v1/videos/text2video/${taskId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } } ); if (!res.ok) throw new Error(`Kling پول ناکام: ${res.status}`); const result = await res.json(); const status = result.data.task_status; if (status === 'succeed') return result.data.task_result.videos[0].url; if (status === 'failed') { throw new Error(`Kling ٹاسک ${taskId} ناکام ہوا: ${JSON.stringify(result.data.task_result ?? 'کوئی تفصیل نہیں')}`); } await new Promise(r => setTimeout(r, intervalMs)); elapsed += intervalMs; } throw new Error(`Kling ٹاسک ${taskId} ٹائم آؤٹ ہو گیا`);}// --- Runway (image-to-video) ---async function submitRunwayTask(imageUrl, motionPrompt, duration = 5) { const res = await fetch('https://api.cometapi.com/runwayml/v1/image_to_video', { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'X-Runway-Version': '2024-11-06', 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gen3a_turbo', promptImage: imageUrl, promptText: motionPrompt, duration, ratio: '1280:720', watermark: false }) }); if (!res.ok) throw new Error(`Runway سبمٹ ناکام: ${res.status}`); return (await res.json()).id;}async function pollRunwayTask(taskId, intervalMs = 5000, maxWaitMs = 600000) { let elapsed = 0; while (elapsed < maxWaitMs) { const res = await fetch( `https://api.cometapi.com/runwayml/v1/tasks/${taskId}`, { headers: { 'Authorization': `Bearer ${API_KEY}`, 'X-Runway-Version': '2024-11-06' } } ); if (!res.ok) throw new Error(`Runway پول ناکام: ${res.status}`); const result = await res.json(); const status = result.status; if (status === 'task_not_exist') { // CometAPI-خاص: ٹاسک ابھی ابتدائی حالت میں ہے await new Promise(r => setTimeout(r, intervalMs)); elapsed += intervalMs; continue; } if (status === 'succeeded') return result.output[0]; if (['failed', 'cancelled'].includes(status)) { throw new Error(`Runway ٹاسک ${taskId} ناکام ہوا: ${result.error ?? 'کوئی تفصیل نہیں'}`); } await new Promise(r => setTimeout(r, intervalMs)); elapsed += intervalMs; } throw new Error(`Runway ٹاسک ${taskId} ٹائم آؤٹ ہو گیا`);}// Usage exampleconst taskId = await submitVeoTask('ہواؤں بھری دوپہر میں گندم کے کھیت کے اوپر لہراتی ہوئی کاغذی پتنگ');const videoUrl = await pollVeoTask(taskId);console.log('ویڈیو تیار:', videoUrl);
What's next
آپ کے پاس اب چار ویڈیو ماڈلز کے لیے ورکنگ کوڈ ہے، ایک پولنگ لوپ جو ناکامیوں کو ہینڈل کرتا ہے، اور ڈاؤن لوڈ کا قدم جو آپ کو جنریٹڈ مواد کھونے سے بچاتا ہے۔
اگلا مسئلہ جو زیادہ تر ڈویلپرز کو پیش آتا ہے: انہوں نے ایک ماڈل ہارڈ کوڈ کر دیا ہوتا ہے، اور سستے یا تیز آپشن پر جانے کے لیے کئی فائلوں میں تبدیلی کرنا پڑتی ہے۔ اگلا آرٹیکل بتاتا ہے کہ بغیر کوڈ دوبارہ لکھے ماڈلز کے درمیان ریکویسٹ کو کیسے روٹ کیا جائے۔
Next: اپنا کوڈ دوبارہ لکھے بغیر AI ماڈلز کے درمیان کیسے سوئچ کریں
FAQ
Q: API ریسپانس میں ویڈیو کے بجائے مجھے task ID کیوں ملتی ہے؟
ویڈیو جنریشن غیر متزامن ہے — Veo، Sora، Kling، اور Runway جیسے ماڈلز رینڈر کرنے میں 2–5 منٹ لیتے ہیں۔ API فوراً ٹاسک ID واپس کرتی ہے تاکہ آپ کی ریکویسٹ ٹائم آؤٹ نہ ہو۔ آپ ایک الگ اسٹیٹس اینڈ پوائنٹ کو پول کرتے ہیں جب تک ٹاسک ٹرمینل حالت (succeeded, succeed, failed) تک نہ پہنچ جائے۔
Q: جنریٹڈ ویڈیو URL کتنی دیر تک کارآمد رہتا ہے؟
ویڈیو جنریشن APIs کے URLs عارضی ہوتے ہیں۔ URL ملتے ہی فوراً فائل ڈاؤن لوڈ کریں اور اپنی اسٹوریج (S3، Cloudflare R2، وغیرہ) میں محفوظ کریں۔ URL محفوظ کر کے گھنٹوں بعد اس کے چلنے کی توقع نہ کریں۔
Q: Veo 3 Fast اور Kling Video میں کیا فرق ہے؟
Veo 3 Fast سستا ($0.05/sec)، تیز، اور کال کرنا آسان ہے۔ Kling Video آپ کو زیادہ کنٹرول دیتا ہے: negative_prompt, cfg_scale، کیمرہ موومنٹ سیٹنگز، اور pro کوالٹی موڈ۔ اگر آپ کو آؤٹ پٹ کو باریک بینی سے ٹھیک کرنا ہو تو Kling استعمال کریں۔ رفتار اور کم لاگت کے لیے Veo 3 Fast بہتر ہے۔
Q: کیا میں ٹیکسٹ پرامپٹ کے بجائے امیج سے ویڈیو بنا سکتا/سکتی ہوں؟
ہاں۔ Veo input_reference فائل پاس کر کے image-to-video سپورٹ کرتا ہے۔ Kling اسے /kling/v1/videos/image2video اینڈ پوائنٹ کے ذریعے image پیرامیٹر (URL یا base64) سے سپورٹ کرتا ہے۔ Runway صرف image-to-video ہے — یہ CometAPI کے ذریعے صرف ٹیکسٹ-اونلی پرامپٹس قبول نہیں کرتا۔
Q: Runway پہلی پولنگ پر task_not_exist کیوں واپس کرتا ہے؟
یہ CometAPI کا دستاویزی رویہ ہے — بیک اینڈ پر ٹاسک ابھی ابتدائی مرحلے میں ہوتا ہے۔ چند سیکنڈ انتظار کریں اور دوبارہ کوشش کریں۔ یہ ایرر نہیں ہے۔ اوپر دیا گیا پولنگ کوڈ اسے خودکار طور پر ہینڈل کرتا ہے۔
Q: Kling "succeed" کی جگہ "succeeded" کیوں نہیں استعمال کرتا؟
یہ Kling کے API ریسپانس فارمیٹ کی اصل شکل ہے۔ یہ ٹائपो نہیں۔ Veo اور Runway "succeeded" استعمال کرتے ہیں — Kling "succeed" استعمال کرتا ہے۔ اگر آپ متحدہ پولنگ ریپر بنا رہے ہیں تو دونوں سٹرنگز ہینڈل کرنا ہوں گی۔
Q: کیا ہم وقتی پولنگ لوپ کو ویب سرور میں محفوظ طور پر استعمال کیا جا سکتا ہے؟
نہیں۔ اس گائیڈ کا پولنگ لوپ منٹوں تک تھریڈ بلاک رکھتا ہے۔ حقیقی ویب سروس میں جہاں یکساں یوزرز ہوں، پولنگ بیک گراؤنڈ ورکر میں چلائیں (Python کے لیے Celery، Node.js کے لیے Bull)۔ ریکویسٹ ہینڈلر میں ٹاسک سبمٹ کریں، کلائنٹ کو ٹاسک ID واپس کریں، اور ورکر کو ویڈیو تیار ہونے پر کلائنٹ کو مطلع کرنے دیں۔
