Artificial Intelligence
Please fill the required field.

في الكود التالي هل يمكن إضافة pause أو إيقاف مؤقت للتحميل، وذلك بالضغط على مفتاح معين في لوحة المفاتيح import yt_dlp import os import time import requests import sys def progress_hook(d): if d['status'] == 'downloading': speed = d.


لإضافة إمكانية إيقاف مؤقت لتحميل الفيديو عند الضغط على مفتاح معين في لوحة المفاتيح، يمكن استخدام مكتبة مثل `keyboard` في بايثون، وهي تتيح لك مراقبة ضغطات المفاتيح. سنقوم بتعديل الكود الحالي لإضافة هذه الميزة. يمكن استخدام مفتاح مثل `p` كمفتاح للإيقاف المؤقت. إليك كيفية القيام بذلك: 1. أضف مكتبة `keyboard` إلى مشروعك. يمكنك تثبيتها باستخدام: ``` pip install keyboard ``` 2. أدخل عمليات التحقق من ضغطات المفاتيح ضمن حلقة التحميل. إليك الكود المعدل مع إضافة ميزة الإيقاف المؤقت: ```python import yt_dlp import os import time import requests import sys import keyboard # إضافة مكتبة keyboard pause_download = False # متغير للتحكم في حالة الإيقاف المؤقت def progress_hook(d): if d['status'] == 'downloading': speed = d.get('speed', 0) eta = d.get('eta', 0) total_bytes = d.get('total_bytes', 0) downloaded_bytes = d.get('downloaded_bytes', 0) percent = downloaded_bytes / total_bytes * 100 if total_bytes else 0 sys.stdout.write(f"\rتحميل: {percent:.2f}% | سرعة: {speed / 1024:.2f} ك.ب/ث | الوقت المتبقي: {eta:.0f} ث") sys.stdout.flush() elif d['status'] == 'finished': sys.stdout.write("\nتم التحميل بنجاح!\n") sys.stdout.flush() def get_video_info(url, ydl_opts): with yt_dlp.YoutubeDL(ydl_opts) as ydl: try: return ydl.extract_info(url, download=False) except Exception: return None def is_file_downloaded(title, download_path): for filename in os.listdir(download_path): name_without_ext = os.path.splitext(filename)[0] if title.lower() == name_without_ext.lower(): return True return False def download_youtube_video(url, quality, download_path): global pause_download # السماح بالوصول إلى المتغير العالمي ydl_opts = { 'format': 'bestvideo[height<=720]+bestaudio/best' if quality == 2 else 'bestvideo[height<=480]+bestaudio/best', 'outtmpl': f'{download_path}/%(title)s.%(ext)s', 'postprocessors': [{'key': 'FFmpegVideoConvertor', 'preferedformat': 'mp4'}], 'noplaylist': True, 'progress_hooks': [progress_hook] } info_dict = get_video_info(url, ydl_opts) if not info_dict: return False title = info_dict.get('title', '').strip() if is_file_downloaded(title, download_path): print(f"الفيديو '{title}' موجود مسبقًا. تخطي التحميل.") return True while True: try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) print(f"تم تحميل الفيديو '{title}' بنجاح.") return True except Exception: time.sleep(5) def download_file(url, download_path): local_filename = os.path.join(download_path, url.split('/')[-1]) if os.path.exists(local_filename): print(f"الملف '{local_filename}' موجود مسبقًا. تخطي التحميل.") return with requests.get(url, stream=True) as r: r.raise_for_status() total_length = int(r.headers.get('content-length', 0)) with open(local_filename, 'wb') as f: if total_length is None: f.write(r.content) else: dl = 0 chunk_size = 8192 print(f"تحميل {local_filename}...") start_time = time.time() while True: if keyboard.is_pressed('p'): # تحقق إذا كان مفتاح الإيقاف المؤقت مضغوطًا pause_download = not pause_download # عكس حالة الإيقاف state = "مؤقت" if pause_download else "مستمر" print(f"\nتم {state} التحميل. اضغط على 'p' لإعادة التشغيل.") while pause_download: time.sleep(0.5) # الانتظار حتى يعود المستخدم لاستئناف chunk = r.iter_content(chunk_size=chunk_size) for data in chunk: dl += len(data) f.write(data) done = int(50 * dl / total_length) elapsed_time = time.time() - start_time speed = dl / elapsed_time if elapsed_time > 0 else 0 sys.stdout.write(f"\r[{ '█' * done}{' ' * (50 - done)}] {dl / 1024:.2f} من {total_length / 1024:.2f} ك.ب ({dl * 100 / total_length:.2f}%) | سرعة: {speed / 1024:.2f} ك.ب/ث") sys.stdout.flush() if dl >= total_length: break print(f"\nتم تحميل الملف '{local_filename}' بنجاح.") def main(): download_path = r"D:\Downloads" urls_input = input("أدخل الروابط مفصولة بفواصل: ") urls = [url.strip() for url in urls_input.split(',') if url.strip()] if not urls: print("لم يتم إدخال روابط صالحة.") return for url in urls: if 'youtube.com' in url or 'youtu.be' in url: quality = 1 download_youtube_video(url, quality, download_path) else: download_file(url, download_path) if __name__ == "__main__": main() ``` ### شرح التعديلات: 1. أضفنا مكتبة `keyboard` لمراقبة ضغطات المفاتيح. 2. أضفنا متغير `pause_download` لتتبع حالة الإيقاف المؤقت. 3. عند تحميل البيانات، نقوم بفحص ما إذا كان مفتاح `p` مضغوطًا. إذا كان مضغوطًا، يتم عكس حالة التحميل، مما يؤدي إلى تغيير سلوك التحميل. 4. يتم استخدام حلقة `while` ليظل البرنامج في حالة انتظار حتى يضغط المستخدم على المفتاح `p` مرة أخرى لإستئناف التحميل. بهذه الطريقة، يمكنك إيقاف التحميل مؤقتًا عند الضغط على `p` واستئنافه بنفس الطريقة.