Files
twitch-highlight-detector/clipper/recorder.py
Vitalii Lebedynskyi fdfd2c6135 Seems finished
2022-08-17 16:51:05 +03:00

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)