Files
youtube-dl/lib/plugin/create_plugin.py

120 lines
4.2 KiB
Python

import os
import traceback
from flask import Blueprint
from framework import F
from support import SupportYaml
from . import (Logic, default_route, default_route_single_module,
get_model_setting)
from loguru import logger as logger1
class PluginBase(object):
package_name = None
logger = None
blueprint = None
menu = None
plugin_info = None
ModelSetting = None
logic = None
module_list = None
home_module = None
vars = []
def __init__(self, setting):
try:
logger1.debug(f"[DEBUG] PluginBase init for {setting.get('filepath')}")
is_system = ('system' == os.path.basename(os.path.dirname(setting['filepath'])))
self.status = ""
self.setting = setting
info_filepath = os.path.join(os.path.dirname(setting['filepath']), 'info.yaml')
if os.path.exists(info_filepath) == False and is_system == False:
return
if is_system:
self.package_name = 'system'
else:
self.plugin_info = SupportYaml.read_yaml(info_filepath)
self.package_name = self.plugin_info['package_name']
self.logger = F.get_logger(self.package_name)
self.blueprint = Blueprint(self.package_name, self.package_name, url_prefix=f'/{self.package_name}', template_folder=os.path.join(os.path.dirname(setting['filepath']), 'templates'), static_folder=os.path.join(os.path.dirname(setting['filepath']), 'static'))
self.menu = setting['menu']
logger1.debug(f"[DEBUG] Menu set for {self.package_name}: {self.menu}")
self.setting_menu = setting.get('setting_menu', None)
self.ModelSetting = None
if setting.get('use_db', True):
db_path = os.path.join(F.config['path_data'], 'db', f'{self.package_name}.db')
F.app.config['SQLALCHEMY_BINDS'][self.package_name] = f"sqlite:///{db_path}?check_same_thread=False"
if setting.get('use_default_setting', True):
self.ModelSetting = get_model_setting(self.package_name, self.logger)
self.module_list = []
self.home_module = setting.get('home_module')
self.status = "init_success"
self.config = {}
self.recent_menu_plugin_except_list = setting.get('recent_menu_plugin_except_list', [])
except Exception as e:
self.logger.error(f'Exception:{str(e)}')
self.logger.error(traceback.format_exc())
self.status = 'init_fail'
def set_module_list(self, mod_list):
try:
# self.module_list = []
for mod in mod_list:
logger1.debug(mod)
mod_ins = mod(self)
# self.logger.debug(mod_ins)
logger1.debug(mod_ins)
self.module_list.append(mod_ins)
if self.home_module == None:
self.home_module = self.module_list[0].name
except Exception as e:
F.logger.error(f'[{self.package_name}] Exception:{str(e)}')
F.logger.error(traceback.format_exc())
self.logic = Logic(self)
route_mode = self.setting.get('default_route', 'normal')
if route_mode == 'normal':
default_route(self)
elif route_mode == 'single':
default_route_single_module(self)
def plugin_load(self):
if self.logic:
self.logic.plugin_load()
def plugin_load_celery(self):
if self.logic:
self.logic.plugin_load_celery()
def plugin_unload(self):
if self.logic:
self.logic.plugin_unload()
def get_first_manual_path(self):
for __ in self.menu['list']:
if __['uri'] == 'manual' and len(__['list']) > 0:
return __['list'][0]['uri']
def get_module(self, sub):
try:
for module in self.module_list:
if module.name == sub:
return module
except Exception as e:
self.logger.error(f'Exception:{str(e)}')
#self.P.logger.error(traceback.format_exc())
def create_plugin_instance(config):
ins = PluginBase(config)
return ins