From b6f328b682741414576a11a0fce4fdef53f0007c Mon Sep 17 00:00:00 2001 From: Lulzette Date: Thu, 23 Sep 2021 03:59:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=B4=20=D0=B2=20=D1=81=D0=BE=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D1=81=20PEP?= =?UTF-8?q?8,=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B8=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daemon.py | 89 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/daemon.py b/daemon.py index e9a1145..ade11b1 100755 --- a/daemon.py +++ b/daemon.py @@ -5,20 +5,27 @@ # TODO: Сделать нормальную конфигурацию import os +import sys from threading import Thread import config_python import schedule from twitch import TwitchClient import subprocess import time +import logging +from logging.handlers import TimedRotatingFileHandler streamers = config_python.streamers client_id = config_python.twitchid ytdl_options = config_python.ytdl_options +log_format = logging.Formatter('%(asctime)s %(levelname)s:%(message)s') +log_file = 'output.log' + def which(command): # Пиздец, почему нет нормального аналога which из bash??? ''' - Мой аналог which из bash'а, который отдает true или false при наличии или отсутствии утилиты + Мой аналог which из bash'а, который отдает true или false + при наличии или отсутствии утилиты ''' for dirs in os.get_exec_path(): if command in os.listdir(dirs): @@ -27,6 +34,7 @@ def which(command): # Если ничего не нашли во всех дирах, то выходим с False return False + def checkTools(): ''' Проверяет, установлены ли необходимые утилиты @@ -34,10 +42,11 @@ def checkTools(): tools = ('youtube-dl', 'ffmpeg') for i in tools: if not which(i): - print(i + " не установлен") + log.critical(i + " не установлен") return False return True + def startRecord(i): ''' Функция, которая запускает в отдельном потоке запись стрима - recorder(i) @@ -45,21 +54,24 @@ def startRecord(i): th = Thread(target=recorder, args=(i, )) th.start() + def recorder(i): ''' Функция, которая запускает youtube-dl, фактически записывает стрим ''' - path = config_python.path + "/"+ i - print("Записываем стрим %s\n" % i) - # cmdline для запуска youtube-dl - cmdline = ["youtube-dl", "-q", ytdl_options, - "-o", path + "/%(upload_date)s_%(title)s__%(timestamp)s_%(id)s.%(ext)s", - "https://twitch.tv/"+i] + path = config_python.path + "/" + i + log.info("Записываем стрим %s\n" % i) + # cmdline для запуска youtube-dl + cmdline = ["youtube-dl", "-q", ytdl_options, + "-o", + path+"/%(upload_date)s_%(title)s__%(timestamp)s_%(id)s.%(ext)s", + "https://twitch.tv/" + i] s = subprocess.call(cmdline) - print("Запись стрима %s закончена\n" % i) + log.info("Запись стрима %s закончена\n" % i) if (os.path.exists(path+"/pid")): os.system("rm "+path+"/pid") - print("lock файл удален") + log.info("lock файл удален") + def checkAlive(): ''' @@ -70,23 +82,24 @@ def checkAlive(): client = TwitchClient(client_id=client_id) for i in streamers: # Путь до диры со стримами - path = config_python.path + "/"+ i + path = config_python.path + "/" + i # Создаем путь до диры со стримером, если его нет if not (os.path.exists(path)): os.makedirs(path) - user_id=client.users.translate_usernames_to_ids(i)[0]['id'] # Получить ID по нику + # Получить ID по нику + user_id = client.users.translate_usernames_to_ids(i)[0]['id'] # Если стрим идет, то идем дальше if client.streams.get_stream_by_user(user_id): # Если стрим идет и лок файла нет, то записываем и ставим лок if (client.streams.get_stream_by_user(user_id).stream_type == 'live') and not (os.path.exists(config_python.path+"/"+i+"/pid")): - print(i+" стримит") + log.info(i + " стримит") startRecord(i) os.system("touch "+path+"/pid") else: - print(i+" Идет запись") + log.info(i + " Идет запись") else: # Если стрим не идет, то пишем об этом и убираем его из залоченных - print(i+" Не стримит") + log.info(i + " Не стримит") # Если есть лок, то удаляем if (os.path.exists(path+"/pid")): os.system("rm "+path+"/pid") @@ -97,22 +110,50 @@ def removeOldStreams(): records_path = config_python.path # По каждой папке со стримерами for i in streamers: - # Если файлов в папке со стримами больше чем указано в конфиге - if len(os.listdir(records_path+"/"+i)) > config_python.max_files: - # Получаем список файлов - # и смотрим, превышает ли кол-во mp4 файлов заданное в конфиге - # Если превышает - удаляем старейший - oldest = min(os.listdir(records_path+"/"+i), key=os.path.getctime) - os.unlink(oldest) - print("Удален файл: " + oldest) + try: + # Если файлов в папке со стримами больше чем указано в конфиге + if len(os.listdir(records_path+"/"+i)) > config_python.max_files: + # Получаем список файлов + # и смотрим, превышает ли кол-во mp4 файлов заданное в конфиге + # Если превышает - удаляем старейший + oldest = min(os.listdir(records_path+"/"+i), key=os.path.getctime) + os.unlink(oldest) + log.warning("Удален файл: " + oldest) + except Exception as e: + log.error(e) + +def get_console_handler(): + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(log_format) + return console_handler + +def get_file_handler(): + file_handler = TimedRotatingFileHandler(log_file, when='midnight') + file_handler.setFormatter(log_format) + return file_handler + +def get_logger(logger_name): + logger = logging.getLogger(logger_name) + logger.setLevel(logging.DEBUG) + logger.addHandler(get_console_handler()) + logger.addHandler(get_file_handler()) + logger.propagate = False + return logger + if __name__ == "__main__": # Проверить, установлены ли нужные утилиты if not checkTools(): exit() + + # Log config + log = get_logger("main") + log.info("Запущен") + # Проверять стримы раз в check_period schedule.every(config_python.check_period).seconds.do(checkAlive) # Каждый час удалять старые стримы schedule.every(1).hours.do(removeOldStreams) + while True: schedule.run_pending() - time.sleep(1) + time.sleep(1)