417 日目(曇り一時雨のち晴れ)Pytube を深く掘り下げる
就寝までダラダラする。
- おはようミカド放送局 ゲスト細井聡司さん 20210615 - YouTube: このシリーズは音声メインだから作業しながら聴けるので良さそうだ。
1:00 就寝。
7:05 起床。ああ眠い。納豆と銀シャリを食う。出勤。
7:40 現場到着。もう集合ポスト前のゴミ箱に生ゴミがブチ込んであるときの対処は要らないか。 代わりに空ペットボトルが入っているが無問題だ。管理人室で準備をして作業開始。 不燃ゴミをコンテナー二箱ごと出す。裏庭の猫の糞は最近落ちていない。どうしたのだろう。 溜めておいた吸い殻系ゴミの処理。掃き出し。壁拭き。
10:00 終業。撤収。イトーヨーカドー曳舟店で体温チェックとトイレ。 この数分の間に外がいきなりどしゃ降りになってる。リュックサックに雨合羽を忍ばせてあるので着用して退店。
10:35 曳舟の部屋に戻る。戻った途端雨がやむ。白ブリーフ一丁になり PC 作業。
まずきのうの YouTube プレイリストからインデックス、タイトル、URL を全取得するスクリプトを片付ける。 デバッグにはアイテム数の多いプレイリストを利用するのがいい。 毎度おなじみ soejima1000 - YouTube の「ゲーム音楽」のリストを用いる。 その前に新投稿があるのでダウンロードしておく。
- #637 スーパーマリオコレクション Super Mario All Stars BGM ギターメドレー - YouTube: 聴き慣れたマリオアレンジ。やはり soejima1000 先生はマリオ USA キャラ選択曲がお気に入りだった。明らかにノッている感じがある。 そして今回はマリオ回ではあるが、シメがマリオワールドの面クリジングルでない。コレクションだから配慮して避けた?
ダウンロードスクリプトにプログレスバーを表示する機能を追加したが、9MB 以下のビデオには意味がない。 これをいつかなんとかしたい。今はいい。
- Yoshi’s Island - Athletic Theme (Synthesia) // Tom Brier - YouTube: 楽譜を初見でアレンジを入れつつ演奏し切ったプレイヤーがいて、それを再現したのがこれ。
- Pytube
Channelabout_html,about_url: 想像どおりchannel_uri,channel_url: これらは互いにシノニムなのかと思ったらそうではない。community_html: 想像どおりcommunity_url: 想像どおりdescription: 例外featured_channels_html: Get the html for the /channels page.featured_channels_url,html: Get the html for the /videos page.initial_data:Playlistのメモ参照。巨大な JSON 風dictが得られる。これは重要。last_updated:Playlistのメモ参照length:Playlistのメモ参照owner:Playlistのメモ参照owner_id:Playlistのメモ参照owner_url:Playlistのメモ参照playlist_id:Playlistのメモ参照playlist_url:Playlistのメモ参照playlists_html,playlists_url: これらは出力がある。sidebar_info:Playlistのメモ参照title:Playlistのメモ参照url_generator,video_urls:Playlistのメモ参照videos,videos_generator:Playlistのメモ参照views:Playlistのメモ参照yt_api_key,ytcfg: 正体不明のデータ
- 休業日配信64日目 その3 R-TYPE FINAL 20200610 - YouTube: 珍しいことに店長のやる気が感じられない……。
13:00 郵便受けが怪音を放つ。バイト先から月例の送付物だ。給与明細をコピーして福祉事務所に持参せねばならない。 今日行くか明日行くか。このあと昼寝して時間があれば行くか。
14:00 R-TYPE も終わったので寝る。
17:05 起床。またハードに寝たものだ。空が穏やかになっているのでもう傘は不要。 外出。押上駅バス停に移動。西日が強い。バスに乗って錦糸公園前まで楽をする。
18:00 タイトー F ステーションオリナス錦糸町店。MJ プロ卓東風戦 6 クレ。 私の親番で一巡目に倍満をツモアガリしないで欲しい。
【SCORE】
合計SCORE:-104.8
【最終段位】
四人打ち段位:昇龍 幻球:5
【6/17の最新8試合の履歴】
1st|-------*
2nd|------*-
3rd|**-**---
4th|--*--*--
old new
【順位】
1位回数:1(12.50%)
2位回数:1(12.50%)
3位回数:4(50.00%)
4位回数:2(25.00%)
平均順位:2.88
プレイ局数:35局
【打ち筋】
アガリ率:17.14%(6/35)
平均アガリ翻:2.50翻
平均アガリ巡目:11.17巡
振込み率:8.57%(3/35)
【6/17の最高役】
最高役のデータがありません。最高役は、跳満以上のアガリが対象となります。
気分転換にビートマニア STEP UP モードをワンクレ。レベル 11 の曲を一つクリアしておいて、 次回のプレイ曲数を増やしておく。
20:00 カスミオリナス錦糸町店。437 円。クーポンゲット。
- 生姜焼き丼
- ブラックチョコ
- 野菜ジュース (900)
20:20 ビッグエー墨田業平店。473 円。
- 木綿豆腐 (2)
- スライスチーズ (5)
- 大きなおむすび高菜
- 小粒納豆 (3)
- ハムマヨパン
- コッペパンブリーベリー
20:30 曳舟の部屋に戻る。シャワーを浴びる。ボデーソープを詰め替えておく。
20:50 風呂から出て半裸で PC 前に落ち着く。晩飯と麻雀の練習。
オンライン開始。WSL のファイル更新に時間がかかる。ダウンロードというよりインストールに時間がかかっている。
Pytube の Channel の調査結果を吟味する。
Playlist のときと同じことが気になる。videos_generator() 系の操作でアップロード済みビデオ全ての反復ができるらしいが、
オブジェクトの型が YouTube なので、そこからデータを取得するときに request が生じてコストがかさむ可能性が高い。
例えば次のコードを考えてみる:
from pytube import Channel
channel = Channel('https://www.youtube.com/channel/UCPrifqgoJmq7UgmRkZUKTJQ')
# Show all video titles.
for v in channel.videos_generator():
print(v.title)
これがべらぼうに時間がかかる。前回と同じであれば .title のアクセス時に request をしているからだ。
この改善をやりたい。しかし、おそらく前回と同じことを Channel に対してするだけなので、生産性はない。困った。
いったんコマンドラインツールの調査に移る。
bash$ pytube --help
usage: pytube [-h] [--version] [--itag ITAG] [-r RESOLUTION] [-l] [-v] [--logfile LOGFILE] [--build-playback-report]
[-c CAPTION_CODE] [-lc] [-t TARGET] [-a [AUDIO]] [-f [FFMPEG]]
[url]
Command line application to download youtube videos.
positional arguments:
url The YouTube /watch or /playlist url
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--itag ITAG The itag for the desired stream
-r RESOLUTION, --resolution RESOLUTION
The resolution for the desired stream
-l, --list The list option causes pytube cli to return a list of streams available to download
-v, --verbose Verbosity level, use up to 4 to increase logging -vvvv
--logfile LOGFILE logging debug and error messages into a log file
--build-playback-report
Save the html and js to disk
-c CAPTION_CODE, --caption-code CAPTION_CODE
Download srt captions for given language code. Prints available language codes if no argument
given
-lc, --list-captions List available caption codes for a video
-t TARGET, --target TARGET
The output directory for the downloaded stream. Default is current working directory
-a [AUDIO], --audio [AUDIO]
Download the audio for a given URL at the highest bitrate availableDefaults to mp4 format if
none is specified
-f [FFMPEG], --ffmpeg [FFMPEG]
Downloads the audio and video stream for resolution providedIf no resolution is provided,
downloads the best resolutionRuns the command line program ffmpeg to combine the audio and
video
- プレイリストを指定する以外にはビデオ URL を複数指定する方法はない。
-vvvvでログ出力がくどくなる。- オプション
--ffmpegの存在に一瞬ひるむが、これは映像を音声を結合するために指定するためのものであって、 私が欲しい MP3 への変換機能とは無関係のようだ。
というわけで Channel のスクレイピングコードを書く時間ができてしまった。
まず initial_data の構造を分析したい。
- responseContext: 不要だろう
- contents
- twoColumnBrowseResultsRenderer
- tabs
- これは dict の list なのだが、位置によって?キーが異なる。要調査。
- tabs
- twoColumnBrowseResultsRenderer
- header: 要調査
- c4TabbedHeaderRenderer
- channelId: 既知
- title: 当然欲しい
- navigationEndpoint
- avatar: 余裕があれば欲しい
- banner: 余裕があれば欲しい
- headerLinks
- subscribeButton
- visitTracking
- subscriberCountText
- tvBanner
- mobileBanner
- trackingParams
- sponsorButton
- c4TabbedHeaderRenderer
- metadata: channelMetadataRenderer 以下が使えそう
- channelMetadataRenderer
- channelUrl:
Channelコンストラクターの実引数と同じ - description: 欲しい
- keywords: 欲しい
- rssUrl: ブラウザーにこれを仕込んでおくと更新を通知してくれる
- title: 当然欲しい
- channelUrl:
- channelMetadataRenderer
- trackingParams: 不要
- topbar: これは要らない
- microformat: microformatDataRenderer 以下が使えそう
- microformatDataRenderer
- description: 欲しい
- tags: 欲しい
- thumbnail: 余裕があれば欲しい
- title: 当然欲しい
- microformatDataRenderer
副産物としてチャンネルの更新情報を RSS で得られることがわかった。次のような URL だ:
https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxxxxxxxxxxxx
これをブラウザーなどの RSS ビューワーに仕込んでおけば YouTube のアカウントがなくても各チャンネルの最新更新が通知される。 YouTube のアカウントを持っている人がするチャンネル登録とやらに相当する手順だと思う。
ブラウザーの RSS リストを明示的に保存する方法が不明なので、いったんプロセスを終了する。