質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2429閲覧

【Python】URLを入力→「ダウンロードする」ボタンを押して特定のサイトから動画をダウンロードできるようにしたいです

tumutumu

総合スコア13

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/04/25 13:43

編集2020/04/26 06:46

前提・実現したいこと

最終的にソフトウェア実行→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の型宣言も同じように確認してみましたが間違いが見つけられません。
どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

エラー内容に関しては、

サブプロセス管理

呼び出されたプロセスが非ゼロのリターンコードを返した場合 check_call() や check_output() は CalledProcessError を送出します。

youtube-dl のプロセスが 0 以外の値を返しているようです。

エラーの具体的な内容はそのプログラム (youtube-dl) 次第ですが、
youtube-dl が何かは知らないので、解りかねます。


確認項目としては、まずはtkinterを使わず
subprocessのみ使って外部コマンドを実行してみてください。

check_call ではエラー内容を補足できないので
subprocess.run(..., check=True) で実行して標準エラーを調べてみると良いです。
詳しくは、上記リンクのドキュメントを参考に。

また、ダウンロードに影響する部分のデバッグは、サーバーに余計な負担がかかることも有るので、
事前に各サービスの規約も確認し注意してください。事前に届け出が必要な事もあります。

投稿2020/04/26 07:50

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tumutumu

2020/04/27 04:48

teamiklさん有難うございました。 おかげで原因がわかり、エラーを解決することができました。 youtube-dlコマンドを使用すると動画処理の為にffmpeg.exeを使用するらしく、 pythonのスクリプトファイルにこのアプリケーションを入れたらエラーでなくなりました。
guest

0

エラー内容に行番号など表示されてませんか?

問題個所:

dl_extension=tk.ttk.Combobox.get()

インスタンス・メソッドの呼び出し方法が異なります。

# 説明の為の仮Comboboxクラス class Combobox: def get(self): return ".mp3" # OK: インスタンス化してから値を所得 combo = Combobox() value = combo.get() value = Combobox.get() # NG: クラスのメソッドを直接呼び出している

直接呼ぶ方法もないわけではないのですが、
引数を一致させないと呼び出し時にエラーになります。

解決方法: インスタンス経由でメソッドを呼び出します

diff

1- dl_extension=tk.ttk.Combobox.get() 2+ dl_extension=file_extension.get()

気になった点

エラーを修正後に取り掛かるのかもしれませんが、

def dl_click(): URL=URL_box.get() dl_extension=tk.ttk.Combobox.get() return URL,dl_extension

ボタンの command に登録した関数は、mainloop()内で呼ばれる為、
戻り値を受け取ることはできないので注意を。
まずは print() で値が正常に所得出来たか確認してみましょう。

また、mainloop() 後にあるコード群も
ウィンドウを閉じるまで呼ばれることはないので、
ボタンイベント時に呼び出す等の変更が必要です。

Pythonのコードの実行はmainloop()でブロックされます。
(mainloopでマウスイベント等の各種処理を受け持っている為)

投稿2020/04/26 02:43

編集2020/04/26 02:50
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tumutumu

2020/04/26 03:38

教えて頂き有難うございます。 ご指摘頂いた部分を含めてコードを以下の様に訂正しました。 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の中に入れた文字列に問題があるだろうとは思っているのですが対処法がわかりません。 どうかよろしくお願いします。
teamikl

2020/04/26 03:53

コメント欄では長いコードは読み辛いので、質問文の修正でお願いします とりあえず、subprocess.check_call に渡す前に、printで表示してみましょう
tumutumu

2020/04/26 06:49

先ほどは失礼しました。 質問文にて修正をさせていただきました。 print()にて確認してみましたが特に間違いが見当たりませんでした。 print()にて表示された内容についても修正にて追記させて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問