89 lines
3.7 KiB
Python
89 lines
3.7 KiB
Python
import logging
|
|
import os
|
|
import time
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
from clipper.analyser import ChatAnalyser
|
|
from clipper.api import TwitchApi, TwitchStreamStatus
|
|
from clipper.chat import TwitchChatRecorder
|
|
from clipper.clipper import Clipper
|
|
from clipper.video import TwitchVideoRecorder
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class RecorderConfig:
|
|
def __init__(self, tw_client, tw_secret, tw_streamer, tw_quality, output_folder):
|
|
self.output_folder = output_folder
|
|
self.tw_quality = tw_quality
|
|
self.tw_streamer = tw_streamer
|
|
self.tw_secret = tw_secret
|
|
self.tw_client = tw_client
|
|
|
|
|
|
class Recorder:
|
|
def __init__(self, config):
|
|
self.config = config
|
|
self.api = TwitchApi(config.tw_client, config.tw_secret)
|
|
self.streamer_folder = os.path.join(self.config.output_folder, self.config.tw_streamer)
|
|
self.video_recorder = TwitchVideoRecorder()
|
|
self.chat_recorder = TwitchChatRecorder(self.api, debug=True)
|
|
self.chat_analyser = ChatAnalyser()
|
|
self.clipper = Clipper()
|
|
|
|
def run(self):
|
|
logger.info("Start recording streamer %s", self.config.tw_streamer)
|
|
|
|
while True:
|
|
status = self.api.get_user_status(self.config.tw_streamer)
|
|
if status == TwitchStreamStatus.ONLINE:
|
|
logger.info("Streamer %s is online. Start recording", self.config.tw_streamer)
|
|
|
|
start_time = datetime.now()
|
|
record_folder_name = start_time.strftime("%d-%m-%Y_%H-%M-%S")
|
|
record_folder = os.path.join(self.streamer_folder, record_folder_name)
|
|
os.makedirs(record_folder)
|
|
|
|
output_video_file = os.path.join(record_folder, "video.mp4")
|
|
output_chat_file = os.path.join(record_folder, "chat.txt")
|
|
|
|
self.chat_recorder.run(self.config.tw_streamer, output_chat_file)
|
|
self.video_recorder.run(self.config.tw_streamer, output_video_file, quality="160p")
|
|
self._loop_recording()
|
|
self._post_process_video(record_folder, output_chat_file, output_video_file, start_time)
|
|
|
|
elif status == TwitchStreamStatus.OFFLINE:
|
|
logger.info("Streamer %s is offline. Waiting for 300 sec", self.config.tw_streamer)
|
|
time.sleep(300)
|
|
|
|
if status == TwitchStreamStatus.ERROR:
|
|
logger.critical("Error occurred %s. Exit", self.config.tw_streamer)
|
|
sys.exit(1)
|
|
|
|
elif status == TwitchStreamStatus.NOT_FOUND:
|
|
logger.critical(f"Streamer %s not found, invalid streamer_name or typo", self.config.tw_streamer)
|
|
sys.exit(1)
|
|
|
|
def _loop_recording(self):
|
|
while True:
|
|
if self.video_recorder.is_running() or self.chat_recorder.is_running():
|
|
if not (self.video_recorder.is_running() and self.chat_recorder.is_running()):
|
|
self.video_recorder.stop()
|
|
self.chat_recorder.stop()
|
|
break
|
|
logger.info("Recording in progress. Wait 1m")
|
|
time.sleep(60)
|
|
continue
|
|
break
|
|
|
|
def _post_process_video(self, record_folder, output_chat_file, output_video_file, start_time):
|
|
output_chat_peaks_file = os.path.join(record_folder, "chat_peaks.txt")
|
|
output_chat_chart_file = os.path.join(record_folder, "chat_chart.png")
|
|
|
|
logger.info("Start looking for peaks in file %s", output_chat_file)
|
|
peaks = self.chat_analyser.run(output_chat_file, output_chat_peaks_file, output_chat_chart_file, start_time)
|
|
logger.info("Found peaks: %s for file %s", len(peaks), output_chat_file)
|
|
|
|
self.clipper.run(output_video_file, output_chat_peaks_file, record_folder)
|