僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

【お手軽?】YouTubeから音楽をダウンロードしてみる【自己責任】

f:id:htmllifehack:20190121141544j:plain

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でデベロッパーツールを起動します。

f:id:htmllifehack:20190111232804p:plain

①Networkタブを選択します。

するとyoutubeとの通信の詳細が表示されます。

あらかじめNetworkタブになっていればいいんですがElementsタブになっていると通信が途中からになってしまうのでNetworkタブにしてからF5でページの更新をしてくださいね。

②フィルターを使ってXHRだけ表示させる。

最初はAllになっていると思います。

そのままでもいいんですけど余分ものも表示されて煩わしいのでXHRでフィルタリングしましょう。

③で表示されているのがストリーミングのリンクです。

もとの動画を小分けにして送ってきているんでしょうかね。

たくさん受信しているわけですが、実はこれ音声データと動画データで分割して送られてきているんです。

③のリンクによっては音声だけの音声データと音声なしの動画データの情報をが取得できます。

④は受信しているデータのサイズかと思われます。 僕はサイズで音声データなのか動画データなのかを判別します。

動画の時間によりけりですが2桁KBが音声で3桁KBが動画かなーって感じで判別しています。

それっぽいものを見つけたら左クリックしてみます。

f:id:htmllifehack:20190111233744p:plain

すると右側にRequest URLなるものが表示されます。

されない場合はオレンジの矢印の列にあるタブがHeadersになっているか確認してください。

このRequest URLをコピペして飛んでみてください。

f:id:htmllifehack:20190111234113p:plain

ブラウザ上で音楽再生ツールが起動したかと思います。

このままだと数秒間しか再生されないのでフルバージョンを取得します。

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 元のファイル.拡張子 変換したいファイル名.拡張子 で簡単にできちゃいます。

f:id:htmllifehack:20190111235926p:plain
ffmpegの図

www.htmllifehack.xyz

 まとめ

はい、いかがだったでしょうか。

だるいけど簡単にダウンロードできましたよね。

ただこれだとスクリプト化できそうにないのが残念です。

もう少し考えてみますが他の方法でやったほうがスクリプト化は早そうです。

ということで次回はyoutubeから動画データをダウンロードする方法を書こうと思います!

では!