update plugman's async getter; and lil type fixes

This commit is contained in:
FluffyPal 2026-07-18 01:12:48 +08:00
parent d442c44ea8
commit dfa13959fd

View file

@ -4,6 +4,7 @@ import bauiv1 as bui
from bauiv1lib import popup, confirm from bauiv1lib import popup, confirm
from bauiv1lib.settings.allsettings import AllSettingsWindow from bauiv1lib.settings.allsettings import AllSettingsWindow
import urllib.error
import urllib.request import urllib.request
import http.client import http.client
import socket import socket
@ -12,7 +13,6 @@ import ssl
import re import re
import os import os
import sys
import copy import copy
import asyncio import asyncio
import pathlib import pathlib
@ -25,7 +25,7 @@ from datetime import datetime
# Modules used for overriding AllSettingsWindow # Modules used for overriding AllSettingsWindow
import logging import logging
PLUGIN_MANAGER_VERSION = "1.1.10" PLUGIN_MANAGER_VERSION = "1.1.11"
REPOSITORY_URL = "https://github.com/bombsquad-community/plugin-manager" REPOSITORY_URL = "https://github.com/bombsquad-community/plugin-manager"
# Current tag can be changed to "staging" or any other branch in # Current tag can be changed to "staging" or any other branch in
# plugin manager repo for testing purpose. # plugin manager repo for testing purpose.
@ -43,11 +43,9 @@ HEADERS = {
} }
PLUGIN_DIRECTORY = _env["python_directory_user"] PLUGIN_DIRECTORY = _env["python_directory_user"]
# compatibility for older API versions.
if _env.get("build_number", 0) < 22714:
babase._asyncio._g_asyncio_event_loop = babase._asyncio._asyncio_event_loop
loop = babase._asyncio._g_asyncio_event_loop loop = babase.app.asyncio_loop
pool = babase.app.threadpool
open_popups = [] open_popups = []
@ -130,7 +128,7 @@ def send_network_request(request):
async def async_send_network_request(request): async def async_send_network_request(request):
response = await loop.run_in_executor(None, send_network_request, request) response = await loop.run_in_executor(pool, send_network_request, request)
return response return response
@ -160,7 +158,7 @@ def stream_network_response_to_file(request, file, md5sum=None, retries=3):
async def async_stream_network_response_to_file(request, file, md5sum=None, retries=3): async def async_stream_network_response_to_file(request, file, md5sum=None, retries=3):
content = await loop.run_in_executor( content = await loop.run_in_executor(
None, pool,
stream_network_response_to_file, stream_network_response_to_file,
request, request,
file, file,
@ -201,40 +199,45 @@ class DNSBlockWorkaround:
_google_dns_cache = {} _google_dns_cache = {}
def apply(): @classmethod
def apply(cls):
opener = urllib.request.build_opener( opener = urllib.request.build_opener(
DNSBlockWorkaround._HTTPHandler, cls._HTTPHandler,
DNSBlockWorkaround._HTTPSHandler, cls._HTTPSHandler,
) )
urllib.request.install_opener(opener) urllib.request.install_opener(opener)
def _resolve_using_google_dns(hostname): @classmethod
def _resolve_using_google_dns(cls, hostname):
response = urllib.request.urlopen(f"https://dns.google/resolve?name={hostname}") response = urllib.request.urlopen(f"https://dns.google/resolve?name={hostname}")
response = response.read() response = response.read()
response = json.loads(response) response = json.loads(response)
resolved_host = response["Answer"][0]["data"] resolved_host = response["Answer"][0]["data"]
return resolved_host return resolved_host
def _resolve_using_system_dns(hostname): @classmethod
def _resolve_using_system_dns(cls, hostname):
resolved_host = socket.gethostbyname(hostname) resolved_host = socket.gethostbyname(hostname)
return resolved_host return resolved_host
def _resolve_with_workaround(hostname): @classmethod
resolved_host_from_cache = DNSBlockWorkaround._google_dns_cache.get(hostname) def _resolve_with_workaround(cls, hostname):
resolved_host_from_cache = cls._google_dns_cache.get(hostname)
if resolved_host_from_cache: if resolved_host_from_cache:
return resolved_host_from_cache return resolved_host_from_cache
resolved_host_by_system_dns = DNSBlockWorkaround._resolve_using_system_dns(hostname) resolved_host_by_system_dns = cls._resolve_using_system_dns(hostname)
if DNSBlockWorkaround._is_blocked(hostname, resolved_host_by_system_dns): if cls._is_blocked(hostname, resolved_host_by_system_dns):
resolved_host = DNSBlockWorkaround._resolve_using_google_dns(hostname) resolved_host = cls._resolve_using_google_dns(hostname)
DNSBlockWorkaround._google_dns_cache[hostname] = resolved_host cls._google_dns_cache[hostname] = resolved_host
else: else:
resolved_host = resolved_host_by_system_dns resolved_host = resolved_host_by_system_dns
return resolved_host return resolved_host
def _is_blocked(hostname, address): @classmethod
def _is_blocked(cls, hostname, address):
is_blocked = False is_blocked = False
if hostname == "raw.githubusercontent.com": if hostname == "raw.githubusercontent.com":
# Jio's DNS server may be blocking it. # Jio's DNS server may be blocking it.
@ -578,7 +581,7 @@ class PluginLocal:
if not self.is_installed: if not self.is_installed:
raise PluginNotInstalled("Plugin is not available locally.") raise PluginNotInstalled("Plugin is not available locally.")
self._content = await loop.run_in_executor(None, self._get_content) self._content = await loop.run_in_executor(pool, self._get_content)
return self._content return self._content
async def get_api_version(self): async def get_api_version(self):
@ -659,7 +662,7 @@ class PluginLocal:
self.save() self.save()
def load_plugin(self, entry_point): def load_plugin(self, entry_point):
plugin_class = babase._general.getclass(entry_point, babase.Plugin) plugin_class = babase.getclass(entry_point, babase.Plugin)
loaded_plugin_instance = plugin_class() loaded_plugin_instance = plugin_class()
loaded_plugin_instance.on_app_running() loaded_plugin_instance.on_app_running()
@ -683,7 +686,7 @@ class PluginLocal:
async def set_content(self, content): async def set_content(self, content):
if not self._content: if not self._content:
await loop.run_in_executor(None, self._set_content, content) await loop.run_in_executor(pool, self._set_content, content)
self._content = content self._content = content
return self return self
@ -869,7 +872,7 @@ class PluginManager:
self._index = _CACHE.get("index", {}) self._index = _CACHE.get("index", {})
self._changelog = _CACHE.get("changelog", {}) self._changelog = _CACHE.get("changelog", {})
self.categories = {} self.categories = {}
self.module_path = sys.modules[__name__].__file__ self.module_path = __file__
self._index_setup_in_progress = False self._index_setup_in_progress = False
self._changelog_setup_in_progress = False self._changelog_setup_in_progress = False
@ -899,7 +902,7 @@ class PluginManager:
await self.setup_plugin_categories(index) await self.setup_plugin_categories(index)
self._index_setup_in_progress = False self._index_setup_in_progress = False
async def get_changelog(self) -> list[str, bool]: async def get_changelog(self) -> tuple[str, bool]:
requested = False requested = False
if not self._changelog: if not self._changelog:
request = urllib.request.Request(CHANGELOG_META.format( request = urllib.request.Request(CHANGELOG_META.format(
@ -911,7 +914,7 @@ class PluginManager:
response = await async_send_network_request(request) response = await async_send_network_request(request)
self._changelog = response.read().decode() self._changelog = response.read().decode()
requested = True requested = True
return [self._changelog, requested] return self._changelog, requested
async def setup_changelog(self, version=None) -> None: async def setup_changelog(self, version=None) -> None:
if version is None: if version is None:
@ -930,6 +933,7 @@ class PluginManager:
released_on = full_changelog[0].split(version)[1].split('\n')[0] released_on = full_changelog[0].split(version)[1].split('\n')[0]
matches = re.findall(pattern, full_changelog[0], re.DOTALL) matches = re.findall(pattern, full_changelog[0], re.DOTALL)
else: else:
released_on = ' (Not Provided)'
matches = None matches = None
if matches: if matches:
@ -938,7 +942,7 @@ class PluginManager:
'info': matches[0].strip() 'info': matches[0].strip()
} }
else: else:
changelog = {'released_on': ' (Not Provided)', changelog = {'released_on': released_on,
'info': f"Changelog entry for version {version} not found."} 'info': f"Changelog entry for version {version} not found."}
else: else:
changelog = full_changelog[0] changelog = full_changelog[0]
@ -1735,6 +1739,7 @@ class PluginWindow(popup.PopupWindow):
_remove_popup(self) _remove_popup(self)
bui.containerwidget(edit=self._root_widget, transition='out_scale') bui.containerwidget(edit=self._root_widget, transition='out_scale')
@staticmethod
def button(fn): def button(fn):
async def asyncio_handler(fn, self, *args, **kwargs): async def asyncio_handler(fn, self, *args, **kwargs):
await fn(self, *args, **kwargs) await fn(self, *args, **kwargs)
@ -2260,8 +2265,8 @@ class PluginManagerWindow(bui.MainWindow):
def __init__( def __init__(
self, self,
transition: str = "in_right", transition: str | None = "in_right",
origin_widget: bui.Widget = None origin_widget: bui.Widget | None = None
): ):
self.plugin_manager = PluginManager() self.plugin_manager = PluginManager()
self.category_selection_button = None self.category_selection_button = None
@ -3419,7 +3424,6 @@ class EntryPoint(babase.Plugin):
from bauiv1lib.settings import allsettings from bauiv1lib.settings import allsettings
allsettings.AllSettingsWindow = NewAllSettingsWindow allsettings.AllSettingsWindow = NewAllSettingsWindow
DNSBlockWorkaround.apply() DNSBlockWorkaround.apply()
asyncio.set_event_loop(babase._asyncio._g_asyncio_event_loop)
startup_tasks = StartupTasks() startup_tasks = StartupTasks()
loop.create_task(startup_tasks.execute()) loop.create_task(startup_tasks.execute())