ArchiveBox/archivebox/builtin_plugins/puppeteer/apps.py
2024-09-17 00:48:47 -07:00

85 lines
2.3 KiB
Python

from typing import List, Optional
from django.conf import settings
# Depends on other PyPI/vendor packages:
from pydantic import InstanceOf, Field
from pydantic_pkgr import BinProvider, BinName
# Depends on other Django apps:
from plugantic.base_plugin import BasePlugin
from plugantic.base_configset import BaseConfigSet, ConfigSectionName
from plugantic.base_binary import BaseBinary, env
# from plugantic.base_extractor import BaseExtractor
# from plugantic.base_queue import BaseQueue
from plugantic.base_hook import BaseHook
from plugantic.ansible_utils import run_playbook
# Depends on Other Plugins:
from builtin_plugins.npm.apps import npm
###################### Config ##########################
class PuppeteerDependencyConfigs(BaseConfigSet):
section: ConfigSectionName = 'DEPENDENCY_CONFIG'
PUPPETEER_BINARY: str = Field(default='wget')
PUPPETEER_ARGS: Optional[List[str]] = Field(default=None)
PUPPETEER_EXTRA_ARGS: List[str] = []
PUPPETEER_DEFAULT_ARGS: List[str] = ['--timeout={TIMEOUT-10}']
class PuppeteerConfigs(PuppeteerDependencyConfigs):
# section: ConfigSectionName = 'ALL_CONFIGS'
pass
DEFAULT_GLOBAL_CONFIG = {
}
PUPPETEER_CONFIG = PuppeteerConfigs(**DEFAULT_GLOBAL_CONFIG)
INSTALL_BIN = './install_puppeteer.yml'
class ChromeBinary(BaseBinary):
name: BinName = 'chrome'
binproviders_supported: List[InstanceOf[BinProvider]] = [npm, env]
def install(self, *args, quiet=False) -> "ChromeBinary":
install_playbook = self.plugin_dir / 'install_puppeteer.yml'
chrome_bin = run_playbook(install_playbook, data_dir=settings.CONFIG.OUTPUT_DIR, quiet=quiet).BINARIES.chrome
return self.__class__.model_validate(
{
**self.model_dump(),
"loaded_abspath": chrome_bin.symlink,
"loaded_version": chrome_bin.version,
"loaded_binprovider": env,
"binproviders_supported": self.binproviders_supported,
}
)
CHROME_BINARY = ChromeBinary()
PLUGIN_BINARIES = [CHROME_BINARY]
class PuppeteerPlugin(BasePlugin):
app_label: str ='puppeteer'
verbose_name: str = 'SingleFile'
hooks: List[InstanceOf[BaseHook]] = [
PUPPETEER_CONFIG,
CHROME_BINARY,
]
PLUGIN = PuppeteerPlugin()
PLUGIN.register(settings)
DJANGO_APP = PLUGIN.AppConfig