في الكود التالي هل يمكن إضافة 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` واستئنافه بنفس الطريقة.