def reload_plugin_from_disk(self): # Fetch list of installed plugins plugins = PluginsHandler() order = [{ "column": 'name', "dir": 'asc', }] plugin_results = plugins.get_plugin_list_filtered_and_sorted( order=order, start=0, length=None) # Build choice selection list from installed plugins for plugin in plugin_results: plugin_path = os.path.join(self.plugins_directory, plugin.get('plugin_id')) # Read plugin info.json info_file = os.path.join(plugin_path, 'info.json') with open(info_file) as json_file: plugin_info = json.load(json_file) # Insert plugin details to DB try: PluginsHandler.write_plugin_data_to_db(plugin_info, plugin_path) except Exception as e: print("Exception while saving plugin info to DB. - {}".format( str(e))) return install_plugin_requirements(plugin_path) print() print()
def list_installed_plugins(): plugins = PluginsHandler() order = { "column": 'position', "dir": 'desc', } plugin_results = plugins.get_plugin_list_filtered_and_sorted(order=order, start=0, length=None) print_table(plugin_results) print()
def __get_enabled_plugins(self): """ Returns a list of enabled plugins :return: """ from unmanic.libs.plugins import PluginsHandler plugin_handler = PluginsHandler() return plugin_handler.get_plugin_list_filtered_and_sorted( order=self.plugin_sort_order, enabled=True)
def __get_plugin_info_and_settings(self, plugin_id): plugins = PluginsHandler() plugin_installed = True plugin_results = plugins.get_plugin_list_filtered_and_sorted( plugin_id=plugin_id) if not plugin_results: # This plugin is not installed plugin_installed = False # Try to fetch it from the repository plugin_list = plugins.get_installable_plugins_list() for plugin in plugin_list: if plugin.get('id') == plugin_id: # Create changelog text from remote changelog text file plugin['changelog'] = plugins.read_remote_changelog_file( plugin.get('changelog_url')) # Create list as the 'plugin_results' var above will also have returned a list if any results were found. plugin_results = [plugin] break # Iterate over plugins and append them to the plugin data plugin_data = {} for plugin_result in plugin_results: # Set params as required in template plugin_data = { 'id': plugin_result.get('id'), 'plugin_id': plugin_result.get('plugin_id'), 'icon': plugin_result.get('icon'), 'name': plugin_result.get('name'), 'description': plugin_result.get('description'), 'tags': plugin_result.get('tags'), 'author': plugin_result.get('author'), 'version': plugin_result.get('version'), 'changelog': plugin_result.get('changelog', ''), 'settings': [], } if plugin_installed: plugin_data['settings'] = self.__get_plugin_settings( plugin_result.get('plugin_id')) plugin_data['changelog'] = "".join( self.__get_plugin_changelog( plugin_result.get('plugin_id'))) plugin_data['description'] += "\n" + "".join( self.__get_plugin_long_description( plugin_result.get('plugin_id'))) break return plugin_data
def test_installed_plugins(): """ Test all plugin runners for correct return data :return: """ plugin_executor = PluginExecutor() plugins = PluginsHandler() order = { "column": 'position', "dir": 'desc', } plugin_results = plugins.get_plugin_list_filtered_and_sorted(order=order, start=0, length=None) for plugin_result in plugin_results: # plugin_runners = plugin_executor.get_plugin_runners('worker.process_item') print("{1}Testing plugin: '{0}'{2}".format(plugin_result.get("name"), BColours.HEADER, BColours.ENDC)) plugin_id = plugin_result.get("plugin_id") # Test Plugin runners print(" {0}Testing runners{1}".format(BColours.SUBHEADER, BColours.ENDC)) plugin_types_in_plugin = plugin_executor.get_all_plugin_types_in_plugin(plugin_id) if not plugin_types_in_plugin: error = "No runners found in plugin" print(" - {1}FAILED: {0}{2}".format(error, BColours.FAIL, BColours.ENDC)) else: for plugin_type_in_plugin in plugin_types_in_plugin: errors = plugin_executor.test_plugin_runner(plugin_id, plugin_type_in_plugin) if errors: for error in errors: print(" - {1}FAILED: {0}{2}".format(error, BColours.FAIL, BColours.ENDC)) else: print(" - {}PASSED{}".format(BColours.OKGREEN, BColours.ENDC)) # Test Plugin settings print(" {0}Testing settings{1}".format(BColours.SUBHEADER, BColours.ENDC)) errors, plugin_settings = plugin_executor.test_plugin_settings(plugin_id) if errors: for error in errors: print(" - {1}FAILED: {0}{2}".format(error, BColours.FAIL, BColours.ENDC)) else: formatted_plugin_settings = json.dumps(plugin_settings, indent=1) formatted_plugin_settings = formatted_plugin_settings.replace('\n', '\n' + ' ') print(" - {1}Settings: {0}{2}".format(formatted_plugin_settings, BColours.RESULTS, BColours.ENDC)) print(" - {}PASSED{}".format(BColours.OKGREEN, BColours.ENDC)) print()
def check_if_plugin_is_installed(plugin_id): """ Returns true if the given plugin is installed :param plugin_id: :return: """ plugins_handler = PluginsHandler() plugin_installed = True plugin_results = plugins_handler.get_plugin_list_filtered_and_sorted( plugin_id=plugin_id) if not plugin_results: # This plugin is not installed plugin_installed = False return plugin_installed
def __get_plugin_info_and_settings(self, plugin_id): plugins = PluginsHandler() plugin_installed = True plugin_results = plugins.get_plugin_list_filtered_and_sorted( plugin_id=plugin_id) if not plugin_results: # This plugin is not installed plugin_installed = False # Try to fetch it from the repository plugin_list = plugins.get_installable_plugins_list() for plugin in plugin_list: if plugin.get('id') == plugin_id: plugin_results = [plugin] break # Iterate over plugins and append them to the plugin data plugin_data = {} for plugin_result in plugin_results: # Set params as required in template plugin_data = { 'id': plugin_result.get('id'), 'plugin_id': plugin_result.get('plugin_id'), 'icon': plugin_result.get('icon'), 'name': plugin_result.get('name'), 'description': plugin_result.get('description'), 'tags': plugin_result.get('tags'), 'author': plugin_result.get('author'), 'version': plugin_result.get('version'), 'settings': [], } if plugin_installed: plugin_data['settings'] = self.__get_plugin_settings( plugin_result.get('plugin_id')) plugin_data['changelog'] = "".join( self.__get_plugin_changelog( plugin_result.get('plugin_id'))) break return plugin_data
def __get_enabled_plugins(self, plugin_type=None): """ Returns a list of enabled plugins :return: """ from unmanic.libs.plugins import PluginsHandler plugin_handler = PluginsHandler() order = [ { "model": PluginFlow, "column": 'position', "dir": 'asc', }, { "column": 'name', "dir": 'asc', }, ] return plugin_handler.get_plugin_list_filtered_and_sorted( order=order, enabled=True, plugin_type=plugin_type)
def remove_plugin(): # Fetch list of installed plugins plugins = PluginsHandler() order = [{ "column": 'name', "dir": 'asc', }] plugin_results = plugins.get_plugin_list_filtered_and_sorted( order=order, start=0, length=None) # Build choice selection list from installed plugins table_ids = {} choices = [] for plugin in plugin_results: choices.append(plugin.get('plugin_id')) table_ids[plugin.get('plugin_id')] = plugin.get('id') # Append a "return" option choices.append('Return') # Generate menu menu remove_plugin_inquirer = inquirer.List( 'cli_action', message="Which Plugin would you like to remove?", choices=choices, ) # Prompt for selection of Plugin by ID selection = inquirer.prompt([remove_plugin_inquirer]) # If the 'Return' option was given, just return to previous menu if selection.get('cli_action') == "Return": return # Remove the selected Plugin by ID plugin_table_id = table_ids[selection.get('cli_action')] plugins.uninstall_plugins_by_db_table_id([plugin_table_id]) print()
def prepare_filtered_plugins(self, request_dict): """ Returns a object of records filtered and sorted according to the provided request. :param request_dict: :return: """ # Generate filters for query start = request_dict.get('start') length = request_dict.get('length') search = request_dict.get('search') search_value = search.get("value") # Force sort order always by ID desc order = [{ "column": 'name', "dir": 'asc', }] # Fetch Plugins plugins = PluginsHandler() # Get total count records_total_count = plugins.get_total_plugin_list_count() # Get quantity after filters (without pagination) records_filtered_count = plugins.get_plugin_list_filtered_and_sorted( order=order, start=0, length=0, search_value=search_value).count() # Get filtered/sorted results plugin_results = plugins.get_plugin_list_filtered_and_sorted( order=order, start=start, length=length, search_value=search_value) # Build return data return_data = { "draw": request_dict.get('draw'), "recordsTotal": records_total_count, "recordsFiltered": records_filtered_count, "successCount": 0, "failedCount": 0, "data": [] } # Iterate over plugins and append them to the plugin data for plugin_result in plugin_results: # Set plugin status plugin_status = { "enabled": plugin_result.get('enabled'), "update_available": plugin_result.get('update_available'), } # Set params as required in template item = { 'id': plugin_result.get('id'), 'plugin_id': plugin_result.get('plugin_id'), 'icon': plugin_result.get('icon'), 'name': plugin_result.get('name'), 'description': plugin_result.get('description'), 'tags': plugin_result.get('tags'), 'author': plugin_result.get('author'), 'version': plugin_result.get('version'), 'status': plugin_status, 'selected': False, } return_data["data"].append(item) # Return results return return_data
def prepare_filtered_plugins(params): """ Returns a object of records filtered and sorted according to the provided request. :param params: :return: """ start = params.get('start', 0) length = params.get('length', 0) search_value = params.get('search_value', '') # Note that plugins can be ordered in multiple ways. So this must be a list order = [params.get('order', { "column": 'name', "dir": 'desc', })] # Fetch Plugins plugins = PluginsHandler() plugin_executor = PluginExecutor() # Get total count records_total_count = plugins.get_total_plugin_list_count() # Get quantity after filters (without pagination) records_filtered_count = plugins.get_plugin_list_filtered_and_sorted( order=order, start=0, length=0, search_value=search_value).count() # Get filtered/sorted results plugin_results = plugins.get_plugin_list_filtered_and_sorted( order=order, start=start, length=length, search_value=search_value) # Build return data return_data = { "recordsTotal": records_total_count, "recordsFiltered": records_filtered_count, "results": [] } # Iterate over plugins and append them to the plugin data for plugin_result in plugin_results: # Set plugin status plugin_status = { "update_available": plugin_result.get('update_available'), } # Check if plugin is able to be configured has_config = False plugin_settings, plugin_settings_meta = plugin_executor.get_plugin_settings( plugin_result.get('plugin_id')) if plugin_settings: has_config = True # Set params as required in template item = { 'id': plugin_result.get('id'), 'plugin_id': plugin_result.get('plugin_id'), 'icon': plugin_result.get('icon'), 'name': plugin_result.get('name'), 'description': plugin_result.get('description'), 'tags': plugin_result.get('tags'), 'author': plugin_result.get('author'), 'version': plugin_result.get('version'), 'status': plugin_status, 'has_config': has_config, } return_data["results"].append(item) # Return results return return_data
def prepare_plugin_info_and_settings(plugin_id, prefer_local=True, library_id=None): """ Returns a object of plugin metadata and current settings for the requested plugin_id :param prefer_local: :param plugin_id: :param library_id: :return: """ plugins_handler = PluginsHandler() plugin_installed = True plugin_results = plugins_handler.get_plugin_list_filtered_and_sorted( plugin_id=plugin_id) if not plugin_results: # This plugin is not installed plugin_installed = False if not plugin_results or not prefer_local: # Try to fetch it from the repository plugin_list = plugins_handler.get_installable_plugins_list() for plugin in plugin_list: if plugin.get('plugin_id') == plugin_id: # Create changelog text from remote changelog text file plugin[ 'changelog'] = plugins_handler.read_remote_changelog_file( plugin.get('changelog_url')) # Create list as the 'plugin_results' var above will also have returned a list if any results were found. plugin_results = [plugin] break # Iterate over plugins and append them to the plugin data plugin_data = {} for plugin_result in plugin_results: # Set plugin status plugin_status = { "installed": plugin_result.get('installed', False), "update_available": plugin_result.get('update_available', False), } # Set params as required in template plugin_data = { 'id': plugin_result.get('id'), 'plugin_id': plugin_result.get('plugin_id'), 'icon': plugin_result.get('icon'), 'name': plugin_result.get('name'), 'description': plugin_result.get('description'), 'tags': plugin_result.get('tags'), 'author': plugin_result.get('author'), 'version': plugin_result.get('version'), 'changelog': plugin_result.get('changelog', ''), 'status': plugin_status, 'settings': [], } if plugin_installed: plugin_data['settings'] = get_plugin_settings( plugin_result.get('plugin_id'), library_id=library_id) plugin_data['changelog'] = "".join( get_plugin_changelog(plugin_result.get('plugin_id'))) plugin_data['description'] += "\n" + "".join( get_plugin_long_description(plugin_result.get('plugin_id'))) break return plugin_data