仕事に役に立つ動画をYouTubeで探すことがちょくちょくある.その都度見れば良いのだろうが,ローカルにあれば便利だなぁとなんとなく思っていたところ,先日,全くの別件を調べている時に,そう言えばpythonにそのようなツールがあったような気がして,探してみると,pytubeとyoutube_dl が見つかった.使ってみると思った以上に便利だったので,導入と使用法をまとめておくことにする.
References
- pytube pytubeご本家のGitHub
- Youtubeからmp3やmp4をpytubeでダウンロードする。+α 全てが揃うスクリプトのあるお宝サイト
- Youtubeの動画をPythonでダウンロードする方法2選
- youtube-dl Download videos from YouTube (and more sites) youtube-dlのご本家
- youtube-dlを使ってYouTubeから最高画質で最高音質の動画をダウンロードする
Python
pytubeはYouTube動画をダウンロードするためのpythonのライブラリであり,youtube-dlもpythonを必要とするcommand-line programである.そこで,まず,python自体をインストールしておく必要がある.Macなもので,pythonはhomebrewでpython3をインストールした.というか,今回のことを機会に最新のものにした.
$ brew install python
$ brew info python
==> python@3.10: stable 3.10.6 (bottled)
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/opt/homebrew/Cellar/python@3.10/3.10.6_2 (3,160 files, 58.3MB) *
Poured from bottle on 2022-09-19 at 17:52:54
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.10.rb
License: Python-2.0
==> Dependencies
Build: pkg-config ✔
Required: gdbm ✔, mpdecimal ✔, openssl@1.1 ✔, readline ✔, sqlite ✔, xz ✔
==> Caveats
Python has been installed as
/opt/homebrew/bin/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
/opt/homebrew/opt/python@3.10/libexec/bin
You can install Python packages with
pip3 install <package>
They will install into the site-package directory
/opt/homebrew/lib/python3.10/site-packages
tkinter is no longer included with this formula, but it is available separately:
brew install python-tk@3.10
See: https://docs.brew.sh/Homebrew-and-Python
==> Analytics
install: 721,319 (30 days), 1,860,948 (90 days), 4,816,460 (365 days)
install-on-request: 286,903 (30 days), 640,869 (90 days), 1,226,704 (365 days)
build-error: 435 (30 days)
$ which python3
/opt/homebrew/bin/python3
ffmpeg
mp4から音声部分のみを取り出したり,動画と音声を合成したりするのにffmpegの機能を使用する.homebrewでインストールする.
$ brew install ffmpeg
$ brew info ffmpeg
==> ffmpeg: stable 5.1.1 (bottled), HEAD
Play, record, convert, and stream audio and video
https://ffmpeg.org/
/opt/homebrew/Cellar/ffmpeg/5.1.1 (282 files, 49.3MB) *
Poured from bottle on 2022-09-22 at 17:07:36
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/ffmpeg.rb
License: GPL-2.0-or-later
pytube
最初に結論を言っておくと,下記のyoutube-dlではなく,こちらのpytubeを使うことをお勧めする.理由は圧倒的なダウンロードの速度である.とにかく 爆速 である.なんでこんなに速いのかわからないが,とにかく速い! とは言うものの,ビジネスなどに使って大量にダウンロードするのはまずい.そちら方面にはGoogleが公開しているyoutube Data APIを使うようにするのが良いであろう.
Installation
ご本家のpytubeにはインストール方法として,まず,以下が記載されている.
$ python3 -m pip install pytube
しかし,これでインストールすると後でYouTube動画をダウンロードする段になって以下のようにエラーとなる.
$ python3 main.py
start download
Traceback (most recent call last):
File "/Users/kohkichi/Sources/Whisper_Folder/pytube3-project/main.py", line 16, in <module>
download(url, index)
...
...
File "/opt/homebrew/Cellar/python@3.10/3.10.6_2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 410: Gone
これはインストールされるversionが古いためであり,下記のように,2番目に記載されているgithubから取ってくるやり方を行えば,最新のもの(pytube 12.1.0)がインストールされ,エラーが出なくなる.
$ python3 -m pip install git+https://github.com/pytube/pytube
$ pip3 list
Package Version
------------------ ----------
Brotli 1.0.9
certifi 2022.9.14
charset-normalizer 2.1.1
idna 3.4
mutagen 1.45.1
numpy 1.23.3
Pillow 9.2.0
pip 22.2.2
pycryptodomex 3.15.0
pytube 12.1.0
requests 2.28.1
setuptools 63.4.3
torch 1.12.1
torchvision 0.13.1
typing_extensions 4.3.0
urllib3 1.26.12
websockets 10.3
wheel 0.37.1
youtube-dl 2021.12.17
yt-dlp 2022.9.1
Usage
これはもう, Youtubeからmp3やmp4をpytubeでダウンロードする。+α のHacnosuke氏の素晴らしいスクリプトをいただくのが一番手っ取り早い.
前述のサイトに行って,実装と書いてあるセクションのコードをコピーすれば良い.少しtypoがあるので修正する.“prease” は “please” に直す.さらに,このままだとエラーが出るので,
...
if types == "Make":
# Videoのみのタグを列挙
for lis in yt.streams.filter(type='video').all():
print(lis)
# タグを入力させる
tag_1 = input('>> Prease enter video itag :')
...
上記の最後の “tag_1” を “tag” に変更する.これで,適当な名前,例えば,Hac.pyとかつけて保存する.このスクリプトには以下の機能がある.
- 動画のみのダウンロード(mp4)
- 音声のみのダウンロード(ちゃんとmp3にします)
- 音声付き動画(mp4)
- 動画のみと音声を合成する(mp4)
「一般的には最後の機能を使います。なぜなら、三つ目の機能だと画質が悪いからです。」とのことである.同サイトに詳細が書かれており,また,スクリプト自体も詳細にコメントがついているので,そちらも読んでいただきたい.Hacnosuke氏にはひたすら感謝!!
実際に少し動かしてみよう.
- 先ほど保存したHac.pyのあるdirectoryに移動して,Hac.pyを以下のように起動してみる.
- urlを打ち込むように指示されるので,欲しいYouTube動画のurlを打ち込んでreturnする.
- ビデオだけをダウンロードするか,音声だけにするか,両方を含む動画にするか,ビデオと音声を別々にダウンロードして合成するかを選択する.最高の画質と最高の音質を希望するなら,最後を選択する,つまり,“Make” と打ち込む.
- すると,まず,ダウンロードできるすべての画質のビデオが羅列され,itagを打ち込むように促される.
- <Stream: itag=“137” mime_type=“video/mp4” res=“1080p” fps=“25fps” … が最も良さそうなので,このビデオのitagである “137” を打ち込む.
- 「音声のファイルで最もいいものは140番のタグだという決まりがあるそうです。」とのことで,itag 140の最高音質の音声が選択されるようにスクリプトの中でhard codingされている.
- ものすごいスピードで動画と音声がダウンロードされ,ffmpegにより音声付き動画として合成される.
- なお,このスクリプトがあるdirectoryに自動的にmusicとvideoというsubdirectoryが作成され,それぞれ動画と音声を入れてくれる.ただし,“Make” を選択した場合は動画と音声を合成したファイルがスクリプトのあるdirectoryに置かれ,かつ,名前に「制作版」が追加されるようになっている.合成前の動画と音声は自動的に削除される.至れり尽くせりである.
$ python3 Hac.py
>> Please enter URL :
>> Press enter TYPE (Video(only) , Music(only) , Mix , Make) : Make
/Users/taipapa/Sources/PyTube_Folder/Hac.py:73: DeprecationWarning: Call to deprecated function all (This object can be treated as a list, all() is useless).
for lis in yt.streams.filter(type='video').all():
<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="6fps" vcodec="mp4v.20.3" acodec="mp4a.40.2" progressive="True" type="video">
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">
<Stream: itag="22" mime_type="video/mp4" res="720p" fps="25fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video">
<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="25fps" vcodec="avc1.640028" progressive="False" type="video">
<Stream: itag="248" mime_type="video/webm" res="1080p" fps="25fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="25fps" vcodec="avc1.4d401f" progressive="False" type="video">
<Stream: itag="247" mime_type="video/webm" res="720p" fps="25fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="25fps" vcodec="avc1.4d401e" progressive="False" type="video">
<Stream: itag="244" mime_type="video/webm" res="480p" fps="25fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.4d401e" progressive="False" type="video">
<Stream: itag="243" mime_type="video/webm" res="360p" fps="25fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="25fps" vcodec="avc1.4d4015" progressive="False" type="video">
<Stream: itag="242" mime_type="video/webm" res="240p" fps="25fps" vcodec="vp9" progressive="False" type="video">
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="25fps" vcodec="avc1.4d400c" progressive="False" type="video">
<Stream: itag="278" mime_type="video/webm" res="144p" fps="25fps" vcodec="vp9" progressive="False" type="video">
>> Please enter video itag :137
ffmpeg version 5.1.1 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.1.6 (clang-1316.0.21.2.5)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
libavutil 57. 28.100 / 57. 28.100
libavcodec 59. 37.100 / 59. 37.100
libavformat 59. 27.100 / 59. 27.100
libavdevice 59. 7.100 / 59. 7.100
libavfilter 8. 44.100 / 8. 44.100
libswscale 6. 7.100 / 6. 7.100
.....
ここまでで,やりたいことはほぼすべてカバーできるようになった.
youtube-dl
youtube-dlもYouTube動画をダウンロードするためのcommand-line programであり,python interpreterを必要とする.pythonは前述のごとく,インストール済みなので,本体のインストールのみで良い.
Installation
$ pip3 install youyube-dl
もしくは
$ python3 -m pip install youtube-dl
どちらの方法を使用したか記憶が定かではないが,どっちでも良いと思う.😅
Usage
使い方に関しては, youtube-dlを使ってYouTubeから最高画質で最高音質の動画をダウンロードする を参考にしていただけばよいかと思う.ただ,前述した理由で,私はpytubeの方を使用している.それでは何故youtube-dlも紹介するかというと,ダウンロードできるフォーマットのリストを綺麗に表示できるからである.pytubeで使用したのと同じurlを使って例を示すと以下のようになる.
$ youtube-dl --list-format "https://www.youtube.com/watch?v=Z-hogehoge"
[youtube] Z-hogehoge: Downloading webpage
[info] Available formats for Z-hogehoge:
format code extension resolution note
249 webm audio only tiny 54k , webm_dash container, opus @ 54k (48000Hz), 2.09MiB
250 webm audio only tiny 72k , webm_dash container, opus @ 72k (48000Hz), 2.76MiB
140 m4a audio only tiny 129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 4.94MiB
251 webm audio only tiny 141k , webm_dash container, opus @141k (48000Hz), 5.39MiB
160 mp4 256x144 144p 45k , mp4_dash container, avc1.4d400c@ 45k, 25fps, video only, 1.75MiB
278 webm 256x144 144p 77k , webm_dash container, vp9@ 77k, 25fps, video only, 2.96MiB
133 mp4 426x240 240p 95k , mp4_dash container, avc1.4d4015@ 95k, 25fps, video only, 3.64MiB
242 webm 426x240 240p 120k , webm_dash container, vp9@ 120k, 25fps, video only, 4.58MiB
134 mp4 640x360 360p 182k , mp4_dash container, avc1.4d401e@ 182k, 25fps, video only, 6.95MiB
243 webm 640x360 360p 243k , webm_dash container, vp9@ 243k, 25fps, video only, 9.27MiB
135 mp4 854x480 480p 316k , mp4_dash container, avc1.4d401e@ 316k, 25fps, video only, 12.08MiB
244 webm 854x480 480p 406k , webm_dash container, vp9@ 406k, 25fps, video only, 15.51MiB
136 mp4 1280x720 720p 566k , mp4_dash container, avc1.4d401f@ 566k, 25fps, video only, 21.62MiB
247 webm 1280x720 720p 744k , webm_dash container, vp9@ 744k, 25fps, video only, 28.41MiB
248 webm 1920x1080 1080p 1308k , webm_dash container, vp9@1308k, 25fps, video only, 49.90MiB
137 mp4 1920x1080 1080p 1702k , mp4_dash container, avc1.640028@1702k, 25fps, video only, 64.94MiB
18 mp4 640x360 360p 311k , avc1.42001E, 25fps, mp4a.40.2 (44100Hz)
22 mp4 1280x720 720p 695k , avc1.64001F, 25fps, mp4a.40.2 (44100Hz) (best)
このように,pytubeの場合より,綺麗に整形されて見やすいのである.また,解像度の表示もより詳しくなっている.video onlyなのかaudio onlyなのかも明示される.さらには,extensionやファイルサイズも表示される.一番下の行の右端に “best” と表示されているが,これは最高画質ではなくビデオと音声が合成されている中でのbestということなので,最高画質を求める方はpytubeの方のやり方でダウンロードされるのが良いであろう.