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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

ダウンロード

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

Q&A

解決済

1回答

3251閲覧

動画のダウンロード進捗状況を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

ダウンロード

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

0グッド

0クリップ

投稿2021/12/27 10:57

編集2021/12/28 02:29

前提・実現したいこと

動画をダウンロードする際に表示される進捗状況を取得したいです。
実行時には「100% of 2.11MiB in 00:3430KiB/s ETA 00:00」が確認できます。

上記の「-%」を取得して、jsでプログレスバーを表示したいと考えています。
取得方法を教えていただきたいです。

https://www.webdevqa.jp.net/ja/bash/youtubedl%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E9%80%B2%E8%A1%8C%E7%8A%B6%E6%B3%81%E3%81%A8zenity%E3%83%97%E3%83%AD%E3%82%B0%E3%83%AC%E3%82%B9%E3%83%90%E3%83%BC/961316988/
を参考にしました。

該当のソースコード

python

1import youtube_dl 2 3test_video = 'https://www.youtube.com/watch?v=BaW_jenozKc' 4 5output_file = 'xxxxx.wav' 6audio_format = 'wav' 7 8download_opts = { 9 'audioformat': audio_format 10} 11 12with youtube_dl.YoutubeDL(download_opts) as ydl: 13 ydl.download([test_video])
[youtube] BaW_jenozKc: Downloading webpage [download] Destination: xxxxx.f137 [download] 100% of 2.11MiB in 00:3430KiB/s ETA 00:00 [download] Destination: xxxxx.f140 [download] 100% of 154.06KiB in 00:0217KiB/s ETA 00:00 [ffmpeg] Merging formats into " xxxxx.mp4" Deleting original file xxxxx.f137 (pass -k to keep) Deleting original file xxxxx.f140 (pass -k to keep) [ffmpeg] Destination: xxxxx.wav Deleting original file xxxxx.mp4 (pass -k to keep)

補足情報(FW/ツールのバージョンなど)

Mac、python3、jupyterを使用しています。

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

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

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

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

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

Supernove

2021/12/27 13:57

参考にしたサイトにあるシェルスクリプトでダウンロードするのではだめですか? Pythonだと ydl.download([test_video]) でダウンロードしてそこで進捗を表示しているのはモジュール側なので、モジュール側に手を入れる必要があると思います
退会済みユーザー

退会済みユーザー

2021/12/27 14:46

pythonのflaskを使ってプログラムを制作しているので、できる限りpythonで書きたいと考えています。 参考サイトのコードをPython内に組み込んでみましたが、うまくいかなかったので質問しました。 python内に組み込むことと、「モジュール側に手を入れる」ことはどちらが難しいですか?
guest

回答1

0

ベストアンサー

以下のコードはコールバック関数 progress_hooks を指定することで簡素なプログレスバーを表示する例です。
※ おそらく、Jupyter Notebook 上では表示されないと思いますので端末(terminal)で実行してみて下さい

python

1import youtube_dl 2import sys 3 4test_video = 'https://www.youtube.com/watch?v=BaW_jenozKc' 5 6output_file = 'xxxxx.wav' 7audio_format = 'wav' 8 9def progress_bar(p): 10 if p['status'] == 'downloading': 11 pct = p['downloaded_bytes'] / p['total_bytes'] 12 print(f'{int(pct*100)}% {"#" * int(pct*20)}', end='\r') 13 elif p['status'] == 'finished': 14 sys.stdout.write('\033[K') #clear line 15 print('Complete.') 16 17download_opts = { 18 'audioformat': audio_format, 19 'quiet': True, 20 'no_warnings': True, 21 'progress_hooks': [progress_bar] 22} 23 24with youtube_dl.YoutubeDL(download_opts) as ydl: 25 ydl.download([test_video])

progress bar

投稿2021/12/27 14:50

melian

総合スコア20655

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

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

退会済みユーザー

退会済みユーザー

2021/12/27 15:13

ご回答ありがとうございます。 ご提示いただいたコードは正常に動きました。 しかし、表示されている「-%」を取得してjsでサイトにプログレスバーを表示したいです。 %の値を取得することはできないでしょうか?
退会済みユーザー

退会済みユーザー

2021/12/28 02:05

ご提示いただいたサイトを拝見しました。 基本的にpythonで書き、プログレスバーをjsで表示したいのですが、組み込むことは可能でしょうか? 数値をjsに渡す前の段階まで制作できているため、できるだけ値のみ取得したいです。 アドバイスをいただけないでしょうか。 よろしくお願いします。
melian

2021/12/28 02:13

当方は JavaScript には疎いのでアドバイスできる事はありません。質問のタグに JavaScript を追加しておくと良いかと思います。
退会済みユーザー

退会済みユーザー

2021/12/28 02:40

アドバイス通りダグを追加しました。ありがとうございます。 print(f'{int(pct*100)}% )で表示できていることから、数値を取得できていると解釈しているのですが、この数値は使えないのでしょうか? 現在、試行中のため認識に間違いがあれば教えていただきたいです
melian

2021/12/28 02:46

はい、使えます。ですが、それを js 側へ渡す方法が私には分からないのです。質問内容をそこに絞る方が良いかもしれません(「Flask から js へ値を渡す方法」など)。
退会済みユーザー

退会済みユーザー

2021/12/28 02:52

教えていただきありがとうございます。 再度、質問した際はご回答いただけると幸いです。よろしくお願いします。 ベストアンサー、フォローさせていただきます。
退会済みユーザー

退会済みユーザー

2021/12/28 03:51

度々失礼します p[' ']は何を表していて、なぜpの定義は必要ないのでしょうか?
melian

2021/12/28 04:04

まず、download_opts に、 'progress_hooks': [progress_bar] を入れていますので、動画のダウンロード状況に変化があると自動的に progress_bar 関数が実行されます。その際に引数として渡される変数が p なのですが、これは youtube_dl モジュールで作成されます(ユーザが定義する必要はありません)。p[''] は属性(attribute)で、例えば p['status'] を見ればダウンロードの状況が判ります('download' なら継続中で、'finished' なら完了済みなど)。p['downloaded_bytes'] と p['total_bytes'] はダウンロード済みのデータサイズと動画全体のサイズになります。
退会済みユーザー

退会済みユーザー

2021/12/28 11:57 編集

()内は自ら定義するものだと思っていました。 def progress_bar(p): ー略ー return f'int(pct*100)%’ とすると動画のダウンロードができなくなりますよね 回答いただいた簡易的なプログレスバーはサイトへ表示できますか?
melian

2021/12/28 12:11

いえ、ダウンロードが続いているかぎり progress_bar が定期的に実行されます。実行しているのは youtube_dl のアプリケーションループなので、ユーザ側で制御できません。サイトへの表示ですが、できるかもしれませんがタイムラグの問題もあるので想定通りに動作するかは、、、判りません。
退会済みユーザー

退会済みユーザー

2021/12/29 00:27

print({'progress_hooks': [progress_bar]})とすると、 {'progress_hooks': [<function progress_bar at 0x7f8c1340a160>]}が出力されたのですが、 これは何を意味しているのですか?
退会済みユーザー

退会済みユーザー

2021/12/30 00:34

f'{int(pct*100)}%を def progress_bar(p):外で使う方法を教えていただけないでしょうか?
melian

2021/12/30 00:38

コールバック関数の外側では使えません。
退会済みユーザー

退会済みユーザー

2021/12/30 03:04 編集

そうですよね スクリプト出力をリアルタイムで表示する方法を探しているのですが、ご存知でしょうか?
melian

2021/12/30 03:06

新規の質問として投稿してみてはどうでしょうか。
退会済みユーザー

退会済みユーザー

2021/12/30 03:09

承知しました。 教えていただきありがとうございます。 今後とも、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問