応援していたアイドルのイベントがライブ配信されることを知ったのは、前日の夜でした。
配信初日は金曜日。
日中は仕事で不在になります。
配信が何時から始まり、何時に終わるのか。
何回配信されるのか。
その時点では、ほとんど分かっていませんでした。
分かっているのは、
「当日、リアルタイムで見れない。録画操作することもできない。」
という事実だけです。
見たいけれど、見れないという現実
この時点での前提条件を整理すると、
・配信の開始・終了時刻が不明 ・配信回数も不明 ・自分は仕事で不在 ・手動で録画開始・停止はできない ・配信は1つのルームのみ(だと思っていた) ※「配信ルームを一つだと思っていたこと」 この思い込みが、この先、頭を悩ませる大きな壁になります。
それでも、
「どうしても見逃したくない。記録として残しておきたい」
という気持ちは変わりませんでした。
そこで考えたのが、
自分がいなくても録画が開始、終了できる仕組みを作ることです。
※この連載の背景については、前回の記事で詳しく書いています。
第0回:趣味から始まる学び | 推し活をきっかけに、自動収録の仕組みを作ることにした話
完璧は捨てる。まずは「録画できること」だけに絞る
仕組みを作ろうと思ったとき、欲を言えば、やりたいことはいくらでも思い浮かびました。
いくつか例を挙げると、
・録画ファイルの自動ネーミング
・保存フォルダ管理
・自分が起動しなくても、毎日自動でプログラムが起動するようにする
ですが、すぐに考えるのをやめました。
今日は、そこまでやらない。
今はただ、
自分が不在でも、”翌日の配信を確実に録画できること”
これだけをゴールに設定しました。
初心者でも、「やりたい」をカタチに。Python と OBS を選んだ理由
私はプログラミングの専門家ではありません。
「ライブ配信の録画を自動化したい」
そう思っても、
・ベストなプログラム言語は何か?
・どんなコードを書けばいいのか?
・そもそも難易度がどれくらいなのか?
これらを即座にイメージすることはできません。
ただ、仕事や趣味の中で、エクセルVBAやPythonに触れてきた経験から、
・大抵のことは自動化できる(難易度はさておき)
・分からなくても、調べるか、ChatGPTを活用すれば実現できる
これだけはわかっていました。
まずはやってみなければ始まらない。
私はすぐにChatGPTに相談しました。

「ライブ配信の録画を自動化したい。最適な手段は?」
いくつかの手段が提示された中で、
時間がない中で選ぶなら、
いま一番「分かる」Pythonが最適解でした。
録画ソフトは、OBSを使います。
正式名称は 「OBS Studio(オー・ビー・エス スタジオ)」
YouTube配信やゲーム実況などにも使われるツールです。
・画面録画
・音声録音
・録画ファイル保存
・自動化(Python から「録画開始」「録画停止」命令)
これらを容易に行うことができます。
・外部から操作できる
・録画の開始・停止をプログラムで制御できる
という点で、今回の用途にぴったりでした。
即席でもいい。まずはカタチにしてみる
作ったのは、とてもシンプルな仕組みです。
・定期的に配信状態を確認する
・配信が始まったら録画開始
・配信が終わったら録画停止
対象は 1ルームのみ。
エラー処理や細かい作りこみは一切行っていません。
今はそれでいい と割り切りました。
即席で作ったコード(概要)
この時作成した、実際のプログラムがこちらです。
import time
import datetime
import webbrowser
import requests
from obswebsocket import obsws, requests as obsreq
import subprocess
OBS_HOST = "localhost"
OBS_PORT = 4455
OBS_PASSWORD = "********" # 実際のパスワードに変更
# ====== 設定エリア ======
ROOM_ID = 000000 # 対象ルームの room_id に変更
ROOM_NAME = "xxxxx" # 保存ファイル名用の識別子(ローマ字など)
ROOM_URL = "https://www.showroom-live.com/r/xxxxx" # 対象ルームのURL
POLL_INTERVAL = 60 # 何秒ごとに配信状況をチェックするか
API_URL = f"https://www.showroom-live.com/api/live/live_info?room_id={ROOM_ID}"
# =======================
def is_live() -> bool:
"""SHOWROOMが配信中かどうかを返す"""
r = requests.get(API_URL, timeout=5)
r.raise_for_status()
data = r.json()
# live_status == 2 なら配信中
return data.get("live_status") == 2
def get_live_title() -> str:
"""配信タイトル(ファイル名用)"""
r = requests.get(API_URL, timeout=5)
r.raise_for_status()
data = r.json()
return data.get("live_title") or "no_title"
def open_showroom_page():
"""ブラウザでルームを開く"""
webbrowser.open(ROOM_URL)
def start_obs_record(custom_filename: str | None = None):
ws = obsws(OBS_HOST, OBS_PORT, OBS_PASSWORD)
ws.connect()
ws.call(obsreq.StartRecord())
ws.disconnect()
def stop_obs_record():
ws = obsws(OBS_HOST, OBS_PORT, OBS_PASSWORD)
ws.connect()
ws.call(obsreq.StopRecord())
ws.disconnect()
def main():
recording = False
while True:
try:
live = is_live()
except Exception as e:
print("APIエラー:", e)
time.sleep(POLL_INTERVAL)
continue
# 配信開始を検出
if live and not recording:
print("▶ 配信開始を検出")
try:
title = get_live_title()
except Exception:
title = "no_title"
now = datetime.datetime.now().strftime("%Y%m%d_%H%M")
# ファイル名に使えない文字を除去
safe_title = "".join(c for c in title if c not in r'\/:*?"<>|')
filename_fmt = f"{ROOM_NAME}_{now}_{safe_title}"
print("ブラウザを開きます:", ROOM_URL)
open_showroom_page()
print("録画開始:", filename_fmt)
start_obs_record(custom_filename=filename_fmt)
recording = True
# 配信終了を検出
elif not live and recording:
print("■ 配信終了を検出 → 録画停止")
stop_obs_record()
recording = False
# ブラウザも閉じる
subprocess.run(["taskkill", "/IM", "msedge.exe", "/F"])
time.sleep(POLL_INTERVAL)
if __name__ == "__main__":
main()
※このコードは、前日の夜に最低限の動作を目的として即席で作成したものです。
安定性や例外処理は考慮していません。
この時点で完成したコードは、
お世辞にも”仕組み”と呼べるようなものではありません。
それでも、
「動くものを自分で作った」
という意味では、十分な一歩でした。
スタート地点を作れたという感覚
その夜、
作ったプログラムを起動してみて、
指定した配信が始まると同時に録画が始まり、
配信終了と同時に録画停止される。
どんなに小さなプログラムでも、
作った仕組みが思い通りに動いたこと。
この仕組みを自分の手で作り上げたという事実。
これらは、
プログラムについてもっと知りたい。
もっと作りこんでプログラムを大きくしていきたい。
そう思うきっかけになりました。
まとめ
プログラムやアプリ開発の初級者にとって、
最初の一歩を踏み出すことは、思っているよりも壁が高く、大きな一歩であると感じています。
・完璧を目指さない
・不完全でも、まずはカタチにしてみる
この判断があったからこそ、
やりたいことをカタチにすることができ、
仕組みづくりのスタートを切ることができました。
次回は、
実際に配信が始まったあと、
配信初日に起きた想定外の出来事、
改善を繰り返しながら、なんとか乗り切った2日目を振り返ります。


コメント