Переход от месива из баш скриптов к нормальному питоновскому коду #5

Merged
lulzette merged 32 commits from move-to-python into master 2022-11-13 12:45:18 +03:00
Showing only changes of commit b6f328b682 - Show all commits

View File

@ -5,20 +5,27 @@
# TODO: Сделать нормальную конфигурацию # TODO: Сделать нормальную конфигурацию
import os import os
import sys
from threading import Thread from threading import Thread
import config_python import config_python
import schedule import schedule
from twitch import TwitchClient from twitch import TwitchClient
import subprocess import subprocess
import time import time
import logging
from logging.handlers import TimedRotatingFileHandler
streamers = config_python.streamers streamers = config_python.streamers
client_id = config_python.twitchid client_id = config_python.twitchid
ytdl_options = config_python.ytdl_options ytdl_options = config_python.ytdl_options
log_format = logging.Formatter('%(asctime)s %(levelname)s:%(message)s')
log_file = 'output.log'
def which(command): def which(command):
# Пиздец, почему нет нормального аналога which из bash??? # Пиздец, почему нет нормального аналога which из bash???
''' '''
Мой аналог which из bash'а, который отдает true или false при наличии или отсутствии утилиты Мой аналог which из bash'а, который отдает true или false
при наличии или отсутствии утилиты
''' '''
for dirs in os.get_exec_path(): for dirs in os.get_exec_path():
if command in os.listdir(dirs): if command in os.listdir(dirs):
@ -27,6 +34,7 @@ def which(command):
# Если ничего не нашли во всех дирах, то выходим с False # Если ничего не нашли во всех дирах, то выходим с False
return False return False
def checkTools(): def checkTools():
''' '''
Проверяет, установлены ли необходимые утилиты Проверяет, установлены ли необходимые утилиты
@ -34,10 +42,11 @@ def checkTools():
tools = ('youtube-dl', 'ffmpeg') tools = ('youtube-dl', 'ffmpeg')
for i in tools: for i in tools:
if not which(i): if not which(i):
print(i + " не установлен") log.critical(i + " не установлен")
return False return False
return True return True
def startRecord(i): def startRecord(i):
''' '''
Функция, которая запускает в отдельном потоке запись стрима - recorder(i) Функция, которая запускает в отдельном потоке запись стрима - recorder(i)
@ -45,21 +54,24 @@ def startRecord(i):
th = Thread(target=recorder, args=(i, )) th = Thread(target=recorder, args=(i, ))
th.start() th.start()
def recorder(i): def recorder(i):
''' '''
Функция, которая запускает youtube-dl, фактически записывает стрим Функция, которая запускает youtube-dl, фактически записывает стрим
''' '''
path = config_python.path + "/" + i path = config_python.path + "/" + i
print("Записываем стрим %s\n" % i) log.info("Записываем стрим %s\n" % i)
# cmdline для запуска youtube-dl # cmdline для запуска youtube-dl
cmdline = ["youtube-dl", "-q", ytdl_options, cmdline = ["youtube-dl", "-q", ytdl_options,
"-o", path + "/%(upload_date)s_%(title)s__%(timestamp)s_%(id)s.%(ext)s", "-o",
path+"/%(upload_date)s_%(title)s__%(timestamp)s_%(id)s.%(ext)s",
"https://twitch.tv/" + i] "https://twitch.tv/" + i]
s = subprocess.call(cmdline) s = subprocess.call(cmdline)
print("Запись стрима %s закончена\n" % i) log.info("Запись стрима %s закончена\n" % i)
if (os.path.exists(path+"/pid")): if (os.path.exists(path+"/pid")):
os.system("rm "+path+"/pid") os.system("rm "+path+"/pid")
print("lock файл удален") log.info("lock файл удален")
def checkAlive(): def checkAlive():
''' '''
@ -74,19 +86,20 @@ def checkAlive():
# Создаем путь до диры со стримером, если его нет # Создаем путь до диры со стримером, если его нет
if not (os.path.exists(path)): if not (os.path.exists(path)):
os.makedirs(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):
# Если стрим идет и лок файла нет, то записываем и ставим лок # Если стрим идет и лок файла нет, то записываем и ставим лок
if (client.streams.get_stream_by_user(user_id).stream_type == 'live') and not (os.path.exists(config_python.path+"/"+i+"/pid")): 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) startRecord(i)
os.system("touch "+path+"/pid") os.system("touch "+path+"/pid")
else: else:
print(i+" Идет запись") log.info(i + " Идет запись")
else: else:
# Если стрим не идет, то пишем об этом и убираем его из залоченных # Если стрим не идет, то пишем об этом и убираем его из залоченных
print(i+" Не стримит") log.info(i + " Не стримит")
# Если есть лок, то удаляем # Если есть лок, то удаляем
if (os.path.exists(path+"/pid")): if (os.path.exists(path+"/pid")):
os.system("rm "+path+"/pid") os.system("rm "+path+"/pid")
@ -97,6 +110,7 @@ def removeOldStreams():
records_path = config_python.path records_path = config_python.path
# По каждой папке со стримерами # По каждой папке со стримерами
for i in streamers: for i in streamers:
try:
# Если файлов в папке со стримами больше чем указано в конфиге # Если файлов в папке со стримами больше чем указано в конфиге
if len(os.listdir(records_path+"/"+i)) > config_python.max_files: if len(os.listdir(records_path+"/"+i)) > config_python.max_files:
# Получаем список файлов # Получаем список файлов
@ -104,15 +118,42 @@ def removeOldStreams():
# Если превышает - удаляем старейший # Если превышает - удаляем старейший
oldest = min(os.listdir(records_path+"/"+i), key=os.path.getctime) oldest = min(os.listdir(records_path+"/"+i), key=os.path.getctime)
os.unlink(oldest) os.unlink(oldest)
print("Удален файл: " + 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 __name__ == "__main__":
# Проверить, установлены ли нужные утилиты # Проверить, установлены ли нужные утилиты
if not checkTools(): exit() if not checkTools(): exit()
# Log config
log = get_logger("main")
log.info("Запущен")
# Проверять стримы раз в check_period # Проверять стримы раз в check_period
schedule.every(config_python.check_period).seconds.do(checkAlive) schedule.every(config_python.check_period).seconds.do(checkAlive)
# Каждый час удалять старые стримы # Каждый час удалять старые стримы
schedule.every(1).hours.do(removeOldStreams) schedule.every(1).hours.do(removeOldStreams)
while True: while True:
schedule.run_pending() schedule.run_pending()
time.sleep(1) time.sleep(1)