見出し画像

YouTube動画とチャットデータを一括ダウンロードするCLIアプリの作り方

僕の場合はyoutubeの切り抜き動画を作成するために動画データとチャットデータが必要だったんですが、いつでも見返せるように手元に保存しておきたいという方も多いと思います。

そんな時にサクッと役立つpythonスクリプトをご紹介しますんで、必要な方はコピペで使ってみて下さい。

記事が面白かったらフォロー&♥よろしくお願いしますm(_ _)m

作業はこんな感じ

必要なライブラリ

  • yt_dlp

  • pytchat

動画データやチャットデータを取得するライブラリは色々ありますが、早い・簡単・データ見やすいの三拍子が揃っているので、このライブラリのセットがお気に入りでよく使っています。

今回はyoutubeAPIを使ってないのでAPIキーを取得したり、残りのユニット数を気にしたりしなくてよいのもポイントですね。

コピペコード

まずは必要なライブラリをインストールしまして。

pip install yt-dlp pytchat

すでに入ってる場合は一応アプデしましょ。

pip install yt-dlp pytchat -U --user

下記のスクリプトをコピペして「youtube_dl.py」で保存。

import sys
from yt_dlp import YoutubeDL
import pytchat

#動画のダウンロード
def youtube_dl(urls):
    ydl_video_opts = {
        'outtmpl': '%(id)s' + '.mp4',
        'format': 'best'
    }
    with YoutubeDL(ydl_video_opts) as ydl:
        ydl.download([urls])

# チャットデータの取得
def chat_get(youtube_url):
        video_id = extract_video_id(youtube_url)
        livechat = pytchat.create(video_id=video_id)
        while livechat.is_alive():
            chatdata = livechat.get()
            if(len(chatdata.items) > 0):
                for c in chatdata.items:
                    print(f"{c.datetime} {c.elapsedTime} {c.author.name} {c.message} {c.amountString}")
                    txt_in.append(f"{c.elapsedTime}\t{c.type}\t{c.author.name}\t{c.message}\t{c.amountString}\t{c.currency}\t{c.amountValue}\t{c.bgColor}" + '\n')
                # .txtで保存
                with open(video_id + '_chatdata.txt', 'w', encoding='utf-8', newline='\n') as f:
                    f.writelines(txt_in)
            else:
                break

# URLからvideo_id抜き出し
def extract_video_id(url):
    with YoutubeDL() as ydl:
        info_dict = ydl.extract_info(url, download=False)
        return info_dict.get("id", None)

#コマンドから引数取得
if len(sys.argv) != 2:
    print("Usage: python script.py <youtube_url>")
    sys.exit(1)

#実行
txt_in = []
youtube_url = sys.argv[1]
youtube_dl(youtube_url)
chat_get(youtube_url)

そして実行。

python youtube_dl.py [youtbeのURL]

こんな感じで動画とチャットデータを取得できれば成功。

画像

簡単な仕様説明

画像

※1 コマンド実行から配信終了 or 強制終了(ctrl+cなど)までの間ダウンロードしっぱなしになるので注意

※2コマンド実行から配信終了 or 強制終了(ctrl+cなど)までの間のチャットのみ取得可

上記のようにライブ配信中の動画のみ実行から終了までの間を切り取るような挙動になるので、配信開始と同時に処理を実行させて配信終了まで放置するか、アーカイブ化されてから取得するのがスマートかなと思います。

使用上の注意

youtubeの規約にも書いてますが、動画の著作権は作った方に帰属しており無断でダウンロードするのは普通にNGです。ダメなんだけど現実問題ダウンロードされた事に気付けないし個人を追跡する事もできないので、罪に問えないというのが実態なんだと思います。

なので、youtubeから動画をダウンロードする際には著作権者に許可を取りましょう。動画ダウンロードしていいですか?って聞くだけです。もしくは動画投稿者が動画の拡散OKとか2時創作OKとか名言している場合も、その前提となる動画のダウンロード行為を間接的に認めている事になるのかなと理解してます。


この記事が面白かったら♡・フォローよろしくお願いしますm(_ _)m

下記のメンバーシップでは日々の活動報告・裏話なんかも掲示板で更新しています、一部の有料記事も読めちゃって初月無料ですので良かったらお試しを!


いいなと思ったら応援しよう!

スマイル@DIYプログラミング
よろしければサポートお願いします、頂いたサポートは活動費として使用させて頂きより有意義な記事を書けるように頑張ります!

ピックアップされています

【記事登録でチップ貰える】共同マガジンDIYイノベーターズ

  • 29本

コメント

3
ののの
ののの

取得したチャットデータを使って、ニコニコ動画風に配信画面に表示する方法はあるのでしょうか?

> のののさん
DIYプログラミングのスマイルです('ω')ノ

ライブ配信中にリアルタイムでコメントを流したいなら難しいと思いますが、切り抜き動画とかでニコニコ風にコメントを加工して表示したいなどであればmoviepyとかでできるんじゃないですかね。

弾幕コメントはニコニコ動画が特許取ってたと思いますんで、抵触しないように気をつける必要があるかもしれません。

ののの
ののの

お恥ずかしながら弾幕コメントの特許問題を全然把握していませんでした😱
そこも含めて頂いた単語を元に調べてみます!ありがとうございました!

ログイン または 会員登録 するとコメントできます。
お年玉ポイントキャンペーン noteで記事を買うと 抽選で最大全額戻ってくる 1/9(木)まで 条件・上限あり
個人開発勢│検証済みの稼げる情報発信中│チップで支援おじさん│Amazonのアソシエイトとして適格販売により収入を得るプログラムに参加しています│お仕事依頼・お問い合わせはこちらからどうぞ! https://note.com/diy_smile/message
YouTube動画とチャットデータを一括ダウンロードするCLIアプリの作り方|スマイル@DIYプログラミング
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1