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.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() 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") output_chat_peaks_file = os.path.join(record_folder, "chat_peaks.txt") output_chat_chart_file = os.path.join(record_folder, "chat_chart.png") 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(output_chat_file, output_chat_peaks_file, output_chat_chart_file) 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, output_chat_file, output_chat_peaks_file, output_chat_chart_file): 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) logger.info("Found peaks: %s for file %s", len(peaks), output_chat_file)