Skip to content

Commit

Permalink
Merge pull request #63 from lgc2333/master
Browse files Browse the repository at this point in the history
support pydantic v2 & make ruff happy
  • Loading branch information
kexue-z committed Feb 16, 2024
2 parents 0341484 + 6319572 commit 6d985ca
Show file tree
Hide file tree
Showing 8 changed files with 1,011 additions and 1,814 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ htmlrender_download_host = ""
htmlrender_proxy_host = "http://127.0.0.1:7890"

# 浏览器 channel 支持以下
# "chrome", "chrome-beta", "chrome-dev", "chrome-canary",
# "chrome", "chrome-beta", "chrome-dev", "chrome-canary",
# "msedge", "msedge-beta", "msedge-dev", "msedge-canary"
# 手动编辑可以直接使用系统自带浏览器而不用重新下载 chromium
# 可不写
Expand Down
29 changes: 16 additions & 13 deletions nonebot_plugin_htmlrender/__init__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import nonebot
from nonebot.log import logger
from nonebot.plugin import PluginMetadata

from .browser import get_browser, get_new_page, shutdown_browser
from .browser import (
get_browser as get_browser,
get_new_page as get_new_page,
shutdown_browser as shutdown_browser,
)
from .data_source import (
md_to_pic,
html_to_pic,
text_to_pic,
capture_element,
template_to_pic,
template_to_html,
capture_element as capture_element,
html_to_pic as html_to_pic,
md_to_pic as md_to_pic,
template_to_html as template_to_html,
template_to_pic as template_to_pic,
text_to_pic as text_to_pic,
)
from nonebot.plugin import PluginMetadata

__plugin_meta__ = PluginMetadata(
name="nonebot-plugin-htmlrender",
Expand All @@ -22,7 +26,6 @@
)

driver = nonebot.get_driver()
config = driver.config


@driver.on_startup
Expand All @@ -45,13 +48,13 @@ async def shutdown():

browser_init = init

all = [
__all__ = [
"browser_init",
"text_to_pic",
"capture_element",
"get_new_page",
"html_to_pic",
"md_to_pic",
"template_to_html",
"template_to_pic",
"html_to_pic",
"capture_element",
"text_to_pic",
]
24 changes: 9 additions & 15 deletions nonebot_plugin_htmlrender/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,16 @@
"""
__author__ = "yanyongyu"

from typing import Optional, AsyncIterator
from contextlib import asynccontextmanager
from typing import AsyncIterator, Optional

from nonebot import get_driver
from nonebot import get_plugin_config
from nonebot.log import logger
from playwright.async_api import Page, Error, Browser, Playwright, async_playwright
from playwright.async_api import Browser, Error, Page, Playwright, async_playwright

from nonebot_plugin_htmlrender.config import Config
from .config import Config


class ConfigError(Exception):
pass


config = Config.parse_obj(get_driver().config.dict())
config = get_plugin_config(Config)

_browser: Optional[Browser] = None
_playwright: Optional[Playwright] = None
Expand Down Expand Up @@ -56,10 +51,9 @@ async def launch_browser(**kwargs) -> Browser:
logger.info("使用 firefox 启动")
return await _playwright.firefox.launch(**kwargs)

else:
# 默认使用 chromium
logger.info("使用 chromium 启动")
return await _playwright.chromium.launch(**kwargs)
# 默认使用 chromium
logger.info("使用 chromium 启动")
return await _playwright.chromium.launch(**kwargs)


async def get_browser(**kwargs) -> Browser:
Expand Down Expand Up @@ -112,7 +106,7 @@ async def install_browser():
sys.argv = ["", "install", "chromium"]
try:
logger.info("正在安装依赖")
os.system("playwright install-deps")
os.system("playwright install-deps") # noqa: ASYNC102, S605, S607
main()
except SystemExit as e:
if e.code == 0:
Expand Down
8 changes: 4 additions & 4 deletions nonebot_plugin_htmlrender/config.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import Optional

from pydantic import Extra, BaseModel
from pydantic import BaseModel, Extra


class Config(BaseModel, extra=Extra.ignore):
htmlrender_browser: Optional[str] = "chromium"
htmlrender_download_host: Optional[str]
htmlrender_proxy_host: Optional[str]
htmlrender_browser_channel: Optional[str]
htmlrender_download_host: Optional[str] = None
htmlrender_proxy_host: Optional[str] = None
htmlrender_browser_channel: Optional[str] = None
60 changes: 30 additions & 30 deletions nonebot_plugin_htmlrender/data_source.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
from os import getcwd
from typing import Union, Literal
from pathlib import Path
from typing import Literal, Optional, Union

import jinja2
import aiofiles
import jinja2
import markdown
from nonebot.log import logger

from .browser import get_new_page

TEMPLATES_PATH = str(Path(__file__).parent / "templates")

env = jinja2.Environment(
env = jinja2.Environment( # noqa: S701
extensions=["jinja2.ext.loopcontrols"],
loader=jinja2.FileSystemLoader(TEMPLATES_PATH),
enable_async=True,
Expand All @@ -22,9 +22,9 @@ async def text_to_pic(
text: str,
css_path: str = "",
width: int = 500,
type: Literal["jpeg", "png"] = "png",
type: Literal["jpeg", "png"] = "png", # noqa: A002
quality: Union[int, None] = None,
device_scale_factor: float=2
device_scale_factor: float = 2,
) -> bytes:
"""多行文本转图片
Expand All @@ -35,7 +35,7 @@ async def text_to_pic(
type (Literal["jpeg", "png"]): 图片类型, 默认 png
quality (int, optional): 图片质量 0-100 当为`png`时无效
device_scale_factor: 缩放比例,类型为float,值越大越清晰(真正想让图片清晰更优先请调整此选项)
Returns:
bytes: 图片, 可直接发送
"""
Expand All @@ -50,7 +50,7 @@ async def text_to_pic(
viewport={"width": width, "height": 10},
type=type,
quality=quality,
device_scale_factor=device_scale_factor
device_scale_factor=device_scale_factor,
)


Expand All @@ -59,12 +59,12 @@ async def md_to_pic(
md_path: str = "",
css_path: str = "",
width: int = 500,
type: Literal["jpeg", "png"] = "png",
type: Literal["jpeg", "png"] = "png", # noqa: A002
quality: Union[int, None] = None,
device_scale_factor:float = 2
device_scale_factor: float = 2,
) -> bytes:
"""markdown 转 图片
Args:
md (str, optional): markdown 格式文本
md_path (str, optional): markdown 文件路径
Expand All @@ -73,7 +73,7 @@ async def md_to_pic(
type (Literal["jpeg", "png"]): 图片类型, 默认 png
quality (int, optional): 图片质量 0-100 当为`png`时无效
device_scale_factor: 缩放比例,类型为float,值越大越清晰(真正想让图片清晰更优先请调整此选项)
Returns:
bytes: 图片, 可直接发送
"""
Expand Down Expand Up @@ -113,7 +113,7 @@ async def md_to_pic(
css = await read_file(css_path)
else:
css = await read_tpl("github-markdown-light.css") + await read_tpl(
"pygments-default.css"
"pygments-default.css",
)

return await html_to_pic(
Expand All @@ -122,7 +122,7 @@ async def md_to_pic(
viewport={"width": width, "height": 10},
type=type,
quality=quality,
device_scale_factor = device_scale_factor
device_scale_factor=device_scale_factor,
)


Expand Down Expand Up @@ -156,7 +156,7 @@ async def template_to_html(
str: html
"""

template_env = jinja2.Environment(
template_env = jinja2.Environment( # noqa: S701
loader=jinja2.FileSystemLoader(template_path),
enable_async=True,
)
Expand All @@ -168,10 +168,10 @@ async def template_to_html(
async def html_to_pic(
html: str,
wait: int = 0,
template_path: str = f"file://{getcwd()}",
type: Literal["jpeg", "png"] = "png",
template_path: str = f"file://{getcwd()}", # noqa: PTH109
type: Literal["jpeg", "png"] = "png", # noqa: A002
quality: Union[int, None] = None,
device_scale_factor:float = 2,
device_scale_factor: float = 2,
**kwargs,
) -> bytes:
"""html转图片
Expand All @@ -191,30 +191,26 @@ async def html_to_pic(
# logger.debug(f"html:\n{html}")
if "file:" not in template_path:
raise Exception("template_path 应该为 file:///path/to/template")
async with get_new_page(device_scale_factor,**kwargs) as page:
async with get_new_page(device_scale_factor, **kwargs) as page:
await page.goto(template_path)
await page.set_content(html, wait_until="networkidle")
await page.wait_for_timeout(wait)
img_raw = await page.screenshot(
return await page.screenshot(
full_page=True,
type=type,
quality=quality,
)
return img_raw


async def template_to_pic(
template_path: str,
template_name: str,
templates: dict,
pages: dict = {
"viewport": {"width": 500, "height": 10},
"base_url": f"file://{getcwd()}",
},
pages: Optional[dict] = None,
wait: int = 0,
type: Literal["jpeg", "png"] = "png",
type: Literal["jpeg", "png"] = "png", # noqa: A002
quality: Union[int, None] = None,
device_scale_factor:float = 2
device_scale_factor: float = 2,
) -> bytes:
"""使用jinja2模板引擎通过html生成图片
Expand All @@ -231,8 +227,13 @@ async def template_to_pic(
Returns:
bytes: 图片 可直接发送
"""
if pages is None:
pages = {
"viewport": {"width": 500, "height": 10},
"base_url": f"file://{getcwd()}", # noqa: PTH109
}

template_env = jinja2.Environment(
template_env = jinja2.Environment( # noqa: S701
loader=jinja2.FileSystemLoader(template_path),
enable_async=True,
)
Expand All @@ -253,14 +254,13 @@ async def capture_element(
url: str,
element: str,
timeout: float = 0,
type: Literal["jpeg", "png"] = "png",
type: Literal["jpeg", "png"] = "png", # noqa: A002
quality: Union[int, None] = None,
**kwargs,
) -> bytes:
async with get_new_page(**kwargs) as page:
await page.goto(url, timeout=timeout)
img_raw = await page.locator(element).screenshot(
return await page.locator(element).screenshot(
type=type,
quality=quality,
)
return img_raw
Loading

0 comments on commit 6d985ca

Please sign in to comment.