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)