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専用とだめだけどユーザの出席簿とか作ってみたい。