قمت ببرمجة برنامج بايثون لتحميل الفيديوهات من اليوتيوب
وبعد وضع الرابط وبدء التحميل يخرج لي الخطأ التالي :
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "d:\Youtube-Downloader.py", line 36, in DownloadVideo
select = yt.streams.filter(progressive=True).first()
File "C:\lib\site-packages\pytube\__main__.py", line 292, in streams
return StreamQuery(self.fmt_streams)
File "C:\lib\site-packages\pytube\__main__.py", line 177, in fmt_streams
extract.apply_signature(stream_manifest, self.vid_info, self.js)
File "C:\lib\site-packages\pytube\extract.py", line 409, in apply_signature
cipher = Cipher(js=js)
File "C:\lib\site-packages\pytube\cipher.py", line 43, in __init__
self.throttling_plan = get_throttling_plan(js)
File "C:\lib\site-packages\pytube\cipher.py", line 387, in get_throttling_plan
raw_code = get_throttling_function_code(js)
File "C:\lib\site-packages\pytube\cipher.py", line 301, in get_throttling_function_code
code_lines_list = find_object_from_startpoint(js, match.span()[1]).split('\n')
AttributeError: 'NoneType' object has no attribute 'span'
أرفق لكم الكود التالي :
# Youtube Downloader
from cgitb import text
from logging import root
from random import choices
from secrets import choice
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkinter import filedialog
from typing_extensions import Self
from numpy import save
from pytube import YouTube
from soupsieve import select #pip install pytube3
Folder_Name = ""
#file location
def openLocation():
global Folder_Name
Folder_Name = filedialog.askdirectory()
if(len(Folder_Name) > 1):
locationError.config(text=Folder_Name, fg="green")
else:
locationError.config(text="اختر المجلد", fg="red")
#donwload video
def DownloadVideo():
choice = ytdchoices.get()
url = ytdEntry.get()
if(len(url)>1):
ytdError.config(text="")
yt = YouTube(url)
if(choice == choices[0]):
select = yt.streams.filter(progressive=True).first()
elif(choice == choices[1]):
select = yt.streams.filter(progressive=True, file_extension='mp4').last()
elif(choice == choices[2]):
select = yt.streams.filter(only_audio=True).first()
else:
ytdError.config(text="ألصق الرابط مجدداً", fg="red")
#download function
select.download(Folder_Name)
ytdError.config(text="تم الانتهاء من التحميل!!")
# -------- دالة من نحن --------
def about():
messagebox.showinfo("Techmakers - Hussein Ouda", "husseinaoda@mail.com : مرحبا بكم في برنامج تحميل الفيديوهات والصوتيات")
root = Tk()
root.title("Techmakers: v 1.0 Youtube Downloader")
root.geometry("650x410+340+10") #set window
root.resizable(False, False)
root.columnconfigure(0, weight=1) #set all content in center.
f1=Frame(root, width=580, height=100, bg='whitesmoke', bd=3, relief=GROOVE)
f1.place(x=30, y=130)
f2=Frame(root, width=580, height=55, bg='whitesmoke', bd=3, relief=GROOVE)
f2.place(x=30, y=250)
#Ytd Link Label
t = Label(root, text="برنامج تحميل الفيديوهات والصوتيات", bg='#FF5F00', fg='#EEEEEE', font=("Tajawal", 15, 'bold'))
t.pack(fill='x')
ytdLabel = Label(root, text="ألصق رابط الفيديو",fg='#00092C', font=("Tajawal", 15, 'bold'))
ytdLabel.pack()
#Entry Box
ytdEntryVar = StringVar()
ytdEntry = Entry(root, width=52, justify='center', font=("Tajawal", 15), bg='#B20600', fg='#00092C', textvariable=ytdEntryVar)
ytdEntry.pack()
#Error Msg
ytdError = Label(root, text="ملاحظات التحميل", fg="#B20600", font=("Tajawal", 10))
ytdError.pack()
#Asking save file label
saveLabel = Label(root, text="اختر مكان حفظ الفيديو", bg="whitesmoke", fg='#00092C', font=("Tajawal", 15, 'bold'))
saveLabel.place(x=390, y=140)
#btn of save file
saveEntry = Button(root, width=20, font=("Tajawal", 10, 'bold'), bg="#00092C", fg="#EEEEEE", text="مسار الحفظ", command=openLocation, cursor='sizing')
saveEntry.place(x=410, y=180)
#Error Msg location
locationError = Label(root, text="لم يتم اختيار مسار حفظ الفيديو", bg='whitesmoke', fg="#B20600", font=("Tajawal", 15))
locationError.place(x=100, y=190)
#Download Quality
ytdQuality = Label(root, text="", bg='whitesmoke', font=("Tajawal", 15, 'bold'))
ytdQuality.place(x=430, y=255)
#combobox
choices = ["720p", "144p", "صوت فقط"]
ytdchoices = ttk.Combobox(root, values=choices)
ytdchoices.place(x=260, y=265)
#download btn
downloadbtn = Button(root, text="بدء التحميل", width=20, font=("Tajawal", 10, 'bold'), bg="#00092C", fg="#EEEEEE", command=DownloadVideo, cursor='clock')
downloadbtn.place(x=40, y=255)
#developer Label
about_btn = Button(root, text='من نحن', width=20, font=("Tajawal", 10, 'bold'), bg='#FF5F00', fg='#EEEEEE', bitmap='info',command=about, cursor='heart')
about_btn.place(x=350, y=350, height=30)
#Close program
exit_btn = Button(root, text='إغلاق البرنامج', width=20, font=("Tajawal", 10, 'bold'), bg='#FF5F00', fg='#EEEEEE', cursor='cross', command=root.quit)
exit_btn.place(x=265, y=350, width=80, height=30)
root.mainloop()
أرجو المساعدة
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد
دخول
التعليقات
مرحباً حسين،
ماهو رقم إصدار بايثون الذي تستخدمه؟
حبذا لو تقوم بإرفاق قائمة مكتبات بايثون التي تستخدمها مع رقم الإصدار.
يمكنك استخدام الأمر:
pip freeze > requirements.txt
لإنتاج القائمة ووضعها داخل ملف اسمه requirements.txt.
بالتوفيق.
أهلا أخي مسعود
ماهو رقم إصدار بايثون الذي تستخدمه؟
Python 3.9.5
يمكنك استخدام الأمر:
pip freeze > requirements.txt
يخرج الخطأ التالي :
File "<stdin>", line 1 pip freeze > requirements.txt ^ SyntaxError: invalid syntax
مرحبا حسين،
pip freeze > requirements.txt
SyntaxError: invalid syntax
المفروض أن هذا الخطأ لا يحدث عند كتابة الأمر
pip freeze > requirements.txt
قم بتحديث حزمة pip باستعمال الأمر:
pip install --upgrade pip
وأعد المُحاولة مرة أخرى.
بالتوفيق.
أهلا بك أخي حسين،
الأمر
pip freeze > requirements.txt
يقوم بإنتاج ملف يحتوي على كل المكتبات التي تستخدمها (تأكد من وجود هذا الملف داخل المجلد الذي تقوم بتشغيل البرنامج فيه). هذا الملف ضروري لتشغيل الكود الذي وضعته ولتحديد الخطأ بدقة.
بالتوفيق.