apps.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from pathlib import Path
  2. from typing import List, Dict, Optional
  3. from django.apps import AppConfig
  4. # Depends on other PyPI/vendor packages:
  5. from pydantic import InstanceOf, Field
  6. from pydantic_pkgr import BinProvider, BinProviderName, ProviderLookupDict, BinName
  7. from pydantic_pkgr.binprovider import bin_abspath
  8. # Depends on other Django apps:
  9. from plugantic.base_plugin import BasePlugin, BaseConfigSet, BaseBinary, BaseExtractor, BaseReplayer
  10. from plugantic.base_configset import ConfigSectionName
  11. # Depends on Other Plugins:
  12. from pkg.settings import env
  13. from builtin_plugins.npm.apps import npm
  14. ###################### Config ##########################
  15. class SinglefileToggleConfigs(BaseConfigSet):
  16. section: ConfigSectionName = 'ARCHIVE_METHOD_TOGGLES'
  17. SAVE_SINGLEFILE: bool = True
  18. class SinglefileOptionsConfigs(BaseConfigSet):
  19. section: ConfigSectionName = 'ARCHIVE_METHOD_OPTIONS'
  20. # loaded from shared config
  21. SINGLEFILE_USER_AGENT: str = Field(default='', alias='USER_AGENT')
  22. SINGLEFILE_TIMEOUT: int = Field(default=60, alias='TIMEOUT')
  23. SINGLEFILE_CHECK_SSL_VALIDITY: bool = Field(default=True, alias='CHECK_SSL_VALIDITY')
  24. SINGLEFILE_RESTRICT_FILE_NAMES: str = Field(default='windows', alias='RESTRICT_FILE_NAMES')
  25. SINGLEFILE_COOKIES_FILE: Optional[Path] = Field(default=None, alias='COOKIES_FILE')
  26. class SinglefileDependencyConfigs(BaseConfigSet):
  27. section: ConfigSectionName = 'DEPENDENCY_CONFIG'
  28. SINGLEFILE_BINARY: str = Field(default='wget')
  29. SINGLEFILE_ARGS: Optional[List[str]] = Field(default=None)
  30. SINGLEFILE_EXTRA_ARGS: List[str] = []
  31. SINGLEFILE_DEFAULT_ARGS: List[str] = ['--timeout={TIMEOUT-10}']
  32. class SinglefileConfigs(SinglefileToggleConfigs, SinglefileOptionsConfigs, SinglefileDependencyConfigs):
  33. # section: ConfigSectionName = 'ALL_CONFIGS'
  34. pass
  35. DEFAULT_GLOBAL_CONFIG = {
  36. 'CHECK_SSL_VALIDITY': False,
  37. 'SAVE_SINGLEFILE': True,
  38. 'TIMEOUT': 120,
  39. }
  40. SINGLEFILE_CONFIGS = [
  41. SinglefileToggleConfigs(**DEFAULT_GLOBAL_CONFIG),
  42. SinglefileDependencyConfigs(**DEFAULT_GLOBAL_CONFIG),
  43. SinglefileOptionsConfigs(**DEFAULT_GLOBAL_CONFIG),
  44. ]
  45. min_version: str = "1.1.54"
  46. max_version: str = "2.0.0"
  47. def get_singlefile_abspath() -> Optional[Path]:
  48. return
  49. class SinglefileBinary(BaseBinary):
  50. name: BinName = 'single-file'
  51. binproviders_supported: List[InstanceOf[BinProvider]] = [npm, env]
  52. provider_overrides: Dict[BinProviderName, ProviderLookupDict] ={
  53. # 'env': {
  54. # 'abspath': lambda: bin_abspath('single-file-node.js', PATH=env.PATH) or bin_abspath('single-file', PATH=env.PATH),
  55. # },
  56. # 'npm': {
  57. # 'abspath': lambda: bin_abspath('single-file', PATH=npm.PATH) or bin_abspath('single-file-node.js', PATH=npm.PATH),
  58. # 'subdeps': lambda: f'single-file-cli@>={min_version} <{max_version}',
  59. # },
  60. }
  61. SINGLEFILE_BINARY = SinglefileBinary()
  62. PLUGIN_BINARIES = [SINGLEFILE_BINARY]
  63. class SinglefileExtractor(BaseExtractor):
  64. name: str = 'singlefile'
  65. binary: BinName = SINGLEFILE_BINARY.name
  66. def get_output_path(self, snapshot) -> Path:
  67. return Path(snapshot.link_dir) / 'singlefile.html'
  68. SINGLEFILE_BINARY = SinglefileBinary()
  69. SINGLEFILE_EXTRACTOR = SinglefileExtractor()
  70. class SinglefilePlugin(BasePlugin):
  71. name: str = 'builtin_plugins.singlefile'
  72. app_label: str ='singlefile'
  73. verbose_name: str = 'SingleFile'
  74. configs: List[InstanceOf[BaseConfigSet]] = SINGLEFILE_CONFIGS
  75. binaries: List[InstanceOf[BaseBinary]] = [SINGLEFILE_BINARY]
  76. extractors: List[InstanceOf[BaseExtractor]] = [SINGLEFILE_EXTRACTOR]
  77. PLUGIN = SinglefilePlugin()
  78. DJANGO_APP = PLUGIN.AppConfig
  79. # CONFIGS = PLUGIN.configs
  80. # BINARIES = PLUGIN.binaries
  81. # EXTRACTORS = PLUGIN.extractors
  82. # REPLAYERS = PLUGIN.replayers
  83. # CHECKS = PLUGIN.checks