مشكلة في برنامج بايثون لتحميل الفيديوهات

  • HusseinOuda

قمت ببرمجة برنامج بايثون لتحميل الفيديوهات من اليوتيوب

وبعد وضع الرابط وبدء التحميل يخرج لي الخطأ التالي :

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

يقوم بإنتاج ملف يحتوي على كل المكتبات التي تستخدمها (تأكد من وجود هذا الملف داخل المجلد الذي تقوم بتشغيل البرنامج فيه). هذا الملف ضروري لتشغيل الكود الذي وضعته ولتحديد الخطأ بدقة.

بالتوفيق.

جزاك الله خير على هذه المعلومة

تم حل الإشكالية تبين عند دخولي إلى كود مكتبة pytube في github وجدت جميع التعليقات تؤكد أن المشكلة من نفس المكتبة ولكن تم تحديث المكتبة

والان قمت بتحديث المكتبة وفعلاً اشتغل البرنامج بدون مشاكل 

أكتب 

pip install --upgrade pytube

ستعمل بدون مشاكل بإذن الله