pretty good status
This commit is contained in:
@@ -11,6 +11,10 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ChatAnalyser:
|
||||
def __init__(self, ignore_commands=True, ignored_users=["moobot", "nightbot"]):
|
||||
self.ignored_users = ignored_users
|
||||
self.ignore_commands = ignore_commands
|
||||
|
||||
def run(self, chat_file, peaks_output_file, peaks_output_chart):
|
||||
dates = self._read_message_dates(chat_file)
|
||||
messages_per_minute = self._group_dates(dates)
|
||||
@@ -32,6 +36,12 @@ class ChatAnalyser:
|
||||
# Wrong line format
|
||||
continue
|
||||
|
||||
if message_data[1].lower() in self.ignore_commands:
|
||||
continue
|
||||
|
||||
if self.ignore_commands and message_data[2].startswith("!"):
|
||||
continue
|
||||
|
||||
date = message_data[0]
|
||||
dates.append(self._parse_date(date))
|
||||
return dates
|
||||
|
||||
@@ -75,15 +75,19 @@ class ChatConnection:
|
||||
self.connection = socket.socket()
|
||||
self.connection.connect((TW_CHAT_SERVER, TW_CHAT_PORT))
|
||||
# public data to join hat
|
||||
self.connection.send(f"PASS couldBeRandomString\n".encode("utf-8"))
|
||||
self.connection.send(f"NICK justinfan113\n".encode("utf-8"))
|
||||
self.connection.send(f"JOIN {channel}\n".encode("utf-8"))
|
||||
self.connection.send(f"PASS couldBeRandomString\r\n".encode("utf-8"))
|
||||
self.connection.send(f"NICK justinfan113\r\n".encode("utf-8"))
|
||||
self.connection.send(f"JOIN {channel}\r\n".encode("utf-8"))
|
||||
|
||||
logger.info("Connected to %s", channel)
|
||||
|
||||
try:
|
||||
while True:
|
||||
msg = self.connection.recv(8192).decode('utf-8')
|
||||
msg = self.connection.recv(1024).decode('utf-8')
|
||||
if "PING :tmi.twitch.tv" in msg:
|
||||
self.connection.send(bytes("PONG :tmi.twitch.tv\r\n", "UTF-8"))
|
||||
logger.info("RECEIVED Ping from server. Answered")
|
||||
continue
|
||||
if self.on_message:
|
||||
self.on_message(msg)
|
||||
except BaseException as e:
|
||||
|
||||
@@ -8,7 +8,6 @@ CHAT_DIVIDER = "<~|~>"
|
||||
|
||||
|
||||
class TwitchChatRecorder:
|
||||
is_running = False
|
||||
chat_process = None
|
||||
|
||||
def __init__(self, api, debug=False):
|
||||
@@ -16,10 +15,23 @@ class TwitchChatRecorder:
|
||||
self.api = api
|
||||
|
||||
def run(self, streamer_name, output_file):
|
||||
self.is_running = True
|
||||
self.chat_process = multiprocessing.Process(target=self._record_chat, args=(streamer_name, output_file))
|
||||
self.chat_process.start()
|
||||
|
||||
def stop(self):
|
||||
try:
|
||||
if self.chat_process:
|
||||
self.chat_process.terminate()
|
||||
|
||||
self.chat_process = None
|
||||
logger.info("Chat stopped")
|
||||
except BaseException as e:
|
||||
logger.error("Unable to stop chat")
|
||||
logger.error(e)
|
||||
|
||||
def is_running(self):
|
||||
return self.chat_process is not None and self.chat_process.is_alive()
|
||||
|
||||
def _record_chat(self, streamer_name, output_file):
|
||||
with open(output_file, "w") as stream:
|
||||
def on_message(twitch_msg):
|
||||
@@ -34,19 +46,6 @@ class TwitchChatRecorder:
|
||||
|
||||
self.api.start_chat(streamer_name, on_message)
|
||||
|
||||
def stop(self):
|
||||
try:
|
||||
if self.chat_process:
|
||||
self.chat_process.terminate()
|
||||
|
||||
self.chat_process = None
|
||||
logger.error("Chat stopped")
|
||||
except BaseException as e:
|
||||
logger.error("Unable to stop chat")
|
||||
logger.error(e)
|
||||
|
||||
self.is_running = False
|
||||
|
||||
def parse_msg(self, msg):
|
||||
try:
|
||||
return msg[1:].split('!')[0], msg.split(":", 2)[2]
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
class Clipper:
|
||||
def run(self):
|
||||
pass
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import sys
|
||||
from datetime import datetime
|
||||
@@ -33,9 +32,9 @@ class Recorder:
|
||||
|
||||
def run(self):
|
||||
logger.info("Start recording streamer %s", self.config.tw_streamer)
|
||||
status = self.api.get_user_status(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)
|
||||
|
||||
@@ -59,7 +58,7 @@ class Recorder:
|
||||
time.sleep(300)
|
||||
|
||||
if status == TwitchStreamStatus.ERROR:
|
||||
logger.critical("Error occurred. Exit", self.config.tw_streamer)
|
||||
logger.critical("Error occurred %s. Exit", self.config.tw_streamer)
|
||||
sys.exit(1)
|
||||
|
||||
elif status == TwitchStreamStatus.NOT_FOUND:
|
||||
@@ -68,8 +67,8 @@ class Recorder:
|
||||
|
||||
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):
|
||||
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
|
||||
@@ -79,5 +78,6 @@ class Recorder:
|
||||
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)
|
||||
|
||||
@@ -5,12 +5,10 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TwitchVideoRecorder:
|
||||
is_running = False
|
||||
refresh_timeout = 15
|
||||
streamlink_process = None
|
||||
|
||||
def run(self, streamer_name, output_file, quality="720p"):
|
||||
self.is_running = True
|
||||
def run(self, streamer_name, output_file, quality="360p"):
|
||||
self._record_stream(streamer_name, output_file, quality)
|
||||
|
||||
def stop(self):
|
||||
@@ -19,12 +17,13 @@ class TwitchVideoRecorder:
|
||||
self.streamlink_process.terminate()
|
||||
|
||||
self.streamlink_process = None
|
||||
logger.error("Video stopped")
|
||||
logger.info("Video stopped")
|
||||
except BaseException as e:
|
||||
logger.error("Unable to stop video")
|
||||
logger.error(e)
|
||||
|
||||
self.is_running = False
|
||||
def is_running(self) -> bool:
|
||||
return self.streamlink_process is not None and self.streamlink_process.poll() is None
|
||||
|
||||
def _record_stream(self, streamer_name, output_file, quality):
|
||||
try:
|
||||
@@ -40,4 +39,3 @@ class TwitchVideoRecorder:
|
||||
except BaseException as e:
|
||||
logger.error("Unable to run streamlink")
|
||||
logger.error(e)
|
||||
self.is_running = False
|
||||
|
||||
Reference in New Issue
Block a user