就寝までダラダラする。

1:00 就寝。

7:05 起床。ああ眠い。納豆と銀シャリを食う。出勤。

7:40 現場到着。もう集合ポスト前のゴミ箱に生ゴミがブチ込んであるときの対処は要らないか。 代わりに空ペットボトルが入っているが無問題だ。管理人室で準備をして作業開始。 不燃ゴミをコンテナー二箱ごと出す。裏庭の猫の糞は最近落ちていない。どうしたのだろう。 溜めておいた吸い殻系ゴミの処理。掃き出し。壁拭き。

10:00 終業。撤収。イトーヨーカドー曳舟店で体温チェックとトイレ。 この数分の間に外がいきなりどしゃ降りになってる。リュックサックに雨合羽を忍ばせてあるので着用して退店。

10:35 曳舟の部屋に戻る。戻った途端雨がやむ。白ブリーフ一丁になり PC 作業。

まずきのうの YouTube プレイリストからインデックス、タイトル、URL を全取得するスクリプトを片付ける。 デバッグにはアイテム数の多いプレイリストを利用するのがいい。 毎度おなじみ soejima1000 - YouTube の「ゲーム音楽」のリストを用いる。 その前に新投稿があるのでダウンロードしておく。

ダウンロードスクリプトにプログレスバーを表示する機能を追加したが、9MB 以下のビデオには意味がない。 これをいつかなんとかしたい。今はいい。

  • Yoshi’s Island - Athletic Theme (Synthesia) // Tom Brier - YouTube: 楽譜を初見でアレンジを入れつつ演奏し切ったプレイヤーがいて、それを再現したのがこれ。
  • Pytube
    • Channel
      • about_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 のファイル更新に時間がかかる。ダウンロードというよりインストールに時間がかかっている。

PytubeChannel の調査結果を吟味する。 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 なのだが、位置によって?キーが異なる。要調査。
  • header: 要調査
    • c4TabbedHeaderRenderer
      • channelId: 既知
      • title: 当然欲しい
      • navigationEndpoint
      • avatar: 余裕があれば欲しい
      • banner: 余裕があれば欲しい
      • headerLinks
      • subscribeButton
      • visitTracking
      • subscriberCountText
      • tvBanner
      • mobileBanner
      • trackingParams
      • sponsorButton
  • metadata: channelMetadataRenderer 以下が使えそう
    • channelMetadataRenderer
      • channelUrl: Channel コンストラクターの実引数と同じ
      • description: 欲しい
      • keywords: 欲しい
      • rssUrl: ブラウザーにこれを仕込んでおくと更新を通知してくれる
      • title: 当然欲しい
  • trackingParams: 不要
  • topbar: これは要らない
  • microformat: microformatDataRenderer 以下が使えそう
    • microformatDataRenderer
      • description: 欲しい
      • tags: 欲しい
      • thumbnail: 余裕があれば欲しい
      • title: 当然欲しい

副産物としてチャンネルの更新情報を RSS で得られることがわかった。次のような URL だ:

https://www.youtube.com/feeds/videos.xml?channel_id=xxxxxxxxxxxxxxxxxxxxxxxx

これをブラウザーなどの RSS ビューワーに仕込んでおけば YouTube のアカウントがなくても各チャンネルの最新更新が通知される。 YouTube のアカウントを持っている人がするチャンネル登録とやらに相当する手順だと思う。

ブラウザーの RSS リストを明示的に保存する方法が不明なので、いったんプロセスを終了する。