【Node】YoutubeLiveのアーカイブからチャットを取得

YoutubeLiveのアーカイブからチャットデータを取得

相当更新が滞っていたがちょっと趣味開発で配信のアーカイブからチャットデータを取得したくなったのでやってみる。紆余曲折合って使うツールが①YouTube Data API v3 → ②youtube-dl → ③yt-dlpと変遷。

①はクォータ制限やら取得制限があったのでNG、②は最終更新がちょっと古いということで②から派生して更新も活発な③を採用。

Nodeで使いたい

上記のyt-dlpだが、PythonのライブラリなのでNodeで使うために、ラップしてくれているyt-dlp-wrapを使用する。これを使って①yt-dlpをDL→②yt-dlpを実行という流れでチャットデータを取得する。

サンプルのリポジトリはこちら

まずはyt-dlpをDLする部分。パスを設定すると画像のようにyt-dlpがDLされる。

バージョン指定もできるが特に指定しなければ最新のReleaseをGithubから取得する。

// yt-dlpのダウンロード
async function getYtDlp() {
  console.log('[getYtDlp]');
  console.log('----- START -----');

  let githubReleasesData = await YTDlpWrap.getGithubReleases(1, 5);

  await YTDlpWrap.downloadFromGithub();

  const ytDlpWrap = new YTDlpWrap(DL_PATH);
  ytDlpWrap.setBinaryPath(DL_PATH);

  console.log('----- END -----');
}

続いてチャットデータをダウンロードする部分。

ytDlpWrap.exec()にアーカイブのURLとyt-dlpのオプションを渡してチャットを取得する。

チャット(字幕扱い)を取得するオプション‘–write-subs’と動画自体はDLしない‘–skip-download’を設定し試しに1配信のアーカイブからキャプチャのようにチャットを取得できた。

取得にかかった時間は配信時間が4.5h、チャットが活発(9万件超)な配信で7分強ほどだった。

// チャットのダウンロード
async function getChatData(videoId: string) {
  console.log('[getChatData]');
  console.log('----- START -----');

  const ytDlpWrap = new YTDlpWrap(DL_PATH);

  // URL、ファイル名の生成
  const targetUrl = 'https://www.youtube.com/watch?v=' + videoId;
  const fileName = videoId + '.mp4';

  let ytDlpEventEmitter = ytDlpWrap
    .exec([
      targetUrl,
      '-f',
      'best',
      '-o',
      fileName,
      '--skip-download',
      '--write-subs',
      '-P ./files',
    ])
    .on('ytDlpEvent', (eventType, eventData) =>
      console.log(eventType, eventData)
    )
    .on('error', (error) => console.error(error))
    .on('close', () => console.log('all done'));

  console.log('----- END -----');
}

他にもいろいろとできそう。

ROM専用とだめだけどユーザの出席簿とか作ってみたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です