Beginning of redis support

This commit is contained in:
Totonyus 2022-04-26 18:23:20 +02:00
parent f8d34778c9
commit ec97541e18
7 changed files with 42 additions and 15 deletions

View File

@ -19,6 +19,7 @@ class SectionConfig:
'_log_backups': 7, '_log_backups': 7,
'_log_level': 20, '_log_level': 20,
'_unit_test': True, '_unit_test': True,
'_enable_redis': True
} }
def append(self, key, item): def append(self, key, item):
@ -92,7 +93,10 @@ class ConfigManager:
self.__config.read(params_file if params_file is not None else 'params/params.ini') self.__config.read(params_file if params_file is not None else 'params/params.ini')
self.__init_logger(self.__config['app'].getint('_log_level'), self.__config['app'].getint('_log_backups')) self.log_level = self.__config['app'].getint('_log_level')
self.log_backups = self.__config['app'].getint('_log_backups')
self.init_logger()
logging.info(f"Container build date : {os.environ.get('DATE')}, git revision : {os.environ.get('GIT_BRANCH')} - {os.environ.get('GIT_REVISION')}") logging.info(f"Container build date : {os.environ.get('DATE')}, git revision : {os.environ.get('GIT_BRANCH')} - {os.environ.get('GIT_REVISION')}")
@ -100,12 +104,11 @@ class ConfigManager:
self.__load_metadata() self.__load_metadata()
self.__set_config_objects() self.__set_config_objects()
@staticmethod def init_logger(self):
def __init_logger(level=30, backup_count=7): logging.basicConfig(level=self.log_level, format='[%(asctime)s][%(name)s][%(levelname)s] %(message)s', datefmt='%d-%m-%y %H:%M:%S')
logging.basicConfig(level=level, format='[%(asctime)s][%(name)s][%(levelname)s] %(message)s', datefmt='%d-%m-%y %H:%M:%S')
time_handler = handlers.TimedRotatingFileHandler('logs/ydl_api_ng', when='midnight', interval=1, backupCount=backup_count) time_handler = handlers.TimedRotatingFileHandler('logs/ydl_api_ng', when='midnight', interval=1, backupCount=self.log_backups)
time_handler.setLevel(level) time_handler.setLevel(self.log_level)
time_handler.setFormatter(logging.Formatter('[%(asctime)s][%(name)s][%(levelname)s] %(message)s', datefmt='%d-%m-%y %H:%M:%S')) time_handler.setFormatter(logging.Formatter('[%(asctime)s][%(name)s][%(levelname)s] %(message)s', datefmt='%d-%m-%y %H:%M:%S'))
logging.getLogger().addHandler(time_handler) logging.getLogger().addHandler(time_handler)

View File

@ -4,6 +4,8 @@ import logging
from urllib.parse import urlparse from urllib.parse import urlparse
import yt_dlp as ydl import yt_dlp as ydl
from redis import Redis
from rq import Queue
import config_manager import config_manager
from params import progress_hooks, postprocessor_hooks, ydl_api_hooks from params import progress_hooks, postprocessor_hooks, ydl_api_hooks
@ -43,6 +45,8 @@ class DownloadManager:
is_video = self.check_if_video() is_video = self.check_if_video()
self.is_video = is_video if is_video is not None else False self.is_video = is_video if is_video is not None else False
self.enable_redis = self.__cm.get_app_params().get('_enable_redis')
if post_body is not None and post_body.get('presets') is not None and len(post_body.get('presets')) > 0: if post_body is not None and post_body.get('presets') is not None and len(post_body.get('presets')) > 0:
self.get_presets_from_post_request(post_body.get('presets')) self.get_presets_from_post_request(post_body.get('presets'))
else: else:
@ -259,23 +263,32 @@ class DownloadManager:
ydl_opts = copy.deepcopy(preset) ydl_opts = copy.deepcopy(preset)
ydl_opts.append('progress_hooks', [functools.partial(progress_hooks.handler, ydl_opts, self, self.__cm), functools.partial(self.progress_hooks_proxy)]) ydl_opts.append('progress_hooks', [functools.partial(progress_hooks.handler, ydl_opts, self, self.get_current_config_manager()), functools.partial(self.progress_hooks_proxy)])
ydl_opts.append('postprocessor_hooks', [functools.partial(postprocessor_hooks.handler, ydl_opts, self, self.__cm)]) ydl_opts.append('postprocessor_hooks', [functools.partial(postprocessor_hooks.handler, ydl_opts, self, self.get_current_config_manager())])
ydl_opts.append('logger', logging.getLogger('youtube-dlp')) ydl_opts.append('logger', logging.getLogger('youtube-dlp'))
ydl_api_hooks.pre_download_handler(ydl_opts, self, self.__cm) ydl_api_hooks.pre_download_handler(ydl_opts, self, self.get_current_config_manager())
if self.enable_redis:
queue = Queue('ydl_api_ng', connection=Redis())
redis_id = queue.enqueue(self.send_download_order, args=[ydl_opts, True], job_timeout=-1).id
preset.append('_redis_id', redis_id)
else:
preset.append('_redis_id', None)
self.send_download_order(ydl_opts)
def send_download_order(self, ydl_opts):
if self.enable_redis:
self.get_current_config_manager().init_logger()
try: try:
with ydl.YoutubeDL(ydl_opts.get_all()) as dl: with ydl.YoutubeDL(ydl_opts.get_all()) as dl:
download_result = dl.download([self.url]) == 0 dl.download([self.url])
ydl_opts.append('__download_exception_message', None) ydl_opts.append('__download_exception_message', None)
except ydl.utils.DownloadError as error: except ydl.utils.DownloadError as error:
download_result = False
ydl_opts.append('__download_exception_message', str(error)) ydl_opts.append('__download_exception_message', str(error))
ydl_api_hooks.post_download_handler(ydl_opts, self, self.__cm, self.downloaded_files) ydl_api_hooks.post_download_handler(ydl_opts, self, self.get_current_config_manager(), self.downloaded_files)
return download_result
def process_downloads(self): def process_downloads(self):
for preset in self.presets: for preset in self.presets:
@ -343,3 +356,6 @@ class DownloadManager:
'downloads_cannot_be_checked': self.downloads_cannot_be_checked, 'downloads_cannot_be_checked': self.downloads_cannot_be_checked,
'downloads': presets_display, 'downloads': presets_display,
} }
def get_current_config_manager(self):
return self.__cm

View File

@ -68,7 +68,10 @@ async def download_request(response: Response, background_tasks: BackgroundTasks
response.status_code = dm.get_api_status_code() response.status_code = dm.get_api_status_code()
if response.status_code != 400: if response.status_code != 400:
background_tasks.add_task(dm.process_downloads) if __cm.get_app_params().get('_enable_redis'):
dm.process_downloads()
else:
background_tasks.add_task(dm.process_downloads)
return dm.get_api_return_object() return dm.get_api_return_object()

View File

@ -8,6 +8,8 @@ _log_level = 20
_log_backups = 7 _log_backups = 7
_listen_port = 80 _listen_port = 80
_listen_ip = 0.0.0.0 _listen_ip = 0.0.0.0
_enable_redis = true
_allow_dangerous_post_requests = false _allow_dangerous_post_requests = false
;;; ;;;

View File

@ -39,6 +39,7 @@ _log_level = 20
_log_backups = 7 _log_backups = 7
_listen_port = 80 _listen_port = 80
_listen_ip = 0.0.0.0 _listen_ip = 0.0.0.0
_enable_redis = true
;;; just for unit tests purpose, please don't mind ;;; just for unit tests purpose, please don't mind
_int_test = 42 _int_test = 42

View File

@ -32,6 +32,7 @@ _float = _float_test
_bool = _allow_dangerous_post_requests _bool = _allow_dangerous_post_requests
_bool_test _bool_test
_dev_mode _dev_mode
_enable_redis
_enable_users_management _enable_users_management
allow_multiple_audio_streams allow_multiple_audio_streams
allow_multiple_video_streams allow_multiple_video_streams

View File

@ -16,6 +16,7 @@ class TestActualParametersFile(unittest.TestCase):
self.assertFalse(self.config_manager.get_app_params().get('_enable_users_management')) self.assertFalse(self.config_manager.get_app_params().get('_enable_users_management'))
self.assertEqual('0.0.0.0', self.config_manager.get_app_params().get('_listen_ip')) self.assertEqual('0.0.0.0', self.config_manager.get_app_params().get('_listen_ip'))
self.assertFalse(self.config_manager.get_app_params().get('_allow_dangerous_post_requests')) self.assertFalse(self.config_manager.get_app_params().get('_allow_dangerous_post_requests'))
self.assertTrue(self.config_manager.get_app_params().get('_enable_redis'))
class TestConfig(unittest.TestCase): class TestConfig(unittest.TestCase):