Кажется, все работает само по себе, но когда я все это собираю, выдается RegexMatchError

Я делаю программу для загрузки музыки на свой компьютер, она попадает прямо в папку загрузки. Я написал код для Python, и когда я его запускаю, pytube по какой-то причине выдает RegexMatchError, однако когда я тестирую каждую часть кода отдельно, все работает отлично. Также, если возможно, мне бы хотелось получить обратную связь, потому что это, по сути, мой первый опыт программирования на Python, поэтому я хотел бы узнать больше!

Это фактический код (НЕ РАБОТАЕТ):

from pytube import YouTube
from moviepy.editor import *
import eyed3, os, tkinter as tk,time

def Download():
    youtubeObject = YouTube(getLink())
    youtubeObject = youtubeObject.streams.get_highest_resolution()
    try:
        youtubeObject.download(os.path.expanduser('~')+'/Downloads',filename=getName()+'.mp4')
        print("Download is completed successfully")
    except:
        print("An error has occurred")
def Convert():
    video = VideoFileClip(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp4')
    video.audio.write_audiofile(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp3')
    audio = eyed3.load(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp3')
    return(audio)
def getLink():
    link = linkE.get()
    return link
def getName():
    name = nameE.get()
    return name
def getArtist():
    artist = artistE.get()
    return artist
def getAlbum():
    album = albumE.get()
    return album
def Terminate():
    time.sleep(5)
    root.destroy()

root = tk.Tk()
root.title("Music Downloader")

frame = tk.Frame(root,padx=20,pady=20)
frame.pack()

l1 = tk.Label(frame,text = "You must fill all queries.")
l1.grid(row=0,columnspan=2,pady=10)
l2 = tk.Label(frame,text = "Enter Song YouTube Link:")
l2.grid(row=1,column=0)
l3 = tk.Label(frame,text = "Enter Song Name:")
l3.grid(row=2,column=0)
l4 = tk.Label(frame,text = "Enter Artist:")
l4.grid(row=3,column=0)
l5 = tk.Label(frame,text = "Enter Album Name:")
l5.grid(row=4,column=0)

linkE = tk.Entry(frame)
linkE.grid(row=1,column=1)
nameE = tk.Entry(frame)
nameE.grid(row=2,column=1)
artistE = tk.Entry(frame)
artistE.grid(row=3,column=1)
albumE = tk.Entry(frame)
albumE.grid(row=4,column=1)

b1 = tk.Button(frame,text = "Download")
b1.grid(row=5,columnspan=2,pady=10)

Download()

audio = Convert()

audio.tag.title = getName()
audio.tag.artist = getArtist()
audio.tag.album = getAlbum()
audio.tag.save()

Terminate()

root.mainloop()

os.system("taskkill /f /im ffmpeg-win64-v4.2.2.exe")
time.sleep(3)
os.remove(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp4')

(завершение будет заменено другим активатором, так что оно сработает только после завершения процесса) (часть root2 не добавлена, потому что она изначально не работает)

Это код приложения (работает отлично, он завершает работу по времени, в отличие от предполагаемого, после выполнения):

import tkinter as tk
import time

def getLink():
    link = linkE.get()
    return link
def getName():
    name = nameE.get()
    return name
def getArtist():
    artist = artistE.get()
    return artist
def getAlbum():
    album = albumE.get()
    return album
def printResults():
    time.sleep(2)
    print(getLink()+getName()+getArtist()+getAlbum())
    time.sleep(5)
    root.destroy()

root = tk.Tk()
root.title("Music Downloader")

frame = tk.Frame(root,padx=20,pady=20)
frame.pack()

l1 = tk.Label(frame,text = "You must fill all queries.")
l1.grid(row=0,columnspan=2,pady=10)
l2 = tk.Label(frame,text = "Enter Song YouTube Link:")
l2.grid(row=1,column=0)
l3 = tk.Label(frame,text = "Enter Song Name:")
l3.grid(row=2,column=0)
l4 = tk.Label(frame,text = "Enter Artist:")
l4.grid(row=3,column=0)
l5 = tk.Label(frame,text = "Enter Album Name:")
l5.grid(row=4,column=0)

linkE = tk.Entry(frame)
linkE.grid(row=1,column=1)
nameE = tk.Entry(frame)
nameE.grid(row=2,column=1)
artistE = tk.Entry(frame)
artistE.grid(row=3,column=1)
albumE = tk.Entry(frame)
albumE.grid(row=4,column=1)

b1 = tk.Button(frame,text = "Download",command=lambda:[getLink(),getName(),getArtist(),getAlbum(),printResults()])
b1.grid(row=5,columnspan=2,pady=10)

root.mainloop()

root2 = tk.Tk()

label = tk.Label(root2,text = "Process Terminated")
label.pack(padx=50,pady=50)

root2.mainloop()

Последний код — это код сценария (работает отлично):

from pytube import YouTube
from moviepy.editor import *
import eyed3, os, time


def Download(link,name):
    youtubeObject = YouTube(link)
    youtubeObject = youtubeObject.streams.get_highest_resolution()
    try:
        youtubeObject.download(os.path.expanduser('~')+'/Downloads',filename=name+'.mp4')
        print("Download is completed successfully")
    except:
        print("An error has occurred")
def Convert(name):
    video = VideoFileClip(os.path.expanduser('~')+'/Downloads/'+name+'.mp4')
    video.audio.write_audiofile(os.path.expanduser('~')+'/Downloads/'+name+'.mp3')
    audio = eyed3.load(os.path.expanduser('~')+'/Downloads/'+name+'.mp3')
    return(audio)

link = input("Enter the YouTube video URL: ")
name = input("Enter Song Name: ")
artist = input("Enter Artist: ")
album = input("Enter Album: ")
Download(link,name)

audio = Convert(name)

audio.tag.title = name
audio.tag.artist = artist
audio.tag.album = album
audio.tag.save()

os.system("taskkill /f /im ffmpeg-win64-v4.2.2.exe")
time.sleep(3)
os.remove(os.path.expanduser('~')+'/Downloads/'+name+'.mp4')

Это сообщение об ошибке:

Traceback (most recent call last):
  File "c:\Users\USUARIO_01\Documents\Camilo\MusicDownloaderApp.py", line 63, in <module>
    Download()
  File "c:\Users\USUARIO_01\Documents\Camilo\MusicDownloaderApp.py", line 6, in Download
    youtubeObject = YouTube(getLink())
                    ^^^^^^^^^^^^^^^^^^
  File "c:\Users\USUARIO_01\AppData\Local\Programs\Python\Python312\Lib\site-packages\pytube\__main__.py", line 71, in __init__ 
    self.video_id = extract.video_id(url)
                    ^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\USUARIO_01\AppData\Local\Programs\Python\Python312\Lib\site-packages\pytube\extract.py", line 133, in video_id 
    return regex_search(r"(?:v=|/)([0-9A-Za-z_-]{11}).*", url, group=1)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\USUARIO_01\AppData\Local\Programs\Python\Python312\Lib\site-packages\pytube\helpers.py", line 129, in regex_search
    raise RegexMatchError(caller = "regex_search", pattern=pattern)
pytube.exceptions.RegexMatchError: regex_search: could not find match for (?:v=|/)([0-9A-Za-z_-]{11}).*

Я нашел несколько решений на GitHub, однако это решения 2022 года, касающиеся обновлений, и они включают в себя изменение части базового кода pytube (cypher.py), поэтому, поскольку я совершенно новичок в этом, я не буду хочу облажаться. Есть еще идеи?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решена, проблема заключалась в том, что функция Download вызывалась до получения входных данных, поэтому она пыталась получить пустую ссылку (которая, очевидно, не работает). Я решил эту проблему, создав функцию выполнения, которая вызывает их только при нажатии кнопки, а не внезапно.

Новый код:

from pytube import YouTube
from moviepy.editor import *
import eyed3, os, tkinter as tk,time

def Download():
    link = getLink()
    if not link:
        print("Youtube link is required.")
        return
    youtubeObject = YouTube(link)
    youtubeObject = youtubeObject.streams.get_highest_resolution()
    try:
        youtubeObject.download(os.path.expanduser('~')+'/Downloads',filename=getName()+'.mp4')
        print("Download is completed successfully")
    except Exception as e:
        print("An error has occurred: {e}")
def Convert():
    video = VideoFileClip(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp4')
    video.audio.write_audiofile(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp3')
    audio = eyed3.load(os.path.expanduser('~')+'/Downloads/'+getName()+'.mp3')
    return(audio)
def getLink():
    link = linkE.get()
    return link
def getName():
    name = nameE.get()
    return name
def getArtist():
    artist = artistE.get()
    return artist
def getAlbum():
    album = albumE.get()
    return album
def Execute():
    Download()
    audio = Convert()
    if audio:
        audio.tag.title = getName()
    audio.tag.artist = getArtist()
    audio.tag.album = getAlbum()
    audio.tag.save()
    Terminate()
def Terminate():
    time.sleep(5)
    name = getName()
    root.destroy()
    time.sleep(1)
    os.system("taskkill /f /im ffmpeg-win64-v4.2.2.exe")
    time.sleep(1)
    os.remove(os.path.expanduser('~')+'/Downloads/'+name+'.mp4')
    TermMsg()
def TermMsg():
    root = tk.Tk()
    label = tk.Label(root,text = "Process Completed.",padx=50,pady=50)
    label.pack()
    root.mainloop()

root = tk.Tk()
root.title("Music Downloader")

frame = tk.Frame(root,padx=20,pady=20)
frame.pack()

l1 = tk.Label(frame,text = "You must fill all queries.")
l1.grid(row=0,columnspan=2,pady=10)
l2 = tk.Label(frame,text = "Enter Song YouTube Link:")
l2.grid(row=1,column=0)
l3 = tk.Label(frame,text = "Enter Song Name:")
l3.grid(row=2,column=0)
l4 = tk.Label(frame,text = "Enter Artist:")
l4.grid(row=3,column=0)
l5 = tk.Label(frame,text = "Enter Album Name:")
l5.grid(row=4,column=0)

linkE = tk.Entry(frame)
linkE.grid(row=1,column=1)
nameE = tk.Entry(frame)
nameE.grid(row=2,column=1)
artistE = tk.Entry(frame)
artistE.grid(row=3,column=1)
albumE = tk.Entry(frame)
albumE.grid(row=4,column=1)

b1 = tk.Button(frame,text = "Download",command=Execute)
b1.grid(row=5,columnspan=2,pady=10)

root.mainloop()

Я также добавил несколько отказоустойчивых средств, однако считаю, что они в любом случае бесполезны для этого конкретного сценария, и не закончил их добавлять, возможно, в будущем, но это не важно для решения.

Другие вопросы по теме