【お手軽?】YouTubeから音楽をダウンロードしてみる【自己責任】
pytubeって覚えてますか?
結構前にこのブログでも紹介したんですが、youtubeから動画や音声をダウンロードするpythonのライブラリです。
これが最近調子悪くて、ダウンロードできるものとできないものがあるんですね。
正規表現の問題らしくて、海外では自力で直している人もいるようですが僕にはちょっとできそうにないです。
pytubeの記事 【python】pytubeを使ってYouTubeからコンテンツをダウンロードする - 僕の世界観を変えてみる
もはやpytube使わないでダウンロードしてみようと思って奮闘したので記録しておきます。
ちなみに今回は音声ファイルのダウンロードの方法になります。
※はじめに言っておきますがこれから行うことはすべて自己責任でお願いいたします。 損害が発生しても私は一切責任を負いません。
pytubeで起きているエラー
ダウンロードする動画によってはRegexMatchErroというエラーが発生します。
Traceback (most recent call last): File "C:\Users\Owner\Desktop\python\youtube.py", line 6, in <module> yt = YouTube(url) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\__main__.py", line 88, in __init__ self.prefetch_init() File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\__main__.py", line 97, in prefetch_init self.init() File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\__main__.py", line 133, in init mixins.apply_signature(self.player_config_args, fmt, self.js) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\mixins.py", line 49, in apply_signature signature = cipher.get_signature(js, stream['s']) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\cipher.py", line 250, in get_signature tplan = get_transform_plan(js) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\cipher.py", line 69, in get_transform_plan name = re.escape(get_initial_function_name(js)) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\cipher.py", line 45, in get_initial_function_name return regex_search(pattern, js, group=1) File "C:\Users\Owner\Anaconda3\lib\site-packages\pytube\helpers.py", line 41, in regex_search .format(pattern=p), pytube.exceptions.RegexMatchError: regex pattern (yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\() had zero matches
youtubeにアップされている動画のタイトルに特定の文字が入っているとこのエラーが起こるようです。
デベロッパツールで解析
ptytube使うのは一旦諦めて、まずはyoutubeがどんな仕組みになっているのかデベロッパツールを使って確認してみます。
今回はこちらの動画を使ってやってきます。
僕のアップしている動画の中で音楽が流れているものがこれしかなかったので。
まずは動画のURLに行きF12でデベロッパーツールを起動します。
①Networkタブを選択します。
するとyoutubeとの通信の詳細が表示されます。
あらかじめNetworkタブになっていればいいんですがElementsタブになっていると通信が途中からになってしまうのでNetworkタブにしてからF5でページの更新をしてくださいね。
②フィルターを使ってXHRだけ表示させる。
最初はAllになっていると思います。
そのままでもいいんですけど余分ものも表示されて煩わしいのでXHRでフィルタリングしましょう。
③で表示されているのがストリーミングのリンクです。
もとの動画を小分けにして送ってきているんでしょうかね。
たくさん受信しているわけですが、実はこれ音声データと動画データで分割して送られてきているんです。
③のリンクによっては音声だけの音声データと音声なしの動画データの情報をが取得できます。
④は受信しているデータのサイズかと思われます。 僕はサイズで音声データなのか動画データなのかを判別します。
動画の時間によりけりですが2桁KBが音声で3桁KBが動画かなーって感じで判別しています。
それっぽいものを見つけたら左クリックしてみます。
すると右側にRequest URLなるものが表示されます。
されない場合はオレンジの矢印の列にあるタブがHeadersになっているか確認してください。
このRequest URLをコピペして飛んでみてください。
ブラウザ上で音楽再生ツールが起動したかと思います。
このままだと数秒間しか再生されないのでフルバージョンを取得します。
URLの最後のほうにrange=0-66539みたいな記述があるのでこれをrange=0-665390000のように書き換えます。
するとフルで音声が再生されるのでピンクの四角の点々点をクリックしてダウンロードしてください。
ダウンロードしたファイルはvideoplayback.webaという名前になっているはずです。
webaがなんだかわかりませんが再生できるようにmp3やmp4に変換してあげます。
じゃffmpeg使いましょうか。
C:\Users\owner\Downloads\youtube> ffmpeg -i videoplayback.weba sample.mp3
pytubeの記事でも書いたとおりiオプションで変換します。
ffmpeg -i 元のファイル.拡張子 変換したいファイル名.拡張子 で簡単にできちゃいます。
まとめ
はい、いかがだったでしょうか。
だるいけど簡単にダウンロードできましたよね。
ただこれだとスクリプト化できそうにないのが残念です。
もう少し考えてみますが他の方法でやったほうがスクリプト化は早そうです。
ということで次回はyoutubeから動画データをダウンロードする方法を書こうと思います!
では!