前提・実現したいこと
最終的にソフトウェア実行→URLを入力→「ダウンロードする」ボタンを押して特定のサイトから動画をダウンロードできるようにしたいです。
よろしくお願いします。
■■な機能を実装中に以下のエラーメッセージが発生しました。
「ダウンロードする」ボタンを押した際に以下のエラーメッセージが出てしまいます。
発生している問題・エラーメッセージ
TypeError: get() missing 1 required positional argument: 'self'
###今回作成したコードです
import re, sys, os, time, subprocess from bs4 import BeautifulSoup from urllib.request import urlopen, urlretrieve import tkinter as tk from tkinter import ttk,filedialog,messagebox from tkinter.ttk import Combobox global URL,dl_extension m_window=tk.Tk() m_window.title("動画 DLソフト") m_window.geometry("640x360") #mainframe m_frame=ttk.Frame(m_window) m_frame.grid(column=0,row=0,sticky=tk.NSEW,padx=5,pady=10) #wijet URL_Label=ttk.Label(m_frame,text="URL") URL_box=ttk.Entry(m_frame) def dl_click(): URL=URL_box.get() dl_extension=tk.ttk.Combobox.get() return URL,dl_extension dl_button=ttk.Button(m_frame,text="ダウンロードする",command=dl_click) file_extension=ttk.Combobox(m_frame,values=["mp4","mp3"],width=10) #wijet_position URL_Label.grid(column=0,row=0,pady=10) URL_box.grid(column=1,row=1,sticky=tk.EW,padx=5) dl_button.grid(column=2,row=1) file_extension.grid(column=3,row=2,sticky=tk.EW,padx=5) m_window.columnconfigure(0,weight=1) m_window.rowconfigure(0,weight=1) m_frame.columnconfigure(1,weight=1) m_window.mainloop() #URL main_links = [ "https://www.youtube.com/", "https://soundcloud.com/", "https://www.nicovideo.jp/" ] # youtube soundcloud nicovideo if any(s in URL for s in (main_links)): ans = "dl_extension" if "https://www.youtube.com/" in URL and "list=" in URL: th_list = URL.split("list=")[1] else: th_list = "URL" if ans=="mp3": cmd = 'youtube-dl -o ./%(playlist)s/%(title)s.%(ext)s -ci --extract-audio --audio-format mp3 --add-metadata ' + th_list if ans=="mp4": cmd = 'youtube-dl -o ./%(playlist)s/%(title)s.%(ext)s -i -f mp4 --add-metadata ' + th_list subprocess.check_call(cmd.split()) sys.exit()
試したこと
今回入力して受け渡したいURLとdl_extensionの中身が受け渡されてないと思ったのでdl_clickメソッドの中にreturn文を追記しています。
補足情報(FW/ツールのバージョンなど)
環境は以下の通りです。
VScode2019
python 3.7.4
(VScodeの拡張機能を使用しておらず、別々でダウンロードしてpython側を環境変数に入れて使用してます)
その他ライブラリ最新バージョンです。
以下追記になります。
先ほどは失礼しました。
教えて頂き有難うございます。
ご指摘頂いた部分を含めてコードを以下の様に訂正しました。
import re, sys, os, time, subprocess from bs4 import BeautifulSoup from urllib.request import urlopen, urlretrieve import tkinter as tk from tkinter import * from tkinter import ttk,filedialog,messagebox from tkinter.ttk import Combobox #URL main_links = [ "https://www.youtube.com/", "https://soundcloud.com/", "https://www.nicovideo.jp/" ] m_window=tk.Tk() m_window.title("動画 DLソフト") m_window.geometry("640x360") m_frame=ttk.Frame(m_window) URL_Label=ttk.Label(m_frame,text="URL") URL=str() URL_box=ttk.Entry(m_frame,textvariable=URL) #mainframe m_frame.grid(column=0,row=0,sticky=tk.NSEW,padx=5,pady=10) def dl_click(): URL=str(URL_box.get()) dl_extension=str(file_extension.get()) if any(s in URL for s in (main_links)): ans = dl_extension if "https://www.youtube.com/" in URL and "list=" in URL: th_list = str(re.sub("list=","",URL)) else: th_list = URL if ans=="mp3": cmd = 'youtube-dl -o ./%(playlist)s/%(title)s.%(ext)s -ci --extract-audio --audio-format mp3 --add-metadata ' + th_list if ans=="mp4": cmd = 'youtube-dl -o ./%(playlist)s/%(title)s.%(ext)s -i -f mp4 --add-metadata ' + th_list subprocess.check_call(cmd.split())#ここでエラーがでます sys.exit() #widget dl_extension=str() file_extension=ttk.Combobox(m_frame,textvariable=dl_extension,width=10) file_extension["values"]=["mp4","mp3"] dl_button=ttk.Button(m_frame,text="ダウンロードする",command=dl_click) #widget_position URL_Label.grid(column=0,row=0,pady=10) URL_box.grid(column=1,row=1,sticky=tk.EW,padx=5) file_extension.grid(column=3,row=2,sticky=tk.EW,padx=5) m_window.columnconfigure(0,weight=1) m_window.rowconfigure(0,weight=1) m_frame.columnconfigure(1,weight=1) dl_button.grid(column=2,row=1) m_window.mainloop()
そうしますとウィンドウが開き→URLを入力、拡張子を選択→ダウンロードする
とクリックして目的の動画がダウンロードできたのですが
以下の様にエラーがでてしまいました。
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\kotar\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "dl-movie.py", line 41, in dl_click subprocess.check_call(cmd.split())#ここでエラーがでます File "C:\Users\kotar\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 347, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['youtube-dl', '-o', './%(playlist)s/%(title)s.%(ext)s', '-i', '-f', 'mp4', '--add-metadata', 'ダウンロードしたYouTube動画のURL']' returned non-zero exit status 1. Traceback (most recent call last): File "dl-movie.py", line 63, in <module> m_window.mainloop() File "C:\Users\kotar\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1283, in mainloop self.tk.mainloop(n)
原因が subprocess.check_call(cmd.split())であり、変数cmdの中に入れた文字列に問題があるだろうとは思っているのですが対処法がわかりません。
print(cmd.split())で確認してみましたが、特に問題ありませんでした。
以下print(cmd.split())で表示されたリストになります。
['youtube-dl', '-o', './%(playlist)s/%(title)s.%(ext)s', '-i', '-f', 'mp4', '--add-metadata', 'ダウンロードした動画のURL']
cmdの型宣言も同じように確認してみましたが間違いが見つけられません。
どうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/27 04:48