How to download YouTube videos with python (pytube or youtube_dl)

pythonでYouTubeのビデオをダウンロードする

Doublin

仕事に役に立つ動画をYouTubeで探すことがちょくちょくある.その都度見れば良いのだろうが,ローカルにあれば便利だなぁとなんとなく思っていたところ,先日,全くの別件を調べている時に,そう言えばpythonにそのようなツールがあったような気がして,探してみると,pytubeとyoutube_dl が見つかった.使ってみると思った以上に便利だったので,導入と使用法をまとめておくことにする.

References

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氏にはひたすら感謝!!

実際に少し動かしてみよう.

  1. 先ほど保存したHac.pyのあるdirectoryに移動して,Hac.pyを以下のように起動してみる.
  2. urlを打ち込むように指示されるので,欲しいYouTube動画のurlを打ち込んでreturnする.
  3. ビデオだけをダウンロードするか,音声だけにするか,両方を含む動画にするか,ビデオと音声を別々にダウンロードして合成するかを選択する.最高の画質と最高の音質を希望するなら,最後を選択する,つまり,“Make” と打ち込む.
  4. すると,まず,ダウンロードできるすべての画質のビデオが羅列され,itagを打ち込むように促される.
  5. <Stream: itag=“137” mime_type=“video/mp4” res=“1080p” fps=“25fps” … が最も良さそうなので,このビデオのitagである “137” を打ち込む.
  6. 「音声のファイルで最もいいものは140番のタグだという決まりがあるそうです。」とのことで,itag 140の最高音質の音声が選択されるようにスクリプトの中でhard codingされている.
  7. ものすごいスピードで動画と音声がダウンロードされ,ffmpegにより音声付き動画として合成される.
  8. なお,このスクリプトがある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の方のやり方でダウンロードされるのが良いであろう.

Avatar
taipapa
本人ではありません (^^)

Related

Next
Previous
comments powered by Disqus